Files
MBS/PROYECTO/ccdir/ccprrp018.4gl
T
jpegueroandClaude Sonnet 5.5 539af7f912 CxC: ccprrp018/003/001 con reporte Genero, ccprrp052 y ccprmt002 corregidos
- ccprrp018: agrega MAIN, GROUP BY por nombre, y reemplaza la salida Excel/DDE
  (G:\ESTADO.XLS, DEL G:\ESTADOS) por un reporte Genero (ccprrp018.4rp); carga con
  un solo INSERT...SELECT en tabla temporal.
- ccprrp003: reemplaza el REPORT de texto con codigos de impresora por
  ccprrp003.4rp; agrega por cliente en una consulta (DATEDIFF, mismas reglas).
- ccprrp001: agrega MAIN, GROUP BY por nombre, reporte Genero (ccprrp001.4rp) y
  registra el formulario ccfmrp001 en FORMULARIOS_CC (faltaba, -1110).
- ccprrp052: la validacion del campo Orden estaba al reves.
- ccprmt002: cctb00002.fecha es datetime en SQL Server; el formulario, la variable
  global relacion (ccprgb000) y el CONSTRUCT la manejan como DATE; corrige que
  eLiminar mostrara exito sin actualizar filas.
- mbsERP.4pw: registra los .4rp, libgre y ccfmrp001 (sin credenciales).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 15:23:22 -04:00

689 lines
22 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : CCPRRP018
OBJETIVO : Listar los Estados De Cuentas de los clientes
(Partidas pendientes de cobros)
PROGRAMADOR : Tadeo A. Ferreras
FECHA REALIZACION : Julio 28, 1993
-------------------------------------------------------------------------------
}
GLOBALS "ccprgb000.4gl"
DEFINE prima DECIMAL(10,2) ### Varible que equivale a la prima de otra moneda
DEFINE destino,mov CHAR(1)
DEFINE idx_1, idx_2, idx_3 SMALLINT ## Variables usadas para formar arreglos
DEFINE fecha_final DATE ## Varible usada para busqueda por fecha de corte
DEFINE salir, salir1, salir3, tipo_venta CHAR(1) ## Bandera para control loop
DEFINE selec5, selec6 CHAR(1500) ## Variables para almacenar busquedas
DEFINE valor_de DECIMAL(12,2)
DEFINE dias2 INTEGER,
command CHAR(120),
tipo CHAR(2)
DEFINE dias SMALLINT ## Variable que almacena la diferencia de dias
DEFINE p_tel LIKE vetb00004.telefono
DEFINE archivo,filename,sysos CHAR(120),
cels CHAR(20),
cnt SMALLINT,
nombre_zona,nombre_p CHAR(30)
DEFINE credito, debito, tcredito, tdebito, tbalance,
limite, b_balance, no_v,v1_30, v31_45, v46_60, vm_60,p_valor DECIMAL(12,2)
DEFINE p_prov LIKE vetb00020.cod_provincia,
nom_prov LIKE vetb00020.nombre_provincia
DEFINE p_calle,p_descrip,pbarrio CHAR(30)
DEFINE p_casa,p_zona,p_numero CHAR(10),
balance DECIMAL(12,2),
ptelefono LIKE vetb00004.telefono,
pzona LIKE vetb00004.cod_zona,
pprovincia LIKE vetb00004.cod_provincia
#DEFINE no_v LIKE cctb00001.aplica_a
DEFINE fecha1,fecha2 DATE,
p_nombre CHAR(30),
p_limite_credito DECIMAL(10,2)
####### Variables para desplegar resultados por pantalla ante de la impresion
DEFINE tot_gen1 RECORD
totald DECIMAL(10,2),
totalc DECIMAL(10,2),
totalg DECIMAL(10,2)
END RECORD,
##### Registro que almacena la infoprmacion a imprimir ####
m_tipo_doc LIKE cctb00001.tipo_doc
DEFINE movtos RECORD
tipo_cliente SMALLINT,
sec_cliente SMALLINT,
aplica_a LIKE cctb00001.aplica_a,
valor DECIMAL(12,2)
END RECORD
DEFINE fecha3 DATE
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT TO "smarmotech" USER usuarios USING clave
CALL ccprrp018()
END MAIN
FUNCTION ccprrp018()
# WHENEVER ERROR CONTINUE
OPTIONS
FORM LINE 8,
ERROR LINE 23,
COMMENT LINE 21
####### Abriendo y desplegando formulario de captura de datos
OPEN FORM ccfmrp018 FROM "ccfmrp018"
DISPLAY FORM ccfmrp018
#CALL pantalla()
DISPLAY "ccprrp018" AT 4,3 ATTRIBUTE(RED)
DISPLAY "Estado Cuentas Pendiente De Cobros" AT 6,21 ATTRIBUTE(BLACK)
LET tipo_papel = 1
CALL msgrp000(tipo_papel)
##### Creando el criterio de busqueda
CONSTRUCT criterio ON a.tipo_cliente,a.sec_cliente FROM
tipo_cliente, sec_cliente
##### Aceptando la fecha de corte para busqueda de informacion
INITIALIZE fecha_final to null
INPUT BY NAME prima,fecha_final,dias2
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
AFTER FIELD dias2
IF dias2 is null THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD dias2
END IF
END INPUT
###### Creando facilidad para cancelar operacion mediante la tecla DELETE
###### o SUPR
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Busca los documentos que esten en el rango de fechas especificado
LET selec5 =
"SELECT a.tipo_cliente,a.sec_cliente,a.aplica_a,sum(a.valor+a.monto_desc) ",
"FROM cctb00001 a,vetb00004 c ",
"WHERE a.status_t IS NULL AND a.fecha_orig <= ? AND ",
" a.num_doc IS NOT NULL AND a.tipo_doc != ('PC') AND ",
" a.tipo_cliente = c.tipo_cliente AND ",
" a.sec_cliente = c.sec_cliente AND ",
#" a.sec_cliente = b.sec_cliente AND a.tipo_doc in ('FE','FT','NC') AND ",
criterio CLIPPED," GROUP BY a.tipo_cliente,a.sec_cliente,a.aplica_a HAVING SUM(a.valor+a.monto_desc) <> 0 ",
"ORDER BY 3 "
DISPLAY "<< Buscando los Movimientos del Rango >>" AT 20,14
ATTRIBUTE (REVERSE,BOLD)
PREPARE movi FROM selec5
DECLARE movtos_cli CURSOR FOR movi
#OPEN movtos_cli USING fecha_final -- G6: e_ccrp18 carga todo con un INSERT ... SELECT
LET destino = "E"
IF destino = "E" THEN
CALL e_ccrp18()
RETURN
END IF
#START REPORT report18 TO "ccrp18"
DISPLAY " " AT 19,14
DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>"
AT 19,14 ATTRIBUTE (REVERSE)
###### Comienza el loop para enviar informacion al reporte
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 UNIQUE a.tipo_doc
INTO m_tipo_doc
FROM cctb00001 a
WHERE a.status_t IS NULL AND
a.num_doc = a.aplica_a AND
a.num_doc=movtos.aplica_a AND
a.tipo_doc not in ("PG","NC","PC","ND") and
a.tipo_cliente=movtos.tipo_cliente AND
a.sec_cliente=movtos.sec_cliente
GROUP BY 1
IF STATUS < 0 THEN
LET m_tipo_doc = "KK"
END IF
IF m_tipo_doc = "DE" THEN
#LET doccli16.fecha_venc = NULL
SELECT SUM(a.valor+a.monto_desc)*-1
INTO movtos.valor
FROM cctb00001 a
WHERE a.fecha_orig<=fecha_final AND a.tipo_cliente=movtos.tipo_cliente
AND a.sec_cliente=movtos.sec_cliente AND a.status_t IS NULL AND
a.tipo_doc = "DE" AND a.num_doc = movtos.aplica_a
END IF
# OUTPUT TO REPORT report18(movtos.*)
END WHILE
# FINISH REPORT report18
RUN "type c:\ccrp18 > %USPRINT%"
#CALL fdestino(destino,archivo,imprime)
CLEAR SCREEN
END FUNCTION
####### Funcion para dar salida a la informacion
{
REPORT report18(x)
DEFINE x RECORD
tipo_cliente SMALLINT,
sec_cliente SMALLINT,
aplica_a LIKE cctb00001.aplica_a,
valor DECIMAL(12,2)
END RECORD
DEFINE hora CHAR(5)
DEFINE imp_cli CHAR(1)
OUTPUT
TOP MARGIN 0
LEFT MARGIN 0
BOTTOM MARGIN 2
ORDER BY x.sec_cliente,x.aplica_a
#### Proceso para sortear la informacion
FORMAT
PAGE HEADER
LET hora = time
PRINT COLUMN 1, letras.comp_on
PRINT COLUMN 1, "ccprrp018",
COLUMN 31, "R A Y - O - V A C D O M I N I C A N A, S. A.",
COLUMN 101, today using "dd/mm/yyyy"
PRINT COLUMN 40,"Estado de Cuenta Al ",fecha_final USING "dd/mm/yyyy",
COLUMN 106, hora
IF x.sec_cliente > 9000 AND prima IS NULL THEN
PRINT COLUMN 53, "US$"
ELSE
PRINT COLUMN 53, "RD$"
END IF
##### Si el cliente es local el valor de la prima de la moneda es nulo
IF x.sec_cliente < 9000 THEN
LET prima = null
END IF
SKIP 1 LINE
BEFORE GROUP OF x.sec_cliente
LET idx = 0
LET no_v = 0
LET v1_30 = 0
LET v31_45 = 0
LET v46_60 = 0
LET vm_60 = 0
IF tdebito IS NULL THEN
LET tdebito = 0
END IF
IF tcredito IS NULL THEN
LET tcredito = 0
END IF
IF tbalance IS NULL THEN
LET tbalance = 0
END IF
#### Seleciona los datos generales de identificacion del cliente
SELECT UNIQUE b.nombre,b.limite_credito,b.zona_postal,b.num_rnc,c.calle,
c.casa_num,c.barrio,b.telefono,b.cod_provincia
INTO p_nombre,p_limite_credito,p_zona,p_numero,p_calle,p_casa,pbarrio,p_tel,p_prov
FROM vetb00004 b ,vetb00005 c
WHERE x.tipo_cliente = b.tipo_cliente and x.sec_cliente = b.sec_cliente and
b.tipo_cliente = c.tipo_cliente and b.sec_cliente = c.sec_cliente and
b.status_t is null
SELECT a.nombre_provincia INTO nom_prov
FROM vetb00020 a
WHERE a.cod_provincia = p_prov
AND a.status_t IS NULL
IF balance IS NULL THEN
LET balance = 0
END IF
LET b_balance = balance
IF limite IS NULL THEN
LET limite = 0
END IF
LET debito = 0
LET credito = 0
IF prima is not null THEN
PRINT COLUMN 1,"Prima: ", prima using "###.##"
END IF
PRINT COLUMN 1,
"--------------------------------------------------",
"--------------------------------------------------",
"-----------"
, letras.negrillas_on
PRINT COLUMN 1, "Cliente:",
COLUMN 10, x.tipo_cliente using "&&","-",
x.sec_cliente using "&&&&",
COLUMN 18, p_nombre clipped,
COLUMN 64, "RNC : ",p_numero
PRINT COLUMN 10, p_calle clipped," ",p_casa CLIPPED,pbarrio CLIPPED,", ",
nom_prov CLIPPED,
COLUMN 90, "Tel : ",p_tel CLIPPED
PRINT COLUMN 1,
"--------------------------------------------------",
"--------------------------------------------------",
"-----------"
PRINT COLUMN 4, "D O C U M E N T O"
PRINT COLUMN 1, "|----------------------|"
PRINT COLUMN 3, "Numero",
COLUMN 11, "Tipo",
COLUMN 17, "Fecha",
COLUMN 30, "Vencimiento",
COLUMN 63, " Valor ",
COLUMN 99, "B A L A N C E"
PRINT COLUMN 1,
"--------------------------------------------------",
"--------------------------------------------------" ,
"-----------"
# END IF
ON EVERY ROW
display "aplica ",x.aplica_a
SELECT UNIQUE a.tipo_doc,MAX(a.fecha_orig),MAX(a.fecha_ven)
INTO tipo,fecha2,fecha3
FROM cctb00001 a
WHERE a.num_doc = x.aplica_a AND
a.status_t IS NULL AND
a.aplica_a = a.num_doc
GROUP BY 1
IF fecha2 IS NULL THEN
LET fecha2 = fecha_final
END IF
IF fecha3 IS NULL THEN
LET fecha3 = fecha_final
END IF
###### Balanceando la informacion
####### Calculando los dias de vencimiento del documento
# IF (fecha_final - fecha3) >= dias2 THEN
LET dias = (fecha_final - fecha3) - dias2
LET p_valor = x.valor
IF p_valor <> 0 THEN
LET Idx = idx + 1
display "idx ",idx
#IF idx > 0 THEN
IF tipo != "FT" THEN
INITIALIZE fecha3 TO NULL
END IF
LET b_balance = b_balance + x.valor
IF dias <= 0 THEN
LET no_v = p_valor + no_v
END IF
IF dias > 0 and dias < 31 THEN
LET v1_30 = p_valor + v1_30
END IF
IF dias > 30 and dias < 46 THEN
LET v31_45 = p_valor + v31_45
END IF
IF dias > 45 and dias < 61 THEN
LET v46_60 = p_valor + v46_60
END IF
IF dias > 60 THEN
LET vm_60 = vm_60 + p_valor
END IF
#display "dos aplica_a ",x.aplica_a
PRINT COLUMN 3, x.aplica_a using "######",
COLUMN 12, tipo,
COLUMN 16, fecha2 using "dd/mm/yyyy",
COLUMN 29, fecha3 using "dd/mm/yyyy",
COLUMN 59, x.valor using "(((,(((,(((.&&)",
COLUMN 97, b_balance using "(((,(((,(((.&&)"
#END IF
END IF
AFTER GROUP OF x.sec_cliente
IF no_v <> 0 OR v1_30 <> 0 OR v31_45 <> 0 OR v46_60 <> 0 OR vm_60 <> 0 THEN
SKIP 1 LINE
PRINT COLUMN 52," RESUMEN POR VENCIMIENTO "
PRINT #COLUMN 1, "ANALISIS POR ANTIGUEDAD",letras.negrillas_on,
COLUMN 32, "No Vencido",
COLUMN 50, "1 a 30",
COLUMN 60, "31 a 45",
COLUMN 74, "46 a 60",
COLUMN 86, "Mas de 60",letras.negrillas_off
PRINT #COLUMN 1, "DE SU APRECIADA CUENTA: ",
COLUMN 25, no_v using "((,(((,(((.&&)",
COLUMN 41, v1_30 using "((,(((,(((.&&)",
COLUMN 54, v31_45 using "((,(((,(((.&&)",
COLUMN 70, v46_60 using "((,(((,(((.&&)",
COLUMN 82, vm_60 using "((,(((,(((.&&)"
SKIP 1 LINE
IF v1_30 = 0 AND v31_45 = 0 AND v46_60 = 0 AND
vm_60 = 0 THEN
PRINT COLUMN 1,
" NOTA : "
PRINT COLUMN 1,
" CON LA REMISION DE ESTE ESTADO DE CUENTAS SOLO ESTAMOS CONFIRMANDO EL "
PRINT COLUMN 1,
" BALANCE COMPUESTO POR LA(S) FACTURA(S) DETALLADA(S) EN EL MISMO."
PRINT COLUMN 1,
" SI EXISTE ALGUNA DIFERENCIA FAVOR COMUNICARSE CON NUESTRO GERENTE DE TESORERIA "
PRINT COLUMN 1,
" EL LIC. PEDRO ACOSTA AL TEL. 530-5409, O ENVIARNOS SU RESPUESTA, YA SEA POR "
PRINT COLUMN 1,
" LA VIA A NUESTRO FAX No. 530-7966, O POR VIA A NUESTRA DIRECCION ELECTRONICA"
PRINT COLUMN 1,
" pacosta@dom.rov.com "
SKIP 1 LINE
PRINT COLUMN 1,
" SALUDOS CORDIALES. "
END IF
IF v1_30 != 0 OR v31_45 != 0 OR v46_60 != 0 OR
vm_60 != 0 THEN
PRINT COLUMN 1,
"NOTA : "
PRINT COLUMN 1,
"FAVOR OBSERVAR QUE ESTE ESTADO DE CUENTAS PRESENTA UN BALANCE VENCIDO COMPUESTO "
PRINT COLUMN 1,
"POR LA(S) FACTURA(S) QUE LE ESTAMOS SENALANDO."
PRINT COLUMN 1,
"EN CASO DE QUE DESEE LE ENVIAMOS A NUESTRO REPRESENTANTE PARA LOS FINES DE "
PRINT COLUMN 1,
"RIGOR, FAVOR COMUNICARSE CON NUESTRO GERENTE DE TESORERIA EL LIC. PEDRO ACOSTA "
PRINT COLUMN 1,
"AL TELEFONO 530-5409, O ENVIARNOS SU RESPUESTA, YA SEA POR VIA A NUESTRO FAX "
PRINT COLUMN 1,
"EL No. 530-7966, O POR VIA A NUESTRA DIRECCION ELECTRONICA pacosta@dom.rov.com "
SKIP 1 LINE
PRINT COLUMN 1,
"SALUDOS CORDIALES. "
END IF
SKIP 1 LINES
PRINT COLUMN 51,
" LIC. PEDRO ACOSTA "
PRINT COLUMN 51,
"GERENTE DE TESORERIA"
LET b_balance = 0
SKIP TO TOP OF PAGE
END IF
PAGE TRAILER
SKIP 1 LINE
PRINT COLUMN 1, letras.negrillas_on,
"PG-Pago FT-Factura Local FE-Factura Exterior ",
"ND-Nota Debito NC-Nota Credito DE-Devolucion",
letras.negrillas_off
LET no_v = 0
LET v1_30 = 0
LET v31_45 = 0
LET v46_60 = 0
LET vm_60 = 0
END REPORT
}
{ G6: la salida original llenaba una plantilla de Excel por DDE (G:\ESTADO.XLS) y
copiaba un archivo por cliente a G:\ESTADOS. Ahora se emite un reporte de Genero
(ccprrp018.4rp): PDF en el navegador, visor en GDC. }
FUNCTION e_ccrp18()
DEFINE codigo_act, codigo_ant STRING
DEFINE handler om.SaxDocumentHandler
DEFINE r_output STRING
DEFINE hay SMALLINT
DEFINE sql_ins STRING
DEFINE fila RECORD
codigo STRING,
cliente STRING,
direccion STRING,
limite STRING,
zona STRING,
corte STRING,
documento STRING,
fecha STRING,
valor DECIMAL(12,2),
balance DECIMAL(12,2),
dias INTEGER
END RECORD
CREATE TEMP TABLE estado
(
tipo_cliente SMALLINT,
sec_cliente SMALLINT,
aplica_a INTEGER,
fecha_venc DATE,
valor DECIMAL(12,2),
tipo_doc CHAR(2),
fecha_min DATE
)
LET sql_ins =
"INSERT INTO estado (tipo_cliente,sec_cliente,aplica_a,fecha_venc,valor,tipo_doc,fecha_min) ",
"SELECT g.tipo_cliente,g.sec_cliente,g.aplica_a,d.fmax,g.valor,d.tipo_doc,d.fmin FROM ( ",
" SELECT a.tipo_cliente,a.sec_cliente,a.aplica_a,SUM(a.valor+a.monto_desc) AS valor ",
" FROM cctb00001 a,vetb00004 c ",
" WHERE a.status_t IS NULL AND a.fecha_orig <= ? AND ",
" a.num_doc IS NOT NULL AND a.tipo_doc != 'PC' AND ",
" a.tipo_cliente = c.tipo_cliente AND ",
" a.sec_cliente = c.sec_cliente AND ",
criterio CLIPPED,
" GROUP BY a.tipo_cliente,a.sec_cliente,a.aplica_a ",
" HAVING SUM(a.valor+a.monto_desc) <> 0) g ",
"LEFT JOIN (SELECT num_doc,MIN(tipo_doc) AS tipo_doc,MIN(fecha_orig) AS fmin, ",
" MAX(fecha_orig) AS fmax ",
" FROM cctb00001 ",
" WHERE status_t IS NULL AND aplica_a = num_doc ",
" GROUP BY num_doc) d ON d.num_doc = g.aplica_a"
PREPARE p_ins18 FROM sql_ins
EXECUTE p_ins18 USING fecha_final
LET r_output = getPreviewDevice()
IF NOT fgl_report_loadCurrentSettings("ccprrp018.4rp") THEN
CALL fgl_winmessage("ERROR", "No se pudo cargar ccprrp018.4rp", "stop")
DROP TABLE estado
RETURN
END IF
CALL fgl_report_selectDevice(r_output)
CALL fgl_report_selectPreview(TRUE)
LET handler = fgl_report_commitCurrentSettings()
START REPORT estado18 TO XML HANDLER handler
DECLARE buscate CURSOR FOR
SELECT a.tipo_cliente, a.sec_cliente, a.aplica_a, a.valor,
a.fecha_venc, a.tipo_doc, a.fecha_min
FROM estado a
ORDER BY a.tipo_cliente, a.sec_cliente, a.aplica_a
LET hay = 0
LET codigo_ant = NULL
LET balance = 0
FOREACH buscate INTO movtos.*, fecha3, tipo, fecha2
LET hay = 1
IF prima IS NOT NULL THEN
LET movtos.valor = movtos.valor * prima
END IF
LET codigo_act = movtos.tipo_cliente USING "##", "-",
movtos.sec_cliente USING "<<<<<<<<&"
IF codigo_ant IS NULL OR codigo_ant != codigo_act THEN
LET codigo_ant = codigo_act
LET balance = 0
INITIALIZE p_nombre, p_limite_credito, p_zona, p_numero, p_calle,
p_casa, ptelefono, pzona, pprovincia, pbarrio,
nombre_zona, nombre_p TO NULL
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
END IF
LET balance = balance + movtos.valor
LET fila.codigo = codigo_act
LET fila.cliente = p_nombre CLIPPED, " (", codigo_act, ")"
LET fila.direccion = p_calle CLIPPED, " #", p_casa CLIPPED, ", ",
pbarrio CLIPPED, " Tel. ", ptelefono CLIPPED
LET fila.limite = "LIMITE: ", p_limite_credito USING "##,###,##&.&&",
" RNC: ", p_numero CLIPPED
LET fila.zona = nombre_zona CLIPPED, ", ", nombre_p CLIPPED
LET fila.corte = "Al ", fecha_final USING "dd/mm/yyyy"
LET fila.documento = movtos.aplica_a USING "<<<<<<<<<", "-", tipo CLIPPED
LET fila.fecha = fecha2 USING "dd/mm/yyyy"
LET fila.valor = movtos.valor
LET fila.balance = balance
LET fila.dias = (fecha_final - fecha3) - dias2
OUTPUT TO REPORT estado18(fila.*)
END FOREACH
FINISH REPORT estado18
DROP TABLE estado
IF NOT hay THEN
CALL fgl_winmessage("INFO",
"NO EXISTEN REGISTROS PARA ESTOS PARAMETROS", "info")
END IF
END FUNCTION
REPORT estado18(x)
DEFINE x RECORD
codigo STRING,
cliente STRING,
direccion STRING,
limite STRING,
zona STRING,
corte STRING,
documento STRING,
fecha STRING,
valor DECIMAL(12,2),
balance DECIMAL(12,2),
dias INTEGER
END RECORD
DEFINE nov, d1, d2, d3, d4, total DECIMAL(12,2)
ORDER EXTERNAL BY x.codigo
FORMAT
BEFORE GROUP OF x.codigo
LET nov = 0
LET d1 = 0
LET d2 = 0
LET d3 = 0
LET d4 = 0
LET total = 0
PRINTX x.cliente, x.limite, x.direccion, x.zona, x.corte
ON EVERY ROW
LET total = total + x.valor
CASE
WHEN x.dias <= 0
LET nov = nov + x.valor
WHEN x.dias < 31
LET d1 = d1 + x.valor
WHEN x.dias < 46
LET d2 = d2 + x.valor
WHEN x.dias < 61
LET d3 = d3 + x.valor
OTHERWISE
LET d4 = d4 + x.valor
END CASE
PRINTX x.documento, x.fecha, x.valor, x.balance, x.dias
AFTER GROUP OF x.codigo
PRINTX nov, d1, d2, d3, d4, total
END REPORT