{ ============================================================================== 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