Inventario

Que tal experto buen día, te cuento: tengo una ampliación compilada en vfp9 es de inventario y facturación son como 10 usuarios, pero fíjate que a veces las existencias pelan cables y me quedan negativas y la verdad ya estoy como loco... Sera que me podes ayudar, no se si mi definición de entorno multiusuario esta bien o que... Estoy usando rlock() y unlock() para actualización de datos pero no se que esta pasando tal vez me podes mandar un ejemplo o darme alguna luz
Respuesta
1
Lo que hago para evitar tener problemas de ese tipo, es centralizar la rutina de actualización de inventario. Lo hago llamándola de la siguiente forma
* voy a actualizar el stock de un producto
IF STOCK(codigo, bodega, id_doc)
        Messagebox("error de actualización de stock")
Endif
* continuo con el programa
La rutina STOCK() lo que hace es buscar el código y bodega que se va a procesar en la tabla de inventario (o bodegas), luego que lo encuentra lo bloquea con RLOCK(), luego que está bloqueado lee la cantidad que tiene y le suma o resta (depende de id_doc) la cantidad. Luego desbloquea con UNLOCK. Si es que no puede encontrar el código o la bodega o no puede bloquear en una por cantidad de intentos, devuelve falso, en caso contrario, verdadero.
Podrías tener problemas de indices corruptos, y eso lo puedes verificar poniendo dentro de la rutina STOCK, inmediatamente despues del SEEK codigo+bodega una intrucción para hacer una verificacion que lo que muestra el indice corresponde realmente a lo que tiene el campo
ej
SEEK codigo+bodega
IF !EOF()
     IF tabla.cod+tabla.bod # m.codigo+m.bodega
           Messagebox("error en búsqueda indexada")
           * Encontraste el problema
     ENDIF
     * continuas con la actualizacion de stock
ELSE
      * no encontro el producto+bodega
ENDIF
Bueno suerte, y me cuentas como te fue

1 respuesta más de otro experto

Respuesta
1
Lo que estás haciendo están bien, sólo que debes validar que el número de salidas no debe ser mayor que el número de existencias y tienes que tener en cuenta que debes restar la cantidad existente más las entradas de unidades menos las ventas más las salidas más las devoluciones más las unidades dañadas si las hay las dos últimas aquí y como es en un entorno multiusuario, debes tener en cuenta cuando se ingresa un registro y cuando se edita uno ya existente, aquí te pego un ejemplo de código:
llSucess = Cursorsetprop('Buffering', 5, "Articulos")
If llSucess && Entonces se ha agregado un nuevo registro.
If Seek(lcCodArt, "Articulos", "Cod_art")
If Rlock() Then
If !lgValue Then && Cuando el parámetro recibido de tipo lógico es verdadero.
If lcContinue = .F. && El inventario no ha disminuido
Replace Articulos.lExt_art With Articulos.Ext_art
Replace Articulos.Ext_art With Articulos.Ext_art - (tcValue * Articulos.Eqv_art)
Else && El inventario ha disminuido.
Replace Articulos.Ext_art With (Articulos.lExt_art - (lcSalesItem + tcValue;
+ lcExitsValue + lcLostValue) * Articulos.Eqv_art);
+ (lcEntryValue * Articulos.Eqv_art)
Endif
Else && Cuando el parámetro recibido de tipo lógico es falso.
If lcContinue = .F. && Se edita el registro y el inventario no ha disminuido.
Replace Articulos.Ext_art With Articulos.lExt_art - ((lcSalesItem + tcValue) * Articulos.Eqv_art)
Else && Se edita el registro y el inventario ha disminuido.
Replace Articulos.Ext_art With (Articulos.lExt_art - ((lcSalesItem + tcValue + lcExitsValue + lcLostValue) *;
Articulos.Eqv_art)) + (lcEntryValue * Articulos.Eqv_art)
Endif
Endif
lcResult = Articulos.Ext_art
If lcResult < 0
=TableRevert(.F.)
Else
=TableUpdate(.T.)
Endif
Unlock
Esto te puede servir de ayuda...
me parece interesenta solo tengo una duda yo tengo un campo reserva porque hay mas de un facturador y cuando estan consultando existencias de articulos sera que tengo que bloquear la tabla.... y cuando imprimo la factura resto reserva y existencia, sera que me podes aclarar esta situacion te pongo el codigo para mejorar la explicacion.... If !lgValue,  If lcContinue esta parte del codigo no me queda muy clara, gracias por tu valioso tiempo experto
SELECT existencias
LOCATE FOR producto=thisform.coD.Value  
IF FOUND()
IF existencias.existencia>0 AND existencias.reserva>=0
IF (existencias.existencia-existencias.reserva)>0         
IF m_sale>(existencias.existencia-existencias.reserva)
MESSAGEBOX("No hay suficiente existencia en bodega      "+CHR(13),16,m_empresa)
thisform.uniDADES.Value = 0
return .f.
ENDIF    
ELSE
MESSAGEBOX("No hay suficiente existencia en bodega      "+CHR(13),16,m_empresa)
thisform.uniDADES.Value = 0
return .f.
endif
ELSE
IF existencias.reserva<0
MESSAGEBOX("Reserva negativa, actualize reserva      "+CHR(13),16,m_empresa)
thisform.uniDADES.Value = 0
return .f.
ELSE                        
MESSAGEBOX("No hay suficiente existencia en bodega      "+CHR(13),16,m_empresa)
                        thisform.uniDADES.Value = 0
return .f.
Endif
Endif
Endif
No tienes ni debes bloquear la tabla ya que no se van a modificar los datos sino a consultar e imprimir la información y lgValue indica si el usuario está insertando un nuevo registro o editando uno ya existente.
Cualquier duda me comentas...
Gracias por tu tiempo y perdón pero es que soy bien pregunto... mi proceso es de consulta pero que pasa si mientras esta consultando otra persona consulta también y primero le da agregar y que pasa si el encargado de inventario hace una entrada o una devolución... gracias por tu fino tiempo experto
El ejemplo de código prevé todas esas situaciones por lo cual no habría ningún problema, ahora si el encargado del inventario hace una entrada o devolución esto se verá reflejado cuando se guarden las actualizaciones así que si previamente se ha hecho una consulta antes de guardar las actualizaciones, pues deberá a volver a realizar una consulta para que devuelva los datos actualizados.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas