{ ------------------------------------------------------------------------------- PROGRAMA : IRPRMT004 OBJETIVO : Capturar, Modificar, Eliminar registros de la Tabla de Costos Estandares PROGRAMADOR : Ing. Juan Fco. Soto. FECHA REALIZACION : Marzo 1, 1993. ------------------------------------------------------------------------------- } GLOBALS "irprgb000.4gl" DEFINE checkapi, answer INT ## Arreglo consulta/modificacion: se navega sobre un arreglo en memoria en vez ## de un SCROLL CURSOR vivo, porque bajo el RDD de SQL Server cualquier otra ## sentencia (los SELECT a mestable, el COMMIT del Escoger, el UPDATE de ## eLiminar) cierra el cursor de servidor y provoca el error -400 ## "Fetch attempted on unopen cursor". DEFINE arr_costos DYNAMIC ARRAY OF RECORD mes_ini LIKE intb00013.mes_ini, mes_fin LIKE intb00013.mes_fin, ano LIKE intb00013.ano, cod_n LIKE intb00001.cod_n, cod_grupo LIKE intb00001.cod_grupo, cod_tipo LIKE intb00001.cod_tipo, cod_sec LIKE intb00001.cod_sec, costo_st LIKE intb00013.costo_st, us_crea LIKE intb00013.us_crea, fech_crea LIKE intb00013.fech_crea, us_mod LIKE intb00013.us_mod, fech_mod LIKE intb00013.fech_mod, descrip_esp LIKE intb00001.descrip_esp, unidad_med LIKE intb00001.unidad_med END RECORD MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT to "smarmotech" USER usuarios USING clave SELECT * INTO p_companias.* FROM companias CALL irprmt004() END MAIN FUNCTION irprmt004() CLEAR SCREEN OPTIONS FORM LINE 9, ERROR LINE 23, COMMENT LINE 22 OPEN FORM irfmmt004 FROM "irfmmt004" DISPLAY FORM irfmmt004 DISPLAY "irprmt004" AT 4,3 DISPLAY "Costo Standard " AT 6,31 MENU "OPCIONES" COMMAND "Adicionar" " Adiciona Registro Cancela Operacion" CLEAR FORM LET int_flag = false CALL irpcad004() COMMAND "Consultar-modificar" " Realiza Busqueda Cancela Operacion" LET int_flag = false CALL irpcmf004() COMMAND "Salir" "Retorna Menu Anterior" EXIT MENU END MENU END FUNCTION FUNCTION irpcad004() #WHENEVER ERROR CONTINUE ## Captura los datos que va a contener el registro INPUT BY NAME costos.mes_ini THRU costos.costo_st ## Verifica que el costo exista en el catalogo de costos. Si existe, ## entonces despliega los datos del registro existente. AFTER FIELD mes_ini IF costos.mes_ini IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD mes_ini ELSE SELECT descrip INTO descrip1 FROM mestable WHERE mes = costos.mes_ini and status_t is null IF status >= 0 THEN IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD mes_ini END IF END IF DISPLAY BY NAME descrip1 END IF AFTER FIELD mes_fin IF costos.mes_fin IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD mes_fin ELSE SELECT descrip INTO descrip2 FROM mestable WHERE mes = costos.mes_fin and status_t is null IF status >= 0 THEN IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD mes_fin END IF END IF DISPLAY BY NAME descrip2 END IF AFTER FIELD ano IF costos.ano IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD ano END IF AFTER FIELD cod_sec SELECT mes_ini,mes_fin,ano,cod_n,cod_grupo,cod_tipo,cod_sec FROM irtb00013 WHERE mes_ini = costos.mes_ini AND mes_fin = costos.mes_fin AND ano = costos.ano AND cod_n = costos.cod_n AND cod_grupo = costos.cod_grupo AND cod_tipo = costos.cod_tipo AND cod_sec = costos.cod_sec IF status != NOTFOUND THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD mes_ini END IF IF ( costos.cod_n = 0 AND costos.cod_grupo = 0 AND costos.cod_tipo = 0 AND costos.cod_sec = 0 ) THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_n ELSE SELECT a.descrip_esp,a.unidad_med INTO articulos.descrip_esp,articulos.unidad_med FROM irtb00002 a WHERE a.cod_n=costos.cod_n AND a.cod_grupo=costos.cod_grupo AND a.cod_tipo=costos.cod_tipo AND a.cod_sec=costos.cod_sec 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_n END IF END IF DISPLAY BY NAME articulos.descrip_esp,articulos.unidad_med END IF AFTER FIELD costo_st IF costos.costo_st IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD costo_st END IF AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF IF costos.costo_st IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD costo_st ELSE LET m_articulos.cod_n = costos.cod_n LET m_articulos.cod_grupo = costos.cod_grupo LET m_articulos.cod_tipo = costos.cod_tipo LET m_articulos.cod_sec = costos.cod_sec LET m_articulos.descrip_esp = articulos.descrip_esp LET m_articulos.descrip_ing = costos.costo_st SELECT SUM(cantidad_2) INTO m_articulos.existencia from irtb00006 WHERE cod_n = costos.cod_n and cod_grupo = costos.cod_grupo and cod_tipo = costos.cod_tipo and cod_sec = costos.cod_sec AND status_t IS NULL SELECT exist_min, id_maintainx INTO m_articulos.exist_min, checkapi FROM irtb00002 WHERE cod_n = costos.cod_n and cod_grupo = costos.cod_grupo and cod_tipo = costos.cod_tipo and cod_sec = costos.cod_sec AND status_t IS NULL BEGIN WORK IF checkapi IS NOT NULL THEN CALL ApiMaintainR('PATCH',checkapi, m_articulos.*, usuarios) RETURNING answer IF answer != 1 THEN DISPLAY "AQUI 6" ROLLBACK WORK END IF END IF INSERT INTO irtb00013 VALUES (costos.mes_ini,costos.mes_fin, costos.ano,costos.cod_n,costos.cod_grupo, costos.cod_tipo,costos.cod_sec,costos.costo_st, null,USER,getdate(),null, NULL) LET numero_msg = 1 CALL msg(numero_msg) COMMIT WORK LET costos.cod_n = NULL LET costos.cod_grupo = NULL LET costos.cod_tipo = NULL LET costos.cod_sec = NULL LET costos.costo_st = NULL NEXT FIELD cod_n END IF END INPUT END FUNCTION FUNCTION irp_show004(p_idx) ## Copia el registro p_idx del arreglo en memoria a la pantalla. DEFINE p_idx SMALLINT LET costos.mes_ini = arr_costos[p_idx].mes_ini LET costos.mes_fin = arr_costos[p_idx].mes_fin LET costos.ano = arr_costos[p_idx].ano LET costos.cod_n = arr_costos[p_idx].cod_n LET costos.cod_grupo = arr_costos[p_idx].cod_grupo LET costos.cod_tipo = arr_costos[p_idx].cod_tipo LET costos.cod_sec = arr_costos[p_idx].cod_sec LET costos.costo_st = arr_costos[p_idx].costo_st LET costos.us_crea = arr_costos[p_idx].us_crea LET costos.fech_crea = arr_costos[p_idx].fech_crea LET costos.us_mod = arr_costos[p_idx].us_mod LET costos.fech_mod = arr_costos[p_idx].fech_mod LET articulos.descrip_esp = arr_costos[p_idx].descrip_esp LET articulos.unidad_med = arr_costos[p_idx].unidad_med SELECT descrip INTO descrip1 FROM mestable WHERE mes = costos.mes_ini and status_t is null DISPLAY BY NAME descrip1 SELECT descrip INTO descrip2 FROM mestable WHERE mes = costos.mes_fin and status_t is null DISPLAY BY NAME descrip2 DISPLAY BY NAME costos.*,articulos.descrip_esp,articulos.unidad_med END FUNCTION FUNCTION irpcmf004() #WHENEVER ERROR CONTINUE ## Aqui se prepara para la captura del criterio de seleccion DEFINE idx, tot SMALLINT CONSTRUCT criterio ON c.mes_ini,c.mes_fin,c.ano, c.cod_n,c.cod_grupo, c.cod_tipo,c.cod_sec,c.costo_st FROM mes_ini,mes_fin,ano, cod_n,cod_grupo, cod_tipo,cod_sec,costo_st IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF LET SELEC = "SELECT UNIQUE c.mes_ini,c.mes_fin,c.ano,d.cod_n,d.cod_grupo, ", " d.cod_tipo,d.cod_sec,c.costo_st,c.us_crea,c.fech_crea, ", " c.us_mod,c.fech_mod,d.descrip_esp,d.unidad_med ", "FROM irtb00013 c, irtb00002 d ", "WHERE c.cod_n=d.cod_n AND c.cod_grupo=d.cod_grupo AND ", " c.cod_tipo = d.cod_tipo AND c.cod_sec = d.cod_sec AND ", " c.status_t is null AND d.status_t IS NULL AND ", criterio clipped," ORDER BY 4,5,6,7" ## Se carga TODO el resultado a memoria de una sola vez y se cierra el cursor. ## Asi la navegacion no depende de un cursor vivo (que SQL Server cierra al ## ejecutar cualquier otra sentencia sobre la conexion). PREPARE busca FROM selec DECLARE datos CURSOR FOR busca CALL arr_costos.clear() LET tot = 1 FOREACH datos INTO arr_costos[tot].* LET tot = tot + 1 END FOREACH LET tot = tot - 1 FREE datos IF tot = 0 THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF LET idx = 1 CALL irp_show004(idx) MENU "OPCIONES" COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" IF idx < tot THEN LET idx = idx + 1 CALL irp_show004(idx) ELSE LET numero_msg = 4 CALL msg(numero_msg) END IF COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" IF idx > 1 THEN LET idx = idx - 1 CALL irp_show004(idx) ELSE LET numero_msg = 5 CALL msg(numero_msg) END IF COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" LET idx = 1 CALL irp_show004(idx) COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" LET idx = tot CALL irp_show004(idx) COMMAND "Escoger" " Actualiza Registro Cancela Operacion" INPUT BY NAME costos.costo_st, costos.us_crea, costos.fech_crea, costos.us_mod, costos.fech_mod WITHOUT DEFAULTS AFTER FIELD costo_st IF costos.costo_st IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD costo_st END IF ## Verifica si el usuario presiono la tecla AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF LET m_articulos.cod_n = costos.cod_n LET m_articulos.cod_grupo = costos.cod_grupo LET m_articulos.cod_tipo = costos.cod_tipo LET m_articulos.cod_sec = costos.cod_sec LET m_articulos.descrip_esp = articulos.descrip_esp LET m_articulos.descrip_ing = costos.costo_st SELECT SUM(cantidad_2) INTO m_articulos.existencia from irtb00006 WHERE cod_n = costos.cod_n and cod_grupo = costos.cod_grupo and cod_tipo = costos.cod_tipo and cod_sec = costos.cod_sec AND status_t IS NULL SELECT exist_min, id_maintainx INTO m_articulos.exist_min, checkapi FROM irtb00002 WHERE cod_n = costos.cod_n and cod_grupo = costos.cod_grupo and cod_tipo = costos.cod_tipo and cod_sec = costos.cod_sec AND status_t IS NULL BEGIN WORK IF checkapi IS NOT NULL THEN CALL ApiMaintainR('PATCH',checkapi, m_articulos.*, usuarios) RETURNING answer IF answer != 1 THEN DISPLAY "AQUI 6" ROLLBACK WORK END IF END IF UPDATE irtb00013 SET costo_st = costos.costo_st, us_mod = USER, fech_mod = getdate() WHERE cod_n = costos.cod_n and cod_grupo = costos.cod_grupo and cod_tipo = costos.cod_tipo and cod_sec = costos.cod_sec ## Refleja el nuevo costo en el arreglo en memoria para que la navegacion ## siga mostrando el valor actualizado. LET arr_costos[idx].costo_st = costos.costo_st LET arr_costos[idx].us_mod = usuarios LET arr_costos[idx].fech_mod = TODAY LET numero_msg = 13 CALL msg(numero_msg) COMMIT WORK EXIT INPUT END INPUT COMMAND KEY ("L") "eLiminar" UPDATE irtb00013 SET status_t = "E" WHERE cod_n = costos.cod_n and cod_grupo = costos.cod_grupo and cod_tipo = costos.cod_tipo and cod_sec = costos.cod_sec LET numero_msg = 39 CALL msg(numero_msg) ## Quita el registro eliminado del arreglo en memoria y reposiciona. CALL arr_costos.deleteElement(idx) LET tot = arr_costos.getLength() IF tot = 0 THEN CLEAR FORM EXIT MENU END IF IF idx > tot THEN LET idx = tot END IF CALL irp_show004(idx) COMMAND "Retornar" "Retorna al menu anterior" CLEAR FORM EXIT MENU END MENU END FUNCTION