我的BRF+自學教程(一):公式(formula)


Business Rule Framework Plus(業務規則框架,以下簡稱BRFplus或BRF+)是一個強大的工具, 它允許用戶以直觀的方式對規則建模,並在不同的應用程序中重用這些規則。通過它,業務顧問甚至業務用戶可以自行在系統中實現自定義業務邏輯,而不必求助於程序開發者。

我在早些時間翻譯過一篇BRF+的介紹文章:SAP中的BRF+。如果讀者對這一工具還沒什么概念的話,可以先讀這篇文章。

我打算花些時間掌握這個工具,並將自己學習到的東西寫下來,作為一個文章系列。主要的學習方法是看SAP官方文檔和SCN文章,以及動手操作。本文是這個系列的第一篇,學習內容是公式。

如果你不喜歡理論內容,可以略過第一部分“基礎知識”,直接讀“示例部分”,但我還是建議你在創建好你的第一個Demo之后,回過頭來讀一遍基礎知識部分。

 

本文鏈接:https://www.cnblogs.com/hhelibeb/p/9451960.html

轉載請注明

 

基礎知識

公式功能在BRF+中屬於表達式(Expression)的一種,所以它也被稱為公示表達式。公式表達式用於執行各種計算。 它能提供基本的數學運算(加法,減法,乘法,除法)、更高級的運算(如取冪或二進制AND)、比較(大於,小於等)、以及用於不同目的的各種公式函數,它們支持各種數據類型(日期和時間計算,字符串處理和操作,轉換功能,系統功能等)。 使用者還可以在公式中輸入注釋,以幫助其他人更好地理解特定的計算步驟的目的。

編輯模式

系統提供兩種編輯模式:正常模式和專家模式。它們的主要區別是:專家模式下,用戶可以自由地手動修改公式文本;而正常模式下,用戶只能通過點擊按鈕來輸入公式內容。專家模式提供了更好的自由度和效率,而正常模式可以避免非法輸入的風險。

運算數(Operands)

在公式表達式中,用戶可以使用基本數據對象和表達式作為操作數。此外,如果公式包含以復雜類型的數據對象作為參數的函數(例如,所有表函數都會將表類型作為參數),則也可以在公式中使用結構或表數據對象

上下文數據(Context Data)

在BRFplus工作台中,系統會顯示可被用作公式運算數的數據對象列表。列表中的數據對象繼承自分配了公式表達式的函數的上下文。換句話說,尚未分配給函數的獨立公式表達式無法使用任何上下文數據對象。

總之,公式的運算是對上下文數據的運算。

公式函數(Formula Functions

在公式表達式中,用戶選擇使用各種公式函數,以幫助檢索,轉換和分析數據。 為了更好地概述,函數被分為以下類別:

函數類別

例子

日期時間

以各種單位計算2個時間之間的差值;判斷閏年;從給定的時間中提取任一部分;等等。

字符串處理

拼接、提取字符串;計算字符串長度;計算字符串相似度;等等。

數學函數

對數;冪; 三角函數; 等等。

注意:

傳遞給三角函數的參數必須以弧度給出(一個完整的圓 = 2 Pi)。

系統函數

檢索特定系統信息,比如工廠日歷,操作系統,登陸語言,等等。

表函數

檢索有關在BRFplus表數據對象中的信息,如最大值或最小值,總和,平均值,行數等。

其它功能

轉換數量和金額;數字取整;判斷初始值。

在BRF+工作台,用戶可以按分類查找自己需要的函數,也可以使用過濾器,如下圖:

每個函數都有自己的文檔,其中需求描述、使用示例、參數和注釋信息等,點擊“文檔”列的顯示鏈接,即可以查看,如圖:

用戶可以定義自己的函數,這需要進行一些編程工作,具體可以參考:

How to Create Formula Functions  ( http://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/10e9c96f-0c8b-2b10-6885-f00adbeb314b).

金額數據的取整

在內部,BRF+永遠在數據計算中使用在最大精度,最大精度根據數據對象的定義決定。然而,在涉及到公示表達式的結果是金額數據對象的時候,最大精度不會在結果上面表現出來。在該情況下,BRF+會使用為當前貨幣定義的小數位數,就算為數據對象定義了更多的小數位數,也會被無視。比如,

在一個公示表達式中存在這樣的計算:25 € / 8

雖然內部結果是3.125 €,但是實際得到的結果數據是3.13 €,因為對於歐元而言,自定義表中只定義了2位小數位。

數量的量綱檢查

系統會對包含量綱的數量運算進行特別的檢查,因為實際上只有部分度量單位之間的計算是有意義的,比如:

公式

結果數據對象

有效性

長度 / 時間

速度

長度 / 質量

數字

×

示例部分

上面的內容也許略顯冗長枯燥,下面是一個輕松的step by step的示例,我會創建一個公式,並把它分配給函數,其功能是將兩個輸入參數相加、並輸出結果。此外我也會貼出調用這個BRF+函數的簡單的ABAP代碼。

1,打開BRF+工作台

輸入事務代碼BRF+或者BRFPLUS,如果能夠打開一個包含左側導航欄、有着歡迎界面的瀏覽器頁面(Web Dynpro)應用,說明你可以使用BRF+。如果打不開或者系統提示某些錯誤的話,說明有可能存在配置問題,也可能是你的系統尚不支持BRF+,這種情況下請聯系你的BASIS同事。

2,創建應用程序

點擊圖中左上角的“創建應用程序”,在彈出對話框內輸入應用程序的名字、描述,存儲類型選擇定制(關於選項的區別,參考前文),開發包$tmp。填完后,點擊右下角按鈕“創建並導航到對象”

3,創建數據對象

想要在公式中計算,就要有用於被計算的數據對象。也就是上面提到的上下文數據(Context Data)。

右鍵點擊應用名,選擇創建->數據對象->元素(批量創建),如下圖

 

因為我們要用到3個數據對象(兩個輸入對象,一個輸出對象),所以選擇批量創建。

在彈出窗口中輸入數據技術信息,如下圖,

創建3個數據對象,分別是amount_1,amount_2,amount_result,都是金額類型。點擊確定。

展開左側的應用,可以看到存在三個數據對象,對象狀態是白色菱形,即未激活。依次選擇它們,點擊編輯->激活,激活成功后,對象狀態會變為綠色方塊,

4,創建公式

接下來,右鍵應用程序,選擇創建->表達式->公式,在彈出對話框中輸入公式名,點擊“創建並導航到對象”,

 

點擊“上下文對象”,此時,系統會提示我們尚未把公式分配給函數或規則集,因此無法使用上下文對象,因此我們需要先創建個函數,

 

5,創建函數並分配公式

右鍵應用程序,選擇創建->函數,

在創建好的函數中,選擇模式為“功能模式”,選擇“頂層表達式”為上一步創建的公式,之后點擊“添加現有數據對象”,

在彈出對話框中選中兩個輸入對象,

選擇“結果金額”為結果對象(輸出對象),

點擊“保存”,

6,編輯公式

前往創建的公式,點擊“上下文概覽”,可以看到之前在函數中添加的數據對象,可以使用它們在公式中進行運算,

接下來,為公式分配一個結果數據對象,

這里我們使用的是普通模式的編輯模式,因此,公式的編輯要靠鼠標點擊選項進行,點擊“上下文”區域中的上下文,相應的對象會被添加到公式中,如下圖

依次點擊 金額1,+,金額2,可以得到一個加法公式,

激活公式,

7,模擬函數運行

在導航區域可以看到各個對象的激活情況,將全部對象激活后,函數已經處於可用狀態。我們需要對它的功能進行測試。前往上面創建的函數,

點擊“詳細”中的“模擬”按鈕,就可以模擬函數的運行,測試其工作效果了,

 

在下一屏幕,點擊“繼續”按鈕,

在“模擬數據”部分輸入測試數據,點擊“執行”,

可以看到函數運行后的結果,至此,這個簡單示例就完成了。

8,在ABAP中調用BRF+函數

配置工作已經完成,接下來是開發方面的工作,開發者不需要寫業務邏輯,需要做的是在合適的地方調用已經配置好的函數。

每個BRF+都有一個唯一標識作為ID,可以通過ID來調用函數。可以在函數的“一般”屬性中看到它的ID,如圖,

在SE38創建程序,代碼如下,

REPORT ztest_brfplus.

DATA(lo_fuction) = cl_fdt_factory=>if_fdt_factory~get_instance(
  )->get_function( '005056A477601EE8A7856D04576B0280' ).

DATA: i_amount1 TYPE if_fdt_types=>element_amount,
      i_amount2 LIKE i_amount1.

i_amount1 = VALUE #( number = '12.23' currency = 'EUR' ).
i_amount2 = VALUE #( number = '12.00' currency = 'EUR' ).

" Set the BRFplus function context ( input variables )
DATA(lo_context) = lo_fuction->get_process_context( ).
lo_context->set_value( : iv_name = 'AMOUNT_1' ia_value = i_amount1 ),
                         iv_name = 'AMOUNT_2' ia_value = i_amount2 ).

" Process the BRFplus function
lo_fuction->process(
  EXPORTING io_context = lo_context
  IMPORTING eo_result  = DATA(lo_result) ).

" Retrieve the BRFplus function result

DATA result LIKE i_amount1.

lo_result->get_value( IMPORTING ea_value = result ).

cl_demo_output=>display( result ).

運行程序,可以在彈出窗口中觀察到結果為兩個輸入變量之和,如下圖,

總結

以上是BRF+中公式表達式的基礎知識和簡單示例創建過程,配置的步驟順序不是唯一的,可以按照你的實際使用情況調整。關於公式表達式相關的更多內容,可以參考:

Formula Expression - SAP Document

BRFplus Basics – How to call a function

BRFplus Basics – Handling of Amounts

在下一篇文章中,我會介紹Decision Table Expression相關的內容。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM