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

TIPTOP Service Gateway ver 2.0

开发相关 bron1984 5376浏览

TIPTOP Service Gateway ver 2.0

  1. 简述

 

  1. 概念

透过一共同的 Web Services 存取点(URL), 不同服务需求而 ERP 端有撰写对应的 4GL function 来回应. 经过各种功能需求的 4GL function 处理完成后, 再依照各 service function 定义的参数格式回复呼叫端.

考虑外部需求的多样性, service function 有以下定义:

  1. 每一种外部 request 需求即有一 4GL service function 对应 — 目的为便利处理各种 business logic 需求
  2. 对方系统呼叫每个 ERP 4GL service 的传入与回传的内容为一 XML 字符串 — 目的为统一交换格式.
  3. 每一个4GL service function 写法如同一般 ERP 程序, 但有属于 TIPTOP Service Gateway 的写法规定与相关共享函示的呼叫(后述).
  4. 数据交换规格
  5. 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>

 

  1. 全局变量档

开发服务程序时, 需利用 GLOBALS 语法含入 TIPTOP Service Gateway 的全局变量档:$WZZ/4gl/waws_ttsrv2_global.4gl

 

语法范例:GLOBALS “../4gl/waws_ttsrv2_global.4gl”

  1. 状态值处理

开发服务程序时, 可利用改变 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”

  1. 共享函式说明

开发服务程序过程中可利用的共享函式.

函式名称 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

  1. 程序开发说明

 

  1. 发布新的服务函式

$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
  1. 定义新的服务函式

$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

 

  1. 实际撰写处理服务的程序本体

$WZZ/4gl 目录下新增并撰写服务程序(e.x. waws_get_sso_key.4gl)

可能存在五种型态的服务需求:

■ 读取 ERP 单档

■ 读取 ERP 双档

■ 写入 ERP 单档

■ 写入 ERP 双档

■ 非单据的参数传入与回传

  1. 程序撰写后透过 p_weblink 将完成的 4GL module 挂到 waws_ttsrv2 中

  1. 测试此服务
  2. 程序开发范例

读取 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