最新消息:本站持续更新中,请注意添加收藏夹。搜索关键词时,多换一个同义词。比如要搜索界面,可以尝试页面,画面,PER档等词汇。善于搜索,将大大提高你的查找效率。

如何写单据别自动编码应用

开发相关 bron1984 5077浏览

所谓单据别自动编码:指的就是需要根据系统参数设定的自动编码方式来生成单据的流水规则

如采购单号、入库单号、工单号码……….

这里以一个实例代码来说明做【单据别自动编码】在一个程序中哪些地方要修改

ex:AAP应付系统 新 客制表 tc_oaa_file

                                            tc_oaa01:单据别

                                            tc_oaa02:单据日期

                                            ……

注:一下方法 TIPTOP GP 5.25版本上才是这个架构

一、单据别基础资料的设定

TIPTOP ERP # Prog. Version..: ‘5.25.11-12.12.11(00010)’     #

①。先在 单据别作业里面 先随便新增一个单据别,然后数据后台修改单别的性质为一个 现有系统不使用的单据性质

       ex:这里在应付单据别apy_file新增 单据性质为66的单据别PP66

②。修改数据库表doc_file单别的性质与上面第①步里面一样

③。aooi800(gee_file)维护新客制表的信息

 

二、编写4gl代码

#_a()新增函数   
FUNCTION xxx_a()  
   ......  
   #INSERT之前CALL s_auto_assign_no()按编码规则生成单据编号   
   CALL s_auto_assign_no("aap",g_tc_oaa.tc_oaa01,g_tc_oaa.tc_oaa02,"","tc_oaa_file","tc_oaa01","","","")  
        RETURNING li_result,g_tc_oaa.tc_oaa01  
   IF (NOT li_result) THEN  
      CONTINUE WHILE  
   END IF  
   DISPLAY BY NAME g_tc_oaa.tc_oaa01  
   
   INSERT INTO tc_oaa_file VALUES (g_tc_oaa.*)  
   IF SQLCA.sqlcode THEN  
      CALL cl_err3("ins","tc_oaa_file",g_tc_oaa.tc_oaa01,"",SQLCA.sqlcode,"","",1)  
      CONTINUE WHILE  
   END IF  
   ......  
END FUNCTION  
  
#_i(p_cmd)输入单头信息(u/a)----------------------------------------------------   
FUNCTION xxx_i(p_cmd)  
  
   INPUT BY NAME g_tc_oaa.*   
      .....  
      BEFORE INPUT  
          .......  
          CALL cl_set_docno_format("tc_oaa01")  #格式化单据别栏位,中间有个 "-" 符号   
  
      ......      
      AFTER FIELD tc_oaa01        #主键key   
           IF NOT cl_null(g_tc_oaa.tc_oaa01)  
              AND (g_tc_oaa.tc_oaa01 <> g_tc_oaa_t.tc_oaa01 OR cl_null(g_tc_oaa_t.tc_oaa01)) THEN     
              LET g_t1 = s_get_doc_no(g_tc_oaa.tc_oaa01)  #检查单据别是否存在                          
              CALL s_check_no("aap",g_tc_oaa.tc_oaa01,g_tc_oaa_t.tc_oaa01,"66","tc_oaa_file","tc_oaa01","")  
                 RETURNING li_result,g_tc_oaa.tc_oaa01  
              DISPLAY BY NAME g_tc_oaa.tc_oaa01  
              IF (NOT li_result) THEN  
                 NEXT FIELD tc_oaa01  
              END IF  
           END IF   
      ......       
END FUNCTION 

—————-

注:对于 低于 TIPTOP GP 5.20 的版本,自动编码没有doc_file这类系统架构做法

这里给一个自动编码的示例参考:

FUNCTION xxxxa_auto_assign_no()  
   DEFINE li_result     LIKE type_file.num5,  
          l_tc_oaa001   LIKE tc_oaa_file.tc_oaa001  
   DEFINE l_oayslip     LIKE oay_file.oayslip,         
          l_date        LIKE type_file.chr1000,      #日期   
          l_cnt         LIKE type_file.num10,        #資料庫中該單別當前年月是否有產生單據   
          l_max_cn      LIKE type_file.num10,        #資料庫中該單別當前年月最大的流水編號   
          l_max_str     STRING,  
          l_max_cn_chr  LIKE type_file.chr4,  
          indx          LIKE type_file.num5,        
          l_wc          LIKE type_file.chr1000       #查單別QBE   
            
   LET l_oayslip = s_get_doc_no(g_tc_oaa.tc_oaa001)  #單據別   
   LET l_date = g_today  
   LET l_date = l_date[1,2],l_date[4,5]     #依年月編碼   
   LET l_wc=l_oayslip,'-',l_date,'%'  
   LET li_result = 1  
   SELECT COUNT(*) INTO l_cnt  
       FROM tc_oaa_file  
       WHERE tc_oaa001 LIKE l_wc  
   IF SQLCA.sqlcode THEN  
      LET li_result = 0  
      INITIALIZE l_tc_oaa001 TO NULL  
   ELSE  
     CASE  
       WHEN SQLCA.sqlcode=0 AND l_cnt=0       #該單別當前年月未產生任何單據,則流水號碼別從0001開始   
         LET l_tc_oaa001=l_oayslip,'-',l_date,'0001'     
       WHEN SQLCA.sqlcode=0 AND l_cnt>=1      #該單別當月已有單據存在,則流水號碼別自動+1   
         SELECT MAX(substr(tc_oaa001,9,4)) INTO l_max_cn  #这里要注意下,假如单据是设定3码就是9,4码就是10,依此类推   
           FROM tc_oaa_file  
           WHERE tc_oaa001 LIKE l_wc   
         LET l_max_cn = l_max_cn+1  
         LET l_max_str = l_max_cn USING "####"  
         LET l_max_cn_chr = ''  
         FOR indx = 1 TO l_max_str.getLength() STEP + 1  
           IF cl_null(l_max_str.getCharAt(indx)) THEN  
              LET l_max_cn_chr = l_max_cn_chr CLIPPED,"0"  
           ELSE  
              LET l_max_cn_chr = l_max_cn_chr CLIPPED,l_max_str.getCharAt(indx) CLIPPED  
           END IF  
         END FOR  
         LET l_tc_oaa001 = l_oayslip CLIPPED,"-",l_date CLIPPED ,l_max_cn_chr  
       OTHERWISE  
         LET li_result = 0  
         INITIALIZE l_tc_oaa001 TO NULL  
     END CASE  
   END IF  
            
   RETURN li_result,l_tc_oaa001  
END FUNCTION  
#单据别编码,类似系统标准的s_auto_assign_no()函数功能
FUNCTION xxxxa_auto_assign_no()
   DEFINE li_result     LIKE type_file.num5,
          l_tc_oaa001   LIKE tc_oaa_file.tc_oaa001
   DEFINE l_oayslip     LIKE oay_file.oayslip,       
          l_date        LIKE type_file.chr1000,      #日期
          l_cnt         LIKE type_file.num10,        #資料庫中該單別當前年月是否有產生單據
          l_max_cn      LIKE type_file.num10,        #資料庫中該單別當前年月最大的流水編號
          l_max_str     STRING,
          l_max_cn_chr  LIKE type_file.chr4,
          indx          LIKE type_file.num5,      
          l_wc          LIKE type_file.chr1000       #查單別QBE
          
   LET l_oayslip = s_get_doc_no(g_tc_oaa.tc_oaa001)  #單據別
   LET l_date = g_today
   LET l_date = l_date[1,2],l_date[4,5]     #依年月編碼
   LET l_wc=l_oayslip,'-',l_date,'%'
   LET li_result = 1
   SELECT COUNT(*) INTO l_cnt
       FROM tc_oaa_file
       WHERE tc_oaa001 LIKE l_wc
   IF SQLCA.sqlcode THEN
      LET li_result = 0
      INITIALIZE l_tc_oaa001 TO NULL
   ELSE
     CASE
       WHEN SQLCA.sqlcode=0 AND l_cnt=0       #該單別當前年月未產生任何單據,則流水號碼別從0001開始
         LET l_tc_oaa001=l_oayslip,'-',l_date,'0001'   
       WHEN SQLCA.sqlcode=0 AND l_cnt>=1      #該單別當月已有單據存在,則流水號碼別自動+1
         SELECT MAX(substr(tc_oaa001,9,4)) INTO l_max_cn  #这里要注意下,假如单据是设定3码就是9,4码就是10,依此类推
           FROM tc_oaa_file
           WHERE tc_oaa001 LIKE l_wc 
         LET l_max_cn = l_max_cn+1
         LET l_max_str = l_max_cn USING "####"
         LET l_max_cn_chr = ''
         FOR indx = 1 TO l_max_str.getLength() STEP + 1
           IF cl_null(l_max_str.getCharAt(indx)) THEN
              LET l_max_cn_chr = l_max_cn_chr CLIPPED,"0"
           ELSE
              LET l_max_cn_chr = l_max_cn_chr CLIPPED,l_max_str.getCharAt(indx) CLIPPED
           END IF
         END FOR
         LET l_tc_oaa001 = l_oayslip CLIPPED,"-",l_date CLIPPED ,l_max_cn_chr
       OTHERWISE
         LET li_result = 0
         INITIALIZE l_tc_oaa001 TO NULL
     END CASE
   END IF
          
   RETURN li_result,l_tc_oaa001
END FUNCTION

 

转载请注明:赫非域 » 如何写单据别自动编码应用