Oracle EBS 過 adncnv 轉碼解決印表亂碼

在 IBM AIX + Oracle EBS 的報表通常會透過 adncnv 轉碼傳送至 RPM (Remote Print Manager)的以解決中文亂碼。參考: Oracle EBS Setup Guide

快速解讀作法

R11.5.x

在 EBS System Administrator responsibility\ Install\ Printer\ Driver,將 EBS 在 Printer Drivers 註冊的印表中,將 Arguments 填入下列的參數

Bash
# 這裡 big5lp 執行檔接受5個傳入參數
big5lp -c -d$PROFILES$.PRINTER -n$PROFILES$.CONC_COPIES -t"$PROFILES$.TITLE" $PROFILES$.FILENAME
image 10

Oracle Printer Driver 的 Program method 應指定完整程式路徑;若要使用 shell pipe、adncnv、qprt 等多個命令,wrapper script 是比較穩定且容易記錄錯誤的方式。

若使用 Command method,也可以指定作業系統命令,但必須非常小心 EBS 傳入的檔名、printer name 及 copies 參數,不建議將未驗證參數直接組合成 shell command。

在 OS: AIX 的 AP 層

script location under AP Tier,

Bash
# 切換到 applmgr
[prodmgr@ebsap1 ~]$ su - applmgr

# R11.5 在 $AD_TOP/bin
[prodmgr@ebsap1 ~]$ cd $AD_TOP/bin

#查詢執行檔 big5lp 是否有執行權限, 若沒有則 chmod +x
[prodmgr@ebsap1 bin]$ ls  -l big5lp
-rwxrwxr-x 1 prodmgr dba 566 Dec 13  2007 big5lp

#執行檔 big5lp 的內容, 應該要承接 EBS 傳來的5個參數
[prodmgr@ebsap1 bin]$ cat big5lp
#!/bin/ksh
## AD Character-set Conversion session
adncnv $5 UTF8 $5 ZHT16BIG5
/usr/bin/lp $1 $2 $3 $4 $5

這樣就可以達成中文轉碼解決亂碼的問題

adncnv 語法說明

adncnv 是 Oracle EBS 的 AD File Character Set Converter,用途是將檔案從一個字元集轉成另一個字元集,基本語法為:

Bash
adncnv source_file source_charset destination_file destination_charset

修改 EBS Printer Driver 後重啟 Concurrent Manager

Oracle 文件特別提醒,修改 Printer Type、Print Style 或 Printer Driver 後,應重新啟動目前正在執行的 Concurrent Manager。依現場標準程序執行:

Bash
$ADMIN_SCRIPTS_HOME/adcmctl.sh stop
$ADMIN_SCRIPTS_HOME/adcmctl.sh start

若環境使用 adstrtal.sh / adstpall.sh 或集中式管理程序,應依既有 EBS 服務管理程序執行,不要直接混用多套啟停方式。

RPM (Remote Print Manager)的設定

英文時,Queue Type必須選擇:Pass Data Directly to Printer,這表示RPM接收到Unix的指令以後,原原本本的把資料傳到印表機,不作任何處置。

image 11

選了Pass Data Directly to Printer 以後需要進Queue Setup 裡面將Translate LF to CR/LF勾選,否則unix送出來的列印資料裡面的換行字元會被printer誤認為換頁指令。

image 12

中文報表時必須設定為:Print Text Allow font selection ,Page Setup 因為需要透過 adncnv 轉碼印中文報表,在一般的點陣印表機未必內建中文所以需要RPM負責作中文字形轉譯,調整自行大小,分頁等工作,然後再把處理的結果傳給印表機。

R12.2.x

在 R12.2.x 因為有online patching 的關係, 轉碼執行檔改放在 $FND_TOP/bin 裡。

Bash
# 切換到 applmgr
/>su - applmgr

#
$ cd $FND_TOP/bin
$ ls -l utf8win950
-rwxr-xr-x    1 applmgr  dba              47 Sep 02 14:00 utf8win950

$ cat utf8win950
adncnv $4 UTF8 $4 ZHT16MSWIN950
lp -c $1 $2 $4

在 $FND_TOP/reports 目錄裡,要有 EPSON*.prt & HP*.prt等的 SRW Driver

image 15

Oracle EBS 報表的印表機設定

在設定報表的印表機前,先來解讀一下官方的架構說明,以方便這相關設置的意思。

Running Character Mode Oracle Reports Programs

image 16

Printer Types, Print Styles, and Printer Drivers

image 17

整個設置流程如下

Bash
System Administrator responsibility\ Install\ Printer\ Driver
        │
        │ 1.設定印表機的Driver,這裡的SRW Driver要存在於$FND_TOP/reports 目錄裡
		    │ ,要有相對應的SRW Driver,例如: EPSON*.prt & HP*.prt等
        ▼
Install\ Printer\ Style
        │
        │ 2. 在Printer Style 設定對應的印表機SRW Driver, 對在Layout設定可印幾行/幾列
        ▼
Install\ Printer\ Type
        │
        │ 3. 在 Printer Type 設定可以使用那些 Printer Style
        ▼
Install\ Printer\ Register
        │
        │ 4.註冊印表機, 可以使用那一種 Printer Type
        ▼
Sumbit Request
  ->Options 中,選擇要用那種Printer Style, 及從那一台 Printer 印出

依官方的說明,報表的印表機設置畫面如下圖

OracleEBS PrinterConfig

Oracle EBS 報表運作架構

Oracle EBS Concurrent Manager 完成報表後,會呼叫作業系統的列印命令或自訂列印程式;Printer Driver 可以使用 Command、Program 或 Subroutine 方法。對需要先執行 adncnv 再送入 AIX queue 的情況,建議使用 Program + wrapper script,不要把複雜的 pipe 直接寫在 Printer Driver 的 Command 欄位中。

Bash
Oracle EBS Concurrent Request
        │
        │ 產生報表檔案
        ▼
EBS Printer Driver / Wrapper Script
        │
        │ adncnv:字元集轉換
        ▼
AIX 本機 Print Queue
        │
        │ LPD/LPR,TCP 515
        ▼
RPM Remote Print Manager
        │
        │ RPM Queue 的轉碼、格式與印表機動作
        ▼
實體印表機

Oracle 建議從包含來源檔案的同一個 $APPL_TOP 環境執行 adncnv。

在 OS: AIX 建立 Remote Print Queue

先確認網路與 LPD

Bash
# 在 AIX7.x 或 Linux 上確認名稱解析
$ cat /etc/hosts
192.168.x.x rpm.your_domain.com.tw rpm

#確認 RPM 的 TCP 515 可連線
$ telnet rpm 515
Trying...
Connected to rpm.tekcore.com.tw.
Escape character is '^]'.

用 SMIT 建立 Remote Print Queue

AIX 7.3 建立 print queue的 指令:

Bash
smit mkpq
image 13

或依 SMIT 選單進入:

Bash
SMIT
  → Print Spooling
    → Add a Print Queue

選擇 Remote queue / LPD remote printer,填入

Bash
Queue name                 EBS_RPM_A4
Remote server hostname     rpm.example.com
Remote queue name          EBS_A4

如下圖:

image 14

IBM AIX 的列印系統使用 /etc/qconfig 管理 queue。IBM 建議透過 SMIT 或 mkque、mkquedev、chque、chquedev 等命令維護,而不是在有列印工作執行時直接修改 /etc/qconfig。IBM AIX 7.3 Printing Guide

建立後確認 queue

Bash
# 查看所有的 print queue
/>lsallq
EBS_RPM-A4
EBS_RPM-132

# 查看所有的 print 狀況
/>lpstat -p
Queue   Dev   Status    Job Files              User         PP %   Blks  Cp Rnk
------- ----- --------- --- ------------------ ---------- ---- -- ----- --- ---
EBS-1_ @rpm  READY
EBS_RPM-A4: Queue EBS_RPM-A4: Enabled, Processing, Not Holding
EBS-2_ @rpm  READY
EBS_RPM-132: Queue EBS_RPM-132: Enabled, Processing, Not Holding

# 查看所有的 queue 狀況
/>qchk -A
Queue   Dev   Status    Job Files              User         PP %   Blks  Cp Rnk
------- ----- --------- --- ------------------ ---------- ---- -- ----- --- ---
EBS-1_ @rpm  READY
EBS_RPM-A4: Queue EBS_RPM-A4: Enabled, Processing, Not Holding
EBS-2_ @rpm  READY
EBS_RPM-132: Queue EBS_RPM-132: Enabled, Processing, Not Holding

#查看特定 queue
/>qchk -P EBS_RPM_A4

#查看 queue 設定
/>lsque -q EBS_RPM_A4
/>lsquedev -q EBS_RPM_A4

#查看 /etc/qconfig
/>grep -n '^EBS_RPM_A4:' /etc/qconfig

Queue 啟停與日常維護

啟動 queue、停止接收新工作、查看工作…等指令如下

Bash
#啟動 queue
qadm -U EBS_RPM_A4

#停止接收新工作
qadm -D EBS_RPM_A4

#查看工作
qchk -P EBS_RPM_A4

# 查看所有的 queue 狀況
qchk -A

送出測試檔

Bash
#先建立測試檔:
cat > /tmp/rpm_test.txt <<'EOF'
AIX to RPM test
1234567890
中文測試
EOF

#送出:
qprt -P EBS_RPM_A4 /tmp/rpm_test.txt

#也可使用 AIX LPR:
lpr -P EBS_RPM_A4 /tmp/rpm_test.txt

#若該 remote queue 的 backend 是 AIX rembak,也可以測試:
qprt -P EBS_RPM_A4 -T ascii /tmp/rpm_test.txt

取消工作

Bash
#先查詢 job number:
qchk -P EBS_RPM_A4

#取消
qcan -P EBS_RPM_A4 -J <job_number>

查看 queue daemon

Bash
ps -ef | grep qdaemon
lssrc -s qdaemon

重新啟動 queue daemon

Bash
stopsrc -s qdaemon
startsrc -s qdaemon

通常不應在有大量 active jobs 時任意重啟或修改 queue。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *