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.
接口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( ).
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.
测试结果:
不知道是不是更新函数的问题,不能在这里设置后台作业,目前改成了直接调用接口,时效大大增加。差评!
后记:流水码建议使用系统自带的,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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」