From 70c3131e9cbe4b058a1a8fe44c1adb3e5613331f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20L=C3=B3pez?= Date: Fri, 16 Oct 2026 16:47:15 -0400 Subject: [PATCH] Registra noprmt026 (Pago TSS) y migra la salida de DDE a CSV - Registra nofmmt026.4fd y la aplicacion noprmt026 (con FGLSPOOL) en el subgrupo NOMINA. - GDC 6.00 ya no incluye el modulo WINDDE (error -6331): enviaDDE() guarda las celdas en memoria y escribeCSV() genera FGLSPOOL/noprmt026__ .csv con las mismas filas/columnas de la plantilla TSS. - SQL: se quitan los CONVERT(...,103) sobre variables DATE (-1205), la comparacion de fechas como texto (101) y el date+int dentro del SQL (-206); rango con fecha_sig = fecha_final+1. FOREACH con THRU (10 cols). Verificado contra la BD .250: Normal 2026/7 = 636 filas / 33,933,711.43; Bonificacion cancelados 2026/4 = 229 filas / 1,596,887.98. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/mbsERP.4pw | 5 ++ PROYECTO/nodir/noprmt026.4gl | 118 +++++++++++++++++++++++++---------- 2 files changed, 91 insertions(+), 32 deletions(-) diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index ed45a34..0f7f98d 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -783,6 +783,7 @@ + @@ -899,6 +900,10 @@ + + + + diff --git a/PROYECTO/nodir/noprmt026.4gl b/PROYECTO/nodir/noprmt026.4gl index 085541f..3b3df80 100644 --- a/PROYECTO/nodir/noprmt026.4gl +++ b/PROYECTO/nodir/noprmt026.4gl @@ -20,7 +20,9 @@ DEFINE rcol,arch_pc,prog STRING, d_tipos,mensaje,f_tipos,filepath,p_res,res,fila,val STRING DEFINE usuarios,clave CHAR(80), - FILE,nombre_cia STRING + FILE,nombre_cia STRING, + celdas DICTIONARY OF STRING, + maxfila,maxcol INTEGER END GLOBALS MAIN @@ -49,7 +51,7 @@ DEFINE ptss RECORD departamento INT, valor_isr DEC(12,2) END RECORD, - fecha_inicial,fecha_final DATE, + fecha_inicial,fecha_final,fecha_sig DATE, kano,kmes, cnt,numero_msg SMALLINT, cels CHAR(40), filename,sysos CHAR(200), @@ -79,7 +81,7 @@ DEFINE ptss RECORD AFTER FIELD kmes LET selec = - "SELECT CONVERT(CHAR(10),MIN(a.fecha_del),103) ,CONVERT(CHAR(10),MAX(a.fecha_al),103) ", + "SELECT MIN(a.fecha_del), MAX(a.fecha_al) ", " FROM notb00010 a ", " WHERE a.ano ='", kano,"' AND a.mes ='", kmes, "'" PREPARE busca_fecha FROM selec @@ -98,6 +100,8 @@ DEFINE ptss RECORD END INPUT + LET fecha_sig = fecha_final + 1 -- el +1 no se puede hacer dentro del SQL (date + int) + LET periodo = kmes USING "&&",kano USING "&&&&" LET FILE = filepath @@ -144,7 +148,7 @@ DEFINE ptss RECORD CALL ui.Interface.refresh() LET selec = - " SELECT a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.tipo_documento,b.cedula,convert(char(10),b.fech_nac,103),", + " SELECT a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.tipo_documento,b.cedula,b.fech_nac,", " SUM(a.valor),b.departamento ", " FROM adtb00003 b, notb00008 a,notb00010 c,adtb00021 d ", " WHERE b.num_emp = a.num_emp AND c.mes ='",kmes,"' AND ", @@ -154,8 +158,8 @@ DEFINE ptss RECORD " a.cod_mov in (1,40,36,5,24,51,34,56) AND ", " a.num_emp = d.num_emp AND ", #" a.cod_mov in (32) AND ", - " convert(char(10), a.fecha,101) between '",fecha_inicial USING "mm/dd/yyyy", - "' and '",fecha_final using "mm/dd/yyyy","' and b.nomina = 'Q' ", + " a.fecha >= '",fecha_inicial USING "yyyymmdd", + "' and a.fecha < '",(fecha_final + 1) using "yyyymmdd","' and b.nomina = 'Q' ", " GROUP BY a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.cedula,b.fech_nac,b.departamento,a.num_emp,b.tipo_documento ", " ORDER BY b.departamento,a.num_emp " ELSE @@ -176,7 +180,7 @@ DEFINE ptss RECORD CALL ui.Interface.refresh() LET cnt = 15 LET selec = - " SELECT a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.tipo_documento,b.cedula,convert(char(10),b.fech_nac,103),", + " SELECT a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.tipo_documento,b.cedula,b.fech_nac,", " SUM(a.valor),a.departamento ", " FROM adtb00003 b, notb00008 a,notb00010 c,adtb00021 d ", " WHERE b.num_emp = a.num_emp AND b.status_t is not null and c.mes ='",kmes,"' AND ", @@ -186,8 +190,8 @@ DEFINE ptss RECORD #" a.cod_mov in (1,40,36,5,24,51,34) AND ", " a.num_emp = d.num_emp AND ", " a.cod_mov in (33) AND ", - " convert(char(10), a.fecha,101) between '",fecha_inicial USING "mm/dd/yyyy", - "' and '",fecha_final using "mm/dd/yyyy","' and b.nomina = 'Q' ", + " a.fecha >= '",fecha_inicial USING "yyyymmdd", + "' and a.fecha < '",(fecha_final + 1) using "yyyymmdd","' and b.nomina = 'Q' ", " GROUP BY a.num_emp,b.nom1_emp,b.apell1_emp,b.apell2_emp,d.sexo,b.cedula,b.fech_nac,a.departamento,a.num_emp,b.tipo_documento ", " ORDER BY a.departamento,a.num_emp " END IF @@ -197,7 +201,7 @@ DEFINE ptss RECORD LET cuenta = 0 IF tipo_reporte = 'NOR' THEN - FOREACH busca INTO ptss.* + FOREACH busca INTO ptss.ficha THRU ptss.departamento LET col = 2 LET fila = cnt @@ -240,7 +244,7 @@ DEFINE ptss RECORD LET col = 9 LET fila = cnt - LET val = ptss.fecha_n + LET val = ptss.fecha_n USING "dd/mm/yyyy" CALL enviaDDE(fila,col,val) LET col = 10 @@ -253,7 +257,7 @@ DEFINE ptss RECORD SELECT ISNULL(SUM(a.valor),0) INTO ptss.valor_isr FROM notb00008 a WHERE a.num_emp = ptss.ficha AND - a.fecha BETWEEN fecha_inicial AND fecha_final AND + a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND a.clase_mov IN ("E","I") and a.cod_mov not in (32,33) LET col = 12 @@ -267,7 +271,7 @@ DEFINE ptss RECORD SELECT ISNULL(SUM(a.valor),0) INTO valor_boni FROM notb00008 a WHERE a.num_emp = ptss.ficha AND - a.fecha BETWEEN fecha_inicial AND fecha_final AND + a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND a.clase_mov IN ("E","I") and a.cod_mov in (33) # VARIFICACION VACACIONES @@ -275,7 +279,7 @@ DEFINE ptss RECORD SELECT ISNULL(SUM(a.valor),0) INTO valor_vacaciones FROM notb00008 a WHERE a.num_emp = ptss.ficha AND - a.fecha BETWEEN fecha_inicial AND fecha_final AND + a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND a.clase_mov IN ("E","I") and a.cod_mov in (36) IF valor_vacaciones =0 THEN @@ -305,7 +309,7 @@ DEFINE ptss RECORD SELECT SUM(a.valor) INTO valor_boni FROM notb00008 a WHERE a.num_emp = ptss.ficha AND - a.fecha BETWEEN fecha_inicial AND fecha_final AND + a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND a.clase_mov IN ("E","I") and a.cod_mov in (32) @@ -333,7 +337,7 @@ DEFINE ptss RECORD ELSE #BONI CANCELADOS IF tipo_reporte = "BON1" THEN - FOREACH busca INTO ptss.* + FOREACH busca INTO ptss.ficha THRU ptss.departamento LET col = 2 LET fila = cnt @@ -368,7 +372,7 @@ DEFINE ptss RECORD LET col = 8 LET fila = cnt - LET val = ptss.fecha_n + LET val = ptss.fecha_n USING "dd/mm/yyyy" CALL enviaDDE(fila,col,val) LET col = 9 @@ -392,32 +396,82 @@ DEFINE ptss RECORD END IF - CALL fgl_winmessage("INFO","REPROTE TERMINADO","INFO") + CALL escribeCSV(tipo_reporte,periodo) RETURNING mensaje + CALL fgl_winmessage("INFO","REPORTE TERMINADO. ARCHIVO: "||mensaje,"INFO") +END FUNCTION + +-- Genero 6 (GDC 6.00) ya no incluye el modulo WINDDE: en lugar de llenar Excel +-- celda por celda, cada "celda" se guarda en memoria y al final se escribe un +-- CSV (separador ;) con las mismas filas y columnas de la plantilla de la TSS. +FUNCTION celda_key(xf,xc) + DEFINE xf,xc INTEGER + DEFINE sf,sc STRING + + LET sf = xf USING "<<<<<&" + LET sc = xc USING "<<<<<&" + RETURN sf || "," || sc END FUNCTION FUNCTION enviaDDE(xfila,xcol,xval) - DEFINE xfila,xcol,xval,xcelda STRING - - DISPLAY "enviado ",xfila," c ",xcol," v ",xval - - LET xcelda = fila_office CLIPPED,xfila CLIPPED,"C",xcol CLIPPED - DISPLAY "celda ",xcelda - LET xval=xval CLIPPED - CALL ui.Interface.frontCall("WINDDE","DDEPoke", [prog,file,xcelda,xval], [res] ); - CALL checkError(res) + DEFINE xfila,xcol INTEGER + DEFINE xval STRING + DEFINE k STRING + LET k = celda_key(xfila,xcol) + LET celdas[k] = xval CLIPPED + IF xfila > maxfila THEN LET maxfila = xfila END IF + IF xcol > maxcol THEN LET maxcol = xcol END IF END FUNCTION FUNCTION terminaDDE() - CALL ui.Interface.frontCall("WINDDE","DDEFinishAll", [], [res] ); - CALL checkError(res) - + CALL celdas.clear() + LET maxfila = 0 + LET maxcol = 0 END FUNCTION FUNCTION conectarDDE() - CALL ui.Interface.frontCall("WINDDE","DDEConnect", [prog,file], [res] ) - CALL checkError(res) + CALL celdas.clear() + LET maxfila = 0 + LET maxcol = 0 +END FUNCTION +-- Escribe las celdas acumuladas en FGLSPOOL/noprmt026__.csv +-- y devuelve la ruta del archivo. +FUNCTION escribeCSV(xtipo,xperiodo) + DEFINE xtipo,xperiodo STRING + DEFINE ch base.Channel + DEFINE ruta STRING + DEFINE f,c INTEGER + DEFINE lin base.StringBuffer + DEFINE k,v STRING + + LET ruta = FGL_GETENV("FGLSPOOL") + IF ruta IS NULL OR ruta.getLength() = 0 THEN LET ruta = "." END IF + LET ruta = ruta || "\\noprmt026_" || xtipo || "_" || xperiodo || ".csv" + + LET ch = base.Channel.create() + LET lin = base.StringBuffer.create() + CALL ch.openFile(ruta,"w") + FOR f = 1 TO maxfila + CALL lin.clear() + FOR c = 1 TO maxcol + LET k = celda_key(f,c) + IF celdas.contains(k) THEN + LET v = celdas[k] + IF v.getIndexOf(";",1) > 0 OR v.getIndexOf("\"",1) > 0 THEN + LET v = "\"" || v.trim() || "\"" + END IF + ELSE + LET v = "" + END IF + IF c > 1 THEN CALL lin.append(";") END IF + CALL lin.append(v) + END FOR + CALL ch.writeNoNL(lin.toString()) + CALL ch.writeNoNL("\r\n") + END FOR + CALL ch.close() + RETURN ruta END FUNCTION FUNCTION checkError(res)