技術日記

SAP MDG ABAP FIORI等々

FPM Search Help - キーを複数持つSearch HelpをMDGで使うには

2022-06-19 13:20:21 | 日記

前提

データエレメントHBKIDは、自分自身HBKID以外に会社コードBUKRSを必要とする。

だがHBKID単独ではSearch Helpの値がもって来れない。

ユーザーは会社コードを入力して、その会社コードを参照してHBKIDのSearch Helpを出し、入力したい。

 

やること

■Feeder Classの開発

OVS_HANDLE_PHASE_2でSearch Helpの候補郡を出し、

OVS_HANDLE_PHASE_3で選択した値をHandlingする。

多分MDG側はZ始まりのカスタム項目名(ZZHBKID)とかを使う可能性が高いので、

この場合はZZHBKID - HBKIDをマッピングする必要がある。

 

■MDGデータモデル

BUKRS - type 3 entity

HBKID - type 3 entity

BUKRS - HBKID は Leading 1:N

BURKS - 所属先type 4 entity Referencing 0:N 

HBKID - 所属先type 4 entity Referencing 0:N 

 

これはMDG標準のCompany Code - HBKIDを入力する仕組みをそのまま真似した。

Search Helpみたいに見えるけど、実際はSQLで取ってきた内容を内部テーブル化して

Search Helpぽっく見せている。

 

全部実装するとこんな感じ。

 

 

 

 


ABAP Regex使用

2022-06-09 14:29:39 | 日記

全銀仕様データレコードで必要ということで。。

要件:英字、数字、カナ、記号のみ入力可
   記号は以下の10種類のみ
    /.-,+()': 半角スペース

Case sencitiveが必要あなので、maktxを使用。

 

DATA : lr_matcher TYPE REF TO cl_abap_matcher,
       v_pattern(200) TYPE c,
       v_success type boolean.

CONCATENATE '[0-9A-Zヲ-゚\.,'''' \-/「」\(\)\\+:]+$' '' INTO v_pattern.

PARAMETERS: TEXT TYPE maktx.

 CLEAR v_success.
  lr_matcher = cl_abap_matcher=>create( pattern = v_pattern text = TEXT ).
  v_success  = lr_matcher->match( ).
  IF v_success ne abap_true.
   WRITE : text, 'NG'.
  ELSE.
   WRITE : text, 'OK'.
  ENDIF.


BP SOAP service inbound整理

2022-06-04 12:33:25 | 日記

1. inbound処理はconfirmation messageをoutboundするまでが流れ。

 もしconfirmation serviceをinboundのreciever systemと紐づけてない場合は、srt_moniでDeliveriedと表示されてもデータが反映されない。多分confirmation serviceのoutboundまでしてcommitされると推測。confirmation messageが正しく届くかまでは気にしない。

→ と思ったが、違うっぽい。cl_bs_soa_inappseq_in -> VALIDATE_SEQUENCEで「そのBPすでに変更されたから追加の変更は無視ね。あ、エラーも投げずに成功処理するからしくよろ!」っていう動きが見つかった。えー

→ 検証のやり方が悪い。message idが一緒だからそりゃ受け側は同じメッセージが二回送られたと認識して後できたやつは無視する。でもエラーにするには微妙ーだからDeivelied判定。よく出来てるちゃ出来てるけどこの仕様が分かるまでが大変ー

 

→ 犯人は「changeOrdinalNumberValue」。message IDは関係ない。

このような素晴らしいブログがある。

https://blogs.sap.com/2020/03/04/web-service-business-partner-soap-fields-and-explained/

 

 

 

2. https://launchpad.support.sap.com/#/notes/2481529

bgrfcでもsrt_moniでも消せないmessageの消し方。

message terminated後にbgrfcでlock delete。 

 

3. もしconfirmation messageは要らない場合は?

 送り先のシステムがSOAPのinboundをサポートしてない場合、意味ないのでsuitebulkreplicationだけしたい場合は?

 

4. Confirmation送りに失敗したら、対象のBPはさらなる変更を受け取らないことを発見。

   1.の手順でError MessageとQueue lockを削除してもう一度メッセージを送るが、反映されない。

 他のBPを変更したら反映。BPにロックが掛かる?

 

5. bgrfcのdebug -> lock inbound destinaition -> sbgrfcmonで該当queueをdebug。

   inboundの処理クラスはCL_MDG_BP_BUPA_SI_INで、DO_MAPPING_INBOUNDでdebugを掛けておくと

 捕まえる。なかなかruntime処理がつかまらなくて中の処理が全然見えず苦労したけど、

 debugまでは出来たので、後は(時間さえあれば)流れを見てどこでNGになってるかわかると思う。

 

え、ナニコレ。。。前回の変更が終わってない判定になってるし。原因はこれ?

 

https://me.sap.com/notes/0002863972

 

 

 

 


FPM GUIBBレベルでDialogを開く方法

2022-06-02 21:03:50 | 日記

OVPレベルであれば、FLUIDで設定すればよし。

ボタンに標準アクションのFPM_OPEN_DIALOGを割り当てて、パラメータにPage Idを入れれば出来る。

 

このように設定して、ボタンを押すと。。。

Pop-upで検索UIBB画面が。

だが一レベル下のUIではFPM_OPEN_DIALOGが標準アクションとして割り当てできないので、

Feeder Classで直接Eventをハンドラーする必要がある。

以下のようにコードを書いて。。。(もちろんボタンにはアクション割り当て必要)

 

 

Open_searchを押すと検索Pop-up画面が。

 

検索画面とソースUIとのパラメータ引き渡しは以前やったAPIでのやり取りを応用すれば出来ると思う。

後はこの検索結果+APIの戻り値をもって、Cross entity badiをどう起動するかの問題。。。

FLUSHメッソドで呼び出されたとかどうだが。記憶があいまい。

 


PostmanでS/4HANAのSOAP inbound interfaceを試す場合は

2022-05-29 16:28:00 | 日記

Message IDを付けて送信しないとエラー発生。

 

解決はhttps://me.sap.com/notes/0002237014通り。

SOAPUIでランダムID生成を使うか(なぜかこれ効かなかった)

Endpointに直接MessageIDを記載して飛ばすか(これは効いた)。

/sap/bc/srt/xip/sap/businesspartnersuitebulkreplic/200/ext200/ext200?MessageId=989C6E5C-2CC1-11CA-A044-08002B1BB4F5

このように入れてPostmanで飛ばしてみると、

PLAINSOAPとしてS/4側が受け取る。

あ、BPのSOAPインバウンドはBUSINESSPARTNERSUITEBULKREPLICで。