Files
MBS/PROYECTO/cgdir/cgprmt022.4gl
T
jsotoandClaude Opus 5.5 705fadfdb4 JSOTO QA G6 (.250): arreglos CG/Activos/Repuestos/Informatica, DBDATE, imagenes de reportes y cgprrp008
Programas (bugs encontrados en las pruebas funcionales en la .250):
- acprmt004/acprmt005: MIN/MAX sobre la fecha real (no sobre texto CONVERT 103); acprmt004 alinea rowid.
- cgprrp008: lee cgtb00004 (no la copia cgtb00004_tmp del 14-mar-2026) y solo regenera
  cgtb00016 cuando se corre sin filtro de cuenta.
- cgprrp014: CONSTRUCT con los nombres de campo del form (cod_sp_sc).
- cgfmrp013: defaultValue del combo = cgprrp012.4rp.
- cgprrp022/edprrp029: salida getPreviewDevice() en lugar de SVG fijo.
- edprrp080: no consume numero ED con afecta = NO.
- cgprmt004/022/037, segprmt0001: sin CONNECT "IFMX" (-6366); EXTERIOR via cross-DB.
- irprcs001: agrega CONNECT; irprmt021: columna idestado; irprmt066: la anulacion sin
  MaintainX ya no se deshace (-255); otrodir/bodegas: rama '2' llena origen y destino.
- teprmt001: ajustes G6.

Despliegue G6:
- DBDATE=dmy4 en config/Application.xcf, config/Main_prg.xcf, resources/Application.xcf
  y en el grupo MODULOS del .4pw (los programas lanzados por el menu heredan el entorno).
- 31 .4rp: IMAGEBOX con rutas absolutas file:///E:|F:|C: -> relativas IMAGENES/...;
  se agregan IMAGENES/LOGO.JPG y genero_logo.png.
- Paquete mbs: incluye bin/*.4rp y bin/IMAGENES (antes el GAR no llevaba los reportes).
- resources/TopMenu.4st (irprcs008 daba -8014); bin/cgprcs024.4rp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 15:30:24 -04:00

188 lines
7.2 KiB
Plaintext

{
PROGRAMA : cgprmt022
OBJETIVO : Administrar las tasas mensuales
FECHA CREACION: Agosto 7, 2018
DESARROLLADO POR: ING. JUAN SOTO
}
GLOBALS
"cgprgb000.4gl"
DEFINE pano,pmes,pventas INT,
ptasa DEC(8,2),
preplica VARCHAR(2)
MAIN
DEFER INTERRUPT
CALL STARTLOG("CGPRMT021.TXT")
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
-- G6: "marmotech" no existe en el fglprofile (-6366); el binario de produccion (E:\MARMOTECH\BIN320 = EXTERIOR) conecta a smarmotech
CONNECT to "smarmotech" AS "MSSQL" USER usuarios USING clave
CALL cgprmt022()
END MAIN
FUNCTION cgprmt022()
DEFINE mtasa RECORD
ano SMALLINT,
mes SMALLINT,
ventas SMALLINT,
tasa DEC(8,2)
END RECORD,
actualiza,selec,inserta STRING,
i INT,
clientes DYNAMIC ARRAY OF RECORD
tipo_cliente1 INT,
tasa1 DEC(12,2)
END RECORD,
replica VARCHAR(2)
OPEN WINDOW w1 WITH FORM "cgfmmt022"
DIALOG ATTRIBUTE(UNBUFFERED)
INPUT BY NAME mtasa.*,replica
BEFORE INPUT
CALL cventas()
LET mtasa.ano = YEAR(TODAY)
LET mtasa.mes = MONTH(TODAY)-1
DISPLAY BY NAME mtasa.ano,mtasa.mes
LET selec = "SELECT DISTINCT a.ano FROM marmotech.dbo.cgtb00084 a WHERE a.ano = ? AND a.mes = ? AND a.ventas = ? AND a.tipo_cliente = ?"
PREPARE selecciona FROM selec
LET actualiza = "UPDATE marmotech.dbo.cgtb00084 set tasa = ? WHERE ano = ? and mes = ? and ventas =? and tipo_cliente = ?"
PREPARE actual FROM actualiza
LET inserta = "INSERT INTO marmotech.dbo.cgtb00084 (ano,mes,tipo_cliente,ventas,tasa) values ",
" (?,?,?,?,?)"
PREPARE adicionar FROM inserta
ON CHANGE tasa
DECLARE busca_tipos CURSOR for
SELECT DISTINCT a.tipo_cliente FROM vetb00061 a WHERE a.ventas = mtasa.ventas AND a.tipo_cliente > 14
LET i =1
FOREACH busca_tipos INTO clientes[i].*
LET clientes[i].tasa1=mtasa.tasa
LET i = i + 1
END FOREACH
IF i=1 THEN
CALL fgl_winmessage("INFO","COMBINACION TIPO CLIENTE Y MONEDA ESTAN ERRADOS","INFO")
NEXT FIELD ventas
END IF
END INPUT
DISPLAY ARRAY clientes TO sclientes.*
ON ACTION actualizar ATTRIBUTE(TEXT="Actualiza")
IF fgl_winquestion("Actualiza","Estas seguro de Actualizar la tasa?","No","Yes|No","question",0) = "Yes" THEN
FOR i = 1 TO clientes.getLength()
IF clientes[i].tipo_cliente1 IS NOT NULL THEN
IF clientes[i].tasa1 IS NULL THEN
CALL msg(16)
NEXT FIELD tasa
END IF
SELECT DISTINCT a.ano,a.mes,a.ventas,a.tipo_cliente,a.tasa
INTO mtasa.ano,mtasa.mes,mtasa.ventas,clientes[i].tipo_cliente1
FROM cgtb00084 a WHERE a.ano = mtasa.ano AND a.mes = mtasa.mes AND
a.ventas = mtasa.ventas AND a.tipo_cliente = clientes[i].tipo_cliente1
IF STATUS <> NOTFOUND THEN
DISPLAY BY NAME mtasa.*
UPDATE cgtb00084 SET cgtb00084.tasa = mtasa.tasa,
us_mod = usuarios,
fech_mod = getdate()
WHERE cgtb00084.ano = mtasa.ano AND cgtb00084.mes = mtasa.mes AND
cgtb00084.ventas = mtasa.ventas AND
cgtb00084.tipo_cliente = clientes[i].tipo_cliente1
ELSE
INSERT INTO cgtb00084 (ano,mes,ventas,tipo_cliente,tasa,us_crea,fech_crea) VALUES
(mtasa.ano,mtasa.mes,mtasa.ventas,clientes[i].tipo_cliente1,mtasa.tasa,usuarios,getdate())
END IF
# PARA LA BASE DE DATOS MARMOTECH
EXECUTE selecciona USING mtasa.ano,mtasa.mes,mtasa.ventas,clientes[i].tipo_cliente1
IF STATUS = NOTFOUND THEN
IF clientes[i].tipo_cliente1 IS NOT NULL THEN
EXECUTE adicionar USING mtasa.ano,mtasa.mes,clientes[i].tipo_cliente1,mtasa.ventas,mtasa.tasa
END IF
ELSE
EXECUTE actual USING mtasa.tasa,mtasa.ano,mtasa.mes,mtasa.ventas,clientes[i].tipo_cliente1
END IF
END IF
END FOR
LET pano = mtasa.ano
LET pmes = mtasa.mes
LET pventas = mtasa.ventas
LET ptasa = mtasa.tasa
LET preplica = replica
IF replica = "SI" THEN
CALL replicar()
END IF
CALL insertalog()
CALL fgl_winmessage("INFO","ACTUALIZACION EXITOSA","INFO")
END IF
END DISPLAY
ON ACTION CANCEL
CALL fgl_winmessage("INFO","OPERACION CANCELADA","INFO")
RETURN
END DIALOG
CLOSE WINDOW w1
END FUNCTION
FUNCTION cventas()
DEFINE kventas SMALLINT, dventas CHAR(30)
DEFINE pventas ui.ComboBox
LET pventas = ui.combobox.forname("formonly.ventas")
DECLARE bventas CURSOR FOR
SELECT a.ventas,a.descripcion FROM vetb00060 a
CALL pventas.clear()
FOREACH bventas INTO kventas,dventas
CALL pventas.additem(kventas,dventas)
END FOREACH
END FUNCTION
FUNCTION replicar()
DEFINE replica,selecta,actualizacion STRING,
mes_falta,k,mesinsert INT
LET actualizacion = "UPDATE marmotech.dbo.cgtb00084 set tasa = ? WHERE ano = ? AND mes = ? AND ventas = ?"
PREPARE actualizacionxe FROM actualizacion
LET selecta = "SELECT DISTINCT a.ano FROM marmotech.dbo.cgtb00084 a WHERE a.ano = ? AND a.mes = ? AND a.ventas = ?"
PREPARE selecciona FROM selecta
LET replica = "INSERT INTO marmotech.dbo.cgtb00084 (ano,mes,ventas,tipo_cliente,tasa)
SELECT a.ano,?,a.ventas,a.tipo_cliente,a.tasa FROM cgtb00084 a WHERE a.ano = ? AND a.mes = ? AND a.ventas = ? "
PREPARE duplica FROM replica
LET mes_falta = 12 - pmes
LET mesinsert = pmes + 1
FOR k = 1 TO mes_falta
EXECUTE selecciona USING pano,mesinsert,pventas
IF STATUS = NOTFOUND THEN
EXECUTE duplica USING mesinsert,pano,pmes,pventas
ELSE
EXECUTE actualizacionxe USING ptasa,pano,mesinsert,pventas
END IF
LET mesinsert = mesinsert + 1
END FOR
END FUNCTION
FUNCTION insertaLog()
INSERT INTO cgtb00084_log VALUES (getdate(),usuarios,preplica)
END FUNCTION