ABAP言語仕様:構文要素
0 766

非常に簡単に言うと、プログラムとは、区切り文字で区切られた一連のトークンです。 トークンとは、基本的な構文要素としてプログラム内で意味を持つテキストの最小単位であり、字句ともいいます。 トークンを組み合わせて、式や宣言や文を組み立てます。 文とは、プログラム内で実行可能なアルゴリズム動作を記述したものです。 式は、文の中に現れる構文単位で、1 つの値を表します。 宣言では、式や文の中で利用できる識別子(関数や変数の名前など)を定義し、必要に応じて識別子用のメモリを割り当てます。

このトピックでは、ABAP言語の文字集合を紹介し、以下のようなトークンを宣言するための構文を説明します。

  • 識別子
  • リテナル
  • 演算子
  • 区切文字
  • キーワード 
  • コメント

文字集合は,ソース・プログラムで使用可能か有効文字を定義します。 リリース 6.10 以降のABAPシステムは、ユニコード文字集合 とANSI文字集合が 両方ともサポートされるようになっております。

識別子は,次の項目の名前を表す文字シーケンスです。

  • 変数名
  • 定数名
  • 型名
  • サブルーチン名
  • クラス名
  • インタフェース名

識別子には,次の規則が適用されます。

  1. 長さが最大 30 文字です
  2. + . ,: ( ) を使うことができません
  3. すべて数字で構成することはできません

以下のようなリテナルがあります。

分類定義
文字列文字列リテラルは、一重の逆向き引用符 (`) に囲まれた文 字列であり、そのデータ型は STRING です'abc3d3’
数値数字リテラルは、(0 から 9 までの) 連続した数字で構成され、数字の直前に正 (+) または負 (-) の符号を付けることができます123
-93
+456
3455555555
小数部 がある数値や科学表記によ る数値をリテラルとして表 示できるようにするには、 文字リテラルを使用する必 要があります'1234567890567890'
'+0.58498'
'-8473.67'
'+12.3E-4'
日付'YYYYMMDD'フォーマットのような文字リテナルで定義する必要があります'20140218'
時間'HH24MMSS'フォーマットのような文字リテナルで定義する必要があります'133359'

演算子は1つ,または複数のオペランドでの演算を示すトークンであり,ある結果を返してきます。 演算子は以下のようなものがあります。

分類演算子用途 ABAP命令
代入=代入 MOVE~TO~
?=ワイドキャスト代入(参照型の場合 MOVE~?TO~
算術+加算 ADD~TO~
-減算 SUBTRACT~FROM~
*掛け算 MULTIPLY~BY~
/割り算 DIVIDE~BY~
**累乗 -
MOD整数除算の余り -
DIV整数除算 -
関係=, EQ等号 -
<>, NE不等号 -
<, LT未満 -
>, GT超過 -
⇐, LE以下 -
>=, GE以上 -
COContains Only -
CNContains Not Only -
CAContains Any: -
NAContains Not Any -
CSContains String -
NSContains No String -
CPCovers Pattern -
NPNo Pattern -
論理OR論理和 -
AND論理積 -
NOT否定 -
ビットBIT-ANDビット単位AND -
BIT-ORビット単位OR -
BIT-XORビット単位XOR -
BIT-NOTビット単位NOT -
リテナル&2つのリテラルを結んで1つのリテラルにする--

ABAPの文字のいくつかは区切り記号として使用され,構文および意味上で独自の機能を持っています

分類区切り記号用途
終端子.(ピリオド)文の終了-

ABAP言語で文は命令とよばれています。命令の先頭の ABAP 用語は ABAP キーワードです。 ABAPキーワードはある種のプログラ ミング言語でのように予約された名称ではありません。 命名規則で ABAP キーワードを使用するのは禁止され ていませんが、可能なら避 けてください。 以下はABAPキーワードの一覧表です。

ABAP-SOURCEABBREVIATEDABSABSTRACTACCEPT
ACCEPTINGACCORDINGACOSACTIVATIONACTUAL
ADDADD-CORRESPONDINGADJACENTAFTERALIASES
ALLALLOCATEANALYSISANALYZERAND
ANYAPPENDAPPENDAGEAPPENDINGAPPLICATION
ARCHIVEAREAARITHMETICASASCENDING
ASINASSERTASSIGNASSIGNEDASSIGNING
ATATANATTRIBUTESAUTHORITYAUTHORITY-CHECK
AVGBACKBACKGROUNDBACKUPBACKWARD
BADIBEFOREBEGINBETWEENBIG
BINARYBITBIT-ANDBIT-NOTBIT-OR
BIT-XORBLACKBLANKBLANKSBLOCK
BLOCKSBLUEBOUNDBOUNDARIESBOUNDS
BREAK-POINTBTBUFFERBYBYPASSING
BYTEBYTE-CABYTE-CNBYTE-COBYTE-CS
BYTE-NABYTE-NSBYTE-ORDERCCA
CALLCALLINGCASECASTINGCATCH
CEILCENTEREDCHAINCHAIN-INPUTCHAIN-REQUEST
CHANGECHANGINGCHAR-TO-HEXCHARACTERCHARLEN
CHECKCHECKBOXCIRCULARCLASSCLASS-CODING
CLASS-DATACLASS-EVENTSCLASS-METHODSCLASS-POOLCLEANUP
CLEARCLIENTCLIKECLOCKCLOSE
CNCOCODECODEPAGECODING
COL_BACKGROUNDCOL_GROUPCOL_HEADINGCOL_KEYCOL_NEGATIVE
COL_NORMALCOL_POSITIVECOL_TOTALCOLLECTCOLOR
COLUMNCOMMENTCOMMENTSCOMMITCOMMON
COMMUNICATIONCOMPARINGCOMPONENTCOMPONENTSCOMPRESSION
COMPUTECONCATENATECONDENSECONDITIONCONNECT
CONNECTIONCONSTANTSCONTEXTCONTEXTSCONTINUE
CONTROLCONTROLSCONVERSIONCONVERTCOPIES
COPYCORRESPONDINGCOSCOSHCOUNT
COUNTRYCOVERCPCPICREATE
CSCSEQUENCECURRENCYCURRENTCURSOR
CURSOR-SELECTIONCUSTOMER-FUNCTIONDDATADATABASE
DATAINFODATASETDATEDAYLIGHTDBMAXLEN
DD/MM/YYDD/MM/YYYYDDMMYYDEALLOCATEDECIMALS
DEFAULTDEFERREDDEFINEDEFININGDEFINITION
DELETEDELETINGDEMANDDEPARTMENTDESCENDING
DESCRIBEDESTINATIONDETAILDIALOGDIRECTORY
DISCONNECTDISPLAYDISPLAY-MODEDISTANCEDISTINCT
DIVDIVIDEDIVIDE-CORRESPONDINGDODUMMY
DUPLICATEDUPLICATESDURINGDYNAMICDYNPRO
EEDITEDITOR-CALLELSEELSEIF
ENABLEDENABLINGENCODINGENDEND-ENHANCEMENT-SECTION
END-LINESEND-OF-DEFINITIONEND-OF-FILEEND-OF-PAGEEND-OF-SELECTION
ENDATENDCASEENDCATCHENDCHAINENDCLASS
ENDDOENDENHANCEMENTENDEXECENDFORMENDFUNCTION
ENDIANENDIFENDINGENDINTERFACEENDLOOP
ENDMETHODENDMODULEENDONENDPROVIDEENDSELECT
ENDTRYENDWHILEENHANCEMENTENHANCEMENT-POINTENHANCEMENT-SECTION
ENHANCEMENTSENTRIESENTRYENVIRONMENTEQ
ERRORMESSAGEERRORSESCAPEESCAPINGEVENT
EVENTSEXCEPTIONEXCEPTION-TABLEEXCEPTIONSEXCLUDE
EXCLUDINGEXECEXECUTEEXISTSEXIT
EXIT-COMMANDEXPEXPANDEXPIRATIONEXPLICIT
EXPONENTEXPORTEXPORTINGEXTENDEDEXTENSION
EXTRACTFFETCHFIELDFIELD-GROUPS
FIELD-SYMBOLSFIELDSFILEFILTERFILTERS
FINALFINDFIRSTFIRST-LINEFIXED-POINT
FKEQFKGEFLOORFLUSHFONT
FORFORMFORMATFORWARDFOUND
FRACFRAMEFRAMESFREEFRIENDS
FROMFTOFUNCTIONFUNCTION-POOLGAPS
GEGENERATEGETGIVINGGKEQ
GKGEGLOBALGREENGROUPGROUPS
GTHANDLEHANDLERHASHEDHAVING
HEAD-LINESHEADERHEADERSHEADINGHELP-ID
HELP-REQUESTHIDEHIGHHINTHOLD
HOTSPOTIICONIDIDENTIFICATION
IDENTIFIERIDSIFIGNORINGIMMEDIATELY
IMPLEMENTATIONIMPLEMENTATIONSIMPORTIMPORTINGIN
INCLUDEINCLUDESINCLUDINGINCREMENTINDEX
INDEX-LINEINFOTYPESINHERITINGINITINITIAL
INITIALIZATIONINNERINOUTINPUTINSERT
INSTANCESINTENSIFIEDINTERFACEINTERFACE-POOLINTERFACES
INTERNALINTERVALSINTOINVERSEINVERTED-DATE
ISJOBJOINKEEPKEEPING
KERNELKEYKEYSKEYWORDSKIND
LANGUAGELASTLATELAYOUTLE
LEADINGLEAVELEFTLEFT-JUSTIFIEDLEGACY
LENGTHLEVELLEVELSLIKELINE
LINE-COUNTLINE-SELECTIONLINE-SIZELINEFEEDLINES
LISTLIST-PROCESSINGLISTBOXLITTLELOAD
LOAD-OF-PROGRAMLOCALLOCALELOGLOG-POINT
LOG10LOGFILELOOPLOWLOWER
LPILTMMAILMAIN
MAJOR-IDMARGINMARKMASKMATCH
MATCHCODEMAXMAXIMUMMEMORYMESSAGE
MESSAGE-IDMESSAGESMETHODMETHODSMIN
MINIMUMMINOR-IDMM/DD/YYMM/DD/YYYYMMDDYY
MODMODEMODIFMODIFIERMODIFY
MODULEMOVEMOVE-CORRESPONDINGMULTIPLYMULTIPLY-CORRESPONDING
NNANAMENAMETABNATIVE
NBNENESTINGNEWNEW-LINE
NEW-PAGENEW-SECTIONNEXTNONO-DISPLAY
NO-EXTENSIONNO-EXTENSIONSNO-GAPNO-GAPSNO-GROUPING
NO-HEADINGNO-SCROLLINGNO-SIGNNO-TITLENO-TOPOFPAGE
NO-ZERONODENODESNON-UNICODENON-UNIQUE
NOTNPNSNULLNUMBER
NUMERICNUMOFCHAROOBJECTOBJECTS
OBLIGATORYOCCURRENCEOCCURRENCESOCCURSOF
OFFOFFSETOLEONONLY
OPENOPTIONOPTIONALOPTIONSOR
ORDEROTHERSOUTOUTEROUTPUT
OUTPUT-LENGTHOVERFLOWOVERLAYPPACK
PACKAGEPADDINGPAGEPAGESPARAMETER
PARAMETER-TABLEPARAMETERSPARTPATTERNPERCENTAGE
PERFORMPERFORMINGPERSONPFPF-STATUS
PINKPLACESPOOLPOSITIONPRECOMPILED
PREFERREDPRESERVINGPRIMARYPRINTPRINT-CONTROL
PRIORITYPRIVATEPROCEDUREPROCESSPROGRAM
PROPERTYPROTECTEDPROVIDEPUBLICPUSHBUTTON
PUTQUEUE-ONLYQUICKINFORADIOBUTTONRAISE
RAISINGRANGERANGESREADREAD-ONLY
RECEIVERECEIVEDRECEIVERRECEIVINGRED
REDEFINITIONREFREFERENCEREFRESHREGEX
REJECTRENAMINGREPLACEREPLACEMENTREPLACING
REPORTREQUESTREQUESTEDRESERVERESET
RESOLUTIONRESPECTINGRESPONSIBLERESULTRESULTS
RETURNRETURNCODERETURNINGRFCRIGHT
RIGHT-JUSTIFIEDROLLBACKROUNDROWSRUN
SAPSAP-SPOOLSAVINGSCANSCREEN
SCROLLSCROLL-BOUNDARYSCROLLINGSEARCHSECONDS
SECTIONSELECTSELECT-OPTIONSSELECTIONSELECTION-SCREEN
SELECTION-SETSELECTION-SETSSELECTION-TABLESELECTIONSSEND
SEPARATESEPARATEDSETSHAREDSHIFT
SHORTDUMP-IDSIGNSIMPLESINSINGLE
SINHSIZESKIPSKIPPINGSMART
SOMESORTSORTABLESORTEDSOURCE
SPECIFIEDSPLITSPOOLSPOTSSQL
SQRTSTABLESTAMPSTANDARDSTART-OF-SELECTION
STARTINGSTATESTATEMENTSTATEMENTSSTATIC
STATICSSTATUSINFOSTEP-LOOPSTOPSTRING
STRLENSTRUCTURESTRUCTURESSUBKEYSUBMATCHES
SUBMITSUBROUTINESUBSCREENSUBSTRINGSUBTRACT
SUBTRACT-CORRESPONDINGSUFFIXSUMSUMMARYSUMMING
SUPPLIEDSUPPLYSUPPRESSSWITCHSWITCHSTATES
SYMBOLSYNCPOINTSSYNTAX-CHECKSYNTAX-TRACESYSTEM-CALL
SYSTEM-EXCEPTIONSSYSTEM-EXITTTABTABBED
TABLETABLESTABLEVIEWTABSTRIPTAN
TANHTASKTESTTESTINGTEXT
TEXTPOOLTHENTIMETIMESTITLE
TITLE-LINESTITLEBARTOTOKENIZATIONTOKENS
TOP-LINESTOP-OF-PAGETRACE-FILETRACE-TABLETRAILING
TRANSACTIONTRANSFERTRANSFORMATIONTRANSLATETRANSPORTING
TRMACTRUNCTRUNCATETRUNCATIONTRY
TYPETYPE-POOLTYPE-POOLSTYPESULINE
UNASSIGNUNDERUNICODEUNIQUEUNIT
UNIXUNPACKUNTILUPUPDATE
UPPERUSERUSER-COMMANDUSINGUTF-8
VALIDVALUEVALUE-REQUESTVALUESVARY
VARYINGVERIFICATION-MESSAGEVERSIONVIAVISIBLE
WAITWARNINGWHENWHENEVERWHERE
WHILEWIDTHWINDOWWINDOWSWITH
WITH-HEADINGWITH-TITLEWITHOUTWORDWORK
WRITEXXMLXSEQUENCEXSTRING
XSTRLENYELLOWYYMMDDZZONE

コメントは、ある記号から行末までをコメントとして扱う行コメントと、2つの記号で前後を括りその内部をコメントとして扱うブロックコメントに大別されることができます。 ABAP言語は、行コメントのみをサポートしております。行全体をコメントにする場合は、行の先頭にアスタリスク (*) を入れます。1 行の一部をコメントにする場合は、コメントの前に二重引用符 (“) を入れます。

  ************************************************
  *  REPORT DEMO_HELLO_WORLD                     *
  *  WRITTEN BY LI WENFENG, 02/18/2014           *
  *  LAST CHANGED BY LI WENFENG, 02/18/2014      *
  ************************************************
  REPORT DEMO_HELLO_WORLD.
  * Selection Screen
  PARAMETERS input(12) TYPE c DEFAULT 'Hello World!'.
  * Dynpro
  CALL SCREEN 100. 
  * List
  SKIP TO LINE 10.  " sets the line
  POSITION 40.      " sets the position 
  WRITE input.      " output<span style="background-color:rgb(255, 255, 255);white-space:normal;font-family:"Trebuchet MS", "Helvetica Neue", Helvetica, Tahoma, sans-serif;font-size:16px"></span><span style="background-color:rgb(255, 255, 255);white-space:normal;font-family:"Trebuchet MS", "Helvetica Neue", Helvetica, Tahoma, sans-serif;font-size:16px"></span>
0 766
みんなのツイート (0)

関連サマリー


  • プログラミング基礎 0 Votes 1042 閲覧数


    このトピックでは、SAP標準で用意された採番システムの使用方法を取り上げて説明します。

    概要

    採番処理のために共通的な仕組みを提供します。 

    格納テーブルNRIV
    番号範囲間隔
    メンテナンスSNRO
    番号範囲オブジェクト


    SM56
    番号範囲バッファの管理汎用モジュール

    下記の汎用モジュールを使用できます。

    NUMBER_GET_NEXT 採番NUMBER_GET_INFO 情報取得NUMBER_CHECK チェック


  • プログラミング基礎 0 Votes 825 閲覧数


    概要バリアントとは

    バリアントとは、同じ選択条件で実行することが多いプログラムに対して、入力値のセットを保存させておくものです。 レポートプログラムバリアント、画面バリアント、トランザクションバリアントなどがあります。

    バリアント変数とは

    バリアント変数とは、バリアントに格納される値を変数化したものです。 バリアント変数は二つのタイプがあります。

    TYPE P
    単一値を定義することができます。TYPE S
    選択テーブルとして条件を定義することができます。格納テーブル

    バリアント変数の値定義はテーブルTVARVCに格納されます。

    メンテナンストランザクション利用

    バリアント変数のメンテナンスは、トランザクションSTVARVとSTVARVCを使用します。

    STVARV
    クライアント000用STVARVC
    現在のクライアント用プログラム利用

    以下はバリアント変数をABAPプログラムで動的に変更して使用する方法です。

    * バリアント変数テーブルを更新 UPDATE TVARVC SET LOW = WK_FROM   HIGH = WK_TO WHERE NAME = 'VAL_NAME' 

    AND TYPE = 'S'. "タイプ S:SELECT OPTIONS、P:パラメータ


  • プログラミング基礎 0 Votes 4827 閲覧数


    このトピックはテーブルのデータ行に対して、読み込みや変更などの操作方法を取り上げて説明します。

    読み込み

    内部テーブルから単一行を読み込みするには、以下の命令を使用します。

    READ TABLE itab search-key search-result.検索キーを指定

    読み込む対象となるデータ行の検索キーを指定する方法を説明します。

    (1)テーブルキー指定

    検索キーとして itab のテーブルキーを使用するには、以下のように key を入力します。

    READ TABLE itab FROM wa result.

    または

    READ TABLE itab WITH TABLE KEY k1 = f1 … kn = fn result.

    全タイプの内部テーブルに対して、この方法を利用することができます。

    (2)任意キー指定

    テーブルキー以外の項目も検索キーとして指定することができます。

    READ TABLE itab WITH KEY k1 = f1 … kn = fn result.

    標準テーブルの場合、「BINARY SEARCH」をつけて検索の高速化を図ることができます。これは、標準テーブルが検索キー項目によってソートされていることを前提にしています、そうではない場合、エラーにならないが、意図しないデータ行が読み出されることになってしまいます。

    (3)index指定

    標準テーブルおよびソートテーブルに限りますが、読み込む行のテーブル索引を明示的にidxによって指定することができます。

    READ TABLE 読出元の内部テーブル INTO 読み出し先構造 INDEX idx

    idx は、i 型のデータオブジェクトである必要があります。

    取得できたかをチェック

    対象データが取得できた場合と取得できなかった場合、それぞれ以下のようにシステム項目に値が設定されます。

    取得できた場合sy-subrc: 0sy-tabix: 取得された行のインデックス取得できなかった場合sy-subrc: エラーコード(0でない数字)対象行のデータを照会

    検索対象行のデータを照会するには、作業領域かフィールドシンボルかを使用することができます。

    作業領域を使用
    READ TABLE itab key INTO waフィールドシンボルを使用
    READ TABLE itab key ASSIGNING <fs>.存在チェック

    対象データ行の内容を関心せず、対象データが存在しているかどうかのみをチェックする場合があります。その際、「READ TABLE」命令に「NO FIELDS」オプションをつけることができます。

    挿入単一行挿入

    単一行を内部テーブルの特定の箇所に挿入する場合は、「INSERT」を使用します。

    INSERT wa INTO TABLE itab INDEX idx.複数行挿入

    複数行を内部テーブルの特定の箇所に挿入する場合は「INSERT LINES OF」を使用します。

    INSERT LINES OF itab1 FROM idx1_1 TO idx1_2 INTO TABLE itab2 INDEX idx2.変更単一行変更

    単一行を変更するには、以下の命令を使用します。

    MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 …].複数行変更

    条件を使用して 1 行または複数行を変更するには、以下の命令を使用します。 MODIFY itab FROM wa TRANSPORTING f1 f2 …WHERE cond.

    削除単一行削除

    内部テーブルの単一行を削除する場合は、DELETE 命令を使用します。

    DELETE TABLE itab FROM wa.

    または

    DELETE TABLE itab WITH TABLE KEY k1 = f1 … kn = fn.

    または

    DELETE TABLE itab Index idx複数行削除

    内部テーブルの行を複数まとめて削除する場合には、「DELETE .. WHERE」文を使用します。

    DELETE TABLE itable WHERE key = value.走査

    内部テーブルを走査するには、命令LOOP~ENDLOOPを使用します。 FROM を指定できるのは、 標準テーブルおよび ソートテ ーブルの場合に限られます。 すべてのテーブルデータ型について WHERE を指定することができます。

    DATA : T_WITH_ITEM TYPE TABLE OF WITH_ITEM, W_WITH_ITEM TYPE WITH_ITEM. * 処理 LOOP AT T_WITH_ITEM INTO W_WITH_ITEM WHERE BELNR = W_BELNR AND BUZEI = W_BUZEI. * 処理  

    ENDLOOP.


  • プログラミング基礎 0 Votes 486 閲覧数


    背景

    編集中

    型の作成

    編集中

    基本型

    数値や文字列などのABAP基本型を動的に作成するには、クラスCL_ABAP_ELEMDESCRのメソッドを利用します。 クラスCL_ABAP_ELEMDESCRからいかのようなStaticメソッドが用意されております。

    メソッド名機能GET_Cパラメータで指定された長さのC(テキスト)項目型を取得GET_Nパラメータで指定された長さのN(数値テキスト)項目型を取得GET_Xパラメータで指定された長さのX(16進数)項目型を取得GET_Pパラメータで指定された長さのP(パック数値項目)型を取得

    STRING(文字順序)、XSTRING(バイト順序)、I(整数)、F(浮動小数点数)、D(日付)、T(時間)などの型もメソッドが用意されておりますが、こちらの型は長さの指定がないので、型名を静的に指定すればよく、あえてメソッドを利用する必要がありません。

    下記のサンプルソースでは、長さ10の固定長テキスト項目型を動的生成する方法を示しています。

    DATA c10 TYPE REF TO cl_abap_datadescr. 

    c10 = cl_abap_elemdescr=>get_c( 10 )."動的な型を取得


  • プログラミング基礎 0 Votes 2656 閲覧数


    このトピックは動的なデータオブジェクトを取り上げて、その特徴と使用方法を説明します。

    動的なデータオブジェクトとは

    動的なデータオブジェクトを説明する前にまず静的なデータオブジェクトを説明しておきます。

    プログラムの宣言部分において DATAなどの命令を使用して定義するデータオブジェクトはすべて静的に登録され、プログラムの起動時にはすでに存在する「静的なデータオブジェクト」となります。

    一方、動的なデータオブジェクトとは、プログラム実行時に、CREATE DATA命令を使用して作成されるデータオブジェクトです。

    動的なデータオブジェクトは以下の特徴があります。

    現在の ABAPプログラムの内部セッションの中にデータオブジェクトが登録されます。動的なデータ型を利用することができます。登録されるデータオブジェクトは独自の名称を持ちません。データ参照変数を使用した場合にのみアドレス指定することができます。内容をアクセスするにはフィールドシンボルを利用しなければなりません。動的なデータオブジェクト作成静的なデータ型使用の場合

    静的なデータ型を利用して動的なデータオブジェクトを作成するには、TYPEオプションを使用します。 TYPEオプションの使い方は基本DATA命令と同じですが、タイプ名を指定する際に動的な名称も使用可能です。 以下のような型を使用することができます。

    ABAP基本タイプ
    CREATE DATA dref TYPE c LENGTH 3.TYPESによって定義された任意のデータ型
    TYPES TYP_BKPF TYPE STANDARD TABLE OF BKDF
    CREATE DATA dref TYPE TYP_BKPF.ABAP ディクショナリによる任意のデータ型
    CREATE DATA dref TYPE BKDF.
    CREATE DATA dref TYPE STANDARD TABLE OF BKDF

    サンプルソース:

    DATA typ TYPE c. DATA len TYPE i. DATA dref TYPE REF TO data. FIELD-SYMBOLS <fs> TYPE ANY. typ = 'c'. len = 30. CREATE DATA dref TYPE (typ) LENGTH len. ASSIGN dref->* TO <fs>. <fs> = 'ABCDEF'. write <fs>.動的なデータ型使用の場合

    実行時データ型サービス (RTTS) データ型オブジェクトによって記述される動的なデータ型のデータオ ブジェクトを生成するには、TYPE HANDLEオプションを使います。

    サンプルソース:

    DATA: r_stru TYPE REF TO cl_abap_structdescr, it_comp TYPE cl_abap_structdescr=>component_table, r_comp TYPE abap_componentdescr, r_elem TYPE REF TO cl_abap_elemdescr, r_data TYPE REF TO DATA. DATA: length_of_field TYPE I VALUE 10. FIELD-SYMBOLS: <fs> TYPE ANY. START-OF-SELECTION. r_elem = cl_abap_elemdescr=>get_c( length_of_field ). r_comp-name = 'FIELD1'. r_comp-type = r_elem. APPEND r_comp TO it_comp. r_stru = cl_abap_structdescr=>create( it_comp ). CREATE DATA r_data TYPE HANDLE r_stru. ASSIGN r_data->('FIELD1') TO <fs>. <fs> = 'ABC'. WRITE: / <fs>.


  • プログラミング基礎 0 Votes 815 閲覧数


    このトピックでは、動的な名称の使用方法を取り上げて説明します。

    動的な名称とは

    ABAPプログラムでは、以下のように様々な名称が使用されます。

    データ型を指定するための名称データオブジェクトを参照するための名称SQL文に記述されるテーブル名称…

    通常はプログラムを作成する際に明示的に記述しますが、より機能性が高いプログラムを作成する場合、その名前を可変にしなければならないケースがあります。この可変の名前は動的な名前と呼ばれます。

    基本的な構文

    基本構文は以下のようになります (名称が格納された変数)

    REPORT Y_TEST. DATA: A TYPE C, V1 TYPE C. FIELD-SYMBOLS <FS> TYPE ANY. A = 'T'. V1 = 'A'. ASSIGN (V1) TO <FS>. WRITE: <FS> . 活用される場面ツール型のプログラム作成

    テーブル内容をエクスポートするツールを例とします、テーブル名はユーザから任意に指定可能です。

    以下はその実装の抜粋です。

    PARAMETERS: pn TYPE dd02l-tabname obligatory. START-OF-SELECTION. DATA: t_itab TYPE REF TO DATA. FIELD-SYMBOLS: <itab> TYPE STANDARD TABLE. CREATE DATA t_itab TYPE STANDARD TABLE OF (pn). ASSIGN t_itab->* TO <itab>. SELECT * FROM (pn) INTO TABLE <itab>. *後続は省略コードの簡潔化

    名前が番号違いだけである複数の変数に対してそれぞれ何かの処理を行う時に、動的に変数を割り当てループ処理化することにより、コーディング記述量を劇的に減らすことができます。

    REPORT Y_VARNAME_TEST. DATA:V1(2) TYPE C, V2(2) TYPE C, V3(2) TYPE C, V4(2) TYPE C, V5(2) TYPE C, V6(2) TYPE C, V7(2) TYPE C, V8(2) TYPE C, V9(2) TYPE C.

    DATA: VNAME(5) TYPE c ,
    VINDEX TYPE c.

    FIELD-SYMBOLS <FS> TYPE ANY.
    START-OF-SELECTION.
    DO 9 TIMES.
    VINDEX = SY-INDEX.
    CONCATENATE 'V' VINDEX INTO VNAME.
    ASSIGN (VNAME) TO <FS>.
    CONCATENATE 'X' VINDEX INTO <FS>.
    ENDDO.
    DO 9 TIMES.
    VINDEX = SY-INDEX.
    CONCATENATE 'V' VINDEX INTO VNAME.
    ASSIGN (VNAME) TO <FS>.

    WRITE:/ VNAME,
    : '=' ,
    : <FS>.
    ENDDO.

    上記のサンプルの実行結果は以下の図で示します。

    変数参照制限の回避

    ABAPでは異なるプログラム(レポート、汎用グループetc)のグローバル変数を直接参照することができません。 但し、Exit実装のアドオンプログラムから、直接拡張された標準プログラムのグローバル変数を直接参照したいというニーズはたまたま発生します。 そこで裏技になりますが、動的な変数名を利用すれば、プログラムを跨ってグローバル変数を参照できないというABAP言語の制限を回避することができます。

    以下はそのサンプルです。

    *
    DATA: I_OKCODE(17) TYPE C VALUE '(SAPLMR1M)OK-CODE'.
    FIELD-SYMBOLS: <FS_OKCODE> TYPE ANY.
    ASSIGN (I_OKCODE) TO <FS_OKCODE>.


  • プログラミング基礎 0 Votes 3195 閲覧数


    フィールドシンボルとは、物理的なメモリを占有せずに、任意の変数(単一変数、構造、内部テーブルなど)に 割り当てる(Assign)ことで、任意の変数を指し示すことができます。C言語でいうポインタのようなものです。

    宣言

    フィールドシンボルを宣言するには、以下のような構文を使用します。

    FIELD-SYMBOLS <FS> [< データ型 >|STRUCTURE <s> DEFAULT <wa>]. <FS>にある角かっこも構文の一部です、タイプ指定しない場合は、TYPE ANYで宣言することができます。

    FIELD-SYMBOLS <FS1> TYPE ANY. FIELD-SYMBOLS <FS2> TYPE ANY TABLE.

    割り当て

    Assign命令を使います。

    参照と書き込み

    フィールドシンボルにやまかっこをつけて、フィールドシンボルがアドレスするデータを参照または書き込みすることができます。

    FORM f_get_range_table USING u_setclass u_subclass u_setname CHANGING r_range TYPE TABLE. DATA: lt_set LIKE setleaf OCCURS 0 WITH HEADER LINE, wl_range TYPE REF TO DATA . FIELD-SYMBOLS : <fs_rec>,<fs_itm> .

    SELECT * FROM setleaf
      INTO TABLE lt_set
      WHERE setclass = u_setclass
      AND subclass = u_subclass
      AND setname = u_setname.

    LOOP AT lt_set.
    CREATE DATA wl_range LIKE LINE OF r_range.
    ASSIGN wl_range->* TO <fs_rec>.
    ASSIGN COMPONENT 'SIGN' OF STRUCTURE <fs_rec> TO <fs_itm>.
    <fs_itm> = lt_set-valsign.
    ASSIGN COMPONENT 'OPTION' OF STRUCTURE <fs_rec> TO <fs_itm>.
    <fs_itm> = lt_set-valoption.
    ASSIGN COMPONENT 'LOW' OF STRUCTURE <fs_rec> TO <fs_itm>.
    <fs_itm> = lt_set-valfrom.
    ASSIGN COMPONENT 'HIGH' OF STRUCTURE <fs_rec> TO <fs_itm>.
    <fs_itm> = lt_set-valto.
    APPEND wl_range to r_range.
      ENDLOOP.
    ENDFORM.


  • プログラミング基礎 0 Votes 1135 閲覧数


    このトピックでは内部テーブル全体に対する操作を取り上げて説明します。

    割当

    内部テーブルの割り当ては、MOVE命令を使用します。 MOVE itab1 TO itab2. なお、代入演算子も同様の働きを持ちます。 itab2 = itab1.

    上記の命令が実行された結果、内部テーブルitab1の内容が内部テーブルitab2にコピーされることになります。

    初期化

    内部テーブルを初期化するには、clear、fresh、freeなどの命令を使用します。

    clear構文1:clear itab[]
    内部テーブルの本体を初期化します。
    内部テーブルは初期メモリ所要量が予約され、その以外のメモリ領域がすべて解放されます。構文2:clear itab
    ヘッダ行を含まない内部テーブルの場合は、この命令はclear itab[]と同様に動作します。
    ヘッダ行を含る内部テーブルの場合は、ヘッダ行(作業領域)の名前が内部テーブルと同じであるため、このテーブルは単なるヘッダ行のクリアのみとなります。fresh構文:fresh itab
    常に内部テーブルの本体を初期化します。この命令はclear itab[]と同様に動作します。free構文:fresh itab
    常に内部テーブルの本体を初期化します。この命令はclear、fresh命令と異なり、内部テーブルに対して、初期メモリ所要量を含めた記憶域全体をすべて解放します。比較

    ABAPでは、内部テーブルも論理式内のオペランドとして比較することができます。

    ソート

    内部テーブルのソートはSORT命令を使用します。

    SORT itab [ASCENDING|DESCENDING] [AS text] [STABLE].

    属性取得

    DESCRIBE TABLE命令を使用して、件数などの内部テーブルの各属性を取得することができます。

    DESCRIBE TABLE
    構文:DESCRIBE TABLE itab [LINES lin] [OCCURS n] [KIND knd].パラメータ:LINES
    内部テーブルのレコード件数を取得します。パラメータ:OCCURS
    内部テーブルの初期サイズを取得します。パラメータ:KIND
    内部テーブルの種類を取得します。