{ ----------------------------------------------------------------------------- PROGRAMA : prprmt003 OBJETIVO : Mantenimiento de Produccion por Centro de Costos REALIZADO POR : Ing. Juan F. Soto. FECHA : Junio 17, 1993 ----------------------------------------------------------------------------- } GLOBALS "prprgb000.4gl" DEFINE nomb_mq ARRAY[200] OF CHAR(30) DEFINE dep_ant,p_codigo,sidx SMALLINT DEFINE medida,nomb1,nomb2 CHAR(20) DEFINE descrip2,nombre,nombre_mq,descrip_ant,descripcion CHAR(30) DEFINE hoy,fecha1 DATE DEFINE tiene,modifica CHAR(1) DEFINE temporero RECORD LIKE adtb00036.*, tmpnumero INT, usuario_c CHAR(40), fecha_c LIKE cttb00003.fech_crea, tdescripcion CHAR(40), cherror STRING DEFINE datos_c RECORD num_doc INTEGER, fecha DATE, #factor DEC(12,2), departamento SMALLINT END RECORD DEFINE arr_costos ARRAY[200] OF RECORD tipo LIKE cttb00003.cod_mq, emp_no LIKE cttb00003.emp_no, h_directa LIKE cttb00003.h_directa, h_indirecta LIKE cttb00003.h_indirecta, e_directa LIKE cttb00003.e_directa, e_indirecta LIKE cttb00003.e_indirecta, cod_prod LIKE cttb00011.cod_prod, cantidad LIKE cttb00003.cantidad, codigo_bloque LIKE cttb00003.codigo_bloque, turno SMALLINT END RECORD MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave # LET usuarios = "JSOTO" LET CLAVE = "lmmjvsd2009" #CONNECT to "decomarmol" USER usuarios USING clave CONNECT to "decomarmol" USER usuarios USING clave CALL prprmt003() END MAIN FUNCTION prprmt003() OPTIONS FORM LINE 5, ERROR LINE 24, PROMPT LINE 1 CLEAR SCREEN OPEN FORM prfmmt003 FROM "prfmmt003" DISPLAY FORM prfmmt003 DISPLAY "Registro de Produccion Diaria" AT 4,25 DISPLAY "prprmt003" AT 4,3 # CALL pantalla1() MENU "OPCION" ON ACTION NUEVO LET modifica = "N" CALL prpradd() ON ACTION BUSCAR LET modifica = "S" CALL prprmod() ON ACTION anular CALL prpranula() ON ACTION Salir EXIT MENU END MENU END FUNCTION FUNCTION prpradd() LET hoy = null LET datos_c.num_doc = 0 LABEL volver: LET nombre = null DISPLAY BY NAME nombre LET idx = 1 INPUT BY NAME datos_c.* WITHOUT DEFAULTS # Permanece la ultima fecha que el introdujo BEFORE FIELD fecha LET datos_c.fecha = hoy DISPLAY BY NAME datos_c.fecha AFTER FIELD fecha IF datos_c.fecha is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha END IF IF datos_c.fecha > today THEN LET numero_msg = 189 CALL msg(numero_msg) NEXT FIELD fecha END IF { # Control del registro de produccion diaria para la no duplicidad SELECT UNIQUE a. fecha FROM cttb00003 a WHERE a.fecha = datos_c.fecha and a.num_doc = datos_c.num_doc IF status != notfound THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD fecha END IF } SELECT DISTINCT a.mes FROM prtb00002 a WHERE datos_c.fecha BETWEEN a.semana_del AND a.semana_al IF STATUS = NOTFOUND THEN CALL fgl_winmessage("INFO","NO EXISTEN PERIODOS PARA CONTROLAR ESTA FECHA, DEBE DIGITAR PERIODO PARA ESTA FECHA","INFO") NEXT FIELD fecha END IF # Control busqueda departamento AFTER FIELD departamento IF datos_c.departamento is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD departamento END IF SELECT a.nom_dpto INTO descrip2 FROM adtb00001 a WHERE a.departamento = datos_c.departamento and a.status_t is null IF status >= 0 THEN IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD departamento END IF ELSE CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF DISPLAY BY NAME descrip2 # Busqueda del nombre del empleado END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF FOR idx = 1 to 100 LET arr_costos[idx].tipo = null LET arr_costos[idx].emp_no = null LET arr_costos[idx].h_directa = null LET arr_costos[idx].h_indirecta = null LET arr_costos[idx].e_directa = null LET arr_costos[idx].e_indirecta = null LET arr_costos[idx].cod_prod = null LET arr_costos[idx].cantidad = null END FOR # Arreglo para la captura de la produccion INPUT ARRAY arr_costos WITHOUT DEFAULTS FROM scr_costos.* ON KEY(F10) LET curr = arr_curr() LET scr_l = scr_line() IF arr_costos[curr].cod_prod IS NOT NULL THEN IF arr_costos[curr].codigo_bloque IS NULL THEN LET numero_msg =16 CALL msg(numero_msg) NEXT FIELD codigo_bloque END IF CALL medidas() DISPLAY arr_costos[curr].cantidad TO scr_costos[scr_l].cantidad END IF ON KEY(CONTROL-W) LET curr = arr_curr() IF INFIELD(cod_prod) THEN CALL buscaProd() DISPLAY BY NAME descripcion,medida DISPLAY arr_costos[curr].cod_prod TO scr_costos[scr_l].cod_prod END IF IF INFIELD(emp_no) THEN CALL buscaemp() DISPLAY BY NAME nombre DISPLAY arr_costos[curr].emp_no TO scr_costos[scr_l].emp_no END IF BEFORE ROW # Variables para controlar el indice del vector LET curr = arr_curr() LET scr_l = scr_line() AFTER FIELD turno IF arr_costos[curr].turno IS NOT NULL THEN SELECT a.descripcion INTO tdescripcion FROM cttb00018 a WHERE a.turno = arr_costos[curr].turno IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD turno END IF DISPLAY BY NAME tdescripcion END IF # Busca descripcion de la maquina AFTER FIELD tipo IF arr_costos[curr].tipo is not null THEN SELECT a.descripcion INTO nombre_mq FROM prtb00005 a WHERE a.codigo = arr_costos[curr].tipo and a.status_t is null IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo END IF DISPLAY BY NAME nombre_mq LET nomb_mq[curr] = nombre_mq END IF # Busca el nombre del empleado AFTER FIELD emp_no IF arr_costos[curr].emp_no is not null THEN SELECT a.nom1_emp,a.apell1_emp INTO nomb1,nomb2 FROM adtb00003 a WHERE a.num_emp = arr_costos[curr].emp_no # and a.nomina = "S" IF status = notfound THEN SELECT * INTO temporero.* FROM adtb00036 WHERE num_emp = arr_costos[curr].emp_no IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD emp_no END IF LET nomb1 = temporero.nom1_emp LET nomb2 = temporero.apell1_emp END IF LET nombre = nomb1 clipped,",",nomb2 clipped DISPLAY BY NAME NOMBRE ATTRIBUTE (BOLD) END IF # Control del codigo de la produccion que estan acumulando AFTER FIELD cod_prod IF arr_costos[curr].cod_prod is not null THEN # Busca la descripcion de la pila de la formula que se introdujo # anteriormente SELECT unique a.cod_prod,a.descripcion,a.unidad_med INTO p_codigo,descripcion,medida FROM cttb00001 a WHERE a.cod_prod = arr_costos[curr].cod_prod and a.status_t is null IF status >= 0 THEN IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_prod END IF ELSE CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF DISPLAY BY NAME medida DISPLAY BY NAME descripcion # BUSCA COSTO SEMI-ELABORADO LET selec = "SELECT CONVERT(CHAR(10),MAX(a.fecha),103) ", " FROM cttb00034 a ", " WHERE CONVERT(DATE,a.fecha,103) < ? "," AND ", " a.cod_prod = ? and ", " a.status_t IS NULL" PREPARE busca_fecha FROM selec EXECUTE busca_fecha USING datos_c.fecha,arr_costos[curr].cod_prod INTO fecha1 LET pcosto_labor[curr] = 0 SELECT AVG(a.costo_lab) INTO pcosto_labor[curr] FROM cttb00034 a WHERE a.fecha = fecha1 and a.cod_prod = arr_costos[curr].cod_prod and a.status_t is null IF pcosto_labor[curr] is null THEN LET pcosto_labor[curr] = 0 END IF LET pcosto_gasto[curr] = 0 SELECT AVG(a.costo_ga) INTO pcosto_gasto[curr] FROM cttb00034 a WHERE a.fecha = fecha1 AND a.cod_prod = arr_costos[curr].cod_prod and a.status_t IS NULL IF pcosto_gasto[curr] is null THEN LET pcosto_gasto[curr] = 0 END IF END IF #-------------------------------------------------------------------------- AFTER FIELD cantidad IF arr_costos[curr].cantidad is null THEN LET arr_costos[curr].cantidad = 0 END IF # IF datos_c.factor > 0 THEN # LET arr_costos[curr].h_directa = # datos_c.factor / arr_costos[curr].cantidad # DISPLAY arr_costos[curr].h_directa TO scr_costos[scr_l].h_directa # END IF AFTER INPUT # Control de la cancelacion de la operacion que se esta realizando en # el momento. IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF #---------------------------------------------------------------------------- EXIT INPUT END INPUT # CONTROL SECUENCIAL SELECT ult_num INTO datos_c.num_doc FROM cttb00010 LET datos_c.num_doc = datos_c.num_doc + 1 DISPLAY BY NAME datos_c.num_doc UPDATE cttb00012 SET documento = datos_c.num_doc WHERE documento = tmpnumero # Control para chequeo de las informaciones si estan correctas # da oportunidad al usuario de arreglar en el momento errores LABEL atras: FOR idx = 1 to arr_count() IF arr_costos[idx].emp_no is not null THEN IF arr_costos[idx].h_directa is null THEN LET arr_costos[idx].h_directa = 0 END IF IF arr_costos[idx].h_indirecta is null THEN LET arr_costos[idx].h_indirecta = 0 END IF IF arr_costos[idx].e_directa is null THEN LET arr_costos[idx].e_directa = 0 END IF IF arr_costos[idx].e_indirecta is null THEN LET arr_costos[idx].e_indirecta = 0 END IF INSERT INTO cttb00003 values (datos_c.num_doc,datos_c.fecha,datos_c.departamento, arr_costos[idx].emp_no,arr_costos[idx].tipo,nomb_mq[idx], arr_costos[idx].h_directa,arr_costos[idx].h_indirecta, arr_costos[idx].e_directa,arr_costos[idx].e_indirecta, arr_costos[idx].cod_prod, arr_costos[idx].cantidad,arr_costos[idx].codigo_bloque, pcosto_labor[idx],pcosto_gasto[idx],arr_costos[idx].turno, null,SUSER_SNAME(),GETDATE(),null,null) END IF END FOR display " " UPDATE cttb00010 set ult_num = datos_c.num_doc DISPLAY BY NAME datos_c.num_doc CALL integridad() IF bandera = "1" THEN LET bandera = 0 RETURN END IF LET numero_msg = 1 CALL msg(numero_msg) CLEAR FORM # Vuelve hacia el campo inicial de la pantalla para proseguir con el # siguiente documento GOTO volver #--------------------------------------------------------------------------- END FUNCTION # -------------------------- FUNCION DE MODIFICACION -------------------- FUNCTION prprmod() CONSTRUCT BY NAME criterio ON a.num_doc,a.fecha,a.departamento LET selec = "SELECT UNIQUE a.num_doc,CONVERT(CHAR(10),a.fecha,103),a.departamento ", "FROM cttb00003 a ", "WHERE ",criterio clipped, " And a.status_t is null", " ORDER BY a.num_doc,CONVERT(CHAR(10),a.fecha,103),a.departamento" DISPLAY selec IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF PREPARE comando FROM selec DECLARE buscate SCROLL CURSOR FOR comando OPEN buscate IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF FETCH FIRST buscate INTO datos_c.* IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF SELECT a.nom_dpto INTO descrip2 FROM adtb00001 a WHERE a.departamento = datos_c.departamento and a.status_t is null DISPLAY BY NAME datos_c.*,descrip2 MENU "OPCIONES " COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT buscate INTO datos_c.* IF STATUS = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF SELECT a.nom_dpto INTO descrip2 FROM adtb00001 a WHERE a.departamento = datos_c.departamento and a.status_t is null DISPLAY BY NAME descrip2 ATTRIBUTE (BOLD) DISPLAY BY NAME datos_c.* COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS buscate INTO datos_c.* IF STATUS = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF SELECT a.nom_dpto INTO descrip2 FROM adtb00001 a WHERE a.departamento = datos_c.departamento and a.status_t is null DISPLAY BY NAME descrip2 ATTRIBUTE (BOLD) DISPLAY BY NAME datos_c.* COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST buscate INTO datos_c.* DISPLAY BY NAME datos_c.* SELECT a.nom_dpto INTO descrip2 FROM adtb00001 a WHERE a.departamento = datos_c.departamento and a.status_t is null DISPLAY BY NAME descrip2 ATTRIBUTE (BOLD) LET numero_msg = 5 CALL msg(numero_msg) COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST buscate INTO datos_c.* DISPLAY BY NAME datos_c.* LET numero_msg = 4 SELECT a.nom_dpto INTO descrip2 FROM adtb00001 a WHERE a.departamento = datos_c.departamento and a.status_t is null DISPLAY BY NAME descrip2 ATTRIBUTE (BOLD) COMMAND "Escoger" " Actualiza Registro Cancela Operacion" SELECT a.nom_dpto INTO descrip2 FROM adtb00001 a WHERE a.departamento = datos_c.departamento and a.status_t is null DISPLAY BY NAME descrip2 ATTRIBUTE (BOLD) INPUT BY NAME datos_c.fecha THRU datos_c.departamento WITHOUT DEFAULTS AFTER FIELD fecha IF datos_c.fecha is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha END IF IF datos_c.fecha > today THEN LET numero_msg = 189 CALL msg(numero_msg) NEXT FIELD fecha END IF SELECT DISTINCT a.mes FROM prtb00002 a WHERE datos_c.fecha BETWEEN a.semana_del AND a.semana_al IF STATUS = NOTFOUND THEN CALL fgl_winmessage("INFO","NO EXISTEN PERIODOS PARA CONTROLAR ESTA FECHA, DEBE DIGITAR PERIODO PARA ESTA FECHA","INFO") NEXT FIELD fecha END IF AFTER INPUT IF int_flag THEN LET int_flag = false LET numero_msg = 2 CALL msg(numero_msg) RETURN END IF EXIT INPUT END INPUT DECLARE busca10 CURSOR FOR SELECT a.cod_mq,a.emp_no,a.h_directa,a.h_indirecta,a.e_directa,a.e_indirecta, a.cod_prod,a.cantidad,a.codigo_bloque,a.turno FROM cttb00003 a WHERE a.num_doc =datos_c.num_doc LET idx = 1 FOREACH busca10 INTO arr_costos[idx].* LET idx = idx + 1 END FOREACH CALL set_count(idx-1) # Arreglo para la captura de la produccion INPUT ARRAY arr_costos WITHOUT DEFAULTS FROM scr_costos.* ON KEY(F10) LET curr = arr_curr() LET scr_l = scr_line() IF arr_costos[curr].cod_prod IS NOT NULL THEN IF arr_costos[curr].codigo_bloque IS NULL THEN LET numero_msg =16 CALL msg(numero_msg) NEXT FIELD codigo_bloque END IF CALL medidas() DISPLAY arr_costos[curr].cantidad TO scr_costos[scr_l].cantidad END IF BEFORE ROW # Variables para controlar el indice del vector LET curr = arr_curr() LET scr_l = scr_line() AFTER FIELD turno IF arr_costos[curr].turno IS NOT NULL THEN SELECT a.descripcion INTO tdescripcion FROM cttb00018 a WHERE a.turno = arr_costos[curr].turno IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD turno END IF DISPLAY BY NAME tdescripcion END IF # Busca descripcion de la maquina AFTER FIELD tipo IF arr_costos[curr].tipo is not null THEN SELECT a.descripcion INTO nombre_mq FROM prtb00005 a WHERE a.codigo = arr_costos[curr].tipo and a.status_t is null IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo END IF DISPLAY BY NAME nombre_mq LET nomb_mq[curr] = nombre_mq END IF # Busca el nombre del empleado AFTER FIELD emp_no IF arr_costos[curr].emp_no is not null THEN SELECT a.nom1_emp,a.apell1_emp INTO nomb1,nomb2 FROM adtb00003 a WHERE a.num_emp = arr_costos[curr].emp_no # and a.nomina = "S" IF status = notfound THEN SELECT * INTO temporero.* FROM adtb00036 WHERE num_emp = arr_costos[curr].emp_no IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD emp_no END IF LET nomb1 = temporero.nom1_emp LET nomb2 = temporero.apell1_emp END IF LET nombre = nomb1 clipped," ",nomb2 clipped DISPLAY BY NAME NOMBRE ATTRIBUTE (BOLD) END IF # Control del codigo de la produccion que estan acumulando AFTER FIELD cod_prod IF arr_costos[curr].cod_prod is not null THEN # Busca la descripcion de la pila de la formula que se introdujo # anteriormente SELECT unique a.cod_prod,a.descripcion,a.unidad_med INTO p_codigo,descripcion,medida FROM cttb00001 a WHERE a.cod_prod = arr_costos[curr].cod_prod and a.status_t is null IF status >= 0 THEN IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_prod END IF ELSE CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF DISPLAY BY NAME medida DISPLAY BY NAME descripcion # BUSCA COSTO SEMI-ELABORADO LET selec = "SELECT CONVERT(CHAR(10),MAX(a.fecha),103) ", " FROM cttb00034 a ", " WHERE CONVERT(DATE,a.fecha,103) < ? "," AND ", " a.cod_prod = ? and ", " a.status_t IS NULL" PREPARE busca_fecha1 FROM selec EXECUTE busca_fecha1 USING datos_c.fecha,arr_costos[curr].cod_prod INTO fecha1 LET pcosto_labor[curr] = 0 SELECT AVG(a.costo_lab) INTO pcosto_labor[curr] FROM cttb00034 a WHERE a.fecha = fecha1 and a.cod_prod = arr_costos[curr].cod_prod and a.status_t is null IF pcosto_labor[curr] is null THEN LET pcosto_labor[curr] = 0 END IF LET pcosto_gasto[curr] = 0 SELECT AVG(a.costo_ga) INTO pcosto_gasto[curr] FROM cttb00034 a WHERE a.fecha = fecha1 AND a.cod_prod = arr_costos[curr].cod_prod and a.status_t IS NULL IF pcosto_gasto[curr] is null THEN LET pcosto_gasto[curr] = 0 END IF END IF #-------------------------------------------------------------------------- AFTER FIELD cantidad IF arr_costos[curr].cantidad is null THEN LET arr_costos[curr].cantidad = 0 END IF #IF datos_c.factor > 0 THEN # LET arr_costos[curr].h_directa = # datos_c.factor / arr_costos[curr].cantidad # DISPLAY arr_costos[curr].h_directa TO scr_costos[scr_l].h_directa #END IF AFTER INPUT # Control de la cancelacion de la operacion que se esta realizando en # el momento. IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF #---------------------------------------------------------------------------- EXIT INPUT END INPUT { # REALIZA UNA COPIA DE LOS REGISTROS ANTES DE BORRARLOS FOR idx = 1 to arr_count() IF arr_costos[idx].emp_no is not null THEN INSERT INTO cttb00017 values (datos_c.num_doc,datos_c.fecha,datos_c.departamento, arr_costos[idx].emp_no,arr_costos[idx].tipo,nomb_mq[idx], arr_costos[idx].h_directa,arr_costos[idx].h_indirecta, arr_costos[idx].e_directa,arr_costos[idx].e_indirecta, arr_costos[idx].cod_prod,arr_costos[idx].cantidad,arr_costos[idx].codigo_bloque, pcosto_labor[idx],pcosto_gasto[idx], arr_costos[idx].turno,null,usuario_c,fecha_c,SUSER_SNAME(),GETDATE()) END IF END FOR } BEGIN WORK DELETE FROM cttb00003 WHERE @num_doc = datos_c.num_doc FOR idx = 1 to arr_count() IF arr_costos[idx].emp_no is not null THEN INSERT INTO cttb00003 values (datos_c.num_doc,datos_c.fecha,datos_c.departamento, arr_costos[idx].emp_no,arr_costos[idx].tipo,nomb_mq[idx], arr_costos[idx].h_directa,arr_costos[idx].h_indirecta, arr_costos[idx].e_directa,arr_costos[idx].e_indirecta, arr_costos[idx].cod_prod,arr_costos[idx].cantidad,arr_costos[idx].codigo_bloque, pcosto_labor[idx],pcosto_gasto[idx], arr_costos[idx].turno, null,SUSER_SNAME(),GETDATE(),SUSER_SNAME(),GETDATE()) IF STATUS < 0 THEN LET cherror = "Ocurrio un error, favor verifique el error ",SQLCA.sqlerrd[2], SQLERRMESSAGE CALL fgl_winmessage("ERROR", cherror, "stop") ROLLBACK WORK CALL fgl_winmessage("STOP","TRANSACCIONES NO ACTUALIZADAS","INFO") EXIT MENU END IF END IF END FOR COMMIT WORK CALL integridad() IF bandera = "1" THEN LET bandera = 0 RETURN END IF LET numero_msg = 13 CALL msg(numero_msg) CLEAR FORM COMMAND "Retornar" "Retorna al menu Anterior" EXIT MENU END MENU END FUNCTION { FUNCTION repite() DEFINE producto,codigo SMALLINT LET codigo = arr_costos[curr].departamento LET producto = arr_costos[curr].cod_prod FOR idx = 1 TO arr_count() IF idx != curr THEN IF arr_costos[idx].departamento IS NOT NULL THEN IF arr_costos[idx].departamento = codigo and arr_costos[idx].cod_prod = producto THEN LET numero_msg = 21 CALL msg(numero_msg) LET existe = "S" ELSE IF existe != "S" THEN LET existe = "N" END IF END IF END IF END IF END FOR END FUNCTION } FUNCTION prpranula() INPUT BY NAME datos_c.num_doc,datos_c.fecha WITHOUT DEFAULTS # Permanece la ultima fecha que el introdujo BEFORE FIELD fecha LET datos_c.fecha = TODAY DISPLAY BY NAME datos_c.fecha AFTER FIELD fecha LET hoy = datos_c.fecha IF datos_c.fecha is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha END IF SELECT unique a.departamento INTO datos_c.departamento FROM cttb00003 a WHERE a.fecha = datos_c.fecha and a.num_doc = datos_c.num_doc and a.status_t is null IF status = notfound THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD num_doc END IF SELECT a.nom_dpto INTO descrip2 FROM adtb00001 a WHERE a.departamento = datos_c.departamento and a.status_t is null DISPLAY BY NAME datos_c.departamento,descrip2 AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF IF datos_c.fecha is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha END IF EXIT INPUT END INPUT LET opcion = fgl_winquestion("PREGUNTA","DESA ANULAR ESTE DOCUMENTO?","no","yes|no","QUESTION",0) LET opcion = upshift (opcion) IF opcion = "YES" THEN UPDATE cttb00003 SET status = "E", us_mod = SUSER_SNAME(), fecha_mod = GETDATE() WHERE fecha = datos_c.fecha and num_doc = datos_C.num_doc and departamento = datos_c.departamento LET numero_msg = 82 CALL msg(numero_msg) END IF END FUNCTION FUNCTION buscaProd() DEFINE aproducto DYNAMIC ARRAY OF RECORD cod_prod INT, descripcion CHAR(40), unidad_med CHAR(3) END RECORD OPEN WINDOW prfmwd010 AT 8,7 WITH FORM "prfmwd010" ATTRIBUTE (BORDER) CONSTRUCT BY NAME criterio ON a.descripcion LET selec = "SELECT a.cod_prod,a.descripcion,a.unidad_med FROM cttb00001 a WHERE ",criterio CLIPPED, " AND a.status_t IS NULL ORDER BY a.descripcion" PREPARE comando10 FROM selec DECLARE buscap10 CURSOR FOR comando10 LET idx = 1 FOREACH buscap10 INTO aproducto[idx].* LET idx = idx + 1 END FOREACH CALL set_count(idx-1) DISPLAY ARRAY aproducto TO sprod.* LET idx = arr_curr() IF int_flag THEN LET int_flag = FALSE END IF LET arr_costos[curr].cod_prod = aproducto[idx].cod_prod LET descripcion = aproducto[idx].descripcion LET medida = aproducto[idx].unidad_med CLOSE WINDOW prfmwd010 END FUNCTION FUNCTION buscaEMP() DEFINE aempleado ARRAY[500] OF RECORD num_emp INT, nom1_emp CHAR(40), apell1_emp CHAR(40) END RECORD OPEN WINDOW prfmwd011 AT 8,7 WITH FORM "prfmwd011" ATTRIBUTE (BORDER) CONSTRUCT BY NAME criterio ON a.nom1_emp,a.apell1_emp LET selec = "SELECT a.num_emp,a.nom1_emp,a.apell1_emp FROM adtb00003 a WHERE ",criterio CLIPPED, " AND a.status_t IS NULL ORDER BY a.nom1_emp" PREPARE comando11 FROM selec DECLARE buscap11 CURSOR FOR comando11 LET idx = 1 FOREACH buscap11 INTO aempleado[idx].* LET idx = idx + 1 END FOREACH CALL set_count(idx-1) DISPLAY ARRAY aempleado TO sficha.* LET idx = arr_curr() IF int_flag THEN LET int_flag = FALSE END IF LET arr_costos[curr].emp_no = aempleado[idx].num_emp LET nombre = aempleado[idx].nom1_emp," ",aempleado[idx].apell1_emp CLOSE WINDOW prfmwd011 END FUNCTION FUNCTION medidas() DEFINE arrmedida ARRAY[20] OF RECORD ancho1 DEC(12,5), largo1 DEC(12,5), espesor1 DEC(12,5), medida1 DEC(12,5), ancho2 DEC(12,5), largo2 DEC(12,5), espesor2 DEC(12,5), medida2 DEC(12,5), cantidad DEC(12,5) END RECORD, total_medida DEC(12,5) OPEN WINDOW prfmwd012 AT 8,3 WITH FORM "prfmwd012" ATTRIBUTE (BORDER) DISPLAY arr_costos[curr].cod_prod TO cod_prod DISPLAY arr_costos[curr].codigo_bloque TO codigo_bloque DISPLAY BY NAME descripcion,medida IF modifica = "S" THEN DECLARE busca_m CURSOR FOR SELECT a.ancho1,a.largo1,a.espesor1,a.medida1, a.ancho2,a.largo2,a.espesor2,a.medida2,a.cantidad FROM cttb00012 a WHERE a.documento = datos_c.num_doc AND a.cod_prod = arr_costos[curr].cod_prod and a.codigo_bloque = arr_costos[curr].codigo_bloque LET idx = 1 FOREACH busca_m INTO arrmedida[idx].* LET idx = idx + 1 END FOREACH CALL set_count(idx-1) END IF SELECT MAX(numero) INTO tmpnumero FROM cttb00016 IF tmpnumero IS NULL THEN LET tmpnumero = 9999999 END IF LET tmpnumero = tmpnumero + 1 INSERT INTO cttb00016 values (SUSER_SNAME(),tmpnumero,GETDATE()) FOR idx = 1 TO 10 LET arrmedida[idx].ancho1 = 0 LET arrmedida[idx].largo1 = 0 LET arrmedida[idx].espesor1 = 0 LET arrmedida[idx].ancho2 = 0 LET arrmedida[idx].largo2 = 0 LET arrmedida[idx].espesor2 = 0 END FOR INPUT ARRAY arrmedida WITHOUT DEFAULTS FROM sdespiece.* BEFORE ROW LET idx = arr_curr() LET sidx = scr_line() AFTER FIELD cantidad IF arrmedida[idx].espesor1 = 0 THEN LET arrmedida[idx].medida1 = arrmedida[idx].ancho1 * arrmedida[idx].largo1 END IF IF arrmedida[idx].espesor1 <> 0 THEN LET arrmedida[idx].medida1 = arrmedida[idx].ancho1 * arrmedida[idx].largo1 * arrmedida[idx].espesor1 END IF IF arrmedida[idx].espesor2 = 0 THEN LET arrmedida[idx].medida2 = arrmedida[idx].ancho2 * arrmedida[idx].largo2 END IF IF arrmedida[idx].espesor2 <> 0 THEN LET arrmedida[idx].medida2 = arrmedida[idx].ancho2 * arrmedida[idx].largo2 * arrmedida[idx].espesor2 END IF DISPLAY arrmedida[idx].medida1 TO sdespiece[sidx].medida1 DISPLAY arrmedida[idx].medida2 TO sdespiece[sidx].medida2 AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) EXIT INPUT END IF END INPUT IF int_flag THEN CLOSE WINDOW prfmwd012 RETURN END IF LET total_medida = 0 IF modifica = "N" THEN FOR idx =1 TO arr_count() IF arrmedida[idx].cantidad IS NOT NULL THEN INSERT INTO cttb00012 VALUES (tmpnumero,datos_c.fecha,arr_costos[idx].codigo_bloque, arr_costos[idx].cod_prod,arrmedida[idx].ancho1,arrmedida[idx].largo1, arrmedida[idx].espesor1,arrmedida[idx].medida1, arrmedida[idx].largo2,arrmedida[idx].ancho2,arrmedida[idx].espesor2, arrmedida[idx].medida2,arrmedida[idx].cantidad) LET total_medida = arrmedida[idx].medida1 + total_medida END IF END FOR ELSE DELETE FROM cttb00012 WHERE documento = datos_c.num_doc AND cod_prod = arr_costos[curr].cod_prod and codigo_bloque = arr_costos[curr].codigo_bloque FOR idx =1 TO arr_count() IF arrmedida[idx].cantidad IS NOT NULL THEN INSERT INTO cttb00012 VALUES (datos_c.num_doc,datos_c.fecha,arr_costos[curr].codigo_bloque, arr_costos[curr].cod_prod,arrmedida[idx].ancho1,arrmedida[idx].largo1, arrmedida[idx].espesor1,arrmedida[idx].medida1, arrmedida[idx].largo2,arrmedida[idx].ancho2,arrmedida[idx].espesor2, arrmedida[idx].medida2,arrmedida[idx].cantidad) LET total_medida = arrmedida[idx].medida1 + total_medida END IF END FOR END IF LET arr_costos[curr].cantidad = total_medida CLOSE WINDOW prfmwd012 END FUNCTION