This commit is contained in:
Luis
2026-10-19 10:11:40 -04:00
parent e0722b2e2a
commit a67f97271a
79 changed files with 19279 additions and 0 deletions
+305
View File
@@ -0,0 +1,305 @@
OPTIONS SHORT CIRCUIT
IMPORT util
IMPORT com
FUNCTION apiclient(pemail)
DEFINE data_apilayer RECORD
email,did_you_mean,USER,domain,syntax_valid STRING,
is_disposable,is_role_account,is_catch_all,is_deliverable,can_connect_smtp,
is_inbox_full,is_disabled,mx_records,FREE,score BOOLEAN
END RECORD
DEFINE data RECORD
data RECORD
status ,
result,
deprecation_notice string,
score smallint,
email string,
regexp,
gibberish,
disposable,
webmail,
mx_records,
smtp_server,
smtp_check,
accept_all,
block BOOLEAN
END RECORD,
source DYNAMIC ARRAY OF STRING,
meta RECORD
param STRING
END RECORD
END RECORD
DEFINE data_ipq RECORD
MESSAGE STRING,
success,
valid,
disposable BOOLEAN,
smtp_score ,
overall_score DEC(10,2),
first_name string,
generic,
common,
dns_valid,
honeypot BOOLEAN,
deliverability STRING,
frequent_complainer BOOLEAN,
spam_trap_score STRING,
catch_all,
timed_out,
suspect,
recent_abuse BOOLEAN,
fraud_score DEC(10,2),
suggested_domain string,
leaked BOOLEAN
END RECORD
DEFINE estado,purl,cmd,res, msg,s,pemail,tiposervice STRING,
ret INT
# LA API PARA VERIFICAR ESTA OFFLINE 29/05/2025
{ LET estado = 'VALIDO'
LET ret = 200
RETURN estado,ret
}
# SE DEVUELVE SI EL EMAIL ESTA EN BLANCO
IF pemail IS NULL THEN
LET ret = 400
LET estado = 'DEBES DIGITAR EL EMAIL POR FAVOR'
RETURN estado,ret
END IF
DISPLAY "llego: ",pemail
# ELECCION DE SERVICIOS, POR EL MOMENTO ES IPQUALITY
SELECT a.IDENTIFICACION INTO tiposervice FROM APIS a
WHERE a.estado = 'ONLINE'
IF STATUS = NOTFOUND THEN
RETURN estado,ret
END IF
# LET tiposervice = 'ipq1'
IF tiposervice = 'HUNTER' THEN
LET purl = "https://api.hunter.io/v2/email-verifier?email=",pemail CLIPPED,"&api_key=2a50343f3a2842b082ee2c4b3ecccaf4ae5a7766"
CALL ipquality_send_command(purl) RETURNING ret,res
DISPLAY "response api: ",res," longitud: ",res.getLength()
IF res.getLength() =0 THEN
INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score)
VALUES (pemail,data.data.status,getdate(),'mt101_hunter',suser_Sname(),data.data.score)
LET ret = 400
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
RETURN estado,ret
END IF
TRY
CALL util.JSON.parse(res,data)
CATCH
LET ret = 400
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
RETURN estado,ret
END TRY
# INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score)
# VALUES (pemail,data.data.status,getdate(),'forzado',suser_Sname(),data.data.score)
# LET estado = 'VALIDO'
# LET ret = 200
# RETURN estado,ret
LET s = util.JSON.stringify(res)
DISPLAY "DATA EMAIL: ",pemail CLIPPED, " score: ",data.data.score
INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,score)
VALUES (pemail,data.data.status,getdate(),'mt101_hunter',suser_Sname(),data.data.score)
IF ret ==0 THEN
IF data.data.mx_records = TRUE THEN
LET estado = 'VALIDO'
LET ret = 200
RETURN estado,ret
ELSE
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
LET ret = 400
RETURN estado,ret
END IF
IF data.data.smtp_server = TRUE THEN
LET estado = 'VALIDO'
LET ret = 200
RETURN estado,ret
ELSE
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
LET ret = 400
RETURN estado,ret
END IF
IF data.data.regexp = TRUE THEN
LET estado = 'VALIDO'
LET ret = 200
RETURN estado,ret
ELSE
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
LET ret = 400
RETURN estado,ret
END IF
IF data.data.disposable = TRUE THEN
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
LET ret = 400
RETURN estado,ret
ELSE
LET estado = 'VALIDO'
LET ret = 200
RETURN estado,ret
END IF
IF (data.data.status = 'valid' OR data.data.status = 'accept_all' OR
data.data.status = 'unknown') AND data.data.score > 29 THEN
LET estado = 'VALIDO'
LET ret = 200
RETURN estado,ret
ELSE
LET ret = 400
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
RETURN estado,ret
END IF
END IF
END IF
IF tiposervice = 'IPQUALITY' THEN
LET purl = 'https://ipqualityscore.com/api/json/email/cHZNnfXkbJDtx43YcrQqHSjXzBrndwT3/',pemail CLIPPED
CALL ipquality_send_command(purl) RETURNING ret,res
IF ret ==0 THEN
LET s = util.JSON.stringify(res)
CALL util.JSON.parse(res,data_ipq)
IF data_ipq.valid THEN
LET estado = 'VALIDO'
LET ret = 200
ELSE
LET ret = 400
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
END IF
END IF
END IF
IF tiposervice = 'APILAYER' THEN
# DISPLAY " ESTOY EN APILAYER"
LET purl= "https://api.apilayer.com/email_verification/",pemail CLIPPED
CALL apilayer_send_command(purl, cmd) RETURNING ret, res
# DISPLAY "res ",res," ",ret
IF ret ==0 THEN
LET s = util.JSON.stringify(res)
CALL util.JSON.parse(res,data_apilayer)
IF data_apilayer.can_connect_smtp THEN
LET estado = 'VALIDO'
LET ret = 200
ELSE
LET ret = 400
LET estado = 'NO SE PUEDE ENTREGAR MENSAJE A ESTA DIRECCION EMAIL'
END IF
# DISPLAY "sintax ",data.syntax_valid," deliv ",data.is_deliverable
ELSE
IF ret = 429 THEN
LET ret = 200
LET estado ='VALIDO POR EXESO DE REQUEST'
ELSE
LET ret = 400
LET estado = 'NO FUE POSIBLE LA CONEXION, '
END IF
END IF
END IF
# LET ret = 200
DISPLAY "en return ",estado," ",ret
RETURN estado,ret
END FUNCTION
#
## Communications library using com (http or https)
#
FUNCTION apilayer_send_command(url, cmd)
DEFINE url, cmd STRING
DEFINE result, tmp STRING
DEFINE http_req com.HTTPRequest
DEFINE http_resp com.HTTPResponse
TRY
UPDATE apis SET cuenta = cuenta + 1 WHERE estado = 'ONLINE'
LET http_req = com.HTTPRequest.Create(url)
CALL http_req.setHeader("api_key","2a50343f3a2842b082ee2c4b3ecccaf4ae5a7766")
CALL http_req.doRequest()
LET http_resp=http_req.getResponse()
IF http_resp.getStatusCode() != 200 THEN
RETURN http_resp.getStatusCode(), http_resp.getStatusDescription()
END IF
LET tmp = http_resp.getStatusDescription()
IF (tmp == "OK" || tmp == "no error" ) THEN
RETURN -1, SFMT("HTTP request status description: %1 ",tmp)
END IF
LET result = http_resp.getTextResponse()
CATCH
RETURN -2, SFMT("HTTP request error: STATUS=%1 (%2)",STATUS,SQLCA.sqlerrd[2])
END TRY
RETURN 0, result
END FUNCTION
FUNCTION ipquality_send_command(url)
DEFINE url, cmd STRING
DEFINE result, tmp STRING
DEFINE http_req com.HTTPRequest
DEFINE http_resp com.HTTPResponse
DISPLAY "url", url
TRY
LET http_req = com.HTTPRequest.Create(url)
CALL http_req.setHeader("apikey","cHZNnfXkbJDtx43YcrQqHSjXzBrndwT3")
CALL http_req.doRequest()
LET http_resp=http_req.getResponse()
IF http_resp.getStatusCode() != 200 THEN
RETURN http_resp.getStatusCode(), http_resp.getStatusDescription()
END IF
LET tmp = http_resp.getStatusDescription()
IF (tmp == "OK" || tmp == "no error" ) THEN
RETURN -1, SFMT("HTTP request status description: %1 ",tmp)
END IF
LET result = http_resp.getTextResponse()
CATCH
RETURN -2, SFMT("HTTP request error: STATUS=%1 (%2)",STATUS,SQLCA.sqlerrd[2])
END TRY
RETURN 0, result
END FUNCTION
+149
View File
@@ -0,0 +1,149 @@
{
FUNCION : costoLiquidacion
OBJETIVO : Determinar el costo unitario que debe tener un producto terminado
o un repuesto para valorizar el asiento de inventario en linea,
de acuerdo a la liquidacion de mercancia (cttb00013) o al costo
estandard. Centraliza el criterio de costeo que antes aplicaba
el usuario de forma manual.
DESARROLLADO : Equipo Tecnologia (Juan Soto)
FECHA : 14 Septiembre 2026
REGLA DE COSTO (definida por el usuario):
- Repuestos (ptipoInv = 'R'):
Siempre costo estandard irtb00013.costo_st (ano del documento, mes_fin = 12).
- Terminados (ptipoInv = 'P'):
* iptb00002.es_produccion = TRUE -> SIEMPRE costo estandard iptb00004
(material + labor + gastos, mes_fin = 12).
* es_produccion = FALSE (compra/venta):
- Se busca la ULTIMA liquidacion DEL MES del documento en cttb00013.
(Solo el mes: si la liquidacion fue en un mes anterior, lqprrp004
ya actualizo el costo estandard, por lo que ese ya lo refleja.)
- Si hay liquidacion del mes Y su cantidad liquidada > existencia actual
(SUM iptb00006.cantidad_2 WHERE status_t IS NULL) -> costo_lq.
- En caso contrario (existencia >= liquidada, o no hay liquidacion
del mes) -> costo estandard iptb00004.
NOTA: usa nombres calificados marmotech.dbo.* igual que GeneraEntradaDiario.4gl y
controlNumericoED.4gl, para leer siempre la BD correcta sin depender de la
conexion del programa llamador.
}
FUNCTION costoLiquidacion(pcod_n, pcod_grupo, pcod_tipo, pcod_sec, pfecha, ptipoInv)
DEFINE
pcod_n, pcod_grupo, pcod_tipo, pcod_sec INT,
pfecha DATE,
ptipoInv CHAR(1),
costo DEC(18, 4),
costo_std DEC(18, 4),
xcosto_lq DEC(18, 4),
cant_lq DEC(18, 4),
existencia DEC(18, 4),
es_prod SMALLINT,
qsql STRING
LET costo = 0
LET costo_std = 0
LET xcosto_lq = 0
LET cant_lq = 0
LET existencia = 0
LET es_prod = 0
#-------------------------------------------------------------------------
# REPUESTOS -> costo estandard irtb00013.costo_st
#-------------------------------------------------------------------------
IF ptipoInv = 'R' THEN
LET qsql =
"SELECT ISNULL(a.costo_st,0)
FROM marmotech.dbo.irtb00013 a
WHERE a.cod_n = ? AND a.cod_grupo = ? AND a.cod_tipo = ? AND a.cod_sec = ?
AND a.ano = YEAR(?) AND a.mes_fin = 12 AND a.status_t IS NULL"
PREPARE sc_rep FROM qsql
EXECUTE sc_rep INTO costo
USING pcod_n, pcod_grupo, pcod_tipo, pcod_sec, pfecha
FREE sc_rep
IF costo IS NULL THEN
LET costo = 0
END IF
RETURN costo
END IF
#-------------------------------------------------------------------------
# TERMINADOS -> costo estandard iptb00004 (material + labor + gastos)
# Se calcula siempre porque es el respaldo y el valor para es_produccion.
#-------------------------------------------------------------------------
LET qsql =
"SELECT ISNULL(AVG(ISNULL(a.material,0)+ISNULL(a.labor,0)+ISNULL(a.gastos,0)),0)
FROM marmotech.dbo.iptb00004 a
WHERE a.cod_n = ? AND a.cod_grupo = ? AND a.cod_tipo = ? AND a.cod_sec = ?
AND a.ano = YEAR(?) AND a.mes_fin = 12 AND a.status_t IS NULL"
PREPARE sc_std FROM qsql
EXECUTE sc_std INTO costo_std
USING pcod_n, pcod_grupo, pcod_tipo, pcod_sec, pfecha
FREE sc_std
IF costo_std IS NULL THEN
LET costo_std = 0
END IF
# es_produccion del articulo
LET qsql =
"SELECT TOP 1 ISNULL(a.es_produccion,0)
FROM marmotech.dbo.iptb00002 a
WHERE a.cod_n = ? AND a.cod_grupo = ? AND a.cod_tipo = ? AND a.cod_sec = ?"
PREPARE sc_esp FROM qsql
EXECUTE sc_esp INTO es_prod
USING pcod_n, pcod_grupo, pcod_tipo, pcod_sec
FREE sc_esp
IF es_prod IS NULL THEN
LET es_prod = 0
END IF
# Producto de produccion -> siempre estandard
IF es_prod = 1 THEN
RETURN costo_std
END IF
#-------------------------------------------------------------------------
# COMPRA/VENTA -> ultima liquidacion DEL MES vs existencia
#-------------------------------------------------------------------------
LET qsql =
"SELECT TOP 1 ISNULL(a.costo_lq,0), ISNULL(a.cantidad,0)
FROM marmotech.dbo.cttb00013 a
WHERE a.cod_n = ? AND a.cod_grupo = ? AND a.cod_tipo = ? AND a.cod_sec = ?
AND YEAR(a.fecha_lq) = YEAR(?) AND MONTH(a.fecha_lq) = MONTH(?)
AND a.fecha_lq <= ?
AND a.status_t IS NULL
ORDER BY a.fecha_lq DESC, a.fech_crea DESC"
PREPARE sc_lq FROM qsql
EXECUTE sc_lq INTO xcosto_lq, cant_lq
USING pcod_n, pcod_grupo, pcod_tipo, pcod_sec, pfecha, pfecha, pfecha
FREE sc_lq
# No hay liquidacion en el mes -> estandard
IF STATUS = NOTFOUND OR xcosto_lq IS NULL THEN
RETURN costo_std
END IF
# Existencia actual del articulo (solo movimientos vigentes)
LET qsql =
"SELECT ISNULL(SUM(a.cantidad_2),0)
FROM marmotech.dbo.iptb00006 a
WHERE a.cod_n = ? AND a.cod_grupo = ? AND a.cod_tipo = ? AND a.cod_sec = ?
AND a.status_t IS NULL"
PREPARE sc_exi FROM qsql
EXECUTE sc_exi INTO existencia
USING pcod_n, pcod_grupo, pcod_tipo, pcod_sec
FREE sc_exi
IF existencia IS NULL THEN
LET existencia = 0
END IF
# Cantidad liquidada mayor que la existencia -> costo liquidado
IF cant_lq > existencia THEN
RETURN xcosto_lq
END IF
# Existencia mayor o igual -> costo estandard
RETURN costo_std
END FUNCTION
+19
View File
@@ -0,0 +1,19 @@
FUNCTION cuentas()
DEFINE kcuenta VARCHAR(14),
kdescripcion CHAR(60),
cuentas ui.ComboBox
LET cuentas = ui.combobox.forname("formonly.xcuenta")
DECLARE busca_cuenta CURSOR FOR
SELECT RTRIM(a.cuenta_no),RTRIM(a.descripcion)+'('+RTRIM(a.cuenta_no)+')'
FROM cgtb00001 a
WHERE a.nivel > 2 AND a.cuenta_no LIKE '7%' AND a.status_t IS NULL
ORDER BY a.descripcion
CALL cuentas.clear()
FOREACH busca_cuenta INTO kcuenta,kdescripcion
CALL cuentas.additem(kcuenta,kdescripcion)
END FOREACH
END FUNCTION
+38
View File
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" ?>
<ManagedForm fileVersion="31400" gstVersion="3140a" name="managedform" uid="{4e91ac7b-8ee9-47ca-94fc-0f0dcdf59e19}">
<AGSettings>
<DynamicProperties version="2"/>
</AGSettings>
<Record name="s_existencia" uid="{f2ea8bb1-febf-40ef-8edc-a834a1a6dc9d}">
<RecordField fieldIdRef="1" name="almacen" uid="{7c966db1-ab91-4323-9bc2-49f632042c0b}"/>
<RecordField fieldIdRef="2" name="fisico" uid="{1f2df6fe-ce62-4cb5-9169-9ea4d0def99b}"/>
</Record>
<Record name="record2" uid="{1f6c696f-6d99-44a6-93ba-f18041035d3d}">
<RecordField fieldIdRef="3" name="producto" uid="{6b3c28df-e79d-40d2-ba7b-5acabd648978}"/>
<RecordField fieldIdRef="4" name="disponible" uid="{51910a5f-9130-4e5f-b175-10b1d2426f1b}"/>
<RecordField fieldIdRef="5" name="pcantidad_ordenes" uid="{3d9bfa9a-5cdf-4f55-82e9-af263960d69f}"/>
<RecordField fieldIdRef="6" name="pcantidadConduce" uid="{22e756b2-846e-4606-971a-46c943cd739b}"/>
<RecordField fieldIdRef="7" name="pexistencia" uid="{3a113657-065d-46ff-8181-a8870c953696}"/>
</Record>
<Form gridHeight="25" gridWidth="80" name="form" text="ORDENES - EXISTENCIAS ALMACENES">
<Grid gridHeight="12" gridWidth="63" name="grid1" posX="3" posY="1">
<Label gridHeight="1" gridWidth="38" justify="center" name="label1" posX="2" posY="1" text="EXISTENCIAS ALMACENES"/>
<Edit fieldId="3" gridHeight="1" gridWidth="38" name="producto" posX="2" posY="2" scroll="true" tabIndex="-1" title="edit1" widget="Edit"/>
<Label gridHeight="1" gridWidth="7" name="label2" posX="2" posY="3" text="Disponible"/>
<Edit fieldId="4" gridHeight="1" gridWidth="10" name="disponible" posX="10" posY="3" tabIndex="-1" title="edit1" widget="Edit"/>
<Label gridHeight="1" gridWidth="7" name="label5" posX="22" posY="3" text="Existencia"/>
<Edit fieldId="7" gridHeight="1" gridWidth="10" name="pexistencia" posX="30" posY="3" tabIndex="-1" title="edit2" widget="Edit"/>
<Label gridHeight="1" gridWidth="7" name="label3" posX="2" posY="4" text="Orden"/>
<Edit fieldId="5" gridHeight="1" gridWidth="10" name="pcantidad_ordenes" posX="10" posY="4" tabIndex="-1" title="edit1" widget="Edit"/>
<Label gridHeight="1" gridWidth="7" name="label4" posX="22" posY="4" text="Conduce"/>
<Edit fieldId="6" gridHeight="1" gridWidth="10" name="pcantidadConduce" posX="30" posY="4" tabIndex="-1" title="edit1" widget="Edit"/>
<Table gridHeight="7" gridWidth="27" name="table1" posX="3" posY="5" totalRows="5">
<Edit fieldId="1" gridHeight="1" gridWidth="8" name="almacen" posX="0" posY="0" scroll="true" tabIndex="-1" title="Almacenes" widget="Edit"/>
<Edit aggregate="true" aggregateName="aggregate1" aggregateSqlType="DECIMAL" aggregateText="Existencia Total" fieldId="2" gridHeight="1" gridWidth="8" name="fisico" posX="8" posY="0" scroll="true" tabIndex="-1" title="Existencia Fisica" unsortable="true" widget="Edit"/>
</Table>
</Grid>
</Form>
<DiagramLayout>
<![CDATA[AAAAAgAAAEwAewBmADIAZQBhADgAYgBiADEALQBmAGUAYgBmAC0ANAAwAGUAZgAtADgAZQBkAGMALQBhADgAMwA0AGEAMQBhADYAZABjADkAZAB9AAAAAAAAAAAAAAAAAAAAAD9ok3S8an76AQAAAEwAewAxAGYANgBjADYAOQA2AGYALQA2AGQAOQA5AC0ANAA0AGEANgAtADkAMwBiAGEALQBmADEAOAAwADQAMQAwADMANQBkADMAZAB9QH+mZnZZmZzAQAAABwAAAT9QYk3S8an8AQ==]]>
</DiagramLayout>
</ManagedForm>
+54
View File
@@ -0,0 +1,54 @@
FUNCTION busca_departamento()
DEFINE pdepartamento ui.combobox,
kdepartamento SMALLINT,kdescripcion CHAR(30)
LET pdepartamento = ui.combobox.forname("formonly.departamento")
CALL pdepartamento.clear()
DECLARE pagar CURSOR FOR
SELECT departamento, nom_dpto FROM adtb00001
WHERE status_t is null
ORDER BY nom_dpto
FOREACH pagar INTO kdepartamento,kdescripcion
CALL pdepartamento.additem(kdepartamento,kdescripcion)
END FOREACH
END FUNCTION
{
FUNCTION departamento_user()
DEFINE departamentos_user DYNAMIC ARRAY OF RECORD
departamento INT,
titulo VARCHAR(100)
END RECORD
DECLARE busca_dep CURSOR FOR
SELECT '0',a.departamento,a.nom_dpto,a.tipo_departamento
FROM adtb00001 a WHERE a.status_t IS NULL
ORDER BY a.nom_dpto
LET idx = 1
FOREACH busca_dep INTO arr_departamentos[idx].*
LET idx = idx + 1
END FOREACH
END FUNCTION
}
FUNCTION departamento_user(xuser)
DEFINE pdepartamento ui.combobox,
kdepartamento SMALLINT,kdescripcion CHAR(30),
xuser STRING
LET pdepartamento = ui.combobox.forname("formonly.departamento")
CALL pdepartamento.clear()
DECLARE depto CURSOR FOR
SELECT a.departamento, a.nom_dpto FROM adtb00001 a,adtb00056 b
WHERE a.departamento = b.departamento_visualiza AND
b.usuario = xuser AND
a.status_t is null
ORDER BY nom_dpto
FOREACH depto INTO kdepartamento,kdescripcion
CALL pdepartamento.additem(kdepartamento,kdescripcion)
END FOREACH
END FUNCTION
+42
View File
@@ -0,0 +1,42 @@
FUNCTION maquinas(xdepartamento)
DEFINE
kmaquina VARCHAR(14),
kdescripcion CHAR(75),
maquinas ui.ComboBox,
xdepartamento INT
LET maquinas = ui.combobox.forname("formonly.codigo")
IF xdepartamento = -1 THEN
DECLARE busca_maquinas1 CURSOR FOR
SELECT a.codigo,
RTRIM(a.nombre) + '(' + ISNULL(RTRIM(a.codigo_externo), ' ')
+ ')'
FROM irtb00009 a
WHERE a.status_t IS NULL AND a.codigo_externo IS NOT NULL
ORDER BY a.nombre
CALL maquinas.clear()
FOREACH busca_maquinas1 INTO kmaquina, kdescripcion
CALL maquinas.additem(kmaquina, kdescripcion)
END FOREACH
ELSE
DECLARE busca_maquinas2 CURSOR FOR
SELECT a.codigo,
RTRIM(a.nombre) + '(' + ISNULL(RTRIM(a.codigo_externo), ' ')
+ ')'
FROM irtb00009 a
WHERE a.status_t IS NULL AND a.departamento = xdepartamento
AND a.codigo_externo IS NOT NULL
ORDER BY a.nombre
CALL maquinas.clear()
FOREACH busca_maquinas2 INTO kmaquina, kdescripcion
CALL maquinas.additem(kmaquina, kdescripcion)
END FOREACH
END IF
END FUNCTION
+42
View File
@@ -0,0 +1,42 @@
{
FUNCION : msgmodal
OBJETIVO : Mostrar un mensaje de msgtable en una ventana MODAL.
Complementa a msg(), que lo despliega en la linea de ERROR.
DESARROLLADO : Equipo Tecnologia (Juan Soto)
FECHA : 21 Septiembre 2026
CUANDO USAR CUAL
----------------
msg(n) -> Errores de VALIDACION durante la captura. El usuario esta
parado en el campo, lee el aviso en la linea de ERROR,
corrige y sigue. No interrumpe el flujo.
msgmodal(n) -> Hechos que el usuario NO PUEDE pasar por alto, tipicamente
cuando se ABORTO la transaccion y el documento NO se guardo.
Si eso solo parpadeara en la linea de ERROR mientras la
pantalla se limpia, el usuario se iria creyendo que guardo.
El texto vive en msgtable igual que el de msg(), de modo que se puede
corregir sin recompilar los programas.
}
FUNCTION msgmodal(numero_msg)
DEFINE
numero_msg SMALLINT,
descripcion CHAR(120)
LET descripcion = NULL
SELECT desc_msg
INTO descripcion
FROM msgtable
WHERE cod_msg = numero_msg
IF status = NOTFOUND OR descripcion IS NULL THEN
LET descripcion = "MENSAJE NO DEFINIDO EN MSGTABLE: ",
numero_msg USING "<<<<"
END IF
CALL fgl_winmessage("AVISO", descripcion CLIPPED, "stop")
END FUNCTION
+45
View File
@@ -0,0 +1,45 @@
FUNCTION productos_incluye(tabla1,tabla2,tabla3,tabla4,tabla5,xcriterio,xbodega,xfecha,xseccion,xtramo)
DEFINE tabla1,tabla2,tabla3,tabla4,tabla5,selec,xcriterio STRING,
xbodega,xseccion,xtramo SMALLINT,
xfecha DATE,
xid INT,
xfech_crea DATETIME YEAR TO MINUTE
DEFINE xitems RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT
END RECORD
LET xfech_crea = CURRENT
LET selec = "SELECT DISTINCT a.cod_n,a.cod_Grupo,a.cod_tipo,a.cod_sec FROM ",tabla1 CLIPPED," AS a ",
" INNER JOIN ",tabla5 CLIPPED ," AS b ON a.cod_n = b.cod_n AND a.cod_grupo = b.cod_grupo AND ",
" a.cod_tipo = b.cod_tipo AND ",
" a.cod_sec = b.cod_sec AND a.status_t IS NULL AND b.status_t is NULL AND a.control_existencia = 'SI' ",
" WHERE b.bodega = ",xbodega USING "<<<", " and ",xcriterio CLIPPED
PREPARE comando FROM selec
DECLARE busca_item CURSOR FOR comando
LET selec = "SELECT DISTINCT a.cod_n FROM ",tabla3 CLIPPED,
" AS a WHERE a.cod_n = ? AND a.cod_grupo = ? AND a.cod_tipo = ? AND a.cod_sec = ? AND a.fecha = ? AND a.bodega = ?"
PREPARE comando1 FROM selec
LET selec = "INSERT INTO ",tabla3 CLIPPED," (idtrx,fecha,bodega,cod_Seccion,cod_tramo,cod_n,cod_grupo,cod_tipo,cod_Sec,cantidad,us_crea,fech_crea) ",
" VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"
PREPARE inserta FROM selec
LET selec = "SELECT MAX(a.idtrx) FROM ",tabla3 CLIPPED, " AS a WHERE a.fecha =? AND a.bodega =? "
PREPARE busca_max FROM selec
EXECUTE busca_max INTO xid USING xfecha,xbodega
FOREACH busca_item INTO xitems.*
EXECUTE comando1 USING xitems.cod_n,xitems.cod_grupo,xitems.cod_tipo,xitems.cod_sec,xfecha,xbodega
IF STATUS = NOTFOUND THEN
EXECUTE inserta USING xid,xfecha,xbodega,xseccion,xtramo,xitems.cod_n,xitems.cod_grupo,xitems.cod_tipo,
xitems.cod_sec,"0","INCLUYE",xfech_crea
LET xid = xid + 1
END IF
END FOREACH
END FUNCTION
+17
View File
@@ -0,0 +1,17 @@
FUNCTION cseccion(almacen)
DEFINE kcod_seccion,almacen SMALLINT,
kdescripcion CHAR(30),
pseccion ui.ComboBox
LET pseccion = ui.combobox.forname("formonly.seccion")
DECLARE busca_sec CURSOR FOR
SELECT a.cod_seccion,a.descripcion FROM Intb00010 a
WHERE a.cod_bodega = almacen
CALL pseccion.clear()
FOREACH busca_sec INTO kcod_seccion,kdescripcion
CALL pseccion.additem(kcod_seccion,kdescripcion)
END FOREACH
CALL pseccion.additem(99,"TODAS")
END FUNCTION
+18
View File
@@ -0,0 +1,18 @@
FUNCTION ctramo(almacen,seccion)
DEFINE kcod_tramo,almacen,seccion SMALLINT,kdescripcion CHAR(30),
ptramo ui.ComboBox
LET ptramo = ui.combobox.forname("formonly.tramo")
DECLARE busca_tramo CURSOR FOR
SELECT a.cod_tramo,a.descripcion FROM Intb00043 a
WHERE a.cod_bodega = almacen and a.cod_Seccion = seccion
CALL ptramo.clear()
FOREACH busca_tramo INTO kcod_tramo,kdescripcion
DISPLAY "tramos ",kcod_tramo,kdescripcion," ",almacen," ",seccion
CALL ptramo.additem(kcod_tramo,kdescripcion)
END FOREACH
CALL ptramo.additem(99,"TODOS")
END FUNCTION