Иногда view или таблица вызывается во множестве других view. Если такую модель (или таблицу) необходимо модифицировать, появляется потребность отслеживания зависимостей объектов друг от друга.
Я сделал не большое приложение, которое строит дерево использования объекта с низу в верх.
Принцип реализации
Что бы получить зависимые объекты необходимо вызвать view «SYS».»OBJECT_DEPENDENCIES» со следующими фильтрами.
1 2 3 4 5 |
select BASE_SCHEMA_NAME, BASE_OBJECT_NAME, BASE_OBJECT_TYPE, DEPENDENT_SCHEMA_NAME, DEPENDENT_OBJECT_NAME, DEPENDENT_OBJECT_TYPE from "SYS"."OBJECT_DEPENDENCIES" where BASE_OBJECT_NAME = '< you table / view >' and DEPENDENT_SCHEMA_NAME = '_SYS_BIC' and DEPENDENT_OBJECT_NAME not like '%hier%' |
Данный способ хорошо работает, но он возвращает только зависимые объекты с глубиной 2.
В ABAP этот вызов у меня выглядит так.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
types: begin of res_type_s, base_schema type string, base_object_name type string, base_object_type type string, dependent_schema_name type string, dependent_object_name type string, dependent_object_type type string, lvl type i, end of res_type_s. data: data_tab type ref to data, sql type string, result_tree type table of res_type_s. parameters: object type string default 'table / view' lower case. sql = |select BASE_SCHEMA_NAME, BASE_OBJECT_NAME, BASE_OBJECT_TYPE, DEPENDENT_SCHEMA_NAME, DEPENDENT_OBJECT_NAME, DEPENDENT_OBJECT_TYPE, '1'| && | from "SYS"."OBJECT_DEPENDENCIES" where BASE_OBJECT_NAME = '{ object }' and | && | DEPENDENT_SCHEMA_NAME = '_SYS_BIC' and DEPENDENT_OBJECT_NAME not like '%hier%' and DEPENDENCY_TYPE = '1'|. create data data_tab type table of res_type_s. zcl_sql_executor=>result( exporting i_query = sql changing c_data_table = data_tab ). assign data_tab->* to <tab>. append lines of <tab> to result_tree. |
Единица в селекте означает уровень вложенности. (ZCL_SQL_EXECUTOR)
Что бы получить все дерево использования объекта устраиваем каскадный поиск по принципу ренж таблицы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
data: objects_string type string, iterator type i value 2. loop at result_tree into data(line). if sy-tabix = lines( result_tree ). refresh <tab>. sql = |select BASE_SCHEMA_NAME, BASE_OBJECT_NAME, BASE_OBJECT_TYPE, DEPENDENT_SCHEMA_NAME, DEPENDENT_OBJECT_NAME, DEPENDENT_OBJECT_TYPE, '{ iterator }'| && | from "SYS"."OBJECT_DEPENDENCIES" where ({ objects_string }) and DEPENDENT_SCHEMA_NAME = '_SYS_BIC' and | && | DEPENDENT_OBJECT_NAME not like '%hier%' and DEPENDENCY_TYPE = '1'|. zcl_sql_executor=>result( exporting i_query = sql changing c_data_table = data_tab ). append lines of <tab> to result_tree. clear objects_string. iterator = iterator + 1. else. if strlen( objects_string ) = 0. objects_string = |BASE_OBJECT_NAME = '{ line-dependent_object_name }' |. else. objects_string = |{ objects_string } or BASE_OBJECT_NAME = '{ line-dependent_object_name }' |. endif. endif. endloop. |
Данный вариант реализации работает относительно быстро даже при больших наборах данных.
По итогу каскадного поиска во внутренней таблице result_tree будут данные напоминающие по структуре граф.
Могут быть случаи когда к одному и тому же объекту ведут разные пути. Что бы построить дерево определим однозначные пути в графе. Если такие случаи попадаются, я добавляю к ним символ @ и порядковый номер.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
sort result_tree by base_object_name dependent_object_name. delete adjacent duplicates from result_tree comparing base_object_name dependent_object_name. sort result_tree by dependent_object_name. * избавляемся от циклов data: previos_obj type string, recurrence type i. loop at result_tree assigning field-symbol(<line>). if sy-tabix = 1. previos_obj = <line>-dependent_object_name. continue. endif. if <line>-dependent_object_name = previos_obj. <line>-dependent_object_name = <line>-dependent_object_name && '@' && recurrence. recurrence = recurrence + 1. continue. else. clear recurrence. endif. previos_obj = <line>-dependent_object_name. endloop. |
На этом этапе можно строить дерево.

Исходный код
Полный исходный код можно найти по ссылке.
Для установки приложения необходимо скопировать и вставить код, создать экран 100, добавить статус и активировать.