BOBF-案例一

1 案例概述

实现输入product的quantity,price后计算amount,验证product id是否为空。完成prodcut编辑后自动计算order total amount,以及计算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相关信息,这里不需要我们自己实现,技术也没达到,套用就行。
  • DET_ROOT_AM
    在子节点ITEM编辑完成后,根据ITEM的AMOUNT计算ROOT节点TOTAL AMOUNT。调用Action CALC_TOTAL_AMOUNT实现。调用action一般采用如下方法,其中,iv_act_key表示所要调用的action key,it_key表示节点下每一条数据的key。
    触发条件是在ROOT的子节点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
    触发条件是After Modify。
    在输入ITEM相关数据后,根据输入的PRICE_VAL, QUANTITY_VAL计算AMOUNT_VAL并将结果绑定。难点在于获取输入数据以及绑定结果。具体操作如下:
    io_read->retrieve是获取输入值,iv_node是当前node的key值,it_key表示当前节点下每一条数据key,iv_fill_dataet_data绑定使用表示填充值,et_data表示结果集,iv_before_image为true表示读取修改前的值
    /scmtms/cl_mod_helper=>mod_update_single是将结果绑定到字段,is_data是要绑定的值,iv_node是当前node的key值,iv_key是每一行数据的key值,it_changed_fields是要被绑定值的key值。
    对于绑定值有两种方法,注释掉的部分为方法二。
    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
    触发条件


    image.png
image.png

验证ITEM输入是否存在PRODUCT ID。主要难点在于错误信息显示,实现如下
首先要在T-Code:se91种创建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
    难点主要在于ROOT节点获取子节点ITEM的值,以及将计算结果绑定到对应字段。
    ROOT节点获取子节点ITEM的值使用io_read->retrieve_by_association,此方法中参数iv_fill_data的默认值为false;在将结果绑定到对应字段时,应注意先读取数据值
   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.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵胜奥阅读 4,783评论 0 1
  • 哦~~理智的生活~每时每刻脑袋里都有两个小人在做斗争,不得不说,一个可以控制自己的人是快乐的! 今天学习自我控制,...
    念心心turbo阅读 162评论 0 1
  • 哈哈哈哈
    甜啾阅读 107评论 0 0
  • 量子创意课第二堂课“找出自己的受限点,你的解答就藏在你的问题”,有一段《让天赋自由》里的说辞:“天命,是指喜欢做的...
    君羊的小宇宙阅读 306评论 0 2