# 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` 作轉換。

## 轉換
### 指令碼 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,但至少不用人工逐項比對差異了!!

### 批次轉檔
#### 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
```