create or replace PROCEDURE PRC_AFW_ADD_FIELDS ( i_operation IN CHAR, i_option IN CHAR, io_id_field IN OUT NUMBER, io_lookup_id IN OUT NUMBER, i_identifier_field IN VARCHAR2 DEFAULT NULL, i_name_field IN VARCHAR2 DEFAULT NULL, -- 1: Short Text i_description_field IN VARCHAR2 DEFAULT NULL, -- 2: Datetime i_field_type IN NUMBER DEFAULT NULL, -- 3: Lookup i_mand_field_user IN NUMBER DEFAULT NULL, -- 4: Long Text i_mand_field_esp IN NUMBER DEFAULT NULL, -- 5: Check i_visible_field_user IN NUMBER DEFAULT NULL, -- 6: Numeric i_visible_field_esp IN NUMBER DEFAULT NULL, i_edit_field_user IN NUMBER DEFAULT NULL, i_edit_field_esp IN NUMBER DEFAULT NULL, i_reg_history IN NUMBER DEFAULT NULL, i_field_order IN NUMBER DEFAULT 0, i_registry_type IN NUMBER DEFAULT NULL, i_id_project IN NUMBER DEFAULT NULL, i_id_field_template IN NUMBER DEFAULT NULL, i_category_field IN NUMBER DEFAULT NULL, i_category_field_2 IN NUMBER DEFAULT NULL, i_category_field_value IN NUMBER DEFAULT NULL, i_category_field_value_2 IN NUMBER DEFAULT NULL, i_id_caso IN NUMBER DEFAULT NULL, i_field_value IN VARCHAR2 DEFAULT NULL, i_int_field_value IN NUMBER DEFAULT NULL, i_date_field_value IN TIMESTAMP DEFAULT NULL, i_lookup_value IN VARCHAR2 DEFAULT NULL, i_lookup_value_new IN VARCHAR2 DEFAULT NULL, i_id_author IN NUMBER DEFAULT NULL, i_lower_bound IN NUMBER DEFAULT 1, i_higher_bound IN NUMBER DEFAULT 10, i_order_clause IN VARCHAR2 DEFAULT NULL, i_where_sentence IN VARCHAR2 DEFAULT NULL, i_user_id IN NUMBER DEFAULT NULL, i_table_id IN NUMBER DEFAULT NULL, i_filter_field IN NUMBER DEFAULT NULL, i_sdk_console IN NUMBER DEFAULT NULL, --Tipo de Consola 1: ASDK 2:USDK i_mask IN VARCHAR2 DEFAULT NULL, i_rel_field_id IN NUMBER DEFAULT NULL, i_trg_lookup_id IN NUMBER DEFAULT NULL, cur_out OUT PK_ASC_OBJECTS.ASC_RETURN_DATA, o_count_fields OUT NUMBER, o_page_size OUT NUMBER, o_err_cod OUT NUMBER, o_err_msg OUT VARCHAR2 ) AS TYPE TYPE_CUR IS REF CURSOR; cur_afw_fields TYPE_CUR; v_id_field NUMBER; v_id_caso NUMBER; v_id_field_data NUMBER; v_id_project_field NUMBER; v_field_value_old VARCHAR2(4000); v_field_value_new VARCHAR2(4000); v_order_field NUMBER; v_id_template_field NUMBER; v_registry_type_field NUMBER; v_registry_type VARCHAR2(255); v_identifier_field VARCHAR2(50); v_lookup_value VARCHAR2(255); v_str_field_value VARCHAR2(4000); v_field_type NUMBER; v_int_field_value NUMBER; v_category_field NUMBER; v_category_value NUMBER; v_service_value NUMBER; v_status_value NUMBER; v_count_exist_field NUMBER; v_count_exist_lookup NUMBER; v_count_edit_field NUMBER; v_filter VARCHAR2(4000); v_field_category VARCHAR2(255); v_field_service VARCHAR2(255); v_field_status VARCHAR2(255); v_field_status_empty VARCHAR2(255); v_fields_tables VARCHAR2(255); v_fields_key VARCHAR2(255); v_case_status NUMBER; v_select_case VARCHAR2(4000); v_select_page VARCHAR2(4000); v_select_fields VARCHAR2(4000); v_exist NUMBER; v_field_rows T_AFW_ADD_FIELDS_ROW; CURSOR cur_afw_add_select IS SELECT CASE APCT_ID WHEN 1 THEN 'ASDK_INCIDENT' WHEN 2 THEN 'ASDK_PROBLEM' WHEN 3 THEN 'ASDK_CHANGE' WHEN 4 THEN 'ASDK_SERVICE_CALL' WHEN 6 THEN 'ASDK_TASK' WHEN 10 THEN 'ASDK_PRECASE' END TABLES_FIELDS, CASE APCT_ID WHEN 1 THEN 'INCI_CATEGORY_ID' WHEN 2 THEN 'PROB_CATEGORY_ID' WHEN 3 THEN 'CHAN_CATEGORY_ID' WHEN 4 THEN 'SERV_CATEGORY_ID' END FIELD_CATEGORY, CASE APCT_ID WHEN 1 THEN 'INCI_SERVICE_ID' WHEN 2 THEN 'PROB_SERVICE_ID' WHEN 3 THEN 'CHAN_SERVICE_ID' WHEN 4 THEN 'SERV_SERVICE_ID' END FIELD_SERVICE, CASE APCT_ID WHEN 1 THEN 'INCI_STATUS_ID' WHEN 2 THEN 'PROB_STATUS_ID' WHEN 3 THEN 'CHAN_STATUS_ID' WHEN 4 THEN 'SERV_STATUS_ID' WHEN 6 THEN 'TASK_STATUS' WHEN 10 THEN 'PREC_STATUS' END FIELD_STATUS, CASE APCT_ID WHEN 1 THEN 'INCI_ID' WHEN 2 THEN 'PROB_ID' WHEN 3 THEN 'CHAN_ID' WHEN 4 THEN 'SERV_ID' WHEN 6 THEN 'ID_TASK' WHEN 10 THEN 'PREC_ID' END FIELD_KEY FROM AFW_APPLICATION_CATEGORY WHERE apct_id = i_registry_type; BEGIN OPEN cur_out FOR SELECT NULL FROM DUAL; --Operaciones de registro IF i_operation = 'I' THEN --Inserta un nuevo campo adicional IF i_option = 'A' THEN BEGIN SELECT NVL(MAX(fl_int_id_field), 0) + 1 INTO v_id_field FROM ( SELECT fl_int_id AS fl_int_id_field FROM AFW_ADDITIONAL_FIELDS UNION ALL SELECT fl_int_id_field FROM AFW_ADD_FIELDS_CONFIG ) TEMP; END; io_id_field := v_id_field; BEGIN SELECT NVL(MAX(fl_int_order), 0) + 1 INTO v_order_field FROM ( SELECT fl_int_order, fl_int_project_id AS fl_int_id_project, CASE fl_str_table WHEN 'ASDK_INCIDENT' THEN 1 WHEN 'ASDK_PROBLEM' THEN 2 WHEN 'ASDK_CHANGE' THEN 3 WHEN 'ASDK_SERVICE_CALL' THEN 4 WHEN 'ASS_ARTICLE' THEN 7 WHEN 'ASDK_SERVICE' THEN 8 WHEN 'ASDK_PRECASE' THEN 10 END fl_int_registry_type FROM AFW_ADDITIONAL_FIELDS UNION ALL SELECT fl_int_order, fl_int_id_project, fl_int_registry_type FROM AFW_ADD_FIELDS_CONFIG ) TEMP WHERE fl_int_id_project = i_id_project AND fl_int_registry_type = i_registry_type; END; BEGIN INSERT INTO AFW_ADD_FIELDS_CONFIG ( fl_int_id_field, fl_str_identifier, fl_str_name, fl_str_description, fl_int_field_type, fl_int_id_project, fl_int_registry_type, fl_int_mandatory_user, fl_int_mandatory_esp, fl_int_visible_user, fl_int_visible_esp, fl_int_editable_user, fl_int_editable_esp, fl_int_reg_history, fl_int_order, fl_int_status_field, fl_str_mask, rel_field_id ) VALUES ( io_id_field, i_identifier_field, i_name_field, NVL(i_description_field, ''), i_field_type, i_id_project, i_registry_type, i_mand_field_user, i_mand_field_esp, i_visible_field_user, i_visible_field_esp, i_edit_field_user, i_edit_field_esp, i_reg_history, v_order_field, 1, i_mask, i_rel_field_id ); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; o_err_msg := SQLERRM; END; END IF; --Inserta el template de un campo adicional IF i_option = 'B' THEN IF((i_category_field > 0) AND(i_category_field_value > 0)) THEN IF((i_category_field_2 > 0) AND(i_category_field_value_2 > 0)) THEN SELECT NVL(MAX(afw_add_fields_template.FL_INT_ORDER), 0) + 1 INTO v_order_field FROM afw_add_fields_template, afw_add_fields_config WHERE afw_add_fields_template.fl_int_category_field = i_category_field AND afw_add_fields_template.fl_int_category_value = i_category_field_value AND afw_add_fields_template.fl_int_category_field_2 = i_category_field_2 AND afw_add_fields_template.fl_int_category_value_2 = i_category_field_value_2 AND afw_add_fields_config.fl_int_registry_type = i_registry_type AND afw_add_fields_config.fl_int_id_project = i_id_project AND afw_add_fields_config.FL_INT_ID_FIELD = afw_add_fields_template.FL_INT_ID_FIELD; ELSE SELECT NVL(MAX(afw_add_fields_template.FL_INT_ORDER), 0) + 1 INTO v_order_field FROM afw_add_fields_template, afw_add_fields_config WHERE afw_add_fields_template.fl_int_category_field = i_category_field AND afw_add_fields_template.fl_int_category_value = i_category_field_value AND afw_add_fields_config.fl_int_registry_type = i_registry_type AND afw_add_fields_config.fl_int_id_project = i_id_project AND afw_add_fields_template.fl_int_category_field_2 IS NULL AND afw_add_fields_template.fl_int_category_value_2 IS NULL AND afw_add_fields_config.FL_INT_ID_FIELD = afw_add_fields_template.FL_INT_ID_FIELD; END IF; END IF; SELECT NVL(MAX(FL_INT_ID_TEMPLATE), 0) + 1 INTO v_id_template_field FROM AFW_ADD_FIELDS_TEMPLATE; BEGIN INSERT INTO AFW_ADD_FIELDS_TEMPLATE ( FL_INT_ID_TEMPLATE, FL_INT_REGISTRY_TYPE, FL_INT_ID_FIELD, FL_INT_CATEGORY_FIELD, FL_INT_CATEGORY_FIELD_2, FL_INT_CATEGORY_VALUE, FL_INT_CATEGORY_VALUE_2, FL_INT_ORDER ) VALUES ( v_id_template_field, i_registry_type, io_id_field, i_category_field, i_category_field_2, i_category_field_value, i_category_field_value_2, v_order_field ); COMMIT; EXCEPTION WHEN OTHERS THEN o_err_msg := SQLERRM; ROLLBACK; END; COMMIT; END IF; --Inserta un valor lookup IF i_option = 'C' THEN --VALIDA QUE EL VALOR NO ESTE AUN CREADO SELECT COUNT(1) INTO v_count_exist_lookup FROM AFW_ADD_FIELDS_CONFIG_LOOKUP WHERE FL_INT_ID_FIELD = io_id_field AND FL_STR_LOOKUP_VALUE = i_lookup_value; IF v_count_exist_lookup = 0 THEN --VALIDA QUE EL CAMPO ADICIONAL SEA VALIDO (EXISTA) SELECT COUNT(1) INTO v_count_exist_field FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_FIELD = io_id_field; IF v_count_exist_field > 0 THEN BEGIN INSERT INTO AFW_ADD_FIELDS_CONFIG_LOOKUP ( fl_int_id_field, fl_str_lookup_value, lookup_id ) VALUES ( io_id_field, i_lookup_value, SEQ_AFW_ADD_FIELDS_LOOKUP.nextval ) RETURNING lookup_id INTO io_lookup_id; COMMIT; EXCEPTION WHEN OTHERS THEN o_err_msg := SQLERRM; ROLLBACK; END; END IF; END IF; END IF; --Inserta el valor asociado a un campo adicional IF i_option = 'D' THEN BEGIN SELECT fl_int_field_type INTO v_field_type FROM AFW_ADD_FIELDS_CONFIG WHERE fl_int_id_field = io_id_field; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; SELECT COUNT (1) INTO v_exist FROM AFW_ADD_FIELDS_CONFIG_LOOKUP WHERE fl_int_id_field = io_id_field AND fl_str_lookup_value = i_field_value; IF NVL(v_field_type, 0) != 3 OR (v_field_type = 3 AND v_exist > 0) THEN BEGIN --ASIGNA EL VALOR DE LOS DATOS TIPO CADENA DE CARACTERES v_str_field_value := i_field_value; v_int_field_value := i_int_field_value; IF((v_field_type = 6 OR v_field_type = 5) AND LENGTH(v_str_field_value) > 0) THEN v_int_field_value := TO_NUMBER(v_str_field_value); v_str_field_value := NULL; END IF; BEGIN INSERT INTO AFW_ADD_FIELDS_DATA ( FL_INT_ID_DATA, FL_INT_ID_CASO, FL_INT_REGISTRY_TYPE, FL_INT_ID_FIELD, FL_STR_FIELD_VALUE, FL_INT_FIELD_VALUE, FL_DATE_FIELD_VALUE ) VALUES ( ADD_FIELDS_DATA.NEXTVAL, i_id_caso, i_registry_type, io_id_field, v_str_field_value, v_int_field_value, i_date_field_value ); COMMIT; EXCEPTION WHEN OTHERS THEN o_err_msg := SQLERRM; ROLLBACK; END; /*======================================================*/ /* LANZA PROCEDIMIENTO PARA REGISTRAR HISTORICO */ /*======================================================*/ BEGIN SELECT FL_STR_IDENTIFIER, FL_INT_ID_FIELD INTO v_identifier_field, v_id_field FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_FIELD = io_id_field AND FL_INT_REG_HISTORY = 1; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; IF(v_id_field = io_id_field) THEN BEGIN v_field_value_new := CASE WHEN LENGTH(v_str_field_value) > 0 THEN v_str_field_value WHEN LENGTH(v_int_field_value) > 0 THEN TO_CHAR(v_int_field_value, '999999999999999999') WHEN LENGTH(i_date_field_value) > 0 THEN TO_CHAR(i_date_field_value, 'DD/MM/YYYY HH12:MI:SS AM') END; EXCEPTION WHEN NO_DATA_FOUND THEN v_field_value_new := ''; END; --REGISTRA UN HISTORICO DEL CAMBIO DEL CAMPO ADICIONAL BEGIN PRC_AFW_ADD_FIELDS_HIST(i_operation => 'I', i_option => 'A', i_id_field => io_id_field, i_id_caso => i_id_caso, i_id_registry_type => i_registry_type, i_id_author => i_id_author, i_field_value_old => 'EMPTY', i_field_value_new => v_field_value_new, o_err_cod => o_err_cod, o_err_msg => o_err_msg); END; END IF; END; END IF; END IF; --Inserta la relaciżn de dos lookup. IF i_option = 'E' THEN INSERT INTO AFW_ADD_LOOKUP_RELATION ( lookup_id, trg_lookup_id ) VALUES ( io_lookup_id, i_trg_lookup_id ); COMMIT; END IF; END IF; --Operaciones de actalizaciżn IF i_operation = 'U' THEN --Actualiza los datos de una campo adicional IF i_option = 'A' THEN --VALIDA QUE EL CAMPO ADICIONAL SEA VALIDO (EXISTA) SELECT COUNT(1) INTO v_count_exist_field FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_FIELD = io_id_field AND FL_INT_ID_PROJECT = i_id_project AND FL_INT_REGISTRY_TYPE = i_registry_type; IF v_count_exist_field > 0 THEN --ACTUALIZA LOS DATOS GENERALES DEL CAMPO UPDATE AFW_ADD_FIELDS_CONFIG SET FL_STR_NAME = NVL(i_name_field, FL_STR_NAME), FL_STR_DESCRIPTION = NVL(i_description_field, FL_STR_DESCRIPTION), FL_INT_MANDATORY_USER = NVL(i_mand_field_user, FL_INT_MANDATORY_USER), FL_INT_MANDATORY_ESP = NVL(i_mand_field_esp, FL_INT_MANDATORY_ESP), FL_INT_VISIBLE_USER = NVL(i_visible_field_user, FL_INT_VISIBLE_USER), FL_INT_VISIBLE_ESP = NVL(i_visible_field_esp, FL_INT_VISIBLE_ESP), FL_INT_EDITABLE_USER = NVL(i_edit_field_user, FL_INT_EDITABLE_USER), FL_INT_EDITABLE_ESP = NVL(i_edit_field_esp, FL_INT_EDITABLE_ESP), FL_INT_REG_HISTORY = NVL(i_reg_history, FL_INT_REG_HISTORY), FL_STR_MASK = NVL(i_mask, FL_STR_MASK) WHERE FL_INT_ID_FIELD = io_id_field; END IF; END IF; /*======================================================*/ /* ACTUALIZA LOS VALORES LOOKUP DE UN CAMPO ADICIONAL */ /*======================================================*/ IF i_option = 'B' THEN SELECT FL_INT_FIELD_TYPE INTO v_field_type FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_FIELD = io_id_field; IF v_field_type = 3 THEN BEGIN UPDATE AFW_ADD_FIELDS_CONFIG_LOOKUP SET FL_STR_LOOKUP_VALUE = i_lookup_value_new WHERE FL_INT_ID_FIELD = io_id_field AND FL_STR_LOOKUP_VALUE = i_lookup_value; END; END IF; END IF; /*======================================================*/ /* ACTUALIZA EL VALOR ASOCIADO A UN CAMPO ADICIONAL */ /*======================================================*/ IF i_option = 'C' THEN /*======================================================*/ /* LANZA PROCEDIMIENTO PARA REGISTRAR HISTORICO */ /*======================================================*/ BEGIN SELECT COUNT(FL_STR_IDENTIFIER) INTO v_count_exist_field FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_FIELD = io_id_field AND FL_INT_REG_HISTORY = 1; --ASIGNA EL VALOR DE LOS DATOS TIPO CADENA DE CARACTERES v_str_field_value := i_field_value; v_int_field_value := i_int_field_value; BEGIN SELECT fl_int_field_type INTO v_field_type FROM AFW_ADD_FIELDS_CONFIG WHERE fl_int_id_field = io_id_field; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; IF((v_field_type = 6 OR v_field_type = 5) AND LENGTH(v_str_field_value) > 0) THEN v_int_field_value := TO_NUMBER(v_str_field_value); v_str_field_value := NULL; END IF; SELECT COUNT (1) INTO v_exist FROM AFW_ADD_FIELDS_CONFIG_LOOKUP WHERE fl_int_id_field = io_id_field AND fl_str_lookup_value = i_field_value; IF NVL(v_field_type, 0) != 3 OR (v_field_type = 3 AND v_exist > 0) THEN BEGIN IF v_count_exist_field > 0 THEN BEGIN SELECT FL_STR_IDENTIFIER, FL_INT_ID_FIELD INTO v_identifier_field, v_id_field FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_FIELD = io_id_field AND FL_INT_REG_HISTORY = 1; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; --ASIGNA EL VALOR DEL DATO RECIBIDO BEGIN v_field_value_new := CASE WHEN LENGTH(v_str_field_value) > 0 THEN v_str_field_value WHEN LENGTH(v_int_field_value) > 0 THEN TO_CHAR(v_int_field_value, '999999999999999999') WHEN LENGTH(i_date_field_value) > 0 THEN TO_CHAR(i_date_field_value, 'DD/MM/YYYY HH12:MI:SS AM') END; EXCEPTION WHEN OTHERS THEN v_field_value_new := ''; END; IF(v_id_field = io_id_field) THEN BEGIN SELECT CASE WHEN LENGTH(FL_STR_FIELD_VALUE) > 0 THEN FL_STR_FIELD_VALUE WHEN LENGTH(FL_INT_FIELD_VALUE) > 0 THEN TO_CHAR(FL_INT_FIELD_VALUE, '999999999999999999') WHEN LENGTH(FL_DATE_FIELD_VALUE) > 0 THEN TO_CHAR(FL_DATE_FIELD_VALUE, 'DD/MM/YYYY HH12:MI:SS AM') ELSE '' END INTO v_field_value_old FROM AFW_ADD_FIELDS_DATA WHERE FL_INT_ID_FIELD = io_id_field AND FL_INT_ID_CASO = i_id_caso; EXCEPTION WHEN NO_DATA_FOUND THEN v_field_value_old := ''; END; IF(NVL(v_field_value_old, 'EMPTY') <> v_field_value_new) THEN --REGISTRA UN HISTORICO DEL CAMBIO DEL CAMPO ADICIONAL BEGIN PRC_AFW_ADD_FIELDS_HIST(i_operation => 'I', i_option => 'A', i_id_field => io_id_field, i_id_caso => i_id_caso, i_id_registry_type => i_registry_type, i_id_author => i_id_author, i_field_value_old => v_field_value_old, i_field_value_new => v_field_value_new, o_err_cod => o_err_cod, o_err_msg => o_err_msg); END; END IF; END IF; END IF; SELECT COUNT(1) INTO v_count_exist_field FROM AFW_ADD_FIELDS_DATA WHERE FL_INT_ID_CASO = i_id_caso AND FL_INT_REGISTRY_TYPE = i_registry_type AND FL_INT_ID_FIELD = io_id_field; IF v_count_exist_field > 0 THEN BEGIN --ACTUALIZA EL VALOR DEL CAMPO ADICIONAL UPDATE AFW_ADD_FIELDS_DATA SET FL_STR_FIELD_VALUE = NVL(v_str_field_value, ''), FL_INT_FIELD_VALUE = NVL(v_int_field_value, NULL), FL_DATE_FIELD_VALUE = NVL(i_date_field_value, NULL) WHERE FL_INT_ID_FIELD = io_id_field AND FL_INT_ID_CASO = i_id_caso AND FL_INT_REGISTRY_TYPE = i_registry_type; END; ELSE BEGIN INSERT INTO AFW_ADD_FIELDS_DATA ( FL_INT_ID_DATA, FL_INT_ID_CASO, FL_INT_REGISTRY_TYPE, FL_INT_ID_FIELD, FL_STR_FIELD_VALUE, FL_INT_FIELD_VALUE, FL_DATE_FIELD_VALUE ) VALUES ( ADD_FIELDS_DATA.NEXTVAL, i_id_caso, i_registry_type, io_id_field, v_str_field_value, v_int_field_value, i_date_field_value ); COMMIT; EXCEPTION WHEN OTHERS THEN o_err_msg := SQLERRM; ROLLBACK; END; END IF; END; END IF; END; END IF; /*================================================*/ /* ACTUALIZA EL TEMPLATE DE UN CAMPO ADICIONAL */ /*================================================*/ IF i_option = 'D' THEN SELECT NVL(MAX(FL_INT_ID_TEMPLATE), 0) + 1 INTO v_id_template_field FROM AFW_ADD_FIELDS_TEMPLATE; IF i_category_field IN(5, 22, 39, 344) THEN BEGIN INSERT INTO AFW_ADD_FIELDS_TEMPLATE ( FL_INT_ID_TEMPLATE, FL_INT_REGISTRY_TYPE, FL_INT_ID_FIELD, FL_INT_CATEGORY_FIELD, FL_INT_CATEGORY_FIELD_2, FL_INT_CATEGORY_VALUE, FL_INT_CATEGORY_VALUE_2 ) VALUES ( v_id_template_field, i_registry_type, io_id_field, i_category_field, i_category_field_2, i_category_field_value, i_category_field_value_2 ); EXCEPTION WHEN OTHERS THEN o_err_msg := SQLERRM; ROLLBACK; END; ELSE BEGIN BEGIN SELECT FL_INT_CATEGORY_VALUE INTO v_category_field FROM AFW_ADD_FIELDS_TEMPLATE WHERE FL_INT_ID_FIELD = io_id_field AND FL_INT_CATEGORY_FIELD = i_category_field; EXCEPTION WHEN NO_DATA_FOUND THEN v_category_field := 0; END; IF v_category_field > 0 THEN BEGIN UPDATE AFW_ADD_FIELDS_TEMPLATE SET FL_INT_CATEGORY_VALUE = i_category_field_value WHERE FL_INT_ID_FIELD = io_id_field AND FL_INT_CATEGORY_FIELD = i_category_field; END; ELSE BEGIN INSERT INTO AFW_ADD_FIELDS_TEMPLATE ( FL_INT_ID_TEMPLATE, FL_INT_REGISTRY_TYPE, FL_INT_ID_FIELD, FL_INT_CATEGORY_FIELD, FL_INT_CATEGORY_FIELD_2, FL_INT_CATEGORY_VALUE, FL_INT_CATEGORY_VALUE_2 ) VALUES ( v_id_template_field, i_registry_type, io_id_field, i_category_field, i_category_field_2, i_category_field_value, i_category_field_value_2 ); END; END IF; END; END IF; END IF; /*================================================*/ /* ACTUALIZA EL ORDEN DE UN CAMPO ADICIONAL */ /*================================================*/ IF i_option = 'E' THEN BEGIN SELECT FL_INT_ID_FIELD INTO v_id_field FROM afw_add_fields_template WHERE FL_INT_ID_FIELD = io_id_field; EXCEPTION WHEN OTHERS THEN v_id_field := 0; END; IF(v_id_field = io_id_field) THEN BEGIN UPDATE AFW_ADD_FIELDS_TEMPLATE SET FL_INT_ORDER = i_field_order WHERE FL_INT_ID_FIELD = io_id_field; END; ELSE BEGIN UPDATE AFW_ADDITIONAL_FIELDS SET FL_INT_ORDER = i_field_order WHERE FL_INT_ID = io_id_field; END; END IF; END IF; /*===================================*/ /* ACTUALIZA LA RELACIżN DE UN CAMPO */ /*===================================*/ IF i_option = 'H' THEN UPDATE AFW_ADD_FIELDS_CONFIG SET rel_field_id = i_rel_field_id WHERE fl_int_id_field = io_id_field; END IF; END IF; --Operaciones de eliminaciżn IF i_operation = 'D' THEN --Elimina un campo adicional IF i_option = 'A' THEN BEGIN --EL PROCESO DE BORRADO DE UN CAMPO ADICIONAL CONSISTE EN CAMBIAR SU ESTADO A INACTIVO, DE TAL FORMA QUE NO SEA VISIBLE PARA EL USUARIO, EN NINGUNA DE LAS CONSOLAS (ASDK - BASDK) --DE ESTA FORMA SE ESPERA PRESERVAR LA INFORMACION ASOCIADA AL CAMPO, PARA EFECTOS DE REPORTERIA O AUDITORIA BEGIN SELECT COUNT(1) INTO v_count_exist_field FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_FIELD = io_id_field; EXCEPTION WHEN OTHERS THEN v_count_exist_field := - 1; END; IF v_count_exist_field > 0 THEN UPDATE AFW_ADD_FIELDS_CONFIG SET FL_INT_STATUS_FIELD = 0 WHERE FL_INT_ID_FIELD = io_id_field; COMMIT; END IF; END; END IF; --Elimina el valor de un campo adicional IF i_option = 'B' THEN BEGIN DELETE FROM AFW_ADD_FIELDS_CONFIG_LOOKUP WHERE lookup_id = io_lookup_id; COMMIT; EXCEPTION WHEN OTHERS THEN o_err_msg := SQLERRM; ROLLBACK; END; END IF; --Elimina el template de un campo adicional IF i_option = 'C' THEN BEGIN v_id_field := io_id_field; DELETE FROM AFW_ADD_FIELDS_TEMPLATE WHERE FL_INT_ID_TEMPLATE = i_id_field_template AND FL_INT_ID_FIELD = v_id_field; COMMIT; --Borra el campo adicional PRC_AFW_ADD_FIELDS(i_operation => 'D', i_option => 'A', io_id_field => v_id_field, io_lookup_id => io_lookup_id, cur_out => cur_out, o_count_fields => o_count_fields, o_page_size => o_page_size, o_err_cod => o_err_cod, o_err_msg => o_err_msg); EXCEPTION WHEN OTHERS THEN o_err_msg := SQLERRM; ROLLBACK; END; END IF; --Elimina relaciżn entre lookups IF i_option = 'D' THEN DELETE FROM AFW_ADD_LOOKUP_RELATION WHERE ( trg_lookup_id = i_trg_lookup_id OR ( i_trg_lookup_id IS NULL AND lookup_id IN ( SELECT lookup_id FROM AFW_ADD_FIELDS_CONFIG_LOOKUP WHERE fl_int_id_field = io_id_field ) ) ) AND ( lookup_id = io_lookup_id OR io_lookup_id IS NULL ); END IF; END IF; --Operaciones de consulta IF i_operation = 'S' THEN --Consulta todos los campos adicionales IF i_option = 'A' THEN v_registry_type := CASE i_registry_type WHEN 1 THEN 'ASDK_INCIDENT' WHEN 2 THEN 'ASDK_PROBLEM' WHEN 3 THEN 'ASDK_CHANGE' WHEN 4 THEN 'ASDK_SERVICE_CALL' WHEN 7 THEN 'ASS_ARTICLE' WHEN 8 THEN 'ASDK_SERVICE' WHEN 10 THEN 'ASDK_PRECASE' END; v_field_status_empty := CASE i_registry_type WHEN 1 THEN 'INCI_STATUS_ID' WHEN 2 THEN 'PROB_STATUS_ID' WHEN 3 THEN 'CHAN_STATUS_ID' WHEN 4 THEN 'SERV_STATUS_ID' WHEN 7 THEN 'FL_INT_SOLUTION_STATE' WHEN 8 THEN 'SERV_STATUS_ID' WHEN 10 THEN 'PREC_STATUS' END; IF i_id_caso = 0 OR i_id_caso = - 1 THEN BEGIN OPEN cur_out FOR SELECT DISTINCT A.STAT_ID INTO v_case_status FROM AFW_STATUS A JOIN AFW_STATUS_TRANSITION B ON A.STAT_ID = B.STTR_CODE_INI JOIN ASDK_STATUS_BEHAVIOR C ON A.STAT_ID = C.STAT_ID WHERE A.STAT_APP_CATEGORY = i_registry_type AND A.STAT_PROJECT = i_id_project AND B.STTR_CODE_INI NOT IN ( SELECT STTR_CODE_FIN FROM AFW_STATUS_TRANSITION WHERE STTR_CATEGORY = i_registry_type ) AND ROWNUM = 1; OPEN cur_out FOR SELECT * FROM ( SELECT DISTINCT A.FL_INT_ID_FIELD, A.FL_STR_IDENTIFIER, A.FL_STR_NAME, A.FL_STR_DESCRIPTION, A.FL_INT_FIELD_TYPE, A.FL_INT_ID_PROJECT, A.FL_INT_REGISTRY_TYPE, A.FL_INT_MANDATORY_USER, A.FL_INT_MANDATORY_ESP, A.FL_INT_VISIBLE_USER, A.FL_INT_VISIBLE_ESP, A.FL_INT_EDITABLE_USER, A.FL_INT_EDITABLE_ESP, A.FL_INT_ORDER, A.FL_INT_CATEGORY_FIELD, A.FL_INT_CATEGORY_VALUE, SENTENCE, A.FL_STR_MASK FROM V_AFW_ADD_FIELDS_CONFIG A WHERE A.FL_INT_ID_PROJECT = i_id_project AND A.FL_INT_REGISTRY_TYPE = i_registry_type AND(SENTENCE = v_field_status_empty || ' = ' || TO_CHAR(v_case_status)) ) TEMP ORDER BY FL_INT_ORDER ASC; END; ELSE OPEN cur_afw_add_select; LOOP FETCH cur_afw_add_select INTO v_fields_tables, v_field_category, v_field_service, v_field_status, v_fields_key; EXIT WHEN cur_afw_add_select%NOTFOUND; IF(i_registry_type = 10) THEN BEGIN v_select_case := 'SELECT 0, 0 , ' || v_field_status || ' FROM ' || v_fields_tables || ' WHERE ' || v_fields_key || ' = ' || TO_CHAR(i_id_caso); END; ELSE BEGIN v_select_case := 'SELECT ' || v_field_category || ' , ' || v_field_service || ' , ' || v_field_status || ' FROM ' || v_fields_tables || ' WHERE ' || v_fields_key || ' = ' || TO_CHAR(i_id_caso); END; END IF; OPEN cur_afw_fields FOR v_select_case; FETCH cur_afw_fields INTO v_category_value, v_service_value, v_status_value; WHILE(cur_afw_fields%FOUND) LOOP OPEN cur_out FOR SELECT * FROM ( SELECT DISTINCT A.FL_INT_ID_FIELD, A.FL_STR_IDENTIFIER, A.FL_STR_NAME, A.FL_INT_FIELD_TYPE, A.FL_INT_ID_PROJECT, A.FL_INT_REGISTRY_TYPE, A.FL_INT_MANDATORY_USER, A.FL_INT_MANDATORY_ESP, A.FL_INT_VISIBLE_USER, A.FL_INT_VISIBLE_ESP, A.FL_INT_EDITABLE_USER, A.FL_INT_EDITABLE_ESP, A.FL_INT_ORDER, B.FL_DATE_FIELD_VALUE, B.FL_STR_FIELD_VALUE, B.FL_INT_FIELD_VALUE, A.FL_INT_CATEGORY_FIELD, A.FL_INT_CATEGORY_VALUE, SENTENCE, A.FL_STR_MASK FROM V_AFW_ADD_FIELDS_CONFIG A LEFT OUTER JOIN AFW_ADD_FIELDS_DATA B ON A.FL_INT_ID_FIELD = B.FL_INT_ID_FIELD AND B.FL_INT_ID_CASO = i_id_caso WHERE A.FL_INT_ID_PROJECT = i_id_project AND A.FL_INT_REGISTRY_TYPE = i_registry_type AND(SENTENCE = v_field_category || ' = ' || TO_CHAR(v_category_value) OR SENTENCE = v_field_service || ' = ' || TO_CHAR(v_service_value) OR SENTENCE = v_field_status || ' = ' || TO_CHAR(v_status_value)) ) TEMP ORDER BY FL_INT_ORDER ASC; FETCH cur_afw_fields INTO v_category_value, v_service_value, v_status_value; END LOOP; CLOSE cur_afw_fields; END LOOP; CLOSE cur_afw_add_select; END IF; END IF; --Consulta el valor asociado a un campo por tipo de registro y proyecto IF i_option = 'B' THEN IF LENGTH(i_id_caso) > 0 AND LENGTH(io_id_field) > 0 THEN OPEN cur_out FOR SELECT fl_int_id_data, fl_int_id_caso, fl_int_registry_type, fl_int_id_field, fl_date_field_value, fl_str_field_value, fl_int_field_value FROM AFW_ADD_FIELDS_DATA WHERE fl_int_id_caso = i_id_caso AND fl_int_id_field = io_id_field AND fl_int_registry_type = i_id_project; END IF; END IF; --Consulta los valores lookup para un campo IF i_option = 'C' THEN OPEN cur_out FOR SELECT a.lookup_id fl_int_id_field, a.fl_str_lookup_value, CASE WHEN aa.trg_lookup_id = i_trg_lookup_id THEN aa.trg_lookup_id ELSE NULL END fl_int_trg_id, CASE WHEN aa.trg_lookup_id = i_trg_lookup_id THEN b.fl_str_lookup_value ELSE NULL END fl_str_trg_value FROM AFW_ADD_FIELDS_CONFIG_LOOKUP a LEFT JOIN AFW_ADD_LOOKUP_RELATION aa ON aa.lookup_id = a.lookup_id AND aa.trg_lookup_id = i_trg_lookup_id LEFT JOIN AFW_ADD_FIELDS_CONFIG_LOOKUP b ON aa.trg_lookup_id = b.lookup_id WHERE a.fl_int_id_field = io_id_field AND ( aa.trg_lookup_id = i_trg_lookup_id OR aa.trg_lookup_id IS NULL OR i_trg_lookup_id IS NULL ) ORDER BY NLSSORT(a.fl_str_lookup_value, 'NLS_SORT=GENERIC_M'); END IF; --Consulta los detalles de un campo adicional IF i_option = 'D' THEN v_filter := NULL; v_select_page := 'SELECT A.FL_INT_ID_FIELD, A.FL_STR_IDENTIFIER, A.FL_STR_NAME, A.FL_STR_DESCRIPTION, A.FL_INT_FIELD_TYPE, A.FL_INT_ID_PROJECT, A.FL_INT_REGISTRY_TYPE, A.FL_INT_ORDER, A.FL_INT_STATUS_FIELD, A.CONFIG_TYPE, A.REL_FIELD_ID FROM V_AFW_ADD_FIELDS_TOTAL A '; IF LENGTH(RTRIM(LTRIM(i_where_sentence))) > 0 THEN BEGIN v_filter := FUN_AAM_SENTENCE_WHERE(i_where_sentence, i_table_id, i_user_id); IF LENGTH(v_filter) > 0 THEN v_filter := v_filter || ' AND '; END IF; END; END IF; v_filter := NVL(v_filter, ' ') || 'FL_INT_ID_PROJECT = ' || TO_CHAR(i_id_project) || ' AND FL_INT_REGISTRY_TYPE = ' || TO_CHAR(i_registry_type) || ' AND FL_INT_STATUS_FIELD = 1'; PRC_AFW_RUN_QUERY(o_page_size => o_page_size, i_lower_bound => i_lower_bound, i_higher_bound => i_higher_bound, i_where_clause => v_filter, i_order_clause => i_order_clause, i_sentence => v_select_page, i_db_object => 'PRC_AFW_ADD_FIELDS', i_operation => 'S', i_option => 'D', cur_out => cur_out); END IF; --Consulta los detalles de un campo adicional IF i_option = 'E' THEN OPEN cur_out FOR SELECT a.fl_int_id_field, a.fl_str_identifier, a.fl_str_name, a.fl_str_description, a.fl_int_field_type, a.fl_int_id_project, a.fl_int_registry_type, a.fl_int_mandatory_user, a.fl_int_mandatory_esp, a.fl_int_visible_user, a.fl_int_visible_esp, a.fl_int_editable_user, a.fl_int_editable_esp, a.fl_int_reg_history, a.fl_int_order, a.fl_str_mask, a.rel_field_id FROM AFW_ADD_FIELDS_CONFIG a JOIN ASDK_PROJECTS e ON a.fl_int_id_project = e.fl_int_id WHERE a.fl_int_id_field = io_id_field; END IF; --Consulta campos ordenados asendentemente IF i_option = 'F' THEN OPEN cur_out FOR SELECT * FROM ( SELECT A.FL_INT_ID_FIELD, B.FL_INT_ORDER, A.FL_INT_REGISTRY_TYPE, A.FL_INT_ID_PROJECT FROM AFW_ADD_FIELDS_CONFIG A, AFW_ADD_FIELDS_TEMPLATE B WHERE B.FL_INT_ID_FIELD = A.FL_INT_ID_FIELD AND B.FL_INT_CATEGORY_FIELD = i_category_field AND B.FL_INT_CATEGORY_VALUE = i_category_field_value UNION ALL SELECT FL_INT_ID, FL_INT_ORDER, CASE FL_STR_TABLE WHEN 'ASDK_INCIDENT' THEN 1 WHEN 'ASDK_PROBLEM' THEN 2 WHEN 'ASDK_CHANGE' THEN 3 WHEN 'ASDK_SERVICE_CALL' THEN 4 WHEN 'ASS_ARTICLE' THEN 7 WHEN 'ASDK_SERVICE' THEN 8 WHEN 'ASDK_PRECASE' THEN 10 END FL_INT_REGISTRY_TYPE, FL_INT_PROJECT_ID AS FL_INT_ID_PROJECT FROM AFW_ADDITIONAL_FIELDS ORDER BY 2 DESC ) TEMP WHERE FL_INT_REGISTRY_TYPE = i_registry_type AND FL_INT_ID_PROJECT = i_id_project AND FL_INT_ORDER < i_field_order AND ROWNUM = 1; -- ORDER BY FL_INT_ORDER DESC; END IF; --Consulta campos ordenados descendentemente IF i_option = 'G' THEN OPEN cur_out FOR SELECT * FROM ( SELECT * FROM ( SELECT A.FL_INT_ID_FIELD, B.FL_INT_ORDER, A.FL_INT_REGISTRY_TYPE, A.FL_INT_ID_PROJECT FROM AFW_ADD_FIELDS_CONFIG A, AFW_ADD_FIELDS_TEMPLATE B WHERE B.FL_INT_ID_FIELD = A.FL_INT_ID_FIELD AND B.FL_INT_CATEGORY_FIELD = i_category_field AND B.FL_INT_CATEGORY_VALUE = i_category_field_value UNION ALL SELECT FL_INT_ID, FL_INT_ORDER, CASE FL_STR_TABLE WHEN 'ASDK_INCIDENT' THEN 1 WHEN 'ASDK_PROBLEM' THEN 2 WHEN 'ASDK_CHANGE' THEN 3 WHEN 'ASDK_SERVICE_CALL' THEN 4 WHEN 'ASS_ARTICLE' THEN 7 WHEN 'ASDK_SERVICE' THEN 8 WHEN 'ASDK_PRECASE' THEN 10 END FL_INT_REGISTRY_TYPE, FL_INT_PROJECT_ID AS FL_INT_ID_PROJECT FROM AFW_ADDITIONAL_FIELDS ) TEMP WHERE FL_INT_REGISTRY_TYPE = i_registry_type AND FL_INT_ID_PROJECT = i_id_project AND FL_INT_ORDER > i_field_order ORDER BY FL_INT_ORDER ASC ) TEMP2 WHERE ROWNUM = 1; END IF; --Consulta el żltimo campo insertado IF i_option = 'H' THEN OPEN cur_out FOR SELECT * FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_PROJECT = i_id_project AND FL_INT_REGISTRY_TYPE = i_registry_type AND ROWNUM = 1 ORDER BY FL_INT_ID_FIELD DESC; END IF; --Consulta template de un campo adicional (categorża-servicio) IF i_option = 'I' THEN OPEN cur_out FOR SELECT A.FL_INT_ID_TEMPLATE, A.FL_INT_REGISTRY_TYPE, A.FL_INT_ID_FIELD, A.FL_INT_CATEGORY_FIELD, A.FL_INT_CATEGORY_VALUE, A.FL_INT_CATEGORY_VALUE_2, B.fl_str_hierarchy AS FL_STR_LOOKUP_VALUE, C.NAME AS FL_STR_FIELD_VALUE FROM AFW_ADD_FIELDS_TEMPLATE A LEFT OUTER JOIN ASDK_CATEGORY B ON A.FL_INT_CATEGORY_VALUE = B.CTG_INDEX LEFT OUTER JOIN ASDK_SERVICE C ON A.FL_INT_CATEGORY_VALUE_2 = C.FL_INT_SERVICE_ID WHERE A.FL_INT_ID_FIELD = io_id_field AND A.FL_INT_CATEGORY_FIELD IN(5, 22, 39, 344); END IF; --Consulta template de un campo adicional (Estado) IF i_option = 'J' THEN OPEN cur_out FOR SELECT A.FL_INT_ID_TEMPLATE, A.FL_INT_REGISTRY_TYPE, A.FL_INT_ID_FIELD, A.FL_INT_CATEGORY_FIELD, B.STAT_ID AS FL_INT_CATEGORY_VALUE FROM AFW_ADD_FIELDS_TEMPLATE A LEFT OUTER JOIN AFW_STATUS B ON A.FL_INT_CATEGORY_VALUE = B.STAT_ID WHERE A.FL_INT_ID_FIELD = io_id_field AND A.FL_INT_CATEGORY_FIELD IN(1, 18, 35, 243, 340, 1756, 1022, 750); END IF; --Consulta template de un campo adicional (Servicio) IF i_option = 'K' THEN OPEN cur_out FOR SELECT A.FL_INT_ID_TEMPLATE, A.FL_INT_REGISTRY_TYPE, A.FL_INT_ID_FIELD, A.FL_INT_CATEGORY_FIELD, B.FL_INT_SERVICE_ID AS FL_INT_CATEGORY_VALUE FROM AFW_ADD_FIELDS_TEMPLATE A LEFT OUTER JOIN ASDK_SERVICE B ON A.FL_INT_CATEGORY_VALUE = B.FL_INT_SERVICE_ID WHERE A.FL_INT_ID_FIELD = io_id_field AND A.FL_INT_CATEGORY_FIELD IN(77, 74, 156, 351); END IF; --Consulta si un campo es editable (Usuario) IF i_option = 'L' THEN SELECT COUNT(1) INTO o_count_fields FROM AFW_ADD_FIELDS_CONFIG WHERE FL_INT_EDITABLE_USER = 1 AND FL_INT_ID_PROJECT = i_id_project AND FL_INT_REGISTRY_TYPE = i_registry_type; END IF; --Consulta campos sin diligenciar (Caso nuevo) IF i_option = 'M' THEN BEGIN BEGIN SELECT DISTINCT A.STAT_ID INTO v_case_status FROM AFW_STATUS A JOIN AFW_STATUS_TRANSITION B ON A.STAT_ID = B.STTR_CODE_INI JOIN ASDK_STATUS_BEHAVIOR C ON A.STAT_ID = C.STAT_ID WHERE A.STAT_APP_CATEGORY = i_registry_type AND A.STAT_PROJECT = i_id_project AND B.STTR_CODE_INI NOT IN ( SELECT STTR_CODE_FIN FROM AFW_STATUS_TRANSITION WHERE STTR_CATEGORY = i_registry_type ) AND ROWNUM = 1; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; OPEN cur_afw_add_select; FETCH cur_afw_add_select INTO v_fields_tables, v_field_category, v_field_service, v_field_status, v_fields_key; WHILE(cur_afw_add_select%FOUND) LOOP BEGIN v_select_fields := 'SELECT * FROM ( SELECT DISTINCT A.FL_INT_ID_FIELD, A.FL_STR_IDENTIFIER, A.FL_STR_NAME, A.FL_STR_DESCRIPTION, A.FL_INT_FIELD_TYPE, A.FL_INT_ID_PROJECT, A.FL_INT_REGISTRY_TYPE, A.FL_INT_MANDATORY_USER, A.FL_INT_MANDATORY_ESP, A.FL_INT_VISIBLE_USER, A.FL_INT_VISIBLE_ESP, A.FL_INT_EDITABLE_USER, A.FL_INT_EDITABLE_ESP, A.FL_INT_ORDER, A.FL_INT_CATEGORY_FIELD, A.FL_INT_CATEGORY_VALUE, SENTENCE, A.FL_STR_MASK, A.REL_FIELD_ID FROM V_AFW_ADD_FIELDS_CONFIG A WHERE A.FL_INT_ID_PROJECT = ' || TO_CHAR(i_id_project) || ' AND A.FL_INT_REGISTRY_TYPE = ' || TO_CHAR(i_registry_type); IF(i_filter_field = 1) THEN IF(i_category_field_value > 0) THEN v_case_status := i_category_field_value; END IF; v_select_fields := v_select_fields || ' AND (SENTENCE = ''' || v_field_status || ' = ' || TO_CHAR(v_case_status) || ''')'; END IF; IF(i_filter_field = 2) THEN v_select_fields := v_select_fields || ' AND (SENTENCE = ''' || v_field_category || ' = ' || TO_CHAR(i_category_field_value) || ''')'; END IF; IF(i_filter_field = 3) THEN v_select_fields := v_select_fields || ' AND (SENTENCE = ''' || v_field_service || ' = ' || TO_CHAR(i_category_field_value_2) || '''' || ' OR (SENTENCE= ''' || v_field_category || ' = ' || TO_CHAR(i_category_field_value) || ' AND ' || v_field_service || ' = ' || TO_CHAR(i_category_field_value_2) || '''))'; END IF; v_select_fields := v_select_fields || ')TEMP WHERE '; IF i_sdk_console = 1 THEN v_select_fields := v_select_fields || ' FL_INT_VISIBLE_ESP = 1'; ELSE v_select_fields := v_select_fields || ' FL_INT_VISIBLE_USER = 1'; END IF; v_select_fields := v_select_fields || ' ORDER BY FL_INT_ORDER ASC '; OPEN cur_out FOR v_select_fields; FETCH cur_afw_add_select INTO v_fields_tables, v_field_category, v_field_service, v_field_status, v_fields_key; END; END LOOP; CLOSE cur_afw_add_select; END; END IF; --Consulta campos adicionales y su valor seleccionado. IF i_option = 'N' THEN SELECT status_id, category_id, service_id INTO v_status_value, v_category_value, v_service_value FROM ( SELECT CASE i_category_field_value WHEN 0 THEN task_status ELSE i_category_field_value END status_id, 0 category_id, 0 service_id FROM ASDK_TASK WHERE id_task = i_id_caso AND i_registry_type =6 UNION ALL SELECT CASE i_category_field_value WHEN 0 THEN stateid ELSE i_category_field_value END, CASE i_category_field_value WHEN 0 THEN categoryid ELSE i_category_field_value END, CASE i_category_field_value_2 WHEN 0 THEN serviceid ELSE i_category_field_value_2 END FROM V_ASDK_CASE_DETAILS WHERE casetype = i_registry_type AND itemid = i_id_caso ) item; SELECT AFW_ADD_FIELDS_ROW ( a.fl_int_id_field, a.fl_str_identifier, a.fl_str_name, a.fl_str_description, a.fl_int_field_type, a.fl_int_id_project, a.fl_int_registry_type, a.fl_int_mandatory_user, a.fl_int_mandatory_esp, a.fl_int_visible_user, a.fl_int_visible_esp, a.fl_int_editable_user, a.fl_int_editable_esp, a.fl_int_category_field, a.fl_int_category_field_2, a.fl_int_category_value, a.fl_str_mask, a.fl_int_order, a.sentence, a.rel_field_id, lvl, b.fl_str_field_value, b.fl_int_field_value, b.fl_date_field_value, c.lookup_id, r.trg_lookup_id ) BULK COLLECT INTO v_field_rows FROM ( SELECT DISTINCT a.fl_int_id_field, a.fl_str_identifier, a.fl_str_name, a.fl_str_description, a.fl_int_field_type, a.fl_int_id_project, a.fl_int_registry_type, a.fl_int_mandatory_user, a.fl_int_mandatory_esp, a.fl_int_visible_user, a.fl_int_visible_esp, a.fl_int_editable_user, a.fl_int_editable_esp, a.fl_int_category_field, a.fl_int_category_field_2, a.fl_int_category_value, a.fl_str_mask, a.fl_int_order, a.sentence, a.rel_field_id, level lvl FROM V_AFW_ADD_FIELDS_CONFIG a LEFT JOIN ASDK_RULES_FIELDS f1 ON f1.field_id = fl_int_category_field LEFT JOIN ASDK_RULES_FIELDS f2 ON f2.field_id = fl_int_category_field_2 WHERE a.fl_int_id_project = i_id_project AND a.fl_int_registry_type = i_registry_type AND ( CASE WHEN i_filter_field = 1 AND sentence = f1.field_name || ' = ' || TO_CHAR(v_status_value) AND f1.field_name LIKE '%STATUS%' THEN 1 WHEN i_filter_field = 2 AND sentence = f1.field_name || ' = ' || TO_CHAR(v_category_value) AND f1.field_name LIKE '%CATEGORY%' THEN 2 WHEN i_filter_field = 3 AND sentence IN ( f1.field_name || ' = ' || TO_CHAR(v_service_value), f1.field_name || ' = ' || TO_CHAR(v_category_value) || ' AND ' || f2.field_name || ' = ' || TO_CHAR(v_service_value) ) AND sentence LIKE '%SERVICE%' THEN 3 END = i_filter_field ) AND ( i_sdk_console = 1 AND fl_int_visible_esp = 1 OR i_sdk_console <> 1 AND fl_int_visible_user = 1 ) START WITH rel_field_id IS NULL CONNECT BY PRIOR fl_int_id_field = rel_field_id ) a LEFT OUTER JOIN AFW_ADD_FIELDS_DATA b ON a.fl_int_id_field = b.fl_int_id_field AND b.fl_int_id_caso = i_id_caso AND b.fl_int_registry_type = i_registry_type LEFT OUTER JOIN AFW_ADD_FIELDS_CONFIG_LOOKUP c ON c.fl_int_id_field = a.fl_int_id_field AND c.fl_str_lookup_value = fl_str_field_value LEFT OUTER JOIN AFW_ADD_LOOKUP_RELATION r ON r.lookup_id = c.lookup_id; OPEN cur_out FOR SELECT DISTINCT h.fl_int_id_field, h.fl_str_identifier, h.fl_str_name, h.fl_str_description, h.fl_int_field_type, h.fl_int_id_project, h.fl_int_registry_type, h.fl_int_mandatory_user, h.fl_int_mandatory_esp, h.fl_int_visible_user, h.fl_int_visible_esp, h.fl_int_editable_user, h.fl_int_editable_esp, h.fl_int_order, h.fl_str_field_value, h.fl_int_field_value, h.fl_date_field_value, h.fl_int_category_field, h.fl_int_category_value, h.sentence, h.fl_str_mask, h.rel_field_id, h.lookup_id FROM TABLE (v_field_rows) p RIGHT JOIN TABLE (v_field_rows) h ON h.trg_lookup_id = p.lookup_id AND h.lvl - 1 = p.lvl WHERE ( H.lvl = 1 AND p.fl_int_id_field IS NULL ) OR ( h.lvl > 1 AND p.fl_int_id_field IS NOT NULL ) OR h.lookup_id IS NULL; END IF; --Bżsqueda de campos adicionales (Configuraciżn) IF i_option = 'O' THEN BEGIN OPEN cur_afw_add_select; LOOP FETCH cur_afw_add_select INTO v_fields_tables, v_field_category, v_field_service, v_field_status, v_fields_key; EXIT WHEN cur_afw_add_select%NOTFOUND; END LOOP; CLOSE cur_afw_add_select; v_field_status_empty := CASE i_registry_type WHEN 1 THEN 'INCI_STATUS_ID' WHEN 2 THEN 'PROB_STATUS_ID' WHEN 3 THEN 'CHAN_STATUS_ID' WHEN 4 THEN 'SERV_STATUS_ID' WHEN 10 THEN 'PREC_STATUS' END; v_select_fields := 'SELECT DISTINCT A.FL_INT_ID_FIELD, A.FL_STR_IDENTIFIER, A.FL_STR_NAME, A.FL_STR_DESCRIPTION, A.FL_INT_FIELD_TYPE, A.FL_INT_ID_PROJECT, A.FL_INT_REGISTRY_TYPE, A.FL_INT_MANDATORY_USER, A.FL_INT_MANDATORY_ESP, A.FL_INT_VISIBLE_USER, A.FL_INT_VISIBLE_ESP, A.FL_INT_EDITABLE_USER, A.FL_INT_EDITABLE_ESP, A.FL_INT_ORDER, A.FL_INT_CATEGORY_FIELD, A.FL_INT_CATEGORY_VALUE, SENTENCE, A.FL_STR_MASK, A.REL_FIELD_ID FROM V_AFW_ADD_FIELDS_CONFIG A'; IF LENGTH(RTRIM(LTRIM(i_where_sentence))) > 0 THEN BEGIN v_filter := FUN_AAM_SENTENCE_WHERE(i_where_sentence, i_table_id, i_user_id); v_filter := v_filter || ' AND ' || 'FL_INT_ID_PROJECT = ' || TO_CHAR(i_id_project) || ' AND FL_INT_REGISTRY_TYPE = ' || TO_CHAR(i_registry_type); END; ELSE BEGIN v_filter := ' FL_INT_ID_PROJECT = ' || TO_CHAR(i_id_project) || ' AND FL_INT_REGISTRY_TYPE = ' || TO_CHAR(i_registry_type); END; END IF; IF(i_filter_field = 1) THEN v_filter := v_filter || ' AND (SENTENCE = ''' || v_field_status || ' = ' || TO_CHAR(i_category_field_value) || ''')'; END IF; IF(i_filter_field = 2) THEN v_filter := v_filter || ' AND (SENTENCE = ''' || v_field_category || ' = ' || TO_CHAR(i_category_field_value) || ''')'; END IF; IF(i_filter_field = 3) THEN v_filter := v_filter || ' AND (SENTENCE LIKE ''' || v_field_service || ' = ' || TO_CHAR(i_category_field_value) || ''')'; END IF; IF(i_filter_field = 4) THEN v_filter := v_filter || ' AND (SENTENCE = ''' || v_field_category || ' = ' || TO_CHAR(i_category_field_value) || ' AND ' || v_field_service || ' = ' || TO_CHAR(i_category_field_value_2) || ''')'; END IF; PRC_AFW_RUN_QUERY(o_page_size => o_page_size, i_lower_bound => i_lower_bound, i_higher_bound => i_higher_bound, i_where_clause => v_filter, i_order_clause => i_order_clause, i_sentence => v_select_fields, i_db_object => 'PRC_AFW_ADD_FIELDS', i_operation => 'S', i_option => 'O', cur_out => cur_out); END; END IF; --Consulta campos adicionales para evitar duplicidad IF i_option = 'P' THEN BEGIN SELECT COUNT(1) INTO o_count_fields FROM AFW_ADD_FIELDS_CONFIG WHERE FL_STR_IDENTIFIER = i_identifier_field AND FL_INT_FIELD_TYPE = i_field_type AND FL_INT_REGISTRY_TYPE = i_registry_type AND FL_INT_ID_PROJECT = i_id_project AND FL_INT_STATUS_FIELD = 1; END; END IF; --Consulta campos tipados sin template IF i_option = 'Q' THEN OPEN cur_out FOR WITH cte_fields ( fl_int_id_field, fl_str_identifier, fl_str_name, fl_str_description, fl_int_field_type, fl_int_id_project, fl_int_registry_type, fl_int_order, fl_int_reg_history, fl_int_editable_esp, fl_int_mandatory_esp, fl_int_visible_esp, fl_int_status_field, fl_str_mask, rel_field_id, lvl ) AS ( SELECT a.fl_int_id_field, a.fl_str_identifier, a.fl_str_name, a.fl_str_description, a.fl_int_field_type, a.fl_int_id_project, a.fl_int_registry_type, a.fl_int_order, a.fl_int_reg_history, a.fl_int_editable_esp, a.fl_int_mandatory_esp, a.fl_int_visible_esp, a.fl_int_status_field, a.fl_str_mask, a.rel_field_id, level FROM AFW_ADD_FIELDS_CONFIG a LEFT JOIN ASDK_PROJECTS b ON a.fl_int_id_project = b.fl_int_id LEFT JOIN AFW_ADD_FIELDS_TEMPLATE d ON a.fl_int_id_field = d.fl_int_id_field WHERE a.fl_int_id_project = i_id_project AND a.fl_int_registry_type = i_registry_type AND a.fl_int_status_field = 1 AND d.fl_int_id_field IS NULL START WITH a.rel_field_id IS NULL CONNECT BY PRIOR a.fl_int_id_field = a.rel_field_id ), cte_field_value AS ( SELECT DISTINCT a.*, b.fl_str_field_value, b.fl_int_field_value, b.fl_date_field_value, c.lookup_id, r.trg_lookup_id FROM cte_fields a LEFT OUTER JOIN AFW_ADD_FIELDS_DATA b ON a.fl_int_id_field = b.fl_int_id_field AND b.fl_int_id_caso = i_id_caso LEFT OUTER JOIN AFW_ADD_FIELDS_CONFIG_LOOKUP c ON c.fl_int_id_field = a.fl_int_id_field AND c.fl_str_lookup_value = fl_str_field_value LEFT OUTER JOIN AFW_ADD_LOOKUP_RELATION r ON r.lookup_id = c.lookup_id ) SELECT DISTINCT h.fl_int_id_field, h.fl_str_identifier, h.fl_str_name, h.fl_str_description, h.fl_int_field_type, h.fl_int_id_project, h.fl_int_registry_type, h.fl_int_order, h.fl_int_reg_history, h.fl_int_editable_esp, h.fl_int_mandatory_esp, h.fl_int_visible_esp, h.fl_int_status_field, h.fl_str_field_value, h.fl_int_field_value, h.fl_date_field_value, h.fl_str_mask, h.rel_field_id, h.lookup_id FROM cte_field_value p RIGHT JOIN cte_field_value h ON h.trg_lookup_id = p.lookup_id AND h.lvl - 1 = p.lvl WHERE ( h.lvl = 1 AND p.fl_int_id_field IS NULL ) OR ( h.lvl > 1 AND p.fl_int_id_field IS NOT NULL ) OR h.lookup_id IS NULL ORDER BY h.fl_int_order; END IF; --Consulta campos adicionales basado en filtro dinżmico IF i_option = 'R' THEN BEGIN --Inicializa parametros SELECT CASE i_registry_type WHEN 1 THEN 'INCI_STATUS_ID' WHEN 2 THEN 'PROB_STATUS_ID' WHEN 3 THEN 'CHAN_STATUS_ID' WHEN 4 THEN 'SERV_STATUS_ID' WHEN 6 THEN 'TASK_STATUS' WHEN 10 THEN 'PREC_STATUS' END, CASE i_registry_type WHEN 1 THEN 'INCI_CATEGORY_ID' WHEN 2 THEN 'PROB_CATEGORY_ID' WHEN 3 THEN 'CHAN_CATEGORY_ID' WHEN 4 THEN 'SERV_CATEGORY_ID' END, CASE i_registry_type WHEN 1 THEN 'INCI_SERVICE_ID' WHEN 2 THEN 'PROB_SERVICE_ID' WHEN 3 THEN 'CHAN_SERVICE_ID' WHEN 4 THEN 'SERV_SERVICE_ID' END INTO v_field_status, v_field_category, v_field_service FROM DUAL; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; v_filter := 'SELECT 0 AS FL_INT_ID_FIELD, '' -- Campos Basicos --'' AS FL_STR_NAME, 0 AS FL_INT_ID_PROJECT, 1 AS FL_INT_VISIBLE_ESP, ''-1'' AS FL_STR_FIELD_VALUE, '' -- Sin mascara --'' AS FL_STR_MASK FROM DUAL UNION ALL ' || 'SELECT FL_INT_ID_FIELD, FL_STR_NAME, FL_INT_ID_PROJECT, FL_INT_VISIBLE_ESP, FL_STR_FIELD_VALUE,FL_STR_MASK FROM ( SELECT B.FL_INT_ID AS FL_INT_ID_FIELD, B.FL_STR_CAPTION AS FL_STR_NAME, B.FL_INT_PROJECT_ID AS FL_INT_ID_PROJECT, B.FL_INT_VISIBLE AS FL_INT_VISIBLE_ESP, B.FL_INT_ID || ''~^'' || B.ADFI_FIELD_ALIAS || ''^~'' || B.FL_INT_TYPE AS FL_STR_FIELD_VALUE, CASE FL_STR_TABLE WHEN ''ASDK_INCIDENT'' THEN 1 WHEN ''ASDK_PROBLEM'' THEN 2 WHEN ''ASDK_CHANGE'' THEN 3 WHEN ''ASDK_SERVICE_CALL'' THEN 4 WHEN ''ASS_ARTICLE'' THEN 7 WHEN ''ASDK_SERVICE'' THEN 8 WHEN ''ASDK_PRECASE'' THEN 10 END AS FL_INT_REGISTRY_TYPE, B.FL_STR_MASK FROM AFW_ADDITIONAL_FIELDS B INNER JOIN ASDK_PROJECTS C ON B.FL_INT_PROJECT_ID = C.FL_INT_ID )TEMP WHERE FL_INT_ID_PROJECT = ' || i_id_project || ' AND FL_INT_REGISTRY_TYPE = ' || i_registry_type || ' AND FL_INT_VISIBLE_ESP = 1'; --Filtro con busqueda avanzada de campos IF(i_category_field_value_2 > 0 OR i_category_field_value > 0 OR i_int_field_value > 0) THEN v_filter := v_filter || ' UNION ALL SELECT 0 AS FL_INT_ID_FIELD, '' -- Campos Avanzados --'' AS FL_STR_NAME, 0 AS FL_INT_ID_PROJECT, 1 AS FL_INT_VISIBLE_ESP, ''-1'' AS FL_STR_FIELD_VALUE, '' -- Sin mascara --'' AS FL_STR_MASK FROM DUAL UNION ALL ' || 'SELECT DISTINCT FL_INT_ID_FIELD, FL_STR_NAME, FL_INT_ID_PROJECT, FL_INT_VISIBLE_ESP, FL_INT_ID_FIELD || ''~'' || '''' || ''~'' || FL_INT_FIELD_TYPE AS FL_STR_FIELD_VALUE, FL_STR_MASK FROM V_AFW_ADD_FIELDS_CONFIG WHERE FL_INT_ID_PROJECT = ' || i_id_project || ' AND FL_INT_REGISTRY_TYPE = ' || i_registry_type || ' AND FL_INT_VISIBLE_ESP = 1 AND ('; IF(i_category_field_value > 0) THEN --Filtro de Categoria v_filter := v_filter || ' (SENTENCE = ''' || v_field_category || ' = ' || i_category_field_value || ''') OR '; END IF; IF(i_category_field_value_2 > 0) THEN --Filtro de Estado v_filter := v_filter || ' (SENTENCE = ''' || v_field_status || ' = ' || i_category_field_value_2 || ''') OR '; END IF; IF(i_int_field_value > 0) THEN --Filtro de Servicio v_filter := v_filter || ' (SENTENCE = ''' || v_field_service || ' = ' || i_int_field_value || ''') OR '; END IF; v_filter := v_filter || ')'; v_filter := REPLACE(v_filter, ' OR )', ')'); END IF; BEGIN OPEN cur_out FOR v_filter; EXCEPTION WHEN OTHERS THEN EXCEPTION_HANDLER(i_error_procedure => 'PRC_AFW_ADD_FIELDS', i_procedure_operation => i_operation, i_procedure_option => i_option, i_error_sentence => v_filter, i_error_context => 'SELECT ADDITIONAL FIELDS', o_return_number => o_err_cod, o_return_message => o_err_msg); END; END IF; END IF; --Consulta campos disponibles para relacionar IF i_option = 'S' THEN SELECT CASE i_registry_type WHEN 1 THEN 'INCI_STATUS_ID' WHEN 2 THEN 'PROB_STATUS_ID' WHEN 3 THEN 'CHAN_STATUS_ID' WHEN 4 THEN 'SERV_STATUS_ID' WHEN 6 THEN 'TASK_STATUS' WHEN 10 THEN 'PREC_STATUS' END, CASE i_registry_type WHEN 1 THEN 'INCI_CATEGORY_ID' WHEN 2 THEN 'PROB_CATEGORY_ID' WHEN 3 THEN 'CHAN_CATEGORY_ID' WHEN 4 THEN 'SERV_CATEGORY_ID' END, CASE i_registry_type WHEN 1 THEN 'INCI_SERVICE_ID' WHEN 2 THEN 'PROB_SERVICE_ID' WHEN 3 THEN 'CHAN_SERVICE_ID' WHEN 4 THEN 'SERV_SERVICE_ID' END INTO v_field_status, v_field_category, v_field_service FROM DUAL; OPEN cur_out FOR SELECT a.fl_int_id_field, a.fl_str_name, a.fl_int_id_project, a.fl_int_visible_esp, TO_CHAR(a.fl_int_id_field) || '~' || '' || '~' || TO_CHAR(a.fl_int_field_type) fl_str_field_value, a.fl_str_mask FROM V_AFW_ADD_FIELDS_CONFIG a JOIN V_AFW_ADD_FIELDS_CONFIG b ON b.fl_int_visible_user = a.fl_int_visible_user AND b.fl_int_visible_esp = a.fl_int_visible_esp AND b.fl_int_editable_user = a.fl_int_editable_user AND b.fl_int_editable_esp = a.fl_int_editable_esp AND b.fl_int_id_field = io_id_field WHERE a.fl_int_field_type = 3 AND a.fl_int_id_field <> io_id_field AND a.fl_int_id_project = i_id_project AND a.fl_int_registry_type = i_registry_type AND a.fl_int_id_field NOT IN ( SELECT rel_field_id FROM AFW_ADD_FIELDS_CONFIG WHERE rel_field_id IS NOT NULL AND fl_int_id_field <> io_id_field ) AND a.sentence = CASE i_filter_field WHEN 1 THEN v_field_status || ' = ' || TO_CHAR(i_category_field_value) WHEN 2 THEN v_field_category || ' = ' || TO_CHAR(i_category_field_value) WHEN 3 THEN v_field_service || ' = ' || TO_CHAR(i_category_field_value) WHEN 4 THEN v_field_category || ' = ' || TO_CHAR(i_category_field_value) || ' AND ' || v_field_service || ' = ' || TO_CHAR(i_category_field_value_2) END; END IF; IF i_option = 'T' THEN OPEN cur_out FOR SELECT a.lookup_id fl_int_id_field, a.fl_str_lookup_value, aa.trg_lookup_id fl_int_trg_id, b.fl_str_lookup_value fl_str_trg_value FROM AFW_ADD_FIELDS_CONFIG_LOOKUP a LEFT JOIN AFW_ADD_LOOKUP_RELATION aa ON aa.lookup_id = a.lookup_id LEFT JOIN AFW_ADD_FIELDS_CONFIG_LOOKUP b ON aa.trg_lookup_id = b.lookup_id WHERE ( aa.trg_lookup_id = i_trg_lookup_id OR i_trg_lookup_id IS NULL ) AND a.fl_int_id_field = io_id_field ORDER BY NLSSORT (a.fl_str_lookup_value, 'NLS_SORT=GENERIC_M'); END IF; COMMIT; END PRC_AFW_ADD_FIELDS;