BOBF-案例一

1 案例概述

實(shí)現(xiàn)輸入product的quantity,price后計(jì)算amount,驗(yàn)證product id是否為空。完成prodcut編輯后自動(dòng)計(jì)算order total amount末融,以及計(jì)算create by,create on 等信息暇韧。

Data

  • ROOT(ORDER_ID, TOTAL_AMOUNT_VAL, TOTAL_AMOUNT_CUR, include admin structure)
    • ITEM(PRODUCT_ID, AMOUNT_VAL, AMOUNT_CUR, QUANTITY_VAL, QUANTITY_UNI,PRICE_VAL, PRICE_CUR)

Determination

  • ROOT
    DET_ADMIN_DATA (ROOT has Admin Data and related determination)
    DET_ROOT_AM (call action CALC_TOTAL_AMOUNT)
  • ITEM
    CALC_AMOUNT (after modify)

Validation

  • ITEM
    VAL_BO_CONSISTENCY (validate product exist or not, if not, raise a warning message)

Action

  • ITEM
    CALC_TOTAL_AMOUNT

2 Determination

ROOT

  • DET_ADMIN_DATA
    用來記錄create on勾习,create by,changed on懈玻,changed by相關(guān)信息巧婶,這里不需要我們自己實(shí)現(xiàn),技術(shù)也沒達(dá)到涂乌,套用就行粹舵。
  • DET_ROOT_AM
    在子節(jié)點(diǎn)ITEM編輯完成后,根據(jù)ITEM的AMOUNT計(jì)算ROOT節(jié)點(diǎn)TOTAL AMOUNT骂倘。調(diào)用Action CALC_TOTAL_AMOUNT實(shí)現(xiàn)。調(diào)用action一般采用如下方法巴席,其中历涝,iv_act_key表示所要調(diào)用的action key,it_key表示節(jié)點(diǎn)下每一條數(shù)據(jù)的key漾唉。
    觸發(fā)條件是在ROOT的子節(jié)點(diǎn)ITEM Create和Update 荧库,After Modify,前提條件是
    Determaination
    io_modify->do_action(
      EXPORTING
        iv_act_key    = ZIF_STE_ORDER_C=>SC_ACTION-ROOT-CALC_TOTAL_AMOUNT    " Action
        it_key        = it_key    " Key Table
*        is_parameters =
*      IMPORTING
*        eo_message    =     " Message Object
*        et_failed_key =     " Key Table
*        eo_change     =     " Interface of Change Object
*        et_data       =
    ).

ITEM

  • CALC_AMOUNT
    觸發(fā)條件是After Modify赵刑。
    在輸入ITEM相關(guān)數(shù)據(jù)后分衫,根據(jù)輸入的PRICE_VAL, QUANTITY_VAL計(jì)算AMOUNT_VAL并將結(jié)果綁定。難點(diǎn)在于獲取輸入數(shù)據(jù)以及綁定結(jié)果般此。具體操作如下:
    io_read->retrieve是獲取輸入值蚪战,iv_node是當(dāng)前node的key值牵现,it_key表示當(dāng)前節(jié)點(diǎn)下每一條數(shù)據(jù)key,iv_fill_dataet_data綁定使用表示填充值,et_data表示結(jié)果集,iv_before_image為true表示讀取修改前的值
    /scmtms/cl_mod_helper=>mod_update_single是將結(jié)果綁定到字段邀桑,is_data是要綁定的值瞎疼,iv_node是當(dāng)前node的key值,iv_key是每一行數(shù)據(jù)的key值壁畸,it_changed_fields是要被綁定值的key值贼急。
    對(duì)于綁定值有兩種方法,注釋掉的部分為方法二捏萍。
    DATA: lt_item TYPE zste_t_ord_item,
          ls_item TYPE zste_s_ord_item,
          lt_mod  TYPE /bobf/t_frw_modification,
          lr_item TYPE REF TO zste_s_ord_item.
    FIELD-SYMBOLS: <ls_mod> LIKE LINE OF lt_mod.

    WRITE: ls_item-product_id.
    io_read->retrieve(
      EXPORTING
        iv_node                 =  zif_ste_order_c=>sc_node-item   " Node Name
        it_key                  =  it_key   " Key Table
*        iv_before_image         = ABAP_FALSE    " Data Element for Domain BOOLE: TRUE (="X") and FALSE (=" ")
*        iv_fill_data            = ABAP_TRUE    " Data element for domain BOOLE: TRUE (='X') and FALSE (=' ')
*        it_requested_attributes =     " List of Names (e.g. Fieldnames)
      IMPORTING
*        eo_message              =     " Message Object
        et_data                 =   lt_item  " Data Return Structure
*        et_failed_key           =     " Key Table
*        et_node_cat             =     " Node Category Assignment
    ).

    LOOP AT lt_item INTO ls_item.
      ls_item-amount_val = ls_item-price_val * ls_item-quantity_val.
      ls_item-amount_cur = ls_item-price_cur.

      /scmtms/cl_mod_helper=>mod_update_single(
        EXPORTING
         is_data            =  ls_item
         iv_node            =  zif_ste_order_c=>sc_node-item  " Node
         iv_key             =  ls_item-key   " NodeID
         it_changed_fields  =  VALUE #( ( zif_ste_order_c=>sc_node_attribute-item-amount_val )
                                          ( zif_ste_order_c=>sc_node_attribute-item-amount_cur ) )  " List of Names (e.g. Fieldnames)
*          iv_autofill_fields = 'X'    " 'X' -> all not readonly fields will be determined
*          iv_bo_key          =     " Business Object
*        importing
*          es_mod             =     " Change
        CHANGING
          ct_mod             =  lt_mod   " Changes
      ).
    ENDLOOP.

*    LOOP AT lt_item INTO ls_item.
*      ls_item-amount_val = ls_item-price_val * ls_item-quantity_val.
*      ls_item-amount_cur = ls_item-price_cur.
*
*      APPEND INITIAL LINE TO lt_mod ASSIGNING <ls_mod>.
*      CREATE DATA lr_item.
*      lr_item->* = ls_item.
*      <ls_mod>-change_mode = /bobf/if_frw_c=>sc_modify_update.
*      <ls_mod>-association = zif_ste_order_c=>sc_association-root-item.
*      <ls_mod>-source_node = zif_ste_order_c=>sc_node-root.
*      <ls_mod>-node = zif_ste_order_c=>sc_node-item.
*      <ls_mod>-key = lr_item->key.
*      <ls_mod>-data = lr_item.
*    ENDLOOP.

    IF lt_mod IS NOT INITIAL.
      io_modify->do_modify( it_modification = lt_mod ).
    ENDIF.

3 Validation

ITEM

  • VAL_BO_CONSISTENCY
    觸發(fā)條件


    image.png
image.png

驗(yàn)證ITEM輸入是否存在PRODUCT ID太抓。主要難點(diǎn)在于錯(cuò)誤信息顯示,實(shí)現(xiàn)如下
首先要在T-Code:se91種創(chuàng)建message令杈,/scmtms/cl_msg_helper=>add_message用于顯示提示信息

message management

DATA: ls_item TYPE zste_s_ord_item,
          lt_item TYPE zste_t_ord_item,
          lv_msg  TYPE string,
          ls_msg  TYPE symsg.
    CLEAR eo_message.

    io_read->retrieve(
      EXPORTING
        iv_node                 =  zif_ste_order_c=>sc_node-item  " Node Name
        it_key                  =   it_key  " Key Table
*        iv_before_image         = ABAP_FALSE    " Data Element for Domain BOOLE: TRUE (="X") and FALSE (=" ")
*        iv_fill_data            = ABAP_TRUE    " Data element for domain BOOLE: TRUE (='X') and FALSE (=' ')
*        it_requested_attributes =     " List of Names (e.g. Fieldnames)
      IMPORTING
*        eo_message              =     " Message Object
         et_data                 =   lt_item  " Data Return Structure
*        et_failed_key           =     " Key Table
*        et_node_cat             =     " Node Category Assignment
    ).

    LOOP AT lt_item INTO ls_item.
      IF ls_item-product_id IS INITIAL.
        MESSAGE e001(zste_order) INTO lv_msg.
        MOVE-CORRESPONDING sy TO ls_msg.
        /scmtms/cl_msg_helper=>add_message(
          EXPORTING
*          iv_bopf_location_key =     " Det/Val execution node instance key
            is_msg               =  ls_msg   " Structure of Message Variables
            iv_bo_key            =  is_ctx-bo_key   " Business Object
            iv_node              =  is_ctx-node_key   " Node Name
            iv_key               =  ls_item-key   " Key
            iv_attribute         =  zif_ste_order_c=>sc_node_attribute-item-product_id   " Field Name
            iv_detlevel          = /scmtms/cl_applog_helper=>sc_al_detlev_default    " Application Log: Level of detail
            iv_probclass         = /scmtms/cl_applog_helper=>sc_al_probclass_important    " Application log: Message problem class
*          iv_add_context_info  = ABAP_FALSE    " Generate BO instance specific message context
          CHANGING
            co_message           =   eo_message  " Interface of Message Object
        ).
        /scmtms/cl_common_helper=>insert_key(
          EXPORTING
            iv_key =  ls_item-key   " NodeID
*    is_key =     " Node Key
          CHANGING
            ct_key =   et_failed_key  " Key Table
        ).
      ENDIF.
    ENDLOOP.

4 Action

ROOT

  • CALC_TOTAL_AMOUNT
    難點(diǎn)主要在于ROOT節(jié)點(diǎn)獲取子節(jié)點(diǎn)ITEM的值走敌,以及將計(jì)算結(jié)果綁定到對(duì)應(yīng)字段。
    ROOT節(jié)點(diǎn)獲取子節(jié)點(diǎn)ITEM的值使用io_read->retrieve_by_association这揣,此方法中參數(shù)iv_fill_data的默認(rèn)值為false悔常;在將結(jié)果綁定到對(duì)應(yīng)字段時(shí),應(yīng)注意先讀取數(shù)據(jù)值
   DATA: lt_item TYPE zste_t_ord_item,
          ls_item TYPE zste_s_ord_item,
          ls_root TYPE zste_s_ord_root_k,
          lt_root TYPE zste_t_ord_root_k,
          lt_mod  TYPE /bobf/t_frw_modification.

    io_read->retrieve_by_association(
      EXPORTING
        iv_node                 =  zif_ste_order_c=>sc_node-root   " Node Name
        it_key                  =  it_key   " Key Table
        iv_association          =  zif_ste_order_c=>sc_association-root-item   " Name of Association
*        is_parameters           =
*        it_filtered_attributes  =     " List of Names (e.g. Fieldnames)
        iv_fill_data            = abap_true    " Data Element for Domain BOOLE: TRUE (="X") and FALSE (=" ")
*        iv_before_image         = ABAP_FALSE    " Data Element for Domain BOOLE: TRUE (="X") and FALSE (=" ")
*        it_requested_attributes =     " List of Names (e.g. Fieldnames)
      IMPORTING
*        eo_message              =     " Message Object
        et_data                 =  lt_item   " Data Return Structure
*        et_key_link             =     " Key Link
*        et_target_key           =     " Key Table
*        et_failed_key           =     " Key Table
    ).

    io_read->retrieve(
      EXPORTING
        iv_node                 = zif_ste_order_c=>sc_node-root    " Node Name
        it_key                  = it_key    " Key Table
*        iv_before_image         = ABAP_FALSE    " Data Element for Domain BOOLE: TRUE (="X") and FALSE (=" ")
*        iv_fill_data            = ABAP_TRUE    " Data element for domain BOOLE: TRUE (='X') and FALSE (=' ')
*        it_requested_attributes =     " List of Names (e.g. Fieldnames)
      IMPORTING
*        eo_message              =     " Message Object
        et_data                 =  lt_root   " Data Return Structure
*        et_failed_key           =     " Key Table
*        et_node_cat             =     " Node Category Assignment
    ).

    LOOP AT lt_root INTO ls_root.
      LOOP AT lt_item INTO ls_item.
        ls_root-total_amount_val = ls_root-total_amount_val + ls_item-amount_val.
        ls_root-total_amount_cur = ls_item-amount_cur.
      ENDLOOP.
      /scmtms/cl_mod_helper=>mod_update_single(
        EXPORTING
          is_data            = ls_root
          iv_node            = zif_ste_order_c=>sc_node-root    " Node
          iv_key             = ls_root-key " NodeID
          it_changed_fields  = VALUE #( ( zif_ste_order_c=>sc_node_attribute-root-total_amount_val )
                                        ( zif_ste_order_c=>sc_node_attribute-root-total_amount_cur ) )  " List of Names (e.g. Fieldnames)
*       iv_autofill_fields = 'X'    " 'X' -> all not readonly fields will be determined
*       iv_bo_key          =     " Business Object
*    IMPORTING
*       es_mod             =     " Change
       CHANGING
          ct_mod             =  lt_mod   " Changes
      ).
    ENDLOOP.

    IF lt_mod IS NOT INITIAL.
      io_modify->do_modify( it_modification = lt_mod ).
    ENDIF.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末给赞,一起剝皮案震驚了整個(gè)濱河市机打,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌片迅,老刑警劉巖残邀,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狡蝶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門脐彩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胁艰,你說我怎么就攤上這事。” “怎么了蹋砚?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摄杂。 經(jīng)常有香客問我坝咐,道長(zhǎng),這世上最難降的妖魔是什么析恢? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任墨坚,我火速辦了婚禮,結(jié)果婚禮上映挂,老公的妹妹穿的比我還像新娘泽篮。我一直安慰自己盗尸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布咪辱。 她就那樣靜靜地躺著振劳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪油狂。 梳的紋絲不亂的頭發(fā)上历恐,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音专筷,去河邊找鬼弱贼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛磷蛹,可吹牛的內(nèi)容都是我干的吮旅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼味咳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼庇勃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起槽驶,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤责嚷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掂铐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罕拂,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年全陨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爆班。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辱姨,死狀恐怖柿菩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雨涛,我是刑警寧澤枢舶,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站镜悉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏医瘫。R本人自食惡果不足惜侣肄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醇份。 院中可真熱鬧稼锅,春花似錦吼具、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锥债,卻和暖如春陡蝇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哮肚。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工登夫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人允趟。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓恼策,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親潮剪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涣楷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)抗碰,斷路器狮斗,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵勝奧閱讀 4,764評(píng)論 0 1
  • 哦~~理智的生活~每時(shí)每刻腦袋里都有兩個(gè)小人在做斗爭(zhēng),不得不說改含,一個(gè)可以控制自己的人是快樂的情龄! 今天學(xué)習(xí)自我控制,...
    念心心turbo閱讀 162評(píng)論 0 1
  • 哈哈哈哈
    甜啾閱讀 106評(píng)論 0 0
  • 量子創(chuàng)意課第二堂課“找出自己的受限點(diǎn)捍壤,你的解答就藏在你的問題”骤视,有一段《讓天賦自由》里的說辭:“天命,是指喜歡做的...
    君羊的小宇宙閱讀 305評(píng)論 0 2