識別子、構文、および変数の使用
変数と関数の使用を開始する前に、まず重要な概念について説明する必要があります。 識別子、構文、および変数は、AL およびその他のプログラミング言語の中心的な概念です。
識別子はプログラミング要素の名前ですが、変数は、データが格納されるメモリ内の場所です。 識別子を使用して、変数に名前を付けて使用することができます。
構文は、これらの識別子を使用するための文法上の規則を記述します。 識別子の構文は、アプリケーション言語といくつかのベス トプラクティスによって決まります。
いくつかの文法規則は、識別子を使用するために用意されています。 1 つのオブジェクト内では、すべての識別子が一意である必要があります。 したがって、1 つのオブジェクト内では、同じ識別子 (または名前) を持つ 2 つの変数を宣言することはできません。
識別子を使用して変数を定義する場合は、最初の文字にアンダースコアまたは文字を使用することをお勧めします。 識別子に特殊文字やスペースを使用する場合は、識別子を二重引用符で囲む必要があります。
アプリケーション言語は大文字と小文字を区別しませんが、識別子の大文字と小文字を区別しません。 パスカルケースを使用して、識別子を作成することをお勧めします。 パスカルケースとは、変数の名前を大文字で開始することを意味します。 名前が 2 つの単語の組み合わせである場合は、2 番目の単語を大文字で開始することもできます。 たとえば、顧客の名前を格納する変数がある場合、パスカルケースによる命名法の例として、CustomerName を使用できます。
変数の使用を開始する前に、変数を宣言する必要があります。つまり、変数には下記が必要です。
識別子を持つ
スコープが持つ
データ型を持つ
初期化されている
変数には、変数にアクセスして使用できる場所を定義するスコープも必要です。
変数は、グローバルまたはローカル スコープで定義できます。 グローバル スコープで変数を定義すると、オブジェクトのすべての場所で変数を使用できるようになります。 したがって、コード ステートメントを記述したいすべての場所において、すべてのトリガーでその変数を使用できるようになります。 スコープがローカルの場合、その変数は、宣言されたプロシージャ内の特定のトリガーでのみアクセスできます。

前の例では、変数 Counter がグローバル スコープで宣言されており、テーブル MyTable のすべてのトリガーと関数で使用できます。 変数 CustomerName は OnInsert トリガーで定義されています。したがって、ローカル スコープを持ちます。 変数は、このトリガーでのみ使用でき、別のトリガーから呼び出すことはできません。 グローバル スコープを使用してすべての変数を定義する方が簡単ですが、その場合は、すべてのトリガーでこの変数を使用できます。 後で変数を各トリガー内で変更できるため、望まないまたは予想外の結果を招く可能性があります。 したがって、変数を宣言する場合は、スコープ定義を考慮してから、正しいものを選択します。
システムによって自動的に定義および管理されるシステム定義の変数も存在し、それらの変数のスコープもシステムによって設定されます。 Rec 変数 xRec 変数は、システム定義変数の例です。 Rec を使用すると現在のレコードへのアクセスが可能になり、xRec を使用すると前のレコードにアクセスできます (更新が発生する前など)。
変数には常に特定のデータ型があります。 たとえば、整数、テキスト、コード、日付、オプションなどを指定できます。 メモリに変数が作成されると、変数が初期化され、この変数に値を割り当てる前に、変数によって既定の初期値が取得されます。 この既定値は、その変数のデータ型によって異なります。
numeric データ型の変数の場合は、値 0 を使用して初期化します。 String 変数は、空の文字列で初期化されます。 Boolean 変数の既定値は false です。
最近まで、各変数はそれぞれ独自の行で宣言する必要がありました。 大きなオブジェクトでは、これにより、ほとんどが同じタイプの変数であっても、変数宣言のページが大量に必要になっていました。
スクロール操作を減らし、読みやすさを改善し、関連するタイプの表示と宣言をわかりやすくするために、1 つの行に同じタイプの複数の変数宣言を追加することができるようになりました。
コンマで変数名を区切って、同じタイプの複数の変数を同じ行に宣言します。
例:
var
myInt, nextInt, thirdInt : Integer;
isValid, doCheck : Boolean;
保護された変数
protected キーワードは、テーブルおよびテーブル拡張機能の間、およびページとページ拡張機能の間で変数にアクセスするために使用できます。
一部の変数のみを protected として公開する場合は、var 宣言の中に 2 つのセクションを作成する必要があります。 次の構文を参照してください。
protected var
myInt: Integer; // protected var
var
myLocalInt: Integer; // local var
次の例は、protected 変数を宣言して使用する方法を示します。
page 50100 MyPage
{
SourceTable = Customer;
PageType = Card;
layout
{
area(Content)
{
group(General)
{
field(Name; Name)
{
ApplicationArea = All;
}
}
group(Advanced)
{
Visible = ShowBalance;
field(Balance; Balance)
{
ApplicationArea = All;
}
}
}
}
protected var
[InDataSet]
ShowBalance: Boolean;
}
pageextension 50101 MyPageExt extends MyPage
{
layout
{
addlast(Content)
{
group(MoreBalance)
{
Visible = ShowBalance; // ShowBalance from MyPage
field("Balance (LCY)"; "Balance (LCY)")
{
ApplicationArea = All;
}
}
}
}
actions
{
addlast(Navigation)
{
action(ToggleBalance)
{
ApplicationArea = All;
trigger OnAction()
begin
ShowBalance := not ShowBalance; // Toggle ShowBalance from MyPage.
end;
}
}
}
}
AL コードの配置に関するガイドライン
AL コードには次のガイドラインを適用することをお勧めします。
一般的に、コードは、操作対象のオブジェクトではなく、codeunits に記述してください。 これにより、設計が簡素化され、コードを再利用できるようになります。 また、セキュリティの強化にも役立ちます。 たとえば、一般会計の記帳テーブルなどの機密データが含まれるテーブルには、通常、ユーザーは直接アクセスできません。
codeunit で一般会計を操作するコードを作成し、その codeunit にテーブルへのアクセスを許可し、ユーザーに codeunit を実行するためのアクセス権を与えれば、テーブルのセキュリティを侵害することなく、ユーザーがテーブルにアクセスできるようになります。
codeunit ではなく、オブジェクトにコードを配置する必要がある場合は、操作対象のオブジェクトにできるだけ近い箇所にコードを配置します。 たとえば、テーブル フィールドのトリガーにレコードを変更するコードを配置します。
コードの再利用
コードを再利用することで、アプリケーションの開発をより速く簡単にすることができます。 さらに重要な点は、提言どおりに AL コードを構成すると、アプリケーションのエラーが発生しにくくなります。 コードを集中化することで、たとえば、ソースの式と同じテーブル フィールドを持つ複数のトリガーなど、複数の場所で同じ計算を行うことにより、思いがけない不整合性が発生することを防げます。 コードを変更する必要がある場合は、これらのトリガーの一部について忘れたり、それらの 1 つを変更する際にミスをすることがあります。