TIPTOP ERP 如何编程单据别自动编码的应用
注:一下方法 TIPTOP GP 5.25版本上才是这个架构
01、所谓单据别自动编码:指的就是需要根据系统参数设定的自动编码方式来生成单据的流水规则
如采购单号、入库单号、工单号码..........
这里以一个实例代码来说明做【单据别自动编码】在一个程序中哪些地方要修改
ex:AAP应付系统 新 客制表 tc_oaa_file
tc_oaa01:单据别
tc_oaa02:单据日期
......
02、设定基础资料:单据别
TIPTOP ERP # Prog. Version..: '5.25.11-12.12.11(00010)' #
①。先在单据别作业里面先随便新增一个单据别,然后数据后台修改单别的性质为一个现有系统不使用的单据性质
ex:这里在应付单据别apy_file新增 单据性质为66的单据别PP66
②。修改数据库表doc_file单别的性质与上面第①步里面一样
③。aooi800(gee_file)维护新客制表的信息
03、客制编码应用
#_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
注:因为GP5.10下的版本自动编码没有这种灵活的架构,一般根据公司编码规则硬编码
一下提供#GP5.10单据别自动编码应用的demo:
#单据别编码,类似系统标准的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
http://blog.csdn.net/yihuiworld