Для поиска зависимости форма от обьектов базы данных мне нужно было разобрать файл 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).
Логика понятна. Мой 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, но это уже другая история.
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, но это уже другая история.
Комментарии (2)
jvs Автор
28.07.2015 13:13Я писал, мне было удобно, что это Java.
Программа вытаскивает из форма весь PL/SQL и сохраняет его в своем репозитории.
Я так же сохраняю весь PL/SQL хранимый в ДБ(процедуры, пакеты, view...).
Это позволяет дать общий ответ, где и как используется объект ДБ в коде.
И если сравнивать, время выполнения, то работа XML несравнимо дольше. это я вижу. Я даже вынужден использовать multi threading и обрабатывать несколько файлов RDF одновременно, а в случае форм, которые я обрабатываю jdapi можно принять 700 форм минут за 40, что приемлимо.
rocket
Форм-браузер, это круто!
А получить удобочитаемый XML из FMB можно было посредством утилиты frmf2xml, лежащей в %DevSuiteHome%\BIN\
Правда, она тоже использует frmjdapi.jar, но вдруг кто-то захочет взять уже готовое решение.