AL simple statements
Note
We're working on improving the onboarding experience for AL developers. If you've input for this article, we'd love to hear from you. Please use the Feedback section at the bottom of this article to help us make improvements that you’d like to see.
We also welcome contributions to our docs. New to contributing to docs? Don't worry, read more about contributing here Contribute to the help.
AL simple statements are single-line statements that are executed sequentially and don't alter the flow of code execution. This article explains some of the simple statements in AL.
Assignment statements
Assignment statements assign a value to a variable. The value that you assign to the variable is an AL expression. It can be a constant or a variable, or it can consist of multiple elements of AL expressions. If you use a method call as the value to assign to a variable in an assignment statement, then the value that is assigned is the return value of the method.
You use the ":=" operator for assignment statements.
Example
The following example assigns a constant integer value to a variable that you've defined.
Count := 1;
Example
The following example assigns a value that consists of a constant, an operator, and a variable.
Amount := 2 * Price;
Example
The following example assigns the return value of the Open Method (File) to a Boolean variable that you've defined.
Note
This method is supported only in Business Central on-premises.
OK := TestFile.Open('C:\temp\simple.xml');
The return value of the Open
method is optional. If you don't handle the return value in your code, then a run-time error occurs when a method returns false. The following example causes a run-time error if the file C:\temp\simple.xml
can't be opened.
TestFile.Open('C:\temp\simple.xml');
You can handle the return value by using an if-then statement.
if TestFile.Open('C:\temp\simple.xml') then begin
// continue running
else
Error(Text001);
Example
If you want to perform arithmetic operations on a variable and then assign the result to the same variable, you can use the following syntax.
Counter := 0;
// you can use this syntax
// for addition
Counter += 1;
// for subtraction
Counter -= 1;
// for multiplication
Counter *= 1:
// for division
Counter /= 1;
// instead of
Counter := Counter + 1;
The following example shows how to use this syntax on variables of the Text Data Type.
String := "Hello ";
String += "World";
Method statements
You use method statements to run either built-in system methods or user-defined (custom) methods. Method calls may include parameters, which are passed to the method. For more information, see Calling Methods.
AssertError statements
You use AssertError statements in test methods to test how your application behaves under failing conditions. The AssertError
keyword specifies that an error is expected at run time in the statement that follows the AssertError
keyword.
If a simple or compound statement that follows the AssertError keyword causes an error, then execution successfully continues to the next statement in the test method. You can get the error text of the statement by using the GetLastErrorText method.
If a statement that follows the AssertError keyword doesn't cause an error, then the AssertError statement causes the following error and the test method that is running produces a FAILURE result:
TestAsserterrorFail: FAILURE
An error was expected inside an AssertError statement.
Example
To create a test method to test the result of a failure of a CheckDate
method that you've defined, you can use the following code. This example requires that you create a method called CheckDate
to check whether the date is valid for the customized application.
InvalidDate := 19000101D;
InvalidDateErrorMessage := Text001;
AssertError CheckDate(InvalidDate);
IF GetLastErrorText <> InvalidDateErrorMessage then
Error('Unexpected error: %1', GetLastErrorText);
This example requires the following variables.
var
InvalidDate : Date;
InvalidDateErrorMessage : Text;
Text001 : Label 'The date is outside the valid date range.';
With statements (to be deprecated)
Important
Using the with
statement is being deprecated with Dynamics 365 Business Central 2020, release wave 2. With this release it is a warning, which will become an error in a future release.
Using with
statements introduces possible uniqueness collisions when multiple extensions contribute to the same objects because it allows working with members using just simple names instead of qualifying them. To avoid this going forward, we are marking the use of with
, be it implicit or explicit as warnings. With this release, you can use a quick action to fix these files, as well as suppress obsolete warnings for now. Code that contains with
statements will, however, need to be refactored before with
statements are compiled with errors. For more information, see Deprecating Explicit and Implicit With Statements. For information about using directives in code, see Directives in AL and Pragma ImplicitWith Directive in AL.
The following syntax shows a with-do statement.
with <Record> do
<Statement>
When you work with records, addressing is created as record name, dot (period), and field name:
<Record>.<Field>
If you work continuously with the same record, then you can use with
statements. When you use a with
statement, you can only specify the record name one time.
Within the scope of <Statement>, fields in <Record> can be addressed without having to specify the record name.
You can nest several with
statements. If you have identical names, then the inner with
statement overrules the outer with
statement.
Example
This example shows two ways to write the same code that creates a record variable that you can commit later.
CustomerRec."No." := '1234';
CustomerRec.Name := 'Windy City Solutions';
CustomerRec."Phone No." := '555-444-333';
CustomerRec.Address := '1241 Druid Avenue';
CustomerRec.City := 'Windy City';
Message('A variable has been created for this customer.');
This example requires the following variables.
var
CustomerRec : Record Customer;
The following example shows another way to create a record variable that you can commit later:
with CustomerRec do begin
"No." := '1234';
Name := 'Windy City Solutions';
"Phone No." := '555-444-333';
Address := '1241 Druid Avenue';
City := 'Windy City';
Message('A variable has been created for this customer.');
end;
Programming conventions
Within with-do
blocks, don't repeat the name of the object by using the member variable or method.
If you nest a with-do
block within another explicit or implicit with-do
block, then the with-do
block that you create within another with-do
block must always be attached to a variable of the same type as the variable that is attached to the surrounding with-do
block. Otherwise, it can be difficult to see what variable that a member variable or method refers to. For example, implicit with-do
blocks occur in table objects and in pages that have been attached to a record.
Example
The following example demonstrates nested with-do
blocks. Both with-do
blocks are attached to a Customer Ledger Entry record variable.
with CustLedgEntry do begin
Insert;
...;
with CustLedgEntry2 do begin
Insert;
...;
end;
end;
Incorrect example
The following example demonstrates incorrect code in which you can't directly tell which record variable that the MyField field refers to.
with CustLedgEntry do begin
...;
with VendLedgEntry do begin
MyField := <Some Value>;
...;
end;
end;
See also
Control statements
Methods
Directives in AL
AL essential methods