{ -------------------------------------------------------------------------------- PROGRAMA : cgprmt023 OBJETIVO : CREAR SOLICITUDES DE PAGOS PARA TRANSFERENCIAS BANCARIAS. FECHA DESARROLLO: 02/04/2024 DESARROLLADO POR: LUIS MIGUEL -------------------------------------------------------------------------------- } IMPORT util GLOBALS "cgprgb000.4gl" DEFINE usuario, clave VARCHAR(50), tt_pen,db,cr DEC(12,2),acceso,usada CHAR(2), us_crea CHAR(50),fech_crea DATETIME YEAR TO MINUTE , opt1 CHAR(3),pperfil,nivel INT DEFINE supl DYNAMIC ARRAY OF RECORD cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sp CHAR(100) END RECORD DEFINE solicitud RECORD numDoc INT, tipoSolicitud VARCHAR(50), fecha DATE, cod_sp SMALLINT, cod_sp_Sec INT, portador VARCHAR(100), codigo CHAR(10), cuenta_no1 VARCHAR(25), monto DECIMAL(18, 2), observacion STRING, autorizacion CHAR(2) END RECORD, cdoc1 DYNAMIC ARRAY OF RECORD num_doc3 INT, fecha DATE ,cuenta_no3 CHAR(19) ,cod_sp1 int ,cod_sp_sec1 int ,suplidor CHAR(100), tiposolicitud1 int ,monto DEC(12,2), usada CHAR(2) END RECORD, scr_l,curr,numero_msg INTEGER,selec CHAR(250) DEFINE SaldarDocs DYNAMIC ARRAY OF RECORD tipo VARCHAR(2), num_oc INT, num_doc CHAR(10), valor_pendiente DECIMAL(18, 2), valor_pagado DECIMAL(18, 2) END RECORD DEFINE CuentasAfectar DYNAMIC ARRAY OF RECORD cuenta_no VARCHAR(19), departamento INT, cod_aux SMALLINT, cod_sec SMALLINT, nom_cuenta VARCHAR(100), debito DECIMAL(18, 2), credito DECIMAL(18, 2) END RECORD DEFINE GlobalIdx INT DEFINE idx INT MAIN DEFER INTERRUPT CALL STARTLOG("CGPRMT037.TXT") CALL ARG_VAL(1) RETURNING usuario CALL ARG_VAL(2) RETURNING clave CONNECT TO "smarmotech" AS "MARMOTECH" USER usuario USING clave SELECT a.cod_perfil INTO pperfil FROM seg0001 a WHERE a.usuario = usuario CALL cgprmt037() END MAIN FUNCTION cgprmt037() # CALL fgl_settitle("SOLICITUD PAGO PROVEEDORES") OPEN WINDOW w1 WITH FORM "cgfmmt037" MENU ON ACTION adicionar CALL cgprad037() CLEAR FORM CLEAR record2.* CALL SaldarDocs.clear() CALL CuentasAfectar.clear() ON ACTION consulta_modifica CALL cgprmf037() ON ACTION salir EXIT MENU END MENU END FUNCTION FUNCTION cgprad037() INITIALIZE solicitud.* TO null INITIALIZE GlobalIdx TO NULL LET solicitud.fecha=today SELECT TOP(1) numDoc INTO GlobalIdx FROM cgtb00037 ORDER BY numDoc DESC IF GlobalIdx IS NULL THEN LET GlobalIdx = 1; ELSE LET GlobalIdx = GlobalIdx + 1; END IF LET solicitud.numDoc = GlobalIdx USING "&&&&&&" --999999 DOCUMENTS DIALOG ATTRIBUTES(unBUFFERED) INPUT BY NAME solicitud.* ATTRIBUTES (WITHOUT DEFAULTS) BEFORE INPUT LET solicitud.fecha =TODAY CALL busca_monedas() CALL cuenta("formonly.cuenta_no1") CALL solicitud() NEXT FIELD tipoSolicitud DISPLAY solicitud.cuenta_no1 ON ACTION suplidor CALL busca_suplidor() LET int_flag = FALSE IF solicitud.cod_sp_sec IS NULL OR solicitud.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME solicitud.cod_sp,solicitud.cod_sp_sec,solicitud.portador NEXT FIELD monto END IF AFTER FIELD tipoSolicitud CALL CuentasAfectar.clear() IF solicitud.tipoSolicitud IS NOT NULL THEN DECLARE buscara CURSOR FOR SELECT a.cuenta_no,a.descripcion FROM cptb00009 a WHERE a.status_t IS NULL AND a.tipo = solicitud.tipoSolicitud LET idx = 1 FOREACH buscara INTO CuentasAfectar[idx].cuenta_no,CuentasAfectar[idx].nom_cuenta DISPLAY CuentasAfectar[idx].cuenta_no LET idx = idx + 1 END FOREACH NEXT FIELD cod_sp ELSE NEXT FIELD tipoSolicitud END IF AFTER FIELD cod_sp NEXT FIELD cod_sp_Sec CALL solicitud() AFTER FIELD cod_sp_Sec IF solicitud.cod_sp_Sec IS NULL THEN NEXT FIELD portador ELSE IF solicitud.cod_sp IS NOT NULL AND solicitud.cod_sp_Sec IS NOT NULL THEN SELECT nom_sp INTO solicitud.portador FROM cotb00001 WHERE cod_sp = solicitud.cod_sp AND cod_sp_sec = solicitud.cod_sp_Sec IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_sp END IF END IF NEXT FIELD portador END IF AFTER FIELD portador NEXT FIELD codigo AFTER FIELD codigo NEXT FIELD cuenta_no1 AFTER FIELD cuenta_no1 NEXT FIELD monto AFTER FIELD monto NEXT FIELD observacion AFTER FIELD observacion AFTER INPUT IF solicitud.monto IS NULL OR solicitud.monto=0 THEN CALL fgl_winmessage("ERROR","MONTO NO PUEDE ESTAR VACIO NI VALOR 0","stop") NEXT FIELD monto END IF IF solicitud.cuenta_no1 IS NULL THEN CALL fgl_winmessage("errro","EL NUMERO DE CUENTA NO PUEDE QUEDARSE EN BLANCO","STOP") END IF END INPUT INPUT ARRAY SaldarDocs FROM SaldarDocs.* BEFORE INPUT LET curr = arr_curr() LET scr_l = scr_line() { IF solicitud.cod_sp IS NOT NULL AND solicitud.cod_sp_Sec IS NOT NULL THEN LABEL vuelta: PROMPT "Afecta Cuentas Por Pagar?(S/N) " FOR CHAR opcion LET opcion = upshift(opcion) IF opcion != "S" AND opcion != "N" THEN LET numero_msg = -1301 CALL msg(numero_msg) GOTO vuelta END IF IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF IF opcion = "N" THEN CALL SaldarDocs.clear() END IF IF opcion = "N" THEN EXIT INPUT END IF END IF } ON ACTION busca_aplicacion LET curr = arr_curr() LET scr_l = scr_line() ###### Proceso para abrir window en caso de desconocer el numero de orden ###### perteneciente a la factura que se aplicara el pago. CALL busca_aplicacion1(solicitud.cod_sp,solicitud.cod_sp_Sec) RETURNING SaldarDocs[curr].num_doc,SaldarDocs[curr].valor_pendiente IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false NEXT FIELD num_doc END IF AFTER FIELD num_oc IF SaldarDocs[curr].num_oc != 999999 THEN #IS NOT NULL THEN IF solicitud.cod_sp IS NULL THEN ##### Chequeando que el numero de orden a digitar exista en la maestra de pago[ SELECT UNIQUE a.tipo,a.orden_no,a.cod_sp,a.cod_sp_sec INTO p_tipo,p_orden,solicitud.cod_sp,solicitud.cod_sp_sec FROM cptb00001 a WHERE a.tipo = SaldarDocs[curr].tipo AND a.orden_no = SaldarDocs[curr].num_oc IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo END IF ELSE ###### Chequeando que el numero de orden exista en la maestra de orden SELECT b.num_oc FROM cotb00014 b WHERE b.tipo = SaldarDocs[curr].tipo AND b.num_oc = SaldarDocs[curr].num_oc AND b.cod_sp = solicitud.cod_sp AND b.cod_sp_sec = solicitud.cod_sp_sec IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo END IF END IF END IF AFTER FIELD num_doc SELECT a.aplica_a,SUM(a.valor) INTO SaldarDocs[curr].num_doc,SaldarDocs[curr].valor_pendiente FROM cptb00001 a WHERE a.cod_sp = solicitud.cod_sp AND a.cod_sp_sec = solicitud.cod_sp_sec AND a.status_t IS NULL AND a.aplica_a =SaldarDocs[curr].num_doc GROUP BY aplica_a HAVING SUM(a.valor) != 0 ORDER BY 1 IF status = notfound THEN LET numero_msg = 126 CALL msg(numero_msg) NEXT FIELD num_doc END IF DISPLAY SaldarDocs[curr].num_doc TO SaldarDocs[scr_l].num_doc DISPLAY SaldarDocs[curr].valor_pendiente TO SaldarDocs[scr_l].valor_pendiente AFTER FIELD valor_pagado IF saldardocs[curr].valor_pagado>saldardocs[curr].valor_pendiente THEN CALL fgl_winmessage("error","Valor Pagado No Puede ser Mayor Al Valor Pendiente","stop") NEXT FIELD valor_pagado END IF AFTER INPUT LET curr = arr_curr() LET scr_l = scr_line() LET tt_pen=0 FOR idx=1 TO SaldarDocs.getLength() LET tt_pen=tt_pen+SaldarDocs[curr].valor_pagado DISPLAY tt_pen END FOR IF tt_pensolicitud.monto THEN DISPLAY "menor",tt_pen CALL fgl_winmessage("error ","Valor Pagado es Mayor al Monto Solicitud","stop") NEXT FIELD valor_pagado END IF END INPUT INPUT ARRAY CuentasAfectar FROM CuentasAfectar.* BEFORE INPUT LET curr = arr_curr() LET scr_l = scr_line() ON ACTION bcuenta CALL busca_cuenta() RETURNING CuentasAfectar[curr].cuenta_no,CuentasAfectar[curr].nom_cuenta DISPLAY CuentasAfectar[curr].cuenta_no TO CuentasAfectar[scr_l].cuenta_no DISPLAY CuentasAfectar[curr].nom_cuenta TO CuentasAfectar[scr_l].nom_cuenta AFTER FIELD cuenta_no LET curr = arr_curr() LET scr_l = scr_line() IF CuentasAfectar[curr].cuenta_no IS NOT NULL THEN SELECT a.descripcion,a.nivel INTO CuentasAfectar[curr].nom_cuenta,nivel FROM cgtb00001 a WHERE a.cuenta_no=CuentasAfectar[curr].cuenta_no AND status_t IS NULL IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF IF nivel < 3 THEN LET numero_msg = 175 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF END IF DISPLAY CuentasAfectar[curr].nom_cuenta TO CuentasAfectar[scr_l].nom_cuenta AFTER INPUT END INPUT ON ACTION guardar LET valor=0 LET monto=0 LET remanente=0 FOR idx=1 TO CuentasAfectar.getLength() IF CuentasAfectar[idx].debito IS NULL THEN LET CuentasAfectar[idx].debito =0 END IF IF CuentasAfectar[idx].credito IS NULL THEN LET CuentasAfectar[idx].credito =0 END IF LET valor = valor + CuentasAfectar[idx].debito LET monto = CuentasAfectar[idx].credito + monto END FOR LET db=valor LET cr=monto LET monto = valor - monto LET remanente=monto-solicitud.monto DISPLAY BY NAME db,cr,remanente DISPLAY "monto",monto IF monto != solicitud.monto THEN LET numero_msg = 178 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF IF solicitud.numDoc IS NULL OR solicitud.numDoc=1 THEN DISPLAY "num",solicitud.numDoc LET solicitud.numDoc =1 INSERT INTO cgtb00037 (numdoc,us_crea,fech_crea) VALUES(solicitud.numDoc,usuario,getdate()) DISPLAY "num1",solicitud.numDoc ELSE #LET solicitud.numDoc=solicitud.numDoc+1 UPDATE cgtb00037 SET numdoc=solicitud.numDoc, us_mod=usuario, fech_mod=getdate() END IF BEGIN WORK INSERT INTO cgtb00040 (numdoc,cuenta_no,tipo_solicitud,monto,cod_sp,cod_sp_Sec,portador,observacion,moneda,us_crea,fech_crea,autorizar,fecha,usada) VALUES(solicitud.numDoc,solicitud.cuenta_no1,solicitud.tipoSolicitud,solicitud.monto,solicitud.cod_sp,solicitud.cod_sp_Sec, solicitud.portador,solicitud.observacion,solicitud.codigo,usuario,getdate(),solicitud.autorizacion,solicitud.fecha,"N") FOR idx=1 TO SaldarDocs.getLength() IF SaldarDocs[idx].num_doc IS NOT NULL THEN INSERT INTO cgtb00039 (numdoc,tipo,num_oc,num_doc,valor_pendiente,valor_pagado,us_crea,fech_Crea) VALUES(Solicitud.numDoc,SaldarDocs[idx].tipo,SaldarDocs[idx].num_oc,SaldarDocs[idx].num_doc,SaldarDocs[idx].valor_pendiente, SaldarDocs[idx].valor_pagado,usuario,getdate()) END IF END FOR FOR idx=1 TO CuentasAfectar.getLength() IF CuentasAfectar[idx].cuenta_no is NOT NULL THEN INSERT INTO cgtb00041 (numdoc,cuenta_no,departamento,id_auxiliar,cod_sec,nom_cuenta,debito,credito,us_crea,fech_crea) VALUES(solicitud.numDoc,CuentasAfectar[idx].cuenta_no,CuentasAfectar[idx].departamento,CuentasAfectar[idx].cod_aux,CuentasAfectar[idx].cod_sec, CuentasAfectar[idx].nom_cuenta,CuentasAfectar[idx].debito,CuentasAfectar[idx].credito,usuario,getdate()) END IF END FOR IF status<0 THEN ROLLBACK WORK CALL fgl_winmessage("error","NO SE PUDO INSERTAR LA DATA","STOP") ELSE COMMIT WORK LET r_filename ="cgprmt037.4rp" LET r_output = "SVG" #LET preview = 1 -- configure report engine; the functions prefixed fgl that are called here are part of the GRW API IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default CALL fgl_report_selectPreview(true) LET handler = fgl_report_commitCurrentSettings() -- commit changes ELSE EXIT PROGRAM END IF START REPORT solicitud1 TO XML HANDLER handler FOR idx = 1 TO CuentasAfectar.getLength() IF CuentasAfectar[idx].cuenta_no IS NOT NULL THEN OUTPUT TO REPORT solicitud1(solicitud.numdoc, CuentasAfectar[idx].cuenta_no,CuentasAfectar[idx].departamento, CuentasAfectar[idx].cod_aux,CuentasAfectar[idx].cod_sec,CuentasAfectar[idx].nom_cuenta,CuentasAfectar[idx].debito, CuentasAfectar[idx].credito,solicitud.observacion) END IF END FOR FINISH REPORT solicitud1 LET numero_msg = 13 CALL msg(numero_msg) CLEAR FORM RETURN END IF ON ACTION CANCEL LET int_flag = FALSE CLEAR FORM EXIT DIALOG BEFORE DIALOG CALL seg000(usuario,pperfil,'autoriza.cgprmt037') RETURNING acceso DISPLAY "usuario ",usuario," ",pperfil IF acceso = "SI" THEN CALL dialog.setFieldActive("autorizacion", TRUE ) ELSE CALL DIALOG.setFieldActive("autorizacion",false) END IF END DIALOG END FUNCTION FUNCTION cuenta(cuentaForm) DEFINE kcuenta VARCHAR(20), kdescripcion CHAR(80), cuenta_no ui.ComboBox, cuentaForm STRING { IF flag THEN LET cuentaForm = "formonly.cuenta_no" ELSE LET cuentaForm = "cuenta_no1" END IF} LET cuenta_no = ui.combobox.forname(cuentaForm) DECLARE busca_cuenta CURSOR FOR SELECT RTRIM(a.cuenta_no), '(' + RTRIM(a.cuenta_no) + ')'+ RTRIM(a.descripcion) FROM cgtb00001 a WHERE a.status_t IS NULL AND a.banco='SI' ORDER BY a.descripcion CALL cuenta_no.clear() FOREACH busca_cuenta INTO kcuenta, kdescripcion CALL cuenta_no.additem(kcuenta, kdescripcion) END FOREACH END FUNCTION FUNCTION busca_aplicacion1(pcod,pcodsec) DEFINE pcod,pcodsec INT OPEN WINDOW busqueda1 AT 10,10 WITH FORM "cgfmwd006" ATTRIBUTE (BORDER,FORM LINE FIRST + 1, comment line last) LET selec = "SELECT a.aplica_a,SUM(a.valor) FROM cptb00001 a ", "WHERE a.cod_sp = ? AND a.cod_sp_sec = ? AND ", " a.status_t IS NULL AND a.aplica_a IS NOT NULL ", "GROUP BY aplica_a HAVING SUM(a.valor) != 0 ORDER BY 1" PREPARE comando1 FROM selec DECLARE aplicar CURSOR FOR comando1 OPEN aplicar USING pcod,pcodsec LET existe = "N" LET idx = 1 WHILE STATUS != NOTFOUND FETCH aplicar INTO aplica_wd[idx].* IF STATUS = NOTFOUND THEN EXIT WHILE END IF LET aplica_wd[idx].pendiente = aplica_wd[idx].pendiente #* -1 LET existe = "S" LET idx = idx + 1 END WHILE IF existe = "N" AND idx = 1 THEN LET numero_msg = 127 CALL msg(numero_msg) GOTO salir END IF CALL SET_COUNT(idx-1) DISPLAY ARRAY aplica_wd TO consart.* LET curr1 = arr_curr() LET SaldarDocs[curr].num_doc = aplica_wd[curr].aplica_a LET SaldarDocs[curr].valor_pendiente = aplica_wd[curr].pendiente LABEL salir: CLOSE WINDOW busqueda1 RETURN SaldarDocs[curr].num_doc,SaldarDocs[curr].valor_pendiente END FUNCTION FUNCTION cgprmf037() CLEAR FORM DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM ) CONSTRUCT criterio ON a.numdoc,a.cuenta_no FROM numdoc1,cuenta_no2 BEFORE CONSTRUCT AFTER CONSTRUCT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF END CONSTRUCT ON ACTION buscar CALL cdoc1.clear() LET curr=arr_curr() LET SELEC = " SELECT UNIQUE a.numdoc,a.fecha,a.cuenta_no,a.cod_sp,a.cod_sp_sec, portador,a.tipo_solicitud,a.monto,a.usada FROM cgtb00040 a WHERE a.status_t is null and ", criterio clipped, " ORDER BY a.numdoc asc" PREPARE busca FROM selec DECLARE datos SCROLL CURSOR WITH HOLD FOR busca LET idx=1 FOREACH datos INTO cdoc1[idx].num_doc3,cdoc1[idx].fecha,cdoc1[idx].cuenta_no3,cdoc1[idx].cod_sp1 ,cdoc1[idx].cod_sp_sec1,cdoc1[idx].suplidor,cdoc1[idx].tiposolicitud1,cdoc1[idx].monto,cdoc1[idx].usada LET idx=idx+1 END FOREACH IF idx=1 THEN CALL FGL_winmessage("error","NO HAY REGISTROS CON ESA CONDICION","STOP") EXIT DIALOG END IF DISPLAY ARRAY cdoc1 TO cdoc.* BEFORE ROW ON ACTION Escoger LET curr=arr_curr() LET scr_l = scr_line() SELECT a.usada INTO usada FROM cgtb00040 a WHERE a.numdoc=cdoc1[curr].num_doc3 IF cdoc1[curr].usada ="N" OR cdoc1[curr].usada IS NULL THEN LET solicitud.numDoc=cdoc1[curr].num_doc3 IF cdoc1[curr].num_doc3 IS NOT NULL THEN LET selec1 = " SELECT a.tipo,a.num_oc,a.num_doc,a.valor_pagado ", "FROM cgtb00039 a ", "WHERE a.numdoc=",cdoc1[curr].num_doc3," and status_t is null " PREPARE comand4 FROM selec1 DECLARE busca1 CURSOR FOR comand4 LET idx=1 FOREACH busca1 INTO SaldarDocs[idx].tipo,SaldarDocs[idx].num_oc, SaldarDocs[idx].num_doc,SaldarDocs[idx].valor_pagado DISPLAY SaldarDocs[idx].num_doc TO SaldarDocs[idx].num_doc DISPLAY SaldarDocs[idx].num_oc TO SaldarDocs[idx].num_oc DISPLAY SaldarDocs[idx].tipo TO SaldarDocs[idx].tipo DISPLAY SaldarDocs[idx].valor_pagado TO SaldarDocs[idx].valor_pagado LET idx=idx=1 END FOREACH LET selec1 = " SELECT a.cuenta_no,a.departamento,a.id_auxiliar,a.cod_sec,a.nom_cuenta,a.debito,a.credito ", "FROM cgtb00041 a ", "WHERE a.numdoc=",cdoc1[curr].num_doc3," and status_t is null " PREPARE comand5 FROM selec1 DECLARE busca2 CURSOR FOR comand5 LET idx=1 FOREACH busca2 INTO CuentasAfectar[idx].cuenta_no,CuentasAfectar[idx].departamento, CuentasAfectar[idx].cod_aux,CuentasAfectar[idx].cod_sec,CuentasAfectar[idx].nom_cuenta,CuentasAfectar[idx].debito, CuentasAfectar[idx].credito DISPLAY CuentasAfectar[idx].cod_aux TO CuentasAfectar[idx].cod_aux DISPLAY CuentasAfectar[idx].cod_sec TO CuentasAfectar[idx].cod_sec DISPLAY CuentasAfectar[idx].credito TO CuentasAfectar[idx].credito DISPLAY CuentasAfectar[idx].debito TO CuentasAfectar[idx].debito DISPLAY CuentasAfectar[idx].cuenta_no TO CuentasAfectar[idx].cuenta_no DISPLAY CuentasAfectar[idx].departamento TO CuentasAfectar[idx].departamento DISPLAY CuentasAfectar[idx].nom_cuenta TO CuentasAfectar[idx].nom_cuenta LET idx=idx+1 END FOREACH END IF CALL actualizar() ELSE CALL fgl_winmessage("ERROR","Solicitud Se Le Hizo Transferencia","STOP") END IF ON ACTION eLiminar LET curr=arr_curr() LET OPT1 = FGL_WINQUESTION("WARNING","ESTA SEGURO DE ELIMINAR ESTE REGISTRO?","NO","YES|NO","QUESTION",0) IF OPT1 = "YES" THEN UPDATE cgtb00040 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE @numdoc=cdoc1[curr].num_doc3 UPDATE cgtb00039 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE @numdoc=cdoc1[curr].num_doc3 UPDATE cgtb00041 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE @numdoc=cdoc1[curr].num_doc3 LET numero_msg = 39 CALL msg(numero_msg) END IF END DISPLAY ON ACTION CANCEL LET int_flag= FALSE call cdoc1.clear() CLEAR FORM EXIT DIALOG END DIALOG END FUNCTION FUNCTION actualizar() DEFINE num_doc1 INT DEFINE cuenta_no2 CHAR(19) DIALOG ATTRIBUTES (UNBUFFERED,FIELD ORDER FORM ) INPUT BY NAME solicitud.* ATTRIBUTES (WITHOUT DEFAULTS) BEFORE INPUT LET scr_l = scr_line() LET idx = arr_curr() CALL cuenta("formonly.cuenta_no1") CALL solicitud() LET selec= "SELECT a.numdoc,a.cuenta_no,a.fecha,a.tipo_solicitud,a.monto,a.cod_sp,a.cod_sp_Sec,a.portador, ", "a.observacion,a.moneda,a.autorizar", " FROM cgtb00040 a ", " WHERE a.numdoc=", cdoc1[idx].num_doc3," and a.status_t is null", " ORDER BY a.numdoc" PREPARE comando FROM selec DECLARE accion5 SCROLL CURSOR FOR comando OPEN accion5 FETCH FIRST accion5 INTO solicitud.numDoc,solicitud.cuenta_no1,solicitud.fecha,solicitud.tipoSolicitud,solicitud.monto, solicitud.cod_sp,solicitud.cod_sp_Sec,solicitud.portador,solicitud.observacion,solicitud.codigo,solicitud.autorizacion AFTER FIELD cod_sp NEXT FIELD cod_sp_Sec AFTER FIELD cod_sp_Sec IF solicitud.cod_sp_Sec IS NULL THEN NEXT FIELD portador ELSE IF solicitud.cod_sp IS NOT NULL AND solicitud.cod_sp_Sec IS NOT NULL THEN SELECT nom_sp INTO solicitud.portador FROM cotb00001 WHERE cod_sp = solicitud.cod_sp AND cod_sp_sec = solicitud.cod_sp_Sec IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_sp END IF END IF NEXT FIELD portador END IF END INPUT INPUT ARRAY SaldarDocs FROM SaldarDocs.* ATTRIBUTE(WITHOUT DEFAULTS) BEFORE INPUT ON ACTION busca_aplicacion LET curr = arr_curr() LET scr_l = scr_line() ###### Proceso para abrir window en caso de desconocer el numero de orden ###### perteneciente a la factura que se aplicara el pago. CALL busca_aplicacion1(solicitud.cod_sp,solicitud.cod_sp_Sec) RETURNING SaldarDocs[curr].num_doc,SaldarDocs[curr].valor_pendiente IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false NEXT FIELD num_doc END IF AFTER FIELD num_oc IF SaldarDocs[curr].num_oc != 999999 THEN #IS NOT NULL THEN IF solicitud.cod_sp IS NULL THEN ##### Chequeando que el numero de orden a digitar exista en la maestra de pago[ SELECT UNIQUE a.tipo,a.orden_no,a.cod_sp,a.cod_sp_sec INTO p_tipo,p_orden,solicitud.cod_sp,solicitud.cod_sp_sec FROM cptb00001 a WHERE a.tipo = SaldarDocs[curr].tipo AND a.orden_no = SaldarDocs[curr].num_oc IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo END IF ELSE ###### Chequeando que el numero de orden exista en la maestra de orden SELECT b.num_oc FROM cotb00014 b WHERE b.tipo = SaldarDocs[curr].tipo AND b.num_oc = SaldarDocs[curr].num_oc AND b.cod_sp = solicitud.cod_sp AND b.cod_sp_sec = solicitud.cod_sp_sec IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo END IF END IF END IF AFTER FIELD num_doc SELECT a.aplica_a,SUM(a.valor) INTO SaldarDocs[curr].num_doc,SaldarDocs[curr].valor_pendiente FROM cptb00001 a WHERE a.cod_sp = solicitud.cod_sp AND a.cod_sp_sec = solicitud.cod_sp_sec AND a.status_t IS NULL AND a.aplica_a =SaldarDocs[curr].num_doc GROUP BY aplica_a HAVING SUM(a.valor) != 0 ORDER BY 1 IF status = notfound THEN LET numero_msg = 126 CALL msg(numero_msg) NEXT FIELD num_doc END IF DISPLAY SaldarDocs[curr].num_doc TO SaldarDocs[scr_l].num_doc DISPLAY SaldarDocs[curr].valor_pendiente TO SaldarDocs[scr_l].valor_pendiente AFTER FIELD valor_pagado IF saldardocs[curr].valor_pagado>saldardocs[curr].valor_pendiente THEN CALL fgl_winmessage("error","Valor Pagado No Puede ser Mayor Al Valor Pendiente","stop") NEXT FIELD valor_pagado END IF AFTER INPUT LET curr = arr_curr() LET scr_l = scr_line() LET tt_pen=0 FOR idx=1 TO SaldarDocs.getLength() LET tt_pen=tt_pen+SaldarDocs[curr].valor_pagado DISPLAY tt_pen END FOR IF tt_pensolicitud.monto THEN DISPLAY "menor",tt_pen CALL fgl_winmessage("error ","Valor Pagado es Mayor al Monto Solicitud","stop") NEXT FIELD valor_pagado END IF END INPUT ON ACTION imprimir LET r_filename ="cgprmt037.4rp" LET r_output = "SVG" IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default CALL fgl_report_selectPreview(true) LET handler = fgl_report_commitCurrentSettings() -- commit changes ELSE EXIT PROGRAM END IF START REPORT solicitud1 TO XML HANDLER handler FOR idx = 1 TO CuentasAfectar.getLength() IF CuentasAfectar[idx].cuenta_no IS NOT NULL THEN OUTPUT TO REPORT solicitud1(solicitud.numdoc, CuentasAfectar[idx].cuenta_no,CuentasAfectar[idx].departamento, CuentasAfectar[idx].cod_aux,CuentasAfectar[idx].cod_sec,CuentasAfectar[idx].nom_cuenta,CuentasAfectar[idx].debito, CuentasAfectar[idx].credito,solicitud.observacion) END IF END FOR FINISH REPORT solicitud1 ON ACTION guardar BEGIN WORK SELECT a.us_crea,a.fech_crea INTO us_crea,fech_crea FROM cgtb00040 WHERE a.numdoc=solicitud.numDoc UPDATE cgtb00040 SET cuenta_no=solicitud.cuenta_no1,fecha=solcitud.fecha,tipo_solcitud=solicitud.tipoSolicitud, monto=solicitud.monto,cod_sp=solicitud.cod_sp,cod_sp_sec=solicitud.cod_sp_Sec,portador=solicitud.portador, observacion=solicitud.observacion,moneda=solicitud.codigo,autorizar=solicitud.autorizacion,us_mod=usuario,fech_mod=getdate() WHERE numdoc=solicitud.numDoc FOR idx=1 TO SaldarDocs.getLength() IF SaldarDocs[idx].num_doc IS NOT NULL THEN DELETE FROM cgtb00039 WHERE numdoc=solicitud.numDoc INSERT INTO cgtb00039 (tipo,num_oc,num_doc,valor_pagado,us_crea,fech_crea,us_mod,fech_mod) VALUES (SaldarDocs[idx].tipo,SaldarDocs[idx].num_oc,SaldarDocs[idx].num_doc,SaldarDocs[idx].valor_pagado, us_crea,fech_crea,usuario,getdate()) END IF END FOR FOR idx=1 TO CuentasAfectar.getLength() IF CuentasAfectar[idx].cuenta_no IS NOT NULL THEN DELETE FROM cgtb00041 WHERE numdoc=solicitud.numDoc INSERT INTO cgtb00041 (cuenta_no,departamento,id_auxiliar,cod_sec,nom_cuenta,debito,credito,us_crea,fech_crea,us_mod,fech_mod) VALUES(CuentasAfectar[idx].cuenta_no,CuentasAfectar[idx].departamento,CuentasAfectar[idx].cod_aux, CuentasAfectar[idx].cod_sec,CuentasAfectar[idx].nom_cuenta,CuentasAfectar[idx].debito,CuentasAfectar[idx].credito, us_crea,fech_crea,usuario,getdate()) END IF END FOR IF status<0 THEN ROLLBACK WORK CALL fgl_winmessage("error","NO SE PUDO ACTUALIZAR LA DATA","STOP") ELSE COMMIT WORK LET r_filename ="cgprmt037.4rp" LET r_output = "SVG" IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default CALL fgl_report_selectPreview(true) LET handler = fgl_report_commitCurrentSettings() -- commit changes ELSE EXIT PROGRAM END IF START REPORT solicitud1 TO XML HANDLER handler DISPLAY "report" FOR idx = 1 TO CuentasAfectar.getLength() IF CuentasAfectar[idx].cuenta_no IS NOT NULL THEN OUTPUT TO REPORT solicitud1(solicitud.numdoc, CuentasAfectar[idx].cuenta_no,CuentasAfectar[idx].departamento, CuentasAfectar[idx].cod_aux,CuentasAfectar[idx].cod_sec,CuentasAfectar[idx].nom_cuenta,CuentasAfectar[idx].debito, CuentasAfectar[idx].credito,solicitud.observacion) END IF END FOR FINISH REPORT solicitud1 LET numero_msg = 13 CALL msg(numero_msg) CLEAR FORM RETURN END IF ON ACTION CANCEL LET int_flag = FALSE CLEAR FORM EXIT DIALOG BEFORE DIALOG CALL seg000(usuario,pperfil,'autoriza.cgprmt037') RETURNING acceso DISPLAY "usuario ",usuario," ",pperfil IF acceso = "SI" THEN CALL dialog.setFieldActive("autorizacion", TRUE ) ELSE CALL DIALOG.setFieldActive("autorizacion",false) END IF END DIALOG END FUNCTION REPORT solicitud1(x) DEFINE x RECORD numdoc INT, cuenta_no VARCHAR(19), departamento INT, cod_aux SMALLINT, cod_sec SMALLINT, nom_cuenta VARCHAR(100), debito DECIMAL(18, 2), credito DECIMAL(18, 2), xcomentario CHAR(150) END RECORD DEFINE t_debito,t_credito,total_aplica DECIMAL(12,2), total_registro SMALLINT, fecha CHAR(40) ORDER BY x.numdoc FORMAT FIRST PAGE HEADER LET total_registro = 0 LET t_debito = 0 LET t_credito = 0 LET fecha = TODAY USING "dd/mm/yyyy",":",TIME SELECT a.nombre INTO p_compania.nombre FROM companias a ON EVERY ROW LET t_credito = t_credito + x.credito LET t_debito = t_debito + x.debito LET total_registro = total_registro + 1 PRINTX x.*,p_compania.nombre,solicitud.*, fecha,total_registro,t_credito,t_debito AFTER GROUP OF x.numdoc LET total_aplica = 0 FOR idx = 1 TO SaldarDocs.getLength() LET total_aplica = total_aplica + SaldarDocs[idx].valor_pagado PRINTX SaldarDocs[idx].num_doc,SaldarDocs[idx].num_oc,SaldarDocs[idx].tipo,SaldarDocs[idx].valor_pagado END FOR PRINTX total_aplica END REPORT #### Busqueda de datos generales referente a un suplidor FUNCTION busca_suplidor() LET int_flag = FALSE OPEN WINDOW busca_sp AT 10,3 WITH FORM "cpfmwd001" ATTRIBUTE(BORDER,FORM LINE FIRST + 2,COMMENT LINE LAST) CONSTRUCT criterio ON a.nom_sp FROM nom_sp IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLOSE WINDOW busca_sp RETURN END IF LET selec = "SELECT a.cod_sp,a.cod_sp_sec,a.nom_sp FROM cotb00001 a ", "WHERE a.status_t IS NULL AND ",criterio CLIPPED," ORDER BY 3 " PREPARE comando3 FROM selec DECLARE busc CURSOR FOR comando3 LET idx = 1 FOREACH busc INTO supl[idx].* LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx -1) DISPLAY ARRAY supl TO s_suplid.* LET curr = ARR_CURR() LET solicitud.cod_sp = supl[curr].cod_sp LET solicitud.cod_sp_sec = supl[curr].cod_sp_sec LET solicitud.portador = supl[curr].nom_sp CLOSE WINDOW busca_sp END FUNCTION FUNCTION busca_monedas() DEFINE pmoneda ui.combobox, kmoneda SMALLINT,kdescripcion CHAR(30) DECLARE moneda CURSOR FOR SELECT a.cod_mon,a.descrip_mon FROM cotb00031 a WHERE a.status_t is null ORDER BY a.descrip_mon LET pmoneda = ui.combobox.forname("formonly.codigo") CALL pmoneda.clear() FOREACH moneda INTO kmoneda,kdescripcion CALL pmoneda.additem(kmoneda,kdescripcion) END FOREACH END FUNCTION