Table 7501 Item Attribute Value

App
Base Application
Namespace
Microsoft.Inventory.Item.Attribute
Versions
17-28

Fields, 7Keys, 2Procedures, 12Events, 5

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Item/Attribute/ItemAttributeValue.Table.al445 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Inventory.Item.Attribute;

using Microsoft.Inventory.Item;
using System.Globalization;
using System.IO;

table 7501 "Item Attribute Value"
{
    Caption = 'Item Attribute Value';
    DataCaptionFields = Value;
    LookupPageID = "Item Attribute Values";
    DataClassification = CustomerContent;

    fields
    {
        field(1; "Attribute ID"; Integer)
        {
            Caption = 'Attribute ID';
            NotBlank = true;
            TableRelation = "Item Attribute".ID where(Blocked = const(false));
        }
        field(2; ID; Integer)
        {
            AutoIncrement = true;
            Caption = 'ID';
        }
        field(3; Value; Text[250])
        {
            Caption = 'Value';
            ToolTip = 'Specifies the value of the item attribute.';

            trigger OnValidate()
            var
                ItemAttribute: Record "Item Attribute";
            begin
                if xRec.Value = Value then
                    exit;

                TestField(Value);
                if HasBeenUsed() then
                    if not Confirm(RenameUsedAttributeValueQst) then
                        Error('');

                CheckValueUniqueness(Rec, Value);
                DeleteTranslationsConditionally(xRec, Value);

                ItemAttribute.Get("Attribute ID");
                if IsNumeric(ItemAttribute) then
                    Evaluate("Numeric Value", Value);
                if ItemAttribute.Type = ItemAttribute.Type::Date then
                    Evaluate("Date Value", Value);
            end;
        }
        field(4; "Numeric Value"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'Numeric Value';

            trigger OnValidate()
            var
                ItemAttribute: Record "Item Attribute";
            begin
                if xRec."Numeric Value" = "Numeric Value" then
                    exit;

                ItemAttribute.Get("Attribute ID");
                if IsNumeric(ItemAttribute) then
                    Validate(Value, Format("Numeric Value", 0, 9));
            end;
        }
        field(5; "Date Value"; Date)
        {
            Caption = 'Date Value';

            trigger OnValidate()
            var
                ItemAttribute: Record "Item Attribute";
            begin
                if xRec."Date Value" = "Date Value" then
                    exit;

                ItemAttribute.Get("Attribute ID");
                if ItemAttribute.Type = ItemAttribute.Type::Date then
                    Validate(Value, Format("Date Value"));
            end;
        }
        field(6; Blocked; Boolean)
        {
            Caption = 'Blocked';
            ToolTip = 'Specifies that the attribute value cannot be assigned to an item. Items to which the attribute value is already assigned are not affected.';
        }
        field(10; "Attribute Name"; Text[250])
        {
            CalcFormula = lookup("Item Attribute".Name where(ID = field("Attribute ID")));
            Caption = 'Attribute Name';
            ToolTip = 'Specifies the name of the item attribute.';
            FieldClass = FlowField;
        }
    }

    keys
    {
        key(Key1; "Attribute ID", ID)
        {
            Clustered = true;
        }
        key(Key2; Value)
        {
        }
    }

    fieldgroups
    {
        fieldgroup(DropDown; Value)
        {
        }
        fieldgroup(Brick; "Attribute Name", Value)
        {
        }
    }

    trigger OnDelete()
    var
        ItemAttrValueTranslation: Record "Item Attr. Value Translation";
        ItemAttributeValueMapping: Record "Item Attribute Value Mapping";
        ItemVariantAttributeValueMapping: Record "Item Var. Attr. Value Mapping";
    begin
        if HasBeenUsed() then
            if not Confirm(DeleteUsedAttributeValueQst) then
                Error('');
        ItemAttributeValueMapping.SetRange("Item Attribute ID", "Attribute ID");
        ItemAttributeValueMapping.SetRange("Item Attribute Value ID", ID);
        ItemAttributeValueMapping.DeleteAll();

        ItemVariantAttributeValueMapping.SetRange("Item Attribute ID", "Attribute ID");
        ItemVariantAttributeValueMapping.SetRange("Item Attribute Value ID", ID);
        ItemVariantAttributeValueMapping.DeleteAll();

        ItemAttrValueTranslation.SetRange("Attribute ID", "Attribute ID");
        ItemAttrValueTranslation.SetRange(ID, ID);
        ItemAttrValueTranslation.DeleteAll();
    end;

    var
        TransformationRule: Record "Transformation Rule";

        NameAlreadyExistsErr: Label 'The item attribute value with value ''%1'' already exists.', Comment = '%1 - arbitrary name';
        ReuseValueTranslationsQst: Label 'There are translations for item attribute value ''%1''.\\Do you want to reuse these translations for the new value ''%2''?', Comment = '%1 - arbitrary name,%2 - arbitrary name';
        DeleteUsedAttributeValueQst: Label 'This item attribute value has been assigned to at least one item or item variant.\\Are you sure you want to delete it?';
        RenameUsedAttributeValueQst: Label 'This item attribute value has been assigned to at least one item or item variant.\\Are you sure you want to rename it?';
        CategoryStructureNotValidErr: Label 'The item category structure is not valid. The category %1 is a parent of itself or any of its children.', Comment = '%1 - Category Name';

    procedure LookupAttributeValue(AttributeID: Integer; var AttributeValueID: Integer)
    var
        ItemAttributeValue: Record "Item Attribute Value";
        ItemAttributeValues: Page "Item Attribute Values";
    begin
        ItemAttributeValue.SetRange("Attribute ID", AttributeID);
        ItemAttributeValues.LookupMode := true;
        ItemAttributeValues.SetTableView(ItemAttributeValue);
        if ItemAttributeValue.Get(AttributeID, AttributeValueID) then
            ItemAttributeValues.SetRecord(ItemAttributeValue);
        if ItemAttributeValues.RunModal() = ACTION::LookupOK then begin
            ItemAttributeValues.GetRecord(ItemAttributeValue);
            AttributeValueID := ItemAttributeValue.ID;
        end;
    end;

    procedure GetAttributeNameInCurrentLanguage(): Text[250]
    var
        ItemAttribute: Record "Item Attribute";
    begin
        if ItemAttribute.Get("Attribute ID") then
            exit(ItemAttribute.GetNameInCurrentLanguage());
        exit('');
    end;

    procedure GetValueInCurrentLanguage() ValueTxt: Text[250]
    var
        ItemAttribute: Record "Item Attribute";
    begin
        ValueTxt := GetValueInCurrentLanguageWithoutUnitOfMeasure();

        if ItemAttribute.Get("Attribute ID") then
            case ItemAttribute.Type of
                ItemAttribute.Type::Integer,
              ItemAttribute.Type::Decimal:
                    if ValueTxt <> '' then
                        exit(AppendUnitOfMeasure(ValueTxt, ItemAttribute));
            end;

        OnAfterGetValueInCurrentLanguage(Rec, ValueTxt);
    end;

    procedure GetValueInCurrentLanguageWithoutUnitOfMeasure(): Text[250]
    var
        ItemAttribute: Record "Item Attribute";
    begin
        if ItemAttribute.Get("Attribute ID") then
            case ItemAttribute.Type of
                ItemAttribute.Type::Option:
                    exit(GetTranslatedName(GlobalLanguage));
                ItemAttribute.Type::Text:
                    exit(Value);
                ItemAttribute.Type::Integer:
                    if Value <> '' then
                        exit(Format(Value));
                ItemAttribute.Type::Decimal:
                    if Value <> '' then
                        exit(Format("Numeric Value"));
                ItemAttribute.Type::Date:
                    exit(Format("Date Value"));
                else begin
                    OnGetValueInCurrentLanguage(ItemAttribute, Rec);
                    exit(Value);
                end;
            end;
        exit('');
    end;

    procedure GetTranslatedName(LanguageID: Integer): Text[250]
    var
        Language: Codeunit Language;
        LanguageCode: Code[10];
    begin
        LanguageCode := Language.GetLanguageCode(LanguageID);
        if LanguageCode <> '' then
            exit(GetTranslatedNameByLanguageCode(LanguageCode));
        exit(Value);
    end;

    procedure GetTranslatedNameByLanguageCode(LanguageCode: Code[10]): Text[250]
    var
        ItemAttrValueTranslation: Record "Item Attr. Value Translation";
    begin
        if not ItemAttrValueTranslation.Get("Attribute ID", ID, LanguageCode) then
            exit(Value);
        exit(ItemAttrValueTranslation.Name);
    end;

    local procedure CheckValueUniqueness(ItemAttributeValue: Record "Item Attribute Value"; NameToCheck: Text[250])
    begin
        ItemAttributeValue.SetRange("Attribute ID", "Attribute ID");
        ItemAttributeValue.SetFilter(ID, '<>%1', ItemAttributeValue.ID);
        ItemAttributeValue.SetRange(Value, NameToCheck);
        if not ItemAttributeValue.IsEmpty() then
            Error(NameAlreadyExistsErr, NameToCheck);
    end;

    local procedure DeleteTranslationsConditionally(ItemAttributeValue: Record "Item Attribute Value"; NameToCheck: Text[250])
    var
        ItemAttrValueTranslation: Record "Item Attr. Value Translation";
    begin
        if (ItemAttributeValue.Value <> '') and (ItemAttributeValue.Value <> NameToCheck) then begin
            ItemAttrValueTranslation.SetRange("Attribute ID", "Attribute ID");
            ItemAttrValueTranslation.SetRange(ID, ID);
            if not ItemAttrValueTranslation.IsEmpty() then
                if not Confirm(StrSubstNo(ReuseValueTranslationsQst, ItemAttributeValue.Value, NameToCheck)) then
                    ItemAttrValueTranslation.DeleteAll();
        end;
    end;

    local procedure AppendUnitOfMeasure(String: Text; ItemAttribute: Record "Item Attribute"): Text
    begin
        if ItemAttribute."Unit of Measure" <> '' then
            exit(StrSubstNo('%1 %2', String, Format(ItemAttribute."Unit of Measure")));
        exit(String);
    end;

    procedure HasBeenUsed(): Boolean
    var
        ItemAttributeValueMapping: Record "Item Attribute Value Mapping";
        ItemVariantAttributeValueMapping: Record "Item Var. Attr. Value Mapping";
        AttributeHasBeenUsed: Boolean;
    begin
        ItemAttributeValueMapping.SetRange("Item Attribute ID", "Attribute ID");
        ItemAttributeValueMapping.SetRange("Item Attribute Value ID", ID);
        AttributeHasBeenUsed := not ItemAttributeValueMapping.IsEmpty();

        if not AttributeHasBeenUsed then begin
            ItemVariantAttributeValueMapping.SetRange("Item Attribute ID", "Attribute ID");
            ItemVariantAttributeValueMapping.SetRange("Item Attribute Value ID", ID);
            AttributeHasBeenUsed := not ItemVariantAttributeValueMapping.IsEmpty();
        end;

        OnAfterHasBeenUsed(Rec, AttributeHasBeenUsed);
        exit(AttributeHasBeenUsed);
    end;

    procedure SetValueFilter(var ItemAttribute: Record "Item Attribute"; FilterText: Text)
    var
        IndexOfOrCondition: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetValueFilter(Rec, ItemAttribute, FilterText, IsHandled);
        if IsHandled then
            exit;

        SetRange("Numeric Value");
        SetRange(Value);

        if IsNumeric(ItemAttribute) then begin
            SetFilter("Numeric Value", FilterText);
            exit;
        end;

        if ItemAttribute.Type = ItemAttribute.Type::Text then
            if (StrPos(FilterText, '*') = 0) and (StrPos(FilterText, '''') = 0) then begin
                FilterText := StrSubstNo('@*%1*', LowerCase(FilterText));
                IndexOfOrCondition := StrPos(FilterText, '|');
                if IndexOfOrCondition > 0 then begin
                    TransformationRule.Init();
                    TransformationRule."Find Value" := '|';
                    TransformationRule."Replace Value" := '*|@*';
                    TransformationRule."Transformation Type" := TransformationRule."Transformation Type"::Replace;
                    FilterText := TransformationRule.TransformText(FilterText);
                end
            end;

        if ItemAttribute.Type = ItemAttribute.Type::Date then
            if FilterText <> '' then begin
                SetFilter("Date Value", FilterText);
                exit;
            end;

        SetFilter(Value, FilterText);
    end;

    local procedure IsNumeric(var ItemAttribute: Record "Item Attribute"): Boolean
    begin
        exit(ItemAttribute.Type in [ItemAttribute.Type::Integer, ItemAttribute.Type::Decimal]);
    end;

    procedure LoadItemAttributesFactBoxData(KeyValue: Code[20])
    var
        ItemAttributeValueMapping: Record "Item Attribute Value Mapping";
        ItemAttributeValue: Record "Item Attribute Value";
    begin
        Reset();
        DeleteAll();
        ItemAttributeValueMapping.SetRange("Table ID", Database::Item);
        ItemAttributeValueMapping.SetRange("No.", KeyValue);
        if ItemAttributeValueMapping.FindSet() then
            repeat
                if ItemAttributeValue.Get(ItemAttributeValueMapping."Item Attribute ID", ItemAttributeValueMapping."Item Attribute Value ID") then begin
                    TransferFields(ItemAttributeValue);
                    OnLoadItemAttributesFactBoxDataOnBeforeInsert(ItemAttributeValueMapping, Rec);
                    Insert();
                end
            until ItemAttributeValueMapping.Next() = 0;
    end;

    procedure LoadCategoryAttributesFactBoxData(CategoryCode: Code[20])
    var
        ItemAttributeValueMapping: Record "Item Attribute Value Mapping";
        ItemAttributeValue: Record "Item Attribute Value";
        ItemCategory: Record "Item Category";
        Categories: List of [Code[20]];
    begin
        Reset();
        DeleteAll();
        if CategoryCode = '' then
            exit;
        ItemAttributeValueMapping.SetRange("Table ID", Database::"Item Category");
        repeat
            if not Categories.Contains(CategoryCode) then
                Categories.Add(CategoryCode)
            else
                Error(CategoryStructureNotValidErr, CategoryCode);

            ItemAttributeValueMapping.SetRange("No.", CategoryCode);
            if ItemAttributeValueMapping.FindSet() then
                repeat
                    if ItemAttributeValue.Get(ItemAttributeValueMapping."Item Attribute ID", ItemAttributeValueMapping."Item Attribute Value ID") then
                        if not AttributeExists(ItemAttributeValue."Attribute ID") then begin
                            TransferFields(ItemAttributeValue);
                            OnLoadItemAttributesFactBoxDataOnBeforeInsert(ItemAttributeValueMapping, Rec);
                            Insert();
                        end;
                until ItemAttributeValueMapping.Next() = 0;
            if ItemCategory.Get(CategoryCode) then
                CategoryCode := ItemCategory."Parent Category"
            else
                CategoryCode := '';
        until CategoryCode = '';
    end;

    procedure LoadItemVariantAttributesFactBoxData(ItemNo: Code[20]; VariantCode: Code[10])
    var
        ItemVariantAttributeValueMapping: Record "Item Var. Attr. Value Mapping";
        ItemAttributeValue: Record "Item Attribute Value";
    begin
        Reset();
        DeleteAll();
        ItemVariantAttributeValueMapping.SetRange("Item No.", ItemNo);
        ItemVariantAttributeValueMapping.SetRange("Variant Code", VariantCode);
        if ItemVariantAttributeValueMapping.FindSet() then
            repeat
                if ItemAttributeValue.Get(ItemVariantAttributeValueMapping."Item Attribute ID", ItemVariantAttributeValueMapping."Item Attribute Value ID") then begin
                    TransferFields(ItemAttributeValue);
                    Insert();
                end
            until ItemVariantAttributeValueMapping.Next() = 0;
    end;

    procedure AttributeExists(AttributeID: Integer) AttribExist: Boolean
    begin
        SetRange("Attribute ID", AttributeID);
        AttribExist := not IsEmpty();
        Reset();
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetValueInCurrentLanguage(ItemAttributeValue: Record "Item Attribute Value"; var ValueTxt: Text[250])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterHasBeenUsed(ItemAttributeValue: Record "Item Attribute Value"; var AttributeHasBeenUsed: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetValueFilter(var ItemAttributeValue: Record "Item Attribute Value"; ItemAttribute: Record "Item Attribute"; FilterText: Text; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetValueInCurrentLanguage(ItemAttribute: Record "Item Attribute"; var ItemAttributeValue: Record "Item Attribute Value")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLoadItemAttributesFactBoxDataOnBeforeInsert(var ItemAttributeValueMapping: Record "Item Attribute Value Mapping"; var ItemAttributeValue: Record "Item Attribute Value")
    begin
    end;
}