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

от автора

Для поиска зависимости форма от обьектов базы данных мне нужно было разобрать файл 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%\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, но это уже другая история.

ссылка на оригинал статьи http://habrahabr.ru/post/263675/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *