天天看點

我的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+工作台,使用者可以按分類查找自己需要的函數,也可以使用過濾器,如下圖:

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

每個函數都有自己的文檔,其中需求描述、使用示例、參數和注釋資訊等,點選“文檔”列的顯示連結,即可以檢視,如圖:

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

使用者可以定義自己的函數,這需要進行一些程式設計工作,具體可以參考:

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同僚。

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

2,建立應用程式

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

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

3,建立資料對象

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

右鍵點選應用名,選擇建立->資料對象->元素(批量建立),如下圖

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

因為我們要用到3個資料對象(兩個輸入對象,一個輸出對象),是以選擇批量建立。

在彈出視窗中輸入資料技術資訊,如下圖,

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

建立3個資料對象,分别是amount_1,amount_2,amount_result,都是金額類型。點選确定。

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

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

4,建立公式

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

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

點選“上下文對象”,此時,系統會提示我們尚未把公式配置設定給函數或規則集,是以無法使用上下文對象,是以我們需要先建立個函數,

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

5,建立函數并配置設定公式

右鍵應用程式,選擇建立->函數,

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

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

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

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

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

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

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

點選“儲存”,

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

6,編輯公式

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

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

接下來,為公式配置設定一個結果資料對象,

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

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

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

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

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

激活公式,

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

7,模拟函數運作

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

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

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

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

在下一螢幕,點選“繼續”按鈕,

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

在“模拟資料”部分輸入測試資料,點選“執行”,

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

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

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

8,在ABAP中調用BRF+函數

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

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

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

在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)

總結

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

Formula Expression - SAP Document

BRFplus Basics – How to call a function

BRFplus Basics – Handling of Amounts

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

繼續閱讀