{ ------------------------------------------------------------------------------- PROGRAMA : CCPRRP052 OBJETIVO : Estado de Cuentas de Clientes a una fecha especifica tomando en cuenta el historial de debitos y creditos PROGRAMADOR : Ing. Juan F. Soto FECHA REALIZACION : Mayo 27, 2019 ------------------------------------------------------------------------------- } GLOBALS "ccprgb000.4gl" DEFINE prima DECIMAL(10,2) ## Variable que equivale a la prima de otra moneda DEFINE fecha_inicial,fecha_final DATE ## Varible busqueda por fecha de corte DEFINE selec5 STRING ## Variables para almacenar busquedas DEFINE tipo1 CHAR(2) DEFINE handler om.SaxDocumentHandler, -- return value from fgl_report_commitCurrentSettings() r_filename STRING, -- filename of Report Design Document including .4rp extension r_output STRING, -- output format option preview INTEGER -- TRUE/FALSE, to set preview option ####### Variables para desplegar resultados por pantalla ante de la impresion ##### Registro que almacena la infoprmacion a imprimir #### DEFINE mvtos1 RECORD tipo_cliente SMALLINT, sec_cliente SMALLINT, nombre CHAR(30), limite DECIMAL(12,2), num_rnc CHAR(10), zona SMALLINT, num_doc INTEGER, aplica_a INTEGER, tipo CHAR(2), fecha DATE, valor DECIMAL(10,2), cotizacion_no INT, cliente CHAR(20), orden INT END RECORD, valor2,balance DEC(12,2), borden INT, psimbolo CHAR(3), xcotizacion,xorden INT MAIN DEFER INTERRUPT CALL STARTLOG("ccprrp052.log") CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT to "smarmotech" USER usuarios USING clave CALL ccprrp052() END MAIN FUNCTION ccprrp052() OPTIONS FORM LINE 8, ERROR LINE 23, COMMENT LINE 21 ####### Abriendo y desplegando formulario de captura de datos OPEN FORM ccfmrp052 FROM "ccfmrp052" DISPLAY FORM ccfmrp052 #CALL pantalla() DISPLAY "ccprrp052" AT 4,3 DISPLAY "Estado de Cuentas clientes 23 y 24" AT 6,31 ##### Creando el criterio de busqueda DIALOG ATTRIBUTE (FIELD ORDER FORM, UNBUFFERED) CONSTRUCT criterio ON a.tipo_cliente,a.sec_cliente FROM tipo_cliente, sec_cliente END CONSTRUCT ##### Aceptando la fecha de corte para busqueda de informacion INPUT BY NAME prima,fecha_inicial,fecha_final,borden,salida BEFORE INPUT LET prima =1 DISPLAY BY NAME prima AFTER FIELD fecha_inicial IF fecha_inicial is null OR fecha_inicial > fecha_final THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_inicial END IF AFTER FIELD borden IF borden IS NOT NULL THEN SELECT a.num_oc FROM prtb00012 a WHERE a.num_oc = borden AND a.status_t IS NULL IF STATUS <> NOTFOUND THEN CALL fgl_winmessage("INFO","ORDEN NO EXISTE","INFO") NEXT FIELD borden END IF END IF BEFORE FIELD fecha_final LET fecha_final = today AFTER FIELD fecha_final IF fecha_final is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_final END IF ON ACTION busca_informacion # Busca los documentos que esten en el rango de fechas especificado LET progreso = 20 DISPLAY progreso TO progreso CALL ui.Interface.refresh() LET idx = 1 LET r_filename = 'ccprrp052.4rp' IF prima IS NULL THEN LET prima = 1 END IF LET imprime = "NO" LET selec5 = "SELECT a.tipo_cliente,a.sec_cliente,a.nombre,a.limite_credito,a.num_rnc,a.cod_zona ", " FROM vetb00004 a WHERE a.status_t IS NULL AND ",criterio CLIPPED, " AND a.tipo_cliente IN (23,24)" PREPARE clientes FROM selec5 DECLARE bclientes CURSOR FOR clientes LET salida = 'PDF' FOREACH bclientes INTO mvtos1.tipo_cliente,mvtos1.sec_cliente,mvtos1.nombre,mvtos1.limite,mvtos1.num_rnc, mvtos1.zona IF idx = 1 THEN IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview=1 CALL fgl_report_selectDevice(salida) -- changing default CALL fgl_report_selectPreview(preview) -- changing default LET handler = fgl_report_commitCurrentSettings() -- commit changes END IF START REPORT report14 TO XML HANDLER HANDLER END IF LET mvtos1.cliente = mvtos1.tipo_cliente using "&&","-", mvtos1.sec_cliente using "&&&&&&" # BALANCE INICIAL LET valor1 = 0 LET valor2 = 0 SELECT SUM(a.valor+a.monto_desc) INTO valor1 FROM cctb00001 a WHERE a.tipo_cliente = mvtos1.tipo_cliente AND a.sec_cliente = mvtos1.sec_cliente AND a.tipo_doc in ('PG','FT','FE','NC','ND','DV','OC','OD','RC') AND a.fecha_orig < fecha_inicial AND a.status_t IS NULL IF valor1 IS NULL THEN LET valor1 = 0 END IF SELECT SUM(a.valor+a.monto_desc) INTO valor2 FROM cctb00001 a WHERE a.tipo_cliente = mvtos1.tipo_cliente AND a.sec_cliente = mvtos1.sec_cliente AND a.tipo_doc IN ('AV') AND a.num_doc = a.aplica_a AND a.fecha_orig < fecha_inicial AND a.status_t IS NULL IF valor2 IS NULL THEN LET valor2 = 0 END IF LET balance = valor1 - valor2 LET balance = balance*prima LET mvtos1.valor = 0 LET mvtos1.fecha = fecha_inicial #### Seleciona los datos generales de identificacion del cliente OUTPUT TO REPORT report14(mvtos1.*) LET idx = idx +1 # ENVIO DETALLE DECLARE dclientes CURSOR FOR SELECT a.num_doc,a.aplica_a,a.tipo_doc,CONVERT(CHAR(10),a.fecha_orig,103), (a.valor+a.monto_desc),a.documento_ref FROM cctb00001 a WHERE a.tipo_cliente=mvtos1.tipo_cliente AND a.sec_cliente=mvtos1.sec_cliente AND a.status_t is null AND a.fecha_orig BETWEEN fecha_inicial AND fecha_final AND a.tipo_doc in ('PG','FT','FE','NC','ND','DV','OC','OD','RC') UNION SELECT a.num_doc,a.aplica_a,a.tipo_doc,CONVERT(CHAR(10),a.fecha_orig,103), (a.valor+a.monto_desc)*-1,a.documento_ref FROM cctb00001 a WHERE a.tipo_cliente=mvtos1.tipo_cliente AND a.sec_cliente=mvtos1.sec_cliente AND a.status_t is null AND a.fecha_orig BETWEEN fecha_inicial AND fecha_final AND a.tipo_doc = 'AV' AND a.aplica_a = a.num_doc FOREACH dclientes INTO mvtos1.num_doc,mvtos1.aplica_a,mvtos1.tipo,mvtos1.fecha, mvtos1.valor LET mvtos1.valor = mvtos1.valor * prima #IF mvtos1.tipo = "FT" OR mvtos1.tipo = "AV" THEN # LET tipo1 = mvtos1.tipo #ELSE # SELECT MAX(a.tipo_doc) INTO tipo1 FROM cctb00001 a # WHERE a.tipo_cliente = mvtos1.tipo_cliente AND # a.sec_cliente = mvtos1.sec_cliente AND # (a.num_doc = a.aplica_a AND a.num_doc = mvtos1.aplica_a) #END IF LET tipo1 = mvtos1.tipo LET mvtos1.orden = NULL LET xcotizacion = NULL SELECT a.simbolo INTO psimbolo FROM vetb00061 a,vetb00060 b WHERE b.tipo_cliente = mvtos1.tipo_cliente AND a.ventas = b.ventas SELECT a.orden,a.cotizacion_no INTO mvtos1.orden,mvtos1.cotizacion_no FROM vetb00002 a WHERE (a.factura = mvtos1.aplica_a) AND (a.tipo_cliente = mvtos1.tipo_cliente AND a.sec_cliente=mvtos1.sec_cliente) SELECT a.num_oc INTO mvtos1.orden FROM prtb00012 a WHERE a.cotizacion_no=xcotizacion AND a.tipo_cliente = mvtos1.tipo_cliente AND a.sec_cliente = mvtos1.sec_cliente AND a.status_t IS NULL IF borden IS NOT NULL THEN IF borden = mvtos1.orden THEN OUTPUT TO REPORT report14(mvtos1.*) END IF ELSE OUTPUT TO REPORT report14(mvtos1.*) END IF LET progreso = progreso + 10 IF progreso > 50 THEN LET progreso = 50 END IF DISPLAY progreso TO progreso CALL ui.Interface.refresh() END FOREACH END FOREACH IF idx > 1 THEN FINISH REPORT report14 ELSE CALL fgl_winmessage("INFO","NO EXISTEN REGISTROS CON ESE CRITERIO DE BUSQUEDA","INFO") END IF EXIT DIALOG END INPUT ON ACTION CANCEL LET INT_FLAG = FALSE EXIT PROGRAM END DIALOG END FUNCTION ####### Funcion para dar salida a la informacion REPORT report14(j) DEFINE j RECORD tipo_cliente SMALLINT, sec_cliente SMALLINT, nombre CHAR(30), limite DECIMAL(12,2), num_rnc CHAR(10), zona SMALLINT, num_doc INTEGER, aplica_a INTEGER, tipo CHAR(2), fecha DATE, valor DECIMAL(10,2), cotizacion_no INT, cliente CHAR(20), orden INT END RECORD DEFINE p_calle,p_descrip CHAR(30), c_direccion VARCHAR(100) DEFINE p_casa CHAR(10) DEFINE hora CHAR(5) DEFINE d_debito,d_credito,d_balance, credito,debito,tcredito,tdebito,tbalance,limite,b_balance, cte,v1_30,v31_45,v46_60,vm_60 DECIMAL(12,2), chfecha CHAR(20) OUTPUT TOP MARGIN 0 LEFT MARGIN 0 BOTTOM MARGIN 2 #### Proceso para sortear la informacion ORDER BY j.cliente,j.orden,j.fecha ###### Diseno de la salida de la informacion FORMAT PAGE HEADER LET hora = TIME LET chfecha = today using "dd/mm/yyyy"," ",hora ##### Si el cliente es local el valor de la prima de la moneda es nulo SKIP 1 LINES BEFORE GROUP OF j.cliente LET b_balance = 0 LET v1_30 = 0 LET v31_45 = 0 LET v46_60 = 0 LET vm_60 = 0 LET cte = 0 SELECT c.calle,c.casa_num INTO p_calle,p_casa FROM vetb00005 c WHERE c.tipo_cliente=j.tipo_cliente and c.sec_cliente = j.sec_cliente and c.status_t is null SELECT d.descrip INTO p_descrip FROM vetb00008 d WHERE d.cod_zona = j.zona AND d.status_t IS NULL LET c_direccion = p_calle CLIPPED,' ',p_casa CLIPPED,' ',p_descrip IF limite IS NULL THEN LET limite = 0 END IF PRINTX j.cliente, j.nombre,j.limite,prima,p_companias.nombre, fecha_final,chfecha,p_calle,p_casa,j.num_rnc,c_direccion,fecha_inicial,balance,imprime LET debito = 0 LET credito = 0 LET b_balance = balance ON EVERY ROW IF b_balance IS NULL THEN LET b_balance = 0 END IF # IF j.fecha >= fecha_inicial THEN LET b_balance = b_balance + j.valor LET d_credito = 0 LET d_debito = 0 IF j.valor < 0 THEN LET d_credito = j.valor LET credito = credito + j.valor ELSE LET d_debito = j.valor LET debito = debito + j.valor END IF #END IF PRINTX j.num_doc, j.tipo, j.fecha, j.aplica_a,j.orden,j.cotizacion_no,d_debito,d_credito,d_balance, psimbolo,b_balance { LET dias = 0 LET dias = fecha_final - j.fecha IF dias <= 0 THEN LET cte = j.valor + cte END IF IF dias > 0 AND dias < 30 THEN LET v1_30 = v1_30 + j.valor END IF IF dias > 30 and dias < 60 THEN LET v31_45 = v31_45 + j.valor END IF IF dias > 61 and dias < 90 THEN LET v46_60 = v46_60 + j.valor END IF IF dias > 90 THEN LET vm_60 = vm_60 + j.valor END IF} AFTER GROUP OF j.cliente PRINTX cte,v1_30,v31_45,v46_60, vm_60 END REPORT { FUNCTION e_ccrp18() DEFINE primera,imprime_ana,imprime_cliente CHAR(1), cliente CHAR(70), codigo_g,codigo_ant,codigo_act CHAR(6), ret CHAR(30), ejecuta,localiza CHAR(80), documento CHAR(9) --# CALL fgl_init4js() --# LET archivo = NULL --# LET filename = NULL --# LET filename = FGL_GETENV("USPROGRAM") --# LET archivo = "G:\\\\ESTADO.XLS" --# LET sysos = FGL_GETENV("OS") --# IF sysos = "Windows_NT" THEN --# LET filename = filename CLIPPED," G:\\\\ESTADO.XLS" --# LET localiza = "G:\\ESTADOS\\" --# LET ejecuta = "DEL /S /Q ",localiza CLIPPED,"*.*" RUN ejecuta LET ejecuta = NULL --# ELSE --# LET filename = "C:\\\\ARCHIV~1\\\\MICROS~1\\\\OFFICE\\\\EXCEL.EXE G:\\\\ESTADO.XLS" --# LET localiza = "G:\\ESTADOS\\" --# LET archivo = "G:\\\\ESTADO.XLS" --# LET ejecuta = "DEL ",localiza CLIPPED,"*.xls" RUN ejecuta LET ejecuta = NULL --# END IF # CREACION TABLA TEMPORAL CREATE TABLE estado ( tipo_cliente SMALLINT, sec_cliente SMALLINT, aplica_a INTEGER, fecha_venc DATE, valor DECIMAL(12,2) ) LET primera = "S" LET salir = "N" WHILE salir != "S" FETCH movtos_cli INTO movtos.* IF status = NOTFOUND THEN LET salir = "S" EXIT WHILE END IF IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF IF prima IS NOT NULL THEN LET movtos.valor = movtos.valor * prima END IF SELECT MAX(a.fecha_orig) INTO fecha3 FROM cctb00001 a WHERE a.num_doc = movtos.aplica_a AND a.status_t IS NULL AND a.aplica_a = a.num_doc INSERT INTO estado VALUES (movtos.tipo_cliente,movtos.sec_cliente, movtos.aplica_a,fecha3,movtos.valor) END WHILE --# IF winexec(filename) THEN --# IF DDEconnect("EXCEL",archivo) THEN --# LET cels = "R",6 USING "<<","C3" --# IF DDEpoke("EXCEL",archivo,cels,fecha_final) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF DECLARE buscate CURSOR FOR SELECT a.tipo_cliente,a.sec_cliente,a.aplica_a,SUM(a.valor) FROM estado a GROUP BY 1,2,3 ORDER BY 1,2 LET primera = "S" LET cnt = 16 LET balance = 0 LET codigo_ant = "1" LET codigo_Act = NULL FOREACH buscate INTO movtos.* LET codigo_Act = movtos.tipo_cliente USING "##",movtos.sec_cliente USING "&&&&" LET imprime_ana = "N" IF primera = "S" THEN LET codigo_ant = codigo_Act END IF IF codigo_ant != codigo_act THEN LET codigo_ant = codigo_Act LET primera = "S" LET imprime_ana = "S" --# LET cels = "R",38 USING "<<","C2" --# IF DDEpoke("EXCEL",archivo,cels,no_v) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",38 USING "<<","C3" --# IF DDEpoke("EXCEL",archivo,cels,v1_30) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",38 USING "<<","C4" --# IF DDEpoke("EXCEL",archivo,cels,v31_45) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",38 USING "<<","C5" --# IF DDEpoke("EXCEL",archivo,cels,v46_60) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",38 USING "<<","C7" --# IF DDEpoke("EXCEL",archivo,cels,vm_60) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET command = "Run(\\\"ESTADO.XLS!SALVAR\\\";FALSE)" --# CALL DDEExecute ("EXCEL",archivo,command) RETURNING ret --# IF sysos = "Windows_NT" THEN LET ejecuta = "COPY G:\\ESTADO.XLS G:\\ESTADOS\\", codigo_g,".xls" --# ELSE LET ejecuta = "COPY G:\\ESTADO.XLS G:\\ESTADOS\\", codigo_g,".xls" --# END IF RUN ejecuta --# LET command = "Run(\\\"ESTADO.XLS!LIMPIAR\\\";FALSE)" --# CALL DDEExecute ("EXCEL",archivo,command) RETURNING ret LET cnt = 16 --# END IF --# IF primera = "S" THEN LET primera = "N" LET imprime_cliente = "S" LET no_v = 0 LET v1_30 = 0 LET v31_45 = 0 LET v46_60 = 0 LET vm_60 = 0 #### Seleciona los datos generales de identificacion del cliente LET codigo_g = movtos.tipo_cliente USING "##",movtos.sec_cliente USING "&&&&" SELECT UNIQUE b.nombre,b.limite_credito,b.zona_postal,b.num_rnc,c.calle, c.casa_num,b.telefono,b.cod_zona,b.cod_provincia,c.barrio INTO p_nombre,p_limite_credito,p_zona,p_numero,p_calle,p_casa, ptelefono,pzona,pprovincia,pbarrio FROM vetb00004 b ,vetb00005 c WHERE b.tipo_cliente = movtos.tipo_cliente and b.sec_cliente = movtos.sec_cliente and b.tipo_cliente = c.tipo_cliente and b.sec_cliente = c.sec_cliente and b.status_t is null SELECT a.descrip INTO nombre_zona FROM vetb00008 a WHERE a.cod_zona = pzona SELECT b.nombre_provincia INTO nombre_p FROM vetb00009 a, vetb00020 b WHERE a.cod_zona = pzona AND a.cod_provincia = pprovincia AND b.cod_provincia = a.cod_provincia --# LET cliente = p_nombre CLIPPED," ","(",movtos.tipo_cliente USING "##","-", movtos.sec_cliente USING "&&&&",")" --# LET cliente = cliente CLIPPED --# LET cels = "R",8 USING "<<","C2" --# IF DDEpoke("EXCEL",archivo,cels,cliente) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF LET balance = 0 --# LET cliente = null --# LET cliente = p_calle CLIPPED," #",p_casa CLIPPED,", ",pbarrio CLIPPED," Tel. ",ptelefono CLIPPED --# LET cels = "R",9 USING "<<","C2" --# IF DDEpoke("EXCEL",archivo,cels,cliente) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cliente = null --# LET cliente = "LIMITE: ",p_limite_credito USING "##,###,###.##"," ", "RNC: ",p_numero --# LET cels = "R",10 USING "<<","C2" --# IF DDEpoke("EXCEL",archivo,cels,cliente) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cliente = null --# LET cliente = nombre_zona CLIPPED,", ",nombre_p CLIPPED --# LET cels = "R",11 USING "<<","C2" --# IF DDEpoke("EXCEL",archivo,cels,cliente) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# END IF SELECT UNIQUE a.tipo_doc,MIN(a.fecha_orig) INTO tipo,fecha2 FROM cctb00001 a WHERE a.num_doc = movtos.aplica_a AND a.status_t IS NULL AND a.aplica_a = a.num_doc GROUP BY 1 --# LET documento = movtos.aplica_a USING "<<<<<<","-",tipo --# LET cels = "R",cnt USING "<<","C2" --# IF DDEpoke("EXCEL",archivo,cels,documento) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",cnt USING "<<","C3" --# IF DDEpoke("EXCEL",archivo,cels,fecha2) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET balance = balance + movtos.valor --# LET cels = "R",cnt USING "<<","C5" --# IF DDEpoke("EXCEL",archivo,cels,movtos.valor) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET balance = balance + movtos.valor --# LET cels = "R",cnt USING "<<","C7" --# IF DDEpoke("EXCEL",archivo,cels,balance) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",35 USING "<<","C7" --# IF DDEpoke("EXCEL",archivo,cels,balance) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF #LET dias = (fecha_final - fecha2) - dias2 LET dias = (fecha_final - fecha3) - dias2 IF dias > 0 AND dias < 31 THEN LET v1_30 = movtos.valor + v1_30 END IF IF dias > 30 and dias < 46 THEN LET v31_45 = movtos.valor + v31_45 END IF IF dias > 45 and dias < 61 THEN LET v46_60 = movtos.valor + v46_60 END IF IF dias > 60 THEN LET vm_60 = vm_60 + movtos.valor END IF --# LET cnt = cnt + 1 --# END FOREACH IF imprime_ana = "N" THEN --# LET cels = "R",38 USING "<<","C2" --# IF DDEpoke("EXCEL",archivo,cels,no_v) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",38 USING "<<","C3" --# IF DDEpoke("EXCEL",archivo,cels,v1_30) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",38 USING "<<","C4" --# IF DDEpoke("EXCEL",archivo,cels,v31_45) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",38 USING "<<","C5" --# IF DDEpoke("EXCEL",archivo,cels,v46_60) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# LET cels = "R",38 USING "<<","C7" --# IF DDEpoke("EXCEL",archivo,cels,vm_60) THEN --# ELSE --# LET numero_msg =391 --# CALL msg(numero_msg) --# END IF --# IF sysos = "Windows_NT" THEN LET ejecuta = "COPY G:\\ESTADO.XLS G:\\ESTADOS\\", codigo_g,".xls" --# ELSE LET ejecuta = "COPY G:\\ESTADO.XLS G:\\ESTADOS\\", codigo_g,".xls" --# END IF RUN ejecuta --# LET command = "Run(\\\"ESTADO.XLS!LIMPIAR\\\";FALSE)" --# CALL DDEExecute ("EXCEL",archivo,command) RETURNING ret END IF end if end if DROP TABLE estado --# END FUNCTION }