FoxPro/Visual FoxPro - Registrar una venta en MySQL

 
Vista:

Registrar una venta en MySQL

Publicado por Victor Hugo (757 intervenciones) el 08/05/2009 21:32:42
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 debiera hacerlo en Red con MySQL.
esta mecánica se vuelve in funcional 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 registra 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 sumamente pequeña a la cual deseo anticiparme

Cualquier apoyo de antemano gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder