Files
MBS/PROYECTO/codir/coprorden.4gl
T
Abel LópezandClaude Sonnet 5 acacf34eea Añadir modulo COMPRAS (coprmt001, coprmt009, coprmt016)
- coprmt001 (Suplidores): agregar campos faltantes (tipo_doc,rnc,cuenta_no)
  al RECORD interno de ApiMaintainC() en api_test.4gl, y unificar la
  aridad de RETURNING en las 3 llamadas (POST/PATCH/DELETE) - el
  enlazador exige el mismo numero de valores de retorno en todo el modulo.
- coprmt009 (Ordenes de Compra): reemplazar fgl_report_loadCurrentSettings/
  selectDevice/selectPreview/commitCurrentSettings (no disponibles en este
  FGL) por om.XmlWriter.createFileWriter en coprorden.4gl; agregar
  verificacion defensiva en lugarentrega.4gl (ui.combobox.forname puede
  devolver NULL si el formulario actual no tiene el combo "bodega"); quitar
  "ordenes.bodega" de los INPUT BY NAME (campo oculto, no se puede enlazar).
  Pendiente: probar el flujo completo de creacion de orden (se corto por
  una caida de conexion transitoria durante la prueba).
- coprmt016 (Terminos de Pago): CRUD simple, sin cambios de codigo.
- mbsERP.4pw: crear modulo COMPRAS (estaba vacio) con librerias
  FUNCIONES_CO y FORMULARIOS_CO, y registrar los 3 programas.
- otrodir/smarmotech.sch: diccionario de esquema completo (antes faltaba
  en este directorio, causaba fallos de link en api_test.4gl).
- .gitignore: excluir logs de STARTLOG() (bin/*.TXT) y archivos .err de
  compilacion.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-25 16:58:59 -04:00

199 lines
7.3 KiB
Plaintext

SCHEMA smarmotech
GLOBALS
DEFINE xbusca_parcial DYNAMIC ARRAY OF RECORD
secuencia INT,
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cantidad DEC(12,5),
fech_emb DATE,
fech_ent DATE
END RECORD
END GLOBALS
FUNCTION orden(xflete1,xarr_ordenes,xordenes,x,x1,xship_to,xmoneda,r_output,knota,zdesc1,zdesc2,zdesc3,zdesc4,zdesc5,
kdetalle_orden, uso)
DEFINE zdesc1,zdesc2,zdesc3,zdesc4,zdesc5 CHAR(20),
codigo_prod VARCHAR(30),
xorden,xtipo_cliente,xsec_cliente INT,xnombre_cliente VARCHAR(100)
DEFINE idx SMALLINT,
xmoneda,kdetalle_orden STRING,
knota VARCHAR(100)
DEFINE xflete1 RECORD
total_b DECIMAL(12,2),
valor DECIMAL(12,2),
ot_valor DECIMAL(12,2),
total_1 DECIMAL(12,2),
descu_valor DECIMAL(12,2)
END RECORD
DEFINE handler om.SaxDocumentHandler,
r_filename STRING, -- filename of Report Design Document including .4rp extension
r_output VARCHAR(10), -- output format option
preview INTEGER,
p_reportfile STRING,
xvalor DEC(12,2),
x RECORD
nom_sp LIKE cotb00001.nom_sp,
dir_sp LIKE cotb00001.dir_sp,
ciu_sp LIKE cotb00001.ciu_sp
END RECORD,
x1 RECORD LIKE cotb00018.*,
xship_to STRING
DEFINE xordenes RECORD
num_oc INTEGER,
tipo LIKE cotb00014.tipo,
fech_oc LIKE cotb00014.fech_oc,
num_pr LIKE cotb00014.num_pr,
cod_sp LIKE cotb00014.cod_sp,
cod_sp_sec LIKE cotb00014.cod_sp_sec,
term_sp LIKE cotb00014.term_sp,
via LIKE cotb00014.via,
enviada LIKE cotb00014.enviada,
fech_enviada LIKE cotb00014.fech_enviada,
pago LIKE cotb00014.pago,
fech_pago LIKE cotb00014.fech_pago,
cierre LIKE cotb00014.cierre,
cod_pt CHAR(4),
bodega INT
END RECORD
DEFINE xarr_ordenes DYNAMIC ARRAY OF RECORD
num_orden INT,
num_req LIKE cotb00006.num_req,
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
descripcion CHAR(180),
unidad CHAR(4),
cantidad DECIMAL(12,3),
tipo_costo CHAR(10),
precio DECIMAL(18,5),
porc_desc DEC(12,2),
monto_desc DEC(12,2),
valor DECIMAL(12,2)
END RECORD, uso STRING
IF xarr_ordenes.getLength() > 0 THEN
-- La API de configuracion de reportes (fgl_report_*) no esta
-- disponible en este FGL; se escribe el XML directo a un archivo
-- en FGLSPOOL en lugar de usar la plantilla .4rp con vista previa.
LET p_reportfile = FGL_GETENV("FGLSPOOL"), "/coprmt009_orden.xml"
LET handler = om.XmlWriter.createFileWriter(p_reportfile)
--run the report
IF handler IS NOT NULL THEN -- report engine was configured ok
START REPORT r_orden TO XML HANDLER HANDLER
FOR idx = 1 TO xarr_ordenes.getLength()
IF xarr_ordenes[idx].cod_n IS NOT NULL THEN
LET codigo_prod = xarr_ordenes[idx].cod_n USING "&&&&"+"-"+xarr_ordenes[idx].cod_grupo USING "&&&&"+"-"+
xarr_ordenes[idx].cod_tipo USING "&&&&"+"-"+xarr_ordenes[idx].cod_sec USING "&&&&"
OUTPUT TO REPORT r_orden(xflete1.*,xarr_ordenes[idx].*,xordenes.*,x.*,x1.*,xship_to,xmoneda,knota,
zdesc1,zdesc2,zdesc3,zdesc4,zdesc5,kdetalle_orden,codigo_prod, uso)
END IF
END FOR
FINISH REPORT r_orden
END IF
END IF
END FUNCTION
REPORT r_orden(zflete1,karr_ordenes,kordenes,k,k1,kship_to,kmoneda,znota,xdesc1,xdesc2,xdesc3,xdesc4,xdesc5,
xdetalle_orden,xcodigo_prod, xusos)
DEFINE xdesc1,xdesc2,xdesc3,xdesc4, xdesc5 CHAR(20),
xcodigo_prod VARCHAR(30),
xdetalle_orden VARCHAR(200),
xusos VARCHAR(200)
DEFINE kordenes RECORD
num_oc INTEGER,
tipo LIKE cotb00014.tipo,
fech_oc LIKE cotb00014.fech_oc,
num_pr LIKE cotb00014.num_pr,
cod_sp LIKE cotb00014.cod_sp,
cod_sp_sec LIKE cotb00014.cod_sp_sec,
term_sp LIKE cotb00014.term_sp,
via LIKE cotb00014.via,
enviada LIKE cotb00014.enviada,
fech_enviada LIKE cotb00014.fech_enviada,
pago LIKE cotb00014.pago,
fech_pago LIKE cotb00014.fech_pago,
cierre LIKE cotb00014.cierre,
cod_pt CHAR(4),
bodega INT
END RECORD,
kship_to VARCHAR(80),
i INT,
k RECORD
nom_sp LIKE cotb00001.nom_sp,
dir_sp LIKE cotb00001.dir_sp,
ciu_sp LIKE cotb00001.ciu_sp
END RECORD,
k1 RECORD LIKE cotb00018.*,
kmoneda CHAR(30),
znota VARCHAR(100)
DEFINE zflete1 RECORD
total_b DECIMAL(12,2),
valor DECIMAL(12,2),
ot_valor DECIMAL(12,2),
total_1 DECIMAL(12,2),
descu_valor DECIMAL(12,2)
END RECORD,
tiene_parcial BOOLEAN
DEFINE karr_ordenes RECORD
num_orden INT,
num_req LIKE cotb00006.num_req,
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
descripcion CHAR(180),
unidad CHAR(4),
cantidad DECIMAL(12,3),
tipo_costo CHAR(10),
precio DECIMAL(18,5),
porc_desc DEC(12,2),
monto_desc DEC(12,2),
valor DECIMAL(12,2)
END RECORD,
total_neto,total_bruto,total_itbis DEC(12,2)
ORDER BY kordenes.num_oc,xcodigo_prod
FORMAT
BEFORE GROUP OF kordenes.num_oc
LET total_neto=0
LET total_bruto=0
LET total_itbis = 0
ON EVERY ROW
#LET total_bruto = total_bruto + (karr_ordenes.cantidad*karr_ordenes.precio)
#LET total_itbis =zflete1.valor
#LET total_neto= total_neto + total_bruto+total_itbis
LET karr_ordenes.valor = karr_ordenes.cantidad * karr_ordenes.precio
IF karr_ordenes.monto_desc IS NOT NULL THEN
LET karr_ordenes.valor = karr_ordenes.valor - karr_ordenes.monto_desc
END IF
PRINTX kordenes.*,karr_ordenes.*,k.*,k1.*,kship_to,kmoneda,zflete1.*,znota,xdesc1,xdesc2,xdesc3,xdesc4,xdesc5,
xdetalle_orden, xusos
AFTER GROUP OF xcodigo_prod
CALL entregas_parciales(kordenes.num_oc,karr_ordenes.num_req,karr_ordenes.cod_n,karr_ordenes.cod_grupo,karr_ordenes.cod_tipo,
karr_ordenes.cod_sec) RETURNING xbusca_parcial
LET tiene_parcial = FALSE
FOR i=1 TO xbusca_parcial.getLength()
LET tiene_parcial = TRUE
PRINTX xcodigo_prod,xbusca_parcial[i].cantidad,xbusca_parcial[i].fech_emb,xbusca_parcial[i].fech_ent
END FOR
END REPORT