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_<tipo>_
  <periodo>.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 <noreply@anthropic.com>
This commit is contained in:
Abel López
2026-10-16 16:47:15 -04:00
co-authored by Claude Sonnet 5.5
parent fc5a23132d
commit 70c3131e9c
2 changed files with 91 additions and 32 deletions
+5
View File
@@ -783,6 +783,7 @@
<File filePath="nodir/nofmrp015.per"/>
<File filePath="nodir/nofmrp045.per"/>
<File filePath="nodir/nofmrp041.4fd"/>
<File filePath="nodir/nofmmt026.4fd"/>
</Library>
<Library binaryName="FUNCIONES_NO" id="-306412216" label="FUNCIONES_NO">
<File filePath="nodir/noprgb000.4gl"/>
@@ -899,6 +900,10 @@
<File filePath="nodir/noprrp041.4gl"/>
<File filePath="bin/noprrp041.4rp"/>
</Application>
<Application binaryName="noprmt026" dependencies="-1026233879,-764824792,-306412216,-335228674" environment="dir:FGLSPOOL=$(ProjectDir)/spool" id="-700000097" label="noprmt026">
<Configuration commandLineArguments="alopez Lopez2023" id="-700000098" label="Configuration"/>
<File filePath="nodir/noprmt026.4gl"/>
</Application>
</Group>
</Group>
<Group id="-802694369" label="REPORTE ENTRADA">
+86 -32
View File
@@ -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_<tipo>_<periodo>.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)