{ ------------------------------------------------------------------ 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