Programas (bugs encontrados en las pruebas funcionales en la .250): - acprmt004/acprmt005: MIN/MAX sobre la fecha real (no sobre texto CONVERT 103); acprmt004 alinea rowid. - cgprrp008: lee cgtb00004 (no la copia cgtb00004_tmp del 14-mar-2026) y solo regenera cgtb00016 cuando se corre sin filtro de cuenta. - cgprrp014: CONSTRUCT con los nombres de campo del form (cod_sp_sc). - cgfmrp013: defaultValue del combo = cgprrp012.4rp. - cgprrp022/edprrp029: salida getPreviewDevice() en lugar de SVG fijo. - edprrp080: no consume numero ED con afecta = NO. - cgprmt004/022/037, segprmt0001: sin CONNECT "IFMX" (-6366); EXTERIOR via cross-DB. - irprcs001: agrega CONNECT; irprmt021: columna idestado; irprmt066: la anulacion sin MaintainX ya no se deshace (-255); otrodir/bodegas: rama '2' llena origen y destino. - teprmt001: ajustes G6. Despliegue G6: - DBDATE=dmy4 en config/Application.xcf, config/Main_prg.xcf, resources/Application.xcf y en el grupo MODULOS del .4pw (los programas lanzados por el menu heredan el entorno). - 31 .4rp: IMAGEBOX con rutas absolutas file:///E:|F:|C: -> relativas IMAGENES/...; se agregan IMAGENES/LOGO.JPG y genero_logo.png. - Paquete mbs: incluye bin/*.4rp y bin/IMAGENES (antes el GAR no llevaba los reportes). - resources/TopMenu.4st (irprcs008 daba -8014); bin/cgprcs024.4rp. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
403 lines
12 KiB
Plaintext
403 lines
12 KiB
Plaintext
SCHEMA smarmotech
|
|
|
|
DEFINE
|
|
usuario, clave, answer STRING,
|
|
checking INT --Para verificar si los campos llenados ya existen en la BD
|
|
|
|
DEFINE datos RECORD LIKE seg0001.* --Datos individuales
|
|
DEFINE propiedades RECORD LIKE seg0003.* --Propiedades individuales
|
|
|
|
DEFINE Duser DYNAMIC ARRAY OF RECORD --Display user abreviado
|
|
ficha1 INT,
|
|
usuario1 VARCHAR(100),
|
|
nombreusuario1 VARCHAR(100),
|
|
email1 VARCHAR(100)
|
|
END RECORD
|
|
|
|
DEFINE propiedades2 DYNAMIC ARRAY OF RECORD --tabla seg0007
|
|
sec_vend SMALLINT,
|
|
nombre VARCHAR(100),
|
|
tipo_usuario1 VARCHAR(100),
|
|
comision CHAR(10),
|
|
porc_cobros DECIMAL(12, 4)
|
|
END RECORD
|
|
|
|
MAIN --login y programa
|
|
|
|
CALL ARG_VAL(1) RETURNING usuario
|
|
CALL ARG_VAL(2) RETURNING clave
|
|
-- G6: "marmotech" no esta en el fglprofile (-6366) y la conexion IFMX no se usa en el programa
|
|
#CONNECT TO "marmotech" AS "IFMX" USER usuario USING clave
|
|
CONNECT TO "smarmotech" AS "MSSQL" USER usuario USING clave
|
|
|
|
CALL segprmt0001()
|
|
|
|
END MAIN
|
|
|
|
FUNCTION segprmt0001()
|
|
|
|
SET CONNECTION "MSSQL"
|
|
|
|
OPEN WINDOW w1 WITH FORM 'segfmmt001'
|
|
|
|
CALL buscaUsuarios() RETURNING Duser
|
|
|
|
DIALOG ATTRIBUTE(UNBUFFERED)
|
|
|
|
DISPLAY ARRAY Duser TO susuarios.*
|
|
|
|
BEFORE DISPLAY --Llenando todos los combo box
|
|
CALL localidades('1')
|
|
CALL departamentos()
|
|
CALL bodegas('1')
|
|
CALL perfiles()
|
|
CALL printers()
|
|
|
|
ON ACTION agregar
|
|
ATTRIBUTES(TEXT = "Nuevo", IMAGE = "fa-address-book-o")
|
|
|
|
INPUT BY NAME datos.*
|
|
|
|
BEFORE INPUT
|
|
NEXT FIELD num_emp
|
|
|
|
AFTER FIELD num_emp
|
|
|
|
SELECT a.nom1_emp || a.apell1_Emp
|
|
INTO datos.nombreusuario
|
|
FROM adtb00003 a
|
|
WHERE a.num_emp = datos.num_emp
|
|
AND a.status_t IS NULL
|
|
|
|
IF STATUS = NOTFOUND THEN
|
|
CALL msg(3)
|
|
NEXT FIELD num_Emp
|
|
ELSE
|
|
|
|
DISPLAY BY NAME datos.nombreusuario
|
|
CALL DIALOG.setFieldActive('usuario', TRUE)
|
|
CALL msg(12)
|
|
|
|
END IF
|
|
|
|
AFTER INPUT
|
|
CALL SegAdd() --Para agregar un registro a la tabla
|
|
CALL DIALOG.setFieldActive('usuario', FALSE)
|
|
|
|
ON ACTION CANCEL
|
|
CALL msg(2)
|
|
EXIT INPUT
|
|
|
|
END INPUT
|
|
|
|
ON ACTION borrar ATTRIBUTES(TEXT = "Eliminar", IMAGE = "delete")
|
|
|
|
LET answer =
|
|
fgl_winquestion(
|
|
"Eliminar registro",
|
|
"ESTA SEGURO DE ELIMINAR ESTE REGISTRO?",
|
|
"YES",
|
|
"YES|NO",
|
|
"QUESTION",
|
|
0)
|
|
|
|
IF answer = 'YES' THEN
|
|
CALL DeleteRec(arr_curr())
|
|
ELSE
|
|
CALL msg(2)
|
|
END IF
|
|
|
|
IF int_flag THEN
|
|
CALL msg(39)
|
|
END IF
|
|
|
|
ON ACTION CANCEL ATTRIBUTES(TEXT = "Salir", IMAGE = "quit")
|
|
EXIT PROGRAM
|
|
|
|
BEFORE ROW
|
|
|
|
CALL getdata(arr_curr()) --Obtenemos los datos del registro
|
|
CALL buscaUsuarios() RETURNING Duser
|
|
CALL fgl_settitle("Administracion de Usuarios") --seleccionado
|
|
|
|
CONTINUE DIALOG
|
|
|
|
END DISPLAY
|
|
|
|
INPUT ARRAY propiedades2 FROM susuarios2.* ATTRIBUTES(WITHOUT DEFAULTS)
|
|
AFTER FIELD sec_vend
|
|
|
|
SELECT a.nom1_emp || a.apell1_Emp
|
|
INTO propiedades2[arr_curr()].nombre
|
|
FROM adtb00003 a
|
|
WHERE a.num_emp = propiedades2[arr_curr()].sec_vend
|
|
AND a.status_t IS NULL
|
|
|
|
IF STATUS = NOTFOUND THEN
|
|
CALL msg(3)
|
|
NEXT FIELD sec_vend
|
|
ELSE
|
|
DISPLAY propiedades2[arr_curr()].nombre TO nombre
|
|
NEXT FIELD tipo_usuario1
|
|
END IF
|
|
|
|
ON ACTION guardar ATTRIBUTES(TEXT = "Guardar", IMAGE = "save")
|
|
|
|
LET int_flag = TRUE
|
|
|
|
FOR checking = 1 TO propiedades2.getLength()
|
|
|
|
IF propiedades2[checking].sec_vend IS NULL THEN
|
|
CALL msg(16)
|
|
LET int_flag = FALSE
|
|
END IF
|
|
|
|
IF propiedades2[checking].tipo_usuario1 IS NULL THEN
|
|
CALL msg(16)
|
|
LET int_flag = FALSE
|
|
END IF
|
|
|
|
END FOR
|
|
|
|
IF int_flag THEN
|
|
|
|
BEGIN WORK
|
|
|
|
DELETE FROM seg0007 WHERE seg0007.usuario = datos.usuario
|
|
|
|
FOR checking = 1 TO propiedades2.getLength()
|
|
|
|
INSERT INTO seg0007
|
|
VALUES(datos.usuario,
|
|
propiedades2[checking].nombre,
|
|
propiedades2[checking].sec_vend,
|
|
propiedades2[checking].tipo_usuario1,
|
|
propiedades2[checking].comision,
|
|
propiedades2[checking].porc_cobros)
|
|
END FOR
|
|
|
|
IF sqlca.sqlcode == 0 THEN
|
|
COMMIT WORK
|
|
ELSE
|
|
ROLLBACK WORK
|
|
LET int_flag = FALSE
|
|
END IF
|
|
|
|
END IF
|
|
|
|
IF int_flag THEN
|
|
CALL msg(13)
|
|
ELSE
|
|
CALL msg(16)
|
|
END IF
|
|
|
|
ON ACTION salir ATTRIBUTES(TEXT = "Salir", IMAGE = "quit")
|
|
RETURN
|
|
|
|
END INPUT
|
|
|
|
INPUT BY NAME datos.* ATTRIBUTES(WITHOUT DEFAULTS)
|
|
|
|
BEFORE INPUT
|
|
NEXT FIELD email
|
|
CALL DIALOG.setFieldActive('usuario', FALSE)
|
|
|
|
AFTER FIELD num_emp
|
|
|
|
SELECT a.nom1_emp || ' ' || a.apell1_Emp
|
|
INTO datos.nombreusuario
|
|
FROM adtb00003 a
|
|
WHERE a.num_emp = datos.num_emp AND a.status_t IS NULL
|
|
|
|
IF STATUS = NOTFOUND THEN
|
|
CALL msg(3)
|
|
NEXT FIELD num_Emp
|
|
END IF
|
|
|
|
ON ACTION addfirma
|
|
CALL firmas(datos.num_emp)
|
|
|
|
ON ACTION actualizar
|
|
ATTRIBUTES(TEXT = "Actualizar", IMAGE = "fa-refresh")
|
|
LET int_flag = FALSE
|
|
|
|
IF datos.tipo_usuario IS NULL THEN
|
|
CALL msg(16)
|
|
ELSE
|
|
|
|
LET datos.us_mod = usuario
|
|
LET datos.fech_mod = CURRENT
|
|
|
|
UPDATE seg0001
|
|
SET seg0001.* = datos.*
|
|
WHERE seg0001.num_emp = datos.num_emp
|
|
|
|
LET int_flag = TRUE
|
|
|
|
END IF
|
|
|
|
IF int_flag THEN
|
|
|
|
CALL msg(13)
|
|
ELSE
|
|
CALL msg(16)
|
|
END IF
|
|
|
|
ON ACTION CANCEL ATTRIBUTES(TEXT = "Salir", IMAGE = "quit")
|
|
EXIT PROGRAM
|
|
CONTINUE DIALOG
|
|
|
|
END INPUT
|
|
|
|
-- G6: seg0003.actualiza_controlcalidad (columna nueva) no esta en el form (-1102); no se edita aqui
|
|
INPUT BY NAME propiedades.nom_puesto THRU propiedades.requisicionescompras ATTRIBUTES(WITHOUT DEFAULTS)
|
|
|
|
ON ACTION actualizar
|
|
ATTRIBUTES(TEXT = "actualizar", IMAGE = "fa-refresh")
|
|
LET int_flag = FALSE
|
|
|
|
--Se actualiza uno por uno ya que en el formulario
|
|
--Existían dos usuarios, entonces le coloqué PropUsuario a propiedades
|
|
|
|
UPDATE seg0003
|
|
SET seg0003.nom_puesto = propiedades.nom_puesto,
|
|
seg0003.autorizacionDespacho
|
|
= propiedades.autorizaciondespacho,
|
|
seg0003.controlDespacho = propiedades.controldespacho,
|
|
seg0003.controlDespiece = propiedades.controldespiece,
|
|
seg0003.controlDibujo = propiedades.controldibujo,
|
|
seg0003.controlDescuento = propiedades.controldescuento,
|
|
seg0003.correo = propiedades.correo,
|
|
seg0003.actualizacion_log_produccion
|
|
= propiedades.actualizacion_log_produccion,
|
|
seg0003.fotos_adicionales_inventario
|
|
= propiedades.fotos_adicionales_inventario,
|
|
seg0003.aviso_reservas = propiedades.aviso_reservas,
|
|
seg0003.aviso_requisicion_compras
|
|
= propiedades.aviso_requisicion_compras,
|
|
seg0003.distributionlist = propiedades.distributionlist,
|
|
seg0003.aviso_existencia_minima_repuesto
|
|
= propiedades.aviso_existencia_minima_repuesto,
|
|
seg0003.controlOutlet = propiedades.controloutlet,
|
|
seg0003.controlOrdenesE = propiedades.controlordenese,
|
|
seg0003.controlBuzon = propiedades.controlbuzon,
|
|
seg0003.controlOutlet2 = propiedades.controloutlet2,
|
|
seg0003.requisicionesCompras
|
|
= propiedades.requisicionesCompras
|
|
WHERE seg0003.usuario = Duser[arr_curr()].usuario1
|
|
|
|
LET int_flag = TRUE
|
|
|
|
IF int_flag THEN
|
|
CALL msg(13)
|
|
ELSE
|
|
CALL msg(2)
|
|
END IF
|
|
|
|
ON ACTION CANCEL ATTRIBUTES(TEXT = "Salir", IMAGE = "quit")
|
|
EXIT PROGRAM
|
|
|
|
END INPUT
|
|
|
|
END DIALOG
|
|
|
|
CLOSE WINDOW w1
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION getdata(i INT) --Obtener los datos y las propiedades del empleado
|
|
--Seleccionado en el Duser
|
|
IF i = 0 THEN
|
|
INITIALIZE datos.* TO NULL
|
|
RETURN
|
|
END IF
|
|
|
|
BEGIN WORK
|
|
|
|
LOCATE datos.firmafactura IN FILE
|
|
SELECT a.*, b.*
|
|
INTO datos.*, propiedades.*
|
|
FROM seg0001 a, seg0003 b
|
|
WHERE a.num_emp = Duser[i].ficha1 AND b.usuario = a.usuario
|
|
|
|
DISPLAY datos.firmafactura TO firmafactura
|
|
|
|
CALL buscaPropiedades2(Duser[i].usuario1) RETURNING propiedades2
|
|
|
|
COMMIT WORK
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION SegAdd() --Insertar nuevo registro
|
|
|
|
LET int_flag = FALSE
|
|
|
|
IF datos.usuario IS NULL THEN
|
|
CALL msg(16)
|
|
RETURN
|
|
END IF
|
|
IF datos.cod_perfil IS NULL THEN
|
|
CALL msg(16)
|
|
RETURN
|
|
END IF
|
|
IF datos.printerdefecto IS NULL THEN
|
|
CALL msg(16)
|
|
RETURN
|
|
END IF
|
|
IF datos.otro_printer IS NULL THEN
|
|
CALL msg(16)
|
|
RETURN
|
|
END IF
|
|
IF datos.printer_cheque IS NULL THEN
|
|
CALL msg(16)
|
|
RETURN
|
|
END IF
|
|
IF datos.num_emp IS NULL THEN
|
|
CALL msg(16)
|
|
RETURN
|
|
END IF
|
|
|
|
BEGIN WORK
|
|
|
|
LET datos.us_crea = usuario,
|
|
datos.fech_crea = CURRENT
|
|
|
|
INSERT INTO seg0001 VALUES datos.*
|
|
|
|
INSERT INTO seg0003(
|
|
usuario, nom_puesto, correo)
|
|
VALUES(datos.usuario, datos.usuario, datos.email)
|
|
|
|
IF sqlca.sqlcode == 0 THEN
|
|
COMMIT WORK
|
|
LET int_flag = TRUE
|
|
ELSE
|
|
ROLLBACK WORK
|
|
END IF
|
|
|
|
IF int_flag THEN
|
|
CALL msg(1)
|
|
ELSE
|
|
CALL msg(2)
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION DeleteRec(DelUser INT)
|
|
|
|
LET int_flag = FALSE
|
|
|
|
BEGIN WORK
|
|
|
|
--Si eliminamos un registro, se eliminan sus propiedades
|
|
|
|
DELETE FROM seg0001 WHERE seg0001.usuario = Duser[DelUser].usuario1
|
|
DELETE FROM seg0003 WHERE seg0003.usuario = Duser[DelUser].usuario1
|
|
DELETE FROM seg0007 WHERE seg0007.usuario = Duser[DelUser].usuario1
|
|
|
|
LET int_flag = TRUE
|
|
|
|
COMMIT WORK
|
|
|
|
END FUNCTION
|