matinal:SAP ABAP 发布HTTP RestFul服务全过程解析(一)

1.SE24新建类:ZCL_REST_QUERY

激活,然后添加interface:IF_HTTP_EXTENSION并激活。

2.实现IF_HTTP_EXTENSION~HANDLE_REQUEST:

METHOD IF_HTTP_EXTENSION~HANDLE_REQUEST.
    DATA: LT_FIELDS       TYPE TIHTTPNVP,
          LV_HEADER_QUERY TYPE STRING,
          LV_DATA         TYPE STRING,
          LV_HTML         TYPE STRING.

    FIELD-SYMBOLS: <FS_FIELD>       LIKE LINE OF LT_FIELDS.

*" get HEADER fields
    SERVER->REQUEST->GET_HEADER_FIELDS(
        CHANGING
          FIELDS = LT_FIELDS    " Header fields
      ).
    LV_DATA = SERVER->REQUEST->IF_HTTP_ENTITY~GET_CDATA( ).

    " Read the fields table and look for name "~query_string" -- this will contain the URL query
    READ TABLE LT_FIELDS
      WITH KEY NAME = '~query_string'
      ASSIGNING <FS_FIELD>.
    IF SY-SUBRC EQ 0.
      CONCATENATE '{"message": "You have entered'
                  <FS_FIELD>-VALUE
                  'as query parameter."}'
             INTO LV_HTML SEPARATED BY SPACE.

*" Output to HTML
      SERVER->RESPONSE->SET_CDATA(
        EXPORTING
          DATA   = LV_HTML    " Character data
*        offset = 0    " Offset into character data
*        length = -1    " Length of character data
      ).
    ENDIF.
  ENDMETHOD.

3.事务代码SICF定义REST服务:

设置服务的用户名密码:

 

添加处理类:

保存激活.测试服务:

 

SAP调用测试:

 创建程序:ZLYTEST_REST

REPORT zlytest_rest.
DATA: lo_http_client   TYPE REF TO if_http_client,
      lv_service       TYPE string,
      lv_request       TYPE string,
      lv_len           TYPE i,
      lv_result        TYPE string,
      lx_result        TYPE xstring,
      lo_ixml          TYPE REF TO if_ixml,
      lo_streamfactory TYPE REF TO if_ixml_stream_factory,
      lo_istream       TYPE REF TO if_ixml_istream,
      lo_document      TYPE REF TO if_ixml_document,
      conv             TYPE REF TO cl_abap_conv_in_ce,
      lo_parser        TYPE REF TO if_ixml_parser.
lv_service = 'http://gjyxcrmdev.crm.hisense.com:8000/sap/zrest'.

lv_request = '<Request><Id>2912744</Id><Notes>testaskldjasd123</Notes><FaultSource>consumer</FaultSource>' &&
'<FaultBattery>no</FaultBattery>' &&
'<FaultScreen>no</FaultScreen>' &&
'<FaultFirmware>no</FaultFirmware>' &&
'<FaultLogicboard>no</FaultLogicboard>' &&
'<FaultKeyboard>no</FaultKeyboard>' &&
'<FaultSpeaker>no</FaultSpeaker>' &&
'<FaultHdd>no</FaultHdd>' &&
'<FaultPowersupply>no</FaultPowersupply>' &&
'<FaultOtherDescription>123</FaultOtherDescription>'
 && '</Request>'.
lv_len = strlen( lv_request ).

cl_http_client=>create_by_url(
  EXPORTING
    url                = lv_service
  IMPORTING
    client             = lo_http_client
  EXCEPTIONS
    argument_not_found = 1
    plugin_not_active  = 2
    internal_error     = 3
    OTHERS             = 4 ).

*lo_http_client->authenticate(
*    username             = 'service@hisenseinhome.com.au'
*    password             = 'pass' ).

CALL METHOD lo_http_client->request->set_cdata
  EXPORTING
    data   = lv_request
    offset = 0
    length = lv_len.

lo_http_client->send(
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2 ).

lo_http_client->receive(
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3 ).

CLEAR lv_result .
lx_result = lo_http_client->response->get_data( ).
CALL METHOD lo_http_client->close.
CHECK 1 = 1.

在REST处理类中添加断点,执行测试程序,测试结果如下:

数据已经传递过来了。

返回JSON数据格式例子:

 

DATA: lo_json_ser TYPE REF TO cl_trex_json_serializer,
          lo_json_des TYPE REF TO cl_trex_json_deserializer.
    DATA: json_string TYPE string.
    DATA:gt_t005u TYPE TABLE OF t005u.
"设置返回数据格式
CALL METHOD server->response->if_http_entity~set_content_type
      EXPORTING
        content_type = 'application/json'.
SELECT * INTO TABLE gt_t005u FROM t005u UP TO 5 ROWS WHERE spras = '1' AND land1 = 'CN'.

      CREATE OBJECT lo_json_ser
        EXPORTING
          data = gt_t005u[].

      CALL METHOD lo_json_ser->serialize.
      CALL METHOD lo_json_ser->get_data
        RECEIVING
          rval = json_string.
server->response->set_cdata(
        EXPORTING
          data   = json_string    " Character data
      ).

返回结果:

参考别人的:

METHOD IF_HTTP_EXTENSION~HANDLE_REQUEST.
    DATA: LO_JSON_SER TYPE REF TO CL_TREX_JSON_SERIALIZER,
          LO_JSON_DES TYPE REF TO CL_TREX_JSON_DESERIALIZER.
    DATA: JSON_STRING TYPE STRING.
    DATA:GT_T005U TYPE TABLE OF T005U.
    DATA:GW_T005U TYPE T005U.
    DATA:LV_METHOD TYPE STRING.

    LV_METHOD = SERVER->REQUEST->GET_HEADER_FIELD( NAME = '~request_method' ).

    CASE LV_METHOD.
      WHEN 'GET'.
        SELECT * INTO TABLE GT_T005U FROM T005U UP TO 5 ROWS WHERE SPRAS = '1' AND LAND1 = 'CN'.

        CREATE OBJECT LO_JSON_SER
          EXPORTING
            DATA = GT_T005U[].

        CALL METHOD LO_JSON_SER->SERIALIZE.

        CALL METHOD LO_JSON_SER->GET_DATA
          RECEIVING
            RVAL = JSON_STRING.

        CALL METHOD SERVER->RESPONSE->SET_CDATA(
          EXPORTING
            DATA = JSON_STRING ).
        SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
      WHEN 'POST' OR 'PUT'.
        JSON_STRING = SERVER->REQUEST->IF_HTTP_ENTITY~GET_CDATA( ).
        CREATE OBJECT LO_JSON_DES.
        CALL METHOD LO_JSON_DES->DESERIALIZE(
          EXPORTING
            JSON = JSON_STRING
          IMPORTING
            ABAP = GW_T005U ).
        SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).

*        MODIFY GT_T005U FROM GW_T005U.

      WHEN 'DELETE'.
      WHEN OTHERS.
    ENDCASE.

    CALL METHOD SERVER->RESPONSE->IF_HTTP_ENTITY~SET_CONTENT_TYPE
      EXPORTING
        CONTENT_TYPE = 'application/json'.


  ENDMETHOD.

补充1:token方式http处理

"拼接后续要使用的tken
  CONCATENATE 'Bearer' re_login-access_token INTO re_login-access_token SEPARATED BY space.
  lo_http_client->request->if_http_entity~set_content_type( content_type = 'application/json' ).
  lo_http_client->request->if_http_entity~set_header_field( name = 'Accept' value = 'application/json' ).
  lo_http_client->request->set_method( if_http_request=>co_request_method_post ).


  lo_http_client->request->if_http_entity~set_header_field( name   = 'Authorization' value = re_login-access_token ).

token有放body的有放header的。。。再用的时候注意下就好了。不过这种取token再调业务接口的模式。

<think>好的,我现在需要处理用户关于SAP系统中车间和仓库盘盈盘亏处理方式及差异的问题。首先,我要回忆之前用户提到的内容,用户之前问过车间库负库存的设置,引用了matinalSAP FICO的资料。现在用户进步询问盘盈盘亏的具体处理方法和区别,需要结合之前的引用信息,同时可能需要补充其他相关知识。 首先,盘盈盘亏通常涉及库存差异的处理,这在SAP中可能通过不同的移动类型和会计科目来体现。根据引用[1],车间库是虚拟库,允许负库存,而实体仓库不允许。这可能影响盘点的处理方式。例如,车间库的差异可能通过生产订单调整,而实体仓库的差异可能直接通过库存调整科目处理。 然后,引用[2]提到KO88结算生产订单时产生的会计凭证,涉及生产成本和材料成本差异科目。这说明生产相关的差异可能通过生产订单结算流程处理,而仓库的差异可能直接调整库存科目。 接下来,我需要区分车间和实体仓库的处理步骤。车间库作为虚拟库,可能与生产订单相关,盘盈盘亏可能通过调整生产订单的投入或产出来处理,使用特定的移动类型如701/702。而实体仓库的差异可能使用移动类型701/702,并直接过账到差异科目,影响库存价值。 另外,会计处理方面,车间库的差异可能关联到生产成本科目,而实体仓库差异可能对应库存调整科目。需要注意系统配置中是否允许负库存对处理方式的影响,车间库允许负库存可能意味着差异处理更灵活,而实体仓库需要及时调整避免负库存。 用户可能还想知道具体的操作事务代码,比如MI07用于库存盘点,MI20查看差异,以及KO88结算生产订单。同时,需要说明两者的核心区别在于库存类型、会计科目和处理流程。 最后,生成相关问题需要考虑用户可能进步的问题,比如配置步骤、会计凭证差异、生产订单影响等。确保问题覆盖用户可能的兴趣点,帮助他们深入理解处理机制。</think>### SAP车间与仓库盘盈盘亏处理方法及区别 #### 、车间库(虚拟库)盘盈盘亏处理 1. **业务背景** 车间库作为配合生产回冲扣料的虚拟库,允许负库存[^1],其差异通常与生产订单执行相关。例如:生产投料未完全消耗或退库未及时记录。 2. **处理步骤** - **差异确认**:通过事务代码`MI07`进行库存盘点,系统生成差异清单。 - **调整方式**: - 盘盈:使用移动类型`701`(库存增加)关联生产订单,冲减生产成本。 - 盘亏:使用移动类型`702`(库存减少)关联生产订单,增加生产成本。 - **会计处理**:差异通过生产订单结算(事务代码`KO88`)转入成本中心或差异科目,例如: ``` 借:生产成本-差异调整 贷:库存-车间库 ``` [^2] #### 二、实体仓库盘盈盘亏处理 1. **业务限制** 实体仓库禁止负库存[^1],差异需立即处理,通常由物料管理模块触发。 2. **处理步骤** - **差异过账**:使用移动类型`701`/`702`直接调整库存,系统自动生成会计凭证: ``` 借/贷:库存商品 贷/借:库存盘盈盘亏科目 ``` - **权限控制**:需审批流程(通过审批码或电子工作流)。 #### 三、核心区别对比 | **维度** | **车间库** | **实体仓库** | |----------------|-----------------------------------|--------------------------------| | **库存类型** | 虚拟库(允许负库存)[^1] | 实物库(禁止负库存) | | **差异来源** | 生产订单执行偏差 | 收发存操作误差 | | **会计科目** | 关联生产成本科目[^2] | 直接使用库存调整科目 | | **处理流程** | 需结合生产订单结算(KO88)[^2] | 独立过账,无需关联订单 | #### 四、配置要点 1. **车间库**:在物料主数据中设置“特殊库存标识”(如生产库存),并配置移动类型与生产订单的关联。 2. **实体库**:在物料管理(MM)模块定义库存调整科目,并设置审批策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值