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

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

快速解讀作法

R11.5.x

在 EBS System Administrator responsibility\ Concurrent\ 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、adncnvqprt 等多個命令,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 報表運作架構

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 的轉碼、格式與印表機動作
        
實體印表機

Running Character Mode Oracle Reports Programs

image 16

Printer Types, Print Styles, and Printer Drivers

image 17

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 或 mkquemkquedevchquechquedev 等命令維護,而不是在有列印工作執行時直接修改 /etc/qconfigIBM 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。

發佈留言

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