Files
MBS/PROYECTO/acdir/acprmt001.4gl
T

880 lines
29 KiB
Plaintext

{
------------------------------------------------------------------
PROGRAMA : ACPRMT001
OBJETIVO : Capturar, Modificar, Eliminar registros de la
Tabla Catalogo de Bienes y Servicios
PROGRAMADOR : Ing. Elvis García
FECHA REALIZACION : Agosto 13, 2024
------------------------------------------------------------------
}
IMPORT FGL fgldialog
IMPORT util
IMPORT com
GLOBALS "acprgb000.4gl"
DEFINE next_code, checkMaintainID INT
DEFINE des RECORD
descripcion2, descripcion3, descripcion4, descripcion5 STRING
END RECORD
DEFINE DisArray DYNAMIC ARRAY OF RECORD
codigo1 INT,
descripcion STRING,
cuenta_no1 CHAR(8),
departamento1 STRING,
id_maintainX INT
END RECORD
DEFINE infoArray RECORD
codigo INT,
descripcion1 STRING,
cuenta_no CHAR(8),
cta_depr CHAR(8),
cta_gasto CHAR(8),
departamento2 SMALLINT,
fech_compra DATE,
duracion INT,
fech_elim DATE,
referencia STRING,
fabricante STRING,
status_t CHAR(1),
us_crea STRING,
fech_crea DATE,
us_mod STRING,
fech_mod DATE,
sucid INT,
id_MaintainX INT,
id_maquina INT,
desc_maquina STRING
END RECORD
DEFINE answer STRING, ApiCheck BOOLEAN
DEFINE maquinaria RECORD
unidad_med CHAR(10),
modelo STRING,
serie STRING,
departamento STRING,
codigo_externo STRING
END RECORD
DEFINE extraCampos RECORD
cod_sp INT,
cod_sp_sec INT,
nom_prov STRING,
tipo_Activo STRING,
activo_padre INT,
nom_activoPadre STRING
END RECORD
DEFINE documento BYTE
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT TO "smarmotech" USER usuarios USING clave
SELECT a.* INTO p_companias.* FROM companias a
CALL acprmt001()
END MAIN
FUNCTION acprmt001()
OPEN WINDOW w1 WITH FORM "acfmmt001"
CALL fgl_settitle("Maestra de Activos Fijos")
CALL acpcad001()
DIALOG ATTRIBUTE(UNBUFFERED)
DISPLAY ARRAY DisArray TO Tabla.*
ON ACTION refresh
INITIALIZE infoArray.*, des.*, maquinaria.*, extraCampos.* TO NULL
CALL acpcad001()
ON ACTION Adicionar
INITIALIZE infoArray, des, maquinaria.*, extraCampos.* TO NULL
LET infoArray.us_crea = usuarios
LET infoArray.fech_crea = CURRENT YEAR TO DAY
SELECT TOP(1) codigo
INTO next_code
FROM actb00001
ORDER BY codigo DESC
LET infoArray.codigo = next_code + 1
INPUT BY NAME infoArray.*, des.*, maquinaria.*, extraCampos.*, apiCheck
ATTRIBUTES(UNBUFFERED, WITHOUT DEFAULTS)
AFTER FIELD descripcion1
IF infoArray.descripcion1 IS NULL THEN
CALL msg(16)
NEXT FIELD descripcion1
END IF
AFTER FIELD cuenta_no
SELECT a.descripcion
INTO des.descripcion2
FROM cgtb00001 a
WHERE cuenta_no = infoArray.cuenta_no
IF STATUS = NOTFOUND THEN
CALL msg(3)
NEXT FIELD cuenta_no
END IF
DISPLAY BY NAME des.descripcion2
AFTER FIELD cta_depr
SELECT a.descripcion
INTO des.descripcion3
FROM cgtb00001 a
WHERE a.cuenta_no = infoArray.cta_depr
IF STATUS = NOTFOUND THEN
CALL msg(3)
NEXT FIELD cuenta_no
END IF
DISPLAY BY NAME des.descripcion3
AFTER FIELD cta_gasto
SELECT a.descripcion
INTO des.descripcion4
FROM cgtb00001 a
WHERE a.cuenta_no = infoArray.cta_gasto
IF STATUS = NOTFOUND THEN
CALL msg(3)
NEXT FIELD cuenta_no
END IF
DISPLAY BY NAME des.descripcion4
AFTER FIELD departamento2
SELECT a.nom_dpto
INTO des.descripcion5
FROM adtb00001 a
WHERE a.departamento = infoarray.departamento2
IF STATUS = NOTFOUND THEN
CALL msg(3)
NEXT FIELD cuenta_no
END IF
DISPLAY BY NAME des.descripcion5
NEXT FIELD sucid
{ AFTER FIELD sucid
NEXT FIELD cod_sp
AFTER FIELD cod_sp
NEXT FIELD cod_sp_sec }
AFTER FIELD cod_sp_sec
IF extraCampos.cod_sp IS NOT NULL AND extracampos.cod_sp_sec IS NOT NULL THEN
INITIALIZE checkmaintainID TO NULL
SELECT nom_sp, id_maintainx INTO extraCampos.nom_prov, checkMaintainID FROM cotb00001
WHERE cod_sp = extraCampos.cod_sp
AND cod_sp_sec = extracampos.cod_sp_sec
IF STATUS = NOTFOUND THEN
CALL msg(3)
NEXT FIELD cod_sp
ELSE
IF checkMaintainID IS NULL THEN
CALL fgl_winmessage(
"NO EXISTE PROVEEDOR",
"El proveedor insertado no se encuentra en MaintainX",
"stop")
NEXT FIELD cod_sp
ELSE
DISPLAY BY NAME extraCampos.nom_prov
END IF
END IF
END IF
AFTER FIELD activo_padre
IF extraCampos.activo_padre IS NOT NULL THEN
INITIALIZE checkMaintainID TO NULL
SELECT descripcion, id_maintainx INTO extraCampos.nom_activoPadre, checkmaintainID
FROM actb00001 WHERE codigo = extraCampos.activo_padre
IF STATUS = NOTFOUND THEN
CALL msg(3)
NEXT FIELD activo_padre
ELSE
IF checkMaintainID IS NULL THEN
CALL fgl_winmessage(
"NO EXISTE ACTIVO",
"El activo insertado no se encuentra en MaintainX",
"stop")
NEXT FIELD activo_padre
ELSE
DISPLAY BY NAME extracampos.nom_activoPadre
END IF
END IF
END IF
#NEXT FIELD id_maquina
{ AFTER FIELD serie
NEXT FIELD duracion
AFTER FIELD fabricante
NEXT FIELD apicheck}
AFTER FIELD id_maquina
CALL get_maquina()
SELECT nombre INTO infoArray.desc_maquina
FROM irtb00009 WHERE codigo = infoArray.id_maquina
AND status_t IS NULL
CALL departamentos()
AFTER INPUT
NEXT FIELD fabricante
ON ACTION ACCEPT
CALL insertData()
EXIT INPUT
ON ACTION id_maquina
SELECT MAX(codigo) INTO infoArray.id_maquina FROM irtb00009
LET infoArray.id_maquina = infoArray.id_maquina + 1
DISPLAY BY NAME infoArray.id_maquina
ON ACTION CANCEL
CALL msg(2)
EXIT INPUT
END INPUT
ON ACTION Modificar
INPUT BY NAME infoArray.*, maquinaria.*, extraCampos.*, apiCheck
ATTRIBUTES(UNBUFFERED, WITHOUT DEFAULTS)
BEFORE INPUT
CALL departamentos()
AFTER FIELD cuenta_no
SELECT a.descripcion
INTO des.descripcion2
FROM cgtb00001 a
WHERE cuenta_no = infoArray.cuenta_no
DISPLAY BY NAME des.descripcion2
AFTER FIELD cta_depr
SELECT a.descripcion
INTO des.descripcion3
FROM cgtb00001 a
WHERE a.cuenta_no = infoArray.cta_depr
DISPLAY BY NAME des.descripcion3
AFTER FIELD cta_gasto
SELECT a.descripcion
INTO des.descripcion4
FROM cgtb00001 a
WHERE a.cuenta_no = infoArray.cta_gasto
DISPLAY BY NAME des.descripcion4
AFTER FIELD departamento2
SELECT a.nom_dpto
INTO des.descripcion5
FROM adtb00001 a
WHERE a.departamento = infoarray.departamento2
DISPLAY BY NAME des.descripcion5
AFTER FIELD cod_sp_sec
IF extraCampos.cod_sp IS NOT NULL AND extracampos.cod_sp_sec IS NOT NULL THEN
INITIALIZE checkmaintainID TO NULL
SELECT nom_sp, id_maintainx INTO extraCampos.nom_prov, checkMaintainID FROM cotb00001
WHERE cod_sp = extraCampos.cod_sp
AND cod_sp_sec = extracampos.cod_sp_sec
IF STATUS = NOTFOUND THEN
CALL msg(3)
NEXT FIELD cod_sp
ELSE
IF checkMaintainID IS NULL THEN
CALL fgl_winmessage(
"NO EXISTE PROVEEDOR",
"El proveedor insertado no se encuentra en MaintainX",
"stop")
NEXT FIELD cod_sp
ELSE
DISPLAY BY NAME extraCampos.nom_prov
END IF
END IF
END IF
AFTER FIELD activo_padre
IF extraCampos.activo_padre IS NOT NULL THEN
INITIALIZE checkMaintainID TO NULL
SELECT descripcion, id_maintainx INTO extraCampos.nom_activoPadre, checkmaintainID
FROM actb00001 WHERE codigo = extraCampos.activo_padre
IF STATUS = NOTFOUND THEN
CALL msg(3)
NEXT FIELD activo_padre
ELSE
IF checkMaintainID IS NULL THEN
CALL fgl_winmessage(
"NO EXISTE ACTIVO",
"El activo insertado no se encuentra en MaintainX",
"stop")
NEXT FIELD activo_padre
ELSE
DISPLAY BY NAME extracampos.nom_activoPadre
END IF
END IF
END IF
AFTER FIELD id_maquina
CALL get_maquina()
SELECT nombre INTO infoArray.desc_maquina
FROM irtb00009 WHERE codigo = infoArray.id_maquina
AND status_t IS NULL
AFTER INPUT
NEXT FIELD fabricante --Para que no se haga el auto accept
ON ACTION id_maquina
SELECT MAX(codigo) INTO infoArray.id_maquina FROM irtb00009
LET infoArray.id_maquina = infoArray.id_maquina + 1
DISPLAY BY NAME infoArray.id_maquina
ON ACTION ACCEPT
CALL UpdateData(1)
EXIT INPUT
ON ACTION CANCEL
CALL msg(2)
EXIT INPUT
END INPUT
ON ACTION Eliminar
LET answer =
fgl_winquestion(
"ELIMINAR REGISTRO",
"Esta seguro/a que desea eliminar este registro? ",
"yes",
"yes|no",
"question",
0)
IF answer = 'yes' THEN
CALL updateData(2)
ELSE
CALL msg(2)
END IF
ON ACTION Salir
EXIT PROGRAM
BEFORE ROW
CALL departamentos()
CALL getdata(arr_curr())
IF infoArray.id_maquina IS NOT NULL THEN
CALL get_maquina()
ELSE
INITIALIZE maquinaria TO NULL
END IF
DISPLAY BY NAME infoArray.*, maquinaria.*, extraCampos.*
END DISPLAY
END DIALOG
CLOSE WINDOW w1
END FUNCTION
FUNCTION acpcad001() --Consultar Datos Activo
DEFINE i INT
CALL disArray.clear()
LET i = 1
PREPARE query
FROM "SELECT a.codigo, a.descripcion, a.cuenta_no, b.nom_dpto, a.id_maintainx
FROM actb00001 a inner join adtb00001 b on a.departamento = b.departamento
where a.status_t is null
ORDER BY codigo"
DECLARE buscar CURSOR FOR query
FOREACH buscar INTO DisArray[i].*
LET i = i + 1
END FOREACH
END FUNCTION
FUNCTION getdata(idx INT)
INITIALIZE extraCampos, infoArray TO NULL
PREPARE query
FROM "SELECT a.codigo
,a.descripcion
,a.cuenta_no
,a.cta_depr
,a.cta_gasto
,a.departamento
,CONVERT(VARCHAR(10),fech_compra,103)
,a.duracion
,CONVERT(VARCHAR(10),fech_elim,103)
,a.referencia
,a.fabricante
,a.status_t
,a.us_crea
,a.fech_crea
,a.us_mod
,a.fech_mod
,a.sucid
,a.id_MaintainX
,a.id_codigo
,b.nombre
FROM actb00001 a left join irtb00009 b on a.id_codigo = b.codigo
WHERE a.codigo = " || DisArray[idx].codigo1 || "
AND a.status_t is null and b.status_t is null
ORDER BY a.codigo"
EXECUTE query INTO infoArray.*
SELECT a.descripcion
INTO des.descripcion2
FROM cgtb00001 a
WHERE cuenta_no = infoArray.cuenta_no
SELECT a.descripcion
INTO des.descripcion3
FROM cgtb00001 a
WHERE a.cuenta_no = infoArray.cta_depr
SELECT a.descripcion
INTO des.descripcion4
FROM cgtb00001 a
WHERE a.cuenta_no = infoArray.cta_gasto
SELECT a.nom_dpto
INTO des.descripcion5
FROM adtb00001 a
WHERE a.departamento = infoarray.departamento2
SELECT nombre INTO infoArray.desc_maquina
FROM irtb00009 WHERE codigo = infoArray.codigo
CALL localidades(1)
DISPLAY BY NAME des.*
SELECT cod_sp, cod_sp_sec, tipo_activo,activo_padre
INTO extraCampos.cod_sp,extraCampos.cod_sp_sec, extraCampos.tipo_Activo, extraCampos.activo_padre
FROM actb00001 WHERE codigo = DisArray[idx].codigo1
DISPLAY BY NAME extraCampos.tipo_Activo
IF extraCampos.cod_sp IS NOT NULL AND extraCampos.cod_sp_sec IS NOT NULL THEN
SELECT nom_sp INTO extraCampos.nom_prov FROM cotb00001 WHERE
cod_sp = extraCampos.cod_sp AND cod_sp_sec = extraCampos.cod_sp_sec
AND status_t IS NULL
DISPLAY BY NAME extraCampos.nom_prov
END IF
IF extraCampos.activo_padre IS NOT NULL THEN
SELECT descripcion INTO extraCampos.nom_activoPadre FROM actb00001
WHERE codigo = extraCampos.activo_padre
DISPLAY BY NAME extraCampos.nom_activoPadre
END IF
END FUNCTION
FUNCTION get_maquina() --Consultar Datos Maquina
DEFINE i INT, query STRING
{LET query = " SELECT unidad_med,modelo,serie,us_crea,fech_crea,departamento,
codigo_externo, id_codigo FROM irtb00009 where ",
" status_t is null and codigo =", infoArray.id_maquina}
SELECT unidad_med,modelo,serie,departamento,codigo_externo
INTO maquinaria.unidad_med,
maquinaria.modelo,
maquinaria.serie,
maquinaria.departamento,
maquinaria.codigo_externo
FROM irtb00009 WHERE
status_t IS NULL AND codigo = infoArray.id_maquina
END FUNCTION
FUNCTION insertData()
DEFINE checking INT
LET infoArray.fech_crea = CURRENT YEAR TO FRACTION
INITIALIZE checking TO NULL
BEGIN WORK
IF apiCheck THEN
CALL ApiMaintainX('POST',NULL, infoArray.*, maquinaria.*,extraCampos.*, NULL) RETURNING infoArray.id_MaintainX
DISPLAY BY NAME infoArray.id_MaintainX
IF infoArray.id_MaintainX IS NULL THEN
ROLLBACK WORK
END IF
END IF
INSERT INTO actb00001(
codigo,
descripcion,
cuenta_no,
cta_depr,
cta_gasto,
departamento,
fech_compra,
duracion,
fech_elim,
referencia,
fabricante,
status_t,
us_crea,
fech_crea,
us_mod,
fech_mod,
sucid,
id_maintainX,
id_codigo,
cod_sp,
cod_sp_sec,
tipo_activo,
activo_padre)
VALUES(infoArray.codigo,
infoArray.descripcion1,
infoArray.cuenta_no,
infoArray.cta_depr,
infoArray.cta_gasto,
infoarray.departamento2,
infoArray.fech_compra,
infoArray.duracion,
NULL,
infoArray.referencia,
infoArray.fabricante,
NULL,
infoArray.us_crea,
infoArray.fech_crea,
NULL,
NULL,
infoArray.sucid,
infoArray.id_MaintainX,
infoArray.id_maquina,
extraCampos.cod_sp,
extraCampos.cod_sp_sec,
extraCampos.tipo_Activo,
extraCampos.activo_padre)
IF infoArray.id_maquina IS NOT NULL THEN
SELECT codigo INTO checking FROM irtb00009 WHERE codigo = infoArray.id_maquina
DISPLAY "insert filtro 1"
IF checking IS NOT NULL THEN
UPDATE irtb00009 SET nombre = infoArray.desc_maquina,
modelo = maquinaria.modelo,
unidad_med = maquinaria.unidad_med,
serie = maquinaria.serie,
fabricante = infoArray.fabricante,
departamento = maquinaria.departamento,
codigo_externo = maquinaria.codigo_externo,
us_mod = USUARIOS,
fech_mod = GETDATE(),
id_codigo = infoArray.codigo
WHERE codigo = infoArray.id_maquina
DISPLAY "insert filtro 2 que es un update"
ELSE
INSERT INTO irtb00009 (codigo,nombre,unidad_med,modelo,serie,fabricante,us_crea,fech_crea,departamento,
codigo_externo,id_codigo)
VALUES (infoArray.id_maquina, infoarray.desc_maquina,
maquinaria.unidad_med,
maquinaria.modelo,maquinaria.serie,
infoArray.fabricante,
usuarios, getdate(),maquinaria.departamento,maquinaria.codigo_externo, infoArray.codigo)
DISPLAY "No se encontro maquina para actualizar, se crea una nueva"
END IF
END IF
INSERT INTO actb00005
VALUES(infoArray.codigo,
infoArray.descripcion1,
infoArray.cuenta_no,
infoArray.cta_depr,
infoArray.cta_gasto,
infoarray.departamento2,
infoArray.fech_compra,
infoArray.duracion,
NULL,
NULL,
infoArray.us_crea,
infoArray.fech_crea,
NULL,
NULL,
NULL)
IF SQLCA.SQLCODE < 0 THEN
ROLLBACK WORK
CALL msg(1663)
ELSE
COMMIT WORK
CALL msg(1)
END IF
END FUNCTION
FUNCTION updateData(CASO INT)
DEFINE checking INT
INITIALIZE checking TO NULL
CASE CASO
WHEN 1
BEGIN WORK
IF apiCheck THEN
IF infoArray.id_MaintainX IS NULL THEN
CALL ApiMaintainX('POST',NULL, infoArray.*,maquinaria.*,extraCampos.*, usuarios) RETURNING answer
ELSE
CALL ApiMaintainX('PATCH',infoArray.id_MaintainX,infoArray.*,maquinaria.*,extraCampos.*, usuarios) RETURNING answer
END IF
IF answer IS NULL THEN
ROLLBACK WORK
END IF
END IF
UPDATE actb00001
SET descripcion = infoArray.descripcion1,
cuenta_no = infoArray.cuenta_no,
cta_depr = infoArray.cta_depr,
cta_gasto = infoArray.cta_gasto,
departamento = infoarray.departamento2,
fech_compra = infoArray.fech_compra,
duracion = infoArray.duracion,
referencia = infoArray.referencia,
fabricante = infoArray.fabricante,
id_codigo = infoArray.id_maquina,
us_mod = usuarios,
fech_mod = CURRENT YEAR TO FRACTION,
sucid = infoArray.sucid,
cod_sp = extraCampos.cod_sp,
cod_sp_sec = extraCampos.cod_sp_sec,
tipo_activo = extraCampos.tipo_Activo,
activo_padre = extraCampos.activo_padre
WHERE codigo = infoArray.codigo
IF infoArray.id_MaintainX IS NULL THEN
UPDATE actb00001
SET id_maintainx = answer
WHERE codigo = infoArray.codigo
END IF
UPDATE actb00005
SET descripcion = infoArray.descripcion1,
cuenta_no = infoArray.cuenta_no,
cta_depr = infoArray.cta_depr,
cta_gasto = infoArray.cta_gasto,
departamento = infoarray.departamento2,
fech_compra = infoArray.fech_compra,
duracion = infoArray.duracion,
us_mod = usuarios,
fech_mod = CURRENT YEAR TO FRACTION
WHERE codigo = infoArray.codigo
SELECT codigo INTO checking FROM irtb00009 WHERE status_t IS NULL
AND codigo = infoarray.id_maquina
IF checking IS NOT NULL THEN
UPDATE irtb00009 SET nombre = infoArray.desc_maquina,
modelo = maquinaria.modelo,
unidad_med = maquinaria.unidad_med,
serie = maquinaria.serie,
fabricante = infoArray.fabricante,
departamento = maquinaria.departamento,
codigo_externo = maquinaria.codigo_externo,
us_mod = USUARIOS,
fech_mod = GETDATE(),
id_codigo = infoArray.codigo
WHERE codigo = infoArray.id_maquina
DISPLAY "update irtb00009"
ELSE
INSERT INTO irtb00009 (codigo,nombre,unidad_med,modelo,serie,fabricante,us_crea,fech_crea,departamento,codigo_externo,id_codigo)
VALUES (infoArray.id_maquina, infoarray.desc_maquina,
maquinaria.unidad_med,
maquinaria.modelo,maquinaria.serie,
infoArray.fabricante,
usuarios, getdate(),maquinaria.departamento,maquinaria.codigo_externo, infoArray.codigo)
DISPLAY "filtro update que inserta"
END IF
IF SQLCA.SQLCODE < 0 THEN
ROLLBACK WORK
CALL msg(1663)
ELSE
COMMIT WORK
CALL msg(13)
END IF
EXIT CASE
WHEN 2
BEGIN WORK
UPDATE actb00001
SET status_t = 'E',
us_mod = usuarios,
fech_mod = CURRENT YEAR TO FRACTION,
fech_elim = CURRENT YEAR TO FRACTION
WHERE codigo = infoArray.codigo
UPDATE actb00005
SET status_t = 'E',
us_mod = usuarios,
fech_mod = CURRENT YEAR TO FRACTION,
fech_elim = CURRENT YEAR TO FRACTION
WHERE codigo = infoArray.codigo
IF infoArray.id_maquina IS NOT NULL THEN
UPDATE irtb00009
SET status_t = 'E',
us_mod = usuarios,
fech_mod = CURRENT YEAR TO FRACTION
WHERE codigo = infoArray.id_maquina
END IF
IF infoArray.id_MaintainX IS NOT NULL THEN
CALL ApiMaintainX('DELETE',infoArray.id_MaintainX,maquinaria.*, infoArray.*,extraCampos.*,NULL)
RETURNING answer
IF answer != 1 THEN
ROLLBACK WORK
END IF
END IF
IF SQLCA.SQLCODE < 0 THEN
ROLLBACK WORK
CALL msg(1663)
ELSE
COMMIT WORK
CALL msg(39)
END IF
OTHERWISE
DISPLAY "Nothing happens..."
END CASE
END FUNCTION
FUNCTION msg(numero_msg)
DEFINE numero_msg SMALLINT
DEFINE descripcion CHAR (60)
SELECT desc_msg INTO descripcion FROM msgtable
WHERE cod_msg = numero_msg
IF status = NOTFOUND THEN
SELECT desc_msg INTO descripcion FROM msgtable
WHERE cod_msg = 22
LET descripcion = descripcion CLIPPED,numero_msg using "<<<<"
ERROR descripcion ATTRIBUTE(BOLD)
ELSE
ERROR descripcion ATTRIBUTE(BOLD)
LET numero_msg = 0
END IF
END FUNCTION
FUNCTION localidades(chb)
DEFINE
klocalidad SMALLINT,
kdescripcion CHAR(30),
plocalidad ui.combobox,
chb CHAR(1)
IF chb = 1 THEN
LET plocalidad = ui.combobox.forname("formonly.sucid")
ELSE
LET plocalidad = ui.combobox.forname("formonly.bodega")
END IF
DECLARE busca_local CURSOR FOR
SELECT a.sucid, a.sucnombre FROM sucursales a
CALL plocalidad.clear()
FOREACH busca_local INTO klocalidad, kdescripcion
CALL plocalidad.additem(klocalidad, kdescripcion)
END FOREACH
END FUNCTION