C223生产版本,调用HTTP,实时传输生产版本

C223增强点:CM_FV_PROD_VERS_DB_UPDATE,3个地方要改,新建、修改、删除。所以把调用http接口的代码封装成了接口,方便调用。

  同时为了不增加前台等待时间,这里采用后台作业的方式。直接调用Z_RFC_PLM_037。

  登陆并获取token值的,为了方便后续调用其它接口,也单独包在了接口Z_RFC_PLM_036中。

涉及到的表结构

 

 

 

 

Z_RFC_PLM_037:

 

 

 

Z_RFC_PLM_037 源码:

FUNCTION z_rfc_plm_037.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(P_VERID) TYPE  VERID OPTIONAL
*"     VALUE(P_PLNNR) TYPE  PLNNR OPTIONAL
*"     VALUE(P_WERKS) TYPE  WERKS_D OPTIONAL
*"     VALUE(P_MATNR) TYPE  MATNR OPTIONAL
*"     VALUE(LV_ZJOBCOUNTR) TYPE  BTCJOBCNT OPTIONAL
*"  EXPORTING
*"     VALUE(LV_ZJOBCOUNT) TYPE  BTCJOBCNT
*"----------------------------------------------------------------------
  DATA: lv_jobname          TYPE tbtcjob-jobname,
        ls_print_parameters TYPE pri_params,
        lv_jobcount         TYPE tbtcjob-jobcount.
*        lv_zjobcount        type BTCJOBCNT.
  DATA:lt_rspar TYPE TABLE OF rsparams,
       lw_line  LIKE LINE OF lt_rspar.
  DATA: ls_ztjob_count TYPE ztjob_count,
        lt_ztjob_count TYPE TABLE OF ztjob_count.
  "如果是要传给PARAMETER  根据需求设置屏幕参数
  lw_line-selname = 'P_VERID'.
  lw_line-kind    = 'P'.
  lw_line-sign    = 'I'.
  lw_line-option  = 'EQ'.
  lw_line-low     = p_verid.
  APPEND lw_line TO lt_rspar.

  lw_line-selname = 'P_PLNNR'.
  lw_line-kind    = 'P'.
  lw_line-sign    = 'I'.
  lw_line-option  = 'EQ'.
  lw_line-low     = p_plnnr.
  APPEND lw_line TO lt_rspar.

  lw_line-selname = 'P_WERKS'.
  lw_line-kind    = 'P'.
  lw_line-sign    = 'I'.
  lw_line-option  = 'EQ'.
  lw_line-low     = p_werks.
  APPEND lw_line TO lt_rspar.

  lw_line-selname = 'P_MATNR'.
  lw_line-kind    = 'P'.
  lw_line-sign    = 'I'.
  lw_line-option  = 'EQ'.
  lw_line-low     = p_matnr.
  APPEND lw_line TO lt_rspar.

*&--------新建作业名
  IF lv_zjobcountr IS INITIAL.
    SELECT MAX( jobcount )
      INTO @lv_zjobcount
      FROM ztjob_count
     WHERE programm = 'ZPPR065'
       AND zerdat EQ @sy-datum.
  ELSE.
    lv_zjobcount = lv_zjobcountr.
  ENDIF.

  lv_zjobcount = lv_zjobcount + 1.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = lv_zjobcount
    IMPORTING
      output = lv_zjobcount.

  CONCATENATE 'ZPPR065' lv_zjobcount INTO lv_jobname SEPARATED BY '_'.
  "打开JOB 通过JOB name 获得JOB号
  CALL FUNCTION 'JOB_OPEN'
    EXPORTING
      jobname          = lv_jobname
    IMPORTING
      jobcount         = lv_zjobcount
    EXCEPTIONS
      cant_create_job  = 1
      invalid_job_data = 2
      jobname_missing  = 3
      OTHERS           = 4.
  IF syst-subrc = 0.
    "调用需要跑JOB的程序
*    SUBMIT zppr065
*        WITH SELECTION-TABLE  lt_rspar
*        USER syst-uname          " mandatory
*       VIA JOB lv_jobname NUMBER lv_zjobcount AND RETURN.

    SUBMIT zppr065
            WITH p_verid = p_verid
            WITH p_plnnr = p_plnnr
            WITH p_werks = p_werks
            WITH p_matnr = p_matnr
            VIA JOB lv_jobname NUMBER lv_zjobcount AND RETURN.
    IF sy-subrc EQ 0.
*&--------设置作业周期信息
*    CLEAR lv_jobcount.
      CALL FUNCTION 'JOB_CLOSE'
        EXPORTING
          jobcount             = lv_zjobcount
          jobname              = lv_jobname
*         sdlstrtdt            = sy-datum
*         sdlstrttm            = sy-uzeit                           "
*         PRDMINS              = 10                                        "每10分钟执行一次
          strtimmed            = 'X'                                       "立刻开始
        EXCEPTIONS
          cant_start_immediate = 1
          invalid_startdate    = 2
          jobname_missing      = 3
          job_close_failed     = 4
          job_nosteps          = 5
          job_notex            = 6
          lock_failed          = 7
          invalid_target       = 8
          OTHERS               = 9.
      IF sy-subrc <> 0.
      ENDIF.
    ENDIF.
*&--------记录到表
    ls_ztjob_count-programm = 'ZPPR065'.
    ls_ztjob_count-jobcount = lv_zjobcount.
    ls_ztjob_count-zerdat = sy-datum.
    MODIFY ztjob_count FROM ls_ztjob_count.
*    IF sy-subrc EQ 0.
*      COMMIT WORK AND WAIT.
*    ELSE.
*      ROLLBACK WORK.
*    ENDIF.
  ENDIF.


ENDFUNCTION.
View Code

 

接口Z_RFC_PLM_037中调用了程序ZPPR065,

ZPPR065源码:

*&---------------------------------------------------------------------*
*& Report ZPPR065
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zppr065.
TABLES: mkal.
DATA: lv_token TYPE string.
DATA: BEGIN OF ls_vbom2,
        other9  TYPE string,
        other10 TYPE string,
      END OF ls_vbom2.
DATA: lc_http_client  TYPE REF TO if_http_client,
      l_url           TYPE string,
      l_json_data     TYPE string,
      l_result_string TYPE string.
DATA: lc_json  TYPE REF TO cl_fdt_json_serializer.
DATA: lv_len TYPE i.


SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_verid TYPE mkal-verid,
            p_plnnr TYPE mkal-plnnr,
            p_werks TYPE mkal-werks,
            p_matnr TYPE mkal-matnr.
SELECTION-SCREEN: END OF BLOCK b01.

START-OF-SELECTION.

  CHECK p_verid IS NOT INITIAL.
  CHECK p_plnnr IS NOT INITIAL.
  CHECK p_werks IS NOT INITIAL.
  CHECK p_matnr IS NOT INITIAL.
  "获取token
  CALL FUNCTION 'Z_RFC_PLM_036'
    IMPORTING
      lv_token = lv_token.

  CHECK lv_token IS NOT INITIAL.
  "806是测试的,805是正式的

  IF sy-mandt EQ '886'.
    l_url = 'http://111.111.11.111:805/API/pimDesignBOMItem/BOMServer/doUpdatePartMaster?PartCode='."更新生产版本号
  ELSE.
    l_url = 'http://111.111.11.111:806/API/pimDesignBOMItem/BOMServer/doUpdatePartMaster?PartCode='."更新生产版本号
  ENDIF.
  l_url = |{ l_url }{ p_matnr }_{ p_werks }|.

  ls_vbom2-other9 = p_plnnr.
  ls_vbom2-other10 = p_verid.

*****转换json格式
  CREATE OBJECT lc_json.

  CALL METHOD lc_json->serialize
    EXPORTING
      data   = ls_vbom2 "lt_vldata
    RECEIVING
      r_json = l_json_data.

*****创建http服务
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = l_url
    IMPORTING
      client             = lc_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

  CALL METHOD lc_http_client->request->set_header_field
    EXPORTING
      name  = 'Authorization'
      value = lv_token.
*
  CALL METHOD lc_http_client->request->set_header_field
    EXPORTING
      name  = 'Content-Type'
      value = 'application/JSON; charset=utf-8'.

  "设置待传输内容
  lv_len = strlen( l_json_data ).
  CALL METHOD lc_http_client->request->set_cdata
    EXPORTING
      data   = l_json_data
      offset = 0
      length = lv_len.

  CALL METHOD lc_http_client->request->set_method( 'PUT' ).

*****发送http服务
  CALL METHOD lc_http_client->send
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      http_invalid_timeout       = 4
      OTHERS                     = 5.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

*****接收返回数据
  CALL METHOD lc_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.

  l_result_string = lc_http_client->response->get_cdata( ).
View Code

ZPPR065调用了接口Z_RFC_PLM_036(登陆,并获取token值,时效2小时,这里为了保险,每天超过1.5小时都重新获取token值),

Z_RFC_PLM_036:

 

 Z_RFC_PLM_036源代码:

FUNCTION z_rfc_plm_036.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     VALUE(LV_TOKEN) TYPE  STRING
*"----------------------------------------------------------------------
  DATA: lt_ztrfc_token TYPE TABLE OF ztrfc_token,
        ls_ztrfc_token TYPE ztrfc_token.
  DATA: lv_uzeit TYPE sy-uzeit.
  DATA: lv_check TYPE c.
  DATA: lc_json  TYPE REF TO cl_fdt_json_serializer,
        lc_json2 TYPE REF TO cl_fdt_json_serializer. "json格式转换

  DATA: lc_http_client2  TYPE REF TO if_http_client,
        l_url2           TYPE string,
        l_json_data2     TYPE string,
        l_result_string2 TYPE string.
  IF sy-uzeit LE '013000'.
    lv_uzeit = sy-uzeit.
  ENDIF.

*  CHECK sy-mandt = '886'. "正式机

  SELECT SINGLE a~*
    INTO @ls_ztrfc_token
    FROM ztrfc_token AS a
   WHERE EXISTS ( SELECT MAX( b~zuzeit )
    FROM ztrfc_token AS b
   WHERE b~zerdat EQ @sy-datum ).

  IF ls_ztrfc_token-zdata IS INITIAL OR lv_uzeit > ls_ztrfc_token-zuzeit.
    "今天未获取,或者失效超出,需重新登陆PLM,获取TOKEN
    IF sy-mandt EQ '886'.
      l_url2 = 'http://111.111.11.111:805/login?UserName=111&PassWord=111'."获取token值 ,806是测试的
    ELSE.
      l_url2 = 'http://111.111.11.111:806/login?UserName=111&PassWord=111'."获取token值 ,806是测试的
    ENDIF.


    CALL METHOD cl_http_client=>create_by_url
      EXPORTING
        url                = l_url2
      IMPORTING
        client             = lc_http_client2
      EXCEPTIONS
        argument_not_found = 1
        plugin_not_active  = 2
        internal_error     = 3
        OTHERS             = 4.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.

    CALL METHOD lc_http_client2->request->set_method( 'GET' ).

*****发送http服务
    CALL METHOD lc_http_client2->send
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3
        http_invalid_timeout       = 4
        OTHERS                     = 5.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.

*****接收返回数据
    CALL METHOD lc_http_client2->receive
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3
        OTHERS                     = 4.

    l_result_string2 = lc_http_client2->response->get_cdata( ).

    DATA: lt_str   LIKE TABLE OF l_result_string2 WITH HEADER LINE.
*    DATA: lv_token TYPE string.
    SPLIT l_result_string2 AT '"' INTO TABLE lt_str.
    READ TABLE lt_str INTO DATA(ls_str) INDEX 4.
    IF sy-subrc EQ 0.
      lv_token = ls_str.

      ls_ztrfc_token-zerdat = sy-datum.
      ls_ztrfc_token-zuzeit = sy-uzeit.
      ls_ztrfc_token-zdata  = ls_str.
      MODIFY ztrfc_token FROM ls_ztrfc_token.
      IF sy-subrc EQ 0.
        COMMIT WORK AND WAIT.
      ENDIF.
    ENDIF.

  ELSE.
    lv_token = ls_ztrfc_token-zdata.
  ENDIF.



ENDFUNCTION.
View Code

 测试结果:

  不知道是不是更新函数的问题,不能在这里设置后台作业,目前改成了直接调用接口,时效大大增加。差评!

后记:流水码建议使用系统自带的,SNRO创建。

 

 

 

 

 SE11->范围(域)

 

 

 然后就是代码每天初始化,并锁定和生成流水码

    SELECT COUNT(*)
      FROM zrfc_logs
     WHERE funcname EQ 'ZSDXH01'
       AND erdat EQ sy-datum.
    IF sy-subrc NE 0.
      CALL FUNCTION 'NUMBER_RANGE_INTERVAL_INIT' "每天初始化
        EXPORTING
          object            = 'ZSDXH01'
        EXCEPTIONS
          no_interval_found = 1
          object_not_found  = 2
          OTHERS            = 3.
    ENDIF.

    CALL FUNCTION 'NUMBER_RANGE_ENQUEUE' "鎖定
      EXPORTING
        object           = 'ZSDXH01'
      EXCEPTIONS
        foreign_lock     = 1
        object_not_found = 2
        system_failure   = 3
        OTHERS           = 4.
    IF sy-subrc = 0.
      CALL FUNCTION 'NUMBER_GET_NEXT'
        EXPORTING
          nr_range_nr                   = 'Z'
          object                        = 'ZSDXH01' "事務碼SNRO創建的流水碼對象
*   QUANTITY                      = '1'
*   SUBOBJECT                     = ' '
         toyear                        = sy-datum+0(4)
*   IGNORE_BUFFER                 = ' '
       IMPORTING
         number                        = lv_num_zsdxh01
*   QUANTITY                      =
*   RETURNCODE                    =
       EXCEPTIONS
         interval_not_found            = 1
         error_message                 = 2
         OTHERS                        = 3.
      IF sy-subrc NE 0.

      ELSE.
        CALL FUNCTION 'NUMBER_RANGE_DEQUEUE' "解除鎖定
          EXPORTING
            object           = 'ZSDXH01'
          EXCEPTIONS
            object_not_found = 1
            OTHERS           = 2.
        ls_zrfc_logs-funcname   = 'ZSDXH01'.
        ls_zrfc_logs-zsystem    = 'SAP'.
        ls_zrfc_logs-uname      = sy-uname.
*  ls_zrfc_logs-zname1     = p_name1.
        ls_zrfc_logs-erdat      = sy-datum.
        ls_zrfc_logs-uzeit      = sy-uzeit.
*  ls_zrfc_logs-ep_type    = ep_type.
*  ls_zrfc_logs-ep_message = ep_message.
        ls_zrfc_logs-p_str1 = is_mseg-werks.
        ls_zrfc_logs-p_str2 = is_mseg-lgort.
        ls_zrfc_logs-p_str3 = is_mseg-menge.
        CONDENSE ls_zrfc_logs-p_str3 NO-GAPS.
        ls_zrfc_logs-p_str4 = is_mseg-charg.
        ls_zrfc_logs-p_str5 = is_mseg-kdauf.
        ls_zrfc_logs-p_str6 = is_mseg-kdpos.
*        ls_zrfc_logs-jsonstr1   = jsonstr.
        MODIFY zrfc_logs FROM ls_zrfc_logs.
      ENDIF.
    ENDIF.
View Code

 

posted @ 2021-11-18 12:05  蛀牙首领  阅读(534)  评论(0编辑  收藏  举报