{ =========================================================================== Programa : CTPRMT019 Sistema : Sistema de Costos Proceso : Relacion de Producto Terminado y Semi-Elaborado Autor : Juan Soto. Fecha : Julio 09, 1993 =========================================================================== } GLOBALS "ctprgb000.4gl" DEFINE datos_pr RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descrip_esp CHAR(30) END RECORD DEFINE datos_ar ARRAY[200] OF RECORD cod_prod INTEGER, desc_prod CHAR(30), unidad CHAR(15), cantidad DECIMAL(12,2) END RECORD DEFINE j,i,cod1,cod2,cod3,cod4,cod5 SMALLINT, descrip CHAR(30) FUNCTION ctprmt019() LET int_flag = FALSE # WHENEVER ERROR CONTINUE CLEAR SCREEN OPTIONS FORM LINE 9, ERROR LINE 23, COMMENT LINE 21 CALL pantalla() DISPLAY "ctprmt019" AT 4,3 DISPLAY "Relacion Producto Terminado y Semi-Elaborado" AT 6,18 OPEN FORM ctfmmt019 FROM "ctfmmt019" DISPLAY FORM ctfmmt019 MENU "OPCIONES" COMMAND "Adicionar" " Adiciona Registro Cancela Operacion" CLEAR FORM CALL ctadmt019() COMMAND "Consultar-modificar" " Realiza Busqueda Cancela Operacion" CLEAR FORM CALL ctmdmt019() COMMAND "Salir" EXIT MENU END MENU END FUNCTION FUNCTION ctadmt019() LABEL nuevo: INPUT BY NAME datos_pr.* AFTER FIELD cod_n IF datos_pr.cod_n IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_n END IF AFTER FIELD cod_grupo IF datos_pr.cod_grupo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_grupo END IF AFTER FIELD cod_tipo IF datos_pr.cod_tipo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_tipo END IF AFTER FIELD cod_sec IF datos_pr.cod_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sec END IF SELECT a.descrip_esp INTO datos_pr.descrip_esp FROM iptb00002 a WHERE a.cod_n = datos_pr.cod_n and a.cod_grupo = datos_pr.cod_grupo and a.cod_tipo = datos_pr.cod_tipo and a.cod_sec = datos_pr.cod_sec and a.status_t is null IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_n END IF DISPLAY BY NAME datos_pr.descrip_esp END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF # Captura las informaciones de los productos con sus costos INPUT ARRAY datos_ar FROM datos_sc.* BEFORE ROW LET idx = ARR_CURR() LET j = SCR_LINE() AFTER FIELD cod_prod IF datos_ar[idx].cod_prod IS NOT NULL THEN SELECT a.descripcion,a.unidad_med INTO datos_ar[idx].desc_prod,datos_ar[idx].unidad FROM cttb00001 a WHERE a.cod_prod = datos_ar[idx].cod_prod AND a.status_t IS NULL IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_prod END IF DISPLAY datos_ar[idx].desc_prod,datos_ar[idx].unidad TO datos_sc[j].desc_prod,datos_sc[j].unidad END IF LET existe = "N" CALL repite19() IF existe = "S" THEN NEXT FIELD cod_prod END IF AFTER FIELD cantidad IF datos_ar[idx].cantidad IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cantidad END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF FOR i = 1 TO ARR_COUNT() IF datos_ar[i].cod_prod IS NOT NULL THEN INSERT INTO cttb00006 VALUES (datos_pr.cod_n,datos_pr.cod_grupo, datos_pr.cod_tipo,datos_pr.cod_sec, datos_ar[i].cod_prod,datos_ar[i].cantidad, null,user,CURRENT,null,null) END IF END FOR LET numero_msg = 1 CALL msg(numero_msg) CLEAR FORM GOTO nuevo END FUNCTION FUNCTION ctmdmt019() LET int_flag = FALSE CONSTRUCT criterio ON a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec FROM cod_n,cod_grupo,cod_tipo,cod_sec IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF LET selec = "SELECT UNIQUE a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,b.descrip_esp ", "FROM cttb00006 a,iptb00002 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.status_t IS NULL AND b.status_t IS NULL AND ", criterio CLIPPED," ORDER BY 1" PREPARE comando FROM selec DECLARE pro SCROLL CURSOR FOR comando OPEN pro FETCH FIRST pro INTO datos_pr.* IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF DISPLAY BY NAME datos_pr.* MENU "Opcion" COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT pro INTO datos_pr.* IF STATUS = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) FETCH LAST pro INTO datos_pr.* END IF DISPLAY BY NAME datos_pr.* COMMAND "Anterior" "Presenta en pantalla el anterior registro encontrado" FETCH PREVIOUS pro INTO datos_pr.* IF STATUS = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) FETCH LAST pro INTO datos_pr.* END IF DISPLAY BY NAME datos_pr.* COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST pro INTO datos_pr.* LET numero_msg = 5 CALL msg(numero_msg) DISPLAY BY NAME datos_pr.* COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST pro INTO datos_pr.* LET numero_msg = 4 CALL msg(numero_msg) DISPLAY BY NAME datos_pr.* COMMAND "Escoger" DECLARE busca CURSOR FOR SELECT a.cod_prod,b.descripcion,b.unidad_med,a.cantidad FROM cttb00006 a,cttb00001 b WHERE a.cod_prod = b.cod_prod AND a.status_t IS NULL AND b.status_t IS NULL AND a.cod_n = datos_pr.cod_n AND a.cod_grupo = datos_pr.cod_grupo AND a.cod_tipo = datos_pr.cod_tipo AND a.cod_sec = datos_pr.cod_sec ORDER BY 1 LET idx = 1 FOREACH busca INTO datos_ar[idx].* LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx - 1) # Captura las informaciones de las producciones INPUT ARRAY datos_ar WITHOUT DEFAULTS FROM datos_sc.* BEFORE ROW LET idx = ARR_CURR() LET j = SCR_LINE() AFTER FIELD cod_prod IF datos_ar[idx].cod_prod IS NOT NULL THEN SELECT a.descripcion,a.unidad_med INTO datos_ar[idx].desc_prod,datos_ar[idx].unidad FROM cttb00001 a WHERE a.cod_prod = datos_ar[idx].cod_prod AND a.status_t IS NULL IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_prod END IF DISPLAY datos_ar[idx].desc_prod,datos_ar[idx].unidad TO datos_sc[j].desc_prod,datos_sc[j].unidad END IF LET existe = "N" CALL repite19() IF existe = "S" THEN NEXT FIELD cod_prod END IF AFTER FIELD cantidad IF datos_ar[idx].cantidad IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cantidad END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF DELETE FROM cttb00006 WHERE @cod_n = datos_pr.cod_n AND @cod_grupo = datos_pr.cod_grupo AND @cod_tipo = datos_pr.cod_tipo AND @cod_sec = datos_pr.cod_sec FOR i = 1 TO ARR_COUNT() IF datos_ar[i].cod_prod IS NOT NULL THEN INSERT INTO cttb00006 VALUES (datos_pr.cod_n,datos_pr.cod_grupo, datos_pr.cod_tipo,datos_pr.cod_sec, datos_ar[i].cod_prod,datos_ar[i].cantidad, null,user,CURRENT,null,null) END IF END FOR LET numero_msg = 13 CALL msg(numero_msg) COMMAND KEY ("L") "eLiminar" UPDATE cttb00006 SET (status_t,us_mod,fech_mod) = ("E",user,current) WHERE @cod_n = datos_pr.cod_n AND @cod_grupo = datos_pr.cod_grupo AND @cod_tipo = datos_pr.cod_tipo AND @cod_sec = datos_pr.cod_sec COMMAND "Retornar" EXIT MENU END MENU END FUNCTION FUNCTION repite19() DEFINE codigo SMALLINT LET codigo = datos_ar[idx].cod_prod FOR i = 1 TO arr_count() IF i != idx THEN IF datos_ar[i].cod_prod IS NOT NULL THEN IF datos_ar[i].cod_prod = codigo 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