Files
2026-09-22 20:38:51 -04:00

430 lines
14 KiB
Plaintext

GLOBALS
"svglobals.4gl"
DEFINE operacion STRING
DEFINE tareas RECORD
id_labor INT,
sec_vend1 SMALLINT,
nombre_trabajador VARCHAR(100),
fecha_labor DATE,
fecha_visita DATE,
observacion_labor VARCHAR(100)
END RECORD
DEFINE arr_tareas DYNAMIC ARRAY OF RECORD
id_labor1 INT,
sec_vend11 SMALLINT,
nombre_trabajador1 VARCHAR(100),
fecha_labor1 DATE,
fecha_visita1 DATE,
observacion1 VARCHAR(100)
END RECORD
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT to "decomarmol" AS "MSSQL" USER usuarios USING clave
SELECT a.* INTO p_compania.* FROM companias a
CALL svprmt001()
END MAIN
FUNCTION svprmt001()
OPEN FORM w1 FROM "svfmmt001"
DISPLAY FORM w1
MENU
ON ACTION nuevo
LET operacion = "AD"
CALL svprad001()
ON ACTION modificar
LET operacion="MF"
CALL svprmf001()
ON ACTION informacion
CALL requisicion_pendiente()
ON ACTION retornar
RETURN
END MENU
END FUNCTION
FUNCTION svprad001()
DIALOG ATTRIBUTES(UNBUFFERED)
INPUT BY NAME xsv.* ATTRIBUTE(WITHOUT DEFAULTS)
ON ACTION empleado
IF INFIELD(sec_vend) THEN
CALL empleados() RETURNING xsv.sec_vend,xsv.vendedor
DISPLAY BY NAME xsv.sec_vend,xsv.vendedor
END IF
BEFORE INPUT
LET xsv.fecha = TODAY
DISPLAY BY NAME xsv.fecha
AFTER FIELD num_oc
IF xsv.num_oc IS NOT NULL THEN
SELECT a.nombre,RTRIM(b.calle)||' '||RTRIM(b.casa_num)||''||RTRIM(b.barrio)||' '||
RTRIM(b.urbanizacion),
a.telefono,d.sec_vend,a.tipo_cliente,a.sec_cliente,e.nombre_proyecto
INTO xsv.nombre,xsv.direccion,xsv.telefono,xsv.sec_vend,xsv.tipo_cliente,xsv.sec_cliente,xsv.proyecto
FROM prtb00012 c,vetb00004 a,vetb00005 b LEFT OUTER JOIN vetb00028 d ON b.tipo_cliente = d.tipo_cliente AND b.sec_cliente = d.sec_cliente,
vetb00050 e
WHERE c.num_oc = xsv.num_oc AND c.tipo_cliente = a.tipo_cliente AND c.sec_cliente = a.sec_cliente AND
a.tipo_cliente = b.tipo_cliente AND a.sec_cliente = b.sec_cliente AND c.cotizacion_no = e.cotizacion_no
AND c.status_t IS NULL
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("INFO","ORDEN NO EXISTE","INFO")
NEXT FIELD num_oc
END IF
NEXT FIELD nombre
DISPLAY BY NAME xsv.tipo_cliente,xsv.sec_cliente,xsv.proyecto
END IF
AFTER FIELD sec_vend
IF xsv.sec_vend IS NULL THEN
CALL fgl_winmessage("INFO","CAMPO EN BLANCO","INFO")
NEXT FIELD sec_vend
END IF
SELECT RTRIM(a.nom1_emp)||' '||a.apell1_emp INTO xsv.vendedor
FROM adtb00003 a WHERE a.num_emp = xsv.sec_vend
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("INFO","VENDEDOR NO EXISTE","INFO")
NEXT FIELD sec_vend
END IF
DISPLAY BY NAME xsv.vendedor
END INPUT
INPUT ARRAY arr_sv FROM scocina.* ATTRIBUTE(WITHOUT DEFAULTS)
BEFORE INPUT
LET arr_sv[1].items='Nevera'
LET arr_sv[2].items='Estufa'
LET arr_sv[3].items='Cooktop'
LET arr_sv[4].items='Vinera'
LET arr_sv[5].items='Extrator'
LET arr_sv[6].items='Horno'
LET arr_sv[7].items='Micro'
LET arr_sv[8].items='Gaveta termica'
LET arr_sv[9].items='Lavaplatos'
DISPLAY arr_sv[1].items TO scocina[1].items
AFTER INPUT
END INPUT
ON ACTION GUARDAR
CALL guardar()
CALL fgl_winmessage("INFO","ADICION EXITOSA","INFO")
EXIT DIALOG
ON ACTION CANCEL
CALL fgl_Winmessage("INFO","OPERACION CANCELADA","INFO")
EXIT PROGRAM
END DIALOG
END FUNCTION
FUNCTION svprmf001()
DEFINE opcion STRING
DIALOG ATTRIBUTES(UNBUFFERED, FIELD ORDER FORM)
CONSTRUCT criterio ON a.num_doc FROM num_doc
ON ACTION buscar
LET selec =
"SELECT a.* FROM svtb00001 a WHERE ",criterio CLIPPED," AND a.status_t IS NULL"
PREPARE comando FROM selec
DECLARE busca_servicios SCROLL CURSOR FOR comando
OPEN busca_servicios
FETCH FIRST busca_servicios INTO xsv.*
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("INFO","NO EXISTE SOLICITUD CON ESTA CONDICION","INFO")
EXIT DIALOG
END IF
CALL busca_info()
CALL busca_tareas()
DISPLAY ARRAY arr_tareas to stareas.*
END DISPLAY
DISPLAY ARRAY arr_sv TO scocina.*
END DISPLAY
MENU
ON ACTION siguiente
FETCH NEXT busca_servicios INTO xsv.*
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("INFO","NO EXISTEN MAS REGISTROS EN ESTA DIRECCION","INFO")
END IF
CALL busca_info()
ON ACTION primero
FETCH FIRST busca_servicios INTO xsv.*
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("INFO","NO EXISTEN MAS REGISTROS EN ESTA DIRECCION","INFO")
END IF
CALL busca_info()
ON ACTION ultimo
FETCH LAST busca_servicios INTO xsv.*
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("INFO","NO EXISTEN MAS REGISTROS EN ESTA DIRECCION","INFO")
END IF
CALL busca_info()
ON ACTION anterior
FETCH PREVIOUS busca_servicios INTO xsv.*
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("INFO","NO EXISTEN MAS REGISTROS EN ESTA DIRECCION","INFO")
END IF
CALL busca_info()
ON ACTION asignar
CALL seg000(usuarios,0,'svprmt001.asignar') RETURNING resultado
IF NOT resultado THEN
CALL fgl_winmessage("ERROR","USTED NO TIENE PERMISO PARA UTILIZAR OPCION","INFO")
CONTINUE MENU
END IF
CALL asignar_tareas()
ON ACTION Actualizar
SELECT DISTINCT a.num_doc FROM svtb00003 a WHERE a.num_doc = xsv.num_doc
IF STATUS <> NOTFOUND THEN
CALL fgl_winmessage("INFO","NO PUEDE ACTUALIZAR SOLICITUD CON TAREAS ASIGNADAS","INFO")
CONTINUE MENU
END IF
CALL svprad001()
ON ACTION imprimir
LET r_filename = "svprmt001.4rp"
LET preview=1
IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file
LET r_output='PDF'
LET preview=true
CALL fgl_report_selectDevice(r_output) -- changing default
CALL fgl_report_selectPreview(preview) -- changing default
LET handler = fgl_report_commitCurrentSettings() -- commit changes
ELSE
CALL fgl_Winmessage("ERROR","NO SE ENCONTRO 4RP","INFO")
EXIT MENU
END IF
START REPORT hoja_servicio TO XML HANDLER handler
FOR idx = 1 TO 9
OUTPUT TO REPORT hoja_servicio(arr_sv[idx].*)
END FOR
FINISH REPORT hoja_servicio
ON ACTION anular
LET opcion = fgl_winquestion("ELIMINAR","ESTA SEGURO DE ANULAR ESTA SOLICITUD?","NO","YES|NO","QUESTION",0)
IF opcion = "YES" THEN
UPDATE svtb00001 SET status_t ='E',
us_mod = usuarios,
fech_mod = getdate()
WHERE num_Doc = xsv.num_doc
CALL fgl_winmessage("INFO","REGISTRO ANULADO","INFO")
EXIT MENU
END IF
ON ACTION salir
EXIT MENU
END MENU
ON ACTION CANCEL
LET INT_FLAG = FALSE
RETURN
END CONSTRUCT
END DIALOG
END FUNCTION
FUNCTION guardar()
IF operacion = "AD" THEN
SELECT MAX(num_doc) INTO xsv.num_doc FROM svtb00001
IF xsv.num_doc IS NULL THEN
LET xsv.num_doc = 0
END IF
LET xsv.num_doc=xsv.num_doc+1
LET xsv.us_crea = usuarios
LET xsv.fech_crea=current
INSERT INTO svtb00001 VALUES (xsv.*)
FOR idx=1 TO arr_sv.getLength()
IF arr_sv[idx].items IS NOT NULL THEN
INSERT INTO svtb00002 VALUES (xsv.num_doc,idx,arr_sv[idx].items,arr_sv[idx].aplica,arr_sv[idx].medida)
END IF
END FOR
ELSE
LET xsv.us_mod=usuarios
LET xsv.fech_mod=current
UPDATE svtb00001 SET svtb00001.* = xsv.* WHERE num_doc = xsv.num_doc
SELECT DISTINCT a.num_doc FROM svtb00002 a WHERE a.num_Doc = xsv.num_doc
IF STATUS <> NOTFOUND THEN
FOR idx =1 TO arr_sv.getLength()
UPDATE svtb00002 SET aplica = arr_sv[idx].aplica,
medida = arr_sv[idx].medida
WHERE num_Doc = xsv.num_doc AND
items = arr_sv[idx].items
END FOR
ELSE
FOR idx=1 TO arr_sv.getLength()
IF arr_sv[idx].items IS NOT NULL THEN
INSERT INTO svtb00002 VALUES (xsv.num_doc,idx,arr_sv[idx].items,arr_sv[idx].aplica,arr_sv[idx].medida)
END IF
END FOR
END IF
END IF
END FUNCTION
FUNCTION busca_info()
DISPLAY BY NAME xsv.*
DECLARE c1 CURSOR FOR
SELECT a.items,a.aplica,a.medida,a.id FROM svtb00002 a
WHERE a.num_Doc = xsv.num_doc
ORDER BY a.id
LET idx = 1
FOREACH c1 INTO arr_sv[idx].*
LET idx = idx + 1
END FOREACH
END FUNCTION
FUNCTION asignar_tareas()
CALL arr_tareas.clear()
CALL busca_tareas()
DIALOG ATTRIBUTES(UNBUFFERED, FIELD ORDER FORM)
DISPLAY ARRAY arr_tareas to stareas.*
END DISPLAY
INPUT BY NAME tareas.*
ON ACTION empleado
IF INFIELD(sec_vend1) THEN
CALL empleados() RETURNING tareas.sec_vend1,tareas.nombre_trabajador
DISPLAY BY NAME tareas.sec_vend1,tareas.nombre_trabajador
END IF
BEFORE INPUT
LET tareas.fecha_labor = TODAY
DISPLAY BY NAME tareas.fecha_labor
AFTER FIELD sec_vend1
IF tareas.sec_vend1 IS NULL THEN
CALL fgl_winmessage("INFO","CAMPO EN BLANCO","INFO")
NEXT FIELD sec_vend1
END IF
SELECT RTRIM(a.nom1_emp)||' '||a.apell1_emp INTO tareas.nombre_trabajador
FROM adtb00003 a
WHERE a.num_emp = tareas.sec_vend1
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage("INFO","ASIGNADO NO EXISTE","INFO")
NEXT FIELD sec_vend1
END IF
DISPLAY BY NAME tareas.nombre_trabajador
AFTER FIELD fecha_visita
IF tareas.fecha_visita < tareas.fecha_labor THEN
CALL fgl_winmessage("INFO","FECHA VISITA NO PUEDE SER MENOR A LA FECHA DE LA LABOR","INFO")
NEXT FIELD fecha_visita
END IF
END INPUT
ON ACTION CANCEL
RETURN
ON ACTION guardar_tarea
CALL guardar_tareas()
CALL busca_tareas()
END DIALOG
END FUNCTION
FUNCTION guardar_tareas()
SELECT MAX(a.id_labor) INTO tareas.id_labor FROM svtb00003 a WHERE a.num_doc = xsv.num_doc
IF tareas.id_labor IS NULL THEN
LET tareas.id_labor = 0
END IF
LET tareas.id_labor = tareas.id_labor + 1
INSERT INTO svtb00003
(num_doc
,id_labor
,sec_vend1
,nombre
,fecha_labor
,fecha_visita
,observacion
,us_crea
,fech_crea)
VALUES
(xsv.num_doc
,tareas.id_labor
,tareas.sec_vend1
,tareas.nombre_trabajador
,tareas.fecha_labor
,tareas.fecha_visita
,tareas.observacion_labor
,usuarios
,getdate())
END FUNCTION
FUNCTION busca_tareas()
DECLARE busca_tareas CURSOR FOR
SELECT a.id_labor,a.sec_vend1,a.nombre,a.fecha_labor,a.fecha_visita,a.observacion FROM svtb00003 a
WHERE a.num_doc = xsv.num_doc
LET idx = 1
FOREACH busca_tareas INTO arr_tareas[idx].*
LET idx = idx + 1
END FOREACH
END FUNCTION
REPORT hoja_servicio(z)
DEFINE fecha STRING
DEFINE z RECORD
items VARCHAR(20),
aplica VARCHAR(10),
medida VARCHAR(10)
END RECORD
FORMAT
FIRST PAGE HEADER
LET fecha = today
ON EVERY ROW
PRINTX xsv.*,p_compania.nombre,fecha,z.*
END REPORT
FUNCTION empleados()
DEFINE cli_vend1 DYNAMIC ARRAY OF RECORD
num_emp INT,
nom1_emp VARCHAR(30),
apell1_emp VARCHAR(30)
END RECORD,
num_emp INT,
nombre_vendedor VARCHAR(100)
OPEN WINDOW relacion AT 8,5 WITH FORM "vefmwd101" ATTRIBUTE (BORDER,
COMMENT LINE LAST,FORM LINE FIRST + 1)
CONSTRUCT criterio ON b.nom1_emp,b.apell1_emp FROM nom1_emp,apell1_emp
IF int_flag THEN
CALL fgl_winmessage("INFO","NO EXISTEN REGISTROS CON ESTA CONDICION","INFO")
LET int_flag = FALSE
RETURN 0,' '
END IF
LET selec = "SELECT b.num_emp,b.nom1_emp,b.apell1_emp ",
"FROM adtb00003 b ",
"WHERE b.status_t IS NULL AND ",
criterio CLIPPED," ORDER BY b.nom1_emp "
PREPARE comando1 FROM selec
DECLARE vendedor CURSOR FOR comando1
LET idx = 1
FOREACH vendedor INTO cli_vend1[idx].*
LET idx = idx + 1
END FOREACH
CALL set_count(idx-1)
DISPLAY ARRAY cli_vend1 TO s_empleados.*
AFTER DISPLAY
LET idx = arr_curr()
LET num_emp = cli_vend1[idx].num_emp
LET nombre_vendedor= cli_vend1[idx].nom1_emp CLIPPED,' ',cli_vend1[idx].apell1_emp CLIPPED
IF INT_FLAG THEN
CALL fgl_winmessage("INFO","OPERACION CANCELADA","INFO")
RETURN 0,' '
END IF
END DISPLAY
CLOSE WINDOW relacion
RETURN num_emp,nombre_vendedor
END FUNCTION
FUNCTION requisicion_pendiente()
DEFINE arr_pendientes DYNAMIC ARRAY OF RECORD
xnum_Doc INT,
xnombre_cliente VARHCAR(100),
xfecha DATE
END RECORD
DECLARE busca_pendientes CURSOR FOR
SELECT a.* INTO xsv.* FROM svtb00001 a WHERE a.status_t IS NULL ORDER BY a.fecha
LET idx = 1
FOREACH busca_pendientes
END FUNCTION