Resolver problemas comunes con lotes

Seguramente algunos de ustedes han trabajado con lotes en los sistemas Aspel, esto permite llevar un sistema de costeo perfecto por compra o por fabricacion desde prod, sin embargo si lo usan comúnmente, sabrán que los usuarios suelen equivocarse al seleccionar el lote correcto, y esto aunado a que SAE permite simplemente no seleccionar un lote si no lo queremos, nos lleva a crear un caos total en el manejo de los mismos.

Veamos un poco de teoría al respecto (Todos los ejemplos se harán asumiendo la empresa 1)

Toda la lotificación se almacena en 3 tablas.

1. LTPD01: Aquí tenemos por producto y por almacén todos los lotes disponibles, están disponibles todos los que cantidad sea diferente de 0

2. OLTPD01: Son las observaciones de cada lote

3. ENLACE_LTPD01: Como cada movimiento puede constar de varios lotes, en esta tabla se almacenan todos los lotes que componen el movimiento al inventario.

 

En el catálogo de productos, se lleva la marca de si lleva lote el producto, esta marca se graba físicamente en el campo "CON_LOTE" de la tabla INVE01, 'Si' es que lleva lote y 'N' no lleva. por lo que si físicamente quisieramos quitarle el lote a varios productos de jalón, solo tendriamos que poner.

 

UPDATE INVE01 SET CON_LOTE = 'N' WHERE CVE_ART IN('CODIGO', 'CODIGO2', 'CODIGO3')

 

Ahora bien, cuando se crea un pedido estando la bandera con lote activada y al pasarlo a factura no podemos ya que realmente no tiene lote el producto, lo que deberemos de hacer es quitarle la bandera a la tabla de partidas de pedidos para que no nos moleste el lote más. Esto se hace con.

UPDATE PAR_FACTP01 SET E_LTPD = 0 WHERE CVE_DOC = 'CLAVEDELPEDIDO' AND CVE_ART = 'ARTICULOQUENOTIENELOTE'

 

Ahora bien, otra cosa que nos puede pasar es que tengamos que hacer un movimiento de un producto con lote y realmente y aunque tengamos existencia suficiente en el almacén, por alguna corrupción en los datos estos lotes se hallen incompletos tal que lasuma de los productos lotificados sean menores a las existencias. En este caso, deberemos consultar los lotes existentes y a alguno de ellos agregarle la cantidad que nos falte para "completar". Obvio en un control de lotes estricto esto sería una fatalidad pero si se trata de salir del paso funciona sin mayores problemas.

Primero verificamos si existe el producto en la tabla de lotes por productos.

SELECT * FROM LTPD01 WHERE CVE_ART = 'CLAVEARTICULO' and CVE_ALM = NUMEROALMACEN and CANTIDAD <> 0

 

Si esta consulta nos da resultados, sumamos la columna cantidad y esa es el total de productos que podemos lotificar, si nuestro movimiento requiere más productos de los ahi señalados, modificamos la cantidad de un lote ya existente para completarlo, por lo que copiamos el campo LOTE de una de nuestras partidas de la consulta anterior y hacemos la actualización

update ltpd01 set CANTIDAD = CANTIDAD + CANTIDADQUENOSFALTA where cve_art = 'CLAVEARTICULO' and CVE_ALM = NUMEROALMCEN and CANTIDAD <> 0 and LOTE = 'LOTECOPIADODECONSULTAANTERIOR'

 

Ahora bien. Qué necesitamos si requiriéramos insertar de forma masiva varios lotes por cualquier motivo.

Para esto requeriremos también la tabla donde se almacenan los consecutivos del sistema la cual se llama TBLCONTROL01. En particular nos interesan 2 claves que son:

ID_TABLA 67: Consecutivo de ENLACE_LTPD01.E_LTPD

ID_TABLA 48: Consecutivo de LTPD01.REG_LTPD

 

Por lo que nuestro primer query debe ser

select * from TBLCONTROL01 where ID_TABLA in( 67, 48)

Con esto guardamos los campos ULT_CVE de cada renglón. En mi caso ULT_CVE para ID_TABLA = 48 es 7642 y ULT_CVE para ID_TABLA = 67 es 13778

Primero requerimos saber cuántos lotes vamos a insertar para el mismo código de producto y almacén. ya que dependiendo de eso, deberemos insertar tantos registros en en mi caso voy a insertar

10894 piezas del producto PRODUCTO1 y lote Z03634 almacén 11

y

604 piezas del producto PRODUCTO1 y lote Z03635 almacén 11

En el insert, utilizo el consecutivo con ID_TABLA 48 y le sumo uno en cada renglón. Después del insert queda así

CVE_ART LOTE PEDIMENTO CVE_ALM FCHCADUC FCHADUANA FCHULTMOV NOM_ADUAN CANTIDAD REG_LTPD CVE_OBS CIUDAD FRONTERA FEC_PROD_LT GLN STATUS
PRODUCTO1 Z03634   11 NULL NULL 20150420   10894 7644 0     NULL   A
PRODUCTO1 Z03635   11 NULL NULL 20150420   604 7643 0     NULL   A

 

Ahora estos 2 mismos registros los inserto en mi tabla ENLACE_LTPD01 utilizando el consecutivo siguiente de mis folios con ID_TABLA = 67

E_LTPD REG_LTPD CANTIDAD PXRS
13779 7643 604 604
13779 7644 10894 10894

 

Si observan el folio 13779 se repite en ambos movimientos ya que se trata de englobar en un solo movimiento 2 lotes aunque pudieran ser muchos más.

Solo en el caso de que quieran grabar observaciones de lotes (Yo nunca los he usado), deberán consultar también el campo ULT_CVE de la tabla TBLCONTROL01 con ID_TABLA 49 para obtener el siguiente consecutivo.

Ahora bien, deberán actualizar los consecutivos de TBLCONTROL01, para nuestro ejemplo deberemos dejar

UPDATE TBLCONTROL SET ULT_CVE = 13779 WHERE ID_TABLA = 67
UPDATE TBLCONTROL SET ULT_CVE = 7644 WHERE ID_TABLA = 48

Si se ocuparon observaciones también se deberá actualizar el ID_TABLA 49

Finalmente, ni en química existe la generación espontánea. Este lote lo deberemos de matchear con un movimiento al inventario, por lo que debieramos poner el código 13779 en nuestra tabla MINVE01 en el campo E_LTPD

Es todo, espero les haya servido.

 

 

 

 

 

 

 

 

 

Comentarios   

+1 #3 Super User 09-07-2018 14:58
Hola Denisse.

El sistema en su estado normal hace lo que debe, al facturar te muestra los lotes y pedimentos y una vez en 0's ya no te los muestra aunque definitivamente se siguen quedando en la base de datos. Si esta información fuera demasiada, si habría que pensar en una depuración, los registros de las tablas arriba mencionadas una vez en 0's las puedes eliminar sin problema ya que el historial se tendría directamente en la factura. Ahora bien, si lo haces no podrías rastrear un lote completo directo en el sistema; Otra opción es en vez de eliminarlos, podrías moverlos a una tabla de respaldo para que en caso de ocupar el histórico consultes la suma de la tabla de producción más tu respaldo, con esto, en tu facturación todo sería rápido pero no perderías los detalles generales.

Cito a DENISSE:
:roll:
yo quisiera saber de que manera puedo programar para que los lotes y pedimentos que van quedando en cero se vayan eliminando de manera automática, ya que nos marca muchos errores a la hora de facturar el pedido.

saludos
0 #2 Carlos 24-12-2015 01:48
Hola Edith. En tu caso tienes que saber que todo movimiento al inventario tiene el campo e_ltpd, cuando este es diferente de 0 quiere decir que se hicieron movimientos con lotes en ese movimiento.

El query general es:
SELECT * FROM minve01 WHERE E_ltpd 0

Si lo quieres hacer para un movimiento al inventario en particular sería

SELECT * FROM minve01 WHERE E_ltpd 0 and cve_cpto = 7 (En este caso entrada por traspaso pero puede ser cualquier otro)

Ahora bien, querrás saber todos los lotes involucrados de ese movimiento entonces tenemos que hacer un join con los lotes a partir de este campo.

SELECT * FROM minve01 m
INNER JOIN enlace_ltpd01 e on m.e_ltpd = e.e_ltpd
WHERE m.e_ltpd 0 and m.cve_cpto = 7

Ahora bien, con esto ya tenemos las cantidades de cada lote, pero aún no tenemos el lote en si. Para esto, necesitamos a su vez enlazar con la tabla de lotes llamada ltpd01 quedando como sigue

SELECT * FROM minve01 m
INNER JOIN enlace_ltpd01 e on m.e_ltpd = e.e_ltpd
inner join ltpd01 l on l.reg_ltpd = e.reg_ltpd
WHERE m.e_ltpd 0 and m.cve_cpto = 7

Para que quede bien el reporte también debieras ponerle la descripción del artículo por lo que enlazamos la tabla de inventarios quedando asi

SELECT * FROM minve01 m
INNER JOIN
inve01 i on m.cve_art = i.cve_art
inner join enlace_ltpd01 e on m.e_ltpd = e.e_ltpd
inner join ltpd01 l on l.reg_ltpd = e.reg_ltpd
WHERE m.e_ltpd 0 and m.cve_cpto = 7

Ya sería solamente seleccionar las columnas que tu quieras.

Ahora bien, en el caso de que quieras el reporte de todos los movimientos con y sin lote, tendríamos que cambiar los enlaces con la table enlace lotes y lotes en vez de un inner join con un left join. De esta forma te aparecerán todos los datos de los movimientos al inventario y cuando tenga lotes te aparecerán los lotes

SELECT * FROM minve01 m
INNER JOIN
inve01 i on m.cve_art = i.cve_art
left join enlace_ltpd01 e on m.e_ltpd = e.e_ltpd
left join ltpd01 l on l.reg_ltpd = e.reg_ltpd
WHERE m.cve_cpto = 7
0 #1 EDITH 23-12-2015 23:14
buenas tardes quisiera saber como puedo saber dentro de mis traspasos al inventario los lotes que estoy traspasando en mis almacenes he configurado un query pero la verdad no me respeta siempre me esta extrayendo un numero de lote para todas las piezas al igual que si agrego el peso. me pueden ayudar por favor .

No tienes derecho suficientes para publicar contenido