SAP技術者のサンプルコード置き場

ABAPの動作確認をしたコードと簡単な説明を置いておきます。

【ABAP CDS】BASIC VIEW その1

ABAP CDS初の独自コード

  • 項目名の定義
  • JOIN
  • キー項目設定

気づいた点/教えていただいた点

  • ABAP CDS側には、ORDER BYは指定できない。呼び出し側(ABAP、Fiori Elements等)で設定する

Annotation(アノテーション)について 「AbapCatalog」はABAPで使用する際の設定を記述できる。 よく使うアノテーションは生成時に自動設定される。 CTRL+SPACEを押下すれば、アノテーションの名称の途中で入力補足したり、アノテーションで使用する値を表示させ選ぶことができる。 アノテーションを記述する際は「@」を先頭において記述する。

アノテーション 内容
AbapCatalog.
buffering.status
CDSビューでのテーブルバッファの有効化
AbapCatalog.
buffering.type
CDSビューでのテーブルバッファタイプ
AbapCatalog.
buffering.numberOfKeyFields
ジェネリックエリアのテーブルバッファにおけるキー要素数
AbapCatalog.
compiler.compareFilter
Filterの評価方法(?)
AbapCatalog.
preserveKey
項目の前にkeyとつけることでキー項目を指定
AbapCatalog.
sqlViewName
ABAPディクショナリに登録される名称|名称を指定
AbapCatalog.
viewEnhancementCategory[ ]
CDS VIEW拡張を使ってどのように拡張するか。
[]内に複数の値をカンマ区切りで指定可能
AccessControl.
authorizationCheck
ABAPから呼ばれた場合の権限チェック
VDM.viewType CDS VIEWの種類

help.sap.com

@AbapCatalog.sqlViewName: 'Z0203_V_0017'
@AbapCatalog.compiler.compareFilter: false
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'ORIGINAL BASIC VIEW for 0017'
@VDM.viewType: #BASIC
define view Z0203_C_0017(
// 項目名定義
    test_matnr,                           
    test_werks,
    test_lgort,
    test_matkl,                            
    test_mtart,     
    test_labst )
// 抽出処理                              
    as select from mara
       join marc on 
          mara.matnr = marc.matnr
       join mard on 
                 marc.matnr = mard.matnr
      and    marc.werks = mard.werks
    {  key mara.matnr,
        key marc.werks,
        key mard.lgort,
               mara.matkl,
               mara.mtart,
               mard.labst
}

【ABAP】7.4で拡張された内部テーブルの条件指定やインデックス指定をSELECTのWHEREで使用する USING INTERNAL TABLE SELECTION ENHANCED FROM ABAP 7.4 IN SELECT WHERE CONDITIONS

SELECT文で、7.4で拡張された内部テーブルの値の取り方や インデックス指定を使って検索条件を作ってみました。 条件を満たすデータが複数件あった場合はどうなる・・・?

TYPES: BEGIN OF typ_str,
         field1 TYPE char10,
         field2 TYPE auart,
         field3 TYPE char10,
       END OF typ_str,
       ttyp_str TYPE TABLE OF typ_str WITH KEY field1.
DATA: str TYPE ttyp_str.

DATA: var1 TYPE char10 VALUE 'VARIABLES'.

str = VALUE #( ( field1 = 10 field2 = 'OR' field3 = 30 )
                        ( field1 = 20 field2 = 'OR1' field3 = 60 )
                        ( field1 = 30 field2 = 'ZOR' field3 = 90 )
                       ).

DATA(read_line) = lines( str ). "データ件数を取得

SELECT FROM vbak AS t1
    FIELDS
        'LITERAL' AS lit,
        @var1 AS var1,
        auart,
        vbeln,
        erdat,
        @( VALUE vbak-erdat( ) ) AS erdat2, "初期値
        erzet,
        @( VALUE vbak-erzet(  ) ) AS erzet2 "初期値
*    where auart = @( value vbak-auart( str[ field1 = 10 ]-field2 ) ) "field1=10の条件を満たすfield2値
    WHERE auart = @( VALUE vbak-auart( str[ read_line ]-field2 ) ) "3件目のfield2の値
    INTO TABLE @DATA(results).

cl_demo_output=>display( results ).

【設計・開発】基本設計書の処理想定時間、記載は必要でしょうか?

こんにちは。 基本設計書に、「処理想定時間」という項目がありますが、あれって必要なのでしょうか? 処理時間を机上で計測するなんて困難ですよね。

ある現場で経験したことなのですが、 「ちょっと遅そう」とわかっていた処理だったので、オンライン処理の「処理想定時間」に 「1件あたり最大10秒程度」と盛って記述して顧客にレビューで見せたら、 「こんなの時間かかりすぎるよ、申し訳ないけど業務まるでわかってないよ」と呆れられたことがあります。 まあ確かにちょっと盛りすぎたなと(笑)

そこで、次回以降同様の指摘を受けないように、現場のリーダーに確認を取りました。

私「先の一件があったので対策を考えたいのですが、実際の処理時間なんてわかりませんよね。 だから1件1秒とでも書いておけばよいでしょうか?」。

リーダー「極端に早い数字も入れないでほしいんですよ」

私「どうしてですか?」

リーダー「実際に作成されたプログラムでその処理時間を超過した場合、 パフォーマンスチューニング対象になってしまいますから」

・・・

上記のような場合だと、「ではどうすればいいのか」となってしまいますよね。 別の案件では、「オンライン時は1件あたりの処理時間を3秒以内とすることを前提とする」 という決めごとがあったのでので常に「3秒以内」と記載していたのですが、 これでは、何のために設計書に記述するのか・・・

処理速度の取り決めはプロジェクト内の規約等で決めておいて、 各設計書に処理時間を記載しない方が良いのかなと思います。

【ABAP】特定項目が変更されていたら変更履歴情報を表示 DISPLAY CHANGE HISTORY INFO WHEN SPECIFIC FIELDS ARE CHANGED

こんにちは。

販売伝票明細の拒否理由(VBAP-ABGRU)が変更されている場合に 変更履歴内容をLEFT OUTER JOINで取得するロジックです。 テーブルキー(TABKEY)のON条件として、 CONCATでクライアント・伝票番号・明細番号を文字列結合しているところに 注目してください。  

SELECT FROM VBAK AS T1
    INNER join vbap as t2
      on t1~vbeln = t2~vbeln
    left outer join cdpos as t3
        on  t3~objectclas = 'VERKBELEG'
        and concat( @sy-mandt, concat( t1~vbeln, t2~posnr ) ) = t3~TABKEY
        and t3~FNAME = 'ABGRU'
    left outer join cdhdr as t4
       on   t3~OBJECTCLAS t4~OBJECTCLAS
       and  t1~vbeln            = t4~OBJECTID
       and  t3~CHANGENR  = t4~CHANGENR
    fields
      t1~vbeln,
      t2~posnr,
      t2~abgru,
      t3~objectclas,
      t3~fname,
      t4~USERNAME,
      concat_with_space( t4~UDATE,  t4~UTIME, 1 ) as udatetime
into table @data(results).

cl_demo_output=>display( results ).