Pull to refresh

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

Oracle *System Analysis and Design *Designing and refactoring *Data visualization Reverse 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:
Hubs:
Total votes 13: ↑10 and ↓3 +7
Views 6.8K
Comments Comments 2