加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

RFC几种调用方式及使用

(2013-05-24 20:18:11)
分类: SAP-ABAP

RFC调用分为:1.sRFC( synchronous RFC)同步调用;2. aRFC(asynchronous RFC)异步调用 ;3. tRFC(transactional RFC) 事务性调用;4. qRFC(queue(d) RFC)队列式调用 5. pRFC(Parallel RFC) 并行调用。

sRFC:是RFC的第一个版本,它要求连接的双方是同步的工作方式,即都是在可用状态才能够实现成功调用。

aRFC:这种RFC可以实现异步的RFC调用方式,它可以进行多个并发调用,并且不要求被调用系统的可用状态。发出调用系统会一直尝试直到获得被调用系统的应答。它通常用于当你需要提高系统并行调用多个RFC的效率,相对于强制等待程序的结果,它的效率更高。

tRFC:是对aRFC进行相关技术改进后的一个RFC版本,其于ARFC相同点是实现异步调用,其优点是可以将多个调用进行LUW分组处理, 并只执行一次运行。现在aRFC基本上已经停用。
qRFC:是tRFC的一个增强版本,它保证了所传输数据的处理次序。
pRFC:是一种特殊的RFC,它是aRFC的一种扩展类型。因为它改善了系统的性能,在执行大量的aRFC时。SAP 使用它在MRP里面提高速度。但是它只能执行在同一个系统和同一个client里。

 

 pRFC(Parallel RFC) 并行调用示例:

report  zp_explosion_gps.

types: begin of task_type,
       name type string,
       dest type string,
     end of task_type.
data: flag type c.
data: param type value 2.
data: task_list type standard table of task_type,
            task_wa   type task_type,
            rcv_jobs  type i,
            mess      type length 80.
data info type rfcsi.
data: snd_jobs  type i,
      exc_flag  type i,
      indx      type length 4,
      v_index   type i,
      name      type length 8.

data: t_mast type standard table of mast.

data: t_data type standard table of zluxit_s_bom,
      t_data_app type standard table of zluxit_s_bom.
types: begin of s_sku,
        matnr type ztskurelease-matnr,
        werks type ztskurelease-werks,
        stlal type ztskurelease-stlal,
        j_3asize type ztskurelease-j_3asize,
        zstatus type ztskurelease-zstatus,
        zindex type i,
      end of s_sku.
data: t_ztskurelease type standard table of s_sku.
field-symbols:  type s_sku.


data: t_stb type standard table of stpox.
data: t_stb_app type standard table of stpox.
field-symbols:  type stpox.


select single zpar_proc from zil_parallel into param
  where oltpsource 'Z_ILB_DSATTR002_V4'.


import t_data to t_data from memory id 'DATA_GPS'.

select from mast into table t_mast
  for all entries in t_data
  where matnr t_data-matnr and
        werks t_data-werks and
        stlal t_data-stlal and
        stlan '1'.

select matnr werks stlal j_3asize zstatus from ztskurelease into table t_ztskurelease
  for all entries in t_mast
  where matnr t_mast-matnr and
        werks t_mast-werks and
        stlal t_mast-stlal.
sort t_ztskurelease by matnr werks stlal.
refresh t_data.
v_index 1.
loop at t_ztskurelease assigning .
  -zindex v_index.
  v_index v_index 1.
  if v_index gt param.
    v_index 1.
  endif.
endloop.

do param times.
  indx sy-index.
  v_index sy-index.
  concatenate 'Task' indx into name.
  call function 'ZCALL_GPS'
    starting new task name
    destination in group 'parallel_generators'
    performing return_info on end of task
    exporting
      index          v_index
    tables
      t_ztskurelease t_ztskurelease.
     CALLING object=>GET_Z_ILC_DSATTR01 on end of task.
  case sy-subrc.
    when 0.
      snd_jobs snd_jobs 1.
    when or 2.
      message mess type 'I'.
    when 3.
      if snd_jobs >= and
         exc_flag 0.
        exc_flag 1.
        wait until rcv_jobs >= snd_jobs
             up to seconds.
      endif.
      if sy-subrc 0.
        exc_flag 0.
      else.
        message 'Resource failure' type 'I'.
      endif.
    when others.
      message 'Other error' type 'I'.
  endcase.

enddo.
wait until rcv_jobs >= snd_jobs.

export t_data from t_data to memory id 'DATA_GPS'.
*&---------------------------------------------------------------------*
*&      Form  return_info
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
form return_info using index.
  receive results from function 'ZCALL_GPS'
  importing
    index v_index
  tables
    t_data_out t_data_app
  exceptions
    system_failure        message mess
    communication_failure message mess.
  rcv_jobs rcv_jobs 1.
  if sy-subrc eq 0.
    append lines of t_data_app to t_data.
  endif.
endform.                    "return_info

 

. pRFCParallel RFC) 并行调用。

**&---------------------------------------------------------------------*

**& Report  ZP_EXPLOSION_DWH_PARALLEL_V2

**&

**&---------------------------------------------------------------------*

**&

**&

**&---------------------------------------------------------------------*

 

REPORT  zp_explosion_dwh_parallel_v2.

 

TYPES: BEGIN OF task_type,

       name TYPE string,

       dest TYPE string,

     END OF task_type.

DATA: flag TYPE c.

DATA: param TYPE i VALUE 2.

DATA: task_list TYPE STANDARD TABLE OF task_type,

      task_wa   TYPE task_type,

      rcv_jobs  TYPE i,

      mess      TYPE c LENGTH 80.

DATA info TYPE rfcsi.

DATA: snd_jobs  TYPE i,

      exc_flag  TYPE i,

      indx      TYPE c LENGTH 4,

      v_index   TYPE i,

      name      TYPE c LENGTH 8.

 

DATA: t_data TYPE STANDARD TABLE OF zluxit_s_bom,

      t_data_app TYPE STANDARD TABLE OF zluxit_s_bom.

 

TYPES: BEGIN OF s_sku,

        matnr TYPE ztskurelease-matnr,

        werks TYPE ztskurelease-werks,

        stlal TYPE ztskurelease-stlal,

        j_3asize TYPE ztskurelease-j_3asize,

        zstatus TYPE ztskurelease-zstatus,

        loekz TYPE ztskurelease-loekz,

        zindex TYPE i,

      END OF s_sku.

DATA: t_ztskurelease TYPE STANDARD TABLE OF s_sku.

FIELD-SYMBOLS: TYPE s_sku.

 

 

* Begin Modification 001 AS

* Modified on 31.10.2012

DATA: gv_max_pbt_wps        TYPE i,

      gv_free_pbt_wps       TYPE i,

      gv_free_percent(5)    TYPE p DECIMALS 2,

      gv_set_id             TYPE sethier-setid,

      gv_tobe_free_percent  TYPE sy-tabix,

      gv_flg_resubmit,

      gv_max_index          TYPE sy-tabix,

      gv_max_call_channel   TYPE i.

 

DATA: gt_set_values TYPE STANDARD TABLE OF rgsb4.

FIELD-SYMBOLS: TYPE rgsb4.

CONSTANTS gc_set_name(21) TYPE c  VALUE 'ZIL_PARALLEL_DIA_FREE'.

* End of modification 001

 

SELECT SINGLE zpar_proc FROM zil_parallel INTO param

  WHERE oltpsource = 'Z_ILB_DSATTR003_V2'.

 

 

IMPORT t_data TO t_data FROM MEMORY ID 'DATA_DWH'.

 

 

SELECT matnr werks stlal j_3asize zstatus loekz FROM ztskurelease INTO TABLE t_ztskurelease

  FOR ALL ENTRIES IN t_data

  WHERE matnr EQ t_data-matnr AND

        werks EQ t_data-werks AND

        stlal EQ t_data-stlal.

SORT t_ztskurelease BY matnr werks stlal j_3asize.

 

* Begin Modification 001 AS

* Modified on 31.10.2012

 

* Initialize the System

CLEAR: gv_free_pbt_wps, gv_max_pbt_wps, gv_free_pbt_wps.

 

* Read Value of free channel percentage from custom SET

CLEAR gv_set_id.

* Get Set ID

CALL FUNCTION 'G_SET_GET_ID_FROM_NAME'

  EXPORTING

  CLIENT                         =

    shortname                      = gc_set_name

  OLD_SETID                      =

  TABNAME                        =

  FIELDNAME                      =

  KOKRS                          =

  KTOPL                          =

  LIB                            =

  RNAME                          =

  SETCLASS                       =

  CHECK_SET_EMPTY                = ' '

  SUPRESS_POPUP                  = ' '

  NO_DYNAMIC_SETS                = ' '

  IMPORTING

    new_setid                      = gv_set_id

  SET_INFO                       =

* TABLES

  T_SETS                         =

  EXCEPTIONS

    no_set_found                   = 1

    no_set_picked_from_popup       = 2

    wrong_class                    = 3

    wrong_subclass                 = 4

    table_field_not_found          = 5

    fields_dont_match              = 6

    set_is_empty                   = 7

    formula_in_set                 = 8

    set_is_dynamic                 = 9

    OTHERS                         = 10

          .

IF sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

        WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

 

* Get Set Values

IF NOT gv_set_id IS INITIAL.

  REFRESH gt_set_values.

  CALL FUNCTION 'G_SET_GET_ALL_VALUES'

    EXPORTING

    CLIENT                      = ' '

    FORMULA_RETRIEVAL           = ' '

    LEVEL                       = 0

      setnr                       = gv_set_id

    VARIABLES_REPLACEMENT       = ' '

    TABLE                       = ' '

    CLASS                       = ' '

    NO_DESCRIPTIONS             = 'X'

    NO_RW_INFO                  = 'X'

    DATE_FROM                   =

    DATE_TO                     =

    FIELDNAME                   = ' '

    TABLES

      set_values                  = gt_set_values

    EXCEPTIONS

      set_not_found               = 1

      OTHERS                      = 2

            .

  IF sy-subrc <> 0.

  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

ENDIF.

 

CLEAR gv_tobe_free_percent.

READ TABLE gt_set_values ASSIGNING INDEX 1.

IF sy-subrc IS INITIAL.

  MOVE -from TO gv_tobe_free_percent.

ENDIF.

 

CALL FUNCTION 'SPBT_INITIALIZE'

  EXPORTING

    group_name                     = 'parallel_generators'

  IMPORTING

    max_pbt_wps                    = gv_max_pbt_wps   "Max of channels for the system

    free_pbt_wps                   = gv_free_pbt_wps  "Free available channels

  EXCEPTIONS

    invalid_group_name             = 1

    internal_error                 = 2

    pbt_env_already_initialized    = 3

    currently_no_resources_avail   = 4

    no_pbt_resources_found         = 5

    cant_init_different_pbt_groups = 6

    OTHERS                         = 7.

IF sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

        WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

 

CLEAR gv_max_call_channel.

 

gv_max_call_channel = ( ( 100 - gv_tobe_free_percent ) * gv_max_pbt_wps ) / 100.

 

IF gv_max_call_channel LT param.

  MOVE gv_max_call_channel TO param.

ENDIF.

 

CLEAR gv_max_index.

* End Modification 001

 

 

REFRESH t_data.

v_index = 1.

LOOP AT t_ztskurelease ASSIGNING .

  -zindex = v_index.

  v_index = v_index + 1.

  IF v_index GT param.

    v_index = 1.

  ENDIF.

 

* Start Modification 001 AS

* Modified on 31.10.2012

  IF v_index GT gv_max_index.

    MOVE v_index TO gv_max_index.

  ENDIF.

* End Modification 001

 

ENDLOOP.

 

* Start Modification 001 AS

* Modified on 31.10.2012

* Open only needed channels

MOVE gv_max_index TO param.

* End Modification 001

 

DO param TIMES.

  indx = sy-index.

  v_index = sy-index.

  CONCATENATE 'Task' indx INTO name.

 

* Start Modification 001 AS

* Modified on 31.10.2012

  DO.

    CLEAR: gv_free_pbt_wps, gv_max_pbt_wps, gv_free_percent.

    CALL FUNCTION 'SPBT_GET_CURR_RESOURCE_INFO'

      IMPORTING

        max_pbt_wps                 = gv_max_pbt_wps

        free_pbt_wps                = gv_free_pbt_wps

      EXCEPTIONS

        internal_error              = 1

        pbt_env_not_initialized_yet = 2

        OTHERS                      = 3.

    IF sy-subrc <> 0.

      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

    ENDIF.

 

  In case of error exit from do cycle

    IF NOT sy-subrc IS INITIAL OR gv_tobe_free_percent IS INITIAL.

      EXIT.

    ENDIF.

 

  Calc percentage of free channels

    gv_free_percent = gv_free_pbt_wps / gv_max_pbt_wps * 100.

    IF gv_free_percent GT gv_tobe_free_percent.

      EXIT. "It's possible to launch the parallel process

    ENDIF.

  ENDDO.

* End Modification 001

 

  CALL FUNCTION 'ZCALL_DWH'

    STARTING NEW TASK name

    DESTINATION IN GROUP 'parallel_generators'

    PERFORMING return_info ON END OF TASK

    EXPORTING

      index                 = v_index

    TABLES

      t_ztskurelease        = t_ztskurelease

    EXCEPTIONS

      communication_failure = 1

      system_failure        = 2

      resource_failure      = 3

      OTHERS                = 4.

 

     CALLING object=>GET_Z_ILC_DSATTR01 on end of task.

  CASE sy-subrc.

    WHEN 0.

      snd_jobs = snd_jobs + 1.

    WHEN 1 OR 2.

      MESSAGE mess TYPE 'I'.

    WHEN 3.

      IF snd_jobs >= 1 AND

         exc_flag = 0.

        exc_flag = 1.

*VB 19.01.2012 --> modifica per errore resource failure

       WAIT UNTIL rcv_jobs >= snd_jobs

            UP TO 5 SECONDS.

        WHILE rcv_jobs < snd_jobs.

          WAIT UP TO 5 SECONDS.

        ENDWHILE.

 

      Start Modification 001 AS

      Modified on 31.10.2012

        CLEAR gv_flg_resubmit.

        WHILE gv_flg_resubmit IS INITIAL.

          DO.

            CLEAR: gv_free_pbt_wps, gv_max_pbt_wps, gv_free_percent.

            CALL FUNCTION 'SPBT_GET_CURR_RESOURCE_INFO'

              IMPORTING

                max_pbt_wps                 = gv_max_pbt_wps

                free_pbt_wps                = gv_free_pbt_wps

              EXCEPTIONS

                internal_error              = 1

                pbt_env_not_initialized_yet = 2

                OTHERS                      = 3.

            IF sy-subrc <> 0.

              MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

                      WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

            ENDIF.

 

          In case of error exit from do cycle

            IF NOT sy-subrc IS INITIAL OR gv_tobe_free_percent IS INITIAL.

              EXIT.

            ENDIF.

 

          Calc percentage of free channels

            gv_free_percent = gv_free_pbt_wps / gv_max_pbt_wps * 100.

            IF gv_free_percent GT gv_tobe_free_percent.

              EXIT. "It's possible to launch the parallel process

            ENDIF.

          ENDDO.

 

          CALL FUNCTION 'ZCALL_DWH'

            STARTING NEW TASK name

            DESTINATION IN GROUP 'parallel_generators'

            PERFORMING return_info ON END OF TASK

            EXPORTING

              index                 = v_index

            TABLES

              t_ztskurelease        = t_ztskurelease

            EXCEPTIONS

              communication_failure = 1

              system_failure        = 2

              resource_failure      = 3

              OTHERS                = 4.

          CASE sy-subrc.

            WHEN 0.

              snd_jobs = snd_jobs + 1.

              MOVE abap_true TO gv_flg_resubmit.

            WHEN 1 OR 2.

              MOVE abap_true TO gv_flg_resubmit.

            WHEN OTHERS.

          ENDCASE.

        ENDWHILE.

      End Modification 001 AS

 

      ENDIF.

      IF sy-subrc = 0.

        exc_flag = 0.

      ELSE.

        MESSAGE 'Resource failure' TYPE 'I'.

      ENDIF.

    WHEN OTHERS.

      MESSAGE 'Other error' TYPE 'I'.

  ENDCASE.

 

ENDDO.

WAIT UNTIL rcv_jobs >= snd_jobs.

 

EXPORT t_data FROM t_data TO MEMORY ID 'DATA_DWH'.

*&---------------------------------------------------------------------*

*&      Form  return_info

*&---------------------------------------------------------------------*

      text

*----------------------------------------------------------------------*

FORM return_info USING index.

  RECEIVE RESULTS FROM FUNCTION 'ZCALL_DWH'

  IMPORTING

    index = v_index

  TABLES

    t_data_out = t_data_app

  EXCEPTIONS

    system_failure        = 1 message mess

    communication_failure = 2 message mess.

  rcv_jobs = rcv_jobs + 1.

  IF sy-subrc EQ 0.

    APPEND LINES OF t_data_app TO t_data.

  ENDIF.

ENDFORM.                    "return_info

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有