# Oracle Forms 進行版本比對差異的方法 ###### tags: `Oracle Forms` `Forms2XML Conversion Tool` `frmf2xml` `frmxml2f` ## 參考資料 [Converting an Oracle Forms Application](https://docs.oracle.com/cd/E14373_01/migrate.32/e13368/appmgr_forms.htm) ## Intro Forms2XML Conversion Tool 是在 9i 之後導入的功能,10g亦可使用。 官方已表示 ***有可能*** 適用舊版的檔案轉換,不過若是失敗的話,就必須先進行升級之後再轉XML。 ### 架構 從下圖的架構中得知,Oracle Forms的部份,可以針對 `.fmb` `.olb` `.mmb` 作轉換。 ![](https://hackmd.io/_uploads/BkZGNeIO9.png) ## 轉換 ### 指令碼 CommandLine ```bash= frmf2xml [options] file1 [file2...] ``` #### Options參數介紹 |# |Options |說明 | |--- |--- |--- | |1 |USE_PROPERTY_IDS |**YES** = causes the Forms to XML conversion tool to write the internal ID for Real or Character into the XML file.<BR>**NO** (*default*) generates property value names as before.<BR>Note: The Forms2XML utility must be run with USE_PROPERTY_IDS=NO. | |2 |OVERWRITE |**YES** = 遇到檔名重覆時,以覆寫方式處理。<br>**NO** (*default*) = 遇到檔名重覆時,則程式停止| |3 |DUMP |**ALL** = 轉出所有property<BR>**OVERRIDEN** = 只轉出非預設值的property| > DUMP=ALL,會造成轉出的XML,無法再轉回fmb #### 轉換檔名說明 |#|類型|轉換前檔名|轉換後檔名| |:---:|:---:|:---:|:---:| |1|FormsModule|myForm.fmb |myForm_fmb.xml | |2|ObjectLibrary|myMenu.mmb |myMenu_mmb.xml | |3|MenuModule|myLibrary.olb |myLibrary_olb.xml | ### 程式化 Java 透過 oracle.forms.jdapi.JdapiModule ```java // get the modules in the session JdapiIterator mods = Jdapi.getModules(); // ... and iterate round them while(mods.hasNext()) { JdapiModule mod = (JdapiModule)mods.next(); Forms2XML converter = new Forms2XML( XMLDocument doc = converter.dumpModule(false); ... } ``` ## 實際操作 ### 單一檔案轉檔 ``` C:\test>frmf2xml OVERWRITE=YES test108.fmb Oracle Forms 10.1.2 Forms to XML Tool Copyright(c) 2001, 2005, Oracle. All rights reserved. Processing module test108.fmb WARNING: Item LWTYPE - all ListItemElements must have an Index, Name and Value. WARNING: Item CRITICALTRACE - all ListItemElements must have an Index, Name and Value. WARNING: Item CRITICALTRACE - all ListItemElements must have an Index, Name and Value. WARNING: Item PRINT_WORD_SIDE - all ListItemElements must have an Index, Name and Value. WARNING: Item DRILL_HOLE_SLOT - all ListItemElements must have an Index, Name and Value. WARNING: Item DRILL_HOLE_SLOT - all ListItemElements must have an Index, Name and Value. WARNING: Item OBJ1 - all ListItemElements must have an Index, Name and Value. WARNING: Item OBJ2 - all ListItemElements must have an Index, Name and Value. WARNING: Item OBJ4 - all ListItemElements must have an Index, Name and Value. WARNING: Item PROP - all ListItemElements must have an Index, Name and Value. XML Module saved as test108_fmb.xml ``` > 有出現最後一行 XML Module saved as xxx.xml 即可。 > <font color=red>如果沒有出現,就是轉換失敗。目前研判可能是跟必須與DB連線的關係。(用OracleFormsBuilder打開.fmb前,必須先按「連線」,不然會當掉就那種就不行)</font> ### 差異比對 使用差異比對軟體,將兩個xml進行比對,就可以知道差異。 (請恕我無法真正呈現有不一樣的實際程式碼) 雖然排版可能不太ok,但至少不用人工逐項比對差異了!! ![](https://hackmd.io/_uploads/rJLEM-Iu9.png) ### 批次轉檔 #### FMB轉XML ```bash= #Copy forms file to XML process for %%f IN (*.fmb) do frmf2xml OVERWRITE=YES %%f ``` #### XML轉FMB 轉出的xml,可以再轉回fmb ```bash= ##Copy XML files back into FMB format for %%f IN (*.xml) do frmxml2f OVERWRITE=YES USERID=<usr>/<pass>@<db> %%f ```