From: Wang, Jerry

Sent: Monday, August 25, 2014 6:12 PM

Subject: [BRF] 使用代码创建BRF ruleset

该代码实现的功能:

1 为existing function创建一个空的ruleset

2 创建一条rule以及两个rule variable Customer Discount和promotion discount

rule的规则是: 如果promotion的折扣 大于customer,则使用promotion的折扣进行price计算,否则使用customer的折扣进行计算。

3 创建两个formular分别进行基于customer和promotion折扣的price计算

REPORT zcreate_ruleset.DEFINE write_errors.IF &1 IS NOT INITIAL.LOOP AT &1 ASSIGNING <ls_message>.WRITE: <ls_message>-text.ENDLOOP.RETURN.ENDIF.END-OF-DEFINITION.DATA:   lv_app_id      TYPE if_fdt_types=>id,lv_func_id     TYPE if_fdt_types=>id,lv_cust_ele_id TYPE if_fdt_types=>id,lv_item_ele_id TYPE if_fdt_types=>id,lv_fina_ele_id TYPE if_fdt_types=>id,lv_shel_ele_id TYPE if_fdt_types=>id.INITIALIZATION.lv_app_id = 'FA163E8EAB031EE48B847A9EF751D5F0'.lv_func_id = 'FA163E8EAB031EE48B847ADC6A96D5F0'.lv_cust_ele_id = 'FA163E8EAB031EE48B847ADC6A96F5F0'.lv_item_ele_id = 'FA163E8EAB031EE48B847ADC6A9715F0'.lv_fina_ele_id = 'FA163E8EAB031EE48B847ADC6A9775F0'.lv_shel_ele_id = 'FA163E8EAB031EE48B847ADC6A9755F0'.START-OF-SELECTION.DATA: lo_ruleset     TYPE REF TO if_fdt_ruleset,lo_factory     TYPE REF TO if_fdt_factory,lts_rule       TYPE if_fdt_ruleset=>ts_rule,lts_variable   TYPE if_fdt_ruleset=>ts_variable,lt_message     TYPE if_fdt_types=>t_message,lv_boolean     TYPE abap_bool,lts_expression TYPE if_fdt_ruleset=>ts_init_expr.FIELD-SYMBOLS: <ls_message> TYPE if_fdt_types=>s_message.lo_factory = cl_fdt_factory=>if_fdt_factory~get_instance(iv_application_id = lv_app_id ).lo_ruleset ?= lo_factory->get_ruleset( ).lo_ruleset->if_fdt_transaction~enqueue( ).lo_ruleset->set_ruleset_switch( iv_switch = if_fdt_ruleset=>gc_switch_on ).lo_ruleset->if_fdt_admin_data~set_name( 'price_calculation_rules' ).lo_ruleset->if_fdt_admin_data~set_texts( iv_short_text = 'price calc. rules'iv_text = 'price calculation rules' ).lo_ruleset->set_function_restriction(iv_function_id = lv_func_id ).* WE NEED TO CREATE RULESET VARIABLES AND* ASSIGNED TO lts_variable* Ruleset variables extend the function context,* but within the scope of the ruleset only. they are also based on data objects.DATA: lo_element      TYPE REF TO if_fdt_element,ls_variable     TYPE if_fdt_ruleset=>s_variable,lv_pro_discount TYPE if_fdt_types=>id,lv_cus_discount TYPE if_fdt_types=>id.lo_element ?= lo_factory->get_data_object( iv_data_object_type =if_fdt_constants=>gc_data_object_type_element ).lo_element->if_fdt_transaction~enqueue( ).lo_element->if_fdt_admin_data~set_name( 'customer_discount' ).lo_element->if_fdt_admin_data~set_texts( iv_short_text = 'Customer Discount' ).* SET type for customer_discount: NUMBERlo_element->set_element_type( if_fdt_constants=>gc_element_type_number ).lo_element->set_element_type_attributes(iv_length        = 3iv_decimals      = 2iv_only_positive = abap_true ).ls_variable-position = 1.ls_variable-data_object_id = lo_element->mv_id.INSERT ls_variable INTO TABLE lts_variable.lv_cus_discount = lo_element->mv_id.* CREATE RULE VARIABLE promotion_discountlo_element ?= lo_factory->get_data_object(iv_data_object_type = if_fdt_constants=>gc_data_object_type_element ).lo_element->if_fdt_transaction~enqueue( ).lo_element->if_fdt_admin_data~set_name( 'promotion_discount' ).lo_element->if_fdt_admin_data~set_texts(iv_short_text = 'promotion discount' ).lo_element->set_element_type( if_fdt_constants=>gc_element_type_number ).lo_element->set_element_type_attributes(iv_length        = 3iv_decimals      = 2iv_only_positive = abap_true ).ls_variable-position = 2.ls_variable-data_object_id = lo_element->mv_id.INSERT ls_variable INTO TABLE lts_variable.lv_pro_discount = lo_element->mv_id.* THESE TWO VARIABLES COULD ONLY BE USED WITHIN RULESETlo_ruleset->set_ruleset_variables( lts_variable ).* CREATE DECISION TABLEDATA: lo_decision_table TYPE REF TO if_fdt_decision_table,lts_column        TYPE if_fdt_decision_table=>ts_column,lts_table_data    TYPE if_fdt_decision_table=>ts_table_data,ls_expression     TYPE if_fdt_ruleset=>s_init_expr.lo_decision_table ?= lo_factory->get_expression( iv_expression_type_id =if_fdt_constants=>gc_exty_decision_table ).lo_decision_table->if_fdt_transaction~enqueue( ).lo_decision_table->if_fdt_admin_data~set_name( 'calc_customer_discount' ).lo_decision_table->if_fdt_admin_data~set_texts(iv_short_text = 'calc. cust. discount'iv_text       = 'calculate customer discount' ).* Code for table definition <<<lts_column>>> to be inserted hereDATA: ls_column TYPE if_fdt_decision_table=>s_column.ls_column-col_no = 1\. "customerls_column-object_id = lv_cust_ele_id.ls_column-is_result = abap_false.INSERT ls_column INTO TABLE lts_column.ls_column-col_no = 2\. "itemls_column-object_id = lv_item_ele_id.INSERT ls_column INTO TABLE lts_column.ls_column-col_no = 3\. "customer discountls_column-object_id = lv_cus_discount.ls_column-is_result = abap_true.INSERT ls_column INTO TABLE lts_column.lo_decision_table->set_columns( lts_column ).* SET RESULT DATA OBJECT OF DECISION TABLE TO RULE VARIABLE WE JUST CREATElo_decision_table->if_fdt_expression~set_result_data_object(lv_cus_discount ).* Code for table content <<<lts_table_data>>> to be inserted hereDATA: ls_range      TYPE if_fdt_range=>s_range,ls_table_data TYPE if_fdt_decision_table=>s_table_data.FIELD-SYMBOLS <lv_number> TYPE if_fdt_types=>element_number.ls_range-position = 1.ls_range-sign = if_fdt_range=>gc_sign_include.ls_range-option = if_fdt_range=>gc_option_equal.ls_table_data-col_no = 1\. "start of row 1ls_table_data-row_no = 1.GET REFERENCE OF 'sap' INTO ls_range-r_low_value.INSERT ls_range INTO TABLE ls_table_data-ts_range.INSERT ls_table_data INTO TABLE lts_table_data.* ROW1, COLUMN2CLEAR ls_table_data-ts_range.ls_table_data-col_no = 2.ls_table_data-row_no = 1.GET REFERENCE OF 'ballpen' INTO ls_range-r_low_value.INSERT ls_range INTO TABLE ls_table_data-ts_range.INSERT ls_table_data INTO TABLE lts_table_data.* ROW1, COLUMN3CLEAR ls_table_data-ts_range.ls_table_data-col_no = 3.ls_table_data-row_no = 1.CREATE DATA ls_table_data-r_value TYPE if_fdt_types=>element_number.ASSIGN ls_table_data-r_value->* TO <lv_number>.<lv_number> = '0.15'.INSERT ls_table_data INTO TABLE lts_table_data.* ROW2, COLUMN1CLEAR ls_table_data-r_value.ls_table_data-col_no = 1\. "start of row 2ls_table_data-row_no = 2.GET REFERENCE OF 'sap' INTO ls_range-r_low_value.INSERT ls_range INTO TABLE ls_table_data-ts_range.INSERT ls_table_data INTO TABLE lts_table_data.* ROW2, COLUMN2CLEAR ls_table_data-ts_range.ls_table_data-col_no = 2.ls_table_data-row_no = 2.GET REFERENCE OF 'pencil' INTO ls_range-r_low_value.INSERT ls_range INTO TABLE ls_table_data-ts_range.INSERT ls_table_data INTO TABLE lts_table_data.* ROW2, COLUMN3CLEAR ls_table_data-ts_range.ls_table_data-col_no = 3.ls_table_data-row_no = 2.CREATE DATA ls_table_data-r_value TYPE if_fdt_types=>element_number.ASSIGN ls_table_data-r_value->* TO <lv_number>.<lv_number> = '0.12'.INSERT ls_table_data INTO TABLE lts_table_data.* ROW3, COLUMN3????????????????CLEAR ls_table_data-r_value.ls_table_data-col_no = 3\. "start of row 3ls_table_data-row_no = 3.CREATE DATA ls_table_data-r_value TYPE if_fdt_types=>element_number.ASSIGN ls_table_data-r_value->* TO <lv_number>.<lv_number> = '0'.INSERT ls_table_data INTO TABLE lts_table_data.lo_decision_table->set_table_data( lts_table_data ).ls_expression-position = 1.ls_expression-id = lo_decision_table->mv_id.ls_expression-change_mode = if_fdt_ruleset=>gc_change_mode_update.INSERT ls_expression INTO TABLE lts_expression.lo_ruleset->set_ruleset_initializations( lts_expression ).* TODO: code for rules (lts_rule) to be inserted hereDATA: lo_rule             TYPE REF TO if_fdt_rule,ls_rule             TYPE if_fdt_ruleset=>s_rule,ls_cond_range       TYPE if_fdt_range=>s_param_range,ls_rule_expr        TYPE if_fdt_rule=>s_expression,lt_rule_expr        TYPE if_fdt_rule=>t_expression,lv_formula_cus_disc TYPE if_fdt_types=>id,lv_formula_pro_disc TYPE if_fdt_types=>id.lo_rule ?= lo_factory->get_expression(iv_expression_type_id = if_fdt_constants=>gc_exty_rule ).lo_rule->if_fdt_transaction~enqueue( ).lo_rule->if_fdt_admin_data~set_texts( iv_text = 'apply discount' ).* promotion discount > cusomter discountCLEAR ls_range.ls_cond_range-parameter_id = lv_pro_discount.ls_range-position = 1.ls_range-sign = if_fdt_range=>gc_sign_include.ls_range-option = if_fdt_range=>gc_option_greater.ls_range-low = lv_cus_discount.INSERT ls_range INTO TABLE ls_cond_range-ts_range.lo_rule->set_condition_range( ls_cond_range ).*TODO define formulas, insert missing code laterDATA: lo_formula TYPE REF TO if_fdt_formula,lv_formula TYPE string.lo_formula ?= lo_factory->get_expression(iv_expression_type_id = if_fdt_constants=>gc_exty_formula ).lo_formula->if_fdt_transaction~enqueue( ).lo_formula->if_fdt_admin_data~set_name( 'apply_promotion_discount' ).lo_formula->if_fdt_admin_data~set_texts(iv_short_text = 'apply prom. discount'iv_text       = 'apply promotion discount' ).lo_formula->if_fdt_expression~set_result_data_object(lv_fina_ele_id ). "final price* Final Price = Shelf Price / ( 1 + Promotion Discount )*  lv_formula = ‘00505683359d02ee98fc41ef3591caa8’ &&lv_formula = lv_shel_ele_id &&` / ( 1 + ` && lv_pro_discount && ` )`.lo_formula->set_formula( lv_formula ).lv_formula_pro_disc = lo_formula->mv_id.* The second formula, which will calculate the customer discountlo_formula ?= lo_factory->get_expression(iv_expression_type_id = if_fdt_constants=>gc_exty_formula ).lo_formula->if_fdt_transaction~enqueue( ).lo_formula->if_fdt_admin_data~set_name( 'apply_customer_discount' ).lo_formula->if_fdt_admin_data~set_texts(iv_short_text = 'apply cust. discount'iv_text       = 'apply customer discount' ).lo_formula->if_fdt_expression~set_result_data_object(lv_fina_ele_id ). "final pricelv_formula = lv_shel_ele_id &&` / ( 1 + ` && lv_cus_discount && ` )`.lo_formula->set_formula( lv_formula ).lv_formula_cus_disc = lo_formula->mv_id.ls_rule_expr-position = 1.ls_rule_expr-change_mode = if_fdt_rule=>gc_change_mode_update.ls_rule_expr-expression = lv_formula_pro_disc.INSERT ls_rule_expr INTO TABLE lt_rule_expr.lo_rule->set_true_action_extended( it_expression = lt_rule_expr ).CLEAR lt_rule_expr.ls_rule_expr-expression = lv_formula_cus_disc.INSERT ls_rule_expr INTO TABLE lt_rule_expr.lo_rule->set_false_action_extended( it_expression = lt_rule_expr ).ls_rule-position = 1.ls_rule-rule_id = lo_rule->mv_id.ls_rule-switch = if_fdt_ruleset=>gc_switch_on.INSERT ls_rule INTO TABLE lts_rule.lo_ruleset->set_rules( lts_rule ).WRITE: / 'calling check logic...'.*  lt_message = lo_ruleset->if_fdt_transaction~check( iv_deep = abap_true ).*  write_errors lt_message.WRITE: / 'ruleset check passed, ready for activation'.lo_ruleset->if_fdt_transaction~activate(EXPORTINGiv_deep              = abap_trueIMPORTINGet_message           = lt_messageev_activation_failed = lv_boolean ).write_errors lt_message.lo_ruleset->if_fdt_transaction~save( EXPORTING iv_deep = abap_true ).lo_ruleset->if_fdt_transaction~dequeue(EXPORTING iv_deep = abap_true ).WRITE: / 'Rule set created successfully'.

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

使用代码创建SAP BRF ruleset相关推荐

  1. 测试SAP BRF+ ruleset

    Created by Jerry Wang, last modified on Oct 01, 2014 使用wiki"使用代码创建BRF ruleset"提到的report 创建 ...

  2. SAP BRF+ ruleset里维护多条rule,每条rule逐一执行

    Created by Jerry Wang on Aug 29, 2014 rule1: 如果item 为pencil,context approved为true, 否则为false: insert- ...

  3. 使用代码创建SAP Sales area

    Created by Jerry Wang on Nov 25, 2014 代码如下: REPORT ZPROD_MULTIPLE_CHANGE. PARAMETERS: prd1 type comm ...

  4. 使用代码创建SAP CRM服务请求文档的subject测试数据

    要求所有创建的Service Request的测试数据必须都维护好Subject: 如何用CRM_ORDER_MAINTAIN维护这个field? First have a look at how S ...

  5. 使用nodejs代码在SAP C4C里创建Individual customer

    需求:使用nodejs代码在SAP Cloud for Customer里创建Individual customer实例. 代码: var createAndBind = require('-/jer ...

  6. AndroidStudio git 提交代码,创建分支,合并分支,回滚版本,拉取代码

    主要有: 提交代码,创建分支,合并分支,回滚版本,拉去代码 1 首先电脑中下载git 2 新建的项目把.git 仓库放到项目总中as 工具的右下角 会显示 Git:master 点击有一个弹框如下 然 ...

  7. akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...

    Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...

  8. 在Qt中使用C++代码创建界面

    好儿郎~志在四方 Qt视频教程地址:http://space.bilibili.com/84360636/#!/index 目录视图 摘要视图 订阅 图灵赠书--程序员11月书单    [思考]Pyt ...

  9. 代码创建 WPF 旋转动画

    原文:代码创建 WPF 旋转动画 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a771948524/article/details/9304001 ...

最新文章

  1. plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...
  2. 当 Python 遇到了你的微信好友
  3. 记一次Java动态代理实践
  4. python 2 类与对象
  5. BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
  6. html5 coverflow,使用FancyCoverFlow实现3D无限循环切换视图
  7. 计算机组成原理第二章测试题,计算机组成原理第二章习题答案.doc
  8. Dos命令将合并两个文本文件的内容
  9. 转:LoadRunner检查点使用小结
  10. 21天实战人工智能系列:人工智能产品经理最佳实践(2)
  11. 你还在全量加载iView么?试试手动配一个吧
  12. matlab中定义分段函数,matlab中定义带符号的分段函数
  13. 蔡凯龙:跨界是一种寻求人生宽度的方式
  14. 机器学习常用术语英语词汇
  15. p106矿渣做深度学习踩过的那些坑
  16. 玩转电脑常用的140个技巧
  17. 叶君—国画大师笔下的“忠义千秋”
  18. 第七届河南省程序设计大赛——A 海岛争霸
  19. 5.8 创建查找重复项查询
  20. 软件开发不是一门艺术

热门文章

  1. SQL2005备份集中的数据库备份与现有的数据库不同,错误号码:3154,解决方法...
  2. iphone内关于sqlite开发的相关教程
  3. 智能DNS及其工作原理: CDN实现原理
  4. Windows 8.1下安装Mac OS X 10.8虚拟机
  5. 判断浏览器是否支持某个css属性
  6. 跟我学Java(配光盘)(跟我学)
  7. 20个很酷的CSS3导航菜单制作教程
  8. 数据挖掘学习日志(part2)--主成分法确定权重与R实现
  9. mysql8.0日期类型_Mysql学习-数据类型(日期时间类型)
  10. SAP 电商云 Spartacus UI SSR 单元测试里的 callFake