diff --git a/PROYECTO/addir/adfmwd008.per b/PROYECTO/addir/adfmwd008.per index a91fe7e..6363567 100644 --- a/PROYECTO/addir/adfmwd008.per +++ b/PROYECTO/addir/adfmwd008.per @@ -7,7 +7,7 @@ FECHA REALIZACION : Junio 24, 1993 ------------------------------------------------------------------------ } -DATABASE rayovac +DATABASE smarmotech SCREEN SIZE 24 by 80 { Busqueda de los Niveles de Empleados diff --git a/PROYECTO/addir/adprmt001.4gl b/PROYECTO/addir/adprmt001.4gl index be593d8..b1adf9f 100644 --- a/PROYECTO/addir/adprmt001.4gl +++ b/PROYECTO/addir/adprmt001.4gl @@ -55,7 +55,8 @@ FUNCTION adpcad001() {WHENEVER ERROR CONTINUE} ## CAPTURA LOS DATOS QUE VA A CONTENER EL REGISTRO - INPUT BY NAME depto.* #,m_estado_a,m_estado_m + INPUT BY NAME depto.departamento, depto.nom_dpto, depto.status_t, depto.us_crea, + depto.fech_crea, depto.us_mod, depto.fech_mod #,m_estado_a,m_estado_m ## VERIFICA QUE EL CODIGO NO EXISTA EN EL CATALOGO DE DEPARTAMENTO. SI EXISTE, ## ENTONCES DESPLEGA LOS DATOS DEL REGISTRO EXISTENTE. @@ -77,7 +78,8 @@ FUNCTION adpcad001() NEXT FIELD departamento END IF - DISPLAY BY NAME depto.* + DISPLAY BY NAME depto.departamento, depto.nom_dpto, depto.status_t, depto.us_crea, + depto.fech_crea, depto.us_mod, depto.fech_mod LET numero_msg = 12 CALL msg(numero_msg) LET depto.nom_dpto = NULL @@ -113,10 +115,12 @@ FUNCTION adpcad001() CALL msg(numero_msg) NEXT FIELD nom_dpto ELSE - INSERT INTO adtb00001 VALUES (depto.departamento,depto.nom_dpto, + INSERT INTO adtb00001 (departamento,nom_dpto,status_t,us_crea,fech_crea,us_mod,fech_mod) + VALUES (depto.departamento,depto.nom_dpto, null, SUSER_SNAME (), GETDATE (), null, null) - INSERT INTO adtb00029 VALUES (depto.departamento,m_estado_a,m_estado_m, + INSERT INTO adtb00029 (departamento,estado_a,estado_m,depto_ant,estatus_t,us_crea,fech_crea,us_mod,fech_mod) + VALUES (depto.departamento,m_estado_a,m_estado_m, depto.departamento,null,SUSER_SNAME(), GETDATE (),null,null) LET m_depto = depto.departamento @@ -159,7 +163,7 @@ FUNCTION adpcmf001() RETURN END IF - LET SELEC = " SELECT UNIQUE * FROM adtb00001 where ", + LET SELEC = " SELECT DISTINCT * FROM adtb00001 where ", " status_t is null and ", criterio clipped, " ORDER BY 1" @@ -246,9 +250,7 @@ FUNCTION adpcmf001() END IF ## SE SELECCIONAN LOS CAMPOS QUE SON MODIFICABLES - INPUT BY NAME depto.nom_dpto, - m_estado_a, - m_estado_m WITHOUT DEFAULTS + INPUT BY NAME depto.nom_dpto WITHOUT DEFAULTS AFTER FIELD nom_dpto IF depto.nom_dpto IS NULL THEN @@ -283,9 +285,7 @@ FUNCTION adpcmf001() UPDATE chequeo SET nom_dpto = depto.nom_dpto WHERE departamento = depto.departamento - UPDATE adtb00029 SET estado_a = m_estado_a, - estado_m = m_estado_m, - us_mod = SUSER_NAME(), + UPDATE adtb00029 SET us_mod = SUSER_NAME(), fech_mod = GETDATE() WHERE departamento = depto.departamento diff --git a/PROYECTO/addir/adprmt017.4gl b/PROYECTO/addir/adprmt017.4gl index 30dab79..cb65839 100644 --- a/PROYECTO/addir/adprmt017.4gl +++ b/PROYECTO/addir/adprmt017.4gl @@ -289,7 +289,7 @@ FUNCTION adpcad017() ## SELECCIONA LA FECHA DE INGRESO Y EL SUELDO DE LA TABLA DE CONTRATACION ## Y SELECCION DE EMPLEADOS - SELECT UNIQUE convert(char(10),a.fech_efec,101),a.sueldo,b.cod_sol + SELECT UNIQUE a.fech_efec,a.sueldo,b.cod_sol INTO contra.fech_efec,contra.sueldo,parece.cod_sol FROM adtb00019 a,adtb00018 b WHERE a.cod_sol = b.cod_sol and b.cod_sol = acc_per.cod_sol and @@ -301,7 +301,7 @@ FUNCTION adpcad017() END IF - IF xtipo <> 'INGRESO' THEN + IF xtipo IS NULL OR xtipo <> 'INGRESO' THEN LET acc_per.cod_sol = NULL NEXT FIELD fecha END IF @@ -309,9 +309,9 @@ FUNCTION adpcad017() ## VERIFICA QUE EL SOLICITANTE EXISTE EN LA TABLA DE SOLICITANTES. SI EXISTE ## LO PRESENTA EN PANTALLA. - SELECT cod_sol,convert(char(10),fecha,101),nom1_sol,nom2_sol,apell1_sol, + SELECT cod_sol,fecha,nom1_sol,nom2_sol,apell1_sol, apell2_sol,calle,casa_num,barrio,urbanizacion,telefono, - cod_provincia,convert(char(10),fech_nac,101),cod_nac,estado_civil,estatura, + cod_provincia,fech_nac,cod_nac,estado_civil,estatura, peso,cedula,licencia,tipo_sangre,cod_puesto, cod_prof,sexo,status_t,us_crea,fech_crea,us_mod,fech_mod, serie @@ -372,12 +372,12 @@ FUNCTION adpcad017() ## CHEQUEA QUE EL EMPLEADO EXISTA EN LA TABLA DE EMPLEADOS. SI EXISTE ## DESPLEGA TODA LA INFORMACION REFERENTE AL EMPLEADO. - IF xtipo <> 'INGRESO' THEN + IF xtipo IS NULL OR xtipo <> 'INGRESO' THEN SELECT b.departamento,b.nivel_emp,b.cod_puesto,b.nom1_emp, b.nom2_emp,b.apell1_emp,b.apell2_emp,b.sueldo_ac, b.nomina,b.estado_civil,b.tipo_sangre, - b.cedula,b.cuenta_no,CONVERT(char(10),b.fech_efec,103),b.tipo_sueldo + b.cedula,b.cuenta_no,b.fech_efec,b.tipo_sueldo INTO acc_per.departamento,acc_per.nivel_emp,acc_per.cod_puesto, nombre9,nombre10,apellido9,apellido10,acc_per.sueldo_ac, acc_per.nomina,acc_per.estado_civil,acc_per.tipo_sangre, @@ -402,8 +402,8 @@ FUNCTION adpcad017() WHERE k.cod_puesto = acc_per.cod_puesto and k.status_t is null SELECT UNIQUE a.sexo INTO acc_per.sexo FROM adtb00021 a - WHERE a.num_emp = acc_per.num_emp AND a.cod_par = 0 AND - a.sec_par = 0 + WHERE a.num_emp = acc_per.num_emp AND ISNULL(a.cod_par,0) = 0 AND + ISNULL(a.sec_par,0) = 0 SELECT a.nis INTO pnis FROM adtb00030 a WHERE a.num_emp = acc_per.num_emp @@ -905,7 +905,7 @@ FUNCTION adpcad017() personal.serie USING "<<<" SELECT UNIQUE num_emp FROM adtb00021 - WHERE num_emp = acc_per.num_emp AND cod_par = 0 AND sec_par = 0 + WHERE num_emp = acc_per.num_emp AND ISNULL(cod_par,0) = 0 AND ISNULL(sec_par,0) = 0 IF STATUS = NOTFOUND THEN @@ -1001,14 +1001,14 @@ FUNCTION adpcmf017() END IF LET selec = - "SELECT UNIQUE a.num_trx,a.cod_mto,a.cod_sol,convert(char(10),a.fecha,103), ", - " CONVERT(CHAR(10),a.fech_efec,103),a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto, ", + "SELECT UNIQUE a.num_trx,a.cod_mto,a.cod_sol,a.fecha, ", + " a.fech_efec,a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto, ", " a.sueldo_ac,a.nomina,a.estado_civil,b.sexo,a.tipo_sangre, ", " a.sueldo_lq,a.observacion,a.num1_emp,a.departamento1, ", " a.nivel1_emp,a.cod1_puesto,a.num2_emp,a.departamento2, ", " a.nivel2_emp,a.cod2_puesto,a.num3_emp,a.departamento3, ", " a.nivel3_emp,a.cod3_puesto,c.cedula,a.us_crea,a.fech_crea,a.us_mod, ", - " a.fech_mod,CASE a.status_t WHEN 'E' THEN 'ANULADO' ELSE 'ACTIVO' END, CONVERT(CHAR(10),c.fech_nac,103) ", + " a.fech_mod,CASE a.status_t WHEN 'E' THEN 'ANULADO' ELSE 'ACTIVO' END, c.fech_nac ", "FROM adtb00020 a,adtb00003 c LEFT OUTER JOIN adtb00021 b ON b.num_emp = c.num_emp ", "WHERE a.num_emp = c.num_emp AND ",criterio clipped, " ORDER BY a.num_emp" @@ -1580,7 +1580,7 @@ FUNCTION adpcmf017() END IF UPDATE adtb00021 SET sexo = acc_per.sexo WHERE num_emp = acc_per.num_emp - AND cod_par = 0 AND sec_par=0 + AND ISNULL(cod_par,0) = 0 AND ISNULL(sec_par,0) = 0 UPDATE adtb00017 SET departamento = acc_per.departamento, nivel_emp = acc_per.nivel_emp, cod_puesto = acc_per.cod_puesto, @@ -1668,7 +1668,7 @@ FUNCTION desplegar() SELECT b.departamento,b.nivel_emp,b.cod_puesto,b.nom1_emp, b.nom2_emp,b.apell1_emp,b.apell2_emp,b.sueldo_ac, b.nomina,b.estado_civil,b.tipo_sangre, - b.cedula,b.cuenta_no,CONVERT(char(10),b.fech_efec,103), + b.cedula,b.cuenta_no,b.fech_efec, b.sueldo_ac INTO acc_per.departamento,acc_per.nivel_emp,acc_per.cod_puesto, nombre9,nombre10,apellido9,apellido10,acc_per.sueldo_ac, @@ -1764,7 +1764,7 @@ nombre5 clipped," ",nombre6 clipped," ",apellido5 clipped," ",apellido6 clipped ## DATOS VACACIONES IF xtipo = 'VACACIONES' THEN INITIALIZE vacacion.* TO NULL - SELECT a.cod_mov,a.cod_mov2,a.num_dias_disfrute,CONVERT(CHAR(10),a.fecha_sal,103),CONVERT(CHAR(10),a.fecha_ent,103), + SELECT a.cod_mov,a.cod_mov2,a.num_dias_disfrute,a.fecha_sal,a.fecha_ent, a.num_nomi, a.num_dias_disfrute,a.periodo,a.valor_vacaciones,a.num_dias_pagados,a.proporcion_vacaciones INTO vacacion.cod_mov1,vacacion.cod_mov2,vacacion.dias_vac,vacacion.fecha_sal,vacacion.fecha_ent, @@ -1930,7 +1930,7 @@ FUNCTION vacaciones(operacion) LET salario_acumulado = 0 IF vacacion.cod_mov1 = 36 THEN LET salario = 0 - SELECT CONVERT(CHAR(10),a.fech_efec,103),a.sueldo_ac INTO fecha_entrada_emp,salario + SELECT a.fech_efec,a.sueldo_ac INTO fecha_entrada_emp,salario FROM adtb00003 a WHERE a.num_emp = acc_per.num_emp @@ -2011,7 +2011,7 @@ FUNCTION vacaciones(operacion) END INPUT ELSE LET salario = 0 - SELECT CONVERT(CHAR(10),a.fech_efec,103),a.sueldo_ac INTO fecha_entrada_emp,salario + SELECT a.fech_efec,a.sueldo_ac INTO fecha_entrada_emp,salario FROM adtb00003 a WHERE a.num_emp = acc_per.num_emp LET salario_quincenal = salario /2 @@ -2733,7 +2733,7 @@ ON EVERY ROW SELECT COUNT(*) INTO depende FROM adtb00013 WHERE cod_sol = codigo_s AND cod_par = 4 - SELECT a.cod_provincia,CONVERT(CHAR(10),a.fech_nac,103),a.cod_nac + SELECT a.cod_provincia,a.fech_nac,a.cod_nac INTO cod_provincia,fecha_nac,codigo_n FROM adtb00012 a WHERE a.cod_sol = codigo_s diff --git a/PROYECTO/ccdir/ccprmt003.4gl b/PROYECTO/ccdir/ccprmt003.4gl index 3a50555..7b3b9de 100644 --- a/PROYECTO/ccdir/ccprmt003.4gl +++ b/PROYECTO/ccdir/ccprmt003.4gl @@ -2758,11 +2758,11 @@ REPORT cctb01b( END REPORT FUNCTION verifica_orden() - LET tieneorden = TRUE - SELECT a.num_oc + DEFINE cuantas INT + # COUNT(*) en vez de SELECT num_oc: con ordenes duplicadas daba -284 + LET cuantas = 0 + SELECT COUNT(*) INTO cuantas FROM prtb00012 a WHERE a.cotizacion_no = recibo_nc.num_orden AND a.status_T IS NULL - IF STATUS = NOTFOUND THEN - LET tieneorden = FALSE - END IF + LET tieneorden = (cuantas > 0) END FUNCTION diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index f13642b..8498dc7 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -965,8 +965,29 @@ + + + + + + + - + + + + + + + + + + + + + + + @@ -1057,10 +1078,9 @@ - + - diff --git a/PROYECTO/otrodir/MainMenu.4gl b/PROYECTO/otrodir/MainMenu.4gl index 136e172..47f0201 100644 --- a/PROYECTO/otrodir/MainMenu.4gl +++ b/PROYECTO/otrodir/MainMenu.4gl @@ -96,6 +96,7 @@ END MAIN FUNCTION show_mbs(d) DEFINE d ui.Dialog DEFINE rdir, rmbs INTEGER + DEFINE runtime STRING DEFINE cmd STRING,file_path VARCHAR(100), strconect VARCHAR(20) @@ -116,9 +117,24 @@ FUNCTION show_mbs(d) a.programa = pprograma # LET file_path = 'E:\\MARMOTECHC\\BIN320' DISPLAY BY NAME file_path,pperfil - DISPLAY "mainmenu credenciales: ",usuario clipped," ",clave clipped," ",file_path clipped - LET cmd = "fglrun ",file_path CLIPPED, "\\",mbs[rmbs].prog, ".42r " ,usuario CLIPPED," ",clave CLIPPED, + -- (antes imprimia usuario y CLAVE en texto claro en la consola/log) + DISPLAY "mainmenu ejecuta: ",mbs[rmbs].prog CLIPPED," desde ",file_path CLIPPED + -- Mismo runtime que el menu (no el primer "fglrun" del PATH del servidor) + LET runtime = fgl_getenv("FGLDIR") + IF runtime IS NULL OR runtime.getLength() = 0 THEN + LET runtime = "fglrun" + ELSE + LET runtime = '"', runtime, '\\bin\\fglrun"' + END IF + LET cmd = runtime," ",file_path CLIPPED, "\\",mbs[rmbs].prog, ".42r " ,usuario CLIPPED," ",clave CLIPPED, " ",pprinter1 ," ",pprinter2, " ",ckprinter," ",file_path," ",strconect + -- El programa arranca parado en su ruta de seg0005 (como en 3.20): ahi estan + -- cert\, filesXML\, net6.0\, tmp\... que la factura electronica busca con rutas + -- relativas, y sus .42m. Sin esto heredaba como directorio de trabajo la carpeta + -- del despliegue del GAR (que cambia en cada deploy y llego a tener .42m de 3.20). + IF file_path IS NOT NULL AND LENGTH(file_path CLIPPED) > 0 THEN + LET cmd = 'cd /d "', file_path CLIPPED, '" && ', cmd + END IF RUN cmd WITHOUT WAITING UPDATE seg0001 SET ultimo_programa_ejecutado = pprograma WHERE seg0001.usuario = usuario diff --git a/PROYECTO/vedir/veconvierteorden.4gl b/PROYECTO/vedir/veconvierteorden.4gl index 3e9a5f4..4a77aab 100644 --- a/PROYECTO/vedir/veconvierteorden.4gl +++ b/PROYECTO/vedir/veconvierteorden.4gl @@ -126,6 +126,18 @@ FUNCTION convierteorden( UPDATE prtb00020 SET num_oc = ISNULL(num_oc, 0) + 1, us_crea = xusuario, fech_crea = GETDATE() SELECT num_oc INTO ult_numero FROM prtb00020 + # RE-VALIDACION YA CON EL BLOQUEO DE prtb00020: la validacion del inicio + # corre fuera de la transaccion; si otro usuario estaba convirtiendo la + # misma cotizacion, aqui ya vemos su orden confirmada (cot 340001, 20/10/2026) + LET existe_oc = 0 + SELECT COUNT(*) INTO existe_oc FROM prtb00012 + WHERE cotizacion_no = xcotizacion_no AND status_t IS NULL + IF existe_oc > 0 THEN + ROLLBACK WORK + CALL fgl_winmessage( + "ERROR", "COTIZACION TIENE ORDEN, NO PUEDE CREAR ORDEN", "STOP") + RETURN 0, FALSE + END IF # AUTOCORRECCION: si el contador quedo por detras de prtb00012 # (otro programa creo ordenes sin avanzarlo), salta al siguiente libre LET existe_oc = 0 diff --git a/WEBSERVICES/veconvierteorden.4gl b/WEBSERVICES/veconvierteorden.4gl index 7eff0f2..e460b96 100644 --- a/WEBSERVICES/veconvierteorden.4gl +++ b/WEBSERVICES/veconvierteorden.4gl @@ -139,6 +139,17 @@ BEGIN WORK us_crea = xusuario, fech_crea = GETDATE() SELECT num_oc INTO ult_numero FROM prtb00020 + # RE-VALIDACION YA CON EL BLOQUEO DE prtb00020: evita dos ordenes para la + # misma cotizacion si dos usuarios convierten a la vez (cot 340001, 20/10/2026) + LET existe_oc = 0 + SELECT COUNT(*) INTO existe_oc FROM prtb00012 + WHERE cotizacion_no = xcotizacion_no AND status_t IS NULL + IF existe_oc > 0 THEN + LET pmensaje_error = + SFMT("La cotizacion %1 ya tiene orden, no puede crear otra.", xcotizacion_no) + ROLLBACK WORK + RETURN 0,FALSE + END IF # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre LET existe_oc = 0 SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero