TIPTOP Service Gateway ver 2.0
- 简述
- 概念
透过一共同的 Web Services 存取点(URL), 不同服务需求而 ERP 端有撰写对应的 4GL function 来回应. 经过各种功能需求的 4GL function 处理完成后, 再依照各 service function 定义的参数格式回复呼叫端.
考虑外部需求的多样性, service function 有以下定义:
- 每一种外部 request 需求即有一 4GL service function 对应 — 目的为便利处理各种 business logic 需求
- 对方系统呼叫每个 ERP 4GL service 的传入与回传的内容为一 XML 字符串 — 目的为统一交换格式.
- 每一个4GL service function 写法如同一般 ERP 程序, 但有属于 TIPTOP Service Gateway 的写法规定与相关共享函示的呼叫(后述).
- 数据交换规格
- Request XML Format
<Request>
<Access> <!-- 存取訊息 -->
<Authentication user="tiptop" password="tiptop"/>
<Connection application="my_app" source="192.168.1.2"/>
<Organization name="my_organization"/>
<Locale language="zh_tw"/>
<Access>
<RequestContent>
<Parameter> <!-- 參數資料節點(e.x. 自動取號) -->
<Record>
<Field name="condition" value=" ima01 like ‘%’ "/>
<Field name=”my_parameter" value="my_value"/>
<!-- new Field tag -->
</Record>
</Parameter>
<Document> <!-- 單據資料節點(e.x. 建立客戶基本資料) -->
<RecordSet id="1">
<Master name=”my_name”>
<Record>
<Field name="my_column" value="my_value"/>
<!-- new Field tag -->
</Record>
</Master>
<Detail name=”my_name”>
<Record>
<Field name="my_column" value="my_value"/>
<!-- new Field tag -->
</Record>
<!-- new Record tag -->
</Detail>
<-- new Detail tag -->
</RecordSet>
<RecordSet id=”2”>
<-- new Record tag -->
</RecordSet>
<!-- new RecordSet tag -->
</Document>
</RequestContent>
</Request>
Response XML Format
<Response>
<Execution> <!-- 服務執行結果 -->
<Status code="0" sqlcode="0" description=""/>
</Execution>
<ResponseContent>
<Parameter> <!-- 參數資料回傳(e.x. 自動取號結果) -->
<Record>
<Field name="my_parameter" value="my_value"/>
<!-- new Field tag -->
</Record>
</Parameter>
<Document> <!—單據資料回傳(e.x. 採購單) -->
<RecordSet id="1">
<Master name=”my_name”>
<Record>
<Field name="my_column" value="my_value"/>
<!-- new Field tag -->
</Record>
</Master>
<Detail name=”my_name”>
<Record>
<Field name="my_column" value="my_value"/>
<!-- new Field tag -->
</Record>
<!-- new Record tag -->
</Detail>
<-- new Detail tag -->
</RecordSet>
<RecordSet id=”2”>
<-- new Record tag -->
</RecordSet>
<!-- new RecordSet tag -->
</Document>
</ResponseContent>
</Response>
- 全局变量档
开发服务程序时, 需利用 GLOBALS 语法含入 TIPTOP Service Gateway 的全局变量档:$WZZ/4gl/waws_ttsrv2_global.4gl
语法范例:GLOBALS “../4gl/waws_ttsrv2_global.4gl”
- 状态值处理
开发服务程序时, 可利用改变 g_status RECORD 变量内容指定目前处理状态.
变量结构:
#--------------------------------------------------------------------------#
# 執行狀態 #
#--------------------------------------------------------------------------#
DEFINE g_status RECORD
code STRING, #訊息代碼 ; 非 0 值為有錯誤
sqlcode STRING, #SQL ERROR CODE
description STRING #訊息說明
END RECORD
语法范例:LET g_status.code = “axm-001”
- 共享函式说明
开发服务程序过程中可利用的共享函式.
函式名称 | aws_ttsrv_preprocess |
函式说明 | 服务前置处理程序 ; 每个服务程序均必须呼叫 |
传入参数 | None |
回传值 | None |
用法范例 | CALL aws_ttsrv_preprocss() |
函式名称 | aws_ttsrv_postprocess |
函式说明 | 服务后置处理程序 ; 每个服务程序均必须呼叫 |
传入参数 | None |
回传值 | None |
用法范例 | CALL aws_ttsrv_postprocss() |
函式名称 | aws_ttsrv_addMasterRecord |
函式说明 | 新增一笔单文件资料至回传的 XML |
传入参数 | om.DomNode 此笔单头 Record XML Node
STRING 此笔单头名称(e.x. Table Name) |
回传值 | om.DomNode |
用法范例 | DEFINE l_ima RECORD LIKE ima_file.*
DEFINE l_node om.DomNode LET l_node = aws_ttsrv_addMasterRecord(base.Typeinfo.create(l_ima), “ima_file”) |
函式名称 | aws_ttsrv_addDetailRecord |
函式说明 | 新增单身资料至回传的 XML |
传入参数 | om.DomNode 要加入单身的单头 XML Node
om.DomNode 单身 Record XML Node STRING 单身名称(e.x. Table Name) |
回传值 | None |
用法范例 | DEFINE l_node om.DomNode
DEFINE l_bma RECORD LIKE bma_file.* DEFINE l_bmb DYNAMIC ARRAY OF RECORD LIKE bmb_file.* LET l_node = aws_ttsrv_addMasterRecord(base.Typeinfo.create(l_bma), “ima_file”) CALL aws_ttsrv_addDetailRecord(l_node, base.Typeinfo.create(l_ima), “bmb_file”) |
函式名称 | aws_ttsrv_addParameterRecord |
函式说明 | 新增参数资料至回传的 XML |
传入参数 | om.DomNode 参数 Record XML Node |
回传值 | None |
用法范例 | DEFINE l_return RECORD
slip LIKE STRING END RECORD CALL aws_ttsrv_addParameterRecord(base.Typeinfo.create(l_return) ) |
函式名称 | aws_ttsrv_getParameter |
函式说明 | 取得传入 XML 的参数资料 |
传入参数 | STRING 参数名称 |
回传值 | STRING 参数值 |
用法范例 | DEFINE l_slip STRING
LET l_slip = aws_ttsrv_getParameter(“slip”) |
函式名称 | aws_ttsrv_getMasterRecordLength |
函式说明 | 取得传入 XML 中的单档笔数 |
传入参数 | STRING 单档名称 |
回传值 | INTEGER 单档笔数 |
用法范例 | DEFINE l_cnt LIKE type_file.num10
LET l_cnt = aws_ttsrv_getMasterRecordLength(“occ_file”) |
函式名称 | aws_ttsrv_getDetailRecordLength |
函式说明 | 取得传入 XML 中的单身笔数 |
传入参数 | om.DomNode 目前的单头 XML Node
STRING 单身名称 |
回传值 | INTEGER 单身笔数 |
用法范例 | DEFINE l_node om.DomNode
DEFINE l_cnt LIKE type_file.num10 LET l_node = aws_ttsrv_getMasterRecord(1, “oqt_file”) LET l_cnt = aws_ttsrv_getDetailRecordLength(l_node, “oqu_file”) |
函式名称 | aws_ttsrv_getMasterRecord |
函式说明 | 取得传入 XML 中指定笔数的单档 Record XML Node |
传入参数 | INTEGER 指定的单档笔数
STRING 单档名称 |
回传值 | om.DomNode 单档 Record XML Node |
用法范例 | DEFINE l_node om.DomNode
DEFINE l_cnt LIKE type_file.num10 DEFINE l_i LIKE type_file.num10 LET l_cnt = aws_ttsrv_getMasterRecordLength(“occ_file”) FOR l_i = 1 TO l_cnt LET l_node = aws_ttsrv_getMasterRecord(l_i, “occ_file”) END FOR |
函式名称 | aws_ttsrv_getDetailRecord |
函式说明 | 取得传入 XML 中指定笔数的单身 Record XML Node |
传入参数 | om.DomNode 目前单头 XML Node
INTEGER 指定的单身笔数 STRING 单身名称 |
回传值 | om.DomNode 单身 Record XML Node |
用法范例 | DEFINE l_node1 om.DomNode
DEFINE l_node2 om.DomNode DEFINE l_cnt LIKE type_file.num10 DEFINE l_i LIKE type_file.num10 LET l_node1 = aws_ttsrv_getMasterRecord(1, “oqt_file”) LET l_cnt = aws_ttsrv_getDetailRecordLength(l_node, “oqu_file”) FOR l_i = 1 TO l_cnt LET l_node2 = aws_ttsrv_getDetailRecord(l_node1, l_i, “oqu_file”) END FOR |
函式名称 | aws_ttsrv_getRecordField |
函式说明 | 取得传入 XML 中单头/单身 Record 中的域值 |
传入参数 | om.DomNode 目前单头/单身 XML Node
STRING 域名 |
回传值 | STRING 域值 |
用法范例 | DEFINE l_node om.DomNode
DEFINE l_occ01 LIKE occ_file.occ01 LET l_node = aws_ttsrv_getMasterRecord(1, “occ_file”) LET l_occ01 = aws_ttsrv_getRecordField(l_node, “occ01”) |
函式名称 | aws_ttsrv_setRecordField |
函式说明 | 设定传入 XML 中单头/单身 Record 中的域值 |
传入参数 | om.DomNode 目前单头/单身 XML Node
STRING 域名 STRING 域值 |
回传值 | None |
用法范例 | DEFINE l_node om.DomNode
DEFINE l_oqt01 LIKE oqt_file.oqt01 LET l_node = aws_ttsrv_getMasterRecord(1, “oqt_file”) CALL aws_ttsrv_setRecordField(l_node, “oqt01”, l_oqt01) |
函式名称 | aws_ttsrv_getRecordSql |
函式说明 | 取得目前单头/单身 Record 的 INSERT / UPDATE 的 SQL 语句 |
传入参数 | om.DomNode 目前单头/单身 XML Node
STRING Table Name STRING SQL 型态 ; “I” : 表示 INSERT, “U” : 表示 UPDATE STRING SQL 条件 ; 主要可用于取得 UPDATE 语句时给于 SQL Where Condition(e.x. “ occ01 = ‘00001’ ”) |
回传值 | STRING SQL 语句字符串 |
用法范例 | DEFINE l_node om.DomNode
DEFINE l_occ01 LIKE occ_file.occ01 DEFINE l_sql STRING DEFINE l_wc STRING DEFINE l_cnt LIKE type_file.num10 LET l_node = aws_ttsrv_getMasterRecord(1, “occ_file”) LET l_occ01 = aws_ttsrv_getRecordField(l_node, “occ01”) SELECT COUNT(*) INTO l_cnt FROM occ_file WHERE occ01 = l_occ01 IF l_cnt = 0 THEN LET l_sql = aws_ttsrv_getRecordSql(l_node, “occ_file”, “I”, NULL) ELSE LET l_wc = “ occ01 = ‘”, l_occ01 CLIPPED, “’ “ LET l_sql = aws_ttsrv_getRecordSql(l_node, “occ_file, “U”, l_wc) END IF |
- 程序开发说明
- 发布新的服务函式
$WZZ/4gl/waws_ttsrv2.4gl 中的
FUNCTION aws_ttsrv_createService() 加入新增的服务函式:
FUNCTION aws_ttsrv_createService()
……
#--------------------------------------------------------------------------------------------#
# 請新增每一個 ERP 服務時, 於以下加入發佈 Service Function 段落 #
# LET l_op = com.WebOperation.CreateDOCStyle("function_name",p_op_name, g_request, g_response) #
# CALL g_serv.publishOperation(l_op, NULL) #
#--------------------------------------------------------------------------------------------#
#--------------------------------------------------------------------------#
# Publish ERP Service function - aws_getSSOKey() #函数名称 #
#--------------------------------------------------------------------------#
LET l_op = com.WebOperation.CreateDOCStyle("aws_getSSOkey","GetSSOKey", g_request, g_response)
CALL g_serv.publishOperation(l_op, NULL)
END FUNCTION
- 定义新的服务函式
$WZZ/4gl/waws_ttsrv2_service.4gl 中加入新增的 ERP 服务段落:
函式名稱
FUNCTION aws_getSSOKey() #服務名稱
LET g_service = “GetSSOKey”
CALL aws_get_sso_key() #真正執行的函式名稱(e.x. 程式本体定义于 waws_get_sso_key.4gl 檔案中)
END FUNCTION
PS1. 若此服务为B2B产品独有(不存在TIPTOP服务中),
建议函式名称皆以waws_开头命名。
例如:
FUNCTION waws_getAgencyData()
LET g_service = “GetAgencyData”
CALL waws_get_agency_data() #程式本體定義於 waws_get_agency_data.4gl 檔案中
END FUNCTION
PS2. 若此ERP服务不需指定营运中心,可以 LET g_non_plant = ‘Y’.
例如: 取得 ERP 营运中心代码服务
#取得 ERP 營運中心代碼服務
FUNCTION aws_getOrganizationList()
LET g_service = “GetOrganizationList”
LET g_non_plant = “Y” #不指定營運中心
CALL aws_get_organization_list()
END FUNCTION
- 实际撰写处理服务的程序本体
$WZZ/4gl 目录下新增并撰写服务程序(e.x. waws_get_sso_key.4gl)
可能存在五种型态的服务需求:
■ 读取 ERP 单档
■ 读取 ERP 双档
■ 写入 ERP 单档
■ 写入 ERP 双档
■ 非单据的参数传入与回传
- 程序撰写后透过 p_weblink 将完成的 4GL module 挂到 waws_ttsrv2 中
- 测试此服务
- 程序开发范例
读取 ERP 单文件, 以下范例为读取 ERP 料件基本数据服务:
# Prog. Version..: '5.00.04-07.12.14(00000)' #
#{
# Program name...: aws_get_item_data.4gl
# Descriptions...: 提供取得 ERP 料件資料服務
# Date & Author..: 2007/02/14 by Echo
# Memo...........:
# Modify.........: 新建立 FUN-720021
#
#}
DATABASE ds
#FUN-720021
GLOBALS "../../wconfig/top.global"
GLOBALS "../4gl/waws_ttsrv2_global.4gl" #TIPTOP Service Gateway 使用的全域變數檔
#[
# Description....: 提供取得 ERP 料件資料服務(入口 function)
# Date & Author..: 2007/02/12 by Echo
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_get_item_data()
WHENEVER ERROR CONTINUE
CALL aws_ttsrv_preprocess() #呼叫服務前置處理程序
#--------------------------------------------------------------------------#
# 查詢 ERP 料件編號資料 #
#--------------------------------------------------------------------------#
IF g_status.code = "0" THEN
CALL aws_get_item_data_process()
END IF
CALL aws_ttsrv_postprocess() #呼叫服務後置處理程序
END FUNCTION
#[
# Description....: 查詢 ERP 料件編號資料
# Date & Author..: 2007/02/06 by Echo
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_get_item_data_process()
DEFINE l_ima RECORD LIKE ima_file.*
DEFINE l_wc STRING
DEFINE l_sql STRING
DEFINE l_node om.DomNode
LET l_wc = aws_ttsrv_getParameter("condition") #取由呼叫端呼叫時給予的 SQL Condition
LET l_sql = "SELECT * FROM ima_file WHERE ",
l_wc,
" AND imaacti = 'Y' ORDER BY ima01"
DECLARE ima_curs CURSOR FROM l_sql
IF SQLCA.SQLCODE THEN
LET g_status.code = SQLCA.SQLCODE
LET g_status.sqlcode = SQLCA.SQLCODE
RETURN
END IF
FOREACH ima_curs INTO l_ima.*
LET l_node = aws_ttsrv_addMasterRecord(base.TypeInfo.create(l_ima), "ima_file") #加入此筆單檔資料至 Response 中
END FOREACH
IF SQLCA.SQLCODE THEN
LET g_status.code = SQLCA.SQLCODE
LET g_status.sqlcode = SQLCA.SQLCODE
RETURN
END IF
END FUNCTION
读取 ERP 双文件, 以下范例为读取 ERP BOM 基本数据服务:
# Prog. Version..: '5.00.04-07.12.14(00000)' #
#{
# Program name...: aws_get_bom_data.4gl
# Descriptions...: 提供取得 ERP BOM 資料服務
# Date & Author..: 2007/03/26 by Joe
# Memo...........:
# Modify.........: 新建立 #FUN-720021
#
#}
DATABASE ds
GLOBALS "../../config/top.global"
GLOBALS "../4gl/aws_ttsrv2_global.4gl" #TIPTOP Service Gateway 使用的全域變數檔
#[
# Description....: 提供取得 ERP BOM 資料服務(入口 function)
# Date & Author..: 2007/03/26 by Joe #FUN-720021
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_get_bom_data()
WHENEVER ERROR CONTINUE
CALL aws_ttsrv_preprocess() #呼叫服務前置處理程序
#--------------------------------------------------------------------------#
# 查詢 ERP BOM 資料 #
#--------------------------------------------------------------------------#
IF g_status.code = "0" THEN
CALL aws_get_bom_data_process()
END IF
CALL aws_ttsrv_postprocess() #呼叫服務後置處理程序
END FUNCTION
#[
# Description....: 查詢 ERP BOM
# Date & Author..: 2007/03/26 by Joe
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_get_bom_data_process()
DEFINE l_bma RECORD LIKE bma_file.*
DEFINE l_bmb DYNAMIC ARRAY OF RECORD LIKE bmb_file.*
DEFINE l_sql STRING
DEFINE l_wc STRING
DEFINE l_i LIKE type_file.num10
DEFINE l_node om.DomNode
LET l_wc = aws_ttsrv_getParameter("condition") #取由呼叫端呼叫時給予的 SQL Condition
LET l_sql = "SELECT * FROM bma_file WHERE ",
l_wc,
" AND bmaacti = 'Y' ORDER BY bma01"
DECLARE bma_curs CURSOR FROM l_sql
IF SQLCA.SQLCODE THEN
LET g_status.code = SQLCA.SQLCODE
LET g_status.sqlcode = SQLCA.SQLCODE
RETURN
END IF
LET l_sql = "SELECT * FROM bmb_file WHERE bmb01 = ? ORDER BY bmb02"
DECLARE bmb_curs CURSOR FROM l_sql
IF SQLCA.SQLCODE THEN
LET g_status.code = SQLCA.SQLCODE
LET g_status.sqlcode = SQLCA.SQLCODE
RETURN
END IF
FOREACH bma_curs INTO l_bma.*
CALL l_bmb.clear()
LET l_i = 1
FOREACH bmb_curs USING l_bma.bma01 INTO l_bmb[l_i].*
LET l_i = l_i + 1
END FOREACH
CALL l_bmb.deleteElement(l_i)
LET l_node = aws_ttsrv_addMasterRecord(base.TypeInfo.create(l_bma), "bma_file") #加入此筆單頭資料至 Response 中
CALL aws_ttsrv_addDetailRecord(l_node, base.TypeInfo.create(l_bmb), "bmb_file") #加入此筆單頭的單身資料至 Response 中
END FOREACH
IF SQLCA.SQLCODE THEN
LET g_status.code = SQLCA.SQLCODE
LET g_status.sqlcode = SQLCA.SQLCODE
RETURN
END IF
END FUNCTION
读取参数及参数回传, 以下范例为呼叫 ERP 作自动取号服务:
# Prog. Version..: '5.00.04-07.12.14(00000)' #
#{
# Program name...: aws_get_doc_no.4gl
# Descriptions...: 提供 ERP 單據自動取號服務
# Date & Author..: 2008/03/03 by Brendan
# Memo...........:
# Modify.........: 新建立 #FUN-720021
#
#}
DATABASE ds
GLOBALS "../../config/top.global"
GLOBALS "../4gl/aws_ttsrv2_global.4gl" #TIPTOP Service Gateway 使用的全域變數檔
#[
# Description....: 提供 ERP 單據自動取號服務服務(入口 function)
# Date & Author..: 2008/03/03 by Brendan #FUN-720021
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_get_doc_no()
WHENEVER ERROR CONTINUE
CALL aws_ttsrv_preprocess() #呼叫服務前置處理程序
#--------------------------------------------------------------------------#
# 單據自動取號 #
#--------------------------------------------------------------------------#
IF g_status.code = "0" THEN
CALL aws_get_doc_no_process()
END IF
CALL aws_ttsrv_postprocess() #呼叫服務後置處理程序
END FUNCTION
#[
# Description....: 自動取號
# Date & Author..: 2008/03/03 by Brendan
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_get_doc_no_process()
DEFINE l_sys LIKE smu_file.smu03,
l_slip STRING,
l_date LIKE type_file.dat,
l_type STRING,
l_tab STRING,
l_fld STRING,
l_dbs STRING,
l_runcard LIKE type_file.chr1,
l_smy STRING
DEFINE l_result LIKE type_file.num5
DEFINE l_return RECORD #回傳值必須宣告為一個 RECORD 變數, 且此 RECORD 需包含所有要回傳的欄位名稱與定義
slip STRING #回傳的欄位名稱
END RECORD
#取得各項參數
LET l_sys = aws_ttsrv_getParameter("sys")
LET l_slip = aws_ttsrv_getParameter("slip")
LET l_date = aws_ttsrv_getParameter("date")
LET l_type = aws_ttsrv_getParameter("type")
LET l_tab = aws_ttsrv_getParameter("tab")
LET l_fld = aws_ttsrv_getParameter("fld")
LET l_dbs = aws_ttsrv_getParameter("dbs")
LET l_runcard = aws_ttsrv_getParameter("runcard")
LET l_smy = aws_ttsrv_getParameter("smy")
BEGIN WORK
#單據編號檢查
CALL s_check_no(l_sys, l_slip, l_slip, l_type, l_tab, l_fld, l_dbs)
RETURNING l_result, l_return.slip
IF l_result THEN
#依照系統別、單別自動編號
CALL s_auto_assign_no(l_sys, l_slip, l_date, l_type, l_tab, l_fld, l_dbs, l_runcard, l_smy)
RETURNING l_result, l_return.slip
IF l_result THEN
COMMIT WORK
ELSE
ROLLBACK WORK
LET g_status.code = "sub-146"
END IF
ELSE
ROLLBACK WORK
LET g_status.code = "sub-141"
END IF
IF g_status.code = 0 THEN
CALL aws_ttsrv_addParameterRecord(base.TypeInfo.create(l_return)) #回傳自動取號結果
END IF
END FUNCTION
写入 ERP 单文件, 以下范例为写入 ERP 客户基本数据服务:
# Prog. Version..: '5.10.00-07.10.03(00001)' #
#{
# Program name...: aws_create_customer_data.4gl
# Descriptions...: 提供建立客戶基本資料的服務
# Date & Author..: 2007/02/06 by Brendan
# Memo...........:
# Modify.........: 新建立 FUN-720021
#
#}
DATABASE ds
#FUN-720021
GLOBALS "../../config/top.global"
GLOBALS "../4gl/aws_ttsrv2_global.4gl" #TIPTOP Service Gateway 使用的全域變數檔
#[
# Description....: 提供建立客戶基本資料的服務(入口 function)
# Date & Author..: 2007/02/06 by Brendan
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_create_customer_data()
WHENEVER ERROR CONTINUE
CALL aws_ttsrv_preprocess() #呼叫服務前置處理程序
#--------------------------------------------------------------------------#
# 新增客戶基本資料 #
#--------------------------------------------------------------------------#
IF g_status.code = "0" THEN
CALL aws_create_customer_data_process()
END IF
CALL aws_ttsrv_postprocess() #呼叫服務後置處理程序
END FUNCTION
#[
# Description....: 依據傳入資訊新增一筆 ERP 客戶基本資料
# Date & Author..: 2007/02/08 by Brendan
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_create_customer_data_process()
DEFINE l_i LIKE type_file.num10
DEFINE l_sql STRING
DEFINE l_cnt1 LIKE type_file.num10,
l_cnt2 LIKE type_file.num10
DEFINE l_occ01 LIKE occ_file.occ01
DEFINE l_wc STRING
DEFINE l_node om.DomNode
#--------------------------------------------------------------------------#
# 處理呼叫方傳遞給 ERP 的客戶基本資料 #
#--------------------------------------------------------------------------#
LET l_cnt1 = aws_ttsrv_getMasterRecordLength("occ_file") #取得共有幾筆單檔資料 *** 原則上應該僅一次一筆! ***
IF l_cnt1 = 0 THEN
LET g_status.code = "-1"
LET g_status.description = "No recordset processed!"
RETURN
END IF
BEGIN WORK
FOR l_i = 1 TO l_cnt1
LET l_node = aws_ttsrv_getMasterRecord(l_i, "occ_file") #目前處理單檔的 XML 節點
LET l_occ01 = aws_ttsrv_getRecordField(l_node, "occ01") #取得此筆單檔資料的欄位值
IF cl_null(l_occ01) THEN
LET g_status.code = "-286" #主鍵的欄位值不可為 NULL
EXIT FOR
END IF
#----------------------------------------------------------------------#
# 判斷此資料是否已經建立, 若已建立則為 Update #
#----------------------------------------------------------------------#
SELECT COUNT(*) INTO l_cnt2 FROM occ_file WHERE occ01 = l_occ01
IF l_cnt2 = 0 THEN
LET l_sql = aws_ttsrv_getRecordSql(l_node, "occ_file", "I", NULL) #I 表示取得 INSERT SQL
ELSE
LET l_wc = " occ01 = '", l_occ01 CLIPPED, "' " #UPDATE SQL 時的 WHERE condition
LET l_sql = aws_ttsrv_getRecordSql(l_node, "occ_file", "U", l_wc) #U 表示取得 UPDATE SQL
END IF
#----------------------------------------------------------------------#
# 執行 INSERT / UPDATE SQL #
#----------------------------------------------------------------------#
EXECUTE IMMEDIATE l_sql
IF SQLCA.SQLCODE THEN
LET g_status.code = SQLCA.SQLCODE
LET g_status.sqlcode = SQLCA.SQLCODE
EXIT FOR
END IF
END FOR
#全部處理都成功才 COMMIT WORK
IF g_status.code = "0" THEN
COMMIT WORK
ELSE
ROLLBACK WORK
END IF
END FUNCTION
写入 ERP 双文件, 以下范例为写入 ERP 询价单服务:
# Prog. Version..: '5.10.00-07.10.03(00001)' #
#{
# Program name...: aws_create_quotation_data.4gl
# Descriptions...: 提供建立報價單資料的服務
# Date & Author..: 2007/02/09 by Brendan
# Memo...........:
# Modify.........: 新建立 FUN-720021
#
#}
DATABASE ds
#FUN-720021
GLOBALS "../../config/top.global"
GLOBALS "../4gl/aws_ttsrv2_global.4gl" #TIPTOP Service Gateway 使用的全域變數檔
#[
# Description....: 提供建立報價單資料的服務(入口 function)
# Date & Author..: 2007/02/09 by Brendan
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_create_quotation_data()
WHENEVER ERROR CONTINUE
CALL aws_ttsrv_preprocess() #呼叫服務前置處理程序
#--------------------------------------------------------------------------#
# 新增報價單資料 #
#--------------------------------------------------------------------------#
IF g_status.code = "0" THEN
CALL aws_create_quotation_data_process()
END IF
CALL aws_ttsrv_postprocess() #呼叫服務後置處理程序
END FUNCTION
#[
# Description....: 依據傳入資訊新增 ERP 報價單資料
# Date & Author..: 2007/02/09 by Brendan
# Parameter......: none
# Return.........: none
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_create_quotation_data_process()
DEFINE l_i LIKE type_file.num10,
l_j LIKE type_file.num10
DEFINE l_sql STRING
DEFINE l_cnt LIKE type_file.num10,
l_cnt1 LIKE type_file.num10,
l_cnt2 LIKE type_file.num10
DEFINE l_oqt01 LIKE oqt_file.oqt01,
l_oqt02 LIKE oqt_file.oqt02
DEFINE l_oqu03 LIKE oqu_file.oqu03
DEFINE l_node1 om.DomNode,
l_node2 om.DomNode
DEFINE l_flag LIKE type_file.num10
DEFINE l_return RECORD #回傳值必須宣告為一個 RECORD 變數, 且此 RECORD 需包含所有要回傳的欄位名稱與定義
oqt01 LIKE oqt_file.oqt01 #回傳的欄位名稱
END RECORD
#--------------------------------------------------------------------------#
# 處理呼叫方傳遞給 ERP 的報價單資料 #
#--------------------------------------------------------------------------#
LET l_cnt1 = aws_ttsrv_getMasterRecordLength("oqt_file") #取得共有幾筆單檔資料 *** 原則上應該僅一次一筆! ***
IF l_cnt1 = 0 THEN
LET g_status.code = "-1"
LET g_status.description = "No recordset processed!"
RETURN
END IF
BEGIN WORK
FOR l_i = 1 TO l_cnt1
LET l_node1 = aws_ttsrv_getMasterRecord(l_i, "oqt_file") #目前處理單檔的 XML 節點
LET l_oqt01 = aws_ttsrv_getRecordField(l_node1, "oqt01") #取得此筆單檔資料的欄位值
LET l_oqt02 = aws_ttsrv_getRecordField(l_node1, "oqt02")
#----------------------------------------------------------------------#
# 報價單自動取號 #
#----------------------------------------------------------------------#
CALL s_check_no("AXM", l_oqt01, "", "10", "oqt_file", "oqt01", "")
RETURNING l_flag, l_oqt01
IF NOT l_flag THEN
LET g_status.code = "axm-551" #報價單自動取號失敗
EXIT FOR
END IF
CALL s_auto_assign_no("AXM", l_oqt01, l_oqt02, "10", "oqt_file", "oqt01", "", "", "")
RETURNING l_flag, l_oqt01
IF NOT l_flag THEN
LET g_status.code = "axm-551" #報價單自動取號失敗
EXIT FOR
END IF
CALL aws_ttsrv_setRecordField(l_node1, "oqt01", l_oqt01) #更新 XML 取號完成後的報價單單號欄位(oqt01)
IF NOT aws_create_quotation_data_default(l_node1) THEN #檢查報價單欄位預設值
END IF
LET l_sql = aws_ttsrv_getRecordSql(l_node1, "oqt_file", "I", NULL) #I 表示取得 INSERT SQL
#----------------------------------------------------------------------#
# 執行單頭 INSERT SQL #
#----------------------------------------------------------------------#
EXECUTE IMMEDIATE l_sql
IF SQLCA.SQLCODE THEN
LET g_status.code = SQLCA.SQLCODE
LET g_status.sqlcode = SQLCA.SQLCODE
EXIT FOR
END IF
#----------------------------------------------------------------------#
# 處理單身資料 #
#----------------------------------------------------------------------#
LET l_cnt2 = aws_ttsrv_getDetailRecordLength(l_node1, "oqu_file") #取得目前單頭共有幾筆單身資料
IF l_cnt2 = 0 THEN
LET g_status.code = "mfg-009" #必須有單身資料
EXIT FOR
END IF
FOR l_j = 1 TO l_cnt2
LET l_node2 = aws_ttsrv_getDetailRecord(l_node1, l_j, "oqu_file") #目前單身的 XML 節點
CALL aws_ttsrv_setRecordField(l_node2, "oqu01", l_oqt01) #寫入自動編號產生的報價單單號
#------------------------------------------------------------------#
# 檢查料件編號資料是否正確 #
#------------------------------------------------------------------#
LET l_oqu03 = aws_ttsrv_getRecordField(l_node2, "oqu03")
SELECT COUNT(*) INTO l_cnt FROM ima_file WHERE ima01 = l_oqu03
IF l_cnt = 0 THEN
LET g_status.code = "mfg0002" #料件主檔中無此料件編號
EXIT FOR
END IF
LET l_sql = aws_ttsrv_getRecordSql(l_node2, "oqu_file", "I", NULL) #I 表示取得 INSERT SQL
#------------------------------------------------------------------#
# 執行單身 INSERT SQL #
#------------------------------------------------------------------#
EXECUTE IMMEDIATE l_sql
IF SQLCA.SQLCODE THEN
LET g_status.code = SQLCA.SQLCODE
LET g_status.sqlcode = SQLCA.SQLCODE
EXIT FOR
END IF
END FOR
IF g_status.code != "0" THEN #如果單身處理有任何錯誤, 則離開
EXIT FOR
END IF
END FOR
#全部處理都成功才 COMMIT WORK
IF g_status.code = "0" THEN
LET l_return.oqt01 = l_oqt01
CALL aws_ttsrv_addParameterRecord(base.TypeInfo.create(l_return)) #回傳 ERP 建立的報價單單號
COMMIT WORK
ELSE
ROLLBACK WORK
END IF
END FUNCTION
#[
# Description....: 報價單設定欄位預設值
# Date & Author..: 2007/02/11 by Brendan
# Parameter......: p_node - om.DomNode - 報價單單頭 XML 節點
# Return.........: l_status - INTEGER - TRUE / FALSE 預設值檢查結果
# Memo...........:
# Modify.........:
#
#]
FUNCTION aws_create_quotation_data_default(p_node)
DEFINE p_node om.DomNode
DEFINE l_oqt04 LIKE oqt_file.oqt04,
l_oqt06 LIKE oqt_file.oqt06,
l_oqt07 LIKE oqt_file.oqt07,
l_oqt10 LIKE oqt_file.oqt10,
l_oqt11 LIKE oqt_file.oqt11,
l_oqtconf LIKE oqt_file.oqtconf #報價單確認碼
DEFINE l_cnt LIKE type_file.num5
#--------------------------------------------------------------------------#
# 檢查客戶編號資料是否正確 #
#--------------------------------------------------------------------------#
LET l_oqt04 = aws_ttsrv_getRecordField(p_node, "oqt04")
SELECT COUNT(*) INTO l_cnt FROM occ_file WHERE occ01 = l_oqt04
IF l_cnt = 0 THEN
LET g_status.code = "mfg4106" #無此客戶編號資料存在
RETURN FALSE
END IF
#--------------------------------------------------------------------------#
# 依據 ERP 業務員編號,自動預設部門編號(若呼叫端無給予部門編號欄位值時) #
#--------------------------------------------------------------------------#
LET l_oqt06 = aws_ttsrv_getRecordField(p_node, "oqt06")
IF cl_null(l_oqt06) THEN
LET l_oqt07 = aws_ttsrv_getRecordField(p_node, "oqt07")
SELECT gen03 INTO l_oqt06 FROM gen_file WHERE gen01 = l_oqt07
CALL aws_ttsrv_setRecordField(p_node, "oqt06", l_oqt06)
IF cl_null(l_oqt06) THEN #若欄位值為 NULL 值且又是必要輸入欄位,則回傳提示訊息
#LET g_status.description = cl_getmsg('aws-098', g_lang)
END IF
END IF
#--------------------------------------------------------------------------#
# 依據 ERP 客戶編號, 自動預設交易條件(若呼叫端無給予交易條件欄位值時) #
#--------------------------------------------------------------------------#
LET l_oqt10 = aws_ttsrv_getRecordField(p_node, "oqt10")
IF cl_null(l_oqt10) THEN
SELECT occ44 INTO l_oqt10 FROM occ_file WHERE occ01 = l_oqt04
CALL aws_ttsrv_setRecordField(p_node, "oqt10", l_oqt10)
IF cl_null(l_oqt10) THEN #若欄位值為 NULL 值且又是必要輸入欄位,則回傳提示訊息
#LET g_status.description = cl_getmsg('aws-098', g_lang)
END IF
END IF
#--------------------------------------------------------------------------#
# 依據 ERP 客戶編號, 自動預設運輸方式(若呼叫端無給予運輸方式欄位值時) #
#--------------------------------------------------------------------------#
LET l_oqt11 = aws_ttsrv_getRecordField(p_node, "oqt11")
IF cl_null(l_oqt11) THEN
SELECT occ47 INTO l_oqt11 FROM occ_file WHERE occ01 = l_oqt04
CALL aws_ttsrv_setRecordField(p_node, "oqt11", l_oqt11)
IF cl_null(l_oqt11) THEN #若欄位值為 NULL 值且又是必要輸入欄位,則回傳提示訊息
#LET g_status.description = cl_getmsg('aws-098', g_lang)
END IF
END IF
#--------------------------------------------------------------------------#
# 當欄位預設值異常時,則不可自動確認 #
#--------------------------------------------------------------------------#
LET l_oqtconf = aws_ttsrv_getRecordField(p_node, "oqtconf")
IF l_oqtconf = "Y" AND ( NOT cl_null(g_status.description) ) THEN
#-----------------------------------------------------------------------#
# 異常時,確認碼為「N:未確認」、狀況碼為「0:開立」 #
#-----------------------------------------------------------------------#
CALL aws_ttsrv_setRecordField(p_node, "oqtconf", "N")
CALL aws_ttsrv_setRecordField(p_node, "oqt21", "0")
ELSE
#-----------------------------------------------------------------------#
# 確認碼為「Y:已確認」,狀況碼應該「1:已核准」; #
# 確認碼為「N:已確認」,狀況碼應該「0:開立」 #
#-----------------------------------------------------------------------#
IF l_oqtconf = "Y" THEN
CALL aws_ttsrv_setRecordField(p_node, "oqt21", "1")
ELSE
CALL aws_ttsrv_setRecordField(p_node, "oqt21", "0")
END IF
END IF
RETURN TRUE
END FUNCTION
转载请注明:赫非域 » TIPTOP Service Gateway ver 2.0