lsoto
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user