{ ------------------------------------------------------------------ PROGRAMA : INPRMT010 OBJETIVO : Capturar, Modificar, Eliminar registros de la Tabla de la maestra de FIANZAS con entrada por FACTURA Internamiento de Materia Prima locales. PROGRAMADOR : Tadeo A. Ferreras FECHA REALIZACION : Julio 22, 1993. ------------------------------------------------------------------ } GLOBALS "inprgb000.4gl" DEFINE fact RECORD num_fianza INTEGER, num_res INTEGER, fecha DATE, cod_sp SMALLINT, cod_sp_sec SMALLINT, num_oc INTEGER, num_emb SMALLINT, valor_merc DECIMAL(12,2) END RECORD DEFINE fact3 ARRAY[200] OF RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, unidad CHAR(3), descrip CHAR(30), cantidad DECIMAL(12,2), cantidad_c DECIMAL(12,2) END RECORD DEFINE estado RECORD status_t LIKE intb00020.status_t, us_crea LIKE intb00020.us_crea, fech_crea LIKE intb00020.fech_crea, us_mod LIKE intb00020.us_mod, fech_mod LIKE intb00020.fech_mod END RECORD DEFINE datos_comp ARRAY[200] OF RECORD cod_ca CHAR(4), nom_ca CHAR(30) END RECORD DEFINE datos_pais ARRAY[200] OF RECORD cod_pais CHAR(3), nom_pais CHAR(30) END RECORD DEFINE datos_sp ARRAY[200] OF RECORD cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sp CHAR(30) END RECORD DEFINE curr INTEGER DEFINE codgp SMALLINT DEFINE nombre,nombre1,nombre2,nombre3,nomps,nom_comp,material CHAR(30) DEFINE total1,total2,total3,cantidad1,cantidad2,cantidad3,gravamen DECIMAL(13,3) DEFINE total_prima,cantidad4,cantidad5,cantidad6 DECIMAL(13,3) DEFINE grava,tasa DECIMAL(7,2) MAIN DEFER INTERRUPT SELECT * INTO p_companias.* FROM companias CALL inprrp010() END MAIN FUNCTION inprmt010() CLEAR SCREEN OPTIONS FORM LINE 9, ERROR LINE 23, COMMENT LINE 21 OPEN FORM infmmt010 FROM "infmmt010" DISPLAY FORM infmmt010 CALL pantalla() DISPLAY "inprmt010" AT 4,3 DISPLAY "Internamiento de Materiales Locales" AT 6,22 MENU "OPCIONES" COMMAND "Adicionar" " Adiciona Registro Cancela Operacion" CLEAR FORM CALL inmtad010() COMMAND "Consultar-modificar" " Realiza Busqueda Cancela Operacion" CLEAR FORM CALL inmtmd010() COMMAND "Salir" "Retorna Menu Anterior" EXIT MENU END MENU END FUNCTION FUNCTION busca_material() LET int_flag = FALSE OPEN WINDOW material1 AT 10,9 WITH FORM "infmwd004" ATTRIBUTE(BORDER,FORM LINE FIRST + 2) CONSTRUCT criterio ON a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp, a.unidad_med FROM cod_n,cod_grupo,cod_tipo,cod_sec,descrip_esp, unidad_med LET selec = "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp, ", "a.unidad_med FROM intb00001 a ", "WHERE a.status_t IS NULL AND ",criterio CLIPPED, "ORDER BY 1,2,3,4" PREPARE comando4 FROM selec DECLARE comp4 CURSOR FOR comando4 LET idx = 1 FOREACH comp4 INTO datos_mt[idx].* LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx - 1) IF idx = 1 THEN LET numero_msg = 3 CALL msg(numero_msg) GOTO salir END IF DISPLAY ARRAY datos_mt TO datos_mt1.* LET idx = ARR_CURR() LABEL salir: CLOSE WINDOW material1 END FUNCTION FUNCTION busca_suplidor() LET int_flag = FALSE OPEN WINDOW suplidor1 AT 10,9 WITH FORM "infmwd003" ATTRIBUTE(BORDER,FORM LINE FIRST + 2) CONSTRUCT criterio ON a.cod_sp,a.cod_sp_sec,a.nom_sp FROM cod_sp,cod_sp_sec,nom_sp LET selec = "SELECT a.cod_sp,a.cod_sp_sec,a.nom_sp FROM cotb00001 a ", "WHERE a.status_t IS NULL AND ",criterio CLIPPED, "ORDER BY 1,2" PREPARE comando3 FROM selec DECLARE comp3 CURSOR FOR comando3 LET idx = 1 FOREACH comp3 INTO datos_sp[idx].* LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx - 1) DISPLAY ARRAY datos_sp TO datos_sp1.* LET idx = ARR_CURR() CLOSE WINDOW suplidor1 END FUNCTION FUNCTION inmtad010() # WHENEVER ERROR CONTINUE # Captura los datos que va a contener el registro INPUT BY NAME fact.* ON KEY (control-W) CASE WHEN INFIELD(cod_sp) CALL busca_suplidor() LET fact.cod_sp = datos_sp[idx].cod_sp LET fact.cod_sp_sec = datos_sp[idx].cod_sp_sec LET nombre = datos_sp[idx].nom_sp DISPLAY BY NAME fact.cod_sp,fact.cod_sp_sec,nombre END CASE AFTER FIELD num_fianza IF fact.num_fianza = 0 OR fact.num_fianza IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_fianza END IF ########## Chequea que el numero de fact no exista en la tabla SELECT UNIQUE a.num_fianza FROM intb00020 a WHERE a.num_fianza = fact.num_fianza AND a.tipo_doc = "L" IF status != NOTFOUND THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD num_fianza END IF AFTER FIELD num_res IF fact.num_res IS NOT NULL THEN SELECT UNIQUE a.num_res FROM intb00019 a WHERE a.num_res = fact.num_res IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD num_res END IF END IF BEFORE FIELD fecha LET fact.fecha = today DISPLAY BY NAME fact.fecha AFTER FIELD fecha IF fact.fecha IS NULL THEN LET fact.fecha = today END IF AFTER FIELD cod_sp_sec IF fact.cod_sp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sp_sec END IF ##### Busca el nombre del suplidor SELECT a.nom_sp INTO nombre FROM cotb00001 a WHERE a.cod_sp = fact.cod_sp AND a.cod_sp_sec = fact.cod_sp_sec AND a.status_t IS NULL IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_sp END IF DISPLAY BY NAME nombre AFTER FIELD num_oc IF fact.num_oc IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_oc END IF AFTER FIELD valor_merc IF fact.valor_merc IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_merc END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF INPUT ARRAY fact3 FROM fact2.* BEFORE ROW LET curr = ARR_CURR() LET fila = SCR_LINE() ON KEY (control-W) CASE WHEN INFIELD(cod_n) LET curr = ARR_CURR() CALL busca_material() LET fact3[curr].cod_n = datos_mt[idx].cod_n LET fact3[curr].cod_grupo = datos_mt[idx].cod_grupo LET fact3[curr].cod_tipo = datos_mt[idx].cod_tipo LET fact3[curr].cod_sec = datos_mt[idx].cod_sec LET fact3[curr].descrip = datos_mt[idx].descrip_esp LET fact3[curr].unidad = datos_mt[idx].unidad_med DISPLAY fact3[curr].cod_n,fact3[curr].cod_grupo,fact3[curr].cod_tipo, fact3[curr].cod_sec,fact3[curr].descrip,fact3[curr].unidad TO fact2[fila].cod_n,fact2[fila].cod_grupo,fact2[fila].cod_tipo, fact2[fila].cod_sec,fact2[fila].descrip,fact2[fila].unidad NEXT FIELD cod_sec END CASE AFTER FIELD cod_sec IF fact3[curr].cod_sec IS NOT NULL THEN IF fact3[curr].cod_n IS NULL OR fact3[curr].cod_n > 1 OR fact3[curr].cod_grupo IS NULL OR fact3[curr].cod_tipo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_n END IF ##### Buscando la descripcion del material SELECT a.descrip_esp,a.unidad_med INTO fact3[curr].descrip,fact3[curr].unidad FROM intb00022 a WHERE a.cod_n = fact3[curr].cod_n AND a.cod_grupo = fact3[curr].cod_grupo AND a.cod_tipo = fact3[curr].cod_tipo AND a.cod_sec = fact3[curr].cod_sec IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_n END IF DISPLAY fact3[curr].descrip,fact3[curr].unidad TO fact2[fila].descrip,fact2[fila].unidad END IF AFTER FIELD cantidad IF fact3[curr].cantidad IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cantidad END IF #### Impide que la cantidad a digitar sea mayor que el balance para esa #### Produccion y ese numero de resolucion BEFORE FIELD cantidad_c LET fact3[curr].cantidad_c = fact3[curr].cantidad DISPLAY fact3[curr].cantidad_c TO fact2[fila].cantidad_c AFTER FIELD cantidad_c IF fact3[curr].cantidad_c IS NULL THEN LET fact3[curr].cantidad_c = fact3[curr].cantidad END IF IF fact3[curr].cantidad_c > fact3[curr].cantidad THEN LET numero_msg = 153 CALL msg(numero_msg) NEXT FIELD cantidad_c END IF DISPLAY fact3[curr].cantidad_c TO fact2[curr].cantidad_c END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF ###### Proceso para insertar valores en la tabla o maestra de solicitud ##### FOR idx = 1 TO ARR_COUNT() IF fact3[idx].cod_n IS NOT NULL AND fact3[idx].cod_grupo IS NOT NULL OR fact3[idx].cod_tipo IS NOT NULL OR fact3[idx].cod_sec IS NOT NULL THEN INSERT INTO intb00020 (tipo_doc,num_fianza,num_res,fecha,cod_sp,cod_sp_sec, num_oc,num_emb,valor_merc,cod_n,cod_grupo,cod_tipo, cod_sec,cantidad,cantidad_c,status_t,us_crea,fech_crea, us_mod,fech_mod) VALUES("L",fact.*,fact3[idx].cod_n,fact3[idx].cod_grupo,fact3[idx].cod_tipo, fact3[idx].cod_sec,fact3[idx].cantidad,fact3[idx].cantidad_c, NULL,USER,CURRENT,NULL,NULL) END IF END FOR LET numero_msg = 1 CALL msg(numero_msg) CLEAR FORM END FUNCTION ######## Funcion para modificar una fact ####### FUNCTION inmtmd010() # Aqui se prepara para la captura del criterio de seleccion CONSTRUCT criterio ON a.num_fianza,a.num_res,a.fecha FROM num_fianza,num_res,fecha IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF ######## Selecionando datos a modificar ######## LET selec = "SELECT UNIQUE a.num_fianza,a.num_res,a.fecha,a.cod_sp,a.cod_sp_sec, ", "a.num_oc,a.num_emb,a.valor_merc ", "FROM intb00020 a WHERE a.status_t is null AND a.tipo_doc = 'L' AND ", criterio clipped, "ORDER BY 1,3" PREPARE busca FROM selec DECLARE datos SCROLL CURSOR FOR busca OPEN datos CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF FETCH FIRST datos INTO fact.* IF status >= 0 THEN IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF SELECT a.nom_sp INTO nombre FROM cotb00001 a WHERE a.cod_sp = fact.cod_sp AND a.cod_sp_sec = fact.cod_sp_sec AND a.status_t IS NULL DISPLAY BY NAME fact.*,nombre MENU "OPCIONES " COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO fact.* IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF SELECT a.nom_sp INTO nombre FROM cotb00001 a WHERE a.cod_sp = fact.cod_sp AND a.cod_sp_sec = fact.cod_sp_sec AND a.status_t IS NULL DISPLAY BY NAME fact.*,nombre COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO fact.* IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF SELECT a.nom_sp INTO nombre FROM cotb00001 a WHERE a.cod_sp = fact.cod_sp AND a.cod_sp_sec = fact.cod_sp_sec AND a.status_t IS NULL DISPLAY BY NAME fact.*,nombre COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO fact.* SELECT a.nom_sp INTO nombre FROM cotb00001 a WHERE a.cod_sp = fact.cod_sp AND a.cod_sp_sec = fact.cod_sp_sec AND a.status_t IS NULL DISPLAY BY NAME fact.*,nombre LET numero_msg = 5 CALL msg(numero_msg) COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO fact.* SELECT a.nom_sp INTO nombre FROM cotb00001 a WHERE a.cod_sp = fact.cod_sp AND a.cod_sp_sec = fact.cod_sp_sec AND a.status_t IS NULL DISPLAY BY NAME fact.*,nombre LET numero_msg = 4 CALL msg(numero_msg) COMMAND "Escoger" " Actualiza Registro Cancela Operacion" INPUT BY NAME fact.num_res THRU fact.valor_merc WITHOUT DEFAULTS ON KEY (control-W) CASE WHEN INFIELD(cod_sp) CALL busca_suplidor() LET fact.cod_sp = datos_sp[idx].cod_sp LET fact.cod_sp_sec= datos_sp[idx].cod_sp_sec LET nombre = datos_sp[idx].nom_sp DISPLAY BY NAME fact.cod_sp,fact.cod_sp_sec,nombre END CASE AFTER FIELD num_res IF fact.num_res IS NOT NULL THEN SELECT UNIQUE a.num_res FROM intb00019 a WHERE a.num_res = fact.num_res IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD num_res END IF END IF AFTER FIELD fecha IF fact.fecha IS NULL THEN LET fact.fecha = today END IF AFTER FIELD cod_sp_sec IF fact.cod_sp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sp_sec END IF SELECT a.nom_sp INTO nombre FROM cotb00001 a WHERE a.cod_sp = fact.cod_sp AND a.cod_sp_sec = fact.cod_sp_sec AND a.status_t IS NULL IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_sp END IF DISPLAY BY NAME nombre AFTER FIELD valor_merc IF fact.valor_merc IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_merc END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF DECLARE buscar CURSOR FOR SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,b.unidad_med,b.descrip_esp, a.cantidad,a.cantidad_c FROM intb00020 a,intb00022 b WHERE a.cod_n=b.cod_n AND a.cod_grupo=b.cod_grupo AND a.cod_tipo=b.cod_tipo AND a.cod_sec = b.cod_sec AND a.num_fianza = fact.num_fianza AND a.tipo_doc="L" LET idx = 1 FOREACH buscar INTO fact3[idx].* LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx - 1) INPUT ARRAY fact3 WITHOUT DEFAULTS FROM fact2.* BEFORE ROW LET curr = ARR_CURR() LET fila = SCR_LINE() ON KEY (control-W) CASE WHEN INFIELD(cod_n) CALL busca_material() LET fact3[curr].cod_n = datos_mt[idx].cod_n LET fact3[curr].cod_grupo = datos_mt[idx].cod_grupo LET fact3[curr].cod_tipo = datos_mt[idx].cod_tipo LET fact3[curr].cod_sec = datos_mt[idx].cod_sec LET fact3[curr].descrip = datos_mt[idx].descrip_esp LET fact3[curr].unidad = datos_mt[idx].unidad_med DISPLAY fact3[curr].cod_n,fact3[curr].cod_grupo,fact3[curr].cod_tipo, fact3[curr].cod_sec,fact3[curr].descrip,fact3[curr].unidad TO fact2[fila].cod_n,fact2[fila].cod_grupo,fact2[fila].cod_tipo, fact2[fila].cod_sec,fact2[fila].descrip,fact2[fila].unidad NEXT FIELD cod_sec END CASE AFTER FIELD cod_sec IF fact3[curr].cod_sec IS NOT NULL THEN IF fact3[curr].cod_n IS NULL OR fact3[curr].cod_n > 1 OR fact3[curr].cod_grupo IS NULL OR fact3[curr].cod_tipo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_n END IF ##### Buscando la descripcion del material SELECT a.descrip_esp,a.unidad_med INTO fact3[curr].descrip,fact3[curr].unidad FROM intb00022 a WHERE a.cod_n = fact3[curr].cod_n AND a.cod_grupo = fact3[curr].cod_grupo AND a.cod_tipo = fact3[curr].cod_tipo AND a.cod_sec = fact3[curr].cod_sec IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_n END IF DISPLAY fact3[curr].descrip,fact3[curr].unidad TO fact2[fila].descrip,fact2[fila].unidad END IF AFTER FIELD cantidad IF fact3[curr].cantidad IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cantidad END IF AFTER FIELD cantidad_c IF fact3[curr].cantidad_c IS NULL THEN LET fact3[curr].cantidad_c = fact3[curr].cantidad END IF IF fact3[curr].cantidad_c > fact3[curr].cantidad THEN LET numero_msg = 153 CALL msg(numero_msg) NEXT FIELD cantidad_c END IF DISPLAY fact3[curr].cantidad_c TO fact2[curr].cantidad_c END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF ###### Proceso para modificar valores en la tabla o maestra de solicitud ##### DELETE FROM intb00020 WHERE @num_fianza = fact.num_fianza AND @tipo_doc = "L" FOR idx = 1 TO ARR_COUNT() IF fact3[idx].cod_n IS NOT NULL AND fact3[idx].cod_grupo IS NOT NULL OR fact3[idx].cod_tipo IS NOT NULL OR fact3[idx].cod_sec IS NOT NULL THEN INSERT INTO intb00020 (tipo_doc,num_fianza,num_res,fecha,cod_sp,cod_sp_sec, num_oc,num_emb,valor_merc,cod_n,cod_grupo,cod_tipo, cod_sec,cantidad,cantidad_c,status_t,us_crea,fech_crea, us_mod,fech_mod) VALUES("L",fact.*,fact3[idx].cod_n,fact3[idx].cod_grupo,fact3[idx].cod_tipo, fact3[idx].cod_sec,fact3[idx].cantidad,fact3[idx].cantidad_c, NULL,USER,CURRENT,USER,CURRENT) END IF END FOR LET numero_msg = 13 CALL msg(numero_msg) ##### Proceso para eliminar una faction ####### COMMAND KEY ("L") "eLiminar" UPDATE intb00020 set (status_t,us_mod,fech_mod) = ("E",USER,CURRENT) WHERE @num_fianza = fact.num_fianza AND @tipo_doc = "L" LET numero_msg = 39 CALL msg(numero_msg) COMMAND "Retornar" "Retorna al menu anterior" CLEAR FORM EXIT MENU END MENU END FUNCTION