2012年6月14日 星期四

TIPTOP程式開發--CR樣版語言別異常

TIPTOP ERP在開發CR報表的過程中,除了需要在Crystal Report把樣版設計好之外,也需要在CR報表格式設定作業(p_zaw)裡把樣版的資料設定進去,但有時仍會發現,為什麼明明有設樣版,系統卻一樣跑出錯誤訊息呢?

下面是範例的一種:
執行程式時發現:
但查過p_zaw的設定的確有設定繁體的語言別:

查詢之後發現,問題出在4GL程式裡,在cl_prt_cs3的function裡有玄機,這段程式碼在傳遞第二個參數時給定的是axmr360,但實際上在p_zaw裡設定的是cxmr004,所以當然會造成找不到語言別的問題。
cl_prt_cs3總共有四個參數:

1. 程式代號:對應的是p_zaw的程式代號欄位(zaw01)
2. 樣版代號:對應的是p_zaw的樣板代號欄位(zaw02)
3. 程式產出的報表temp table的資料:如下圖,
    系統會依這串SQL指令到CR的temp DB去取資料傳遞到CR主機中。

4. 傳遞到CR報表的參數
這邊的參數順序就是對應到CR樣板裡的參數欄位,如下圖:
所以你在CR樣板裡看到有p1~p20的參數欄位,就是TIPTOP已經設定好的參數接收欄位。同樣的意思,在CR裡只設了20個參數,所以在4GL裡不能傳遞超過20個參數,否則,從第21個開始,CR是接收不到的。



2012年6月13日 星期三

SQL語法--Unicode長度的取得

現在為了因應全球化的趨勢,越來越多公司採用Unicode的編碼模式做為資料庫的編碼,不只可以補足BIG-5不足,還可以整合與編碼大部份文字系統。

但因Unicode並不如BIG-5的編碼長度是固定的,所以有時需判斷資料可能的長度,才能建置出正確且實用的資料庫欄位長度。特別是在由外部資料導入Unicode資料庫時,若不知道實際資料長度,很可能會導致資料匯入失敗。

所以,這邊介紹在UTF-8的編碼下,下列兩個語法可以取出資料庫欄位的Unicode實際長度,與字數:

1. lengthb=vsize:抓取unicode的實際長度
例:Select lengthb(ima02) from ima_file

   Select
 vsize(ima02) from ima_file

2. 
lengthc=length:抓取有幾個文字數(此處的中文字與英文字母各計一個字)
例:select length(ima02) from ima_file

   Select lengthc(ima02) from ima_file


註:unicode的詳細介紹可參考Wiki網站: 
http://zh.wikipedia.org/wiki/Unicode

2012年6月12日 星期二

TIPTOP系統管理-Createdb建立後須修改的參數資料

在上一篇裡介紹了Createdb的用法,但若是在使用createdb的指令時,選擇2、3、4的選項時,在建置完新資料庫時,請務必至各模組系統參數設定,將營運中心編號調整為新建立的營運中心代碼,避免影響其他營運中心資料的正確。

特別是財務相關模組的參數,會設定拋轉總帳的營運中心,此時若無調整,則會嚴重影響另一個營運中心的帳務處理。

  • 銷售系統參數(一)設定-連線參數(axms010)

  • 銷售參數維護作業(axms100)

  • 應收系統參數維護作業(axrs010)

  • 應付系統參數維護作業(aaps100)

  • 票據系統參數維護作業(anms101)

  • 人事薪資計薪參數設定作業(apys010)

  • 系統參數設定作業-成本會計(asms120)

  • 固定資產管理系統參數設定(afas010)

  • 成會系統參數設定(axcs010)

2012年6月8日 星期五

TIPTOP系統管理--Createdb用法

TIPTOP安裝時,提供了Createdb的Shell給客戶使用,方便客戶在新增DB時,不需要一個一個再建立TIPTOP ERP所內建的Table Schema。

createdb總共有四個參數,可以建立下列四種DB:


當你在主機上輸入createdb時,就可以顯示下列說明文字:

</u1/topprod/tiptop/agl/4gl> createdb
Usage: /u1/topprod/tiptop/ora/bin/createdb dbname [1|2|3|4]
===========For ds schema has not been altered yet==============
Ex1 : /u1/topprod/tiptop/ora/bin/createdb ds1 1 -----> create database only
====================================================
===============For ds schema had been altered================
Ex2 : /u1/topprod/tiptop/ora/bin/createdb ds2 2 -----> create table schema(from ds user)
Ex3 : /u1/topprod/tiptop/ora/bin/createdb ds3 3 -----> create table schema with ds demo data
Ex4 : /u1/topprod/tiptop/ora/bin/createdb ds4 4 -----> create table schema with data(non-ds)
=====================================================

  1. createdb dbname 1
    建立一個空的DB,不含TIPTOP ERP的table Schema
    使用時機:為了要把之前所建立的dmp倒回系統,做系統測試或資料回復。

  2. createdb dbname 2
    以ds資料庫的table schema的架構建立一個資料庫,其中只會包含ds資料庫的table schema,與系統參數設定Table的值,其餘的Demo data都不會倒進來。
    使用時機:建立新的營運中心或是測試資料庫

  3. createdb dbname 3
    建立一個跟ds資料庫一模一樣的資料庫,除了包含TIPTOP ERP的TABLE Schema之外,還包含ds資料庫中的Demo資料。
    換句話說,就是複製一個跟DS一模一樣的資料庫。
    使用時機:一般常見是系統導入前,做測試之用,導入後很少會用到這選項。

  4. createdb dbname 4
    複製一個與現有資料庫一模一樣的資料庫,但不能是DS資料庫。
    使用時機:通常是為了測試系統或資料問題時,才會使用。
    但使用這個選項要特別注意,複製完後,必須進系統把參數裡的營運中心設定調整為新的營運中心代碼才行,否則會造成新DB資料拋到舊DB裡。

※關於哪些參數設定要改,下篇再說明※

SQL語法實例分享--UPDATE進階

ERP在導入的過程中,經常會發生導入資料庫後的資料需要做整批調整,這時候對很多IT人員來說,真是一大工程,資料少的還可以匯出Excel,請User調整後,再重新匯入。

但如果資料筆數過多時,透過Excel處理的效能就顯得差了一點,最有效率的方式,當然是透過SQL指令直接調整。

說真的,我的SQL功力很差,指令都是朋友指導的,提供給大家做參考而已囉!

在固定第九碼之後插入一個0

update pmn_file set pmn01=substr(pmn01,1,9)||'0'||substr(pmn01,10,12) 
 where length(pmn01)=13

在第一碼前塞入一個A
update cpf_file set cpf30='A'|substr(cpf30,1,length(cpf30))


但是敬告各位同業,這雖然很有效率,但指令一下,資料就改了,所以要謹慎小心使用。

2012年6月5日 星期二

TIPTOP程式開發--擷取Construct特定欄位值

我們都知道在TIPTOP中可以有兩種資料輸入控制模式,一種是在查詢狀態下輸入值(CONSTRUCT),另一種是在新增或修改狀態下輸入值(INPUT/INPUT ARRAY)。

以INPUT或INPUT ARRAY的模式下,一個欄位是以一個變數做為儲存的依據,但是CONSTRUCT的模式則不然。

CONSTRUCT最大的優點是在於輸入完畢後,可將所輸入的值,與該欄位組合成為SQL字串,例如下圖中在訂單欄位(oea01)輸入「002-07060003」做為查詢條件,在程式中會存在tm.wc字串中「oea01='002-07060003'」。



但有時候,我們也需要擷取這些在CONSTRUCT模式的欄位裡輸入的值,進行一些判斷處理,這時候照下面紅色標示的語法,就可以順利取得我們想要的值。

方式一:
CONSTRUCT BY NAME tm.wc ON oea01
     ON ACTION locale
         #CALL cl_dynamic_locale()
         LET g_action_choice = "locale"
         EXIT CONSTRUCT

   AFTER FIELD oea01
      LET l_oea01 = GET_FLDBUF(oea01)

      ON IDLE g_idle_seconds
         CALL cl_on_idle()
         CONTINUE CONSTRUCT

           ON ACTION exit
           LET INT_FLAG = 1
           EXIT CONSTRUCT
   END CONSTRUCT

方式二:

CONSTRUCT BY NAME tm.wc ON oea01
     ON ACTION locale
         #CALL cl_dynamic_locale()
         LET g_action_choice = "locale"
         EXIT CONSTRUCT

   AFTER FIELD oea01
      CALL FGL_DIALOG_GETBUFFER() RETURNING l_oea01

      ON IDLE g_idle_seconds
         CALL cl_on_idle()
         CONTINUE CONSTRUCT

           ON ACTION exit
           LET INT_FLAG = 1
           EXIT CONSTRUCT
   END CONSTRUCT