日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ABAP中的subroutine和function module

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ABAP中的subroutine和function module 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 子程序變量(參數)類型
      • 1.1 by value
      • 1.2 by value & result
      • 1.3 by reference
    • 2. function module

如果我不是一步走到頭。那我加個模塊化的子程序。
這個模塊化的子程序,是個獨立的小個體,可以被重復使用。
也就是給它的參數和它給出的參數不一樣。

1. 子程序變量(參數)類型

在整個程序里,定義參數變量可以在主程序,也可以在子程序。主程序就是大家都能用,子程序就是只有我自己個能用。
當我在主程序中定義了變量,而我要把主程序的變量傳遞給子程序啊,我的主程序變量就是實參,子程序的變量就是形參。

DATA: A type ...,B type ...,C type .... Perform xyz using A B C.Form xyz Using P1 type ...P2 type...P3 type... Endform.

2020.03.29再來補充:
對于從caller傳遞實參給子例程形參的方式三種:

  • by value : 參數值是復制給子例程的。復制完了就跟實參沒關系了。我倆是獨立自主的了,互不干擾,我改了也不會改你外面的參數。
  • PERFORM mysub USING myvar1.FORM mysub USING VALUE(subvar1) TYPE i. .. ENDFORM.
  • by reference:這個意思是只把我caller的參數內存地址(parameter memory location)給子例程,那么子例程里做了任何能更改我caller的參數的,都會直接把我改掉。
  • PERFORM mysub USING [or CHANGING] myvar1.FORM mysub USING [or CHANGING] subvar1 TYPE i. .. ENDFORM.
  • by value&result: 把這個放最下面,其實這個是前兩者的混合體可以說。caller會把參數copy給子例程,也就是還是用value(),但是子例程來跑,如果沒有錯,那么子例程把結果返回給caller并且改掉它的參數。如果有錯,那就不改它的參數。所以這里用的是CHANGING。
  • PERFORM mysub CHANGING myvar1.FORM mysub CHANGING value(subvar1) TYPE ANY. .. ENDFORM.

    當然傳遞給子例程的參數的數據類型,是由caller決定的咯。
    所以你子例程里面,參數類型要么沒有,要么TYPE ANY。要么就是為了看起來方便,給一個TYPE的。

    1.1 by value

    這種變量的定義語法就是Using VALUE(P1) 變量在VALUE后面的括號里。
    就是說只把主程序實參的值拿過來到子程序里用。但是我這里使用的只是實參的值,不會再改回實參里去的。
    主程序讓我執行一些任務,我需要用它的變量值。

    Perform xyz using A B C. Form xyz Using VALUE(P1) type ...VALUE(P2) type...VALUE(P3) type... Endform.

    1.2 by value & result

    主程序讓我來基于一些操作,條件來更改一些值。我需要把更改后的值再傳回主程序去。

    Perform xyz Using/changing A B C. Form xyz Changing VALUE(P1) type ...VALUE(P2) type...VALUE(P3) type... Endform.

    或者是這樣:用Using,但是沒有VALUE和括號

    Form xyz Using P1 type ...P2 type...P3 type... Endform.

    1.3 by reference

    這種呢,就是形參直接指向實參,你在子程序里用的形參,實際上會直接分配到實參。

    Perform xyz changing A B C. Form xyz Changing P1 type ...P2 type...P3 type... Endform.

    SAP給的解釋是subroutine已經過時了。。。我覺得能看懂還是很必要的。不過也不難。主要就是三種調用方法。
    多學點也不吃虧。

    INCLUDE ZFBI_TESTTOP . " Global Data* INCLUDE ZFBI_TESTO01 . " PBO-Modules * INCLUDE ZFBI_TESTI01 . " PAI-Modules INCLUDE ZFBI_TESTF01 . " FORM-Routines *PARAMETERS:pa_01 type int4, * pa_02 type int4. PARAMETERS: o_carrid TYPE S_CARR_ID. DATA: o_cityfr type S_FROM_CIT.START-OF-SELECTION.Perform get_airline_detailUSING o_carrid /*就是程序運行正確就改掉*/CHANGING o_cityfr. /*這個是地址傳遞,直接改*/write: / o_cityfr. *&---------------------------------------------------------------------* *& Include ZFBI_TESTF01 *&---------------------------------------------------------------------* FORM get_airline_detailUsing VALUE(v_carrid) type S_CARR_IDCHANGING v_cityfr type S_FROM_CIT.types: begin of ty_cust.INCLUDE STRUCTURE spfli.types: CARRNAME type S_CARRNAME,end of ty_cust.DATA: wa_scarr TYPE SCARR,it_scarr type table of SCARR,it_cust type table of ty_cust,wa_cust type ty_cust.select * into CORRESPONDING FIELDS OF table it_scarr from SCARR.select * from spfli into CORRESPONDING FIELDS OF table it_cust where carrid = v_carrid.LOOP at it_cust into wa_cust.read table it_scarr into wa_scarr WITH KEY carrid = wa_cust-carrid.if sy-subrc = 0.wa_cust-carrname = wa_scarr-carrname.endif.write: / wa_cust-CITYFROM .ENDLOOP. ENDFORM.

    2. function module

    也許form過時了,但是function module還沒有過時吧。
    subroutine一般就是在一個程序內部進行調用,你看到的form一般就放在在這個程序的F的include里面。那么對于一個很大的程序,這么調用是可以的,因為你可能程序中需要調用好幾次?;蛘邽榱丝雌饋矸奖?#xff0c;給放到一個include里面去。
    但是function module是可以在不同的程序間調用的,哪里你都可以調用啊。

    function module是附在一個function group里的。只要是這個SAP 系統里的程序,都可以調用function module。
    SAP也提供了大量的function module。
    誰call這個function module呢,誰可以提供import進這個function module的數據。export呢就是把結果從function module給export出去。
    changing 就是一邊導入,一邊導出。
    table呢和changing是一樣的,就是它里面只能是內表。
    exceptions就是來rasing error的。

    function module可以在SAP系統內部任何程序被調用,同時如果是個可以在程序外調用的function module,那它就是一個remote function call,RFC。

    填完了import和export,在source code里面你就能看到了:



    在exceptions里面也填上:


    好了,來這里激活,死活激活不了了:doesn’t begin with function pool
    這鬼玩意還給我報了個ABAP的runtime error,光看這個error message,實在看不懂講的什么鬼東西。
    哎,快下班了,心情急躁的很。

    錯誤里頭還是個德文的:指令缺失,或者是程序類型為include。
    反正是不知所云。

    最后才發現了根本原因,因為我是連帶功能組一起建的,沒激活那個,就來直接激活function module。就激活不起來。
    鬼玩意干啥啥都要激活。

    激活還讓我找了半天。

    激活后,這個function module就可以被其他的program調用了。
    那么怎么調用呢?
    調用的話好歹得告訴人家你用什么參數跑吧。
    就是這么個調法。寫寫玩還是很有意思的。代碼這玩意,教是教不會的,只能自己去寫,去用。

    總結

    以上是生活随笔為你收集整理的ABAP中的subroutine和function module的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。