Для поиска зависимости форма от обьектов базы данных мне нужно было разобрать файл 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).
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()); }
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/
Добавить комментарий