Files

1689 lines
74 KiB
Plaintext

{
==============================================================================
PROGRAMA : IRPRCS008
OBJETIVO : MANTENER LOS REGISTROS DEL CONTEO FISICO DEL INVENTARIO
FECHA REALIZACION : 01/01/2010
PROGRAMADOR : ING. JUAN SOTO
==============================================================================
}
IMPORT util
GLOBALS
"irprgb000.4gl"
DEFINE xtipo_inventario CHAR(30)
DEFINE chtipoInventario,tipo,tabla1,tabla2,tabla3,tabla4,tabla5,tabla6,tabla7,tabla8,
tabla9,tabla10 CHAR(20),
selecb,selece,selecA,selecC,insertac STRING,
pdesglose,igualo,sumarizo,incluye CHAR(1),
xfecha DATE,
chalmacen,chseccion,chtramo,chselec1,chselec2,chselec3 char(20),
arrdetalle DYNAMIC ARRAY OF RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_Sec SMALLINT,
descripcion CHAR(100),
unidad_med CHAR(4),
fisico DEC(12,4),
teorico DEC(12,4),
diferencia DEC(12,4),
costo DEC(12,4),
valor1 DEC(12,4),
valor2 DEC(12,4),
usuario CHAR(40),
fechacrea DATETIME YEAR TO SECOND,
bodega SMALLINT,
cod_seccion SMALLINT,
cod_tramo SMALLINT,
trxid INT
END RECORD,
campos CHAR(40),ano,codMov,idx1,almacen,seccion,tramo,fila,pos,dias_a_contar SMALLINT,
respuesta,irespuesta,resajuste CHAR(3),
numeroDoc,numeroEntrada,numeroSalida,kcodid INT,
cherror CHAR(200),
numeroidtrx,codMovAjusteEntrada,CodMovAjusteSalida INTEGER,
total2,total_fisico,total_teorico DEC(12,2),palmacen,pseccion,ptramo,pfecha ui.combobox,
pexistencia DEC(12,4),
busca_fecha,fecha_doc DATE,
descrip_mov CHAR(30)
MAIN
#WHENEVER ERROR CONTINUE
CALL STARTLOG("ircs08.log")
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CALL ui.Interface.loadStyles("TopMenu")
--DEFER INTERRUPT
#LET usuarios = "jsoto"
#LET clave = "lmmjvsd2009"
CONNECT to "smarmotech" USER usuarios USING clave
# SELECT * INTO p_companias.* FROM companias
OPTIONS
FORM LINE 7
OPEN FORM irfmcs008 FROM "irfmcs008"
DISPLAY FORM irfmcs008
CLEAR FORM
MENU
ON ACTION actualizarf
LET tipo = "CONTEO"
CLEAR FORM
CALL Actualiza(tipo)
ON ACTION eliminarf
LET tipo = "CONTEO"
CLEAR FORM
CALL eliminar(tipo)
ON ACTION actualizari
LET tipo = "INVENTA"
CLEAR FORM
CALL actualiza(tipo)
ON ACTION eliminari
LET tipo = "INVENTA"
CLEAR FORM
CALL eliminar(tipo)
ON ACTION actualizard
LET tipo = "DOC"
CLEAR FORM
CALL actualizard()
ON ACTION eliminard
LET tipo = "DOC"
CLEAR FORM
CALL eliminar(tipo)
ON ACTION salir
EXIT MENU
END MENU
END MAIN
FUNCTION cargatablas(xtipo_inventario)
DEFINE xtipo_inventario VARCHAR(30)
INITIALIZE arrdetalle TO NULL
LET chtipoInventario = xtipo_inventario
LET tabla10 = NULL
IF xtipo_inventario = "REPUESTOS" THEN
LET tabla1 = "irtb00002" # MAESTRA PRODUCTOS
LET tabla2 = "irtb00011" # MAESTRA CONTEO FISICO
LET tabla3 = "irtb00012" # TRANSACCIONES CONTEO, PROVIENE DE LA PDA
LET tabla4 = "irtb00013" # COSTOS STANDARD PRODUCTOS
LET tabla5 = "irtb00006" # TRANSACCIONES DE INVENTARIOS DE LOS PRODUCTOS
LET campos = "a.costo_st" # CAMPO DE LA TABLA DE COSTO
LET tabla6 = "irtb00042" # DOCUMENTO TEMPORAL AJUSTE
LET tabla7 = "irtb00005" # CODIGOS DE MOVIMIENTOS
END IF
IF xtipo_inventario = "MATERIA PRIMA" THEN
LET tabla1 = "intb00001" # MAESTRA PRODUCTOS
LET tabla2 = "intb00011" # MAESTRA CONTEO FISICO
LET tabla3 = "intb00012" # TRANSACCIONES CONTEO, PROVIENE DE LA PDA
LET tabla4 = "intb00013" # COSTOS STANDARD PRODUCTOS
LET tabla5 = "intb00006" # TRANSACCIONES DE INVENTARIOS DE LOS PRODUCTOS
LET campos = "a.costo_st" # CAMPO DE LA TABLA DE COSTO
LET tabla6 = "intb00042" # DOCUMENTO TEMPORAL AJUSTE
LET tabla7 = "intb00005" # CODIGOS DE MOVIMIENTOS
END IF
IF xtipo_inventario = "PRODUCTOS TERMINADOS" THEN
LET tabla1 = "iptb00002" # MAESTRA PRODUCTOS
LET tabla2 = "iptb00011" # MAESTRA CONTEO FISICO
LET tabla3 = "iptb00012" # TRANSACCIONES CONTEO, PROVIENE DE LA PDA
LET tabla4 = "iptb00004" # COSTOS STANDARD PRODUCTOS
LET tabla5 = "iptb00006" # TRANSACCIONES DE INVENTARIOS DE LOS PRODUCTOS
LET campos = "a.material+a.labor+a.gastos" # CAMPO DE LA TABLA DE COSTO
LET tabla6 = "iptb00042" # DOCUMENTO TEMPORAL AJUSTE
LET tabla9 = "iptb00063" # DETALLE DESGLOSE AJUSTE TEMPORAL
LET tabla7 = "iptb00005" # CODIGOS DE MOVIMIENTOS
LET tabla8 = "iptb00064" # DESGLOSE PRODUCTOS TERMINADOS
LET tabla10 = "iptb00062" # UBICACION PRODUCTOS TERMINADOS
END IF
LET selecA = "SELECT a.descrip_esp,a.unidad_med,a.desglose,a.codid FROM ",tabla1 CLIPPED, " a ",
"WHERE a.cod_n = ? AND ",
" a.cod_grupo = ? AND ",
" a.cod_tipo = ? AND ",
" a.cod_sec = ? AND ",
" a.status_t IS NULL"
LET selecC = "SELECT ",campos CLIPPED," FROM ",tabla4 CLIPPED, " a ",
"WHERE a.cod_n = ? AND ",
" a.cod_grupo = ? AND ",
" a.cod_tipo = ? AND ",
" a.cod_sec = ? AND ",
" a.ano = ? AND ",
" a.mes_fin = '12' AND ",
" a.status_t IS NULL"
PREPARE articulos FROM selecA
PREPARE costos FROM selecC
{CALCULA EXISTENCIA EN LA TABLA DE CONTEO}
LET selecb = "SELECT SUM(cantidad) FROM ",tabla3,
"WHERE fecha = ? AND ",
"cod_n = ? AND ",
" cod_grupo = ? AND ",
" cod_tipo = ? AND ",
"cod_sec = ? AND ",
"bodega = ? "
PREPARE existencia FROM selecb
END FUNCTION
FUNCTION actualiza(xtipo)
DEFINE tipo_inventario CHAR(30),
xtipo CHAR(20),
existe BOOLEAN,
cantidad_reg SMALLINT,
xbodega SMALLINT
LET sumarizo = "N"
LET incluye = "N"
INPUT BY NAME xfecha,tipo_inventario,almacen,seccion,tramo,incluye,sumarizo,igualo,busca_fecha
BEFORE INPUT
CALL calmacen()
AFTER FIELD almacen
CALL cseccion(almacen)
CALL cfecha()
AFTER FIELD busca_fecha
LET xfecha = busca_fecha
DISPLAY BY NAME xfecha
AFTER FIELD seccion
DISPLAY "seccion: ",seccion," ",almacen
CALL ctramo(almacen,seccion)
AFTER FIELD tipo_inventario
CALL cargatablas(tipo_inventario)
AFTER FIELD xfecha
LET almacen = 1
LET seccion = 99
LET tramo = 99
AFTER INPUT
IF int_flag THEN
CALL fgl_winmessage("ERROR","OPERACION ABORTADA","stop")
LET int_flag = FALSE
RETURN
END IF
# LET chalmacen = palmacen.getitemtext(almacen)
# LET chseccion = pseccion.getItemText(1)
# LET chtramo = ptramo.getitemtext(tramo)
IF xtipo <> "CONTEO" THEN
IF sumarizo = "S" or incluye = "S" THEN
CALL fgl_winmessage("ERROR","NO PUEDE SUMARIZAR, TAMPOCO INCLUIR MAS REGISTROS EN INVENTARIO","stop")
LET sumarizo = "N"
LET incluye = "N"
DISPLAY BY NAME sumarizo,incluye,igualo
END IF
IF igualo = "S" THEN
LET irespuesta = fgl_winquestion("Pregunta","Esta seguro que desea igualar la existencia fisica con la teorica?","no","yes|No","question",0)
LET irespuesta = UPSHIFT(irespuesta)
IF irespuesta = "NO" THEN
CONTINUE INPUT
END IF
END IF
END IF
EXIT INPUT
END INPUT
IF almacen = 99 THEN
LET chselec1 = " b.bodega < ? "
ELSE
LET chselec1 = " b.bodega = ? "
END IF
IF seccion = 99 THEN
LET chselec2 = " b.cod_seccion < ? "
ELSE
LET chselec2 = " b.cod_seccion = ? "
END IF
IF tramo = 99 THEN
LET chselec3 = " b.cod_tramo < ? "
ELSE
LET chselec3 = " b.cod_tramo = ? "
END IF
LET ano = YEAR(xfecha)
CONSTRUCT BY NAME CRITERIO on a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec
IF int_flag THEN
CALL fgl_winmessage("ERROR","OPERACION ABORTADA","stop")
LET int_flag = FALSE
RETURN
END IF
LET selecE =
"SELECT SUM(a.cantidad_2) FROM ",tabla5 CLIPPED," a ",
"WHERE (a.cod_n = ? AND ",criterio CLIPPED, " AND ",
" a.cod_grupo = ? AND ",
" a.cod_tipo = ? AND ",
" a.cod_SEC = ?) AND ",
" (CONVERT(DATE,a.fecha,101) <= ?) AND ",
" a.bodega = ? AND ",
" (a.status_t IS NULL) "
PREPARE existencia1 FROM selecE
IF xtipo = "CONTEO" THEN
LET selec =
"SELECT DISTINCT CONVERT(CHAR(10),a.fecha,101) FROM ", tabla3 CLIPPED, " a ",
" WHERE CONVERT(DATE,a.fecha,101) = ? "
PREPARE comando FROM selec
EXECUTE comando USING xfecha
# IF STATUS <> NOTFOUND THEN
IF sumarizo = "S" THEN
LET selec =
"SELECT b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,a.descrip_esp,a.unidad_med,SUM(b.cantidad),'0','0','0','0','0',",
"' ',GETDATE(),'1','1','1','1' ",
"FROM ",tabla1 CLIPPED," a, ",tabla3 CLIPPED," b ",
"WHERE ",
" a.cod_n = b.cod_n AND ",
" a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND ",
" a.cod_Sec = b.cod_Sec and ",
chselec1 CLIPPED," AND ",chselec2 CLIPPED,
" AND ",chselec3 CLIPPED, " ",
" AND CONVERT(DATE,b.fecha,101) = ? ",
" AND ",criterio CLIPPED,
" GROUP BY b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,a.descrip_esp,a.unidad_med ",
"ORDER by b.cod_n,b.cod_Grupo,b.cod_tipo,b.cod_sec"
END IF
IF incluye = "S" THEN
IF seccion = 99 THEN
CALL fgl_winmessage("ERROR", "NO PUEDE INCLUIR ITEMS CON TODAS LAS SECCIONES", "stop")
RETURN
END IF
IF tramo = 99 THEN
CALL fgl_winmessage("ERROR", "NO PUEDE INCLUIR ITEMS CON TODOS LOS TRAMOS", "stop")
RETURN
END IF
{ SE PUSO EN COMENTARIO PORQUE SE REALIZO UNA FUNCION PARA ESTE PROCESO EN LUGAR DE ESTE QUERY
LET selec = "INSERT INTO ",tabla3 CLIPPED,"(idtrx,fecha,bodega,cod_Seccion,cod_tramo,cod_n,cod_grupo,cod_tipo,cod_Sec,cantidad,us_crea,fech_crea) ",
" SELECT DISTINCT '1',?,b.bodega,?,?,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,'0','INCLUYE',getdate() FROM ",tabla1 CLIPPED," AS a, ",
tabla5 CLIPPED," AS b ",
" WHERE CAST(a.cod_n AS CHAR(2)) + CAST(a.cod_grupo AS CHAR(3)) + CAST(a.cod_tipo AS CHAR(4)) + ",
" CAST(a.cod_sec AS CHAR(4)) NOT IN (",
"SELECT CAST(cod_n AS CHAR(2)) + CAST(cod_grupo AS CHAR(3)) + CAST(cod_tipo AS CHAR(4)) + ",
" CAST(cod_sec AS CHAR(4)) FROM ",tabla3,
" WHERE CONVERT(DATE,fecha,101) = ? AND bodega = ? ) AND ",
" a.cod_n = b.cod_n AND a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND a.cod_sec = b.cod_sec AND ",
" b.bodega = ? AND b.status_t is null AND ",criterio CLIPPED
PREPARE pincluye FROM selec
EXECUTE pincluye USING xfecha,seccion,tramo,xfecha,almacen,almacen
}
CALL productos_incluye(tabla1,tabla2,tabla3,tabla4,tabla5,criterio,almacen,xfecha,seccion,tramo)
LET selec =
"SELECT b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,a.descrip_esp,a.unidad_med,b.cantidad,'0','0','0','0','0',",
"b.us_crea,b.fech_crea,b.bodega,b.cod_Seccion,b.cod_tramo,b.idtrx ",
"FROM ",tabla1 CLIPPED," AS a INNER JOIN ",tabla3 CLIPPED," AS b ",
"ON ",
" a.cod_n = b.cod_n AND ",
" a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND ",
" a.cod_Sec = b.cod_Sec and ",
chselec1 CLIPPED," AND ",chselec2 CLIPPED,
" AND ",chselec3 CLIPPED, " ",
" WHERE CONVERT(DATE,b.fecha,101) = ? ",
" AND ",criterio CLIPPED,
"ORDER by b.cod_n,b.cod_Grupo,b.cod_tipo,b.cod_sec"
END IF
IF sumarizo = "S" THEN
LET selec =
"SELECT b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,a.descrip_esp,a.unidad_med,SUM(b.cantidad),'0','0','0','0','0',",
"' ',GETDATE(),'1','1','1','1' ",
"FROM ",tabla1 CLIPPED," AS a INNER JOIN ",tabla3 CLIPPED," AS b ",
" ON ",
" a.cod_n = b.cod_n AND ",
" a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND ",
" a.cod_Sec = b.cod_Sec and ",
chselec1 CLIPPED," AND ",chselec2 CLIPPED,
" AND ",chselec3 CLIPPED, " ",
" WHERE CONVERT(DATE,b.fecha,101) = ? ",
" AND ",criterio CLIPPED, " AND a.status_t IS NULL ",
" GROUP BY b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,a.descrip_esp,a.unidad_med ",
"ORDER by b.cod_n,b.cod_Grupo,b.cod_tipo,b.cod_sec"
END IF
IF sumarizo = "N" AND incluye = "N" THEN
LET selec =
"SELECT distinct b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,a.descrip_esp,a.unidad_med,b.cantidad,'0','0','0','0','0',",
"b.us_crea,b.fech_crea,b.bodega,b.cod_Seccion,b.cod_tramo,b.idtrx ",
"FROM ",tabla1 CLIPPED," AS a INNER JOIN ",tabla3 CLIPPED," AS b ",
"ON ",
" a.cod_n = b.cod_n AND ",
" a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND ",
" a.cod_Sec = b.cod_Sec and ",
chselec1 CLIPPED," AND ",chselec2 CLIPPED,
" AND ",chselec3 CLIPPED, " ",
" WHERE b.fecha= ? ",
" AND ",criterio CLIPPED,
" ORDER by b.cod_n,b.cod_Grupo,b.cod_tipo,b.cod_sec"
END IF
--- AQUI FUE 26/02/26 WHENEVER ERROR CONTINUE
PREPARE comando1 FROM selec
DECLARE busca_ir CURSOR FOR comando1
OPEN busca_ir USING almacen,seccion,tramo,xfecha
IF sqlca.sqlcode THEN
LET cherror = "Favor verifique el error en ",tipo CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
END IF
LET progreso = 10
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
LET total_fisico = 0
LET idx = 1
FOREACH busca_ir INTO arrdetalle[idx].*
DISPLAY "datos ", pexistencia," ", arrdetalle[idx].cod_grupo
EXECUTE costos USING arrdetalle[idx].cod_n,
arrdetalle[idx].cod_grupo,
arrdetalle[idx].cod_tipo,
arrdetalle[idx].cod_sec,
ano
INTO arrdetalle[idx].costo
IF sqlca.sqlcode < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error en ",tipo CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
EXIT FOREACH
END IF
IF arrdetalle[idx].costo IS NULL THEN
LET arrdetalle[idx].costo = 0
END IF
IF igualo = "S" THEN
EXECUTE existencia1 USING arrdetalle[idx].cod_n,
arrdetalle[idx].cod_grupo,
arrdetalle[idx].cod_tipo,
arrdetalle[idx].cod_sec,
xfecha,
arrdetalle[idx].bodega
INTO arrdetalle[idx].teorico
IF arrdetalle[idx].teorico IS NULL THEN
LET arrdetalle[idx].teorico = 0
END IF
LET arrdetalle[idx].fisico = arrdetalle[idx].teorico
END IF
LET arrdetalle[idx].valor1 = arrdetalle[idx].fisico *
arrdetalle[idx].costo
LET total_fisico = arrdetalle[idx].valor1 + total_fisico
LET progreso = progreso + 2
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
IF progreso > 90 THEN
LET progreso = 90
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
END IF
DISPLAY idx TO numero_registros
LET idx = idx + 1
END FOREACH
DISPLAY idx-1 TO numero_registros
DISPLAY BY NAME total_fisico
LET progreso = 100
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
CALL set_count(idx-1)
LET existe = true
# ELSE
# LET existe = false
#END IF
# ACTUALIZACION DEL CONTEO FISICO
CALL aceptainfo(existe) RETURNING cantidad_reg
IF int_flag THEN
LET int_flag = FALSE
RETURN
END IF
{ ACTUALIZACION TABLA CONTEO}
LET respuesta = fgl_winquestion("Pregunta","Esta seguro de Actualizar Datos?","no","yes|No","question",0)
IF respuesta = "yes" THEN
# LET resajuste = fgl_winquestion("Pregunta","Desea Generar Documento Ajuste Articulos con Diferencias?","no","yes|No","question",0)
LET resajuste = "no"
{ NUMERO SECUENCIA DEL CONTEO FISICO}
LET selecb = "SELECT MAX(idtrx) FROM ",tabla3 CLIPPED
PREPARE buscamax FROM selecb
EXECUTE buscamax INTO numeroidtrx
IF numeroidtrx IS NULL THEN
LET numeroidtrx = 0
END IF
LET numeroidtrx = numeroidtrx + 1
{=======================================================================}
{TABLA RESUMEN FISICO TABLA2}
LET INSERTAC = "INSERT INTO ",tabla2 CLIPPED,
"(fecha,bodega,cod_seccion,cod_tramo,cod_n,",
"cod_grupo,cod_tipo,",
"cod_Sec,cantidad,",
"us_crea,fech_crea) ",
"VALUES (?,?,'1','1',?,?,?,?,?,suser_sname(),getdate())"
PREPARE inserta2 FROM insertac
LET selecb = "DELETE FROM ",tabla2 CLIPPED,
" WHERE CONVERT(DATE,fecha,101) = ? and ",
" cod_n = ? AND ",
" cod_grupo = ? AND ",
" cod_tipo = ? AND ",
" cod_sec = ? AND ",
" bodega = ?"
PREPARE borra_tabla2 FROM selecb
LET selecb = "DELETE FROM ",tabla3 CLIPPED,
" WHERE CONVERT(DATE,fecha,101) = ? and ",
" bodega = ? and ",
" cod_seccion = ? and ",
" cod_tramo = ? and ",
" cod_n = ? AND ",
" cod_grupo = ? AND ",
" cod_tipo = ? AND ",
" cod_sec = ? AND idtrx = ? "
PREPARE borra11 FROM selecb
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Ocurrio un error, favor verifique el error ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
END IF
LET INSERTAC = "INSERT INTO ",tabla3 CLIPPED,
"(fecha,bodega,cod_seccion,cod_tramo,cod_n,",
"cod_grupo,cod_tipo,cod_Sec,cantidad,",
"balance,fech_crea,us_crea,idtrx,us_mod,fech_mod) ",
" VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,SUSER_SNAME(),GETDATE())"
PREPARE inserta11 FROM insertac
BEGIN WORK
LET xbodega = 1
FOR i = 1 TO cantidad_Reg
IF arrdetalle[i].cod_n IS NOT NULL THEN
IF sumarizo <> "S" THEN
EXECUTE borra11 USING xfecha,
arrdetalle[i].bodega,
arrdetalle[i].cod_seccion,
arrdetalle[i].cod_tramo,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,
arrdetalle[i].trxid
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Ocurrio un error, Borrando Transaccion ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
END IF
IF arrdetalle[i].trxid IS NULL THEN
LET arrdetalle[i].trxid = numeroidtrx
LET numeroidtrx = numeroidtrx + 1
END IF
IF arrdetalle[i].fisico > 0 THEN
IF arrdetalle[i].bodega IS NULL or arrdetalle[i].bodega = 99 THEN
ROLLBACK WORK
CALL fgl_winmessage("INFORMACION","NO PUEDE ADICIONAR CODIGOS, CUANDO TIENE SELECCIONADO, TODAS LAS SECCIONES DE ALMACEN","STOP")
RETURN
END IF
IF arrdetalle[i].cod_seccion IS NULL OR arrdetalle[i].cod_seccion = 99 THEN
ROLLBACK WORK
CALL fgl_winmessage("INFORMACION","NO PUEDE ADICIONAR CODIGOS, CUANDO TIENE SELECCIONADO, TODAS LAS SECCIONES DE ALMACEN","STOP")
RETURN
END IF
IF arrdetalle[i].cod_tramo IS NULL or arrdetalle[i].cod_tramo = 99 THEN
ROLLBACK WORK
CALL fgl_winmessage("INFORMACION","NO PUEDE ADICIONAR CODIGOS, CUANDO TIENE SELECCIONADO, TODAS LAS SECCIONES DE ALMACEN","STOP")
RETURN
END IF
# LET arrdetalle[i].bodega =almacen
# LET arrdetalle[i].cod_seccion =seccion
# LET arrdetalle[i].cod_tramo =tramo
EXECUTE inserta11 USING xfecha,
# arrdetalle[i].bodega,
almacen,
arrdetalle[i].cod_seccion,
arrdetalle[i].cod_tramo,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,
arrdetalle[i].fisico,
arrdetalle[i].teorico,
arrdetalle[i].fechacrea,
arrdetalle[i].usuario, #SI LE PONGO QUE ADICIONE EL USUARIO ME DA UN ERROR -254
arrdetalle[i].trxid
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Ocurrio un error, favor verifique el error en ",tipo CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
END IF
END IF
END IF
END FOR
COMMIT WORK
BEGIN WORK
{ ACTUALIZCION DEL INVENTARIO FISICO A PARTIR DEL CONTEO}
FOR i = 1 TO cantidad_reg
IF arrdetalle[i].cod_n IS NOT NULL THEN
EXECUTE existencia USING xfecha,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,
almacen
# arrdetalle[i].bodega
INTO pexistencia
IF pexistencia IS NULL THEN
LET pexistencia = 0
END IF
{ EXECUTE verifica USING xfecha, # VERIFICA SI EL CODIGO EXISTE EN LA TABLA DE RESUMEN EXISTENCIA
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec
}
EXECUTE borra_tabla2 USING xfecha,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,
arrdetalle[i].bodega
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Ocurrio un error, Verificando Inventario ",tipo CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
EXECUTE inserta2 USING xfecha,
almacen,
#arrdetalle[i].bodega,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,
pexistencia
END IF
END FOR
COMMIT WORK
CALL fgl_winmessage("INFORMACION","ACTUALIZACION EXITOSA","STOP")
END IF
END IF
IF xtipo = "INVENTA" THEN
LET selec =
"SELECT DISTINCT CONVERT(CHAR(10),a.fecha,101) FROM ", tabla2 CLIPPED, " a ",
" WHERE CONVERT(DATE,a.fecha,101) = ? "
PREPARE comando2 FROM selec
EXECUTE comando2 USING xfecha
IF STATUS <> NOTFOUND THEN
# BUSQUEDA DEL CONTEO FISICO TABLA 00011
LET selec =
"SELECT distinct a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp,",
#"a.unidad_med,b.cantidad,'0','0','0','0','0',b.us_crea,b.fech_crea,",
"a.unidad_med,b.cantidad,'0','0','0','0','0','",usuarios CLIPPED,"',getdate(),",
"b.bodega,b.cod_Seccion,b.cod_tramo ",
"FROM ",tabla1 CLIPPED," AS a INNER JOIN ",tabla2 CLIPPED," b ",
" ON a.cod_n = b.cod_n AND a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND ",
" a.cod_Sec = b.cod_Sec "," and ",criterio CLIPPED,
" and a.status_t is null ",
" WHERE CONVERT(DATE,b.fecha,101) = ? AND ",
" b.bodega = ",almacen,
" ORDER by a.cod_n,a.cod_Grupo,a.cod_tipo,a.cod_sec"
PREPARE comando3 FROM selec
DECLARE busca_ir1 CURSOR FOR comando3
OPEN busca_ir1 USING xfecha
LET progreso = 10
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
LET total_fisico = 0
LET total_teorico = 0
LET total2 = 0
LET idx1 = 1
LET idx = 1
FOREACH busca_ir1 INTO arrdetalle[idx].*
EXECUTE existencia1 USING arrdetalle[idx].cod_n,
arrdetalle[idx].cod_grupo,
arrdetalle[idx].cod_tipo,
arrdetalle[idx].cod_sec,
xfecha,
almacen
# arrdetalle[idx].bodega
INTO arrdetalle[idx].teorico
IF sqlca.sqlcode THEN
LET cherror = "Ocurrio un error, favor verifique el error ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
EXIT FOREACH
END IF
EXECUTE costos USING arrdetalle[idx].cod_n,
arrdetalle[idx].cod_grupo,
arrdetalle[idx].cod_tipo,
arrdetalle[idx].cod_sec,
ano
INTO arrdetalle[idx].costo
IF STATUS < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
EXIT FOREACH
END IF
IF arrdetalle[idx].teorico IS NULL THEN
LET arrdetalle[idx].teorico = 0
END IF
IF arrdetalle[idx].fisico IS NULL THEN
LET arrdetalle[idx].fisico = 0
END IF
IF arrdetalle[idx].fisico = 0 AND
arrdetalle[idx].teorico = 0 THEN
CONTINUE FOREACH
END IF
# IF arrdetalle[idx].teorico < 0 THEN
# LET arrdetalle[idx].teorico = arrdetalle[idx].teorico *-1
# END IF
IF arrdetalle[idx].costo IS NULL THEN
LET arrdetalle[idx].costo=0
END IF
IF arrdetalle[idx].teorico < 0 THEN
LET arrdetalle[idx].diferencia = arrdetalle[idx].fisico -
(arrdetalle[idx].teorico*-1)
else
LET arrdetalle[idx].diferencia = arrdetalle[idx].fisico -
arrdetalle[idx].teorico
END IF
LET arrdetalle[idx].valor1 = arrdetalle[idx].fisico *
arrdetalle[idx].costo
LET arrdetalle[idx].valor2 = arrdetalle[idx].diferencia *
arrdetalle[idx].costo
LET total2 = arrdetalle[idx].valor2 + total2
LET total_fisico = total_fisico + arrdetalle[idx].valor1
LET total_teorico = total_teorico + (arrdetalle[idx].teorico *
arrdetalle[idx].costo)
LET idx = idx + 1
IF idx1 = 100 THEN
LET progreso = progreso + 5
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
LET idx1 = 0
END IF
LET idx1 = idx1 + 1
IF progreso > 90 THEN
LET progreso = 90
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
END IF
END FOREACH
IF idx = 1 THEN
CALL fgl_winmessage("ERROR","REGISTROS NO EXISTEN CON ESA CONDICION","stop")
END IF
DISPLAY idx-1 TO numero_registros
DISPLAY BY NAME total2,total_fisico,total_teorico
LET progreso = 100
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
CALL set_count(idx-1)
LET existe = TRUE
ELSE
LET existe = FALSE
END IF
#### ACTUALIZACION INVENTARIO FISICO
CALL aceptainfo(existe) RETURNING cantidad_reg
IF Int_flag THEN
LET int_flag = false
RETURN
END IF
LET respuesta = fgl_winquestion("Pregunta","Esta seguro de Actualizar Datos?","no","yes|No","question",0)
IF respuesta = "yes" THEN
LET resajuste = fgl_winquestion("Pregunta","Desea Generar Documento Ajuste Articulos con Diferencias?","no","yes|No","question",0)
# LET tabla2 = "TMPIRTB00011"
LET selecb = "DELETE FROM ",tabla2 CLIPPED,
" WHERE fecha = ? and ",
" bodega = ? and ",
" cod_seccion = ? and ",
" cod_tramo = ? and ",
" cod_n = ? AND ",
" cod_grupo = ? AND ",
" cod_tipo = ? AND ",
" cod_sec = ? "
PREPARE borra FROM selecb
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Ocurrio un error, favor verifique el error ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
END IF
LET INSERTAC = "INSERT INTO ",tabla2 CLIPPED,
"(fecha,bodega,cod_seccion,cod_tramo,cod_n,cod_grupo,cod_tipo,",
"cod_Sec,cantidad,",
"balance,fech_crea) VALUES (?,?,?,?,?,?,?,?,?,?,getdate())"
PREPARE inserta FROM insertac
{ ACTURALIZACION DE LA TABLA DE INVENTARIO FISICO
LET xbodega = 1
BEGIN WORK
FOR i = 1 TO cantidad_Reg
IF arrdetalle[i].cod_n IS NOT NULL THEN
EXECUTE borra USING xfecha,arrdetalle[i].bodega,arrdetalle[i].cod_seccion,arrdetalle[i].cod_tramo,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec
IF STATUS < 0 THEN
LET cherror = "Ocurrio un error, Borrando Transaccion ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
ROLLBACK WORK
END IF
EXECUTE inserta USING xfecha,arrdetalle[i].bodega,arrdetalle[i].cod_seccion,arrdetalle[i].cod_tramo,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,
arrdetalle[i].fisico,
arrdetalle[i].teorico
#arrdetalle[i].fechacrea
# arrdetalle[i].usuario SI LE PONGO QUE ADICIONE EL USUARIO ME DA UN ERROR -254
IF STATUS < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
ROLLBACK WORK
RETURN
END IF
END IF
END FOR
COMMIT WORK
}
IF resajuste = "yes" THEN
INPUT BY NAME fecha_doc
AFTER INPUT
IF fecha_Doc IS NULL THEN
CALL FGL_WINMESSAGE("ERROR","CAMPO EN BLANCO","STOP")
NEXT FIELD fecha_doc
END IF
CALL prd(fecha_doc,usuarios) RETURNING bandera
IF bandera = 1 THEN
CALL FGL_WINMESSAGE("ERROR","FECHA FUERA DE CORTE","STOP")
NEXT FIELD fecha_doc
END IF
EXIT INPUT
END INPUT
CALL documento(cantidad_reg,tipo_inventario,fecha_doc)
END IF
CALL FGL_WINMESSAGE("ACTUALIZA","ACTUALIZACION EXITOSA","STOP")
END IF
END IF
END FUNCTION
FUNCTION eliminar(xtipo)
DEFINE xtipo CHAR(20)
CALL fgl_winmessage("MENSAJE","ESTOY EN ELIMINAR","stop")
END FUNCTION
FUNCTION aceptainfo(xexiste)
DEFINE xexiste BOOLEAN,
xcantidad SMALLINT
# FREE articulos
# FREE costos
# IF xexiste THEN
INPUT ARRAY arrdetalle WITHOUT DEFAULTS FROM sconteo.*
BEFORE ROW
LET curr = arr_curr()
LET scr_l = scr_line()
ON ACTION imprmir ATTRIBUTE(TEXT="IMP General")
# LET tipo = "INVENTA"
CALL impresion(tipo)
ON ACTION actualiza
IF tipo = "DOC" THEN
IF int_flag THEN
CALL fgl_winmessage("INFORMACION","OPERACION CANCELADA","STOP")
LET int_flag = FALSE
EXIT INPUT
END IF
CALL actualizainv()
ELSE
CALL fgl_winmessage("INFORMACION","DEBE ESTAR EN LA OPCION DE DOCUMENTO","INFO")
END IF
AFTER FIELD cod_SEC
IF arrdetalle[curr].cod_n IS NOT NULL THEN
EXECUTE articulos USING arrdetalle[curr].cod_n,
arrdetalle[curr].cod_grupo,
arrdetalle[curr].cod_tipo,
arrdetalle[curr].cod_sec
INTO arrdetalle[curr].descripcion,
arrdetalle[curr].unidad_med,
pdesglose,
kcodid
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("ERROR","ARTICULO NO EXISTE","STOP")
NEXT FIELD cod_n
END IF
DISPLAY arrdetalle[curr].descripcion TO sconteo[scr_l].descripcion
DISPLAY arrdetalle[curr].unidad_med TO sconteo[scr_l].unidad_med
EXECUTE costos USING arrdetalle[curr].cod_n,
arrdetalle[curr].cod_grupo,
arrdetalle[curr].cod_tipo,
arrdetalle[curr].cod_sec,
ano
INTO arrdetalle[curr].costo
IF sqlca.sqlcode < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error en ",tipo CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
END IF
DISPLAY arrdetalle[curr].costo TO sconteo[scr_l].costo
############################### DESGLOSE #################################
IF pdesglose ='S' THEN
CALL DIALOG.setFieldActive( "fisico",FALSE)
CALL desglose_conteo(kcodid,xfecha,almacen,seccion,tramo,arrdetalle[curr].cod_n,
arrdetalle[curr].cod_grupo,
arrdetalle[curr].cod_tipo,
arrdetalle[curr].cod_sec,
arrdetalle[curr].descripcion,
arrdetalle[curr].trxid)
RETURNING arrdetalle[curr].fisico
DISPLAY arrdetalle[curr].fisico TO sconteo[scr_l].fisico
NEXT FIELD cod_sec
ELSE
CALL DIALOG.setFieldActive( "fisico",TRUE)
END IF
#--------------------------------------------------------------------------
END IF
# IF seccion <> 99 THEN
LET arrdetalle[curr].bodega = almacen
LET arrdetalle[curr].cod_seccion = seccion
LET arrdetalle[curr].cod_tramo = tramo
DISPLAY arrdetalle[curr].bodega TO sconteo[scr_l].bodega
DISPLAY arrdetalle[curr].cod_seccion TO sconteo[scr_l].cod_seccion
DISPLAY arrdetalle[curr].cod_tramo TO sconteo[scr_l].cod_tramo
#END IF
AFTER FIELD fisico
LET scr_l = scr_line()
IF arrdetalle[curr].teorico < 0 THEN
LET arrdetalle[curr].diferencia = arrdetalle[curr].fisico - (arrdetalle[curr].teorico*-1)
ELSE
LET arrdetalle[curr].diferencia = arrdetalle[curr].fisico - arrdetalle[curr].teorico
END IF
DISPLAY arrdetalle[curr].diferencia TO sconteo[scr_l].diferencia
AFTER INPUT
IF int_flag THEN
CALL fgl_winmessage("ERROR","OPERACION ABORTADA","stop")
RETURN xcantidad
END IF
EXIT INPUT
END INPUT
# ELSE
# INPUT ARRAY arrdetalle FROM sconteo.*
# IF int_flag THEN
# CALL fgl_winmessage("ERROR","OPERACION ABORTADA","stop")
# LET xcantidad = arr_count()
# RETURN xcantidad
# END IF
# END IF
LET xcantidad = arr_count()
RETURN xcantidad
END FUNCTION
FUNCTION documento(xcantidad_reg,xtipo,zfecha)
DEFINE xcantidad_reg SMALLINT,
xtipo CHAR(30),
zfecha DATE,
xdocumento INTEGER,
chdoc CHAR(80),
ejecutasalida,ejecutaentrada BOOLEAN
IF xtipo = "MATERIA PRIMA" THEN
LET codMovAjusteEntrada = 52
LET CodMovAjusteSalida = 25
END IF
IF xtipo = "REPUESTOS" THEN
LET codMovAjusteEntrada = 52
LET CodMovAjusteSalida = 25
END IF
IF xtipo = "PRODUCTOS TERMINADOS" THEN
LET codMovAjusteEntrada = 11
LET CodMovAjusteSalida = 25
END IF
LET selecb = "SELECT MAX(a.num_doc) FROM ",tabla5 CLIPPED," a ",
"WHERE a.cod_mov = ? and a.bodega = ?"
PREPARE buscamax1 FROM selecb
EXECUTE buscamax1 USING codMovAjusteEntrada,almacen
INTO numeroEntrada
IF numeroentrada IS NULL THEN
LET numeroentrada = 0
END IF
LET selecb = "SELECT MAX(a.num_doc) FROM ",tabla5 CLIPPED," a ",
"WHERE a.cod_mov = ? and a.bodega = ? "
PREPARE buscamax12 FROM selecb
EXECUTE buscamax12 USING codMovAjusteSalida,almacen
INTO numeroSalida
IF numerosalida IS NULL THEN
LET numerosalida = 0
END IF
LET INSERTAC = "INSERT INTO ",tabla6 CLIPPED,
" (num_doc,fecha,cod_mov,bodega,cod_n,cod_grupo,cod_tipo,cod_Sec,",
" cantidad,us_crea,fech_crea,cod_seccion,cod_tramo,cod_fila,cod_pos)
VALUES (?,?,?,?,?,?,?,?,?,SUSER_SNAME(),GETDATE(),?,?,?,?)"
PREPARE inserta1 FROM insertac
LET INSERTAC = "INSERT INTO ",tabla9 CLIPPED,
" SELECT * from ",tabla8 CLIPPED
PREPARE inserta10 FROM insertac
LET numeroEntrada = numeroEntrada + 1
LET numeroSalida = numeroSalida + 1
LET selecb = "SELECT DISTINCT a.num_doc FROM ",tabla6 CLIPPED," a ",
"WHERE a.num_doc = ? AND a.cod_mov = ? "
LET ejecutasalida = FALSE
PREPARE existe FROM selecb
EXECUTE existe USING numeroSalida,codMovAjusteSalida
INTO xdocumento
IF xdocumento > 0 THEN
LET chdoc = "El documento ",numeroSalida USING "&&&&&&"," para el codigo de movimiento ",CodMovAjusteSalida USING "&&",
" existe, Desea Sustituirlo por este?"
LET respuesta = fgl_winquestion("error",chdoc,"no","yes|no","question",0)
END IF
IF respuesta = "yes" THEN
LET ejecutaSalida = true
END IF
LET xdocumento = 0
LET ejecutaEntrada = false
LET existe = true
PREPARE existe1 FROM selecb
EXECUTE existe1 USING numeroEntrada,codMovAjusteEntrada
INTO xdocumento
IF xdocumento > 0 THEN
LET chdoc = "El documento ",numeroEntrada USING "&&&&&&"," para el codigo de movimiento ",CodMovAjusteEntrada USING "&&",
" existe, Desea Sustituirlo por este?"
LET respuesta = fgl_winquestion("error",chdoc,"no","yes|no","question",0)
END IF
IF respuesta = "yes" THEN
LET ejecutaEntrada = true
END IF
BEGIN WORK
IF ejecutasalida THEN
LET selecb = "DELETE FROM ",tabla6 CLIPPED," WHERE num_doc = ? and cod_mov = ? "
PREPARE borra1 FROM selecb
EXECUTE borra1 USING numeroSalida,CodMovAjusteSalida
IF STATUS < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error ",SQLCA.sqlerrd[2], SQLERRMESSAGE
ROLLBACK WORK
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
END IF
IF ejecutaentrada THEN
LET selecb = "DELETE FROM ",tabla6 CLIPPED," WHERE num_doc = ? and cod_mov = ? "
PREPARE borra2 FROM selecb
EXECUTE borra2 USING numeroEntrada,CodMovAjusteEntrada
IF STATUS < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error en ",tabla6 CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
ROLLBACK WORK
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
END IF
FOR i = 1 TO xcantidad_reg
IF arrdetalle[i].cod_n IS NOT NULL THEN
LET arrdetalle[i].fechacrea = CURRENT YEAR TO MINUTE
IF arrdetalle[i].diferencia < 0 AND ejecutaSalida THEN
LET seccion=0
LET tramo=0
LET fila=0
LET pos=0
EXECUTE inserta1 USING numeroSalida,zfecha,
CodMovAjusteSalida,
almacen,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,
arrdetalle[i].diferencia,
seccion,tramo,fila,pos
IF STATUS < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error ",tabla6 CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
ROLLBACK WORK
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
ELSE
IF arrdetalle[i].diferencia <> 0 AND ejecutaEntrada THEN
LET seccion=1000
LET tramo=1
LET fila=1
LET pos=1
EXECUTE inserta1 USING numeroEntrada,zfecha,
CodMovAjusteEntrada,
almacen,
arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,
arrdetalle[i].diferencia,
seccion,tramo,fila,pos
IF STATUS < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error ",tabla6 CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
ROLLBACK WORK
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
END IF
END IF
#ACTUALIZA FECHA PROXIMO CONTEO
IF xtipo_inventario = "PRODUCTOS TERMINADOS" THEN
CALL mover_fecha_conteo(arrdetalle[i].cod_n,
arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,
arrdetalle[i].cod_sec,almacen)
END IF
END IF
END FOR
COMMIT WORK
END FUNCTION
FUNCTION actualizard() # ADMINISTRACION DEL DOCUMENTO DE AJUSTE
DEFINE tipo_inventario CHAR(30),
cantidad_reg SMALLINT,
numDoc INT
CONSTRUCT BY NAME criterio ON a.num_doc,a.cod_mov
INPUT BY NAME tipo_inventario
CALL cargatablas(tipo_inventario)
IF int_flag THEN
CALL FGL_WINMESSAGE("STOP","OPERACION ABORTADA","STOP")
LET int_flag = FALSE
RETURN
END IF
LET selecb =
"SELECT DISTINCT a.cod_mov,a.num_doc,a.fecha,b.descrip_mov FROM ",tabla6 CLIPPED," a, ",
tabla7 CLIPPED," b ",
" WHERE ",criterio CLIPPED," and a.cod_mov = b.cod_mov "
PREPARE bdocumento FROM selecb
DECLARE busca_doc SCROLL CURSOR FOR bdocumento
OPEN busca_doc
FETCH FIRST busca_doc INTO codMov,numDoc,fecha_doc,descrip_mov
DISPLAY codMov to cod_mov
DISPLAY numDoc to num_doc
DISPLAY BY NAME fecha_doc
DISPLAY BY NAME descrip_mov
MENU "NAVEGA"
COMMAND "Siguiente"
FETCH NEXT busca_doc INTO codMov,numDoc,fecha_doc,descrip_mov
DISPLAY codMov to cod_mov
DISPLAY numDoc to num_doc
DISPLAY BY NAME fecha_doc
DISPLAY BY NAME descrip_mov
COMMAND "Primero"
FETCH FIRST busca_doc INTO codMov,numDoc,fecha_doc,descrip_mov
DISPLAY codMov to cod_mov
DISPLAY numDoc to num_doc
DISPLAY BY NAME fecha_doc
DISPLAY BY NAME descrip_mov
COMMAND "Anterior"
FETCH LAST busca_doc INTO codMov,numDoc,fecha_doc,descrip_mov
DISPLAY codMov to cod_mov
DISPLAY numDoc to num_doc
DISPLAY BY NAME fecha_doc
DISPLAY BY NAME descrip_mov
COMMAND "Ultimo"
FETCH LAST busca_doc INTO codMov,numDoc,fecha_doc,descrip_mov
DISPLAY codMov to cod_mov
DISPLAY numDoc to num_doc
DISPLAY BY NAME fecha_doc
DISPLAY BY NAME descrip_mov
COMMAND "ITEMS"
CALL documentodetalle(numDoc,codMov)
DISPLAY BY NAME total2
CALL set_count(idx-1)
LET existe = TRUE
CALL aceptainfo(existe) RETURNING cantidad_reg
IF Int_flag THEN
LET int_flag = false
EXIT MENU
END IF
CALL fgl_winmessage("STOP","ACTUALIZACION EXITOSA","STOP")
COMMAND "Retornar"
EXIT MENU
END MENU
END FUNCTION
FUNCTION documentodetalle(xnumDoc,xCodMov)
DEFINE xnumDoc INT,
xCodMov SMALLINT
LET selecc =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,c.descrip_esp,c.unidad_med,a.cantidad FROM ",tabla6 CLIPPED," a, ",
tabla1 CLIPPED," c ",
" WHERE a.num_doc = ? AND a.cod_mov = ? AND a.cod_n = c.cod_n and a.cod_grupo = c.cod_grupo and ",
" a.cod_tipo = c.cod_tipo and a.cod_Sec = c.cod_Sec "
PREPARE docdetalle FROM selecc
DECLARE busca_Detalle CURSOR FOR docdetalle
OPEN busca_detalle USING xnumDoc,xcodMov
LET numeroDoc = xnumdoc
LET idx = 1
LET total2 = 0
LET ano = YEAR(fecha_doc)
FOREACH busca_detalle INTO arrdetalle[idx].cod_n,
arrdetalle[idx].cod_grupo,
arrdetalle[idx].cod_tipo,
arrdetalle[idx].cod_sec,
arrdetalle[idx].descripcion,
arrdetalle[idx].unidad_med,
arrdetalle[idx].fisico
EXECUTE costos USING arrdetalle[idx].cod_n,
arrdetalle[idx].cod_grupo,
arrdetalle[idx].cod_tipo,
arrdetalle[idx].cod_sec,
ano
INTO arrdetalle[idx].costo
IF sqlca.sqlcode < 0 THEN
LET cherror = "Ocurrio un error, favor verifique el error en ",tipo CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
END IF
IF arrdetalle[idx].costo IS NULL THEN
LET arrdetalle[idx].costo = 0
END IF
IF arrdetalle[idx].fisico IS NULL THEN
LET arrdetalle[idx].fisico = 0
END IF
LET arrdetalle[idx].valor1 = arrdetalle[idx].costo* arrdetalle[idx].fisico
LET total2 = total2 + arrdetalle[idx].valor1
LET idx = idx + 1
END FOREACH
END FUNCTION
FUNCTION impresion(ztipo)
DEFINE ztipo CHAR(20),
chorigen CHAR(30),
chdesglose VARCHAR(2)
DEFINE handler om.SaxDocumentHandler, -- return value from fgl_report_commitCurrentSettings()
r_filename STRING, -- filename of Report Design Document including .4rp extension
r_output STRING, -- output format option
preview INTEGER -- TRUE/FALSE, to set preview option
--pregunta al usuario por la salida del reporte
CALL selectOutput() RETURNING r_output
LET preview = 1
LET r_filename = "irprrpcs008.4rp"
-- configure report engine; the functions prefixed fgl that are called here are part of the GRW API
IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file
CALL fgl_report_selectDevice(r_output) -- changing default
CALL fgl_report_selectPreview(preview) -- changing default
LET handler = fgl_report_commitCurrentSettings() -- commit changes
ELSE
EXIT PROGRAM
END IF
--run the report
IF handler IS NOT NULL THEN -- report engine was configured ok
START REPORT imprime TO XML HANDLER handler
# IF ztipo = "INVENTA" THEN
SELECT a.nombre INTO p_companias.nombre FROM companias a
FOR i = 1 TO idx
IF arrdetalle[i].cod_n IS NOT NULL THEN
SELECT a.descripcion INTO chalmacen FROM intb00009 a WHERE
a.cod_bodega = arrdetalle[i].bodega
SELECT a.descripcion INTO chseccion FROM intb00010 a
WHERE a.cod_seccion = arrdetalle[i].cod_seccion and a.cod_bodega = arrdetalle[i].bodega
SELECT a.descripcion INTO chtramo FROM intb00043 a
WHERE a.cod_tramo = arrdetalle[i].cod_tramo and
a.cod_seccion = arrdetalle[i].cod_seccion and a.cod_bodega = arrdetalle[i].bodega
{ SELECT a.descripcion INTO chorigen FROM iptb00022 a,iptb00002 b
WHERE a.cod_cia = b.cod_cia AND
b.cod_n = b.cod_n and
b.cod_grupo = b.cod_grupo and
b.cod_tipo = b.cod_tipo and
b.cod_sec = b.cod_Sec
}
LET chdesglose = 'NO'
IF chtipoInventario="PRODUCTOS TERMINADOS" THEN
{ SE COLOCO EN COMENTARIO PORQUE LA TABLA PARA IDENTIFICAR EL DESGLOSE CAMBIO A OTRA TABLA
QUE NO ES LA iptb00062
SELECT DISTINCT a.cod_n FROM iptb00062 a
WHERE a.cod_n = arrdetalle[i].cod_n AND
a.cod_grupo = arrdetalle[i].cod_grupo AND
a.cod_tipo = arrdetalle[i].cod_tipo AND
a.cod_sec = arrdetalle[i].cod_sec AND
a.bodega = arrdetalle[i].bodega AND
a.idtrx = arrdetalle[i].trxid
IF STATUS <> NOTFOUND THEN
LET chdesglose = 'SI'
END IF
}
END IF
LET chdesglose = 'NO'
OUTPUT TO REPORT imprime(arrdetalle[i].cod_n,arrdetalle[i].cod_grupo,
arrdetalle[i].cod_tipo,arrdetalle[i].cod_sec,
arrdetalle[i].descripcion,arrdetalle[i].unidad_med,
arrdetalle[i].fisico,arrdetalle[i].teorico,
arrdetalle[i].diferencia,arrdetalle[i].costo,
arrdetalle[i].valor1,arrdetalle[i].valor2,
arrdetalle[i].bodega,arrdetalle[i].cod_seccion,
arrdetalle[i].cod_tramo,
p_companias.nombre,chalmacen,chseccion,chtramo,chtipoInventario,numeroDoc,codMov,descrip_mov,tipo,chorigen,xfecha,
chdesglose
)
END IF
END FOR
FINISH REPORT imprime
#END IF
ELSE
EXIT PROGRAM
END IF
END FUNCTION
FUNCTION calmacen()
DEFINE kcod_bodega SMALLINT,kdescripcion CHAR(30)
LET palmacen = ui.combobox.forname("formonly.almacen")
DECLARE busca_alm CURSOR FOR
SELECT a.cod_bodega,a.descripcion FROM Intb00009 a
CALL palmacen.clear()
FOREACH busca_alm INTO kcod_bodega,kdescripcion
CALL palmacen.additem(kcod_bodega,kdescripcion)
END FOREACH
CALL palmacen.additem(99,"TODOS")
END FUNCTION
FUNCTION cfecha()
DEFINE kfecha date
LET pfecha = ui.combobox.forname("formonly.busca_fecha")
LET selec =
"SELECT UNIQUE top 10 a.fecha,CONVERT(CHAR(10),a.fecha,103) FROM ",tabla2 clipped," a order by a.fecha desc "
PREPARE comando_fecha FROM selec
DECLARE busca_fecha CURSOR FOR comando_fecha
OPEN busca_fecha
CALL pfecha.clear()
FOREACH busca_fecha INTO kfecha,kfecha
CALL pfecha.additem(kfecha,kfecha)
END FOREACH
END FUNCTION
FUNCTION actualizaINV()
DEFINE inserta,borra,respuestainv STRING
LET respuestainv = fgl_winquestion("Pregunta","Esta seguro de Actualizar Datos?","no","yes|No","question",0)
IF respuestainv <> "yes" THEN
RETURN
END IF
{============================================================================
PRODUCTOS TERMINADOS: el posteo se realiza a traves de sp_insert_inventario
para que iptb00006 e iptb00062 (ubicaciones 1:N) queden integrados en una
sola operacion validada, igual que en ipprmt044.
NOTA: el codigo anterior insertaba en iptb00062 DESPUES de borrar el
temporal iptb00042, por lo que las ubicaciones nunca se insertaban.
============================================================================}
IF tabla10 IS NOT NULL THEN
CALL actualizaINV_sp()
RETURN
END IF
{============================================================================
REPUESTOS / MATERIA PRIMA: posteo directo (el SP solo aplica a las tablas
de productos terminados iptb*).
============================================================================}
LET inserta = "INSERT INTO ",tabla5 CLIPPED," (num_doc,cod_mov,fecha,bodega,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad_2,us_crea,fech_crea,us_mod,fech_mod) ",
" SELECT num_doc,cod_mov,fecha,bodega,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad,us_crea,fech_crea,us_mod,fech_mod FROM ",tabla6 CLIPPED,
" WHERE cod_mov = ? and num_doc = ? "
LET borra = "DELETE FROM ",tabla6 CLIPPED, " WHERE cod_mov = ? and num_doc = ? and bodega = ? "
BEGIN WORK
PREPARE pinserta FROM Inserta
EXECUTE pinserta USING codmov,numerodoc
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Ocurrio un error actualizando ",tabla5 CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
PREPARE pborra FROM borra
EXECUTE pborra USING codmov,numerodoc,almacen
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Ocurrio un error borrando ",tabla5 CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
COMMIT WORK
CALL fgl_winmessage("INFORMACION","ACTUALIZACION EXITOSA","STOP")
END FUNCTION
{==============================================================================
POSTEO DEL AJUSTE DE CONTEO PARA PRODUCTOS TERMINADOS VIA sp_insert_inventario
- Lee cada fila del documento temporal (iptb00042) del cod_mov/num_doc/bodega.
- Arma el JSON de ubicacion con la seccion/tramo/fila/posicion del temporal
(entrada: 1000-1-1-1, salida: 0-0-0-0, segun genera la funcion documento).
- El SP inserta iptb00006 + iptb00062, valida cantidades, existencia y costo.
- Si todo el documento pasa, se borra el temporal y se confirma; si un item
falla, se revierte TODO el documento y se muestra el mensaje del SP.
==============================================================================}
FUNCTION actualizaINV_sp()
DEFINE selecTmp,borra,procedimiento STRING,
w_fecha DATE,
w_cod_n,w_cod_grupo,w_cod_tipo,w_cod_sec SMALLINT,
w_cantidad DECIMAL(12,5),
w_seccion,w_tramo,w_fila,w_pos SMALLINT,
jsonUbic DYNAMIC ARRAY OF RECORD
area, cod_n, cod_Grupo, cod_tipo, cod_sec INT,
id_bodega, id_seccion1 INT,
id_tramo1 INT,
id_fila, id_pos INT,
cantidad1, cantidad2 DECIMAL(12,5)
END RECORD,
jsonMovi STRING,
out_result INT,
cod_mensaje INT,
out_cantidad_item DECIMAL(18,5),
out_cantidad_ubicacion DECIMAL(18,5),
out_msg VARCHAR(1000),
xarea SMALLINT,
detalle_aj CHAR(60),
pcontrol_dep CHAR(5),
nullInt INT,
nullChar CHAR(10),
nullDec DECIMAL(18,5),
registros INT
INITIALIZE nullInt TO NULL
INITIALIZE nullChar TO NULL
INITIALIZE nullDec TO NULL
LET xarea = 1 # MISMA AREA FIJA QUE USABA EL INSERT ANTERIOR A iptb00062
LET detalle_aj = "AJUSTE CONTEO FISICO"
LET pcontrol_dep = "NO" # EL CONTEO NO CONTROLA DEPARTAMENTO NI ORDENES
LET registros = 0
LET selecTmp = "SELECT fecha,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad,",
"cod_seccion,cod_tramo,cod_fila,cod_pos FROM ",tabla6 CLIPPED,
" WHERE cod_mov = ? AND num_doc = ? AND bodega = ? "
PREPARE ptmpaj FROM selecTmp
DECLARE cur_aj CURSOR FOR ptmpaj
LET procedimiento =
"EXEC sp_insert_inventario ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"
PREPARE smt_aj FROM procedimiento
BEGIN WORK
FOREACH cur_aj USING codmov,numerodoc,almacen
INTO w_fecha,w_cod_n,w_cod_grupo,w_cod_tipo,w_cod_sec,w_cantidad,
w_seccion,w_tramo,w_fila,w_pos
LET registros = registros + 1
CALL jsonUbic.clear()
LET jsonUbic[1].area = xarea
LET jsonUbic[1].cod_n = w_cod_n
LET jsonUbic[1].cod_Grupo = w_cod_grupo
LET jsonUbic[1].cod_tipo = w_cod_tipo
LET jsonUbic[1].cod_sec = w_cod_sec
LET jsonUbic[1].id_bodega = almacen
LET jsonUbic[1].id_seccion1 = w_seccion
LET jsonUbic[1].id_tramo1 = w_tramo
LET jsonUbic[1].id_fila = w_fila
LET jsonUbic[1].id_pos = w_pos
LET jsonUbic[1].cantidad1 = w_cantidad
LET jsonUbic[1].cantidad2 = w_cantidad
LET jsonMovi = util.JSON.stringify(jsonUbic)
INITIALIZE out_result TO NULL
INITIALIZE cod_mensaje TO NULL
INITIALIZE out_msg TO NULL
EXECUTE smt_aj
USING nullInt IN, # num_oc (EL CONTEO NO TIENE ORDEN)
w_cod_n IN,
w_cod_grupo IN,
w_cod_tipo IN,
w_cod_sec IN,
xarea IN, # area
w_cantidad IN, # cantidad_1
w_cantidad IN, # cantidad_2
codmov IN,
numerodoc IN, # num_doc YA ASIGNADO POR documento()
nullInt IN, # tmpnumero
nullInt IN, # entrada
w_fecha IN,
nullChar IN, # conduceno
nullInt IN, # codsp
nullInt IN, # codspSec
nullInt IN, # codtransp
nullInt IN, # sectransp
nullChar IN, # placa
detalle_aj IN, # detalle
almacen IN, # bodega
nullChar IN, # pcerrada
usuarios IN, # usuario_crea
nullInt IN, # numreq
nullChar IN, # codigobloque
nullInt IN, # secvend
nullChar IN, # direccion
nullInt IN, # bodega_d
nullInt IN, # num_doc_retrabajo
nullChar IN, # aplicaDev
nullInt IN, # departamento
pcontrol_dep IN, # pcontrol_depto = 'NO'
nullInt IN, # factura
nullInt IN, # numero_doc
nullDec IN, # costo (EL SP LO BUSCA SI CONTROLA EXISTENCIA)
nullInt IN, # cod_mov_transferencia
nullInt IN, # num_doc_transferencia
nullInt IN, # bodega_procedencia
jsonMovi IN,
out_result OUT,
cod_mensaje OUT,
out_cantidad_item OUT,
out_cantidad_ubicacion OUT,
out_msg OUT
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Error SQL ejecutando sp_insert_inventario ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
IF out_result <> 0 THEN
DISPLAY "============================================"
DISPLAY "ERROR sp_insert_inventario (CONTEO FISICO)"
DISPLAY "ITEM: ",w_cod_n,"-",w_cod_grupo,"-",w_cod_tipo,"-",w_cod_sec
DISPLAY "DOCUMENTO: ",numerodoc," MOVIMIENTO: ",codmov," BODEGA: ",almacen
DISPLAY "COD_MENSAJE: ",cod_mensaje
DISPLAY "OUT_MSG: ",out_msg
DISPLAY "JSON: ",jsonMovi
DISPLAY "============================================"
ROLLBACK WORK
LET cherror = "ITEM ",w_cod_n USING "<<<&","-",
w_cod_grupo USING "<<<<&","-",
w_cod_tipo USING "<<<<&","-",
w_cod_sec USING "<<<<&",": ",out_msg CLIPPED
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
END FOREACH
IF registros = 0 THEN
ROLLBACK WORK
CALL fgl_winmessage("INFORMACION","NO HAY REGISTROS EN EL DOCUMENTO TEMPORAL PARA ACTUALIZAR","INFO")
RETURN
END IF
# TODOS LOS ITEMS PASARON: ELIMINAR EL DOCUMENTO TEMPORAL Y CONFIRMAR
LET borra = "DELETE FROM ",tabla6 CLIPPED," WHERE cod_mov = ? and num_doc = ? and bodega = ? "
PREPARE pborra_sp FROM borra
EXECUTE pborra_sp USING codmov,numerodoc,almacen
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror = "Ocurrio un error borrando ",tabla6 CLIPPED," ",SQLCA.sqlerrd[2], SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN
END IF
COMMIT WORK
CALL fgl_winmessage("INFORMACION","ACTUALIZACION EXITOSA","STOP")
END FUNCTION