Search code examples
testingdynamics-business-centraldynamics-al

Setting the value of an Enum field in a temporary record


Total newbie in AL here; I'm experimenting with automated testing in Dynamics BC for a new deployment. As a very basic test, I'd like to simply create a new Item record in the Cronus test database and validate each field. I'm running into trouble when I try to select the value for an enum field. Here's the code I'm using:

Procedure AddGoodItem()
// [Given] Good item data
var
    recItem: Record Item Temporary; 
Begin
    recItem."Description" := 'zzzz';
    recItem.validate("Description");
    recItem.Type := recItem.Type::Inventory;
    recItem.Validate(Type);
    recItem."Base Unit of Measure" := 'EA';
    recItem.Validate("Base Unit of Measure");
    recItem."Item Category Code" := 'FURNITURE';
    recItem.validate("Item Category Code");
End;

When I run this in Cronus, I get the error:

You cannot change the Type field on Item  because at least one Item Journal Line exists for this item.

If I comment the Type lines out, the process runs successfully.

Given that this is a temporary record, it shouldn't have any Item Journal Lines, should it? What am I missing?


Solution

  • The code in the OnValidate trigger still runs, even if you have marked the Record variable as temporary. In addition temporary is not inherited to the underlying variables meaning any Record variables used in the OnValidate trigger are not temporary (unless marked as such).

    There are two options:

    1. Leave out the line recItem.Validate(Type);, if the code run by the OnValidate trigger is not relevant in this case.
    2. Replace the line recItem.Validate(Type); with your own clone of the code from the OnValidate trigger and then remove the unneeded parts.