{ --------------------------------------------------------------------------- PROGRAMA : NOPRMT026 OBJETIVO : PROCESO PARA EL PAGO DE LA TESORERIA DE LA SEGURIDAD SOCIAL PROGRAMADOR : Ing. JUAN SOTO FECHA REALIZACION : MAYO 31, 2005 --------------------------------------------------------------------------- } GLOBALS CONSTANT prog = "EXCEL" DEFINE rcol,arch_pc,prog STRING, p_res,no_registro INT,cuenta,xi,progreso,col SMALLINT, selec CHAR(1000), ciarnc CHAR(11), dir_file VARCHAR(60), fila_office varchar(1), d_tipos,mensaje,f_tipos,filepath,p_res,res,fila,val STRING DEFINE usuarios,clave CHAR(80), FILE,nombre_cia STRING, celdas DICTIONARY OF STRING, maxfila,maxcol INTEGER END GLOBALS MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL startlog("NORP26.txt") CONNECT to "smarmotech" USER usuarios USING clave SELECT a.rnc,a.nombre INTO ciarnc,nombre_cia FROM companias a DISPLAY "NOMBRE ",nombre_cia CALL pago_tss() END MAIN FUNCTION pago_tss() DEFINE ptss RECORD ficha INTEGER, nom1 CHAR(30), apell1 CHAR(30), apell2 CHAR(30), sexo VARCHAR, tipo_documento VARCHAR(50), cedula CHAR(11), fecha_n DATE, valor_tss DEC(12,2), departamento INT, valor_isr DEC(12,2) END RECORD, fecha_inicial,fecha_final,fecha_sig DATE, kano,kmes, cnt,numero_msg SMALLINT, cels CHAR(40), filename,sysos CHAR(200), archivo1 CHAR(125), periodo CHAR(6), valor_boni,valor_vacaciones DEC(12,2), idioma_office VARCHAR, tipo_reporte VARCHAR(10) OPTIONS FORM LINE 9, ERROR LINE 24 OPEN FORM nofmmt026 FROM "nofmmt026" DISPLAY FORM nofmmt026 INPUT BY NAME kano,kmes,idioma_office,tipo_reporte BEFORE INPUT CALL terminaDDE() ON ACTION abrir CALL ui.Interface.frontCall("standard","openfile", [dir_file,d_tipos,f_tipos,mensaje], [filepath] ) CALL ui.Interface.frontCall("standard","shellexec", [filepath], [p_res] ) AFTER FIELD kmes LET selec = "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 EXECUTE busca_fecha INTO fecha_inicial,fecha_final AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF IF tipo_reporte IS NULL THEN CALL msg(16) NEXT FIELD tipo_reporte END IF 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 CALL conectarDDE() IF idioma_office = "E" THEN LET fila_office = "F" ELSE LET fila_office = "R" END IF # CALL ui.Interface.frontCall("standard","getenv", ["USTSS"], [file] ) #LET arch_pc='"',file,'"' -- le agrega las comillas por si hay blancos (solo se necesita para shellexec) # LET arch_pc=FILE CLIPPED --PARA OFFICE 2010 en adelante no es necesario colocar las comillas. # CALL ui.Interface.frontCall("standard","shellexec", [arch_pc], [p_res] ) # CALL chqDdeError(p_res,"shellexec "||arch_pc) # CALL ui.Interface.frontCall("WINDDE","DDEConnect", [prog,file], [p_res] ) # CALL chqDdeError(p_res,"DDEConnect "||file) # CALL ui.Interface.refresh() # CALL fgl_winmessage("periodo",periodo,"stop") LET no_registro=1 IF tipo_reporte = "NOR" THEN LET col = 4 LET fila = 7 LET val = ciarnc CALL enviaDDE(fila,col,val) LET col = 4 LET fila = 8 LET val = periodo CALL enviaDDE(fila,col,val) LET cnt = 14 LET progreso = 5 DISPLAY progreso TO progreso 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,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 ", " c.ano ='",kano,"' AND b.num_emp = d.num_emp and ", " a.num_nomi = c.num_nomi and ",#" b.num_emp = 3355 and ", " a.tipo_emp = c.tipo_emp and ", " 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 ", " 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 IF tipo_reporte = "BON1" THEN LET col = 4 LET fila = 8 LET val = ciarnc CALL enviaDDE(fila,col,val) LET col = 4 LET fila = 9 LET val = periodo CALL enviaDDE(fila,col,val) LET progreso = 5 DISPLAY progreso TO progreso 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,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 ", " c.ano ='",kano,"' AND b.num_emp = d.num_emp and ", " a.num_nomi = c.num_nomi and ",#" b.num_emp = 3355 and ", " a.tipo_emp = c.tipo_emp and ", #" 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 ", " 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 END IF PREPARE comando FROM selec DECLARE busca CURSOR FOR comando LET cuenta = 0 IF tipo_reporte = 'NOR' THEN FOREACH busca INTO ptss.ficha THRU ptss.departamento LET col = 2 LET fila = cnt LET val = "001" CALL enviaDDE(fila,col,val) LET col = 3 LET fila = cnt IF ptss.tipo_documento = 'CEDULA' THEN LET val = "C" ELSE LET val = "P" END IF CALL enviaDDE(fila,col,val) LET col = 4 LET fila = cnt LET val = ptss.cedula CALL enviaDDE(fila,col,val) LET col = 5 LET fila = cnt LET val = ptss.nom1 CALL enviaDDE(fila,col,val) LET col = 6 LET fila = cnt LET val = ptss.apell1 CALL enviaDDE(fila,col,val) LET col = 7 LET fila = cnt LET val = ptss.apell2 CALL enviaDDE(fila,col,val) LET col = 8 LET fila = cnt LET val = ptss.sexo CALL enviaDDE(fila,col,val) LET col = 9 LET fila = cnt LET val = ptss.fecha_n USING "dd/mm/yyyy" CALL enviaDDE(fila,col,val) LET col = 10 LET fila = cnt LET val = ptss.valor_tss CALL enviaDDE(fila,col,val) LET ptss.valor_isr = 0 SELECT ISNULL(SUM(a.valor),0) INTO ptss.valor_isr FROM notb00008 a WHERE a.num_emp = ptss.ficha 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 LET fila = cnt LET val = ptss.valor_isr CALL enviaDDE(fila,col,val) # BONIFICACION LET valor_boni = 0 SELECT ISNULL(SUM(a.valor),0) INTO valor_boni FROM notb00008 a WHERE a.num_emp = ptss.ficha 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 LET valor_vacaciones = 0 SELECT ISNULL(SUM(a.valor),0) INTO valor_vacaciones FROM notb00008 a WHERE a.num_emp = ptss.ficha 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 LET col = 13 LET fila = cnt LET val = 'Normal' CALL enviaDDE(fila,col,val) ELSE LET col = 13 LET fila = cnt LET val = 'No laborĂ³ mes completo por razones varias' CALL enviaDDE(fila,col,val) END IF LET col = 14 LET fila = cnt LET val = valor_boni CALL enviaDDE(fila,col,val) LET col = 15 LET fila = cnt LET val = ciarnc CALL enviaDDE(fila,col,val) #REGALIA PASCUAL LET valor_boni = 0 SELECT SUM(a.valor) INTO valor_boni FROM notb00008 a WHERE a.num_emp = ptss.ficha AND a.fecha >= fecha_inicial AND a.fecha < fecha_sig AND a.clase_mov IN ("E","I") and a.cod_mov in (32) LET col = 18 LET fila = cnt LET val = valor_boni CALL enviaDDE(fila,col,val) LET col = 21 LET fila = cnt LET val = ptss.valor_tss USING "###,###.##" CALL enviaDDE(fila,col,val) LET cnt = cnt + 1 IF cuenta > 3 THEN LET cuenta = 0 LET progreso =progreso + 1 DISPLAY progreso TO progreso CALL ui.Interface.refresh() END IF DISPLAY BY NAME no_registro LET cuenta = cuenta + 1 LET no_registro = no_registro+1 END FOREACH ELSE #BONI CANCELADOS IF tipo_reporte = "BON1" THEN FOREACH busca INTO ptss.ficha THRU ptss.departamento LET col = 2 LET fila = cnt LET val = "001" CALL enviaDDE(fila,col,val) LET col = 3 LET fila = cnt LET val = ptss.cedula CALL enviaDDE(fila,col,val) LET col = 4 LET fila = cnt LET val = ptss.nom1 CALL enviaDDE(fila,col,val) LET col = 5 LET fila = cnt LET val = ptss.apell1 CALL enviaDDE(fila,col,val) LET col = 6 LET fila = cnt LET val = ptss.apell2 CALL enviaDDE(fila,col,val) LET col = 7 LET fila = cnt LET val = ptss.sexo CALL enviaDDE(fila,col,val) LET col = 8 LET fila = cnt LET val = ptss.fecha_n USING "dd/mm/yyyy" CALL enviaDDE(fila,col,val) LET col = 9 LET fila = cnt LET val = ptss.valor_tss CALL enviaDDE(fila,col,val) LET cnt = cnt + 1 IF cuenta > 3 THEN LET cuenta = 0 LET progreso =progreso + 1 DISPLAY progreso TO progreso CALL ui.Interface.refresh() END IF DISPLAY BY NAME no_registro LET cuenta = cuenta + 1 LET no_registro = no_registro+1 END FOREACH END IF END IF 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 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 celdas.clear() LET maxfila = 0 LET maxcol = 0 END FUNCTION FUNCTION conectarDDE() 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) DEFINE res INTEGER DEFINE mess STRING IF res THEN RETURN END IF DISPLAY "DDE Error:" CALL ui.Interface.frontCall("WINDDE","DDEError",[],[mess]); DISPLAY mess CALL ui.Interface.frontCall("WINDDE","DDEFinishAll", [], [res] ); DISPLAY "Exit with DDE Error." EXIT PROGRAM (-1) END FUNCTION