Registrar una venta en MySQL
Buenas tardes, Normalmente cuando trabajo con tablas DBF y para registrar una venta en 2 tablas (1 Ventas, 2 Detallesv) verifico cual es el ultimo pedido en la tabla ventas entonces el detalle lo grabo diciendo ( pedido_graba = ventas.pedido + 1) esto no es problema por que es una unica maquina, pero como deberia hacerlo en Red con MySQL.
Esta mecánica se vuelve infuncional en un sistema de red, por que 2 usuarios podría obtener como respuesta de la maquina el mismo numero de pedido.
Aclaración
Cuando registru una venta:
Primero: Registro el detalle es decir el producto elegido para la venta
Segundo: Si el usuario decide cobrar la venta, entonces es cuando registro la venta en la tabla ventas, en este caso no es necesario registrar los datos del detalle, por que estoy ya fueron guardados, en la tabla (Detallev)
Ahora trabajo con MySQL (intento)
Código del Método que registra un articulo en el detalle de una venta
*// modulo para agregar una venta
LOCAL codigo_de_barra
STORE ALLTRIM(ThisFormset.Form1.TxtCod_barra.Value) TO codigo_de_barra
*// verificamos si existe un dato de lo contrario se regresa el foco al textCodBarra
IF EMPTY(codigo_de_barra) = .T.
RETURN
ENDIF
*// buscamos si el codigo existe en la tabla articulos para su venta
TRY
SQLEXEC(Con, "Select clave, p_publico, iva, existencia, tipo_camb from productos where clave = ?codigo_de_barra", "curExiste")
SELECT curExiste
IF RECCOUNT() > 0
*// comenzamos con el registro de producto
thisformset.form1.txtCod_barra.Value = ""
*// el costo debe ser mayor a cero
IF curExiste.p_publico > 0
*// ///
*// /// agregamos una venta para agregar un detalle
*// ///
LOCAL liPedido, lsClave, liCantidad, ldP_publico, liDescuento, liIva
SELECT curExiste
liPedido = 777
lsClave = curExiste.clave
liCantidad = 1
ldP_publico = curExiste.p_publico * curExiste.tipo_camb
liDescuento = 0
liIva = curExiste.iva
*// ///
*// /// considerar un pendiente de surtir en las existencias
*// ///
SELECT clave FROM detallev WHERE detallev.pedido = liPedido;
AND detallev.clave = lsClave INTO CURSOR curEstaRegistrado
SELECT curEstaRegistrado
IF RECCOUNT() > 0
*// actualiza la cantidad
UPDATE detallev SET detallev.cantidad = detallev.cantidad + 1;
WHERE detallev.pedido = liPedido AND detallev.clave = lsClave
ELSE
*// nuevo registro
INSERT INTO detallev (pedido, clave, cantidad, p_publico, descu, iva);
VALUES (liPedido, lsClave, liCantidad, ldP_publico, liDescuento,liIva)
ENDIF
*// refresca los datos de la pantalla principal de ventas
Thisformset.refresca_grilla
ELSE
*// ///
*// /// se debera agregar un campo es oferta, para ofertas
*// ///
MESSAGEBOX("El producto tiene precio cero, no se puede vender",64,"")
ENDIF
ELSE
MESSAGEBOX("El codigo de producto no se encuentra registrado",48,"")
thisformset.form1.txtCod_barra.Value = ""
ENDIF
CATCH
MESSAGEBOX("Error al intentar registrar la venta: tabla ventas",48,"")
thisformset.form1.txtCod_barra.Value = ""
ENDTRY
*** la pregunta seria ***
Como registro la venta, evitando que 2 usuarios obtengan el mismo numero de pedido, para registrar la venta, la idea es vaciar el detalle del cursor de detallev en la tabla detallev de MySQL
Trabajo con Foxpro 9 y MySQL 5.1
Estaba pensando en obtener el pedido para grabar la venta así
Select Max(pedido) from ventas;
Esto en MySQL, con SQLEXEC, pero podría pasar que un usuario en otro equipo hiciera lo mismo al mismo tiempo, tal vez una probabilidad sumantente pequeña a la cual deseo anticiparme
Cualquier apoyo de antemano gracias.
Esta mecánica se vuelve infuncional en un sistema de red, por que 2 usuarios podría obtener como respuesta de la maquina el mismo numero de pedido.
Aclaración
Cuando registru una venta:
Primero: Registro el detalle es decir el producto elegido para la venta
Segundo: Si el usuario decide cobrar la venta, entonces es cuando registro la venta en la tabla ventas, en este caso no es necesario registrar los datos del detalle, por que estoy ya fueron guardados, en la tabla (Detallev)
Ahora trabajo con MySQL (intento)
Código del Método que registra un articulo en el detalle de una venta
*// modulo para agregar una venta
LOCAL codigo_de_barra
STORE ALLTRIM(ThisFormset.Form1.TxtCod_barra.Value) TO codigo_de_barra
*// verificamos si existe un dato de lo contrario se regresa el foco al textCodBarra
IF EMPTY(codigo_de_barra) = .T.
RETURN
ENDIF
*// buscamos si el codigo existe en la tabla articulos para su venta
TRY
SQLEXEC(Con, "Select clave, p_publico, iva, existencia, tipo_camb from productos where clave = ?codigo_de_barra", "curExiste")
SELECT curExiste
IF RECCOUNT() > 0
*// comenzamos con el registro de producto
thisformset.form1.txtCod_barra.Value = ""
*// el costo debe ser mayor a cero
IF curExiste.p_publico > 0
*// ///
*// /// agregamos una venta para agregar un detalle
*// ///
LOCAL liPedido, lsClave, liCantidad, ldP_publico, liDescuento, liIva
SELECT curExiste
liPedido = 777
lsClave = curExiste.clave
liCantidad = 1
ldP_publico = curExiste.p_publico * curExiste.tipo_camb
liDescuento = 0
liIva = curExiste.iva
*// ///
*// /// considerar un pendiente de surtir en las existencias
*// ///
SELECT clave FROM detallev WHERE detallev.pedido = liPedido;
AND detallev.clave = lsClave INTO CURSOR curEstaRegistrado
SELECT curEstaRegistrado
IF RECCOUNT() > 0
*// actualiza la cantidad
UPDATE detallev SET detallev.cantidad = detallev.cantidad + 1;
WHERE detallev.pedido = liPedido AND detallev.clave = lsClave
ELSE
*// nuevo registro
INSERT INTO detallev (pedido, clave, cantidad, p_publico, descu, iva);
VALUES (liPedido, lsClave, liCantidad, ldP_publico, liDescuento,liIva)
ENDIF
*// refresca los datos de la pantalla principal de ventas
Thisformset.refresca_grilla
ELSE
*// ///
*// /// se debera agregar un campo es oferta, para ofertas
*// ///
MESSAGEBOX("El producto tiene precio cero, no se puede vender",64,"")
ENDIF
ELSE
MESSAGEBOX("El codigo de producto no se encuentra registrado",48,"")
thisformset.form1.txtCod_barra.Value = ""
ENDIF
CATCH
MESSAGEBOX("Error al intentar registrar la venta: tabla ventas",48,"")
thisformset.form1.txtCod_barra.Value = ""
ENDTRY
*** la pregunta seria ***
Como registro la venta, evitando que 2 usuarios obtengan el mismo numero de pedido, para registrar la venta, la idea es vaciar el detalle del cursor de detallev en la tabla detallev de MySQL
Trabajo con Foxpro 9 y MySQL 5.1
Estaba pensando en obtener el pedido para grabar la venta así
Select Max(pedido) from ventas;
Esto en MySQL, con SQLEXEC, pero podría pasar que un usuario en otro equipo hiciera lo mismo al mismo tiempo, tal vez una probabilidad sumantente pequeña a la cual deseo anticiparme
Cualquier apoyo de antemano gracias.
1 Respuesta
Respuesta de ingesoft
1