From a5ccd3083f465533ed6ed1380c0279a8d0fe9ef2 Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Wed, 7 Oct 2026 12:11:28 -0400 Subject: [PATCH 01/14] JSOTO Adicion grupos ADMINISTRACION PERSONAL Y NOMINA --- PROYECTO/PRDIR/prprmt008.4gl | 34 +- PROYECTO/ccdir/ccprmt008.4gl | 21 +- PROYECTO/ccdir/ccprmt008.4gl.bak20261005 | 1362 +++++++++++++++++ PROYECTO/mbsERP.4pw | 2 + PROYECTO/otrodir/autorizacioncontado.4gl | 2 +- .../autorizacioncontado.4gl.bak20261005 | 90 ++ PROYECTO/otrodir/autorizarequisicion.4gl | 19 +- PROYECTO/otrodir/evaluaclientes.4gl | 20 +- PROYECTO/otrodir/requisiciondespacho.4gl | 103 +- .../requisiciondespacho.4gl.bak20261005 | 250 +++ PROYECTO/vedir/veconvierteorden.4gl | 22 +- WEBSERVICES/orden_e.4gl | 38 +- WEBSERVICES/tiendaonline/apiorden.4gl | 16 +- WEBSERVICES/veconvierteorden.4gl | 20 +- 14 files changed, 1888 insertions(+), 111 deletions(-) create mode 100644 PROYECTO/ccdir/ccprmt008.4gl.bak20261005 create mode 100644 PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005 create mode 100644 PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005 diff --git a/PROYECTO/PRDIR/prprmt008.4gl b/PROYECTO/PRDIR/prprmt008.4gl index 20e7395..8ab0f28 100644 --- a/PROYECTO/PRDIR/prprmt008.4gl +++ b/PROYECTO/PRDIR/prprmt008.4gl @@ -64,7 +64,7 @@ GLOBALS "prprgb000.4gl" nombre_vend,nombres,apellidos CHAR(40),fcalle CHAR(25), fcasa_num CHAR(5), fbarrio,furbanizacion CHAR(15), monto_desc,total1,p_costos1,total_i,total_mo DECIMAL(12,2), - ult_numero,cuenta INTEGER, + ult_numero,cuenta,existe_oc INTEGER, vetb05 RECORD LIKE vetb00005.*, cuenta_p,ridx SMALLINT, pbalance1,pbalance2 DEC(12,2), @@ -798,19 +798,26 @@ FUNCTION prpcad008() # SE COLOCO QUE EL NUMERO SE GENERARA A PARTIR DEL 01/01/2003 HACIA ATRAS POR MODIFICACION DEL # SISTEMA Y LA INCLUSION DEL NCF A PARTIR DEL 01/01/2007 # FECHA MODIFICACION: 11/01/2007 - SELECT num_oc INTO ult_numero FROM prtb00020 IF nuevo = "S" THEN - IF ult_numero IS NULL THEN - LET ult_numero = 0 - END IF - LET ult_numero = ult_numero + 1 - LET prtb08.num_oc = ult_numero - DISPLAY BY NAME prtb08.num_oc - - UPDATE prtb00020 set num_oc = ult_numero, + # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020 + # hasta el COMMIT, asi dos usuarios no pueden tomar el mismo num_oc + # (antes se leia y luego se escribia -> PK_prtb00012 duplicada) + BEGIN WORK + UPDATE prtb00020 SET num_oc = ISNULL(num_oc, 0) + 1, us_crea = SUSER_SNAME(), fech_crea = GETDATE() - + SELECT num_oc INTO ult_numero FROM prtb00020 + # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre + LET existe_oc = 0 + SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero + IF existe_oc > 0 THEN + SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012 + UPDATE prtb00020 SET num_oc = ult_numero + END IF + COMMIT WORK + LET prtb08.num_oc = ult_numero + DISPLAY BY NAME prtb08.num_oc + { CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of, doble_on,doble_off,comp_on,comp_off, doce,normal,archivo,copia1 @@ -851,9 +858,8 @@ CALL seleccionarsalida() RETURNING r_output fech_crea = GETDATE() WHERE @num_oc = prtb09.num_oc - UPDATE prtb00020 SET num_oc = ult_numero, - us_Crea = SUSER_SNAME(), - fech_crea = GETDATE() + # (se elimino la re-escritura de prtb00020 aqui: el consecutivo ya se tomo + # arriba de forma atomica y re-escribirlo podia retroceder el contador) # ACTUALIZA NUMERO TEMPORAL PARA EL DESPIECE UPDATE prtb00022 SET num_oc = prtb08.num_oc WHERE num_oc = tmpnumero diff --git a/PROYECTO/ccdir/ccprmt008.4gl b/PROYECTO/ccdir/ccprmt008.4gl index bac1802..77efb16 100644 --- a/PROYECTO/ccdir/ccprmt008.4gl +++ b/PROYECTO/ccdir/ccprmt008.4gl @@ -514,19 +514,28 @@ FUNCTION req_insert() DEFINE ultimo,numeroOrden INT # WHENEVER ERROR CONTINUE - SELECT a.num_req INTO ultimo FROM cctb00019 a - + # 05/10/2026 - consecutivo dentro de la transaccion con bloqueo + # (evita num_req duplicado en cctb00025, ver requisiciondespacho.4gl) + BEGIN WORK + PREPARE p_numreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00019 WITH (UPDLOCK, HOLDLOCK)" + EXECUTE p_numreq INTO ultimo + PREPARE p_maxreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00025 WITH (UPDLOCK, HOLDLOCK)" + EXECUTE p_maxreq INTO numeroOrden + IF ultimo IS NULL THEN LET ultimo = 0 END IF + IF numeroOrden > ultimo THEN + LET ultimo = numeroOrden + END IF + LET numeroOrden = NULL LET ultimo = ultimo + 1 LET requisicion.num_req = ultimo - - UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate() - + + UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate() + # GUARDA MASTER TABLE # PREPARE s FROM "SELECT @@IDENTITY" - BEGIN WORK # EXECUTE s INTO requisicion.num_req DISPLAY BY NAME requisicion.num_req diff --git a/PROYECTO/ccdir/ccprmt008.4gl.bak20261005 b/PROYECTO/ccdir/ccprmt008.4gl.bak20261005 new file mode 100644 index 0000000..bac1802 --- /dev/null +++ b/PROYECTO/ccdir/ccprmt008.4gl.bak20261005 @@ -0,0 +1,1362 @@ +{ +----------------------------------------------------------------------------- +PROGRAMA : CCPRMT008 +OBJETIVO : Mantenimiento Requisiciones Despacho +REALIZADO POR : JUAN SOTO +FECHA : Enero 2010 + +FUNCTIONES : envia_correo() Envia correo a la persona quien autoriza las ordenes + +----------------------------------------------------------------------------- +} +GLOBALS "ccprgb000.4gl" + DEFINE estado BOOLEAN, + actualiza CHAR(2), + + accion CHAR(1), + idx2 SMALLINT, + resultado,total_medida_r DEC(12,5), + porc_itbis DYNAMIC ARRAY OF DEC(8,2), + rcantidad,numerotemp INT, + + + listarequisi DYNAMIC ARRAY OF RECORD + estado1 CHAR(20), + estado2 CHAR(20), + estado_produccion VARCHAR(20), + num_req1 INT, + fecha1 CHAR(10), + material CHAR(50), + fecha_transporte CHAR(10), + fecha_llegada CHAR(10), + num_oc1 INT, + cliente1 CHAR(40), + valor1 DEC(12,2) + END RECORD, + pcerrada CHAR(1), + xmonto DEC(12,2), + + rdespiece DYNAMIC ARRAY OF RECORD + etiqueta CHAR(20), + cod_n , + cod_grupo , + cod_tipo , + cod_sec SMALLINT, + lado_1 , + lado_2 , + lado_3 , + cantidad , + medida, + cantidad_r, + medida_r DEC(12,5) + END RECORD, + idx1,cuenta_despiece,pcondpago SMALLINT, + pneto DEC(12,2), + pcotizacion,xorden,xtipocliente,xseccliente INT, + pfecha_req CHAR(10) + + +MAIN + DEFER INTERRUPT + CALL ARG_VAL(1) RETURNING usuarios + CALL ARG_VAL(2) RETURNING clave + CALL ARG_VAL(4) RETURNING impresor + CALL STARTLOG("ccprmt008.txt") + CONNECT to "smarmotech" USER usuarios USING clave + + INITIALIZE requisicion.* TO NULL + + SELECT a.sec_vend,RTRIM(b.nom1_emp)||' '||b.apell1_emp, + a.email + INTO requisicion.sec_vend,requisicion.nombre_vendedor, + vendedorEmail + FROM seg0000 a,adtb00003 b + WHERE a.usuario = usuarios AND + a.sec_vend = b.num_emp + CALL ccprmt008() +END MAIN + +FUNCTION ccprmt008() + OPTIONS INPUT WRAP + OPEN WINDOW w1 AT 10,5 WITH FORM "ccfmmt008" + + CALL carga_lista() + LET requisicion.fecha_requisicion = TODAY + DISPLAY BY NAME requisicion.nombre_vendedor, + requisicion.sec_vend,requisicion.fecha_requisicion + MENU + ON ACTION nuevo ATTRIBUTE(TEXT="Nuevo",IMAGE="new") + LET actualiza = "NO" + LET accion = "A" + CALL arr_requisicion.clear() + + CALL ccprad008() + ON ACTION buscar ATTRIBUTE(TEXT="Buscar",IMAGE="find") + LET accion = "M" + CALL ccprmf008() + ON ACTION refrescar ATTRIBUTE(TEXT="Refrescar",IMAGE="Refresh") + CALL carga_lista() + ON ACTION salir + EXIT MENU + END MENU + + CLOSE WINDOW w1 + +END FUNCTION + +FUNCTION ccprad008() + DEFINE remanente,unidadRemanente DEC(12,4), + total_cotizacion,total_requisicion DEC(12,2) + + LET requisicion.fecha_requisicion = TODAY + LET requisicion.estado = 'NO AUTORIZADA' + LET requisicion.num_req = 0 + + DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM) + INPUT BY NAME requisicion.busca_orden ATTRIBUTES(WITHOUT DEFAULTS) + {AFTER FIELD sec_vend + SELECT UNIQUE RTRIM(b.nom1_emp)||' '||b.apell1_emp,a.email + INTO requisicion.nombre_vendedor,vendedoremail + FROM adtb00003 b,seg0000 a + WHERE b.num_emp = requisicion.sec_vend and + b.num_Emp = a.sec_vend + + IF STATUS = NOTFOUND THEN + CALL msg(3) + NEXT FIELD sec_vend + END IF + DISPLAY BY NAME requisicion.nombre_vendedor} + + AFTER FIELD busca_orden + LET pcerrada = null + SELECT a.sec_vend,a.cerrada,a.cond_pago + INTO requisicion.sec_vend,pcerrada,pcondpago + FROM prtb00012 a + WHERE a.num_oc = requisicion.busca_orden AND + a.status_t IS NULL + + IF STATUS = NOTFOUND THEN + CALL msg(3) + END IF + IF pcerrada = 'S' THEN + CALL fgl_winmessage("INFO","ORDEN ESTA CERRADA","STOP") + NEXT FIELD busca_orden + END IF + SELECT RTRIM(b.nom1_emp)||' '||b.apell1_emp + INTO requisicion.nombre_vendedor + FROM adtb00003 b + WHERE b.num_emp = requisicion.sec_vend + + DISPLAY BY NAME requisicion.sec_vend,requisicion.nombre_vendedor + # IF pcondpago = 4 THEN + # CALL fgl_winmessage("INFO","ESTA ORDEN ES AL CONTADO, NO PUEDES HACER REQUISICION","INFO") + # NEXT FIELD busca_orden + # END IF + # ESTE CONSTRUCT SE COLOCO EN COMENTARIO PORQUE EL DIRECTOR DE VENTAS + # INFORMO QUE EN LA PRIMERA VERSION, EL VENDEDOR DEBE SABER QUE ORDEN + # VA A REQUERIR. + # CONSTRUCT criterio ON a.num_oc,a.fecha_oc,a.cotizacion_no + # FROM busca_orden,busca_fecha,busca_cotizacion + + # BEFORE CONSTRUCT + # CALL DIALOG.setactionactive("procesa",0) + # CALL arr_requisicion.clear() + + # ON ACTION busca_parametros + + LET selec3 = + "SELECT 'N',a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre,SUM(b.cantidad),SUM(h.cantidad_1), ", + " b.area,b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med, ", + " SUM(h.cantidad_1),SUM(b.cantidad),'0','0','0','0','0',h.id_kit,g.porc_itbi ", + "FROM prtb00012 a,vetb00004 c,prtb00013 b,iptb00002 d, ", + " vetb00050 g,prtb00023 h ", + "WHERE a.num_oc =",requisicion.busca_orden," AND ", + # " a.sec_vend = g.sec_vend AND ", + " a.tipo_cliente = c.tipo_cliente AND ", + " a.sec_cliente = c.sec_cliente AND ", + " a.num_oc = b.num_oc and ", + " a.num_oc = h.num_oc AND", + " b.cod_n = d.cod_n and ", + " b.cod_grupo = d.cod_grupo and ", + " b.cod_tipo = d.cod_tipo and ", + " b.cod_Sec = d.cod_Sec and ", + " b.secuencia = h.secuencia AND ", + " b.cod_n = h.cod_n and ", + " b.cod_grupo = h.cod_grupo and ", + " b.cod_tipo = h.cod_tipo and ", + " b.cod_Sec = h.cod_Sec and ", + " a.cotizacion_no = g.cotizacion_no AND ", + " a.cerrada = 'N' and a.status_t IS NULL ", + " GROUP BY a.fecha_oc,a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre, ", + " b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med,g.porc_itbi,b.area,h.id_kit " + + { " UNION ", + "SELECT 'N',a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre,b.cantidad,b.cantidad, ", + " b.area,b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med, ", + " b.cantidad,b.cantidad,'0','0','0','0','0',b.id_kit,g.porc_itbi ", + "FROM prtb00012 a,vetb00004 c,prtb00031 b,iptb00002 d, ", + " vetb00050 g ", + "WHERE a.num_oc =",requisicion.busca_orden," AND ", + " a.sec_vend = g.sec_vend AND ", + " a.tipo_cliente = c.tipo_cliente AND ", + " a.sec_cliente = c.sec_cliente AND ", + " a.num_oc = b.num_oc and ", + " b.cod_n = d.cod_n and ", + " b.cod_grupo = d.cod_grupo and ", + " b.cod_tipo = d.cod_tipo and ", + " b.cod_Sec = d.cod_Sec and ", + " a.cotizacion_no = g.cotizacion_no AND ", + " a.cerrada = 'N' and a.status_t IS NULL " + + } + PREPARE comando FROM selec3 + DECLARE busca_orden CURSOR FOR comando + OPEN busca_orden + + LET total_cotizacion = 0 + LET idx = 1 + LET pcotizacion = 0 + FOREACH busca_orden INTO arr_requisicion[idx].*, + porc_itbis[idx] + LET arr_requisicion[idx].procesa = "NO" + + + # BUSCA PRECIO + LET arr_requisicion[idx].precio = 0 + IF arr_requisicion[idx].kit IS NULL THEN + SELECT AVG(a.precio),AVG(a.porc_Desc) + INTO arr_requisicion[idx].precio,arr_requisicion[idx].descuento + FROM vetb00051 a + WHERE a.cotizacion_no = arr_requisicion[idx].cotizacion_no AND + a.area = arr_requisicion[idx].area AND + a.cod_n = arr_requisicion[idx].cod_n AND + a.cod_grupo = arr_requisicion[idx].cod_grupo AND + a.cod_tipo = arr_requisicion[idx].cod_tipo AND + a.cod_Sec = arr_requisicion[idx].cod_sec + ELSE + SELECT AVG(a.precio),AVG(a.porc_Desc) + INTO arr_requisicion[idx].precio,arr_requisicion[idx].descuento + FROM vetb00031 a + WHERE a.cotizacion_no = arr_requisicion[idx].cotizacion_no AND + a.area = arr_requisicion[idx].area AND + a.cod_n = arr_requisicion[idx].cod_n AND + a.cod_grupo = arr_requisicion[idx].cod_grupo AND + a.cod_tipo = arr_requisicion[idx].cod_tipo AND + a.cod_Sec = arr_requisicion[idx].cod_sec AND + a.id_kit = arr_requisicion[idx].kit + + END IF + IF arr_requisicion[idx].precio IS NULL THEN + LET arr_requisicion[idx].precio = 0 + END IF + LET pcotizacion = arr_requisicion[idx].cotizacion_no + LET arr_requisicion[idx].valor = arr_requisicion[idx].cantidad_ord * + arr_requisicion[idx].precio + LET arr_requisicion[idx].descvalor = + (arr_requisicion[idx].cantidad_ord * + arr_requisicion[idx].precio) * + (arr_requisicion[idx].descuento/100) + + LET arr_requisicion[idx].valor = arr_requisicion[idx].valor - + arr_requisicion[idx].descvalor + + LET arr_requisicion[idx].valor = (arr_requisicion[idx].valor * + (porc_itbis[idx] /100)) + + arr_requisicion[idx].valor + + + CALL controles(requisicion.num_req,arr_requisicion[idx].area, arr_requisicion[idx].cod_n, + arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo, + arr_requisicion[idx].cod_sec,arr_requisicion[idx].num_oc,0,arr_requisicion[idx].cantidad_ord) + RETURNING estado,arr_requisicion[idx].cantidad,arr_requisicion[idx].cantidad_1 + + LET total_cotizacion = total_cotizacion + arr_requisicion[idx].valor + + IF arr_requisicion[idx].cantidad IS NULL THEN + LET arr_requisicion[idx].cantidad_1 = arr_requisicion[idx].cantidad_ord1 + LET arr_requisicion[idx].cantidad = arr_requisicion[idx].cantidad_ord + LET arr_requisicion[idx].cantidad_pendiente = 0 + ELSE + + DISPLAY "CALCULO: CODIGO: ", arr_requisicion[idx].cod_sec," ORDEN:",arr_requisicion[idx].cantidad_ord1," CANTIDAD1: ",arr_requisicion[idx].cantidad_1 + LET arr_requisicion[idx].cantidad_1 = arr_requisicion[idx].cantidad_ord1 - + arr_requisicion[idx].cantidad_1 + + CALL factor_conv(arr_requisicion[idx].cod_n, + arr_requisicion[idx].cod_grupo, + arr_requisicion[idx].cod_tipo, + arr_requisicion[idx].cod_sec, + arr_requisicion[idx].cantidad_1) + RETURNING resultado,estado + + LET arr_requisicion[idx].cantidad_pendiente = arr_requisicion[idx].cantidad_1 + DISPLAY "pendiente: ",arr_requisicion[idx].cantidad_pendiente + CALL factor_conv(arr_requisicion[idx].cod_n, + arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo, + arr_requisicion[idx].cod_sec,arr_requisicion[idx].cantidad_1) + RETURNING resultado,estado + IF resultado > 0 THEN + LET arr_requisicion[idx].cantidad = resultado + ELSE + LET arr_requisicion[idx].cantidad = arr_requisicion[idx].cantidad_1 + END IF + + IF arr_requisicion[idx].cantidad_1 <=0 THEN + DISPLAY "SE DEVUELVE: ",arr_requisicion[idx].cod_sec," cantidad: ",arr_requisicion[idx].cantidad_1 + CONTINUE FOREACH + END IF + END IF + + + LET idx = idx + 1 + END FOREACH + LET estado = FALSE + IF idx = 1 THEN + CALL fgl_winmessage("ERROR","NO EXISTEN ORDENES CON ESA CONDICION","STOP") + CALL arr_requisicion.clear() + EXIT DIALOG + END IF + DISPLAY BY NAME total_cotizacion + CALL set_count(idx-1) +# AFTER CONSTRUCT +# CALL input_data() + AFTER INPUT + SELECT UNIQUE RTRIM(b.nom1_emp)||' '||b.apell1_emp,a.email + INTO requisicion.nombre_vendedor,vendedoremail + FROM adtb00003 b,seg0000 a + WHERE b.num_emp = requisicion.sec_vend and + b.num_Emp = a.sec_vend + + IF STATUS = NOTFOUND THEN + CALL msg(3) + NEXT FIELD busca_orden + END IF + DISPLAY BY NAME requisicion.nombre_vendedor + + END INPUT + + + INPUT ARRAY arr_requisicion FROM s_requisi.* ATTRIBUTE(WITHOUT DEFAULTS) + + ON ACTION desseleccion + + FOR idx2 = 1 TO idx + IF arr_requisicion[idx2].num_oc IS NOT NULL THEN + LET arr_requisicion[idx2].procesa = "NO" + + DISPLAY arr_requisicion[idx2].procesa TO s_requisi[scr_l].procesa + END IF + END FOR + + + ON ACTION seleccion + + FOR idx2 = 1 TO arr_requisicion.getLength() + IF arr_requisicion[idx2].num_oc IS NOT NULL THEN + LET arr_requisicion[idx2].procesa = "SI" + LET scr_l = scr_line() + DISPLAY arr_requisicion[idx2].procesa TO s_requisi[idx2].procesa + END IF + END FOR + + BEFORE INPUT + CALL DIALOG.setactionactive("procesa",1) + CALL DIALOG.setactionactive("insert",FALSE) + CALL DIALOG.setactionactive("delete",FALSE) + CALL DIALOG.setactionactive("append",FALSE) + BEFORE ROW + LET curr = arr_curr() + LET scr_l = scr_line() + + AFTER FIELD cantidad_1 + LET curr = arr_curr() + LET scr_l = scr_line() + IF arr_requisicion[curr].cantidad_1 > 0 AND arr_requisicion[curr].procesa = "SI" THEN + LET arr_requisicion[curr].valor = 0 + CALL factor_conv(arr_requisicion[curr].cod_n, + arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo, + arr_requisicion[curr].cod_sec,arr_requisicion[curr].cantidad_1) + RETURNING resultado,estado + + IF estado = FALSE THEN + CALL fgl_winmessage("ERROR","PROBLEMA EN EL FACTOR DE CONVERSION, CONTACTE ADM INVENTARIO","STOP") + NEXT FIELD cantidad_1 + END IF + + LET arr_requisicion[curr].cantidad = resultado + DISPLAY arr_requisicion[curr].cantidad TO s_requisi[scr_l].cantidad + IF arr_requisicion[curr].cantidad_1 > arr_requisicion[curr].cantidad_ord1 THEN + CALL fgl_Winmessage("ERROR","CANTIDAD EXECEDE CANTIDAD ORDEN","STOP") + NEXT FIELD cantidad_1 + END IF + CALL controles(requisicion.num_req,arr_requisicion[curr].area,arr_requisicion[curr].cod_n, + arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo, + arr_requisicion[curr].cod_sec,arr_requisicion[curr].num_oc,arr_requisicion[curr].cantidad, + arr_requisicion[curr].cantidad_ord) + RETURNING estado,remanente,unidadRemanente + + IF NOT estado THEN + CALL fgl_winmessage("ERROR","NO PUEDE HACER MAS REQUISICION A ESTA ORDEN","STOP") + NEXT FIELD cantidad_1 + END IF + + # CALL control_despiece(arr_requisicion[curr].area,arr_requisicion[curr].cod_n,arr_requisicion[curr].cod_grupo, + # arr_requisicion[curr].cod_tipo,arr_requisicion[curr].cod_sec, + # arr_requisicion[curr].num_oc ,arr_requisicion[curr].cantidad,accion) RETURNING estado + + # IF estado = FALSE THEN + # CALL fgl_winmessage("ERROR","NO PUEDE ADICIONAR REQUISICION, EXISTE UN ITEM QUE DEBE DESPIEZAR o LA CANTIDAD DIFIERE DE LA CANTIDAD EN LA REQUISICION","STOP") + # NEXT FIELD cantidad_1 + # END IF + # call fgl_winmessage("w",rcantidad||' '||arr_requisicion[idx].num_oc||' '|| + # arr_requisicion[idx].procesa||' '|| + # arr_requisicion[idx].cod_sec|| ' '||idx,"stop") + + LET arr_requisicion[curr].descvalor =(arr_requisicion[curr].cantidad * + arr_requisicion[curr].precio) * + (arr_requisicion[curr].descuento/100) + + LET arr_requisicion[curr].valor = (arr_requisicion[curr].cantidad * + arr_requisicion[curr].precio) - + arr_requisicion[curr].descvalor + + LET arr_requisicion[curr].valor = arr_requisicion[curr].valor + + (arr_requisicion[curr].valor * (porc_itbis[curr]/100)) + IF arr_requisicion[curr].valor < 0 THEN + LET arr_requisicion[curr].valor =arr_requisicion[curr].cantidad * + arr_requisicion[curr].precio + END IF + DISPLAY arr_requisicion[curr].valor TO s_requisi[scr_l].valor + + END IF + AFTER INPUT + LET total_requisicion = 0 + FOR idx = 1 TO arr_count() + # CALL control_despiece(arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo, + # arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_sec, + # arr_requisicion[idx].num_oc ,arr_requisicion[idx].cantidad,accion) RETURNING estado + + # IF estado = FALSE THEN + # CALL fgl_winmessage("ERROR","NO PUEDE ADICIONAR REQUISICION, EXISTE UN ITEM QUE DEBE DESPIEZAR o LA CANTIDAD DIFIERE DE LA CANTIDAD EN LA REQUISICION","STOP") + # NEXT FIELD cantidad_1 + # END IF + + LET total_Requisicion = total_requisicion + arr_requisicion[curr].valor + # call fgl_winmessage("w",rcantidad||' '||arr_requisicion[idx].num_oc||' '|| + # arr_requisicion[idx].procesa||' '|| + # arr_requisicion[idx].cod_sec|| ' '||idx,"stop") + + END FOR + DISPLAY BY NAME total_requisicion + END INPUT + + ON ACTION procesa + LET rcantidad = arr_requisicion.getLength() + IF rcantidad > 0 THEN + CALL req_insert() RETURNING estado + IF estado THEN + + DECLARE busca_emails CURSOR FOR + SELECT a.correo FROM seg0003 a + WHERE a.autorizacionDespacho = 'SI' + LET idx = 1 + FOREACH busca_emails INTO copiacorreo[idx] + LET copiaemail = copiaemail CLIPPED,";",copiacorreo[idx] CLIPPED + LET idx = idx + 1 + END FOREACH + IF idx=1 THEN + LET copiaemail='jsoto@marmotech.com.do' + END IF + CALL fgl_winmessage("MENSAJE","ADICION EXITOSA","STOP") + LET procedimiento = "{ call cc_avisadespacho(?,?,?,?) }" CLIPPED + # CALL envia_correo(vendedorEmail,copiaemail,cuerpo_correo, + # subject, procedimiento ) + SELECT a.cond_pago,a.total_neto INTO pcondpago,pneto + FROM vetb00050 a + WHERE a.cotizacion_no = arr_requisicion[1].cotizacion_no + + CALL evaluaclientes(arr_requisicion[1].tipo_cliente, + arr_requisicion[1].sec_cliente,pcondpago,requisicion.num_req, + arr_requisicion[1].num_oc, + requisicion.sec_vend,'RQ',xmonto) RETURNING estado + + IF estado THEN + UPDATE cctb00025 set estado = 'AUTORIZADA', + sec_vend_aprobado = requisicion.sec_vend, + fecha_autorizacion = GETDATE() + where num_req = requisicion.num_req + UPDATE cctb00026 set estado = 'AUTORIZADA', + us_mod = 'MBS', + fech_mod = GETDATE() + where num_req = requisicion.num_req + + END IF + CALL entraMensaje(requisicion.num_req, pcotizacion,"A",usuarios) + CLEAR FORM + CALL arr_requisicion.clear() + RETURN + + END IF + END IF + ON ACTION refrescar + CALL carga_lista() + + ON ACTION CANCEL + CALL arr_requisicion.clear() + CALL msg(2) + DELETE FROM cctb00027 WHERE Num_req = numerotemp + EXIT DIALOG + + END DIALOG +END FUNCTION + +FUNCTION req_insert() +DEFINE ultimo,numeroOrden INT + + # WHENEVER ERROR CONTINUE + SELECT a.num_req INTO ultimo FROM cctb00019 a + + IF ultimo IS NULL THEN + LET ultimo = 0 + END IF + LET ultimo = ultimo + 1 + LET requisicion.num_req = ultimo + + UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate() + + # GUARDA MASTER TABLE + # PREPARE s FROM "SELECT @@IDENTITY" + BEGIN WORK + # EXECUTE s INTO requisicion.num_req + + DISPLAY BY NAME requisicion.num_req + + LET subject = "AVISO REQUISICION DESPACHO NO. ",requisicion.num_req USING "&&&&&&"," VALOR: " + LET cuerpo_correo = "VENDEDOR : ",requisicion.nombre_vendedor CLIPPED + LET cuerpo_correo = " ",cuerpo_correo CLIPPED," FECHA REQUISICION : ",requisicion.fecha_requisicion USING "DD/MM/YYYY" + LET cuerpo_correo = " ",cuerpo_correo CLIPPED," NUMERO DE ORDEN: ",requisicion.busca_orden USING "&&&&&&" + LET selec = + "INSERT INTO cctb00034 (id_kit,num_req,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)", + "SELECT a.id_kit,'",requisicion.num_req USING "<<<<<<","',a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ", + "FROM prtb00030 a ", + " WHERE a.id_kit = ? AND ", + " a.num_oc =?" + + # PREPARE xcctb34 FROM selec + + LET xmonto = 0 + FOR idx = 1 TO arr_requisicion.getLength() + IF arr_requisicion[idx].num_oc is not null THEN + IF arr_requisicion[idx].procesa = "SI" THEN + + LET cuerpo_correo = " ",cuerpo_correo CLIPPED," CLIENTE: ",arr_requisicion[idx].nombre CLIPPED," ", + " CONTIENE EL PRODUCTO ", + arr_requisicion[idx].unidad_med," ", + arr_requisicion[idx].cantidad_1," ", + arr_requisicion[idx].cantidad USING "<<,<<<.##", + arr_requisicion[idx].descripcion CLIPPED + + + LET numeroOrden = arr_requisicion[idx].num_oc + + + # IF arr_requisicion[idx].valor = 0 OR arr_requisicion[idx].valor IS NULL THEN + IF arr_requisicion[idx].descvalor IS NULL THEN + LET arr_requisicion[idx].descvalor = 0 + END IF + IF arr_requisicion[idx].descuento IS NULL THEN + LET arr_requisicion[idx].descuento = 0 + END IF + + LET arr_requisicion[idx].valor = ((arr_requisicion[idx].cantidad * arr_requisicion[idx].precio)- + arr_requisicion[idx].descvalor) + + DISPLAY "data1 ",arr_requisicion[idx].cantidad," precio ",arr_requisicion[idx].precio, + " valor ",arr_requisicion[idx].valor,"descuento ",arr_requisicion[idx].descvalor + + LET arr_requisicion[idx].valor = arr_requisicion[idx].valor + + (arr_requisicion[idx].valor * (porc_itbis[idx]/100)) + + DISPLAY "data2 ",arr_requisicion[idx].cantidad," precio ",arr_requisicion[idx].precio, + " valor ",arr_requisicion[idx].valor,"descuento ",arr_requisicion[idx].descvalor + + + # END IF + LET xmonto = xmonto + arr_requisicion[idx].valor + IF arr_requisicion[idx].cantidad IS NULL THEN + ROLLBACK WORK + CALL fgl_winmessage("INFO","CANTIDAD EN BLANCO","INFO") + RETURN FALSE + END IF + INSERT INTO cctb00026 (num_req,num_oc,cotizacion_no,id,area,cod_n,cod_grupo,cod_tipo,cod_Sec, + cantidad_ord1,cantidad_ord,cantidad_1,cantidad,precio,descuento,descvalor,valor,us_crea,fech_crea,estado, + id_kit) + + VALUES (requisicion.num_req,arr_requisicion[idx].num_oc,arr_requisicion[idx].cotizacion_no, + idx,arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo, + arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_Sec, + arr_requisicion[idx].cantidad_ord1,arr_requisicion[idx].cantidad_ord,arr_requisicion[idx].cantidad_1, + arr_requisicion[idx].cantidad, + arr_requisicion[idx].precio,arr_requisicion[idx].descuento, + arr_requisicion[idx].descvalor, + arr_requisicion[idx].valor,SUSER_SNAME(),GETDATE(),requisicion.estado,arr_requisicion[idx].kit) + + IF SQLSTATE > 02 THEN + LET chmensaje = SQLERRMESSAGE CLIPPED,"NO ES POSIBLE GUARDAR LA TRANSACCION" + ROLLBACK WORK + CALL fgl_winmessage("ERROR",chmensaje,"STOP") + RETURN FALSE + EXIT FOR + END IF + + END IF + END IF + END FOR + + + + # INSERTA DESPIECE + FOR idx1 = 1 TO rdespiece.getLength() + IF rdespiece[idx1].medida> 0 THEN + INSERT INTO cctb00027 + (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec, + Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea, + fech_crea) + VALUES + (requisicion.num_req,rdespiece[idx1].etiqueta,numeroOrden,idx,arr_requisicion[idx].area, + rdespiece[idx1].cod_n, + rdespiece[idx1].cod_grupo,rdespiece[idx1].cod_tipo,rdespiece[idx1].cod_sec, + rdespiece[idx1].lado_1,rdespiece[idx1].lado_2,rdespiece[idx1].lado_3, + rdespiece[idx1].cantidad,rdespiece[idx1].medida,rdespiece[idx1].cantidad_r, + rdespiece[idx1].medida_r,usuarios,GETDATE()) + + IF STATUS < 0 THEN + + ROLLBACK WORK + CLOSE WINDOW w10 + + CALL fgl_winmessage("ERROR","OCURRIO UN ERROR ACTUALIZANDO LOS DATOS","STOP") + LET estado = FALSE + RETURN FALSE + ELSE + + LET estado = TRUE + END IF + END IF + END FOR + + INSERT INTO cctb00025 (num_req,fecha,sec_vend,us_crea,fech_crea,estado,estado_despacho,monto_req) + VALUES (requisicion.num_req,requisicion.fecha_requisicion, + requisicion.sec_vend,SUSER_SNAME(),GETDATE(),requisicion.estado,"NO DESPACHADA",xmonto) + + IF STATUS < 0 THEN + LET chmensaje = SQLERRMESSAGE CLIPPED,"NO ES POSIBLE GUARDAR LA TRANSACCION" + ROLLBACK WORK + CALL fgl_Winmessage("ERROR",chmensaje,"STOP") + RETURN FALSE + END IF + IF estado THEN + COMMIT WORK + CALL entramensaje(requisicion.num_req,pcotizacion,"A",usuarios) + RETURN TRUE + ELSE + ROLLBACK WORK + CALL fgl_winmessage("MENSAJE","NO SE INSERTARON DATOS EN REQUISICION","STOP") + RETURN FALSE + END IF + +END FUNCTION +FUNCTION controles(pnumreq,parea,pcodn,pcodgrupo,pcodtipo,pcodsec,numero,cantidad_Trx,cantidadORD) + DEFINE unidad_ctrl,cantidad_ctrl,cantidad_trx,cantidadORD DEC(12,2), + pcodn,pcodgrupo,pcodtipo,pcodsec,parea SMALLINT, + numero,pnumreq INT, + chmesage CHAR(80) + + SELECT ISNULL(SUM(a.cantidad),0) INTO cantidadord +FROM prtb00013 a +WHERE a.num_oc = numero AND + a.cod_n = pcodn AND + a.cod_grupo = pcodgrupo AND + a.cod_tipo = pcodtipo AND + a.cod_sec = pcodsec AND + a.area = parea AND + a.status_t IS NULL + +# CONTROL 01 CANTIDAD REQUISICION VS CANTIDAD ORDENADA +LET cantidad_ctrl=0 +LET unidad_ctrl=0 +SELECT ISNULL(SUM(a.cantidad),0),ISNULL(SUM(a.cantidad_1),0) INTO cantidad_ctrl,unidad_ctrl +FROM cctb00026 a +WHERE a.num_oc = numero AND + a.cod_n = pcodn AND + a.cod_grupo = pcodgrupo AND + a.cod_tipo = pcodtipo AND + a.cod_sec = pcodsec AND + a.num_req <> pnumreq AND + a.area = parea AND + a.status_t IS NULL + + IF cantidad_ctrl IS NULL THEN + LET cantidad_ctrl=0 + END IF + #LET chmesage = " TRX "+cantidad_trx using "&&&&.####"," CTRL ",cantidad_ctrl USING "&&&.####" + #LET chmesage = " ORDEN "+numero USING "&&&&&&" + #LET chmesage = " codn ",pcodn using "&&&"," codgrupo ",pcodgrupo USING "&&&"," codtipo " ,pcodtipo using "&&&"," codsec ",pcodsec USING "&&&" + # CALL FGL_WINMESSAGE("W",cantidad_ctrl,"STOP") + # DISPLAY "cantidad ctrl ",cantidad_ctrl, "cantidad_trx,",cantidad_trx, + #"cantidadORD ",cantidadord," cod ",pcodsec + IF cantidad_trx IS NULL THEN + LET cantidad_Trx = 0 + END IF + DISPLAY "control: ",cantidad_ctrl," cantidad trx: ",cantidad_trx," orden: ",cantidadOrd + IF cantidad_ctrl +cantidad_Trx > cantidadORD THEN + DISPLAY "resultado: ",cantidad_ctrl +cantidad_Trx," orden ",cantidadORD + RETURN FALSE,cantidad_ctrl,unidad_ctrl + ELSE + RETURN TRUE, cantidad_ctrl,unidad_ctrl + END IF + +END FUNCTION +FUNCTION busca_info() + + DISPLAY pfecha_req TO fecha_requisicion + DISPLAY requisicion.num_req, + requisicion.sec_vend_a,requisicion.nombre_a, + requisicion.nombre_vendedor,requisicion.sec_vend, + requisicion.estado + TO num_req,sec_vend_a,nombre_a,nombre_vendedor,sec_vend,estado + CALL arr_requisicion.clear() + DECLARE busca_req2 CURSOR FOR + SELECT a.num_oc,CAST(b.fecha_oc AS CHAR(10)),a.cotizacion_no, + a.cantidad_1,a.cantidad,a.cantidad_ord1,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec, + b.tipo_cliente,b.sec_cliente,c.nombre,a.cantidad_ord,a.precio, + a.descuento,a.descvalor,a.valor,d.descrip_esp,a.estado,a.id_kit + FROM cctb00026 a,prtb00012 b,vetb00004 c,iptb00002 d + WHERE a.num_req = requisicion.num_req and + a.num_oc = b.num_oc AND + b.tipo_cliente = c.tipo_cliente AND + b.sec_cliente = c.sec_cliente AND + a.cod_n = d.cod_n AND + a.cod_grupo = d.cod_grupo AND + a.cod_tipo = d.cod_tipo AND + a.cod_Sec = d.cod_sec + + LET idx = 1 + FOREACH busca_req2 INTO arr_requisicion[idx].num_oc,arr_requisicion[idx].fecha, + arr_requisicion[idx].cotizacion_no,arr_requisicion[idx].cantidad_1, + arr_requisicion[idx].cantidad,arr_requisicion[idx].cantidad_ord1, + arr_requisicion[idx].area, + arr_requisicion[idx].cod_n, + arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo, + arr_requisicion[idx].cod_Sec,arr_requisicion[idx].tipo_cliente, + arr_requisicion[idx].sec_cliente,arr_requisicion[idx].nombre, + arr_requisicion[idx].cantidad_ord, + arr_requisicion[idx].precio,arr_requisicion[idx].descuento, + arr_requisicion[idx].descvalor,arr_requisicion[idx].valor, + arr_requisicion[idx].descripcion,arr_requisicion[idx].procesa, + arr_requisicion[idx].kit + LET pcotizacion = arr_requisicion[idx].cotizacion_no + LET arr_requisicion[idx].cantidad_pendiente = arr_requisicion[idx].cantidad_ord - arr_requisicion[idx].cantidad + LET idx = idx + 1 + END FOREACH + CALL set_count(idx-1) + DISPLAY ARRAY arr_requisicion TO s_requisi.* + +END FUNCTION +#FUNCTION envia_correo() +# IF vendedorEmail IS NULL THEN +# LET vendedorEmail = 'jsoto@marmotech.com.do' +# END IF +# LET vendedorEmail = vendedorEmail CLIPPED,'rantonio@marmotech.com.do' + +# PREPARE smt FROM "{ call cc_avisadespacho(?,?,?) }" +# EXECUTE smt USING cuerpo_correo IN,subject IN,vendedorEmail IN + +#END FUNCTION + +FUNCTION control_despiece(parea,pcodn,pcodgrupo,pcodtipo,pcodsec,numero_ord,pcantidad,accion) + DEFINE pestado BOOLEAN, + total_medida DEC(12,5), + punidad CHAR(3),accion CHAR(1), + pdescripcion CHAR(60), + numero_ord,numero_req INT, + parea,pcodn,pcodgrupo,pcodtipo,pcodsec SMALLINT, + medidactrl,pcantidad DEC(12,5) + + CALL rdespiece.clear() + # BUSCA SI EL ARTICULO SE DESPIEZA + + SELECT UNIQUE b.unidad_med,b.descrip_esp + INTO punidad,pdescripcion + FROM iptb00027 a,iptb00002 b + WHERE a.cod_n = pcodn AND + a.cod_grupo = pcodgrupo AND + a.cod_tipo = pcodtipo AND + a.cod_Sec = pcodsec 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 + + IF STATUS = NOTFOUND THEN + LET estado=TRUE + RETURN estado + END IF + + IF accion = "A" THEN + + # SELECT a.num_temp_req INTO numero_req FROM cctb00028 a + # IF numero_req IS NULL THEN + LET numero_req = 1000 + # INSERT INTO cctb00028 (num_temp_req) VALUES (numero_req) SE COLOCO ESTAS INSTRUCCIONES EN COMENTARIO PORQUE SE CREO UNA TABLA TEMPORAL cctb00030 + # END IF +# LET numero_req = numero_req + 1 + # UPDATE cctb00028 set num_temp_req = numero_req + + + DECLARE busca_despiece CURSOR FOR + SELECT a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec, + a.lado_1,a.lado_2,a.lado_3, + SUM(a.cantidad),SUM(a.medida),SUM(b.cantidad),SUM(b.medida) + FROM prtb00022 a LEFT OUTER JOIN cctb00030 b ON + a.num_oc = b.num_oc AND + a.area = b.area 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 + a.lado_1 = b.lado_1 AND + a.lado_2 = b.lado_2 AND + a.lado_3 = b.lado_3 AND + b.us_crea = usuarios AND + a.etiqueta = b.etiqueta + WHERE + a.num_oc = numero_ord AND + a.area = parea AND + a.cod_n = pcodn AND + a.cod_grupo = pcodgrupo AND + a.cod_tipo = pcodtipo AND + a.cod_sec = pcodsec + GROUP BY a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec, + a.lado_1,a.lado_2,a.lado_3 + LET idx1 = 1 + FOREACH busca_despiece INTO rdespiece[idx1].* + LET rdespiece[idx1].cantidad_r = rdespiece[idx1].cantidad + LET rdespiece[idx1].medida_r = rdespiece[idx1].medida + LET idx1 = idx1 + 1 + END FOREACH + + ELSE + # call fgl_winmessage("w",numero_Req,"stop") + DECLARE busca_despiece1 CURSOR FOR + SELECT a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec, + a.lado_1,a.lado_2,a.lado_3, + SUM(a.cantidad),SUM(a.medida),SUM(a.cantidad),SUM(a.medida) + FROM cctb00027 a + WHERE + a.num_oc = numero_ord AND + a.area = parea AND + a.cod_n = pcodn AND + a.cod_grupo = pcodgrupo AND + a.cod_tipo = pcodtipo AND + a.cod_sec = pcodsec AND + a.num_req = numero_req + GROUP BY a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec, + a.lado_1,a.lado_2,a.lado_3 + + LET idx1 = 1 + FOREACH busca_despiece1 INTO rdespiece[idx1].* + LET idx1 = idx1 + 1 + END FOREACH + END IF + + IF idx1 = 1 THEN + LET pestado = FALSE + RETURN pestado + ELSE + LET pestado = TRUE + END IF + + OPEN WINDOW w10 AT 5,6 WITH FORM "ccfmwd004" + DISPLAY pdescripcion TO descrip_esp + DISPLAY punidad TO unidad_med + + CALL set_count(idx1-1) + INPUT ARRAY rdespiece WITHOUT DEFAULTS FROM sdespiece.* + BEFORE ROW + LET curr = arr_curr() + LET fila = scr_line() + + AFTER FIELD cantidad_r + IF rdespiece[curr].cantidad_r IS NOT NULL THEN + LET medidactrl = 0 + SELECT SUM(a.medida_r) INTO medidaCtrl + FROM cctb00027 a + WHERE a.area = parea AND + a.cod_n = rdespiece[curr].cod_n AND + a.cod_grupo =rdespiece[curr].cod_grupo AND + a.cod_tipo = rdespiece[curr].cod_tipo AND + a.cod_sec = rdespiece[curr].cod_Sec AND + a.lado_1 = rdespiece[curr].lado_1 AND + a.lado_2 = rdespiece[curr].lado_2 AND + a.num_oc = numero_ord AND a.status_t IS NULL AND + a.num_req <> numero_req + + IF medidaCtrl IS NULL THEN + LET medidactrl = 0 + END IF + + IF punidad= "M2" THEN + LET rdespiece[curr].medida_r = + rdespiece[curr].cantidad_r * (rdespiece[curr].lado_1 * rdespiece[curr].lado_2) + END IF + + IF punidad= "M3" THEN + LET rdespiece[curr].medida_r = + rdespiece[curr].cantidad_r * (rdespiece[curr].lado_1 * rdespiece[curr].lado_2 * rdespiece[curr].lado_3) + END IF + + IF punidad= "ML" THEN + LET rdespiece[curr].medida_r = + rdespiece[curr].cantidad_r * rdespiece[curr].lado_1 + LET rdespiece[curr].lado_2 = 0 + END IF + + IF punidad= "UD" OR punidad= "GL" THEN + LET rdespiece[curr].medida_r = rdespiece[curr].cantidad_r + END IF + DISPLAY rdespiece[curr].medida_r TO sdespiece[fila].medida_r + + #IF medidaCtrl + rdespiece[curr].medida_r > rdespiece[curr].medida THEN + # LET pestado = FALSE + + # EXIT INPUT LOCOLOQUE POR TIENE OTRO AFTER INPUT FECHA:14/10/11 + + + # END IF + LET total_medida_r = 0 + LET cuenta_despiece = arr_count() + LET total_medida = 0 + FOR idx1= 1 TO cuenta_despiece + IF rdespiece[idx1].medida_r > 0 THEN + LET total_medida_r = total_medida_r + rdespiece[idx1].medida_r + END IF + IF rdespiece[idx1].medida > 0 THEN + LET total_medida = total_medida + rdespiece[idx1].medida + END IF + END FOR + DISPLAY BY NAME total_medida,total_medida_r + END IF + AFTER INPUT + IF Int_flag THEN + LET pestado = FALSE + EXIT INPUT + END IF + LET total_medida_r = 0 + LET cuenta_despiece = arr_count() + FOR idx1 = 1 TO cuenta_despiece + IF rdespiece[idx1].medida_r > 0 THEN + LET total_medida_r = total_medida_r + rdespiece[idx1].medida_r + END IF + IF rdespiece[idx1].medida > 0 THEN + LET total_medida = total_medida + rdespiece[idx1].medida + END IF + END FOR + DISPLAY "T ",total_medida_r," ",pcantidad + IF total_medida_r <> pcantidad THEN + + CONTINUE INPUT + END IF + + DISPLAY BY NAME total_medida,total_medida_r + IF int_flag THEN + CLOSE WINDOW w10 + RETURN FALSE + END IF + END INPUT + IF int_flag THEN + LET int_flag = FALSE + LET pestado = FALSE + END IF +# WHENEVER ERROR CONTINUE + BEGIN WORK + + LET numerotemp = numero_req + FOR idx1 = 1 TO cuenta_despiece + IF rdespiece[idx1].cantidad_r > 0 THEN + DELETE FROM cctb00030 WHERE us_crea = usuarios and num_req = numero_req and + area = parea AND + cod_n = rdespiece[idx1].cod_n and + cod_grupo = rdespiece[idx1].cod_grupo and + cod_tipo = rdespiece[idx1].cod_tipo and + cod_Sec = rdespiece[idx1].cod_sec + LET rdespiece[idx].etiqueta=idx + INSERT INTO cctb00030 + (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec, + Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea, + fech_crea) + VALUES + (numero_req,rdespiece[idx1].etiqueta,numero_ord,idx,parea,rdespiece[idx1].cod_n, + rdespiece[idx1].cod_grupo,rdespiece[idx1].cod_tipo,rdespiece[idx1].cod_sec, + rdespiece[idx1].lado_1,rdespiece[idx1].lado_2,rdespiece[idx1].lado_3, + rdespiece[idx1].cantidad,rdespiece[idx1].medida,rdespiece[idx1].cantidad_r, + rdespiece[idx1].medida_r,usuarios,GETDATE()) + + IF STATUS < 0 THEN + ROLLBACK WORK + CALL fgl_winmessage("ERROR","OCURRIO UN ERROR ACTUALIZANDO LOS DATOS","STOP") + LET pestado = FALSE + EXIT FOR + CLOSE WINDOW w10 + ELSE + + LET pestado = TRUE + END IF + END IF + END FOR + IF pestado THEN + COMMIT WORK + ELSE + ROLLBACK WORK + END IF + + CLOSE WINDOW w10 + + RETURN pestado +END FUNCTION + +FUNCTION carga_lista() + DEFINE busca_vend SMALLINT, + bnombre_vend CHAR(50) + +INPUT BY NAME busca_vend + AFTER FIELD busca_vend + IF busca_vend IS NOT NULL THEN + + SELECT RTRIM(b.nom1_emp)||' '||b.apell1_emp + INTO bnombre_vend + FROM adtb00003 b + WHERE b.num_emp = busca_vend + + IF STATUS = NOTFOUND THEN + CALL msg(3) + NEXT FIELD busca_vend + END IF + DISPLAY BY NAME bnombre_vend + END IF + + AFTER INPUT + IF Int_flag THEN + LET int_flag = FALSE + RETURN + END IF + END INPUT + + DISPLAY ARRAY listarequisi TO s_lista.* + BEFORE DISPLAY + + CALL busca_lista(busca_vend) + + IF idx = 1 THEN + RETURN + END IF + ON ACTION refrescar + CALL busca_lista(busca_vend) + AFTER DISPLAY + EXIT DISPLAY + END DISPLAY + +END FUNCTION + +FUNCTION busca_lista(xvend) + DEFINE xvend SMALLINT + DECLARE busca_requi20 CURSOR FOR + SELECT a.estado,a.estado_despacho,x.estado_produccion,a.num_req,CAST(a.fecha AS CHAR(10)), + e.descrip_Esp||' '||e.unidad_med,CAST(b.fecha_transporte AS CHAR(10)),CAST(b.fecha_llegada AS CHAR(10)), + b.num_oc,c.nombre,SUM(b.valor) + FROM cctb00025 a,cctb00026 b,vetb00004 c,prtb00012 d,iptb00002 e,prtb00013 x + WHERE a.sec_vend = xvend AND + a.num_req = b.num_req AND + b.num_oc = d.num_oc AND + b.num_oc = x.num_oc AND + d.tipo_cliente = c.tipo_cliente AND + d.sec_cliente = c.sec_cliente AND + b.area = x.area AND + b.cod_n = e.cod_n AND b.cod_grupo = e.cod_grupo AND + b.cod_tipo = e.cod_tipo AND b.cod_Sec = e.cod_sec AND + b.cod_n = x.cod_n AND b.cod_grupo = x.cod_grupo AND + b.cod_tipo = x.cod_tipo AND b.cod_Sec = x.cod_Sec AND + d.cerrada = 'N' AND a.status_t IS NULL AND a.estado_despacho NOT IN ('DESPACHADA') + GROUP BY a.estado,a.estado_despacho,a.num_req,b.num_oc,c.nombre,a.fecha, e.descrip_Esp,e.unidad_med, + b.fecha_transporte,b.fecha_llegada,x.estado_produccion + ORDER BY a.estado DESC + LET idx = 1 + FOREACH busca_requi20 INTO listarequisi[idx].estado1, + listarequisi[idx].estado2, + listarequisi[idx].estado_produccion, + listarequisi[idx].num_req1, + listarequisi[idx].fecha1, + listarequisi[idx].material, + listarequisi[idx].fecha_transporte, + listarequisi[idx].fecha_llegada, + listarequisi[idx].num_oc1, + listarequisi[idx].cliente1, + listarequisi[idx].valor1 + LET idx = idx + 1 + END FOREACH + CALL set_count(idx-1) + +END FUNCTION + +FUNCTION factor_conv(pcodn,pcodgrupo,pcodtipo,pcodsec,pcantidad) + DEFINE pcodn,pcodgrupo,pcodtipo,pcodsec SMALLINT, + pcantidad,pfactor,presultado DEC(12,5), + pestado BOOLEAN + + LET pfactor = 0 + SELECT a.factor_conv INTO pfactor + FROM iptb00001 a + WHERE a.cod_n = pcodn AND + a.cod_grupo = pcodgrupo AND + a.cod_tipo = pcodtipo AND + a.cod_sec = pcodsec AND a.status_t IS NULL + + IF STATUS = NOTFOUND THEN + LET pestado = FALSE + ELSE + + LET presultado = pcantidad * pfactor + + LET pestado = TRUE + END IF + RETURN presultado,pestado +END FUNCTION + +FUNCTION input_data() + DEFINE remanente,unidadRemanente DEC(12,4) + CALL set_count(idx-1) + + INPUT ARRAY arr_requisicion WITHOUT DEFAULTS FROM s_requisi.* + + BEFORE ROW + LET curr = arr_curr() + LET scr_l = scr_line() + + AFTER FIELD cantidad_1 + IF arr_requisicion[curr].cantidad_1 > 0 AND arr_requisicion[curr].procesa = "SI" THEN + LET arr_requisicion[curr].valor = 0 + CALL factor_conv(arr_requisicion[curr].cod_n, + arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo, + arr_requisicion[curr].cod_sec,arr_requisicion[curr].cantidad_1) + RETURNING resultado,estado + + IF estado = FALSE THEN + CALL fgl_winmessage("ERROR","PROBLEMA EN EL FACTOR DE CONVERSION, CONTACTE ADM INVENTARIO","STOP") + NEXT FIELD cantidad + END IF + + LET arr_requisicion[curr].cantidad = resultado + DISPLAY arr_requisicion[curr].cantidad TO s_requisi[scr_l].cantidad + IF arr_requisicion[curr].cantidad_1 > arr_requisicion[curr].cantidad_ord1 THEN + CALL fgl_Winmessage("ERROR","CANTIDAD EXECEDE CANTIDAD ORDEN","STOP") + NEXT FIELD cantidad_1 + END IF + CALL controles(requisicion.num_req,arr_requisicion[curr].area,arr_requisicion[curr].cod_n, + arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo, + arr_requisicion[curr].cod_sec,arr_requisicion[curr].num_oc,arr_requisicion[curr].cantidad, + arr_requisicion[curr].cantidad_ord) + RETURNING estado,remanente,unidadRemanente + + IF NOT estado THEN + CALL fgl_winmessage("ERROR","NO PUEDE HACER MAS REQUISICION A ESTA ORDEN","STOP") + NEXT FIELD cantidad_1 + END IF + LET arr_requisicion[curr].descvalor =(arr_requisicion[curr].cantidad * + arr_requisicion[curr].precio) * + (arr_requisicion[curr].descuento/100) + LET arr_requisicion[curr].valor = (arr_requisicion[curr].cantidad * + arr_requisicion[curr].precio) - + arr_requisicion[curr].descvalor + + LET arr_requisicion[curr].valor = arr_requisicion[curr].valor + + (arr_requisicion[curr].valor * (porc_itbis[curr]/100)) + + IF arr_requisicion[curr].valor < 0 THEN + LET arr_requisicion[curr].valor =arr_requisicion[curr].cantidad * + arr_requisicion[curr].precio + END IF + DISPLAY arr_requisicion[curr].valor TO s_requisi[scr_l].valor + END IF + + ON ACTION procesa + LET rcantidad = arr_count() + CALL req_insert() RETURNING estado + IF estado = TRUE THEN + # CALL envia_correo() + DISPLAY BY NAME requisicion.num_req + CALL fgl_winmessage("MENSAJE","ADICION EXITOSA","STOP") + CLEAR FORM + CALL arr_requisicion.clear() + RETURN + END IF + END INPUT + +END FUNCTION + +FUNCTION ccprmf008() + + DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM) + CONSTRUCT criterio ON a.num_req,c.num_oc,a.fecha FROM num_req,busca_orden,fecha_requisicion + ON ACTION refrescar + CALL carga_lista() + ON ACTION busca_parametros ATTRIBUTE(TEXT="Ejecuta Busqueda",IMAGE="find_all") + + LET selec = + "SELECT DISTINCT a.num_req,CONVERT(CHAR(10),a.fecha,103),a.sec_vend_aprobado,", + "(SELECT RTRIM(k.nom1_emp)+' '+k.apell1_emp FROM adtb00003 k WHERE ", + "k.num_emp = a.sec_vend_aprobado) as nombre_aprobado,", + "a.sec_vend,ISNULL(RTRIM(b.nom1_emp),' ') +' '+ISNULL(b.apell1_emp,' '),a.estado ", + " FROM cctb00025 a,adtb00003 b,cctb00026 c ", + " WHERE ",criterio CLIPPED," AND a.num_req = c.num_req ", + " AND a.sec_vend = b.num_emp AND a.status_t is null ", + " ORDER BY a.num_req" + + PREPARE comando2 FROM selec + DECLARE busca_req SCROLL CURSOR FOR comando2 + OPEN busca_req + + + FETCH FIRST busca_req INTO requisicion.num_req,pfecha_req, + requisicion.sec_vend_a,requisicion.nombre_a, + requisicion.sec_vend,requisicion.nombre_vendedor, + requisicion.estado + + IF STATUS = NOTFOUND THEN + CALL fgl_winmessage("ERROR","NO EXISTEN ORDENES CON ESTE CRITERIO DE BUSQUEDA","STOP") + EXIT DIALOG + ELSE + CALL busca_info() + + MENU + ON ACTION mensaje + CALL entraMensaje(requisicion.num_req,pcotizacion,"M",usuarios) + + ON ACTION siguiente + FETCH NEXT busca_req INTO requisicion.num_req,requisicion.fecha_requisicion, + requisicion.sec_vend_a,requisicion.nombre_a, + requisicion.sec_vend,requisicion.nombre_vendedor, + requisicion.estado + + CALL busca_info() + ON ACTION primero + FETCH FIRST busca_req INTO requisicion.num_req,requisicion.fecha_requisicion, + requisicion.sec_vend_a,requisicion.nombre_a, + requisicion.sec_vend,requisicion.nombre_vendedor, + requisicion.estado + + CALL busca_info() + ON ACTION ultimo + FETCH LAST busca_req INTO requisicion.num_req,requisicion.fecha_requisicion, + requisicion.sec_vend_a,requisicion.nombre_a, + requisicion.sec_vend,requisicion.nombre_vendedor, + requisicion.estado + + CALL busca_info() + CALL fgl_winmessage("MENSAJE","ULTIMO REGISTRO","STOP") + ON ACTION anterior + FETCH PREVIOUS busca_req INTO requisicion.num_req,requisicion.fecha_requisicion, + requisicion.sec_vend_a,requisicion.nombre_a, + requisicion.sec_vend,requisicion.nombre_vendedor, + requisicion.estado + + CALL busca_info() + ON ACTION anular + + # CONTROL REQUISICION DESPACHADA + SELECT UNIQUE a.num_req FROM iptb00006 a + WHERE a.num_req = requisicion.num_req AND a.status_t IS null + + IF STATUS <> NOTFOUND THEN + CALL fgl_winmessage("ERR0R","REQUISICION TIENE DESPACHO NO PUEDE ANULAR","INFO") + CONTINUE DIALOG + END IF + LET respuesta= fgl_winquestion("ATENCION","ESTA SEGURO DE ANULAR ESTA REQUISICION?","no","yes|no","question",0) + IF respuesta = "yes" THEN + LET pcotizacion = NULL + LET xorden = NULL + LET xtipocliente=NULL + LET xseccliente = NULL + LET requisicion.estado=NULL + + SELECT DISTINCT a.cotizacion_no,a.num_oc,b.tipo_cliente,b.sec_cliente,c.monto_req,c.estado + INTO pcotizacion, xorden,xtipocliente,xseccliente,xmonto,requisicion.estado + FROM cctb00026 a,prtb00012 b,cctb00025 c + WHERE a.num_req = requisicion.num_req AND a.num_req = c.num_req AND a.cotizacion_no = b.cotizacion_no AND + b.status_t IS NULL AND c.status_t IS null + BEGIN WORK + UPDATE cctb00025 SET status_t = 'E', + us_mod = suser_sname(), + fech_mod = getdate(), + estado = 'ANULADA' + WHERE num_req = requisicion.num_req + UPDATE cctb00026 SET status_t = 'E', + us_mod = suser_sname(), + fech_mod = getdate() + + WHERE num_req = requisicion.num_req + UPDATE cctb00027 SET status_t = 'E', + us_mod = suser_sname(), + fech_mod = getdate() + + WHERE num_req = requisicion.num_req + + #INSERTA EN TABLA LOG + INSERT INTO cctb00031 + (fecha,us_crea,sec_vend,nombrevendedor,tipo_cliente,sec_cliente,num_oc,descrip_estado, + num_req,tipo_doc_ref,cotizacion_no ) + VALUES (getdate(),usuarios,requisicion.sec_vend,requisicion.nombre_vendedor, + xtipocliente,xseccliente,xorden, + 'ESTA REQUISICION FUE ANULADA',requisicion.num_req,'RQ',pcotizacion) + COMMIT WORK + END IF + CLEAR FORM +{ ON ACTION actualizar + + IF requisicion.sec_vend_a IS NULL THEN + CALL input_data() + FOR idx = 1 TO arr_count() + IF arr_requisicion[idx].cantidad > 0 THEN + IF arr_requisicion[idx].procesa = "SI" THEN + UPDATE cctb00026 SET cantidad = arr_requisicion[idx].cantidad, + us_mod = usuarios, + fech_mod = getdate() + WHERE cod_n = arr_requisicion[idx].cod_n AND + cod_n = arr_requisicion[idx].cod_n AND + cod_grupo = arr_requisicion[idx].cod_grupo AND + cod_tipo = arr_requisicion[idx].cod_tipo AND + cod_sec = arr_requisicion[idx].cod_sec AND + num_req = requisicion.num_req + END IF + END IF + END FOR + ELSE + CALL fgl_winmessage("ERROR","NO PUEDE ACTUALIZAR REQUISICION, YA ESTA APROBADA","STOP") + END IF + } + + + ON ACTION sale + EXIT DIALOG + END MENU + END IF + + END CONSTRUCT + + ON ACTION cancel + CALL arr_requisicion.clear() + CALL msg(2) + EXIT DIALOG + + END DIALOG +END FUNCTION + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index adec424..067674a 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -879,10 +879,12 @@ + + diff --git a/PROYECTO/otrodir/autorizacioncontado.4gl b/PROYECTO/otrodir/autorizacioncontado.4gl index 3ec80be..2d38dfe 100644 --- a/PROYECTO/otrodir/autorizacioncontado.4gl +++ b/PROYECTO/otrodir/autorizacioncontado.4gl @@ -39,7 +39,7 @@ FUNCTION autorizacioncontado(pcotizacion,valor_cotizado,pagado,usuarios,xmonto_a xfecha_oc,psecvend,usuarios) RETURNING xnum_req,valor_requisicion END IF - IF xnum_req IS NULL THEN + IF xnum_req IS NULL OR xnum_req = 0 THEN SELECT MAX(a.num_req) INTO xnum_req FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion AND a.status_t IS NULL END IF diff --git a/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005 b/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005 new file mode 100644 index 0000000..3ec80be --- /dev/null +++ b/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005 @@ -0,0 +1,90 @@ +FUNCTION autorizacioncontado(pcotizacion,valor_cotizado,pagado,usuarios,xmonto_avance,xnum_doc,xtipo_doc,xnombre_cliente) + DEFINE pcotizacion,xnum_oc,pcondpago,ptipocliente,psecliente,xnum_req,psecvend,xnum_doc INT, + xfecha_oc,xtipo_Doc CHAR(10), + usuarios,xestado VARCHAR(50), + valor_cotizado,xmonto_avance,pagado,valor_requisicion DEC(12,2), + descripcion_estado,nombre_ven,xnombre_cliente,estado VARCHAR(100) + + + SELECT a.num_oc,a.tipo_cliente,a.sec_cliente,a.cond_pago,a.sec_vend, CONVERT(CHAR(10),a.fecha_oc,103) + INTO xnum_oc,ptipocliente,psecliente,pcondpago,psecvend,xfecha_oc + FROM prtb00012 a WHERE a.cotizacion_no = pcotizacion AND a.status_t IS NULL + + IF STATUS = NOTFOUND THEN + LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<", + ' NO AUTORIZADA POR SISTEMA, LA COTIZACION NO TIENE ORDEN, CONDICION AL CONTADO' + LET xestado = 'NO AUTORIZADA' + LET estado = descripcion_estado + INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente, + sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion, + balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc, + monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc) + + VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente, + xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado, + xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc, + xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc ) + + RETURN + END IF + + SELECT RTRIM(a.nom1_emp)+ISNULL(a.apell1_Emp,'') INTO nombre_ven + FROM adtb00003 a WHERE a.num_emp = psecvend + + SELECT DISTINCT a.cotizacion_no FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion + AND a.status_t IS NULL +## CUANDO NO TIENE LA REQUISICION DE DESPACHOS + IF STATUS = NOTFOUND THEN + CALL requisiciondespacho(xnum_oc,ptipocliente,psecliente,Pcondpago,valor_cotizado, + xfecha_oc,psecvend,usuarios) + RETURNING xnum_req,valor_requisicion + END IF + IF xnum_req IS NULL THEN + SELECT MAX(a.num_req) INTO xnum_req FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion + AND a.status_t IS NULL + END IF + LET estado ="LA REQUISICION ",xnum_req USING "<<<<<<<<", " NO AUTORIZADA" + UPDATE cctb00001 SET num_req = xnum_req + WHERE tipo_doc =xtipo_Doc AND num_doc = xnum_doc AND + tipo_cliente =ptipocliente AND + sec_cliente = psecliente + + + IF xmonto_avance +pagado >= valor_cotizado THEN + LET xestado = 'AUTORIZADA' + + UPDATE cctb00025 SET estado =xestado,us_mod = 'MBS',fech_mod = getdate() + WHERE num_req = xnum_req + + + LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<", + ' AUTORIZADA POR SISTEMA, LA COTIZACION ES AL CONTADO' + LET estado = descripcion_estado + INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente, + sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion, + balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc, + monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc) + + VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente, + xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado, + xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc, + xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc ) + + ELSE + LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<", + ' NO AUTORIZADA POR SISTEMA, LA COTIZACION ES AL CONTADO' + LET xestado = 'NO AUTORIZADA' + LET estado = descripcion_estado + INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente, + sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion, + balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc, + monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc) + + VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente, + xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado, + xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc, + xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc ) + + END IF + RETURN estado +END FUNCTION \ No newline at end of file diff --git a/PROYECTO/otrodir/autorizarequisicion.4gl b/PROYECTO/otrodir/autorizarequisicion.4gl index 003128c..cc9dd56 100644 --- a/PROYECTO/otrodir/autorizarequisicion.4gl +++ b/PROYECTO/otrodir/autorizarequisicion.4gl @@ -6,13 +6,24 @@ ACTUALIZA LA REQUISICION DE DESPACHO } -FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, limite_cr,tienefactura,factura) - DEFINE balance,monto_actual_req, monto_req_autorizadas, limite_cr,valor_total DEC(12,2), +FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, limite_cr,tienefactura,factura,ztipocliente) + DEFINE balance,monto_actual_req, monto_req_autorizadas, limite_cr,valor_total,tasa, + monto_control DEC(12,2), string_estado STRING, tienefactura VARCHAR(2), autoriza BOOLEAN, - factura INT + factura,ztipocliente INT + + # BUSCA TASA + SELECT a.ultima_tasa INTO tasa FROM vetb00060 a + WHERE a.tipo_cliente = ztipocliente + IF tasa > 1 THEN + LET monto_control = 1.60 * tasa + ELSE + LET monto_control = 100 + END IF + LET valor_total = monto_req_autorizadas+monto_actual_req IF tienefactura = "SI" THEN LET string_estado = "ESTA REQUISICION NO FUE AUTORIZADA, TIENE FACTURAS VENCIDAS EL CLIENTE, UNA DE LAS FACTURAS ES ",factura USING "<<<<<<<<" @@ -23,7 +34,7 @@ FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, li #CUANDO EL CLIENTE TIENE SALDO A FAVOR IF balance < 0 THEN - IF ((balance * -1)) >=valor_total THEN + IF ((balance * -1))+monto_control >=valor_total THEN LET autoriza = TRUE LET string_estado = "ESTA REQUISICION ESTA AUTORIZADA, PORQUE EL BALANCE DE ",balance USING "##,###,###.##", diff --git a/PROYECTO/otrodir/evaluaclientes.4gl b/PROYECTO/otrodir/evaluaclientes.4gl index 8ce17e5..4dd0362 100644 --- a/PROYECTO/otrodir/evaluaclientes.4gl +++ b/PROYECTO/otrodir/evaluaclientes.4gl @@ -146,15 +146,15 @@ FUNCTION evaluaclientes FOREACH busca_vencido INTO xaplicacion,xpendiente IF xpendiente > 0 THEN - SELECT MAX( a.tipo_doc),MAX(a.fecha_ven) - INTO Xtipodoc,Xfechavence - FROM cctb00001 a - WHERE a.status_t IS NULL AND a.num_doc = a.aplica_a AND + SELECT MAX( a.tipo_doc),MAX(a.fecha_ven) + INTO Xtipodoc,Xfechavence + FROM cctb00001 a + WHERE a.status_t IS NULL AND a.num_doc = a.aplica_a AND a.num_doc=xaplicacion AND - a.tipo_doc not in ("PG","NC","PC","OC","DV","AV","AP") and - a.tipo_cliente=xtipocliente AND + a.tipo_doc not in ("PG","NC","PC","OC","DV","AV","AP") and + a.tipo_cliente=xtipocliente AND a.sec_cliente=xseccliente - + LET dias = 0 IF xfechavence IS NULL THEN CONTINUE FOREACH @@ -174,8 +174,8 @@ FUNCTION evaluaclientes EXIT FOREACH END IF END IF - END IF - # OUTPUT TO REPORT prueba(xaplicacion,xpendiente,xfechavence,dias) + END IF + # OUTPUT TO REPORT prueba(xaplicacion,xpendiente,xfechavence,dias) END FOREACH END IF @@ -188,7 +188,7 @@ FUNCTION evaluaclientes LET monto_cotizacion = 0 END IF #FUNCTION PARAMETROS AUTORIZACIONES DESPACHO - CALL autorizarequisicion(balance,xmonto,monto_cotizacion,xlimite,tienefactura,facturas) RETURNING autoriza,string_estado + CALL autorizarequisicion(balance,xmonto,monto_cotizacion,xlimite,tienefactura,facturas,xtipocliente) RETURNING autoriza,string_estado SELECT a.correo INTO emailto FROM seg0003 a,seg0000 b WHERE b.sec_vend = xsec_vend AND diff --git a/PROYECTO/otrodir/requisiciondespacho.4gl b/PROYECTO/otrodir/requisiciondespacho.4gl index 37253d9..0106c47 100644 --- a/PROYECTO/otrodir/requisiciondespacho.4gl +++ b/PROYECTO/otrodir/requisiciondespacho.4gl @@ -18,37 +18,38 @@ pusuarios CHAR(50), selec STRING, txtmensaje VARCHAR(200), - pubicacion VARCHAR(170) + pubicacion VARCHAR(170), + idx_max INT - DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD - procesa CHAR(3), - num_oc INT, - fecha CHAR(10), - cotizacion_no INT, - tipo_cliente SMALLINT, - sec_cliente INT, - nombre CHAR(30), - cantidad_1 DEC(12,5), + DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD + procesa CHAR(3), + num_oc INT, + fecha CHAR(10), + cotizacion_no INT, + tipo_cliente SMALLINT, + sec_cliente INT, + nombre CHAR(30), + cantidad_1 DEC(12,5), cantidad DEC(12,5), - area SMALLINT, - cod_n SMALLINT, - cod_grupo SMALLINT, - cod_tipo SMALLINT, - cod_sec SMALLINT, - descripcion CHAR(30), - unidad_med CHAR(3), - cantidad_ord1 DEC(12,5), - cantidad_ord DEC(12,5), - cantidad_pendiente DEC(12,5), - precio DEC(12,2), - descuento DEC(12,2), - descvalor DEC(12,2), - valor DEC(12,2) + area SMALLINT, + cod_n SMALLINT, + cod_grupo SMALLINT, + cod_tipo SMALLINT, + cod_sec SMALLINT, + descripcion CHAR(30), + unidad_med CHAR(3), + cantidad_ord1 DEC(12,5), + cantidad_ord DEC(12,5), + cantidad_pendiente DEC(12,5), + precio DEC(12,2), + descuento DEC(12,2), + descvalor DEC(12,2), + valor DEC(12,2) END RECORD, pitbis,xmonto,monto_cotizacion DEC(12,2), estado_req varchar(30), cuenta smallint - + SET CONNECTION "MSSQL" LET monto_cotizacion = xmonto @@ -61,16 +62,37 @@ # PREPARE s FROM "SELECT @@IDENTITY" - SELECT a.num_req INTO xnumreq FROM cctb00019 a - IF xnumreq IS NULL THEN - LET xnumreq = 0 - END IF - LET xnumreq = xnumreq + 1 - + # 05/10/2026 - Error -268 PK_cctb00025 duplicada: el consecutivo se leia + # fuera de la transaccion y sin bloqueo (con RCSI dos usuarios leen el mismo + # num_req). Ahora se lee DENTRO de BEGIN WORK con UPDLOCK,HOLDLOCK y se + # compara contra MAX(cctb00025) por si el contador quedo atrasado. + WHENEVER ERROR CONTINUE BEGIN WORK + PREPARE p_numreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00019 WITH (UPDLOCK, HOLDLOCK)" + EXECUTE p_numreq INTO xnumreq + IF STATUS < 0 THEN + ROLLBACK WORK + CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP") + RETURN 0,0 + END IF + PREPARE p_maxreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00025 WITH (UPDLOCK, HOLDLOCK)" + EXECUTE p_maxreq INTO idx_max + IF xnumreq IS NULL THEN + LET xnumreq = 0 + END IF + IF idx_max > xnumreq THEN + LET xnumreq = idx_max + END IF + LET xnumreq = xnumreq + 1 + UPDATE cctb00019 SET num_req = xnumreq,us_crea=pusuarios,fech_crea=getdate() # EXECUTE s INTO xnumreq - + IF STATUS < 0 THEN + ROLLBACK WORK + CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP") + RETURN 0,0 + END IF + LET selec = "INSERT INTO cctb00034 (id_kit,cotizacion_no,num_oc,num_req,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)", "SELECT a.id_kit,a.cotizacion_no,a.num_oc,'",xnumreq USING "<<<<<<","',a.secuencia,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ", @@ -82,8 +104,8 @@ BEGIN WORK IF STATUS < 0 THEN ROLLBACK WORK - CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO") - RETURN xnumreq,xmonto + CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP") + RETURN 0,0 END IF LET estado_req = 'NO AUTORIZADA' @@ -169,8 +191,8 @@ BEGIN WORK IF STATUS < 0 THEN ROLLBACK WORK - CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO") - RETURN xnumreq,xmonto + CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP") + RETURN 0,0 END IF @@ -208,8 +230,8 @@ BEGIN WORK EXECUTE comando IF STATUS < 0 THEN ROLLBACK WORK - CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO") - RETURN xnumreq,xmonto + CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP") + RETURN 0,0 END IF @@ -221,8 +243,8 @@ BEGIN WORK "NO DESPACHADA",xmonto) IF STATUS < 0 THEN ROLLBACK WORK - CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO") - RETURN xnumreq,xmonto + CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP") + RETURN 0,0 END IF COMMIT WORK @@ -246,5 +268,6 @@ BEGIN WORK # subject, procedimiento ) # CALL fgl_Winmessage("INFORMACION",chmensaje,"STOP") + WHENEVER ERROR STOP RETURN xnumreq,xmonto END FUNCTION diff --git a/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005 b/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005 new file mode 100644 index 0000000..37253d9 --- /dev/null +++ b/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005 @@ -0,0 +1,250 @@ +{ + FUNCION : requisiciondespacho() + OBJETIVO : hacer la requisicion de despacho automatica + FECHA : 27/08/2011 + DESARROLLADO POR : Ing. Juan Soto + } + SCHEMA smarmotech + FUNCTION requisiciondespacho(xnum_oc,xtipo_cliente,xsec_cliente,xcondpago,xmonto,xfecha_oc, + xsec_vend,pusuarios) + + DEFINE xnum_oc INT, + xfecha_oc DATE, + xsec_vend,xkit INT, + xnumreq,xtipo_cliente,xsec_cliente,pcotizacion INT, + idx,xcondpago smallint, + chmensaje,procedimiento,cuerpo_correo,subject STRING, + vendedorEmail,nombre_vendedor CHAR(60), + pusuarios CHAR(50), + selec STRING, + txtmensaje VARCHAR(200), + pubicacion VARCHAR(170) + + DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD + procesa CHAR(3), + num_oc INT, + fecha CHAR(10), + cotizacion_no INT, + tipo_cliente SMALLINT, + sec_cliente INT, + nombre CHAR(30), + cantidad_1 DEC(12,5), + cantidad DEC(12,5), + area SMALLINT, + cod_n SMALLINT, + cod_grupo SMALLINT, + cod_tipo SMALLINT, + cod_sec SMALLINT, + descripcion CHAR(30), + unidad_med CHAR(3), + cantidad_ord1 DEC(12,5), + cantidad_ord DEC(12,5), + cantidad_pendiente DEC(12,5), + precio DEC(12,2), + descuento DEC(12,2), + descvalor DEC(12,2), + valor DEC(12,2) + END RECORD, + pitbis,xmonto,monto_cotizacion DEC(12,2), + estado_req varchar(30), + cuenta smallint + + SET CONNECTION "MSSQL" + + LET monto_cotizacion = xmonto + + SELECT b.nom1_emp || ' '||b.apell1_emp,a.email + INTO nombre_vendedor,vendedorEmail + FROM seg0000 a,adtb00003 b + WHERE a.sec_vend = xsec_vend and + a.sec_vend = b.num_emp + +# PREPARE s FROM "SELECT @@IDENTITY" + + SELECT a.num_req INTO xnumreq FROM cctb00019 a + IF xnumreq IS NULL THEN + LET xnumreq = 0 + END IF + LET xnumreq = xnumreq + 1 + +BEGIN WORK + UPDATE cctb00019 SET num_req = xnumreq,us_crea=pusuarios,fech_crea=getdate() + # EXECUTE s INTO xnumreq + + LET selec = + "INSERT INTO cctb00034 (id_kit,cotizacion_no,num_oc,num_req,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)", + "SELECT a.id_kit,a.cotizacion_no,a.num_oc,'",xnumreq USING "<<<<<<","',a.secuencia,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ", + "FROM prtb00031 a ", + " WHERE ", + " a.num_oc ='", xnum_oc USING "<<<<<<","'" + PREPARE xcctb34 FROM selec + EXECUTE xcctb34 + + IF STATUS < 0 THEN + ROLLBACK WORK + CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO") + RETURN xnumreq,xmonto + END IF + + LET estado_req = 'NO AUTORIZADA' + DECLARE insertaReq CURSOR FOR + SELECT a.num_oc,a.cotizacion_no,b.secuencia,b.area,b.cod_n,b.cod_grupo,b.cod_tipo, + b.cod_Sec,b.cantidad_1,b.cantidad,b.cantidad_1,b.cantidad,c.precio, + c.porc_Desc,(c.precio*c.cantidad) * (c.porc_desc/100),a.tipo_cliente,a.sec_cliente, + d.nombre_cliente,d.porc_itbi,c.id_kit,a.ubicacion,d.direccion_proyecto + FROM prtb00012 a,prtb00023 b,vetb00051 c,vetb00050 d + WHERE a.num_oc = b.num_oc and + a.cotizacion_no = c.cotizacion_no and + a.cotizacion_no = d.cotizacion_no and + a.num_oc = xnum_oc and + b.cod_n = c.cod_n and + b.cod_grupo = c.cod_grupo and + b.cod_tipo = c.cod_tipo and + b.cod_sec = c.cod_sec AND + b.area = c.area + UNION + SELECT a.num_oc,a.cotizacion_no,b.secuencia,b.area,b.cod_n,b.cod_grupo,b.cod_tipo, + b.cod_Sec,b.cantidad_1,b.cantidad,b.cantidad_1,b.cantidad,c.precio, + c.porc_Desc,(c.precio*c.cantidad) * (c.porc_desc/100),a.tipo_cliente,a.sec_cliente, + d.nombre_cliente,d.porc_itbi,c.id_kit,a.ubicacion,d.direccion_proyecto + FROM prtb00012 a,prtb00023 b,vetb00031 c,vetb00050 d + WHERE a.num_oc = b.num_oc and + a.cotizacion_no = c.cotizacion_no and + a.cotizacion_no = d.cotizacion_no and + a.num_oc = xnum_oc and + b.cod_n = c.cod_n and + b.cod_grupo = c.cod_grupo and + b.cod_tipo = c.cod_tipo and + b.cod_sec = c.cod_sec AND + b.area = c.area + + + LET idx = 1 + LET pcotizacion = 0 + LET xmonto = 0 + # DISPLAY " ESTOY EN ESTO ",xnum_oc + FOREACH insertareq INTO arr_requisicion[idx].num_oc, + arr_requisicion[idx].cotizacion_no, + idx, + arr_requisicion[idx].area, + arr_requisicion[idx].cod_n, + arr_requisicion[idx].cod_grupo, + arr_requisicion[idx].cod_tipo, + arr_requisicion[idx].cod_Sec, + arr_requisicion[idx].cantidad_1, + arr_requisicion[idx].cantidad, + arr_requisicion[idx].cantidad_ord, + arr_requisicion[idx].cantidad_ord1, + arr_requisicion[idx].precio, + arr_requisicion[idx].descuento, + arr_requisicion[idx].descvalor, + arr_requisicion[idx].tipo_cliente, + arr_requisicion[idx].sec_cliente, + arr_requisicion[idx].nombre, + pitbis,xkit, + pubicacion + + #DISPLAY " VOY PARA LA 26, en el foreach cantidad ",arr_requisicion[idx].cantidad_ord + IF arr_requisicion[idx].cantidad_ord IS NOT NULL THEN + LET pcotizacion = arr_requisicion[idx].cotizacion_no + IF arr_requisicion[idx].descvalor IS NULL THEN + LET arr_requisicion[idx].descvalor=0 + END IF + LET arr_requisicion[idx].valor = (arr_requisicion[idx].cantidad *arr_requisicion[idx].precio) - + arr_requisicion[idx].descvalor + LET arr_requisicion[idx].valor = arr_requisicion[idx].valor + (arr_requisicion[idx].valor * (pitbis/100)) + LET xmonto = arr_requisicion[idx].valor + xmonto + INSERT INTO cctb00026 (num_req,num_oc,cotizacion_no,id,area,cod_n,cod_grupo,cod_tipo,cod_Sec, + cantidad_ord1,cantidad_ord,cantidad_1,cantidad,precio, + descuento,descvalor,valor,us_crea,fech_crea,estado,id_kit) + VALUES (xnumreq,arr_requisicion[idx].num_oc,arr_requisicion[idx].cotizacion_no, + idx,arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo, + arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_Sec, + arr_requisicion[idx].cantidad_ord1,arr_requisicion[idx].cantidad_ord, + arr_requisicion[idx].cantidad_1, + arr_requisicion[idx].cantidad, + arr_requisicion[idx].precio,arr_requisicion[idx].descuento, + arr_requisicion[idx].descvalor, + arr_requisicion[idx].valor,SUSER_SNAME(),GETDATE(),estado_req,xkit) + + IF STATUS < 0 THEN + ROLLBACK WORK + CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO") + RETURN xnumreq,xmonto + + END IF + + # EXECUTE xcctb34 USING xkit + # IF STATUS < 0 THEN + # ROLLBACK WORK + # RETURN xnumreq,xmonto + # END IF + + END IF + LET idx = idx +1 + END FOREACH + + # CONTROL MONTO REQUISION + { IF xmonto > monto_cotizacion THEN + # ROLLBACK WORK + + LET xnumreq = 0 + LET xmonto=0 + RETURN xnumreq,xmonto + END IF + } + IF pcotizacion IS NOT NULL THEN + SELECT DISTINCT a.cotizacion_no FROM vetb00022 a WHERE a.cotizacion_no = pcotizacion + IF STATUS <> NOTFOUND THEN + LET selec = + "INSERT INTO cctb00027 (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec, ", + "Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea,", + "fech_crea)", + " SELECT '",xnumreq,"',etiqueta,'",xnum_oc,"',secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,lado_1,lado_2,lado_3,", + "ISNULL(cantidad,0),medida,ISNULL(cantidad,0),medida,'",pusuarios CLIPPED,"',getdate() FROM vetb00022 WHERE cotizacion_no= ", + pcotizacion USING "<<<<<<<<" + + PREPARE comando FROM selec + EXECUTE comando + IF STATUS < 0 THEN + ROLLBACK WORK + CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO") + RETURN xnumreq,xmonto + + END IF + + END IF + END IF + INSERT INTO cctb00025 (num_req,fecha,sec_vend,sec_vend_aprobado,us_crea,fech_crea, + estado,fecha_autorizacion,estado_despacho,monto_req) + VALUES (xnumreq,today,xsec_vend,null,SUSER_NAME(),GETDATE(),estado_req,getdate(), + "NO DESPACHADA",xmonto) + IF STATUS < 0 THEN + ROLLBACK WORK + CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO") + RETURN xnumreq,xmonto + + END IF + COMMIT WORK + + + IF xcondpago <> 4 and xcondpago<> 10 THEN + CALL entramensaje(xnumreq,pcotizacion,"A",pusuarios) + END IF + IF xcondpago = 4 OR xcondpago = 10 THEN + INSERT INTO cctb00029 (num_req,mensaje,us_crea,fech_crea) VALUES (xnumreq,pubicacion,pusuarios,getdate()) + END IF + LET chmensaje = "NUMERO DE REQUISICION: ",xnumreq USING "<<<<<<" + LET subject = "AVISO REQUISICION DESPACHO NO. ",xnumreq USING "&&&&&&" + LET procedimiento = "{ call cc_avisadespacho(?,?,?,?) }" CLIPPED + LET cuerpo_correo = "VENDEDOR : ",nombre_vendedor CLIPPED + LET cuerpo_correo = cuerpo_correo CLIPPED," FECHA REQUISICION : ",xfecha_oc USING "DD/MM/YYYY" + LET cuerpo_correo = cuerpo_correo CLIPPED," NUMERO DE ORDEN: ",xnum_oc USING "&&&&&&" + LET cuerpo_correo = cuerpo_correo CLIPPED," CLIENTE: ",arr_requisicion[1].nombre + + # CALL envia_correo('rantonio@marmotech.com.do;jsantelises@marmotech.com.do',vendedorEmail,cuerpo_correo, + # subject, procedimiento ) + + # CALL fgl_Winmessage("INFORMACION",chmensaje,"STOP") + RETURN xnumreq,xmonto +END FUNCTION diff --git a/PROYECTO/vedir/veconvierteorden.4gl b/PROYECTO/vedir/veconvierteorden.4gl index ea4753d..3e9a5f4 100644 --- a/PROYECTO/vedir/veconvierteorden.4gl +++ b/PROYECTO/vedir/veconvierteorden.4gl @@ -55,6 +55,7 @@ FUNCTION convierteorden( pprecio, monto_cotizacion DEC(12, 2), pdesc DEC(8, 2), pkit INT, + existe_oc INT, pfecha_compromiso DATE CALL STARTLOG("veconvierte.txt") @@ -71,11 +72,8 @@ FUNCTION convierteorden( LET pcantidad = 0 LET pcantidad1 = 0 - SELECT num_oc INTO ult_numero FROM prtb00020 - IF ult_numero IS NULL THEN - LET ult_numero = 0 - END IF - LET ult_numero = ult_numero + 1 + # El consecutivo num_oc se toma DENTRO de la transaccion (ver BEGIN WORK) + LET ult_numero = 0 LET xsecvend_a = NULL SELECT a.tipo_cliente, @@ -122,8 +120,20 @@ FUNCTION convierteorden( WHENEVER ANY ERROR STOP BEGIN WORK + # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020 + # hasta el COMMIT/ROLLBACK, asi dos usuarios no pueden tomar el mismo num_oc + # (antes se leia fuera de la transaccion -> PK_prtb00012 duplicada) UPDATE prtb00020 - SET num_oc = ult_numero, us_crea = xusuario, fech_crea = GETDATE() + SET num_oc = ISNULL(num_oc, 0) + 1, us_crea = xusuario, fech_crea = GETDATE() + SELECT num_oc INTO ult_numero FROM prtb00020 + # AUTOCORRECCION: si el contador quedo por detras de prtb00012 + # (otro programa creo ordenes sin avanzarlo), salta al siguiente libre + LET existe_oc = 0 + SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero + IF existe_oc > 0 THEN + SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012 + UPDATE prtb00020 SET num_oc = ult_numero + END IF IF xsecvend_a IS NULL OR xsecvend_a = 0 THEN diff --git a/WEBSERVICES/orden_e.4gl b/WEBSERVICES/orden_e.4gl index 62376e0..7456328 100644 --- a/WEBSERVICES/orden_e.4gl +++ b/WEBSERVICES/orden_e.4gl @@ -43,7 +43,7 @@ FUNCTION orden_e(sorden) tipo_cliente INT END RECORD, s,url, selec,ret,res STRING, - ult_numero,vendedor,i,ultimo_req INT, + ult_numero,vendedor,i,ultimo_req,existe_oc INT, pprima,pitbis,valor_orden DEC(12,2), puser,pfecha_crea VARCHAR(50), cmd,r_cmd t_sync_cmd, @@ -108,8 +108,15 @@ FUNCTION orden_e(sorden) SELECT num_oc FROM marmotech.dbo.prtb00020" PREPARE ordencmd FROM selec - LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ?,us_crea='ECOMMERCE',fech_crea = getdate()" + # Incremento atomico (bloquea la fila hasta el COMMIT); ver BEGIN WORK + LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ISNULL(num_oc,0)+1,us_crea='ECOMMERCE',fech_crea = getdate()" PREPARE updateprtb20 FROM selec + LET selec = "SELECT COUNT(*) FROM marmotech.dbo.prtb00012 WHERE num_oc = ?" + PREPARE existeprtb12 FROM selec + LET selec = "SELECT MAX(num_oc) + 1 FROM marmotech.dbo.prtb00012" + PREPARE maxprtb12 FROM selec + LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ?" + PREPARE fijaprtb20 FROM selec LET selec = "SELECT cod_n,cod_grupo,cod_tipo,cod_sec FROM marmotech.dbo.iptb00002 WHERE codid = ?" PREPARE buscaprod FROM selec @@ -136,7 +143,8 @@ FUNCTION orden_e(sorden) PREPARE buscacot FROM selec - LET selec = "UPDATE marmotech.dbo.vetb00053 SET cotizacion_no = ?" + # Incremento atomico del consecutivo de cotizacion (bloquea la fila hasta el COMMIT) + LET selec = "UPDATE marmotech.dbo.vetb00053 SET cotizacion_no = ISNULL(cotizacion_no,0)+1" PREPARE actualizacot FROM selec @@ -179,22 +187,20 @@ FUNCTION orden_e(sorden) BEGIN WORK + # CONSECUTIVOS ATOMICOS: primero se incrementa (UPDATE bloquea la fila hasta + # el COMMIT) y despues se lee; antes se leia y luego se escribia -> duplicados + EXECUTE actualizacot EXECUTE buscacot INTO orden.encabezado.cotizacion_no - IF orden.encabezado.cotizacion_no IS NULL THEN - LET orden.encabezado.cotizacion_no = 0 - END IF - LET orden.encabezado.cotizacion_no = orden.encabezado.cotizacion_no + 1 - EXECUTE actualizacot USING orden.encabezado.cotizacion_no - + EXECUTE updateprtb20 EXECUTE ordencmd INTO ult_numero - - IF ult_numero IS NULL THEN - LET ult_numero = 0 - END IF - LET ult_numero = ult_numero + 1 - - EXECUTE updateprtb20 USING ult_numero + # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre + LET existe_oc = 0 + EXECUTE existeprtb12 USING ult_numero INTO existe_oc + IF existe_oc > 0 THEN + EXECUTE maxprtb12 INTO ult_numero + EXECUTE fijaprtb20 USING ult_numero + END IF LET orden.encabezado.num_oc = ult_numero LET orden.encabezado.fecha_orden = TODAY diff --git a/WEBSERVICES/tiendaonline/apiorden.4gl b/WEBSERVICES/tiendaonline/apiorden.4gl index fa1daaa..720c90f 100644 --- a/WEBSERVICES/tiendaonline/apiorden.4gl +++ b/WEBSERVICES/tiendaonline/apiorden.4gl @@ -63,14 +63,16 @@ FUNCTION ordenApi(xorden) CALL crearcliente(cliente.*) RETURNING xtipocliente,xseccliente - SELECT ISNULL(a.num_oc,0) INTO ult_numero FROM prtb00020 - - IF ult_numero = 0 THEN - INSERT INTO prtb00020 (num_oc,us_crea) VALUES (ult_numero,orden.credenciales.usuario) - + # CONSECUTIVO ATOMICO: incrementa prtb00020 (antes nunca lo avanzaba y solo + # leia +1 -> el contador quedaba atrasado y se duplicaba PK_prtb00012) + BEGIN WORK + UPDATE prtb00020 SET num_oc = ISNULL(num_oc,0) + 1, us_crea = orden.credenciales.usuario, fech_crea = GETDATE() + IF SQLCA.SQLERRD[3] = 0 THEN + INSERT INTO prtb00020 (num_oc,us_crea) VALUES (1,orden.credenciales.usuario) END IF - LET ult_numero = ult_numero + 1 - + SELECT num_oc INTO ult_numero FROM prtb00020 + COMMIT WORK + INSERT INTO prtb00012 (ventas,tipo_orden,num_oc,fecha,tipo_cliente,sec_cliente,telefono,direccion,ubicacion, cerrada,cond_pago,itbis, valor_bruto,monto_desc,sub_total,neto,us_crea,fech_crea,num_oc_r) VALUES ('1','ECOMMERCE',ult_numero,orden.encabezado.fecha_orden,xtipocliente,xseccliente, diff --git a/WEBSERVICES/veconvierteorden.4gl b/WEBSERVICES/veconvierteorden.4gl index cd57455..7eff0f2 100644 --- a/WEBSERVICES/veconvierteorden.4gl +++ b/WEBSERVICES/veconvierteorden.4gl @@ -37,6 +37,7 @@ END GLOBALS FUNCTION convierteorden(xcotizacion_no,xorden,xusuario,xclave,ximpresor,xcopia,xtipo_orden,xcomentario,xnosolicitud,archivos) DEFINE xcotizacion_no,xsecvend_a INT, + existe_oc INT, actualizar STRING, psolicitud_sql STRING, sb_sol base.StringBuffer, @@ -130,16 +131,21 @@ FUNCTION convierteorden(xcotizacion_no,xorden,xusuario,xclave,ximpresor,xcopia,x xcotizacion_no) RETURN 0,false END IF - SELECT num_oc INTO ult_numero FROM prtb00020 - IF ult_numero IS NULL THEN - LET ult_numero = 0 - END IF - LET ult_numero = ult_numero + 1 - BEGIN WORK - UPDATE prtb00020 set num_oc = ult_numero, + # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020 + # hasta el COMMIT/ROLLBACK, asi dos usuarios no pueden tomar el mismo num_oc + # (antes se leia fuera de la transaccion -> PK_prtb00012 duplicada) + UPDATE prtb00020 SET num_oc = ISNULL(num_oc, 0) + 1, us_crea = xusuario, fech_crea = GETDATE() + SELECT num_oc INTO ult_numero FROM prtb00020 + # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre + LET existe_oc = 0 + SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero + IF existe_oc > 0 THEN + SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012 + UPDATE prtb00020 SET num_oc = ult_numero + END IF DISPLAY "ACTUALICE ULTIMO NUMERO: ",ult_numero USING "<<<<<<<"," ",CURRENT LET p_prtb14.observacion = xcomentario CLIPPED From f8df43d12687537afbc4692f8eb43e967040e21e Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Wed, 7 Oct 2026 12:56:29 -0400 Subject: [PATCH 02/14] Corrige ipprrp013 (Dias de Inventario): Detallado y Resumen funcionales - Registra ipfmrp013.4fd y la libreria FUNCIONESREPORT en mbsERP.4pw - Quita CONVERT(...,103) en fecha_factura y fech_oc (error -1205) - Titulo de ventana corregido - ipprrp013.4rp: formato 7.00, diseno plano con rtl:input-variable (los grupos anidados no coincidian con el flujo del REPORT), encabezado con compania/fecha/hora y FECHA VENTA enlazada a fecha_v - Resumen usa ipprrp013r.4rp (agregado por Johnny) Verificado: Detallado sin filtros (3 paginas) y Resumen clase 124. Pendiente: alineacion visual de columnas del Detallado. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/ipprrp013.4rp | 83 ++++++++++++++++++++++++++++++++++++ PROYECTO/ipdir/ipprrp013.4gl | 6 +-- PROYECTO/ipdir/ipprrp013.4rp | 64 +++++++++++++-------------- 3 files changed, 119 insertions(+), 34 deletions(-) create mode 100644 PROYECTO/bin/ipprrp013.4rp diff --git a/PROYECTO/bin/ipprrp013.4rp b/PROYECTO/bin/ipprrp013.4rp new file mode 100644 index 0000000..3784afc --- /dev/null +++ b/PROYECTO/bin/ipprrp013.4rp @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/ipdir/ipprrp013.4gl b/PROYECTO/ipdir/ipprrp013.4gl index f193a07..9bc72e3 100644 --- a/PROYECTO/ipdir/ipprrp013.4gl +++ b/PROYECTO/ipdir/ipprrp013.4gl @@ -629,7 +629,7 @@ REPORT estadistica(x,dias2,c_dias) FORMAT FIRST PAGE HEADER LET hora = time - LET fecha = today + LET fecha = today LET total_registros = 0 LET tcantidad = 0 LET fecha_v = NULL @@ -653,14 +653,14 @@ REPORT estadistica(x,dias2,c_dias) # BUSCA ULTIMA FECHA DE COMPRA Y VENTA DEL PRODUCTO LET fecha_v = NULL - SELECT convert(char(10),MAX(a.fecha_factura),103) INTO fecha_v + SELECT MAX(a.fecha_factura) INTO fecha_v FROM vetb00003 d,vetb00002 a WHERE d.factura = a.factura AND d.cod_n=x.cod_n AND d.cod_grupo=x.cod_grupo AND d.cod_tipo = x.cod_tipo AND d.cod_sec = x.cod_sec AND a.status_t is NULL LET fecha_oc = NULL - SELECT ISNULL(convert(char(10),MAX(a.fech_oc),103)," ") INTO fecha_oc + SELECT MAX(a.fech_oc) INTO fecha_oc FROM cotb00015 d,cotb00014 a WHERE d.num_oc = a.num_oc AND d.cod_n=x.cod_n AND d.cod_grupo=x.cod_grupo AND diff --git a/PROYECTO/ipdir/ipprrp013.4rp b/PROYECTO/ipdir/ipprrp013.4rp index cf4e3e4..3784afc 100644 --- a/PROYECTO/ipdir/ipprrp013.4rp +++ b/PROYECTO/ipdir/ipprrp013.4rp @@ -1,5 +1,5 @@ - + @@ -8,22 +8,26 @@ + - - + + - + + - - + + + + @@ -43,35 +47,33 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + From b6ae121e22acbd4ffb11bb9f8c2f47f1f58871ef Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Wed, 7 Oct 2026 13:15:20 -0400 Subject: [PATCH 03/14] Corrige ipprrp053 (Informe Transacciones Inventarios) - Registra ipfmrp053.4fd y la dependencia FUNCIONESREPORT en mbsERP.4pw - selectoutput() inexistente -> selectOutputSimple() - Rescata ipprrp053.4rp del respaldo PROYECTOS/bin (ipdir/ y bin/) - Titulo de ventana corregido (mostraba "form") Verificado: rango 05/01/2026 a hoy genera 911 paginas; pantalla, PDF y Excel OK. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/ipprrp053.4rp | 100 +++++++++++++++++++++++++++++++++++ PROYECTO/ipdir/ipprrp053.4gl | 3 +- PROYECTO/ipdir/ipprrp053.4rp | 100 +++++++++++++++++++++++++++++++++++ PROYECTO/mbsERP.4pw | 3 +- 4 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 PROYECTO/bin/ipprrp053.4rp create mode 100644 PROYECTO/ipdir/ipprrp053.4rp diff --git a/PROYECTO/bin/ipprrp053.4rp b/PROYECTO/bin/ipprrp053.4rp new file mode 100644 index 0000000..815a3fd --- /dev/null +++ b/PROYECTO/bin/ipprrp053.4rp @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/ipdir/ipprrp053.4gl b/PROYECTO/ipdir/ipprrp053.4gl index d0bc967..793407e 100644 --- a/PROYECTO/ipdir/ipprrp053.4gl +++ b/PROYECTO/ipdir/ipprrp053.4gl @@ -43,6 +43,7 @@ FUNCTION ipprrp053() OPEN FORM ipfmrp053 FROM "ipfmrp053" DISPLAY FORM ipfmrp053 + CALL ui.Window.getCurrent().setText("Informe Transacciones Inventarios") INPUT BY NAME fecha1, fecha2 @@ -112,7 +113,7 @@ FUNCTION ipprrp053() LET r_filename = "ipprrp053.4rp" IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview = 1 - CALL selectoutput() RETURNING r_output + CALL selectOutputSimple() RETURNING r_output CALL fgl_report_selectDevice(r_output) CALL fgl_report_selectPreview(preview) LET handler = fgl_report_commitCurrentSettings() diff --git a/PROYECTO/ipdir/ipprrp053.4rp b/PROYECTO/ipdir/ipprrp053.4rp new file mode 100644 index 0000000..815a3fd --- /dev/null +++ b/PROYECTO/ipdir/ipprrp053.4rp @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 51afa9f..045d600 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -766,9 +766,10 @@ - + + From d76e6d7035165a5ca665d79eb575698074b96101 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Wed, 14 Oct 2026 15:47:26 -0400 Subject: [PATCH 04/14] Corrige ipprrp014 (Dias de Inventarios Gerente Marcas): Detallado funcional - Registra ipfmrp014.4fd y la dependencia FUNCIONESREPORT en mbsERP.4pw - Quita convert(char(10),...,103) de fecha_v y fecha_oc (el campo es DATE) - Titulo de ventana corregido - Rescata ipprrp014.4rp del respaldo PROYECTOS/bin; el encabezado decia IPPRRP013 (texto fijo copiado del otro diseno), corregido a IPPRRP014 Verificado: pantalla, PDF y Excel con el gerente Adolfo Santelises (prueba con usuario temporal, no incluido en este commit). Pendiente: Resumen por clase, ipprrp014r.4rp no existe en el repo ni en el respaldo. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/ipprrp014.4rp | 101 +++++++++++++++++++++++++++++++++++ PROYECTO/ipdir/ipprrp014.4gl | 5 +- PROYECTO/ipdir/ipprrp014.4rp | 101 +++++++++++++++++++++++++++++++++++ PROYECTO/mbsERP.4pw | 3 +- 4 files changed, 207 insertions(+), 3 deletions(-) create mode 100644 PROYECTO/bin/ipprrp014.4rp create mode 100644 PROYECTO/ipdir/ipprrp014.4rp diff --git a/PROYECTO/bin/ipprrp014.4rp b/PROYECTO/bin/ipprrp014.4rp new file mode 100644 index 0000000..1ef56ed --- /dev/null +++ b/PROYECTO/bin/ipprrp014.4rp @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/ipdir/ipprrp014.4gl b/PROYECTO/ipdir/ipprrp014.4gl index aaf80b2..ffc0c7c 100644 --- a/PROYECTO/ipdir/ipprrp014.4gl +++ b/PROYECTO/ipdir/ipprrp014.4gl @@ -155,6 +155,7 @@ FUNCTION ipprrp013() OPEN FORM ipfmrp014 FROM "ipfmrp014" DISPLAY FORM ipfmrp014 + CALL ui.Window.getCurrent().setText("Dias de Inventarios Gerente Marcas") DISPLAY "ipprrp014" AT 4, 3 ATTRIBUTE(RED) DISPLAY "Dias de Inventarios Gerente Marcas" AT 6, 33 ATTRIBUTE(BLACK) @@ -282,8 +283,8 @@ FUNCTION ipprrp013() LET select_bal = "SELECT a.cod_n, a.cod_grupo, a.cod_tipo, a.cod_sec, a.descrip_esp,", " a.unidad_med, '0', d.descripcion, ' ', x.cod_categoria, x.descripcion,", - " convert(char(10), uv.fecha_v, 103),", - " convert(char(10), uc.fecha_oc, 103),", + " uv.fecha_v,", + " uc.fecha_oc,", " ISNULL(uc.tcantidad, 0)", " FROM iptb00002 a", " INNER JOIN iptb00035 x1 ON a.cod_n = x1.cod_n", diff --git a/PROYECTO/ipdir/ipprrp014.4rp b/PROYECTO/ipdir/ipprrp014.4rp new file mode 100644 index 0000000..1ef56ed --- /dev/null +++ b/PROYECTO/ipdir/ipprrp014.4rp @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 045d600..719576a 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -771,9 +771,10 @@ - + + From 3903f11a927bea5de51514d11bdd8adc833722b2 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Wed, 14 Oct 2026 16:29:54 -0400 Subject: [PATCH 05/14] Corrige ipprrp046 (Relacion de Documentos) - Registra ipfmrp046.per y la dependencia FUNCIONESREPORT en mbsERP.4pw - seleccionarsalida()/configureoutput() -> selectOutputSimple() y funcion local configurarSalidaClasica(): el configureOutput de msgrp000 es un stub que devuelve NULL; el reporte clasico PRINT COLUMN necesita el modo compatibilidad (monoespaciado) como el de indir/defecto.4gl - Titulo de ventana corregido Verificado: 01/05/2026 a hoy genera 299 paginas en pantalla y PDF. Excel no probado por el volumen de datos. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/ipdir/ipprrp046.4gl | 18 ++++++++++++++++-- PROYECTO/mbsERP.4pw | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/PROYECTO/ipdir/ipprrp046.4gl b/PROYECTO/ipdir/ipprrp046.4gl index a616398..8c8e3a6 100644 --- a/PROYECTO/ipdir/ipprrp046.4gl +++ b/PROYECTO/ipdir/ipprrp046.4gl @@ -53,6 +53,7 @@ FUNCTION ipprrp046() OPEN FORM ipfmrp046 FROM "ipfmrp046" DISPLAY FORM ipfmrp046 + CALL ui.Window.getCurrent().setText("Relacion de Documentos") # CALL pantalla() DISPLAY "ipprrp046" AT 4,3 ATTRIBUTE(RED) DISPLAY " Relacion de Documentos" AT 6,22 ATTRIBUTE(BLACK) @@ -110,8 +111,8 @@ END INPUT DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>" AT 19,14 ATTRIBUTE (REVERSE) - CALL seleccionarsalida() RETURNING r_output - CALL configureoutput(r_output) RETURNING handler + CALL selectOutputSimple() RETURNING r_output + LET handler = configurarSalidaClasica(r_output) START REPORT relacion TO XML HANDLER handler @@ -241,3 +242,16 @@ END FUNCTION ON LAST ROW END REPORT + +FUNCTION configurarSalidaClasica(tipo_file) + DEFINE tipo_file CHAR(3) + IF NOT fgl_report_loadCurrentSettings(NULL) THEN + RETURN NULL + END IF + CALL fgl_report_setPageMargins("0.5cm", "0.5cm", "0.5cm", "0.5cm") + CALL fgl_report_configureCompatibilityOutput(160,"Monospaced",NULL,NULL,NULL,NULL) + CALL fgl_report_selectDevice(tipo_file) + CALL fgl_report_configurexlsxdevice(NULL, NULL, NULL, FALSE, FALSE, NULL, 1) + CALL fgl_report_selectPreview(TRUE) + RETURN fgl_report_commitCurrentSettings() +END FUNCTION diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 719576a..5aeff57 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -776,9 +776,10 @@ - + + From d805fa31640f8544fad1ece6e86bbb4b244ea6d5 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Wed, 14 Oct 2026 17:00:45 -0400 Subject: [PATCH 06/14] Corrige ipprrp047 (Operacion por Movimiento Detallado y Valorizado) - Registra ipfmrp047.4fd y la dependencia FUNCIONESREPORT en mbsERP.4pw (resuelve msgrp000 y seleccionarSalida) - busca_departamento() definida localmente (igual que ipprrp035/036) - seleccionarsalida() -> selectOutputSimple() - Rescata ipprrp047.4rp del respaldo PROYECTOS/bin (ipdir/ y bin/) - Titulo de ventana corregido Verificado en pantalla: 01/05/2026 a hoy, 113+ paginas agrupadas por movimiento y departamento con totales. PDF y Excel no probados. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/ipprrp047.4rp | 146 +++++++++++++++++++++++++++++++++++ PROYECTO/ipdir/ipprrp047.4gl | 20 ++++- PROYECTO/ipdir/ipprrp047.4rp | 146 +++++++++++++++++++++++++++++++++++ PROYECTO/mbsERP.4pw | 3 +- 4 files changed, 312 insertions(+), 3 deletions(-) create mode 100644 PROYECTO/bin/ipprrp047.4rp create mode 100644 PROYECTO/ipdir/ipprrp047.4rp diff --git a/PROYECTO/bin/ipprrp047.4rp b/PROYECTO/bin/ipprrp047.4rp new file mode 100644 index 0000000..cca4f05 --- /dev/null +++ b/PROYECTO/bin/ipprrp047.4rp @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/ipdir/ipprrp047.4gl b/PROYECTO/ipdir/ipprrp047.4gl index 218cc4f..3344b7a 100644 --- a/PROYECTO/ipdir/ipprrp047.4gl +++ b/PROYECTO/ipdir/ipprrp047.4gl @@ -78,6 +78,7 @@ FUNCTION ipprrp047() OPEN FORM ipfmrp047 FROM "ipfmrp047" DISPLAY FORM ipfmrp047 + CALL ui.Window.getCurrent().setText("Transacciones de Inventario") DISPLAY "ipprrp047" AT 4,3 DISPLAY "Operacion Por Movimiento Detallado y Valorizado" AT 6,18 @@ -200,7 +201,7 @@ END IF IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview=1 - CALL seleccionarsalida() RETURNING r_output -- load the .4rp file + CALL selectOutputSimple() RETURNING r_output -- 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 @@ -504,5 +505,20 @@ FORMAT END REPORT +FUNCTION busca_departamento() + DEFINE + pdepartamento ui.combobox, + kdepartamento SMALLINT, + kdescripcion CHAR(30) - + LET pdepartamento = ui.combobox.forname("formonly.departamento") + CALL pdepartamento.clear() + DECLARE pagar CURSOR FOR + SELECT departamento, nom_dpto + FROM adtb00001 + WHERE status_t IS NULL + ORDER BY nom_dpto + FOREACH pagar INTO kdepartamento, kdescripcion + CALL pdepartamento.additem(kdepartamento, kdescripcion) + END FOREACH +END FUNCTION diff --git a/PROYECTO/ipdir/ipprrp047.4rp b/PROYECTO/ipdir/ipprrp047.4rp new file mode 100644 index 0000000..cca4f05 --- /dev/null +++ b/PROYECTO/ipdir/ipprrp047.4rp @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 5aeff57..62efaab 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -781,9 +781,10 @@ - + + From 43f9d16e627d8690724067dd5e77d014836ccb88 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Thu, 15 Oct 2026 12:51:54 -0400 Subject: [PATCH 07/14] Corrige ipprrp048 (Transacciones de Inventario por Departamento) - Registra ipfmrp048.4fd y la dependencia FUNCIONESREPORT en mbsERP.4pw (resuelve msgrp000 y seleccionarSalida) - busca_departamento() definida localmente (igual que ipprrp035/036/047) - seleccionarsalida() -> selectOutputSimple() - Rescata ipprrp048.4rp del respaldo PROYECTOS/bin (ipdir/ y bin/) - Titulo de ventana corregido Verificado: 01/08/2026 a hoy, movimiento 30, 4 paginas en pantalla y PDF. Excel no probado. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/ipprrp048.4rp | 93 ++++++++++++++++++++++++++++++++++++ PROYECTO/ipdir/IPPRRP048.4gl | 20 +++++++- PROYECTO/ipdir/ipprrp048.4rp | 93 ++++++++++++++++++++++++++++++++++++ PROYECTO/mbsERP.4pw | 3 +- 4 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 PROYECTO/bin/ipprrp048.4rp create mode 100644 PROYECTO/ipdir/ipprrp048.4rp diff --git a/PROYECTO/bin/ipprrp048.4rp b/PROYECTO/bin/ipprrp048.4rp new file mode 100644 index 0000000..09a0137 --- /dev/null +++ b/PROYECTO/bin/ipprrp048.4rp @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/ipdir/IPPRRP048.4gl b/PROYECTO/ipdir/IPPRRP048.4gl index 3defc37..c337d1e 100644 --- a/PROYECTO/ipdir/IPPRRP048.4gl +++ b/PROYECTO/ipdir/IPPRRP048.4gl @@ -75,6 +75,7 @@ FUNCTION ipprrp048() OPEN FORM ipfmrp048 FROM "ipfmrp048" DISPLAY FORM ipfmrp048 + CALL ui.Window.getCurrent().setText("Transacciones de Inventario por Departamento") DISPLAY "ipprrp048" AT 4,3 DISPLAY "Operacion Por Movimiento Detallado y Valorizado" AT 6,18 @@ -167,7 +168,7 @@ END INPUT IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview=1 - CALL seleccionarsalida() RETURNING r_output -- load the .4rp file + CALL selectOutputSimple() RETURNING r_output -- 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 @@ -296,5 +297,20 @@ FORMAT PRINTX t_t_consumo,t_t_mtsAdicionales END REPORT +FUNCTION busca_departamento() + DEFINE + pdepartamento ui.combobox, + kdepartamento SMALLINT, + kdescripcion CHAR(30) - + LET pdepartamento = ui.combobox.forname("formonly.departamento") + CALL pdepartamento.clear() + DECLARE pagar CURSOR FOR + SELECT departamento, nom_dpto + FROM adtb00001 + WHERE status_t IS NULL + ORDER BY nom_dpto + FOREACH pagar INTO kdepartamento, kdescripcion + CALL pdepartamento.additem(kdepartamento, kdescripcion) + END FOREACH +END FUNCTION diff --git a/PROYECTO/ipdir/ipprrp048.4rp b/PROYECTO/ipdir/ipprrp048.4rp new file mode 100644 index 0000000..09a0137 --- /dev/null +++ b/PROYECTO/ipdir/ipprrp048.4rp @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 62efaab..5efbe4e 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -786,9 +786,10 @@ - + + From 47942191eee1b0a6dc6de741a55ad70036a461b3 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Thu, 15 Oct 2026 13:04:06 -0400 Subject: [PATCH 08/14] Corrige ipprrp051 (Transacciones de Inventario con ubicacion) - Registra ipfmrp051.4fd y la dependencia FUNCIONESREPORT en mbsERP.4pw (resuelve msgrp000 y seleccionarSalida) - busca_departamento() definida localmente (igual que ipprrp047/048) - seleccionarsalida() -> selectOutputSimple() - Rescata ipprrp051.4rp del respaldo PROYECTOS/bin (ipdir/ y bin/) - Titulo de ventana corregido Verificado: 01/08/2026 a hoy, movimiento 30, 8 paginas en pantalla y PDF. Excel no probado. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/ipprrp051.4rp | 118 +++++++++++++++++++++++++++++++++++ PROYECTO/ipdir/ipprrp051.4gl | 22 ++++++- PROYECTO/ipdir/ipprrp051.4rp | 118 +++++++++++++++++++++++++++++++++++ PROYECTO/mbsERP.4pw | 3 +- 4 files changed, 258 insertions(+), 3 deletions(-) create mode 100644 PROYECTO/bin/ipprrp051.4rp create mode 100644 PROYECTO/ipdir/ipprrp051.4rp diff --git a/PROYECTO/bin/ipprrp051.4rp b/PROYECTO/bin/ipprrp051.4rp new file mode 100644 index 0000000..f2da80f --- /dev/null +++ b/PROYECTO/bin/ipprrp051.4rp @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/ipdir/ipprrp051.4gl b/PROYECTO/ipdir/ipprrp051.4gl index e010a38..0996f0a 100644 --- a/PROYECTO/ipdir/ipprrp051.4gl +++ b/PROYECTO/ipdir/ipprrp051.4gl @@ -87,6 +87,7 @@ FUNCTION ipprrp051() OPEN FORM ipfmrp051 FROM "ipfmrp051" DISPLAY FORM ipfmrp051 + CALL ui.Window.getCurrent().setText("Transacciones de Inventario") DISPLAY "ipprrp051" AT 4, 3 DISPLAY "Operacion Por Movimiento Detallado y Valorizado" AT 6, 18 @@ -186,8 +187,7 @@ FUNCTION ipprrp051() IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview = 1 - CALL seleccionarsalida() - RETURNING r_output -- load the .4rp file + CALL selectOutputSimple() RETURNING r_output -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default CALL fgl_report_selectPreview(preview) -- changing default LET handler = @@ -381,3 +381,21 @@ REPORT opera(x, y) LET t_t_mtsAdicionales = SUM(x.mtsAdicionales) PRINTX t_t_consumo, t_t_mtsAdicionales END REPORT + +FUNCTION busca_departamento() + DEFINE + pdepartamento ui.combobox, + kdepartamento SMALLINT, + kdescripcion CHAR(30) + + LET pdepartamento = ui.combobox.forname("formonly.departamento") + CALL pdepartamento.clear() + DECLARE pagar CURSOR FOR + SELECT departamento, nom_dpto + FROM adtb00001 + WHERE status_t IS NULL + ORDER BY nom_dpto + FOREACH pagar INTO kdepartamento, kdescripcion + CALL pdepartamento.additem(kdepartamento, kdescripcion) + END FOREACH +END FUNCTION diff --git a/PROYECTO/ipdir/ipprrp051.4rp b/PROYECTO/ipdir/ipprrp051.4rp new file mode 100644 index 0000000..f2da80f --- /dev/null +++ b/PROYECTO/ipdir/ipprrp051.4rp @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 5efbe4e..71bad44 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -791,9 +791,10 @@ - + + From fc2fa7acac7b4f135bce7c2a494862b8d1b3355c Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Thu, 15 Oct 2026 13:16:11 -0400 Subject: [PATCH 09/14] Corrige ipprrp054 (Revision de Conduces con y sin Archivo) - Registra ipfmrp054.4fd y la dependencia FUNCIONESREPORT en mbsERP.4pw - seleccionarsalida() -> selectOutputSimple() - Rescata ipprrp054.4rp del respaldo PROYECTOS/bin (ipdir/ y bin/) - El reporte arrancaba aunque la consulta no devolviera filas y el motor fallaba (Failed to find value for the look ahead input-variables); ahora START REPORT se ejecuta con la primera fila y, si no hay datos, muestra "NO EXISTEN REGISTROS" - Titulo de ventana corregido Verificado: 05/01/2026 a 10/15/2026 genera 100 paginas en pantalla y PDF. Nota: las fechas de este formulario se capturan en formato mm/dd/yyyy (campo Edit sin selector), comportamiento original del programa. Excel no probado. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/ipprrp054.4rp | 65 ++++++++++++++++++++++++++++++++++++ PROYECTO/ipdir/ipprrp054.4gl | 48 +++++++++++++++----------- PROYECTO/ipdir/ipprrp054.4rp | 65 ++++++++++++++++++++++++++++++++++++ PROYECTO/mbsERP.4pw | 3 +- 4 files changed, 160 insertions(+), 21 deletions(-) create mode 100644 PROYECTO/bin/ipprrp054.4rp create mode 100644 PROYECTO/ipdir/ipprrp054.4rp diff --git a/PROYECTO/bin/ipprrp054.4rp b/PROYECTO/bin/ipprrp054.4rp new file mode 100644 index 0000000..ef90162 --- /dev/null +++ b/PROYECTO/bin/ipprrp054.4rp @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/ipdir/ipprrp054.4gl b/PROYECTO/ipdir/ipprrp054.4gl index 815c8ce..c29bc7e 100644 --- a/PROYECTO/ipdir/ipprrp054.4gl +++ b/PROYECTO/ipdir/ipprrp054.4gl @@ -34,6 +34,7 @@ FUNCTION ipprrp054() OPEN FORM ipfmrp054 FROM "ipfmrp054" DISPLAY FORM ipfmrp054 + CALL ui.Window.getCurrent().setText("Conduces con y sin Archivo") INPUT BY NAME fecha1,fecha2 BEFORE INPUT AFTER INPUT @@ -50,27 +51,34 @@ FUNCTION ipprrp054() LET r_filename = "ipprrp054.4rp" - CALL seleccionarsalida() RETURNING r_output - iF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file - - - LET preview=1 - 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 - START REPORT prt_co TO XML HANDLER HANDLER - PREPARE comando FROM selec - DECLARE busca CURSOR FOR comando - OPEN busca USING fecha1,fecha2 + PREPARE comando FROM selec + DECLARE busca CURSOR FOR comando + OPEN busca USING fecha1,fecha2 + LET idx = 0 + + FOREACH busca INTO co.* + IF idx = 0 THEN + CALL selectOutputSimple() RETURNING r_output + IF fgl_report_loadCurrentSettings(r_filename) THEN + LET preview = 1 + CALL fgl_report_selectDevice(r_output) + CALL fgl_report_selectPreview(preview) + LET handler = fgl_report_commitCurrentSettings() + ELSE + EXIT PROGRAM + END IF + START REPORT prt_co TO XML HANDLER HANDLER + LET idx = 1 + END IF + OUTPUT TO REPORT prt_co(co.*) + END FOREACH + + IF idx = 1 THEN + FINISH REPORT prt_co + ELSE + CALL fgl_winmessage("INFO", "NO EXISTEN REGISTROS", "INFO") + END IF - FOREACH busca INTO co.* - OUTPUT TO REPORT prt_co(co.*) - END FOREACH - FINISH REPORT prt_co END INPUT END FUNCTION diff --git a/PROYECTO/ipdir/ipprrp054.4rp b/PROYECTO/ipdir/ipprrp054.4rp new file mode 100644 index 0000000..ef90162 --- /dev/null +++ b/PROYECTO/ipdir/ipprrp054.4rp @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 71bad44..0994025 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -796,9 +796,10 @@ - + + From 7d5a853351e5cb63ad466b11850804916c920b50 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Thu, 15 Oct 2026 15:49:06 -0400 Subject: [PATCH 10/14] Corrige ctprrp004 (Reporte Produccion Diaria) - Titulo de ventana corregido (mostraba "screen") - START REPORT se ejecuta con la primera fila; si la consulta no devuelve datos avisa "NO EXISTEN REGISTROS PARA ESTOS PARAMETROS" en vez de generar un reporte en blanco Verificado con 01/01/2024 a 12/31/2024: detallado 166 paginas en pantalla, resumen 57 paginas en PDF. En la BD de pruebas (.40.250) cttb00003 no tiene produccion posterior a agosto de 2025, por eso rangos de 2026 salen vacios. Excel no probado. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/ctdir/ctprrp004.4gl | 43 ++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/PROYECTO/ctdir/ctprrp004.4gl b/PROYECTO/ctdir/ctprrp004.4gl index d0a0539..f21fdce 100644 --- a/PROYECTO/ctdir/ctprrp004.4gl +++ b/PROYECTO/ctdir/ctprrp004.4gl @@ -20,6 +20,7 @@ DEFINE HANDLER om.SaxDocumentHandler, -- return value from fgl_report_commitCurr DEFINE selec5 STRING DEFINE anos CHAR(4) DEFINE jdx INTEGER +DEFINE hay_filas SMALLINT DEFINE fecha_inicio, fecha_corte, fecha1 DATE, reporte_tipo INT MAIN @@ -52,6 +53,7 @@ FUNCTION ctprrp004() OPEN FORM ctfmrp004 FROM "ctfmrp004" DISPLAY FORM ctfmrp004 + CALL ui.Window.getCurrent().setText("Reporte Produccion Diaria") CONSTRUCT criterio ON c.departamento, c.cod_prod FROM departamento, cod_prod @@ -166,35 +168,42 @@ FUNCTION ctprrp004() LET r_filename = 'ctprrp004.4rp' - IF fgl_report_loadCurrentSettings(r_filename) THEN - LET preview=1 - CALL selectoutput() RETURNING r_output - CALL fgl_report_selectDevice(r_output) -- changing default - CALL fgl_report_selectPreview(preview) -- changing default - LET handler = fgl_report_commitCurrentSettings() -- commit changes - END IF - - START REPORT reporte_detallado TO XML HANDLER HANDLER - LET fecha_actual = CURRENT YEAR TO FRACTION DISPLAY selec5 - + PREPARE comando4 FROM selec5 DECLARE busca4 CURSOR FOR comando4 - + LET hay_filas = FALSE + FOREACH busca4 INTO prod_dia.* - IF reporte_tipo <> 1 THEN + IF NOT hay_filas THEN + IF fgl_report_loadCurrentSettings(r_filename) THEN + LET preview=1 + CALL selectoutput() RETURNING r_output + CALL fgl_report_selectDevice(r_output) + CALL fgl_report_selectPreview(preview) + LET handler = fgl_report_commitCurrentSettings() + END IF + START REPORT reporte_detallado TO XML HANDLER HANDLER + LET hay_filas = TRUE + END IF + + IF reporte_tipo <> 1 THEN LET prod_dia.num_doc = 0 - LET prod_dia.fecha = CURRENT - END IF - + LET prod_dia.fecha = CURRENT + END IF + OUTPUT TO REPORT reporte_detallado( prod_dia.*, fecha_inicio, fecha_corte, fecha_actual) END FOREACH - FINISH REPORT reporte_detallado + IF hay_filas THEN + FINISH REPORT reporte_detallado + ELSE + CALL fgl_winmessage("INFO", "NO EXISTEN REGISTROS PARA ESTOS PARAMETROS", "INFO") + END IF IF abortar_reporte THEN RETURN From ea88c93da327b2a4329a617aa6e83f37bde5e9e7 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Thu, 15 Oct 2026 16:07:11 -0400 Subject: [PATCH 11/14] Corrige ctprrp014 (Reporte Produccion Mensual) - Titulo de ventana corregido - START REPORT se ejecuta con la primera fila; si la consulta no devuelve datos avisa "NO EXISTEN REGISTROS PARA ESTOS PARAMETROS" en vez de generar un reporte en blanco Verificado con ano 2024 (la BD de pruebas no tiene produccion posterior a agosto de 2025): 1 pagina con 9 semielaborados por mes y total, en pantalla, PDF y Excel. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/ctdir/ctprrp014.4gl | 44 ++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/PROYECTO/ctdir/ctprrp014.4gl b/PROYECTO/ctdir/ctprrp014.4gl index 4ff80f7..6dae2c3 100644 --- a/PROYECTO/ctdir/ctprrp014.4gl +++ b/PROYECTO/ctdir/ctprrp014.4gl @@ -20,6 +20,8 @@ DEFINE HANDLER om.SaxDocumentHandler, -- return value from fgl_report_commitCurr DEFINE selec5 STRING DEFINE anos STRING +DEFINE hay_filas SMALLINT + MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios @@ -55,6 +57,7 @@ FUNCTION ctprrp004() OPEN FORM ctfmrp004 FROM "ctfmrp014" DISPLAY FORM ctfmrp004 + CALL ui.Window.getCurrent().setText("Reporte Produccion Mensual") CONSTRUCT criterio ON c.cod_prod FROM cod_prod @@ -128,33 +131,40 @@ FUNCTION ctprrp004() LET r_filename = 'ctprrp014.4rp' - IF fgl_report_loadCurrentSettings(r_filename) THEN - LET preview=1 - CALL selectoutput() RETURNING r_output - CALL fgl_report_selectDevice(r_output) -- changing default - CALL fgl_report_selectPreview(preview) -- changing default - LET handler = fgl_report_commitCurrentSettings() -- commit changes - END IF - - START REPORT reporte_mensual TO XML HANDLER HANDLER - LET fecha_actual = CURRENT YEAR TO FRACTION DISPLAY selec5 - + PREPARE comando4 FROM selec5 DECLARE busca4 CURSOR FOR comando4 - + LET hay_filas = FALSE + FOREACH busca4 INTO prod_dia.* - - IF prod_dia.semielaborado IS NULL THEN + + IF NOT hay_filas THEN + IF fgl_report_loadCurrentSettings(r_filename) THEN + LET preview=1 + CALL selectoutput() RETURNING r_output + CALL fgl_report_selectDevice(r_output) + CALL fgl_report_selectPreview(preview) + LET handler = fgl_report_commitCurrentSettings() + END IF + START REPORT reporte_mensual TO XML HANDLER HANDLER + LET hay_filas = TRUE + END IF + + IF prod_dia.semielaborado IS NULL THEN LET abortar_reporte = TRUE; - END IF - + END IF + OUTPUT TO REPORT reporte_mensual(prod_dia.*, anos, fecha_actual); END FOREACH - FINISH REPORT reporte_mensual + IF hay_filas THEN + FINISH REPORT reporte_mensual + ELSE + CALL fgl_winmessage("INFO", "NO EXISTEN REGISTROS PARA ESTOS PARAMETROS", "INFO") + END IF IF abortar_reporte THEN RETURN From 5dcc4adf2c5f6c47d3f838055032da5b1d9b5f3c Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 16 Oct 2026 10:15:59 -0400 Subject: [PATCH 12/14] Corrige compilacion de lqprrp004 y prprmt011 (modulos LIQUIDACION y PRODUCCION) lqprrp004: - El .4gl tenia saltos de linea CR (Mac antiguo): en Genero 6 el comentario '######' de la linea 2 se tragaba todo el programa (modulo de 181 bytes, "main not defined"). Convertido a CRLF (el diff grande es solo eso). - numero_ent se usaba en REPORT entrada271 sin definirse (solo existia en edprrp0271); definida y asignada = 27 como en la funcion hermana. - Agrega dependencia FUNCIONESREPORT. prprmt011 / prprmt021: - primpresion.impresion(pnumoc) chocaba con impresion(...) de 5 parametros de FUNCIONESREPORT (veprrp049_1.4gl). Renombrada a impresion_oc y su unico llamador (prprmt021) actualizado. prprmt011 recibe FUNCIONESREPORT. Verificado con gsmake: lqprrp004, lqprmt002, ipprmt005, prprmt011 y prprmt021 compilan y enlazan. lqprrp004 consulta datos de 03/2024 pero el reporte no se genera: bin/lqprrp004.4rp es un archivo binario (no XML) y no existe version XML en el repo. Pendiente que Johnny lo entregue. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/PRDIR/primpresion.4gl | 2 +- PROYECTO/PRDIR/prprmt021.4gl | 2 +- PROYECTO/lqdir/lqprrp004.4gl | 823 ++++++++++++++++++++++++++++++++- PROYECTO/mbsERP.4pw | 4 +- 4 files changed, 825 insertions(+), 6 deletions(-) diff --git a/PROYECTO/PRDIR/primpresion.4gl b/PROYECTO/PRDIR/primpresion.4gl index 9ad2f1c..2873a33 100644 --- a/PROYECTO/PRDIR/primpresion.4gl +++ b/PROYECTO/PRDIR/primpresion.4gl @@ -11,7 +11,7 @@ END RECORD, nombre_cia STRING -FUNCTION impresion(pnumoc) +FUNCTION impresion_oc(pnumoc) DEFINE pnumoc,I INT DECLARE busca_orden CURSOR FOR diff --git a/PROYECTO/PRDIR/prprmt021.4gl b/PROYECTO/PRDIR/prprmt021.4gl index e5a8451..ea54e9d 100644 --- a/PROYECTO/PRDIR/prprmt021.4gl +++ b/PROYECTO/PRDIR/prprmt021.4gl @@ -177,7 +177,7 @@ END RECORD " ORDEN ECOMMERCE ",orden_externa USING "&&&&&&&" INPUT ARRAY detalle FROM sdetalle.* ATTRIBUTE(WITHOUT DEFAULTS) ON ACTION impresion ATTRIBUTE(TEXT="Orden",IMAGE="printer") - CALL impresion(pnum_oc) + CALL impresion_oc(pnum_oc) ON ACTION etiqueta ATTRIBUTE(TEXT="Label",IMAGE="fa-tag") LET datos.celular = orden.celular LET datos.cliente = orden.nombre_envio diff --git a/PROYECTO/lqdir/lqprrp004.4gl b/PROYECTO/lqdir/lqprrp004.4gl index a58d13b..3f997eb 100644 --- a/PROYECTO/lqdir/lqprrp004.4gl +++ b/PROYECTO/lqdir/lqprrp004.4gl @@ -1,2 +1,821 @@ -{============================================================================== PROGRAMA : LQPRRP004 SISTEMA : Sistema de Liquidacion Materiales Objetivo : Liquidacion Mercancia Compras Exterior Prod. Terminados PROGRAMADOR : Juan F. Soto FECHA : Mayo 13, 1994 MODIFICADO : VALENTIN RODRIGUEZ FECHA : MAYO, 2019 ==============================================================================} -GLOBALS "lqprgb000.4gl" ###### Variables para busqueda de rango de fecha DEFINE elije,imp,afecta,tipo_inventario CHAR(1) DEFINE p_ano,m_mes SMALLINT DEFINE fecha1, fecha2 DATE , p_fecha CHAR(10) DEFINE entra CHAR(25) DEFINE t_costst DECIMAL(12,2) DEFINE detalla CHAR(30) DEFINE orden CHAR(10) DEFINE t_variacion DECIMAL(12,2) DEFINE debe, haber DECIMAL(12,2), idz INT ###### Variables que la almacenan la informacion enviada al reporte DEFINE diario1 RECORD cuenta_no LIKE cgtb00001.cuenta_no, debito DECIMAL(18,2) END RECORD DEFINE i SMALLINT DEFINE fecha_inicial,fecha_final DATE DEFINE primera,imp_entrada CHAR(1) MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL ARG_VAL(3) RETURNING impresor CONNECT to "smarmotech" USER usuarios USING clave SELECT a.* INTO p_compania.* FROM companias a CALL lqprrp004() END MAIN FUNCTION lqprrp004() DEFINE busca_datos RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion CHAR(30), unidad CHAR(3), cod_sp SMALLINT, cod_sp_sec SMALLINT, proveedor CHAR(7), num_doc INTEGER, num_oc INTEGER, tipo CHAR(2), cantidad DECIMAL(12,5), precio DECIMAL(12,5), flete DECIMAL(12,5), imp_colect DECIMAL(12,5), imp_aduana DECIMAL(12,5), tasa DECIMAL(8,2), cost_std LIKE intb00013.costo_st END RECORD LET int_flag = FALSE OPTIONS FORM LINE 8 OPEN FORM lqfmrp004 FROM "lqfmrp004" DISPLAY FORM lqfmrp004 DISPLAY "lqprrp004" AT 4,3 DISPLAY "Liquidacion Mercancia pt" AT 6,28 LET tipo_papel = 2 CALL msgrp000(tipo_papel) CONSTRUCT criterio ON c.num_oc,c.cod_n,c.cod_grupo,c.cod_tipo,c.cod_sec FROM num_oc,cod_n,cod_grupo,cod_tipo,cod_sec AFTER CONSTRUCT IF INT_FLAG THEN CALL msg(2) LET INT_FLAG = FALSE EXIT PROGRAM END IF EXIT CONSTRUCT END CONSTRUCT INPUT BY NAME tipo_inventario, p_ano,m_mes,elije,imp_entrada,imp AFTER FIELD m_mes SELECT fecha_inicio, fecha_corte INTO fecha_inicial,fecha_final FROM prdtable where mes = m_mes AND ano = p_ano DISPLAY BY NAME fecha_inicial,fecha_final LET p_fechas = fecha_final using "ddmmyyyy" CALL prd(p_fechas,usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 # NEXT FIELD p_ano END IF AFTER INPUT EXIT INPUT END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF LET chstd = FGL_WINQUESTION("PREGUNTA","Actualiza Costos STD?","yes","Yes|no","question",0) LET chstd = UPSHIFT(chstd) LET primera = "S" IF tipo_inventario = '2' THEN LET selec = "SELECT DISTINCT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp, ", " a.unidad_med,b.cod_sp,b.cod_sp_sec,b.nom_sp,c.rep_entrada,c.num_oc, ", " c.tipo,c.cantidad_oc,c.cantidad_oc*c.fob,c.costo_flete,c.impuesto,c.otros_g,d.prima_us ", "FROM iptb00002 a,cotb00001 b,cgtb00018 c,cgtb00017 d ", "WHERE (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) AND ", " (d.fecha between '", fecha_inicial USING "MM/DD/YYYY","' and '", fecha_final USING "MM/DD/YYYY","') and ", " (c.num_oc = d.num_oc) and (c.tipo=d.tipo) and (d.cod_sp=b.cod_sp AND ", " d.cod_sp_sec = b.cod_sp_sec) and (c.rep_entrada = d.rep_entrada) and ", " (c.status_t is null) and d.liquidada='",elije,"' and c.tipo = '2' ", " AND (a.status_t IS NULL) AND (d.status_t IS NULL) and ", criterio CLIPPED, " ORDER BY c.num_oc,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec " ELSE LET selec = "SELECT DISTINCT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp, ", " a.unidad_med,b.cod_sp,b.cod_sp_sec,b.nom_sp,c.rep_entrada,c.num_oc, ", " c.tipo,c.cantidad_oc,c.cantidad_oc*c.fob,c.costo_flete,c.impuesto,c.otros_g,d.prima_us ", "FROM intb00001 a,cotb00001 b,cgtb00018 c,cgtb00017 d ", "WHERE (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) AND ", " (d.fecha between '", fecha_inicial USING "MM/dd/YYYY","' and '", fecha_final USING "MM/dd/YYYY","') and ", " (c.num_oc = d.num_oc) and (c.tipo=d.tipo) and (d.cod_sp=b.cod_sp AND ", " d.cod_sp_sec = b.cod_sp_sec) and (c.rep_entrada = d.rep_entrada) and ", " (c.status_t is null) and d.liquidada='",elije,"' and c.tipo = 1 ", " AND (a.status_t IS NULL) AND (d.status_t IS NULL) and ", criterio CLIPPED, " ORDER BY c.num_oc,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec " END IF DISPLAY selec DISPLAY "elije ",elije LET idx = 1 PREPARE comando FROM selec DECLARE busca CURSOR FOR comando INSERT INTO cttb000log1 VALUES (GETDATE(),usuarios,'lqprrp004','ELIMINO') FOREACH busca INTO busca_datos.* DISPLAY "datos ",busca_datos.cod_sp_sec," ",busca_datos.descripcion LET orden = busca_datos.num_oc USING "<<<<<<" IF busca_datos.imp_colect is null THEN LET busca_datos.imp_colect = 0 END IF IF busca_datos.imp_colect < 0 THEN LET busca_datos.imp_colect = busca_datos.imp_colect * -1 END IF IF busca_datos.imp_aduana is null THEN LET busca_datos.imp_aduana = 0 END IF IF busca_datos.imp_aduana < 0 THEN LET busca_datos.imp_aduana = busca_datos.imp_aduana * -1 END IF # Busca el costos standard LET busca_datos.cost_std = 0 IF tipo_inventario = '2' THEN SELECT AVG(a.material+a.labor+a.gastos) INTO busca_datos.cost_std FROM iptb00004 a WHERE a.ventas = "1" and a.ano = year(fecha_inicial) and a.cod_n = busca_datos.cod_n and a.cod_grupo = busca_datos.cod_grupo and a.cod_tipo = busca_datos.cod_tipo and a.cod_sec = busca_datos.cod_sec and a.status_t is NULL ELSE SELECT AVG(a.costo_st) INTO busca_datos.cost_std FROM intb00013 a WHERE a.ano = year(fecha_inicial) and a.cod_n = busca_datos.cod_n and a.cod_grupo = busca_datos.cod_grupo and a.cod_tipo = busca_datos.cod_tipo and a.cod_sec = busca_datos.cod_sec and a.status_t is NULL END IF IF STATUS = NOTFOUND THEN LET busca_datos.cost_std = 0 END IF IF busca_datos.cost_std is null THEN LET busca_datos.cost_std = 0 END IF IF chstd = "yes" THEN DELETE FROM cttb00013 WHERE (fecha_lq = fecha_final AND tipo_lq = elije AND tipo_orden = 2 AND num_oc = busca_datos.num_oc) END IF IF imp="S" THEN LET r_filename ="lqprrp004.4rp" IF idx = 1 THEN IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview=1 CALL seleccionarsalida() RETURNING r_output -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default CALL fgl_report_selectPreview(preview) -- changing default # CALL fgl_report_configurexlsxdevice(null,null,null,false,false,null,1) LET handler = fgl_report_commitCurrentSettings() -- commit changes END IF LET idx = 2 START REPORT liquida1 TO XML HANDLER HANDLER END IF DISPLAY "DATOS " OUTPUT TO REPORT liquida1(busca_datos.*) END IF END FOREACH IF imp = "S" THEN IF idx > 1 THEN FINISH REPORT liquida1 END IF END IF IF imp_entrada = "S" THEN CALL edprrp0271() END IF END FUNCTION REPORT liquida1(x) DEFINE x RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion CHAR(30), unidad CHAR(3), cod_sp SMALLINT, cod_sp_sec SMALLINT, proveedor CHAR(7), num_doc INTEGER, num_oc INTEGER, tipo CHAR(2), cantidad DECIMAL(12,5), precio DECIMAL(12,5), flete DECIMAL(12,5), imp_colect DECIMAL(12,5), imp_aduana DECIMAL(12,5), tasa DECIMAL(8,2), cost_std LIKE intb00013.costo_st END RECORD DEFINE valor DECIMAL(12,2) DEFINE variacion,precio_std,fob,c_f,seguro,cost_pl, t_fob,t_flete,t_seguro,t_cf,t_impcol,t_impaduana,t_dollar, t_costopl,t_recibida,t_precio,o_variacion DECIMAL(12,2) DEFINE no_reg SMALLINT DEFINE total_cf,t_costo, costo_unit DECIMAL(12,2), o_impaduana,o_impcolect,o_dollar,o_cf DECIMAL(12,2) DEFINE ot_fob, ot_flete, ot_cf, ot_seguro, ot_impcol, ot_impaduana, ot_dollar, ot_costopl, ot_costo, ot_precio, ot_costst, ot_variacion DECIMAL(12,2) ## DEFINICION DE LAS VARIABLES DE IMPRESION DEFINE hora CHAR(5) DEFINE fechaActual, orden_tipo CHAR(12) DEFINE codigo CHAR(25) DEFINE codigos_sp, tituloFecha CHAR(25) DEFINE material,titulo STRING {OUTPUT ## DEFINICION DE LOS MARGENES DE IMPRESION TOP MARGIN 0 LEFT MARGIN 0 BOTTOM MARGIN 3 PAGE LENGTH 150} FORMAT PAGE HEADER LET hora = TIME LET fechaActual = today using "dd/mm/yy" IF tipo_inventario = '2' THEN LET titulo = 'Liquidacion Mercancias Productos Terminados' ELSE LET titulo = 'Liquidacion Mercancias Materia Prima' END IF IF primera = "S" THEN LET t_fob = 0 LET t_flete = 0 LET t_seguro = 0 LET t_cf = 0 LET t_impcol = 0 LET t_impaduana = 0 LET t_dollar = 0 LET t_costopl = 0 LET t_recibida = 0 LET t_costo = 0 LET t_precio = 0 LET t_costst = 0 LET t_variacion = 0 LET o_variacion = 0 LET primera = "N" LET idz = 1 END IF BEFORE GROUP OF x.num_oc IF total_cf is null THEN LET total_cf = 0 END IF LET ot_fob =0 LET ot_flete =0 LET ot_cf =0 LET ot_seguro =0 LET ot_impcol =0 LET ot_impaduana =0 LET ot_dollar =0 LET ot_costopl =0 LET ot_costo =0 LET ot_precio =0 LET ot_costst =0 LET ot_variacion =0 LET tituloFecha = "Del ",fecha_inicial USING "dd/mm/yy"," Al ", fecha_final USING "dd/mm/yy" ## AQUI SE INDICA LA IMPRESION DE LOS ENCABEZADOS PRINTX p_compania.nombre, hora,tituloFecha, fechaActual,fecha_inicial USING "dd/mm/yy", fecha_final USING "dd/mm/yy",titulo ON EVERY ROW LET seguro = 0 LET codigo = x.cod_n using "&&&&&","-",x.cod_grupo using "&&&&&","-", x.cod_tipo using "&&&&&","-",x.cod_sec using "&&&&&" LET codigos_sp = x.cod_sp using "&&","-",x.cod_sp_sec using "&&&&" LET orden_tipo = x.num_oc using "&&&&&","-",x.tipo SELECT CONVERT(CHAR(10),MIN(a.fecha),101) INTO p_fecha FROM iptb00006 a WHERE a.num_doc = x.num_doc and cod_mov in (10) AND status_t IS NULL LET fob = x.precio LET c_f = fob + x.flete LET valor = c_f * x.tasa IF elije = "L" THEN LET seguro = 0 END IF IF no_reg > 1 THEN LET x.imp_aduana = (x.imp_aduana / total_cf) * c_f LET x.imp_colect = (x.imp_colect / total_cf) * c_f END IF LET cost_pl = seguro + c_f + x.imp_colect + x.imp_aduana + valor LET costo_unit = cost_pl / x.cantidad LET precio_std = x.cantidad * x.cost_std LET variacion = cost_pl - precio_std LET material = "(",codigo,")","-",x.descripcion CLIPPED PRINTX material, codigos_sp,x.proveedor, orden_tipo, fob, x.flete, c_f, seguro, x.imp_colect, x.imp_aduana, valor, cost_pl, x.cantidad, costo_unit, x.cost_std, precio_std, variacion IF tipo_inventario = '2' THEN IF chstd = "YES" THEN SELECT UNIQUE a.cod_n FROM iptb00004 a WHERE a.cod_n = x.cod_n AND a.cod_grupo = x.cod_grupo AND a.cod_tipo = x.cod_tipo AND a.cod_sec = x.cod_sec AND a.ano = p_ano and a.mes_ini = 1 AND a.mes_fin = 12 IF STATUS = NOTFOUND THEN INSERT INTO iptb00004 (ventas,mes_ini,mes_fin,ano,cod_n,cod_grupo,cod_tipo,cod_Sec,material,labor,gastos,us_crea,fech_crea) VALUES ('1','01','12',p_ano,x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec,costo_unit,0,0,SUSER_SNAME(),GETDATE()) END IF END IF ELSE IF chstd = "YES" THEN SELECT UNIQUE a.cod_n FROM intb00013 a WHERE a.cod_n = x.cod_n AND a.cod_grupo = x.cod_grupo AND a.cod_tipo = x.cod_tipo AND a.cod_sec = x.cod_sec AND a.ano = p_ano AND a.mes_ini = 1 AND a.mes_fin = 12 IF STATUS = NOTFOUND THEN INSERT INTO intb00013 VALUES ('01','12',p_ano,x.cod_n,x.cod_grupo,x.cod_tipo, x.cod_sec,costo_unit,null,SUSER_SNAME(),GETDATE(),null, NULL) END IF END IF END IF INSERT INTO cttb00013 (fecha_lq,fecha,tipo_lq,num_oc,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad,costo_lq,status_t,us_crea,fech_crea,tipo_orden) VALUES (fecha_final,p_fecha,elije,x.num_oc,x.cod_n,x.cod_grupo,x.cod_tipo, x.cod_sec,x.cantidad,costo_unit,null,usuarios,GETDATE(),x.tipo) INSERT INTO cttb000log2 (fecha_lq,fecha,tipo_lq,num_oc,cod_n,cod_grupo,cod_tipo,cod_sec) VALUES (fecha_final,p_fecha,elije,x.num_oc,x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec) # Acumulacion de totales IF o_impaduana is null THEN LET o_impaduana = 0 END IF IF o_variacion is null THEN LET o_variacion = 0 END IF IF o_impcolect is null THEN LET o_impcolect = 0 END IF IF o_dollar is null THEN LET o_dollar = 0 END IF IF o_cf is null THEN LET o_cf = 0 END IF LET t_fob = t_fob + fob LET t_flete = t_flete + x.flete LET t_seguro = t_seguro + seguro LET t_cf = t_cf + c_f LET t_impcol = t_impcol + x.imp_colect LET t_impaduana = t_impaduana + x.imp_aduana LET t_dollar = t_dollar + valor LET t_costopl = t_costopl + cost_pl LET t_costo = t_costo + costo_unit LET t_precio = t_precio + x.cost_std LET t_costst = t_costst + precio_std LET t_variacion = t_variacion + variacion LET o_variacion = o_variacion + cost_pl LET o_impaduana = o_impaduana + x.imp_aduana + seguro LET o_impcolect = o_impcolect + x.imp_colect LET o_dollar = o_dollar + valor LET o_cf = o_cf + c_f LET ot_fob = ot_fob + fob LET ot_flete = ot_flete + x.flete LET ot_cf = ot_cf + c_f LET ot_seguro = ot_seguro + seguro LET ot_impcol = ot_impcol + x.imp_colect LET ot_impaduana = ot_impaduana + x.imp_aduana LET ot_dollar = ot_dollar + valor LET ot_costopl = ot_costopl + cost_pl LET ot_costo = ot_costo + costo_unit LET ot_precio = ot_precio + x.cost_std LET ot_costst = ot_costst + precio_std LET ot_variacion = ot_variacion + variacion AFTER GROUP OF x.num_oc # Validacion del arreglo para imprimir la entrada 27 IF imp_entrada = "S" THEN LET entrada27[idz].cuenta_no = "1161" LET entrada27[idz].cod_aux = x.cod_sp LET entrada27[idz].cod_sec = x.cod_sp_sec LET entrada27[idz].num_doc = x.num_oc LET entrada27[idz].valor = o_impaduana LET o_impaduana = 0 LET idz = idz + 1 LET entrada27[idz].cuenta_no = "1161-01" LET entrada27[idz].cod_aux = x.cod_sp LET entrada27[idz].cod_sec = x.cod_sp_sec LET entrada27[idz].num_doc = x.num_oc LET entrada27[idz].valor = o_impcolect LET o_impcolect = 0 LET idz = idz + 1 LET entrada27[idz].cuenta_no = "1161-02" LET entrada27[idz].cod_aux = x.cod_sp LET entrada27[idz].cod_sec = x.cod_sp_sec LET entrada27[idz].num_doc = x.num_oc LET entrada27[idz].valor = o_dollar LET o_dollar = 0 LET idz = idz + 1 LET entrada27[idz].cuenta_no = "1161-03" LET entrada27[idz].cod_aux = x.cod_sp LET entrada27[idz].cod_sec = x.cod_sp_sec LET entrada27[idz].num_doc = x.num_oc LET entrada27[idz].valor = o_cf LET o_cf = 0 LET idz = idz + 1 END IF PRINTX ot_fob,ot_flete,ot_cf,ot_seguro,ot_impcol,ot_impaduana, ot_dollar, ot_costopl,ot_costo, ot_precio,ot_costst,ot_variacion ON LAST ROW PRINTX t_fob, t_flete, t_cf,t_seguro,t_impcol,t_impaduana,t_dollar, t_costopl,t_costo,t_precio,t_costst,t_variacion LET o_impaduana = 0 LET o_impcolect = 0 LET o_dollar = 0 LET o_cf = 0 END REPORT {------------------------------------------------------------------------------- PROGRAMA : EDPRRP027 OBJETIVO : Listar las Entrada de Diario Productos Terminados PROGRAMADOR : Juan F. Soto FECHA REALIZACION : Mayo 20, 1994. -------------------------------------------------------------------------------} FUNCTION edprrp0271() #WHENEVER ERROR CONTINUE DEFINE longitud,u_mes,numero_ent,i SMALLINT, ch_ano CHAR(4) LET r_filename ="lqprrp004b.4rp" OPTIONS FORM LINE 8, ERROR LINE 23, COMMENT LINE 21 ##### Abriendo y desplegando el formulario de captura de datos OPEN FORM edfmrp027 FROM "edfmrp027" DISPLAY FORM edfmrp027 { DISPLAY "edprrp027" AT 4,3 DISPLAY "Entrada de Diario Mat. Importada Rec." AT 6,21} { LET tipo_papel = 1 CALL msgrp000(tipo_papel)} ###### Aceptando los valores para el rango de fecha INPUT BY NAME entra,fecha1,fecha2,afecta,detalla BEFORE INPUT LET numero_ent = 27 LET fecha1 =fecha_inicial LET fecha2 =fecha_final DISPLAY BY NAME fecha1,fecha2 CALL controlNumericoED(numero_ent, fecha1, NULL) RETURNING entra DISPLAY BY NAME entra AFTER FIELD entra LET longitud = LENGTH(entra) IF longitud != 16 THEN LET numero_msg = 77 CALL msg(numero_msg) NEXT FIELD entra END IF LET existe = "N" SELECT unique a.ref FROM cgtb00004 a WHERE a.ref = entra IF STATUS != NOTFOUND THEN LET existe = "S" END IF AFTER FIELD fecha1 IF fecha1 IS NULL THEN ERROR "(16) CAMPO EN BLANCO" NEXT FIELD fecha1 END IF AFTER FIELD fecha2 IF fecha2 is null THEN ERROR "(16) CAMPO EN BLANCO" NEXT FIELD fecha2 END IF IF fecha1 > fecha2 THEN ERROR "(149) FECHA NO PUEDE SER MAYOR QUE LA ANTERIOR" NEXT FIELD fecha1 END IF ###### Selecionando en rango de fecha de la tabla de periodo para el fecha2 AFTER INPUT IF int_flag THEN ERROR "(2) OPERACION CANCELADA" LET int_flag = false RETURN END IF IF fecha2 > TODAY THEN CALL msg(57) END IF END INPUT ##### Creando la facilidad para cancelar proceso con DELETE O SUPR LET i = 1 {CALL configureoutput("XLS") RETURNING handler START REPORT entrada271 TO XML HANDLER handler} IF i = 1 THEN IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview=1 CALL seleccionarsalida() RETURNING r_output -- 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 END IF LET i = 2 START REPORT entrada271 TO XML HANDLER HANDLER END IF DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>" AT 19,14 ATTRIBUTE (REVERSE) ##### Loop para enviar informacion al reporte LET diario1.debito = t_costst IF tipo_inventario = "2" THEN LET diario1.cuenta_no = "1131-02" ELSE LET diario1.cuenta_no = "1151" END IF OUTPUT TO REPORT entrada271(diario1.*,fecha1,fecha2,detalla,entra) IF i > 1 THEN FINISH REPORT entrada271 END IF END FUNCTION #### Funcion para dar salida ordenada a la informacion requerida de #### una entrada de diario de nominas local REPORT entrada271(x,fecha1,fecha2,detalle1,entrada) DEFINE x RECORD cuenta_no LIKE cgtb00001.cuenta_no, debito DECIMAL(10,2) END RECORD ### Acumula los valores de las diferentes cuentas para entrada diario de nomina DEFINE debito,credito DECIMAL(12,2) DEFINE detalle1 CHAR(30) DEFINE fecha1,fecha2 DATE #### Almacena las fecha del rango de busqueda DEFINE cod_aux_sec CHAR(6) DEFINE doce CHAR(2) DEFINE hora,referencia CHAR(5) DEFINE entrada CHAR(25), nombre_cta LIKE cgtb00001.descripcion DEFINE fechaActual CHAR(12) { OUTPUT TOP MARGIN 0 LEFT MARGIN 0 BOTTOM MARGIN 2 PAGE LENGTH 150} FORMAT PAGE HEADER LET hora = TIME LET fechaActual = today using "dd/mm/yy" ##### Selecionado la descripcion del fecha BEFORE GROUP OF x.cuenta_no PRINTX p_compania.nombre,hora,fechaActual,fecha1,fecha2,entrada,doce ON EVERY ROW SELECT a.descripcion INTO nombre_cta FROM cgtb00001 a WHERE a.cuenta_no = x.cuenta_no IF debito is null THEN LET debito = 0 END IF PRINTX x.cuenta_no, x.debito, nombre_cta LET debito = debito + x.debito IF afecta = "S" THEN IF x.cuenta_no IS NOT NULL THEN BEGIN WORK CALL controlNumericoED(numero_ent, fecha1, usuarios) RETURNING entra DISPLAY BY NAME entra LET entrada = entra INSERT INTO cgtb00004 (fecha,tipo,ref,cuenta_no,detalle_1,debito,credito,us_crea,fech_crea) VALUES(fecha2,1,entrada,x.cuenta_no,detalle1,x.debito,0,usuarios,GETDATE()) END IF END IF ON LAST ROW IF tipo_inventario = "2" THEN SELECT a.descripcion INTO nombre_cta FROM cgtb00001 a WHERE a.cuenta_no = "5615" LET debe = 0 LET haber = 0 LET referencia = "5615" ELSE SELECT a.descripcion INTO nombre_cta FROM cgtb00001 a WHERE a.cuenta_no = "1152" LET debe = 0 LET haber = 0 LET referencia = "1152" END IF IF credito is null THEN LET credito = 0 END IF IF debito is null THEN LET debito = 0 END IF IF t_variacion > 0 THEN LET debito = debito + t_variacion LET debe = t_variacion IF afecta = "S" THEN IF tipo_inventario = "2" THEN INSERT INTO cgtb00004(fecha,tipo,ref,cuenta_no,detalle_1,debito ,credito,us_crea,fech_crea) VALUES(fecha2,1,entrada,"5615",detalle1,t_variacion,0,usuarios,GETDATE()) ELSE INSERT INTO cgtb00004(fecha,tipo,ref,cuenta_no,detalle_1,debito ,credito,us_crea,fech_crea) VALUES(fecha2,1,entrada,"1152",detalle1,t_variacion,0,usuarios,GETDATE()) END IF END IF ELSE LET t_variacion = t_variacion * -1 LET credito = credito + t_variacion LET haber = t_variacion IF afecta = "S" THEN INSERT INTO cgtb00004(fecha,tipo,ref,cuenta_no,detalle_1,debito ,credito,us_crea,fech_crea) VALUES(fecha2,1,entrada,"5615",detalle1,0,t_variacion,SUSER_SNAME(),GETDATE() ) END IF END IF ###### Acumulando totales por columna PRINTX referencia, nombre_cta, debe, haber LET credito = 0 # Impresion detalle de la entrada con ordenes de compras FOR i = 1 TO idz # IF entrada27[i].cuenta_no IS NOT NULL THEN # IF entrada27[i].cod_aux is not null THEN IF entrada27[i].valor < 0 THEN LET entrada27[i].valor = entrada27[i].valor * -1 END IF LET cod_aux_sec = entrada27[i].cod_aux using "&&","-",entrada27[i].cod_sec using "&&&&" IF cod_aux_sec IS NULL THEN LET cod_aux_sec = ' ' END IF # DISPLAY "datos ",i USING "<<<"," ",entrada27[i].cod_aux using "&&","-",entrada27[i].cod_sec using "&&&&" PRINTX entrada27[i].cuenta_no, cod_aux_sec, entrada27[i].num_doc, entrada27[i].valor IF entrada27[i].valor IS NULL THEN LET entrada27[i].valor=0 END IF LET credito = credito + entrada27[i].valor IF afecta = "S" THEN IF entrada27[i].valor < 0 THEN LET entrada27[i].valor = entrada27[i].valor * -1 END IF IF entrada27[i].cuenta_no IS NOT NULL THEN INSERT INTO cgtb00004 (fecha,tipo,ref,cuenta_no,num_doc,cod_aux ,cod_sec,detalle_1,debito,credito,us_crea,fech_crea) VALUES (fecha2,1,entrada,entrada27[i].cuenta_no, entrada27[i].num_doc,entrada27[i].cod_aux, entrada27[i].cod_sec,detalle1,0, entrada27[i].valor,SUSER_SNAME(),GETDATE()) END IF END IF # END IF #END IF END FOR IF afecta = "S" THEN COMMIT WORK END IF ###### Imprime total DEBITO y total CREDITO PRINTX debito,credito,detalle1 LET debito = 0 LET credito = 0 END REPORT +{============================================================================== + PROGRAMA : LQPRRP004 + SISTEMA : Sistema de Liquidacion Materiales + Objetivo : Liquidacion Mercancia Compras Exterior Prod. Terminados + PROGRAMADOR : Juan F. Soto + FECHA : Mayo 13, 1994 + MODIFICADO : VALENTIN RODRIGUEZ + FECHA : MAYO, 2019 +==============================================================================} +GLOBALS "lqprgb000.4gl" ###### Variables para busqueda de rango de fecha +DEFINE elije,imp,afecta,tipo_inventario CHAR(1) +DEFINE p_ano,m_mes SMALLINT +DEFINE fecha1, fecha2 DATE , + p_fecha CHAR(10) +DEFINE entra CHAR(25) +DEFINE t_costst DECIMAL(12,2) +DEFINE detalla CHAR(30) +DEFINE orden CHAR(10) +DEFINE t_variacion DECIMAL(12,2) +DEFINE debe, haber DECIMAL(12,2), + idz INT + +###### Variables que la almacenan la informacion enviada al reporte +DEFINE diario1 RECORD + cuenta_no LIKE cgtb00001.cuenta_no, + debito DECIMAL(18,2) +END RECORD + +DEFINE i SMALLINT +DEFINE fecha_inicial,fecha_final DATE +DEFINE primera,imp_entrada CHAR(1) + +MAIN + DEFER INTERRUPT + CALL ARG_VAL(1) RETURNING usuarios + CALL ARG_VAL(2) RETURNING clave + CALL ARG_VAL(3) RETURNING impresor + + CONNECT to "smarmotech" USER usuarios USING clave + SELECT a.* INTO p_compania.* FROM companias a + CALL lqprrp004() +END MAIN + + FUNCTION lqprrp004() + + DEFINE busca_datos RECORD + cod_n SMALLINT, + cod_grupo SMALLINT, + cod_tipo SMALLINT, + cod_sec SMALLINT, + descripcion CHAR(30), + unidad CHAR(3), + cod_sp SMALLINT, + cod_sp_sec SMALLINT, + proveedor CHAR(7), + num_doc INTEGER, + num_oc INTEGER, + tipo CHAR(2), + cantidad DECIMAL(12,5), + precio DECIMAL(12,5), + flete DECIMAL(12,5), + imp_colect DECIMAL(12,5), + imp_aduana DECIMAL(12,5), + tasa DECIMAL(8,2), + cost_std LIKE intb00013.costo_st + END RECORD + + LET int_flag = FALSE + + OPTIONS + FORM LINE 8 + + OPEN FORM lqfmrp004 FROM "lqfmrp004" + DISPLAY FORM lqfmrp004 + DISPLAY "lqprrp004" AT 4,3 + DISPLAY "Liquidacion Mercancia pt" AT 6,28 + + LET tipo_papel = 2 + CALL msgrp000(tipo_papel) + + CONSTRUCT criterio ON c.num_oc,c.cod_n,c.cod_grupo,c.cod_tipo,c.cod_sec + FROM num_oc,cod_n,cod_grupo,cod_tipo,cod_sec + AFTER CONSTRUCT + IF INT_FLAG THEN + CALL msg(2) + LET INT_FLAG = FALSE + EXIT PROGRAM + END IF + EXIT CONSTRUCT + END CONSTRUCT + INPUT BY NAME tipo_inventario, p_ano,m_mes,elije,imp_entrada,imp + + AFTER FIELD m_mes + SELECT fecha_inicio, fecha_corte INTO fecha_inicial,fecha_final + FROM prdtable where mes = m_mes AND ano = p_ano + + DISPLAY BY NAME fecha_inicial,fecha_final + + LET p_fechas = fecha_final using "ddmmyyyy" + CALL prd(p_fechas,usuarios) RETURNING bandera + IF bandera = 1 THEN + LET bandera = 0 + # NEXT FIELD p_ano + END IF + + AFTER INPUT + EXIT INPUT + END INPUT + IF int_flag THEN + LET numero_msg = 2 + CALL msg(numero_msg) + LET int_flag = FALSE + RETURN + END IF + LET chstd = FGL_WINQUESTION("PREGUNTA","Actualiza Costos STD?","yes","Yes|no","question",0) + + LET chstd = UPSHIFT(chstd) + + + LET primera = "S" + IF tipo_inventario = '2' THEN + LET selec = + "SELECT DISTINCT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp, ", + " a.unidad_med,b.cod_sp,b.cod_sp_sec,b.nom_sp,c.rep_entrada,c.num_oc, ", + " c.tipo,c.cantidad_oc,c.cantidad_oc*c.fob,c.costo_flete,c.impuesto,c.otros_g,d.prima_us ", + "FROM iptb00002 a,cotb00001 b,cgtb00018 c,cgtb00017 d ", + "WHERE (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) AND ", + " (d.fecha between '", fecha_inicial USING "MM/DD/YYYY","' and '", + fecha_final USING "MM/DD/YYYY","') and ", + " (c.num_oc = d.num_oc) and (c.tipo=d.tipo) and (d.cod_sp=b.cod_sp AND ", + " d.cod_sp_sec = b.cod_sp_sec) and (c.rep_entrada = d.rep_entrada) and ", + " (c.status_t is null) and d.liquidada='",elije,"' and c.tipo = '2' ", + " AND (a.status_t IS NULL) AND (d.status_t IS NULL) and ", + criterio CLIPPED, + " ORDER BY c.num_oc,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec " + ELSE + LET selec = + "SELECT DISTINCT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp, ", + " a.unidad_med,b.cod_sp,b.cod_sp_sec,b.nom_sp,c.rep_entrada,c.num_oc, ", + " c.tipo,c.cantidad_oc,c.cantidad_oc*c.fob,c.costo_flete,c.impuesto,c.otros_g,d.prima_us ", + "FROM intb00001 a,cotb00001 b,cgtb00018 c,cgtb00017 d ", + "WHERE (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) AND ", + " (d.fecha between '", fecha_inicial USING "MM/dd/YYYY","' and '", + fecha_final USING "MM/dd/YYYY","') and ", + " (c.num_oc = d.num_oc) and (c.tipo=d.tipo) and (d.cod_sp=b.cod_sp AND ", + " d.cod_sp_sec = b.cod_sp_sec) and (c.rep_entrada = d.rep_entrada) and ", + " (c.status_t is null) and d.liquidada='",elije,"' and c.tipo = 1 ", + " AND (a.status_t IS NULL) AND (d.status_t IS NULL) and ", + criterio CLIPPED, + " ORDER BY c.num_oc,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec " + END IF + DISPLAY selec + DISPLAY "elije ",elije + LET idx = 1 + PREPARE comando FROM selec + DECLARE busca CURSOR FOR comando + + INSERT INTO cttb000log1 VALUES (GETDATE(),usuarios,'lqprrp004','ELIMINO') + FOREACH busca INTO busca_datos.* + DISPLAY "datos ",busca_datos.cod_sp_sec," ",busca_datos.descripcion + LET orden = busca_datos.num_oc USING "<<<<<<" + + IF busca_datos.imp_colect is null THEN + LET busca_datos.imp_colect = 0 + END IF + + IF busca_datos.imp_colect < 0 THEN + LET busca_datos.imp_colect = busca_datos.imp_colect * -1 + END IF + + IF busca_datos.imp_aduana is null THEN + LET busca_datos.imp_aduana = 0 + END IF + + IF busca_datos.imp_aduana < 0 THEN + LET busca_datos.imp_aduana = busca_datos.imp_aduana * -1 + END IF + + # Busca el costos standard + LET busca_datos.cost_std = 0 + IF tipo_inventario = '2' THEN + SELECT AVG(a.material+a.labor+a.gastos) INTO busca_datos.cost_std + FROM iptb00004 a + WHERE a.ventas = "1" and + a.ano = year(fecha_inicial) and a.cod_n = busca_datos.cod_n and + a.cod_grupo = busca_datos.cod_grupo and + a.cod_tipo = busca_datos.cod_tipo and + a.cod_sec = busca_datos.cod_sec and a.status_t is NULL + ELSE + SELECT AVG(a.costo_st) INTO busca_datos.cost_std + FROM intb00013 a + WHERE a.ano = year(fecha_inicial) and a.cod_n = busca_datos.cod_n and + a.cod_grupo = busca_datos.cod_grupo and + a.cod_tipo = busca_datos.cod_tipo and + a.cod_sec = busca_datos.cod_sec and a.status_t is NULL + + END IF + IF STATUS = NOTFOUND THEN + LET busca_datos.cost_std = 0 + END IF + + IF busca_datos.cost_std is null THEN + LET busca_datos.cost_std = 0 + END IF + + IF chstd = "yes" THEN + + DELETE FROM cttb00013 WHERE (fecha_lq = fecha_final AND + tipo_lq = elije AND + tipo_orden = 2 AND + num_oc = busca_datos.num_oc) + END IF + + IF imp="S" THEN + LET r_filename ="lqprrp004.4rp" + IF idx = 1 THEN + IF fgl_report_loadCurrentSettings(r_filename) THEN + LET preview=1 + CALL seleccionarsalida() RETURNING r_output -- load the .4rp file + CALL fgl_report_selectDevice(r_output) -- changing default + CALL fgl_report_selectPreview(preview) -- changing default + # CALL fgl_report_configurexlsxdevice(null,null,null,false,false,null,1) + LET handler = fgl_report_commitCurrentSettings() -- commit changes + END IF + LET idx = 2 + START REPORT liquida1 TO XML HANDLER HANDLER + END IF + DISPLAY "DATOS " + OUTPUT TO REPORT liquida1(busca_datos.*) + END IF + END FOREACH + + IF imp = "S" THEN + IF idx > 1 THEN + FINISH REPORT liquida1 + END IF + END IF + + IF imp_entrada = "S" THEN + CALL edprrp0271() + END IF +END FUNCTION + +REPORT liquida1(x) + DEFINE x RECORD + cod_n SMALLINT, + cod_grupo SMALLINT, + cod_tipo SMALLINT, + cod_sec SMALLINT, + descripcion CHAR(30), + unidad CHAR(3), + cod_sp SMALLINT, + cod_sp_sec SMALLINT, + proveedor CHAR(7), + num_doc INTEGER, + num_oc INTEGER, + tipo CHAR(2), + cantidad DECIMAL(12,5), + precio DECIMAL(12,5), + flete DECIMAL(12,5), + imp_colect DECIMAL(12,5), + imp_aduana DECIMAL(12,5), + tasa DECIMAL(8,2), + cost_std LIKE intb00013.costo_st + END RECORD + + DEFINE valor DECIMAL(12,2) + DEFINE variacion,precio_std,fob,c_f,seguro,cost_pl, + t_fob,t_flete,t_seguro,t_cf,t_impcol,t_impaduana,t_dollar, + t_costopl,t_recibida,t_precio,o_variacion + DECIMAL(12,2) + + DEFINE no_reg SMALLINT + DEFINE total_cf,t_costo, costo_unit DECIMAL(12,2), + o_impaduana,o_impcolect,o_dollar,o_cf + DECIMAL(12,2) + DEFINE ot_fob, + ot_flete, + ot_cf, + ot_seguro, + ot_impcol, + ot_impaduana, + ot_dollar, + ot_costopl, + ot_costo, + ot_precio, + ot_costst, + ot_variacion DECIMAL(12,2) + + ## DEFINICION DE LAS VARIABLES DE IMPRESION + DEFINE hora CHAR(5) + DEFINE fechaActual, orden_tipo CHAR(12) + DEFINE codigo CHAR(25) + DEFINE codigos_sp, tituloFecha CHAR(25) + DEFINE material,titulo STRING + + {OUTPUT + ## DEFINICION DE LOS MARGENES DE IMPRESION + TOP MARGIN 0 + LEFT MARGIN 0 + BOTTOM MARGIN 3 + PAGE LENGTH 150} + FORMAT + PAGE HEADER + LET hora = TIME + LET fechaActual = today using "dd/mm/yy" + IF tipo_inventario = '2' THEN + LET titulo = 'Liquidacion Mercancias Productos Terminados' + ELSE + LET titulo = 'Liquidacion Mercancias Materia Prima' + END IF + IF primera = "S" THEN + LET t_fob = 0 + LET t_flete = 0 + LET t_seguro = 0 + LET t_cf = 0 + LET t_impcol = 0 + LET t_impaduana = 0 + LET t_dollar = 0 + LET t_costopl = 0 + LET t_recibida = 0 + LET t_costo = 0 + LET t_precio = 0 + LET t_costst = 0 + LET t_variacion = 0 + LET o_variacion = 0 + LET primera = "N" + LET idz = 1 + END IF + +BEFORE GROUP OF x.num_oc + + IF total_cf is null THEN + LET total_cf = 0 + END IF + + LET ot_fob =0 + LET ot_flete =0 + LET ot_cf =0 + LET ot_seguro =0 + LET ot_impcol =0 + LET ot_impaduana =0 + LET ot_dollar =0 + LET ot_costopl =0 + LET ot_costo =0 + LET ot_precio =0 + LET ot_costst =0 + LET ot_variacion =0 + LET tituloFecha = "Del ",fecha_inicial USING "dd/mm/yy"," Al ", fecha_final USING "dd/mm/yy" + ## AQUI SE INDICA LA IMPRESION DE LOS ENCABEZADOS + PRINTX p_compania.nombre, hora,tituloFecha, fechaActual,fecha_inicial USING "dd/mm/yy", + fecha_final USING "dd/mm/yy",titulo + ON EVERY ROW + + LET seguro = 0 + LET codigo = x.cod_n using "&&&&&","-",x.cod_grupo using "&&&&&","-", + x.cod_tipo using "&&&&&","-",x.cod_sec using "&&&&&" + LET codigos_sp = x.cod_sp using "&&","-",x.cod_sp_sec using "&&&&" + LET orden_tipo = x.num_oc using "&&&&&","-",x.tipo + + SELECT CONVERT(CHAR(10),MIN(a.fecha),101) INTO p_fecha FROM iptb00006 a + WHERE a.num_doc = x.num_doc and cod_mov in (10) AND status_t IS NULL + + LET fob = x.precio + + LET c_f = fob + x.flete + LET valor = c_f * x.tasa + + IF elije = "L" THEN + LET seguro = 0 + END IF + + IF no_reg > 1 THEN + LET x.imp_aduana = (x.imp_aduana / total_cf) * c_f + LET x.imp_colect = (x.imp_colect / total_cf) * c_f + END IF + + LET cost_pl = seguro + c_f + x.imp_colect + x.imp_aduana + valor + LET costo_unit = cost_pl / x.cantidad + LET precio_std = x.cantidad * x.cost_std + LET variacion = cost_pl - precio_std + LET material = "(",codigo,")","-",x.descripcion CLIPPED + + PRINTX material, codigos_sp,x.proveedor, orden_tipo, + fob, x.flete, c_f, seguro, x.imp_colect, x.imp_aduana, + valor, cost_pl, x.cantidad, costo_unit, x.cost_std, precio_std, + variacion + + IF tipo_inventario = '2' THEN + IF chstd = "YES" THEN + SELECT UNIQUE a.cod_n FROM iptb00004 a + WHERE a.cod_n = x.cod_n AND + a.cod_grupo = x.cod_grupo AND + a.cod_tipo = x.cod_tipo AND + a.cod_sec = x.cod_sec AND + a.ano = p_ano and + a.mes_ini = 1 AND + a.mes_fin = 12 + IF STATUS = NOTFOUND THEN + INSERT INTO iptb00004 (ventas,mes_ini,mes_fin,ano,cod_n,cod_grupo,cod_tipo,cod_Sec,material,labor,gastos,us_crea,fech_crea) + VALUES ('1','01','12',p_ano,x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec,costo_unit,0,0,SUSER_SNAME(),GETDATE()) + END IF + END IF + ELSE + IF chstd = "YES" THEN + SELECT UNIQUE a.cod_n FROM intb00013 a + WHERE a.cod_n = x.cod_n AND + a.cod_grupo = x.cod_grupo AND + a.cod_tipo = x.cod_tipo AND + a.cod_sec = x.cod_sec AND + a.ano = p_ano AND + a.mes_ini = 1 AND + a.mes_fin = 12 + IF STATUS = NOTFOUND THEN + INSERT INTO intb00013 VALUES ('01','12',p_ano,x.cod_n,x.cod_grupo,x.cod_tipo, + x.cod_sec,costo_unit,null,SUSER_SNAME(),GETDATE(),null, + NULL) + END IF + END IF + + END IF + + INSERT INTO cttb00013 (fecha_lq,fecha,tipo_lq,num_oc,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad,costo_lq,status_t,us_crea,fech_crea,tipo_orden) + VALUES (fecha_final,p_fecha,elije,x.num_oc,x.cod_n,x.cod_grupo,x.cod_tipo, + x.cod_sec,x.cantidad,costo_unit,null,usuarios,GETDATE(),x.tipo) + + INSERT INTO cttb000log2 + (fecha_lq,fecha,tipo_lq,num_oc,cod_n,cod_grupo,cod_tipo,cod_sec) + VALUES (fecha_final,p_fecha,elije,x.num_oc,x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec) + + # Acumulacion de totales + IF o_impaduana is null THEN + LET o_impaduana = 0 + END IF + IF o_variacion is null THEN + LET o_variacion = 0 + END IF + IF o_impcolect is null THEN + LET o_impcolect = 0 + END IF + IF o_dollar is null THEN + LET o_dollar = 0 + END IF + IF o_cf is null THEN + LET o_cf = 0 + END IF + + LET t_fob = t_fob + fob + LET t_flete = t_flete + x.flete + LET t_seguro = t_seguro + seguro + LET t_cf = t_cf + c_f + LET t_impcol = t_impcol + x.imp_colect + LET t_impaduana = t_impaduana + x.imp_aduana + LET t_dollar = t_dollar + valor + LET t_costopl = t_costopl + cost_pl + LET t_costo = t_costo + costo_unit + LET t_precio = t_precio + x.cost_std + LET t_costst = t_costst + precio_std + LET t_variacion = t_variacion + variacion + + LET o_variacion = o_variacion + cost_pl + LET o_impaduana = o_impaduana + x.imp_aduana + seguro + LET o_impcolect = o_impcolect + x.imp_colect + LET o_dollar = o_dollar + valor + LET o_cf = o_cf + c_f + + LET ot_fob = ot_fob + fob + LET ot_flete = ot_flete + x.flete + LET ot_cf = ot_cf + c_f + LET ot_seguro = ot_seguro + seguro + LET ot_impcol = ot_impcol + x.imp_colect + LET ot_impaduana = ot_impaduana + x.imp_aduana + LET ot_dollar = ot_dollar + valor + LET ot_costopl = ot_costopl + cost_pl + LET ot_costo = ot_costo + costo_unit + LET ot_precio = ot_precio + x.cost_std + LET ot_costst = ot_costst + precio_std + LET ot_variacion = ot_variacion + variacion + + AFTER GROUP OF x.num_oc + # Validacion del arreglo para imprimir la entrada 27 + + IF imp_entrada = "S" THEN + LET entrada27[idz].cuenta_no = "1161" + LET entrada27[idz].cod_aux = x.cod_sp + LET entrada27[idz].cod_sec = x.cod_sp_sec + LET entrada27[idz].num_doc = x.num_oc + LET entrada27[idz].valor = o_impaduana + LET o_impaduana = 0 + LET idz = idz + 1 + + LET entrada27[idz].cuenta_no = "1161-01" + LET entrada27[idz].cod_aux = x.cod_sp + LET entrada27[idz].cod_sec = x.cod_sp_sec + LET entrada27[idz].num_doc = x.num_oc + LET entrada27[idz].valor = o_impcolect + LET o_impcolect = 0 + LET idz = idz + 1 + + LET entrada27[idz].cuenta_no = "1161-02" + LET entrada27[idz].cod_aux = x.cod_sp + LET entrada27[idz].cod_sec = x.cod_sp_sec + LET entrada27[idz].num_doc = x.num_oc + LET entrada27[idz].valor = o_dollar + LET o_dollar = 0 + LET idz = idz + 1 + + LET entrada27[idz].cuenta_no = "1161-03" + LET entrada27[idz].cod_aux = x.cod_sp + LET entrada27[idz].cod_sec = x.cod_sp_sec + LET entrada27[idz].num_doc = x.num_oc + LET entrada27[idz].valor = o_cf + LET o_cf = 0 + LET idz = idz + 1 + + END IF + + PRINTX ot_fob,ot_flete,ot_cf,ot_seguro,ot_impcol,ot_impaduana, ot_dollar, + ot_costopl,ot_costo, ot_precio,ot_costst,ot_variacion + + ON LAST ROW + + PRINTX t_fob, t_flete, t_cf,t_seguro,t_impcol,t_impaduana,t_dollar, + t_costopl,t_costo,t_precio,t_costst,t_variacion + + LET o_impaduana = 0 + LET o_impcolect = 0 + LET o_dollar = 0 + LET o_cf = 0 + END REPORT + +{------------------------------------------------------------------------------- +PROGRAMA : EDPRRP027 +OBJETIVO : Listar las Entrada de Diario Productos Terminados +PROGRAMADOR : Juan F. Soto +FECHA REALIZACION : Mayo 20, 1994. +-------------------------------------------------------------------------------} + +FUNCTION edprrp0271() + + #WHENEVER ERROR CONTINUE + DEFINE longitud,u_mes,numero_ent,i SMALLINT, + ch_ano CHAR(4) + LET r_filename ="lqprrp004b.4rp" + + OPTIONS + FORM LINE 8, + ERROR LINE 23, + COMMENT LINE 21 + + ##### Abriendo y desplegando el formulario de captura de datos + OPEN FORM edfmrp027 FROM "edfmrp027" + DISPLAY FORM edfmrp027 + + { DISPLAY "edprrp027" AT 4,3 + DISPLAY "Entrada de Diario Mat. Importada Rec." AT 6,21} + + { LET tipo_papel = 1 + CALL msgrp000(tipo_papel)} + + ###### Aceptando los valores para el rango de fecha + + INPUT BY NAME entra,fecha1,fecha2,afecta,detalla + BEFORE INPUT + LET numero_ent = 27 + LET fecha1 =fecha_inicial + LET fecha2 =fecha_final + DISPLAY BY NAME fecha1,fecha2 + + CALL controlNumericoED(numero_ent, fecha1, NULL) RETURNING entra + DISPLAY BY NAME entra + + AFTER FIELD entra + LET longitud = LENGTH(entra) + IF longitud != 16 THEN + LET numero_msg = 77 + CALL msg(numero_msg) + NEXT FIELD entra + END IF + LET existe = "N" + SELECT unique a.ref FROM cgtb00004 a WHERE a.ref = entra + + IF STATUS != NOTFOUND THEN + LET existe = "S" + END IF + + AFTER FIELD fecha1 + IF fecha1 IS NULL THEN + ERROR "(16) CAMPO EN BLANCO" + NEXT FIELD fecha1 + END IF + + AFTER FIELD fecha2 + IF fecha2 is null THEN + ERROR "(16) CAMPO EN BLANCO" + NEXT FIELD fecha2 + END IF + + IF fecha1 > fecha2 THEN + ERROR "(149) FECHA NO PUEDE SER MAYOR QUE LA ANTERIOR" + NEXT FIELD fecha1 + END IF + + ###### Selecionando en rango de fecha de la tabla de periodo para el fecha2 + + AFTER INPUT + + IF int_flag THEN + ERROR "(2) OPERACION CANCELADA" + LET int_flag = false + RETURN + END IF + IF fecha2 > TODAY THEN + CALL msg(57) + END IF + END INPUT + ##### Creando la facilidad para cancelar proceso con DELETE O SUPR + + LET i = 1 + + {CALL configureoutput("XLS") RETURNING handler + START REPORT entrada271 TO XML HANDLER handler} + IF i = 1 THEN + + IF fgl_report_loadCurrentSettings(r_filename) THEN + + LET preview=1 + CALL seleccionarsalida() RETURNING r_output -- 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 + + END IF + LET i = 2 + START REPORT entrada271 TO XML HANDLER HANDLER + END IF + + DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>" + AT 19,14 ATTRIBUTE (REVERSE) + + ##### Loop para enviar informacion al reporte + + LET diario1.debito = t_costst + IF tipo_inventario = "2" THEN + LET diario1.cuenta_no = "1131-02" + ELSE + LET diario1.cuenta_no = "1151" + END IF + OUTPUT TO REPORT entrada271(diario1.*,fecha1,fecha2,detalla,entra) + + IF i > 1 THEN + FINISH REPORT entrada271 + END IF + END FUNCTION + +#### Funcion para dar salida ordenada a la informacion requerida de +#### una entrada de diario de nominas local + +REPORT entrada271(x,fecha1,fecha2,detalle1,entrada) + + DEFINE x RECORD + cuenta_no LIKE cgtb00001.cuenta_no, + debito DECIMAL(10,2) + END RECORD + + ### Acumula los valores de las diferentes cuentas para entrada diario de nomina + DEFINE debito,credito DECIMAL(12,2) + DEFINE detalle1 CHAR(30) + DEFINE fecha1,fecha2 DATE #### Almacena las fecha del rango de busqueda + DEFINE numero_ent SMALLINT + DEFINE cod_aux_sec CHAR(6) + DEFINE doce CHAR(2) + DEFINE hora,referencia CHAR(5) + DEFINE entrada CHAR(25), + nombre_cta LIKE cgtb00001.descripcion + DEFINE fechaActual CHAR(12) + + { OUTPUT + TOP MARGIN 0 + LEFT MARGIN 0 + BOTTOM MARGIN 2 + PAGE LENGTH 150} + + FORMAT + PAGE HEADER + LET hora = TIME + LET fechaActual = today using "dd/mm/yy" + + ##### Selecionado la descripcion del fecha + + BEFORE GROUP OF x.cuenta_no + PRINTX p_compania.nombre,hora,fechaActual,fecha1,fecha2,entrada,doce + + ON EVERY ROW + SELECT a.descripcion INTO nombre_cta FROM cgtb00001 a + WHERE a.cuenta_no = x.cuenta_no + + IF debito is null THEN + LET debito = 0 + END IF + + PRINTX x.cuenta_no, x.debito, nombre_cta + + LET debito = debito + x.debito + + IF afecta = "S" THEN + IF x.cuenta_no IS NOT NULL THEN + BEGIN WORK + + LET numero_ent = 27 + CALL controlNumericoED(numero_ent, fecha1, usuarios) RETURNING entra + DISPLAY BY NAME entra + + LET entrada = entra + + INSERT INTO cgtb00004 + (fecha,tipo,ref,cuenta_no,detalle_1,debito,credito,us_crea,fech_crea) + VALUES(fecha2,1,entrada,x.cuenta_no,detalle1,x.debito,0,usuarios,GETDATE()) + END IF + END IF + + ON LAST ROW + IF tipo_inventario = "2" THEN + SELECT a.descripcion INTO nombre_cta FROM cgtb00001 a + WHERE a.cuenta_no = "5615" + + LET debe = 0 + LET haber = 0 + LET referencia = "5615" + ELSE + SELECT a.descripcion INTO nombre_cta FROM cgtb00001 a + WHERE a.cuenta_no = "1152" + + LET debe = 0 + LET haber = 0 + LET referencia = "1152" + END IF + IF credito is null THEN + LET credito = 0 + END IF + IF debito is null THEN + LET debito = 0 + END IF + + IF t_variacion > 0 THEN + LET debito = debito + t_variacion + LET debe = t_variacion + IF afecta = "S" THEN + IF tipo_inventario = "2" THEN + INSERT INTO cgtb00004(fecha,tipo,ref,cuenta_no,detalle_1,debito + ,credito,us_crea,fech_crea) + VALUES(fecha2,1,entrada,"5615",detalle1,t_variacion,0,usuarios,GETDATE()) + ELSE + INSERT INTO cgtb00004(fecha,tipo,ref,cuenta_no,detalle_1,debito + ,credito,us_crea,fech_crea) + VALUES(fecha2,1,entrada,"1152",detalle1,t_variacion,0,usuarios,GETDATE()) + END IF + END IF + ELSE + LET t_variacion = t_variacion * -1 + LET credito = credito + t_variacion + LET haber = t_variacion + + IF afecta = "S" THEN + INSERT INTO cgtb00004(fecha,tipo,ref,cuenta_no,detalle_1,debito + ,credito,us_crea,fech_crea) + VALUES(fecha2,1,entrada,"5615",detalle1,0,t_variacion,SUSER_SNAME(),GETDATE() ) + END IF + END IF + + ###### Acumulando totales por columna + PRINTX referencia, nombre_cta, debe, haber + LET credito = 0 + # Impresion detalle de la entrada con ordenes de compras + FOR i = 1 TO idz + # IF entrada27[i].cuenta_no IS NOT NULL THEN + # IF entrada27[i].cod_aux is not null THEN + + IF entrada27[i].valor < 0 THEN + LET entrada27[i].valor = entrada27[i].valor * -1 + END IF + + LET cod_aux_sec = entrada27[i].cod_aux using "&&","-",entrada27[i].cod_sec using "&&&&" + IF cod_aux_sec IS NULL THEN + LET cod_aux_sec = ' ' + END IF + # DISPLAY "datos ",i USING "<<<"," ",entrada27[i].cod_aux using "&&","-",entrada27[i].cod_sec using "&&&&" + PRINTX entrada27[i].cuenta_no, cod_aux_sec, entrada27[i].num_doc, + entrada27[i].valor + IF entrada27[i].valor IS NULL THEN + LET entrada27[i].valor=0 + END IF + LET credito = credito + entrada27[i].valor + + IF afecta = "S" THEN + IF entrada27[i].valor < 0 THEN + LET entrada27[i].valor = entrada27[i].valor * -1 + END IF + IF entrada27[i].cuenta_no IS NOT NULL THEN + INSERT INTO cgtb00004 (fecha,tipo,ref,cuenta_no,num_doc,cod_aux + ,cod_sec,detalle_1,debito,credito,us_crea,fech_crea) + VALUES (fecha2,1,entrada,entrada27[i].cuenta_no, + entrada27[i].num_doc,entrada27[i].cod_aux, + entrada27[i].cod_sec,detalle1,0, + entrada27[i].valor,SUSER_SNAME(),GETDATE()) + END IF + END IF + # END IF + #END IF + END FOR + IF afecta = "S" THEN + COMMIT WORK + END IF + ###### Imprime total DEBITO y total CREDITO + PRINTX debito,credito,detalle1 + LET debito = 0 + LET credito = 0 +END REPORT + diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 0994025..502b77a 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -363,7 +363,7 @@ - + @@ -819,7 +819,7 @@ - + From e051b498f66ddf7e32b1ae84bf417acbeefc63f0 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 16 Oct 2026 11:11:42 -0400 Subject: [PATCH 13/14] lqprrp004: reemplaza .4rp danado por el de produccion y avisa si no hay datos - bin/lqprrp004.4rp del repo era un archivo binario ilegible (motor de reportes: "Content is not allowed in prolog"). Se reemplaza por el XML de produccion (\192.168.40.4\MARMOTECHC$\BIN320, report name liquida1, formato 6.00). - Si la consulta no devuelve filas ahora muestra "NO EXISTEN REGISTROS PARA ESTOS PARAMETROS" en vez de cerrarse sin avisar. Verificado: Productos Terminados, 03/2024, tipo Importacion: 2 paginas en pantalla y PDF con totales por orden. Tipo Local sin datos en el periodo. Excel no probado. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/bin/lqprrp004.4rp | Bin 23954 -> 23954 bytes PROYECTO/lqdir/lqprrp004.4gl | 2 ++ 2 files changed, 2 insertions(+) diff --git a/PROYECTO/bin/lqprrp004.4rp b/PROYECTO/bin/lqprrp004.4rp index 9ac921b73c95ce05558037c6bd0c3f542df74a41..7e69d5f07a7c8e76d700d9c6973b07d576c12059 100644 GIT binary patch literal 23954 zcmdU1*>a;w5`FKlAb6OkF*CZcJCf&K>4o&vtu-Te$e-K5PTOdIwOx~aKE|HyL#_P{9 zA$Xy_!f(XEMgd=Ae}TxY9T0Ucd4BKV=S?f~g5l+L_67C=_=sH6Yl%LNBM47OF4q~p zL<9j(^v^9e5n+C07%k_osqMpW&-XoW2*aOFDWBJKhda?dT3Eog{nyf-qK+<*$bP%P z?#!`G5`>=<=QJSijukvxR)m`#b&EI?a4nE%K5H&B!VT)|2yPq@AK5PH>*DkEZ!@y* zzTbZzp50uD8&KELMi>)aV~)|+7wApbxC4m;!9 zW9|pK7Q7@kh3`vLwi`i34`|f( zb>zO&Cj4oksRhVp4u*bm=jYZlda<$J*CFH`99UBkJ=9?QrL7xP6XS^I+k7rotHjOz`3D*TM4hRC zH6d&vFe2G-6IJxHUMw@**{)4PE5x>lhG5ufnclTI;Nu83`^SE^Z*qt55DZ`FR4dXz z)<~NA?gy$vXbbNlbt!l3K+|+B65dZJupHaXj^ZK&wawDejkALU#rZz%lw$~BD# z%Urrs@b|P7L3=UMx|EE*mLqD-1CUjO^8@oI-1`&w;yEoZJdzP0GROmzAJzhCQ%i&K zlAtFWau}NOsk-K!rt9}Or>@L z@9=BOd~T*MBKBfkqOxaRA$Qw+v%`kgIT=xpaa=>z0N%}j`zPp7t5p-X>M3} zLr#ki6q)5oJV-xM;Kqs#nZ6)G7KrI7)( z42GePUo2~ia|_5A3o6lWgz$kx>r?fCSGRqA0Min;G%qSYYy?%Dmq`4q!MYxtm+UGv zDAxrE^dPGwsKd~OYXWtFq0rL)g%;j_N~AX_hQLm#BTk}lR!8N8<6d%91Cn{+9PBCcc>G^l(efnwJYmIS>YbVrsc&8l>DiAEENkhCzH-ZWtonV zoFW&;kd|aFKza31*_t*4*j)p7Sf#v8LwNmxnkj;>(+G(Uh|{IZ@)*i!XK&2h)qDG0 z!^Foy+0q~hbfO}>Ca9O#fq|-AM&E?9exySOfpWPOsP%&#!9e*0bw!1Urx69d%6`ND z>aH503?fWF--a)6&~-z8Ac$)ITXKn=!JJnUH~kPji=x2{w~!_3W&!f$f25F8u&@W55x5lSfPU3B!_3_7XM~ zD5E9^?iFl(c^~1|q`~O9N>-V`uNJGsDikcLIF?Thi`gAxHHBhIe%5+N*2JN}T1cvH z3tTaEt(1WNrv*#JDVJsu2%Av`9dwlmA)GOW_Y2@S7te(6dP(W zCSoq8U{@U2`}%4Xxp`Gu=-vl+LTnEfQcEnde2^7oZM&qT6}hXGvRIX=8HVM|kfQtL z0wN3YoZK&w+(A*8qsyy{?{{an*MrgB*;u&{7))mgcCld}_8&o=fYd&SDy8g^*U208PHuBoNaSd$^7v-h3%ZSqPUoBT$Ef99;WUbAJIo@sH1QeCa?88L zEXP!pSs3O(d1^HDnaN$@l7Xp8q6urD6VGXuMqzYUh!k+DQu$_>poh_=t7h3$b_)^u zS;eS=S(RwoUwExfm#ePPiuaH&c)?*8blYlhr#L8|VZa>S370jwc zLpadX+c?q6ZXu$#<-{4zs}NP?ls#U-7I+)33dFi{f>F8iE}{iAKxjxqKA-u@HPh@` zp{$#(b;c#`F(wAvAh%h6tz+LLNG*K3^V;U-bjYl2>w6=_N?K%3(7til&0O9s{)kn4 z*Y?^D6X1((veX!7`A?Fh>!_GaYEi;^DJmGZm-PLRwTSnBR^H|q3&caJP*3krj}n%} zE47$lHr!0RBg9gW6{$6AP{A^IHFrh>1Gh2@s9>4VUY7`#LEvs_U_fF~87z}X(7-?f z+y0~?gGg?&P>45BIRKFyP{nYDo7AOvWpi0V?fS%_D5R$%%~R~qy+T_rb~8BUCJXuN zClbt2R%Dk=s_T%(GUydHcb#7WvjD*xtLyHjt-f+&#-Y*ebPizqXI{Q5u)8#?nqzHf zG^bZj2AK@H+uPT&Nj5V?7Nb*5J9#RRSN$|kMqK-~#QMIyP})TonklRHEt z2UL;BP!egB%g}0q&d(8sz%4^a*@Wirc+63RSe?DT5%3ls(n{F}7@kVq2H44ZZ%*tT z2SQ0P=J0T)&mLUexC3y<6)5!pL_~oqpS$?`Nu;=RBPlt}+dr5-QEFITV&;+ov`gv| zgP0vq*;^kQ*Or9A1g)E-rSd*kdb|{Hs!`aahD24H-65}BM%M}Cfo r6rmy8Co5@4Xc_)xMq{dviHI<`+cYV;#O-o4<_u+n4_X`nSj# literal 23954 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 1 THEN FINISH REPORT liquida1 + ELSE + CALL fgl_winmessage("INFO","NO EXISTEN REGISTROS PARA ESTOS PARAMETROS","INFO") END IF END IF From aa7fe013c05ef0c104ae3857ac39165addff58c9 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 16 Oct 2026 11:35:04 -0400 Subject: [PATCH 14/14] lqprrp004: mensaje de 'sin datos' igual al de Genero 3.20 Con Tipo Reporte Local (sin liquidaciones con liquidada='L' en cgtb00017, ni en pruebas ni en produccion) el programa se cerraba sin avisar. En 3.20 muestra INFO "NO ENCONTRE INFORMACION CON ESOS PARAMETROS" y vuelve al menu; se replica el mismo texto. Verificado contra Genero 3.20 y 6.00.03 con Productos Terminados, 03/2024, Local. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/lqdir/lqprrp004.4gl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PROYECTO/lqdir/lqprrp004.4gl b/PROYECTO/lqdir/lqprrp004.4gl index e99ba1a..dc89e0e 100644 --- a/PROYECTO/lqdir/lqprrp004.4gl +++ b/PROYECTO/lqdir/lqprrp004.4gl @@ -236,7 +236,7 @@ END MAIN IF idx > 1 THEN FINISH REPORT liquida1 ELSE - CALL fgl_winmessage("INFO","NO EXISTEN REGISTROS PARA ESTOS PARAMETROS","INFO") + CALL fgl_winmessage("INFO","NO ENCONTRE INFORMACION CON ESOS PARAMETROS","INFO") END IF END IF