2012年6月13日 星期三

[自製]TIPTOP 自動編碼

DSC的自動編碼,不符合我要的
於是參考DSC的,寫了一個,比較彈性一點的自動編碼
這完整程度大約50%,尚未考慮同時搶號的問題
暫時先這樣,以後有時間在把它調整

 
  ################################################################################
# 取得自動編碼
# @author  : JeffreyWu
# @date    : 2012-06-11
# @param  : ps_slip   [STRING] 單號
# @param  : ps_date   [DATE]   日期
# @param  : ps_method  [STRING] 編碼方式 [1:依年月、2:依年週、3:依年月日]
# @param  : ps_tab   [STRING] 單據編號是否重複要檢查的table名稱
# @param  : ps_fld   [STRING] 單據編號對應要檢查的key欄位名稱
# @param  : ps_length  [STRING] 流水碼長度
# @return       : li_result  [BOOLEAN] 結果(TRUE/FALSE)
# @return       : ls_no   [STRING] 單據編號
# @description : 
################################################################################
FUNCTION sl_GetAutoNumber(ps_slip,ps_date,ps_method,ps_tab,ps_fld,ps_length)
 DEFINE   ps_slip         STRING
 DEFINE   ps_date         LIKE type_file.dat
 DEFINE   ps_method       STRING
 DEFINE   ps_tab          STRING
    DEFINE   ps_fld          STRING
    DEFINE   ps_length       STRING
    
    DEFINE   lc_max_no       LIKE type_file.chr50
    DEFINE   li_year         LIKE azn_file.azn02         # 年度
    DEFINE   li_month        LIKE azn_file.azn04         # 期別
    DEFINE   li_week         LIKE azn_file.azn05         # 週別
    
    DEFINE   ls_date         STRING
    DEFINE   lc_buf          STRING
    DEFINE   lc_msg          LIKE type_file.chr1000
    
    DEFINE   ls_format       STRING
    DEFINE   li_i            LIKE type_file.num10
    
 DEFINE   ls_no           STRING
 
 DEFINE   l_sql           STRING
 DEFINE   ls_sql          STRING
 
 #抓取執行日的年、月、週別
 #透過ORACLE執行 
 LET ls_sql = "SELECT to_char(to_date('",ps_date,"','yy/MM/dd'),'yyyy'), ",
           "       to_char(to_date('",ps_date,"','yy/MM/dd'),'MM'), ",
           "       to_char(to_date('",ps_date,"','yy/MM/dd'),'ww') ",
              "  FROM dual"
 
 PREPARE get_date_pre FROM ls_sql
    EXECUTE get_date_pre INTO li_year,li_month,li_week
    
 IF STATUS THEN 
  IF g_bgerr THEN
   CALL s_errmsg('','','',"sub-142",0)
  ELSE
    CALL cl_err(ps_slip,"sub-142",0)
  END IF
  RETURN FALSE,ps_slip
 END IF
 
 
 #依照自動編號方式取得最大號LIKE根據
    CASE
     WHEN (ps_method = "1") #依年月
      LET ls_date = li_year USING "&&&&",li_month USING "&&"
          LET ls_date = ls_date.subString(3,6)
          LET lc_buf = ps_slip CLIPPED,"-",ls_date
     WHEN (ps_method = "2") #依年週
      LET ls_date = li_year USING "&&&&",li_week USING "&&"
          LET ls_date = ls_date.subString(3,6)
          LET lc_buf = ps_slip CLIPPED,"-",ls_date
     WHEN (ps_method = "3") #依年月日
      LET ls_date = li_year USING "&&&&",li_month USING "&&", 
                       DAY(ps_date) USING "&&"
          LET ls_date = ls_date.subString(3,8)
          LET lc_buf = ps_slip CLIPPED,"-",ls_date
 END CASE
 
 LET ls_sql = "SELECT MAX(substr(",ps_fld,",",lc_buf.getLength()+1,"))+1",
                 "  FROM ",cl_get_target_table(g_plant,ps_tab),
                 " WHERE ",ps_fld," LIKE '",lc_buf CLIPPED,"%'"
 
 LET ls_sql = cl_replace_sqldb(ls_sql)
    PREPARE auto_no_pre FROM ls_sql
    EXECUTE auto_no_pre INTO lc_max_no
 
 IF STATUS THEN 
  IF g_bgerr THEN
   CALL s_errmsg('','','',"sub-142",0)
  ELSE
    CALL cl_err(ps_slip,"sub-142",0)
  END IF
  RETURN FALSE,ps_slip
 END IF
 
 IF cl_null(lc_max_no) THEN
  LET lc_max_no = "1"
 END IF
 
 LET ls_format = ""
 FOR li_i = 1 TO ps_length
        LET ls_format = ls_format,"&"
    END FOR
 
 LET ls_no = lc_buf,lc_max_no USING ls_format
 
 RETURN TRUE,ls_no
END FUNCTION
 
 
 
 

2012年4月22日 星期日

TipTop 4GL Syntax Code

寫TipTop(4GL)還在使用,VI編輯嗎??? 使用Samba,將Linux的目錄掛載到網路磁碟機上 用Emeditor開啟就可以馬上編輯了 當然Emeditor,對於4GL的語法顯示,是需要自己另外寫 。

以下為Emeditor的語法顯示畫面
 1.
2.
3.

2012年2月10日 星期五

TipTop GP Split 用法

查了一下官網文件
http://www.4js.com/online_documentation/fjs-fgl-manual-html/User/ClassStringTokenizer.html

可透過
base.StringTokenizer




大致運作的Code



01 MAIN
02   DEFINE tok base.StringTokenizer
03   LET tok = base.StringTokenizer.create("C:\\My Documents\\My Pictures","\\")
04   WHILE tok.hasMoreTokens()
05     DISPLAY tok.nextToken()
06   END WHILE
07 END MAIN

嘿嘿,要怎麼存成Array,方法如下

##################################################################################################
# 字串切割成Array
# @author  : JeffreyWu 
# @date    : 2012-02-10
# @param  : p_str   [STRING] 來源字串 Ex:/u1/out/1234.txt
# @param  : p_delimiter  [STRING] 分裂字符 Ex:","
# @param  : p_RemoveEmpty [BOOLEAN] 是否移除空白Array Ex:TRUE Or FALSE
# @return       : p_arr   [DYNAMIC ARRAY OF STRING]
# @description : 字串切割成Array
##################################################################################################
FUNCTION sl_Split(p_str,p_delimiter,p_RemoveEmpty)
 DEFINE p_str         STRING
 DEFINE p_delimiter   STRING
 DEFINE p_tok         base.StringTokenizer
 DEFINE p_arr         DYNAMIC ARRAY OF STRING
 DEFINE p_RemoveEmpty  BOOLEAN
 DEFINE p_tokStr   STRING
 
 LET p_tok = base.StringTokenizer.createExt(p_str,p_delimiter,"",TRUE)
 
 CALL p_arr.clear()
 
 WHILE p_tok.hasMoreTokens()
  LET p_tokStr = NULL
  LET p_tokStr = p_tok.nextToken()
  
  IF p_RemoveEmpty THEN
   IF p_tokStr.getLength() > 0  THEN
    CALL p_arr.appendElement()
    LET p_arr[p_arr.getLength()] = p_tokStr
   END IF
  ELSE
   CALL p_arr.appendElement()
   LET p_arr[p_arr.getLength()] = p_tokStr
  END IF

 END WHILE
 
 RETURN p_arr
END FUNCTION