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

Комментарии (2)


  1. rocket
    28.07.2015 12:28
    +1

    Форм-браузер, это круто!
    А получить удобочитаемый XML из FMB можно было посредством утилиты frmf2xml, лежащей в %DevSuiteHome%\BIN\

    @ECHO OFF
    REM
    REM  DESCRIPTION
    REM    This file is used to call the Forms2XML conversion tool.
    REM    It takes .fmb, .mmb, and .olb files and converts them into XML.
    REM 
    REM  NOTES
    REM    It wraps the class oracle.forms.util.xmltools.Forms2XML and passes
    REM    any parameters given onto the tool.
    REM    You can only use the standard nine parameters, but these can include
    REM    wildcards in the filenames.
    REM
    
    REM Setup the path to include the necessary Forms dlls.
    set PATH=C:\DevSuiteHome_1\bin;%PATH%
    
    REM Run the tool with the required jar files added to the classpath
    C:\DevSuiteHome_1\jdk\bin\java -classpath C:\DevSuiteHome_1\forms\java\frmxmltools.jar;C:\DevSuiteHome_1\forms\java\frmjdapi.jar;C:\DevSuiteHome_1\lib\xmlparserv2.jar;C:\DevSuiteHome_1\lib\xschema.jar oracle.forms.util.xmltools.Forms2XML %*
    


    Правда, она тоже использует frmjdapi.jar, но вдруг кто-то захочет взять уже готовое решение.


  1. jvs Автор
    28.07.2015 13:13

    Я писал, мне было удобно, что это Java.
    Программа вытаскивает из форма весь PL/SQL и сохраняет его в своем репозитории.
    Я так же сохраняю весь PL/SQL хранимый в ДБ(процедуры, пакеты, view...).
    Это позволяет дать общий ответ, где и как используется объект ДБ в коде.
    И если сравнивать, время выполнения, то работа XML несравнимо дольше. это я вижу. Я даже вынужден использовать multi threading и обрабатывать несколько файлов RDF одновременно, а в случае форм, которые я обрабатываю jdapi можно принять 700 форм минут за 40, что приемлимо.