27 July 2015

Исследование Oracle Form при помощи Java Development API(JDAPI)

OracleSystem Analysis and DesignDesigning and refactoringData visualizationReverse engineering
Для поиска зависимости форма от обьектов базы данных мне нужно было разобрать файл Oracle Form(в дальнейшем — fmb файл).
Fmb — это псевдотекстовый файл, если очень нужно, PL/SQL код можно увидеть и искать как используются обьекты БД там, но все равно трудно понять тип триггера или программы и к какому элементу формы он относится. Можно использовать конвертацию в FMT, но не думаю, что разбор fmt файла легче чем использование API, который дает Оракл.
Тем более, что вся остальная часть моей программы была написана в Java Swing, логичней было использовать JDAPI, который позволяет разобрать форм по полочкам и видеть весь код PL/SQL и properties, которые меня интересовали.

На самом деле, все оказалось делом простым. У вас установлен Oracle Forms, значит все на месте. Архив jar, который необходимо подключить к вашей java аппликации называется frmjdapi.jar, можете поискать его в дереве директорий под ORACLE_HOME, скорей всего он находится %ORACLE_HOME%\jlib\ (Oracle Middleware) или %ORACLE_HOME%\forms\java\ (Forms 10).
Открытие fmb
	JdapiModule module = null;
        File theFile = new File(path);
       module = JdapiModule.openModule(theFile);


Получение списка параметров
for (JdapiIterator params = ((FormModule)module).getModuleParameters(); params.hasNext();){
  ModuleParameter param = (ModuleParameter) params.next();
  System.out.println(param.getName());
         			}


Список блоков
for (JdapiIterator blocks = ((FormModule)module).getBlocks(); blocks.hasNext();){
  Block block = (Block) blocks.next();
  System.out.println(block .getName());
         			}

Block properties
if (!block.getWhereClause().equals(""))
       	System.out.println("Where Clause: "+ block.getWhereClause());
if (!block.getOrderByClause().equals(""))
	System.out.println("Order by Clause: "+ block.getOrderByClause());
if (!block.getParentName().equals(""))
	System.out.println("Reference Object: "+ block.getParentName();
if (block.isInsertAllowed())
	System.out.println("Insert Allowed: Yes");
else
	System.out.println("Insert Allowed: No");
if (block.isDeleteAllowed())
	System.out.println("Delete Allowed: Yes");
else
	System.out.println("Delete Allowed: No");
if (block.isUpdateAllowed())
	System.out.println("Update Allowed: Yes");
else
	System.out.println("Update Allowed: No");


Логика понятна. Мой Eclipse мне просто подсказывал, все что мне было нужно. Так вы можете получить любую информацию о форме.
Для моих целей JDAPI мне очень подошел, по ходу дела был написан форм браузер.
Форм в нем выглядит примерно так.
К сожалению, с Oracle Report так просто не получилось. Но в Oracle, такое впечатление, forms и reports как будто две разные команды писали, которые еще и друг друга не любили.
Почему-то для отчетов Оракл API не дал. Пришлось rdf файл в batch конвертировать в XML командой
rwconverter stype=rdffile source="+f.getAbsoluteFile()+ " dtype=xmlfile dest="+xmlFileName+" batch=yes
а потом парсить этот XML при помощи org.xml.sax, но это уже другая история.
Tags:использование таблиц в pl/sqljdapiоракл формзависимости объектов в форм
Hubs: Oracle System Analysis and Design Designing and refactoring Data visualization Reverse engineering
+7
6.3k 17
Comments 2