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)