diff --git a/404.html b/404.html index aab24519..d26e1168 100644 --- a/404.html +++ b/404.html @@ -2,17 +2,17 @@ - + 404 Page not found :: BC AL Help - - - - - - - - + + + + + + + + diff --git a/CNAME b/CNAME deleted file mode 100644 index b62ee1d5..00000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -bcalhelp.dev \ No newline at end of file diff --git a/bcbestpractices/index.html b/bcbestpractices/index.html index 76b4e0a3..a659bbf1 100644 --- a/bcbestpractices/index.html +++ b/bcbestpractices/index.html @@ -2,20 +2,20 @@ - + BC Dev. Best Practices :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev - - - + + +
- - - + + +
- - - + + +
- - - + + +
- - - + + +
- - - + + +
@@ -215,23 +219,23 @@ BC AL Help . dev

Argument Table

-

Argument table pattern

-

Originally By Nikola Kukrika and Waldo

-

Abstract

+

Argument table pattern

+

Originally By Nikola Kukrika and waldo

+

Abstract

The Argument Table pattern is used to provide an extension point for adding new arguments without changing the signature. By grouping multiple arguments into a table the code becomes more readable (function signature and the usage of the function).

-

Problem

+

Problem

In CAL overloading function signature is not supported. It is also not possible to provide default values for the function arguments.

When an argument needs to be added to the function, the existing function needs to be extracted to a new method with an additional argument and the original function will call new method. This will cause an upgrade problem in the future, since the entire body of the method is replaced.

Second commonly occurring problem is option duplication. In order to pass options often they are duplicated in the signature.

The last problem that can be solved is high number of arguments. Functions with a high number of arguments are hard to understand. Having arguments grouped within the table with a meaningful name will improve readability and make code easier to understanding.

Few examples of the bad implementations are as illustrated here:

-

Bad example 1

+

Bad example 1

PROCEDURE FillInVATReturnData@1200001(VAR DeclarationID@1200000 : Code [20];VAR LineID@1200001 : Code [20];VAR PeerID@1200002 : Code [20]; VAR DocumentNo@1200003: Code[20]; VAR NumberOfCopies@1200007: Integer; VAR Uploaded@1200004 : Boolean; VAR Correction@1200005 : Boolean; VAR HasValidationErr@1200006 : Boolean);
 

Call

FillInVATReturnData(NoSeries, NextLineID, CustomerID, DocumentNo, SingleCopy, ???, ??, ...., ...)
 

In this example the code is hard to read and understand. Adding an additional argument will require refactoring of the existing function. Each time a new argument is added a new function will be created.

-

Bad example 2

+

Bad example 2

LOCAL PROCEDURE GetTableSyncSetupW1@3(OldTableId@1002 : Integer; VAR UpgradeTableId@1001 : Integer; VAR TableUpgradeMode@1000 : 'Check, Copy, Move, Force') : Boolean;  
 BEGIN  
     CASE OldTableId OF  
@@ -247,13 +251,13 @@ BC AL Help . dev
     EXIT(TRUE);  
 END;
 

In this example each time a new argument is added all function calls will have to be updated. Option is duplicated in the signature, which will cause issues if a new option is defined or the existing options are renamed.

-

Solution

+

Solution

By grouping the arguments within the table it is possible to add additional argument and reuse it where it is needed without changing the signature.

Multiple parameters are grouped within the single object with a meaningful name so the code becomes more readable.

It is possible to assign default values and to have the code validation.

Argument table should preferably be a temporary table since the implementation is simpler.

The examples of usages addressing problems shown above are:

-

Good example 1

+

Good example 1

New table

TAB 50003 VAT Return Data  
 PROCEDURE FillInVATReturnData@1200001(VAR VATReturnData@1200000 : Record 50003);
@@ -264,7 +268,7 @@ VATReturnData.Uploaded (VATReturnData);
 

By introducing an argument table, code is much more readable since there is a single argument for a function. It is easy to see which arguments are passed in and which are modified in a function.

-

Good example 2

+

Good example 2

Good example

PROCEDURE GetTableSyncSetupW1@3(VAR TableSynchSetup@1000 : Record 2000000135); 
 BEGIN  
@@ -273,12 +277,12 @@ FillInVATReturnData(VATReturnData(DATABASE::"Payment Export Data",0,TableSynchSetup.Mode::Force);  
 END;
 

Option definition is not encapsulated within the table. Arguments are grouped and we can add additional arguments without the need to change the signature.

-

Downsides

+

Downsides

You need to create one more table

Complex types can’t be embedded as fields in tables (cannot have a record field type etc).

-

NAV Usages

+

Upgrade Codeunits

-

Related Patterns

+

Posting Routine, Select behavior: Setting fields on existing records in order not to change the signatures.

@@ -292,12 +296,12 @@ FillInVATReturnData(VATReturnData
- - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/blocked-entity/data-driven-blocked-entity/index.html b/navpatterns/1-patterns/blocked-entity/data-driven-blocked-entity/index.html index 359d0b4b..49a2c70a 100644 --- a/navpatterns/1-patterns/blocked-entity/data-driven-blocked-entity/index.html +++ b/navpatterns/1-patterns/blocked-entity/data-driven-blocked-entity/index.html @@ -2,19 +2,19 @@ - + Data Driven Blocked Entity :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev - - - + + +
    @@ -199,7 +199,17 @@ BC AL Help . dev
@@ -208,9 +218,9 @@ BC AL Help . dev

Data Driven Blocked Entity

Written by Bogdan Andrei Sturzoiu, at Microsoft Development Center Copenhagen

-

Abstract

+

Abstract

This pattern implements a generic mechanism for dynamically restricting and allowing usage of a record by the business process administrator.

-

Problem

+

Problem

A NAV record can be used in a number of functionalities across the app. There are situations, however, when the administrator wants to restrict the consumption of such a record, as well as lift the restriction when it is no longer relevant.

For example, a new customer record should not be used for posting documents until it is approved by the relevant approver.

We could solve this by using the Blocked Entity pattern, but it requires database schema changes, which have an upgrade impact.

@@ -220,7 +230,7 @@ BC AL Help . dev
  • Adding specific code for the record in every place where the restriction needs to be enforced.
  • In contrast, the Data-driven Blocked Entity pattern involves adding a new record (data change) to mark the restriction, instead of adding a new field (metadata change).

    -

    Solution

    +

    Solution

    This pattern describes a generic mechanism of adding and lifting restrictions for any type of record.

    The restriction mechanism has the following elements:

      @@ -234,8 +244,7 @@ BC AL Help . dev
    1. A purpose (e.g. the record cannot be posted).
    2. You must make sure to differentiate between the reason and the purpose. That is because the restriction can only be added once per record, but consumed in multiple places.

      -
      -

      Example

      +

      Example

      For example, we want to restrict posting Gen. Journal Lines if a customer has not been added in Account No. field.

      For this, the following components are needed:

        @@ -243,7 +252,7 @@ BC AL Help . dev
      1. When you validate a Customer No. as Account no. and Customer as Account Type, lift the restrictions by calling AllowRecordUsage in COD1550.
      2. The consumption of the restriction at posting is already implemented as an event in TAB81, OnCheckGenJournalLinePostRestrictions. No further action necessary.
      -

      NAV Usage

      +

      All the approval workflows include a response that restricts usage of a record, and then, at the end of an approval loop, a response that allows the usage again by lifting the restriction. See responses “Add record restriction” and “Remove record restriction” implemented in COD1521.

      The code behind the “Add record restriction” workflow response:

      @@ -270,11 +279,10 @@ RecordRestrictionMgt.RestrictRecordUsage(RecRef.RECORDID,STRSUBSTNO(RestrictUsag RecordRestrictionMgt.AllowRecordUsage(RecRef.RECORDID); END;

      Notice how lifting a restriction for a Gen. Journal Batch involves lifting all the restrictions for the individual journal lines in the batch (hence the special branching of the code).

      -
      -

      Consequences

      +

      Consequences

      Currently, there can only be one restriction per record. There are no restriction types.

      In the future, a type field should be added to the restriction table, to allow adding restrictions for different purposes, and to refine their consumption. For example, a posting restriction might only be enforced for restrictions originating from approvals.

      -

      NAV Versions

      +

      This pattern has been introduced in Dynamics NAV 2016.

      @@ -288,12 +296,12 @@ RecordRestrictionMgt.RestrictRecordUsage(RecRef.RECORDID,STRSUBSTNO(RestrictUsag
      - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/blocked-entity/index.html b/navpatterns/1-patterns/blocked-entity/index.html index 2d143e21..c6c9a006 100644 --- a/navpatterns/1-patterns/blocked-entity/index.html +++ b/navpatterns/1-patterns/blocked-entity/index.html @@ -2,20 +2,20 @@ - + Blocked Entity :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev - - - + + +
        @@ -286,12 +286,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/blocked-entity/index.xml b/navpatterns/1-patterns/blocked-entity/index.xml index ea8fe699..4550b67e 100644 --- a/navpatterns/1-patterns/blocked-entity/index.xml +++ b/navpatterns/1-patterns/blocked-entity/index.xml @@ -1,5 +1,3 @@ Blocked Entity on BC AL Helphttps://bcalhelp.dev/navpatterns/1-patterns/blocked-entity/Recent content in Blocked Entity on BC AL HelpHugo -- gohugo.ioen-usData Driven Blocked Entityhttps://bcalhelp.dev/navpatterns/1-patterns/blocked-entity/data-driven-blocked-entity/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/blocked-entity/data-driven-blocked-entity/Written by Bogdan Andrei Sturzoiu, at Microsoft Development Center Copenhagen -Abstract -This pattern implements a generic mechanism for dynamically restricting and allowing usage of a record by the business process administrator. -Problem -A NAV record can be used in a number of functionalities across the app. There are situations, however, when the administrator wants to restrict the consumption of such a record, as well as lift the restriction when it is no longer relevant. \ No newline at end of file +Abstract This pattern implements a generic mechanism for dynamically restricting and allowing usage of a record by the business process administrator. +Problem A NAV record can be used in a number of functionalities across the app. There are situations, however, when the administrator wants to restrict the consumption of such a record, as well as lift the restriction when it is no longer relevant. \ No newline at end of file diff --git a/navpatterns/1-patterns/cached-web-service-calls/index.html b/navpatterns/1-patterns/cached-web-service-calls/index.html index 3280bee7..3f83768c 100644 --- a/navpatterns/1-patterns/cached-web-service-calls/index.html +++ b/navpatterns/1-patterns/cached-web-service-calls/index.html @@ -2,19 +2,19 @@ - + Cached Web Server Calls :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -330,12 +330,12 @@ OnAction=VAR
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/conditional-cascading-update/index.html b/navpatterns/1-patterns/conditional-cascading-update/index.html index ebd7dac3..d9eec37c 100644 --- a/navpatterns/1-patterns/conditional-cascading-update/index.html +++ b/navpatterns/1-patterns/conditional-cascading-update/index.html @@ -2,19 +2,19 @@ - + Conditional Cascading Update :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -200,11 +200,11 @@ BC AL Help . dev @@ -215,18 +215,18 @@ BC AL Help . dev

        Conditional Cascading Update

        _Originally by Jan Hoek at IDYN _

        -

        Abstract

        +

        Abstract

        The Conditional Cascading Update pattern is used to intelligently populate fields whose values depend on other field values. In this pattern description, the field triggering the update will be called “source field”, and the depending field will be called “target field”.

        -

        Description

        +

        Description

        The value of one table field sometimes depends on the value of another field, typically following an application-defined transformation (note that we’re talking about transformations of field values here. This has nothing to do with e.g. form transformation), such as conversion to uppercase, removal of certain characters etc.

        If the target field is non-editable, said transformation is usually the only way for the target field to receive new values, so no irreproducible information can be lost. However, if the target field is editable, the user may have cared enough to override the default (transformed) value, in which case revalidating the source field should not blindly replace the target field’s value.

        -

        Usage

        +

        Usage

        In the OnValidate trigger of the source field, test if the target field value is either blank, or equal to the transformed value of the source field’s previous contents. If it is, populate the target field’s value with the transformed source field value. If it is not, do nothing (effectively preserving the value set by the user).

        - +

        In the base application, this pattern can be found in Search Name/Search Description fields, which are updated with the uppercase value from the corresponding Name/Description field when the latter is validated, only if the Search Name/Description in question is currently blank, or equal to the (uppercase equivalent) of the previous contents of the Name/Description field.

        In this particular case, the transformation between source and target fields is implicit and due to the different data types of the fields (text vs. code). Note how the field triggers of the Search Name field itself do not contain any logic linked to this pattern.

        -

        Consequences

        +

        Consequences

        There is a case when this pattern should not be used. If the target field is non-editable, this pattern will not add any value, since there won’t be any user-overridden values to protect.

        @@ -240,12 +240,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/copy-document/clip_image002.gif-750x0.png b/navpatterns/1-patterns/copy-document/clip_image002.gif-750x0.png new file mode 100644 index 00000000..a447a4bf Binary files /dev/null and b/navpatterns/1-patterns/copy-document/clip_image002.gif-750x0.png differ diff --git a/navpatterns/1-patterns/copy-document/clip_image004.gif-750x0.png b/navpatterns/1-patterns/copy-document/clip_image004.gif-750x0.png new file mode 100644 index 00000000..35ebe222 Binary files /dev/null and b/navpatterns/1-patterns/copy-document/clip_image004.gif-750x0.png differ diff --git a/navpatterns/1-patterns/copy-document/index.html b/navpatterns/1-patterns/copy-document/index.html index 61691346..445c5b41 100644 --- a/navpatterns/1-patterns/copy-document/index.html +++ b/navpatterns/1-patterns/copy-document/index.html @@ -2,19 +2,19 @@ - + Copy Document :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -253,10 +253,10 @@ BC AL Help . dev
      • Source Document Type
      • Source Document No.
      • Include Header (optional)
      • -
      • Recalculate Lines (optional) -Example: REP901, Copy Assembly Document
      • +
      • Recalculate Lines (optional)
      -

      +

      Example: REP901, Copy Assembly Document

      +

      Usage Sequence

      Precondition: The user creates a new destination document Header, filling up the required information.

      Step 1: The user runs the Copy Document report (element no. 4), filling up the parameters:

      @@ -268,7 +268,7 @@ Example: REP901, Copy Assembly Document

      Step 2: The report copies the information in the source tables (Header and Line) into the destination tables (Header and Line).

      Post processing: The user performs additional editing of the destination document.

      The sequence flow of the pattern is described in the following diagram.

      -

      +

      Example: Copy Sales Document for Credit Memos.

      In the standard version of Microsoft Dynamics NAV, the Copy Document functionality is implemented in the Sales Credit Memo window as shown in the following section.

      ***

      @@ -299,12 +299,12 @@ Example: REP901, Copy Assembly Document
      - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/create-data-from-templates/index.html b/navpatterns/1-patterns/create-data-from-templates/index.html index c097ff05..1943c4b1 100644 --- a/navpatterns/1-patterns/create-data-from-templates/index.html +++ b/navpatterns/1-patterns/create-data-from-templates/index.html @@ -2,19 +2,19 @@ - + Create Data from Templates :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -250,44 +250,41 @@ BC AL Help . dev

        Code example (Insert a record, apply a template, and insert the related templates):

        // First insert a record Customer.INSERT(TRUE);

        // Apply a template RecRef.GETTABLE(Customer);

        -

        ConfigTemplateMgt.UpdateRecord(ConfigTemplateHeader,RecRef);

        -

        RecRef.SETTABLE(Customer);

        -

        // Insert Dimensions – related templates

        -

        MiniDimensionsTemplate.InsertDimensionsFromTemplates(ConfigTemplateHeader,Customer.“No.",DATABASE::Customer);

        -

        Code to insert related templates (dimensions):

        -

        FUNCTION InsertDimensionsFromTemplates(ConfigTemplateHeader : Record “Config. Template Header”;MasterRecordNo : Code[20];TableID : Integer)

        -

        // There are multiple records (multiple dimensions per master record)

        -

        // We have to set filter****

        -

        ConfigTemplateLine.SETRANGE(Type,ConfigTemplateLine.Type::“Related Template”);****

        -

        ConfigTemplateLine.SETRANGE(“Data Template Code”,ConfigTemplateHeader.Code);****

        -
        -

        IF ConfigTemplateLine.FINDSET THEN****

        -

        REPEAT****

        -

        ConfigTemplateHeader.GET(ConfigTemplateLine.“Template Code”);

        -

        // Ensure that the table where the template belongs to is Dimensions

        -

        // We could have other related templates****

        -

        IF ConfigTemplateHeader.“Table ID” = DATABASE::“Default Dimension” THEN****

        -

        InsertDimensionFromTemplate(ConfigTemplateHeader,MasterRecordNo,TableID);****

        -

        UNTIL ConfigTemplateLine.NEXT = 0;****

        -
        -

        // Create a new Dimensions Record and link it to the Master Record****

        -

        FUNCTION InsertDimensionFromTemplate(ConfigTemplateHeader : Record “Config. Template Header”;MasterRecordNo : Code[20];TableID : Integer)

        -

        DefaultDimension.INIT;

        -

        DefaultDimension.“No.” := MasterRecordNo;****

        -

        DefaultDimension.“Table ID” := TableID;****

        -

        DefaultDimension.“Dimension Code” := GetDefaultDimensionCode(ConfigTemplateHeader);****

        -

        DefaultDimension.INSERT;****

        -
        -

        RecRef.GETTABLE(DefaultDimension);****

        -

        ConfigTemplateMgt.UpdateRecord(ConfigTemplateHeader,RecRef);****

        -

        RecRef.SETTABLE(DefaultDimension);

        -

        To surface the action in the product, you have three options:

        +
        ConfigTemplateMgt.UpdateRecord(ConfigTemplateHeader,RecRef);
        +RecRef.SETTABLE(Customer);
        +

        // Insert Dimensions – related templates

        +
        MiniDimensionsTemplate.InsertDimensionsFromTemplates(ConfigTemplateHeader,Customer."No.",DATABASE::Customer); 
        +

        Code to insert related templates (dimensions):

        +
        FUNCTION InsertDimensionsFromTemplates(ConfigTemplateHeader : Record "Config. Template Header";MasterRecordNo : Code\[20\];TableID : Integer)
        +  // There are multiple records (multiple dimensions per master record)
        +  // We have to set filter
        +  ConfigTemplateLine.SETRANGE(Type,ConfigTemplateLine.Type::"Related Template");
        +  ConfigTemplateLine.SETRANGE("Data Template Code",ConfigTemplateHeader.Code
        +  IF ConfigTemplateLine.FINDSET THEN
        +  REPEAT
        +    ConfigTemplateHeader.GET(ConfigTemplateLine."Template Code");
        +    // Ensure that the table where the template belongs to is Dimensions
        +    // We could have other related templates
        +    IF ConfigTemplateHeader."Table ID" = DATABASE::"Default Dimension" THEN
        +    InsertDimensionFromTemplate(ConfigTemplateHeader,MasterRecordNo,TableID);
        +  UNTIL ConfigTemplateLine.NEXT = 0;
        +

        // Create a new Dimensions Record and link it to the Master Record****

        +
        FUNCTION InsertDimensionFromTemplate(ConfigTemplateHeader : Record "Config. Template Header";MasterRecordNo : Code\[20\];TableID : Integer)
        +  DefaultDimension.INIT;
        +  DefaultDimension."No." := MasterRecordNo;
        +  DefaultDimension."Table ID" := TableID;
        +  DefaultDimension."Dimension Code" := GetDefaultDimensionCode(ConfigTemplateHeader);
        +  DefaultDimension.INSERT;
        +  RecRef.GETTABLE(DefaultDimension);
        +  ConfigTemplateMgt.UpdateRecord(ConfigTemplateHeader,RecRef);
        +  RecRef.SETTABLE(DefaultDimension); 
        +

        To surface the action in the product, you have three options:

        1. Recommended - Implement a separate action called New from Template.
        2. Optional - Implement the apply template function on the document itself. This is especially good in scenarios where users are allowed to change the template.
        3. Alternative - Remove the new action by configuration or set Insert Allowed to FALSE on the list (this will block the creation of new records from the lookup). Implement an application action named New and tie it to your code.
        -

        **Note: ** In Microsoft Dynamics C5 2014, we chose to remove the New action with configuration since we wanted to promote the functionality and avoid the confusion in having too many options. However this might be difficult to maintain with a larger set of pages.

        +

        Note: In Microsoft Dynamics C5 2014, we chose to remove the New action with configuration since we wanted to promote the functionality and avoid the confusion in having too many options. However this might be difficult to maintain with a larger set of pages.

        To view or edit templates, you have two options:

        1. Use the Config. Template List table (8620) and the **Config. Template Header Card **table (8618).
        2. @@ -322,7 +319,8 @@ BC AL Help . dev

          In C5 2014, this is the workflow:

          The user opens the Customers List window and selects New

          ** **

          -

          ****From this page, the user can view the template, edit it, or create a new one. Selecting a template will populate the customer card and open a new record. From the existing record, the user has options to save as a template or opening a list of templates to maintain available templates. Selecting a template will populate the customer card and open a new record. From the existing record, the user has options to save as a template or opening a list of templates to maintain available templates.

          +

          +

          From this page, the user can view the template, edit it, or create a new one. Selecting a template will populate the customer card and open a new record. From the existing record, the user has options to save as a template or opening a list of templates to maintain available templates. Selecting a template will populate the customer card and open a new record. From the existing record, the user has options to save as a template or opening a list of templates to maintain available templates.

          From the **Customer Card Template **window, we can invoke the Dimensions action, through which we can define the dimensions that will be inserted together with the template:

          @@ -332,8 +330,8 @@ BC AL Help . dev
        3. Temporary template tables:

            -
          • **Mini Customer Template **table (1300)
          • -
          • **Mini Item Template **table (1301)
          • +
          • Mini Customer Template table (1300)
          • +
          • Mini Item Template table (1301)
          • Mini Dimensions Template table(1302)
          • Mini Vendor Template table (1303)
          @@ -342,7 +340,7 @@ BC AL Help . dev

          Pages to define templates:

          • Mini Customer Template Card page (1341)
          • -
          • **Mini Item Template Card **page (,1342)
          • +
          • Mini Item Template Card page (,1342)
          • Mini Dimensions Template List page (1343)
          • Mini Vendor Template Card page (1344)
          @@ -380,12 +378,12 @@ BC AL Help . dev
          - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/create-urls-to-nav-clients/index.html b/navpatterns/1-patterns/create-urls-to-nav-clients/index.html index c98ce902..89e91ad6 100644 --- a/navpatterns/1-patterns/create-urls-to-nav-clients/index.html +++ b/navpatterns/1-patterns/create-urls-to-nav-clients/index.html @@ -2,19 +2,19 @@ - + Create URLs to NAV Clients :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -239,9 +239,10 @@ BC AL Help . dev
      • Object Type and Object ID define the type of the application object to run (Table, Page, Report, Codeunit, Query, or XMLport) and its ID.
      • Record specifies the actual data to run the URL on, such as:
      -

      Vendor.GET(“Account No.");

      -

      GETURL(CLIENTTYPE:WEB,COMPANYNAME, OBJECTTYPE::Page,27,Vendor)

      -

      Note: It is currently not possible to set filters on the record that you sent as a last parameter to the GETURL function. However, it is possible to write your own code to compute and append the filter string to the URL that is created by the GETURL function.

      +
      Vendor.GET("Account No.");
      +
      +GETURL(CLIENTTYPE:WEB,COMPANYNAME, OBJECTTYPE::Page,27,Vendor)
      +

      Note: It is currently not possible to set filters on the record that you sent as a last parameter to the GETURL function. However, it is possible to write your own code to compute and append the filter string to the URL that is created by the GETURL function.

      The server name and instance are extracted automatically by GETURL and do not need to be specified by the C/AL developer. Furthermore, the multitenancy setup is transparent to the C/AL developer. No multitenancy parameters are specified when you call GETURL, because the function knows from the server setup if it is running in a multitenant environment and if so, it will add a string like “&tenant=MyTenant” to the URL.

      When to Use

      The GETURL function can generally be used every time a URL must be created. The following are some scenarios where the function is particularly useful.

      @@ -254,113 +255,216 @@ BC AL Help . dev

      The following are examples of calls to GETURL and their corresponding return value:

      Command

      URL

      -

      GETURL(CLIENTTYPE::Win)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71//

      -

      GETURL(CLIENTTYPE::Web)

      -

      https://navwebsrvr:443/DynamicsNAV71_Instance1/Webclient

      -

      GETURL(CLIENTTYPE::OData)

      -

      http://MyServer:7048/DynamicsNAV71/OData

      -

      GETURL(CLIENTTYPE::SOAP)

      -

      http://MyServer:7047/DynamicsNAV71/WS/Services

      -

      GETURL(CLIENTTYPE::Current) ie. When running this code on a Win client session

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71//

      -

      GETURL(CLIENTTYPE::Default) ie. When the Server config key DefaultClient is set to Windows

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71//

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/

      -

      GETURL(CLIENTTYPE::Windows,'')

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71//

      -

      GETURL(CLIENTTYPE::Windows,‘NONEXISTING Corp’)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/NONEXISTING Corp/

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME)

      -

      https://navwebsrvr:443/DynamicsNAV71_Instance1/Webclient?company=CRONUS

      -

      GETURL(CLIENTTYPE::Web,'')

      -

      https://navwebsrvr:443/DynamicsNAV71_Instance1/Webclient

      -

      GETURL(CLIENTTYPE::Web,‘NONEXISTING Corp’)

      -

      https://navwebsrvr:443/DynamicsNAV71_Instance1/Webclient?company=NONEXISTING Corp

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME)

      -

      http://MyServer:7048/DynamicsNAV71/OData/Company(‘CRONUS’)

      -

      GETURL(CLIENTTYPE::OData,'')

      -

      http://MyServer:7048/DynamicsNAV71/OData

      -

      GETURL(CLIENTTYPE::OData,‘NONEXISTING Corp’)

      -

      http://MyServer:7048/DynamicsNAV71/OData/Company(‘NONEXISTING Corp’)

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME)

      -

      http://MyServer:7047/DynamicsNAV71/WS/CRONUS/Services

      -

      GETURL(CLIENTTYPE::SOAP,'')

      -

      http://MyServer:7047/DynamicsNAV71/WS/Services

      -

      GETURL(CLIENTTYPE::SOAP,‘NONEXISTING Corp’)

      -

      http://MyServer:7047/DynamicsNAV71/WS/NONEXISTING Corp/Services

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Table,27)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runtable?table=27

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Page,27)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runpage?page=27

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Report,6)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runreport?report=6

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Codeunit,5065)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runcodeunit?codeunit=5065

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Query,9150)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runquery?query=9150

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::XmlPort,5150)

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runxmlport?xmlport=5150

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Page,27) ie. When the Web Service is published

      -

      http://MyServer:7048/DynamicsNAV71/OData/Company(‘CRONUS’)/PAG27Vendors

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Query,9150) ie. When the Web Service is published

      -

      http://MyServer:7048/DynamicsNAV71/OData/Company(‘CRONUS’)/QUE9150MyCustomers

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Page,27)Â ie. When the Web Service is published

      -

      http://MyServer:7047/DynamicsNAV71/WS/CRONUS/Page/PAG27Vendors

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Codeunit,5065) ie. When the Web Service is published

      -

      http://MyServer:7047/DynamicsNAV71/WS/CRONUS/Codeunit/COD5065EmailLogging

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Page,27,record) List Page

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runpage?page=27&bookmark=23;FwAAAAJ7/0kAQwAxADAAMwAw

      -

      GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Page,26,record) Card Page

      -

      dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runpage?page=26&bookmark=23;FwAAAAJ7/0kAQwAxADAAMwAw

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Page,27,record) List Page

      -

      https://navwebsrvr:443/DynamicsNAV71_Instance1/Webclient?company=CRONUS&page=27&bookmark=23;FwAAAAJ7/0kAQwAxADAAMwAw

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Page,26,record) Card Page

      -

      https://navwebsrvr:443/DynamicsNAV71_Instance1/Webclient?company=CRONUS&page=26&bookmark=23;FwAAAAJ7/0kAQwAxADAAMwAw

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Page,27,record)

      -

      http://MyServer:7048/DynamicsNAV71/OData/Company(‘CRONUS’)/PAG27Vendors(‘IC1030’)

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Page,27)

      -

      https://navwebsrvr:443/DynamicsNAV71_Instance1/Webclient?company=CRONUS&page=27

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Report,6)

      -

      https://navwebsrvr:443/DynamicsNAV71_Instance1/Webclient?company=CRONUS&report=6

      -

      If the GETURL function is called with invalid parameters, it will return an empty string. In that case, you can find the related error text by calling the GETLASTERRORTEXT function.

      +
      GETURL(CLIENTTYPE::Win)
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71//
      +
      +GETURL(CLIENTTYPE::Web)
      +
      +https://navwebsrvr:443/DynamicsNAV71\_Instance1/Webclient
      +
      +GETURL(CLIENTTYPE::OData)
      +
      +http://MyServer:7048/DynamicsNAV71/OData
      +
      +GETURL(CLIENTTYPE::SOAP)
      +
      +http://MyServer:7047/DynamicsNAV71/WS/Services
      +
      +GETURL(CLIENTTYPE::Current) ie. When running this code on a Win client session
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71//
      +
      +GETURL(CLIENTTYPE::Default) ie. When the Server config key DefaultClient is set to Windows
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71//
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME)
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/
      +
      +GETURL(CLIENTTYPE::Windows,'')
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71//
      +
      +GETURL(CLIENTTYPE::Windows,'NONEXISTING Corp')
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/NONEXISTING Corp/
      +
      +GETURL(CLIENTTYPE::Web,COMPANYNAME)
      +
      +https://navwebsrvr:443/DynamicsNAV71\_Instance1/Webclient?company=CRONUS
      +
      +GETURL(CLIENTTYPE::Web,'')
      +
      +https://navwebsrvr:443/DynamicsNAV71\_Instance1/Webclient
      +
      +GETURL(CLIENTTYPE::Web,'NONEXISTING Corp')
      +
      +https://navwebsrvr:443/DynamicsNAV71\_Instance1/Webclient?company=NONEXISTING Corp
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME)
      +
      +http://MyServer:7048/DynamicsNAV71/OData/Company('CRONUS')
      +
      +GETURL(CLIENTTYPE::OData,'')
      +
      +http://MyServer:7048/DynamicsNAV71/OData
      +
      +GETURL(CLIENTTYPE::OData,'NONEXISTING Corp')
      +
      +http://MyServer:7048/DynamicsNAV71/OData/Company('NONEXISTING Corp')
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME)
      +
      +http://MyServer:7047/DynamicsNAV71/WS/CRONUS/Services
      +
      +GETURL(CLIENTTYPE::SOAP,'')
      +
      +http://MyServer:7047/DynamicsNAV71/WS/Services
      +
      +GETURL(CLIENTTYPE::SOAP,'NONEXISTING Corp')
      +
      +http://MyServer:7047/DynamicsNAV71/WS/NONEXISTING Corp/Services
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Table,27)
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runtable?table=27
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Page,27)
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runpage?page=27
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Report,6)
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runreport?report=6
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Codeunit,5065)
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runcodeunit?codeunit=5065
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Query,9150)
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runquery?query=9150
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::XmlPort,5150)
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runxmlport?xmlport=5150
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Page,27) ie. When the Web Service is published
      +
      +http://MyServer:7048/DynamicsNAV71/OData/Company('CRONUS')/PAG27Vendors
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Query,9150) ie. When the Web Service is published
      +
      +http://MyServer:7048/DynamicsNAV71/OData/Company('CRONUS')/QUE9150MyCustomers
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Page,27)Â ie. When the Web Service is published
      +
      +http://MyServer:7047/DynamicsNAV71/WS/CRONUS/Page/PAG27Vendors
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Codeunit,5065) ie. When the Web Service is published
      +
      +http://MyServer:7047/DynamicsNAV71/WS/CRONUS/Codeunit/COD5065EmailLogging
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Page,27,record) List Page
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runpage?page=27&bookmark=23;FwAAAAJ7/0kAQwAxADAAMwAw
      +
      +GETURL(CLIENTTYPE::Windows,COMPANYNAME,OBJECTTYPE::Page,26,record) Card Page
      +
      +dynamicsnav://MyServer:7046/DynamicsNAV71/CRONUS/runpage?page=26&bookmark=23;FwAAAAJ7/0kAQwAxADAAMwAw
      +
      +GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Page,27,record) List Page
      +
      +https://navwebsrvr:443/DynamicsNAV71\_Instance1/Webclient?company=CRONUS&page=27&bookmark=23;FwAAAAJ7/0kAQwAxADAAMwAw
      +
      +GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Page,26,record) Card Page
      +
      +https://navwebsrvr:443/DynamicsNAV71\_Instance1/Webclient?company=CRONUS&page=26&bookmark=23;FwAAAAJ7/0kAQwAxADAAMwAw
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Page,27,record)
      +
      +http://MyServer:7048/DynamicsNAV71/OData/Company('CRONUS')/PAG27Vendors('IC1030')
      +
      +GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Page,27)
      +
      +https://navwebsrvr:443/DynamicsNAV71\_Instance1/Webclient?company=CRONUS&page=27
      +
      +GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Report,6)
      +
      +https://navwebsrvr:443/DynamicsNAV71\_Instance1/Webclient?company=CRONUS&report=6
      +
      +

      If the GETURL function is called with invalid parameters, it will return an empty string. In that case, you can find the related error text by calling the GETLASTERRORTEXT function.

      Function Call

      Error Message

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Table,27)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Codeunit,5065)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Query,9150)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::XmlPort,5150)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Table,27)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Page,27)

      -

      The Page object, 27, that is specified for the GetUrl function has not been published in the Web Services table.

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Report,6)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Codeunit,5065)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Query,9150)

      -

      The Query object, 9150, that is specified for the GetUrl function has not been published in the Web Services table.

      -

      GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::XmlPort,5150)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Table,27)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Page,27)

      -

      The Page object, 27, that is specified for the GetUrl function has not been published in the Web Services table.

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Report,6)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Codeunit,5065)

      -

      The Codeunit object, 5065, that is specified for the GetUrl function has not been published in the Web Services table.

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Query,9150)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::XmlPort,5150)

      -

      The specified object type parameter for the GetUrl function is not valid.

      -

      GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Page,27,record)

      -

      You cannot specify a record parameter for the GetUrl function when the object type is SOAP

      +
      GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Table,27)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Codeunit,5065)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::Query,9150)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::Web,COMPANYNAME,OBJECTTYPE::XmlPort,5150)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Table,27)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Page,27)
      +
      +The Page object, 27, that is specified for the GetUrl function has not been published in the Web Services table.
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Report,6)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Codeunit,5065)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::Query,9150)
      +
      +The Query object, 9150, that is specified for the GetUrl function has not been published in the Web Services table.
      +
      +GETURL(CLIENTTYPE::OData,COMPANYNAME,OBJECTTYPE::XmlPort,5150)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Table,27)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Page,27)
      +
      +The Page object, 27, that is specified for the GetUrl function has not been published in the Web Services table.
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Report,6)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Codeunit,5065)
      +
      +The Codeunit object, 5065, that is specified for the GetUrl function has not been published in the Web Services table.
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Query,9150)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::XmlPort,5150)
      +
      +The specified object type parameter for the GetUrl function is not valid.
      +
      +GETURL(CLIENTTYPE::SOAP,COMPANYNAME,OBJECTTYPE::Page,27,record)
      +
      +

      You cannot specify a record parameter for the GetUrl function when the object type is SOAP

      The following example shows how to use the GETURL function in codeunit 440 to ensure that the notification mail in Document Approvals can link to both the Microsoft Dynamics NAV Windows client and the Microsoft Dynamics NAV web client:

      @@ -379,12 +483,12 @@ BC AL Help . dev
      - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/creating-custom-charts/index.html b/navpatterns/1-patterns/creating-custom-charts/index.html index 66db758a..8166a071 100644 --- a/navpatterns/1-patterns/creating-custom-charts/index.html +++ b/navpatterns/1-patterns/creating-custom-charts/index.html @@ -2,19 +2,19 @@ - + Creating Custom Charts :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -267,7 +267,7 @@ BC AL Help . dev
      • Set Period, Work Date
      • Actions to filter the data set
      • Refresh
      • -
      • **Chart Information **– a tooltip with a description of the chart and how data is calculated.
      • +
      • Chart Information – a tooltip with a description of the chart and how data is calculated.

      Optional: Preserving User Personalization

      One of the most common functionalities is personalization. If the chart can be customized by the user, you should store the settings that the user has entered and apply them the next time the chart is loaded.

      @@ -290,21 +290,26 @@ BC AL Help . dev

      If you need a setup record and codeunit, then it is a good idea to encapsulate this logic within a method.

      Implementation of the Finance Performance Chart page (762)

      -

      BusinessChart::AddInReady()

      -

      UpdateChart(Period::" “);

      -

      LOCAL UpdateChart(Period : ‘,Next,Previous’)

      -

      MoveAndUpdateChart(Period,0);

      -

      LOCAL MoveAndUpdateChart(Period : ‘,Next,Previous’;Move : Integer)

      -

      AccSchedChartManagement.GetSetupRecordset(AccountSchedulesChartSetup,AccountSchedulesChartSetup.Name,Move);

      -

      AccSchedChartManagement.UpdateData(Rec,Period,AccountSchedulesChartSetup);

      -

      Update(CurrPage.BusinessChart);

      -

      StatusText := GetCurrentSelectionText(“Period Filter Start Date”,“Period Filter End Date”);

      -

      In the MoveAndUpdateChart method, the AccSchedChartManagement codeunit gets a setup record and updates it if necessary. Then, it initializes the chart with setup data and sets the StatusText to show the period for which data is displayed. The same method is used by the actions to move and update the chart so that there is no code duplication.

      +
      BusinessChart::AddInReady()
      +    UpdateChart(Period::" ");
      +
      +LOCAL UpdateChart(Period : ',Next,Previous')
      +    MoveAndUpdateChart(Period,0);
      +
      +LOCAL MoveAndUpdateChart(Period : ',Next,Previous';Move : Integer)
      +    AccSchedChartManagement.GetSetupRecordset(AccountSchedulesChartSetup,AccountSchedulesChartSetup.Name,Move);
      +
      +    AccSchedChartManagement.UpdateData(Rec,Period,AccountSchedulesChartSetup);
      +
      +    Update(CurrPage.BusinessChart);
      +
      +    StatusText := GetCurrentSelectionText("Period Filter Start Date","Period Filter End Date");
      +

      In the MoveAndUpdateChart method, the AccSchedChartManagement codeunit gets a setup record and updates it if necessary. Then, it initializes the chart with setup data and sets the StatusText to show the period for which data is displayed. The same method is used by the actions to move and update the chart so that there is no code duplication.

      The following code is used to implement DataPointClicked

      -

      ****BusinessChart::DataPointClicked(point : DotNet “Microsoft.Dynamics.Nav.Client.BusinessChart.BusinessChartDataPoint”)

      -

      SetDrillDownIndexes(point);

      -

      AccSchedChartManagement.DrillDown(Rec,AccountSchedulesChartSetup);

      -

      SetDrillDownindexes is a method from the Business Chart Buffer table that maps the DotNet point variable to C/AL data, so it must be used. The next method that you must implement is the action to be performed on Drilldown.

      +
      BusinessChart::DataPointClicked(point : DotNet "Microsoft.Dynamics.Nav.Client.BusinessChart.BusinessChartDataPoint")
      +    SetDrillDownIndexes(point);
      +    AccSchedChartManagement.DrillDown(Rec,AccountSchedulesChartSetup);
      +

      SetDrillDownindexes is a method from the Business Chart Buffer table that maps the DotNet point variable to C/AL data, so it must be used. The next method that you must implement is the action to be performed on Drilldown.

      The **DataPointDoubleClicked **trigger has the same implementation logic as the DataPointClicked trigger.

      Implementation of chart part 1390 on the Small Business Role Center page (9022)

      @@ -355,12 +360,12 @@ BC AL Help . dev
      - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/cross-session-events/index.html b/navpatterns/1-patterns/cross-session-events/index.html index 59dde7d3..be0dd5dd 100644 --- a/navpatterns/1-patterns/cross-session-events/index.html +++ b/navpatterns/1-patterns/cross-session-events/index.html @@ -2,19 +2,19 @@ - + Cross Session Events :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
      @@ -220,15 +215,14 @@ BC AL Help . dev

      Cross Session Events

      -

      By Nikolai L’Estrange, from TVision Technology Ltd. in the UK_

      -

      _

      -

      Abstract

      +

      By Nikolai L’Estrange, from TVision Technology Ltd. in the UK

      +

      Abstract

      Track things that happen in other NAV Sessions.

      -

      Problem

      +

      Problem

      In Microsoft Dynamics NAV you can fire a function whenever something changes within your session (and from NAV 2016 this is even easier with the new Event model), however there is not an easy way to know what is happening in other sessions. Sometimes you would like to know what has happened since your last read, without reading everything again, e.g. when you need to pass a large dataset to a Control Add-in.

      A common way of handling this with Ledger Tables is to make note of the last record you read, and continuously poll to see if there are any new records. However this is restricted to strictly sequentially entered tables.

      -

      Solution

      +

      Solution

      There is a common pattern in many other languages called Publish-Subscribe (or PubSub) that solves the same issue. We can implement the same pattern in NAV using a Table as a message queue platform and polling this table. We have named this pattern “Cross Session Events” in order to avoid confusion with the standard NAV Events which use the terms Publisher and Subscriber, and to try and describe more accurately when you would need this pattern.

      The pattern has four components:

        @@ -237,100 +231,104 @@ BC AL Help . dev
      • Message Broker: This distributes all messages sent in to all Subscribers that have expressed an interest (i.e. the message is within their filters).
      • Message Queue: To hold the messages for each Subscriber. Generally once these messages are read, they are deleted.
      -

      Example

      +

      Example

      An example of this would be when we have multiple users looking at the same set of data and we want their screens to update in “real time” whenever one of them makes a change, without doing a full refresh. We will use the Observer pattern to capture the change (act as the Publisher) and then create a Table to hold Subscribers and Filters (Change Observer), a Table to be the Message Queue (Change Notification), and a Codeunit to be the Message Broker and help with the polling (ObserverMgt).

      Below are the table definitions:

      -
      **Change Observer:   
      -**"Table ID" Integer "Observable Table"  
      -"Server ID" Integer  
      -"Session ID" Integer   
      -  
      -**Change Notification:  
      -**"Table ID" Integer "Observable Table"  
      -"Server ID" Integer  
      -"Session ID" Integer   
      -"Entry No." Integer AutoIncrement  
      -"Type of Change" Option Insert,Modify,Delete,Rename  
      -"Record ID" RecordID  
      -... (other fields to indicate what has changed)  
      -
      -

      The Change Observer table identifies the Subscriber using Server ID and Session ID, and then in this example there is only one filter, which is the Table ID we want to listen to any changes. In this case all three fields are in the Primary Key.

      +
          //Change Observer:   
      +    //"Table ID" Integer "Observable Table"  
      +    "Server ID" Integer  
      +    "Session ID" Integer   
      +      
      +    //Change Notification:  
      +    //"Table ID" Integer "Observable Table"  
      +    "Server ID" Integer  
      +    "Session ID" Integer   
      +    "Entry No." Integer AutoIncrement  
      +    "Type of Change" Option Insert,Modify,Delete,Rename  
      +    "Record ID" RecordID  
      +    ... (other fields to indicate what has changed)  
      +

      The Change Observer table identifies the Subscriber using Server ID and Session ID, and then in this example there is only one filter, which is the Table ID we want to listen to any changes. In this case all three fields are in the Primary Key.

      The Change Notification table then has the same three fields plus an Entry No. as its Primary Key, and in this example borrows heavily from the Change Log code to fill in the rest of the message.

      _Note: _Other examples of the pattern could have very different fields to identify the Subscriber, Filters and then whatever fields needed for content of the Message.

      Our Message Broker Codeunit will also serve as a central place to create Subscribers (Listen and StopListening functions) and a place to Poll for Messages. Note that the Poll function deletes the Messages as it reads them.

      -
      **Listen(TableID : Integer)**
      -WITH Observer DO BEGIN
      -"Table ID" := TableID;
      -"Server ID" := SERVICEINSTANCEID;
      -"Session ID" := SESSIONID;
      -INSERT(TRUE);
      -COMMIT;
      -END;
      -**StopListening(TableID : Integer)
      -**WITH Observer DO BEGIN
      -RESET;
      -SETRANGE("Server ID",SERVICEINSTANCEID);
      -SETRANGE("Session ID",SESSIONID);
      -SETRANGE("Table ID",TableID);
      -DELETEALL(TRUE);
      -COMMIT;
      -END;
      -**NotifyAll(ChangeNotification : Record "Change Notification")**
      -WITH Observer DO BEGIN
      -RESET;
      -SETRANGE("Table ID",ChangeNotification."Table ID");
      -IF FINDSET THEN REPEAT
      -Notify(Observer,ChangeNotification);
      -UNTIL NEXT = 0; 
      -END;
      -**Notify(Observer : Record "Change Observer";ChangeNotification : Record "Change Notification")**
      -WITH ChangeNotification DO BEGIN
      -"Server ID" := Observer."Server ID";
      -"Session ID" := Observer."Session ID";
      -"Entry No." := 0;
      -INSERT;
      -END;
      -**Poll(TableID : Integer;VAR TempChangeNotification : TEMPORARY Record "Change Notification")**
      -WITH ChangeNotification DO BEGIN
      -TempChangeNotification.RESET;
      -TempChangeNotification.DELETEALL;
      -RESET;
      -SETRANGE("Table ID",TableID);
      -SETRANGE("Server ID",SERVICEINSTANCEID);
      -SETRANGE("Session ID",SESSIONID);
      -IF FINDSET THEN REPEAT
      -TempChangeNotification := ChangeNotification;
      -TempChangeNotification.INSERT;
      -MARK(TRUE);
      -UNTIL NEXT = 0;
      -MARKEDONLY(TRUE);
      -DELETEALL;
      -END;
      -
      -

      **__**The final part of this example is an object that calls the functions above. In this example we will use a Page with a PingPong Timer Control to do the polling in (almost) real time. These are the functions on the page:

      -
      **OnQueryClosePage(CloseAction : Action None) : Boolean**
      -ObserverMgt.StopListening(DATABASE::"NAV Whiteboard Booking");
      -**Timer::AddInReady()**
      -IF ObserverMgt.Listen(DATABASE::"NAV Whiteboard Booking") THEN
      -CurrPage.Timer.Ping(1000);
      -**Timer::Pong()**
      -CallUpdate;
      -CurrPage.Timer.Ping(1000);
      -**LOCAL CallUpdate()**
      -ObserverMgt.Poll(DATABASE::"NAV Whiteboard Booking",TempChangeNotification);
      -WITH TempChangeNotification DO BEGIN
      -IF FINDSET THEN REPEAT
      -IF "Type of Change" = "Type of Change"::Delete THEN BEGIN
      -...
      -END ELSE IF RecRef.GET("Record ID") THEN BEGIN
      -...
      -END;
      -UNTIL NEXT = 0;
      -END;
      -
      -

      Consequences

      +
          //Listen(TableID : Integer)**
      +    WITH Observer DO BEGIN
      +        "Table ID" := TableID;
      +        "Server ID" := SERVICEINSTANCEID;
      +        "Session ID" := SESSIONID;
      +        INSERT(TRUE);
      +        COMMIT;
      +    END;
      +
      +    //StopListening(TableID : Integer)
      +    WITH Observer DO BEGIN
      +        RESET;
      +        SETRANGE("Server ID",SERVICEINSTANCEID);
      +        SETRANGE("Session ID",SESSIONID);
      +        SETRANGE("Table ID",TableID);
      +        DELETEALL(TRUE);
      +        COMMIT;
      +    END;
      +
      +    //NotifyAll(ChangeNotification : Record "Change Notification")**
      +    WITH Observer DO BEGIN
      +        RESET;
      +        SETRANGE("Table ID",ChangeNotification."Table ID");
      +        IF FINDSET THEN REPEAT
      +        Notify(Observer,ChangeNotification);
      +        UNTIL NEXT = 0; 
      +    END;
      +
      +    //Notify(Observer : Record "Change Observer";ChangeNotification : Record "Change Notification")**
      +    WITH ChangeNotification DO BEGIN
      +        "Server ID" := Observer."Server ID";
      +        "Session ID" := Observer."Session ID";
      +        "Entry No." := 0;
      +        INSERT;
      +    END;
      +
      +    //Poll(TableID : Integer;VAR TempChangeNotification : TEMPORARY Record "Change Notification")**
      +    WITH ChangeNotification DO BEGIN
      +        TempChangeNotification.RESET;
      +        TempChangeNotification.DELETEALL;
      +        RESET;
      +        SETRANGE("Table ID",TableID);
      +        SETRANGE("Server ID",SERVICEINSTANCEID);
      +        SETRANGE("Session ID",SESSIONID);
      +        IF FINDSET THEN REPEAT
      +            TempChangeNotification := ChangeNotification;
      +            TempChangeNotification.INSERT;
      +            MARK(TRUE);
      +            UNTIL NEXT = 0;
      +        MARKEDONLY(TRUE);
      +        DELETEALL;
      +    END;
      +

      **__**The final part of this example is an object that calls the functions above. In this example we will use a Page with a PingPong Timer Control to do the polling in (almost) real time. These are the functions on the page:

      +
          //OnQueryClosePage(CloseAction : Action None) : Boolean**
      +    ObserverMgt.StopListening(DATABASE::"NAV Whiteboard Booking");
      +    
      +    //Timer::AddInReady()**
      +    IF ObserverMgt.Listen(DATABASE::"NAV Whiteboard Booking") THEN
      +    CurrPage.Timer.Ping(1000);
      +    
      +    //Timer::Pong()**
      +    CallUpdate;
      +    CurrPage.Timer.Ping(1000);
      +    
      +    //LOCAL CallUpdate()**
      +    ObserverMgt.Poll(DATABASE::"NAV Whiteboard Booking",TempChangeNotification);
      +    WITH TempChangeNotification DO BEGIN
      +        IF FINDSET THEN REPEAT
      +        IF "Type of Change" = "Type of Change"::Delete THEN BEGIN
      +        ...
      +        END ELSE IF RecRef.GET("Record ID") THEN BEGIN
      +        ...
      +        END;
      +        UNTIL NEXT = 0;
      +    END;
      +

      Consequences

      The PingPong control is only available on the Windows Client, so if you want to use another client you will need to use another solution to Poll for Messages. Therefore this pattern is not always going to be “real time”.

      - +

      This pattern was originally described in the following blog:

      https://geeknikolai.wordpress.com/2015/10/30/pubsub-pattern-in-dynamics-nav-2016/

      Below is the Wikipedia link to the PubSub pattern

      @@ -347,12 +345,12 @@ END;
      - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/currently-active-record/index.html b/navpatterns/1-patterns/currently-active-record/index.html index 573f2c60..35f88eb4 100644 --- a/navpatterns/1-patterns/currently-active-record/index.html +++ b/navpatterns/1-patterns/currently-active-record/index.html @@ -2,19 +2,19 @@ - + Currently Active Record :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev - - - + + +
        @@ -236,10 +236,18 @@ BC AL Help . dev A side effect is reduced and simplified code, increased performance and a more scalable solution that is almost independent of the amount of records in the table.

        Description

        There is no way in NAV to get a set of records from the database, which all have the newest starting date, that is less than or equal to today’s date. Having an ending date on the record will help, but it introduces some other problems. In Dynamics NAV this is normally done by reading too many records, either at the SQL Server level or in the middle tier and throw away the ones you do not need. That is a waste of resources:

        -

        < –[if supportLists]–>* < –[endif]–>The SQL Server is reading too many records

        -

        < –[if supportLists]–>* < –[endif]–>There would be too much data sent over the network.
        +

          +
        • +

          The SQL Server is reading too many records

          +
        • +
        • +

          There would be too much data sent over the network.
          (If the SQL Server and the NAV Service tier are on different machines.)

          -

          < –[if supportLists]–>* < –[endif]–>The NAV Service Tier receives and throws away data.

          +
        • +
        • +

          The NAV Service Tier receives and throws away data.

          +
        • +

        Ending Date Problem

        Ending Date may introduce some problems of its own.

        If your design requires to have one and only one active record per key in a dataset, then Ending Date introduces the possibility for overlapping or holes in the timeline.
        @@ -250,21 +258,20 @@ If you add a record in between you will have to update both the before and the a

        Use the pattern whenever you read a set of data containing a Starting Date and you need to implement a loop to throw away unwanted records. An example could be Codeunit 7000 “Sales Price Calc. Mgt.”. In this codeunit there are many loop constructs to find prices and discounts.

        Usage

        In the following example, we have a fictive table containing: Code, Starting Date and Price. The Primary Key consist of Code, Starting Date. The Database is the Demo Database, and the Company is Cronus.

        -

        < –[if supportLineBreakNewLine]–>
        -< –[endif]–>

        +

        1. Create the view

        You will need to create the view before you define the Table Object.
        You will need to create a view for every company in the database.

        -

        CREATE VIEW [dbo].[CRONUS$PriceView]
        -AS
        -SELECT [Code], [Starting Date], [Price]
        -FROM dbo.[CRONUS$Price] AS A
        -WHERE [Starting Date] =
        -(SELECT MAX([Starting Date])
        -FROM dbo.[CRONUS$Price] AS B
        -WHERE B.[Code] = A.[Code] AND
        -B.[Starting Date] <= GETDATE())

        -

        Test the view to ensure that you get the correct result. It is much easier to test now than later.

        +
            CREATE VIEW [dbo].[CRONUS$PriceView]  
        +    AS  
        +    SELECT [Code], [Starting Date], [Price]  
        +    FROM dbo.[CRONUS$Price] AS A  
        +    WHERE [Starting Date] =  
        +    (SELECT MAX([Starting Date])  
        +    FROM dbo.[CRONUS$Price] AS B  
        +    WHERE B.[Code] = A.[Code] AND  
        +    B.[Starting Date] <= GETDATE())
        +

        Test the view to ensure that you get the correct result. It is much easier to test now than later.

        2. Create the Table object

        Remember to set the link table property before you save it.

        3. Implement the code

        @@ -272,42 +279,44 @@ B.[Starting Date] <= GETDATE())

        4. Create a deployment codeunit

        Create a SQL Deployment codeunit to manage your views.
        The codeunit needs to Create or Alter the views for all companies.
        -To see an example of how to talk to SQL Server using .NET see Waldo’s blog here:
        -http://dynamicsuser.net/blogs/waldo/archive/2011/07/19/net-interop-calling-stored-procedures-on-sql-server-example-1.aspx
        -< –[if supportLineBreakNewLine]–>
        -< –[endif]–>

        +To see an example of how to talk to SQL Server using .NET see waldo’s blog here:
        +http://dynamicsuser.net/blogs/waldo/archive/2011/07/19/net-interop-calling-stored-procedures-on-sql-server-example-1.aspx

        5. Deployment

        You need to deploy in three steps:

        -

        < –[if supportLists]–>1. < –[endif]–>Delete the table objects referencing the views

        -

        < –[if supportLists]–>2. < –[endif]–>Deploy and run the deployment codeunit

        -

        < –[if supportLists]–>3. < –[endif]–>Deploy the new table objects that reference the views

        +
          +
        1. Delete the table objects referencing the views
        2. +
        3. Deploy and run the deployment codeunit
        4. +
        5. Deploy the new table objects that reference the views
        6. +

        General precaution

        If you later want to change the view, you need to follow these rules:

        -

        < –[if supportLists]–>* < –[endif]–>If you add columns, you need to add them to the view first and then add them to the Table Object.

        -

        < –[if supportLists]–>* < –[endif]–>If you want to remove columns from the view, you need to delete the Table Object, then change the view and last recreate the Table Object without the new columns.

        +

        * If you add columns, you need to add them to the view first and then add them to the Table Object. +* If you want to remove columns from the view, you need to delete the Table Object, then change the view and last recreate the Table Object without the new columns.

        Code example that accomplish the same but without using the pattern

        This following example will give you the same result but the performance will deteriorate as time goes by and you get more and more old data.

        -

        Price.SETCURRENTKEY(Code,“Starting Date”);

        -

        Price.SETFILTER(“Starting Date”,'..%1', TODAY

        -

        IF Price.FINDSET THEN BEGIN
        -REPEAT

        -

        Price.SETRANGE(Code, Price.Code);

        -

        Price.FINDLAST;

        -

        Price.SETRANGE(Code);

        -

        PriceTemp := Price;

        -

        PriceTemp.INSERT;

        -

        UNTIL Price.NEXT = 0;

        -

        END;
        -// PriceTemp will contain the Prices

        -

        Comparison

        +
        Price.SETCURRENTKEY(Code,"Starting Date"); 
        +Price.SETFILTER("Starting Date",'..%1', TODAY  
        +IF Price.FINDSET THEN BEGIN  
        +    REPEAT
        +        Price.SETRANGE(Code, Price.Code);
        +        Price.FINDLAST;
        +        Price.SETRANGE(Code);
        +        PriceTemp := Price;
        +        PriceTemp.INSERT;
        +    UNTIL Price.NEXT = 0;
        +END;   
        +// PriceTemp will contain the Prices
        +

        Comparison

        The above NAV example is for a very simple date controlled solution and is provided to give an idea of what the pattern changes seen from a NAV development point of view. But consider the following:

        -

        < –[if supportLists]–>* < –[endif]–>The table has a more complex key.
        -This will require setting and clearing more filters

        -

        < –[if supportLists]–>* < –[endif]–>You need to read from more than one table.
        +

          +
        • The table has a more complex key.
          +This will require setting and clearing more filters
        • +
        • You need to read from more than one table.
          Say you need to apply discount from a separate table.
          -This may give several lines in PriceTemp.

          -

          < –[if supportLists]–>* < –[endif]–>If the Code field is controlled by a Type field.
          -The Code field reference keys in different tables

          +This may give several lines in PriceTemp.
        • +
        • If the Code field is controlled by a Type field.
          +The Code field reference keys in different tables
        • +

        All three examples above can be implemented directly in the view. By using the pattern, it will still only require a single line of NAV code.

        Using the pattern will only issue one SQL call and thereby one trip to the server.
        The NAV Example will require an unknown number of SQL calls and thereby an unknown number of trips to the server. The number of SQL calls is dependent on the number of distinct Code values.
        @@ -333,12 +342,12 @@ The Pattern makes a scalable solution with a predictable performance. The perfor

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/data-migration-facade/index.html b/navpatterns/1-patterns/data-migration-facade/index.html index ee87cf02..07428419 100644 --- a/navpatterns/1-patterns/data-migration-facade/index.html +++ b/navpatterns/1-patterns/data-migration-facade/index.html @@ -2,19 +2,19 @@ - + Data Migration Facade :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
      -

      Usage:

      +

      Usage:

      There are the following use cases:

      • @@ -278,7 +278,7 @@ This deletes existing status lines for migrating Items for ‘My Migration T

      **“Data Migration Façade”.StartMigration(‘My Migration Type’,false) **
      This starts the migration. False means this is not a retry. A re-try is when you migrate one or more records from the Show Errors page, which is described later in this document. Retry = true is only used by the Show Errors page and should not be used from extensions.

      -

      Usage without staging tables:

      +

      Usage without staging tables:

      The overall workflow is:

      1. Integrate your extension in the Data Migration Wizard by subscribing to the events exposed by the Data Migration Façade.
      2. @@ -295,55 +295,54 @@ This starts the migration. False means this is not a retry. A re-try is when you

        _Figure 1: sequence diagram of the data migration without staging tables _

        The following example shows how to migrate items without staging tables:

        -
        trigger OnRun(); 
        -var 
        -ItemDataMigrationFacade: Codeunit "Item Data Migration Facade"; 
        -ItemNumber: Integer; 
        -ItemJson: Text; 
        -begin 
        -// loop on items retrieved through a web service for example 
        -for ItemNumber := 1 to ExternalWebService.GetItemCount do begin 
        -ExternalWebService.GetItem(ItemNumber,ItemJson); 
        -// create item using the facade 
        -if not ItemDataMigrationFacade.CreateItemIfNeeded(ItemJson.ItemNumber,ItemJson.ItemName1,
        -ItemJson.ItemName2,ConvertItemType(ItemJson.ItemType)) then 
        -exit; // item already exists 
        -// set some fields using the facade 
        -ItemDataMigrationFacade.SetVendorItemNo(ItemJson.VendItemNumber); 
        -ItemDataMigrationFacade.SetUnitVolume(ItemJson.Volume); 
        -ItemDataMigrationFacade.SetAlternativeItemNo(ItemJson.AltItemNumber); 
        -if ItemJson.PrimaryVendor <\> '' then 
        -ItemDataMigrationFacade.SetVendorNo(ItemJson.PrimaryVendor); 
        -// migrate dependencies 
        -MigrateItemUnitOfMeasure(ItemDataMigrationFacade,ItemJson); 
        -// modify the item (+run trigger) to save the changes made by setters 
        -ItemDataMigrationFacade.ModifyItem(true); 
        -// update the status in the migration dashboard 
        -DataMigrationStatusFacade.IncrementMigratedRecordCount('My Migration Type',
        -Database::Item,1); 
        -end; 
        -end;
        -procedure MigrateItemUnitOfMeasure(ItemDataMigrationFacade : Codeunit "Item Data Migration Facade";
        -ItemJson : Text); 
        -var 
        -MyUnitCodeStagingTable: Record "My Unit Code Staging Table"; 
        -DataMigrationStatusFacade: Codeunit "Data Migration Status Facade"; 
        -DescriptionToSet: Text\[10\]; 
        -UnitCodeJson: Text; 
        -begin 
        -if ItemJson.UnitCode = '' then 
        -// log an error using the Data migration façade 
        -DataMigrationStatusFacade.RegisterErrorNoStagingTablesCase(
        -'My Migration Type',Database::Item,'Unit of measure is empty.'); 
        -if ExternalWebService.GetUnitCode(ItemJson.UnitCode,UnitCodeJson) then 
        -DescriptionToSet := UnitCodeJson.Description; 
        -ItemDataMigrationFacade.CreateUnitOfMeasureIfNeeded(ItemJson.UnitCode, DescriptionToSet); 
        -// set the unit of measure on the item 
        -ItemDataMigrationFacade.SetBaseUnitOfMeasure(ItemJson.UnitCode); 
        -end;
        -
        -

        _Figure 2: Example of Item and Item Unit of Measure migration without staging tables _

        -

        Usage with staging tables:

        +
            trigger OnRun(); 
        +    var 
        +      ItemDataMigrationFacade: Codeunit "Item Data Migration Facade"; 
        +      ItemNumber: Integer; 
        +      ItemJson: Text; 
        +    begin 
        +      // loop on items retrieved through a web service for example 
        +      for ItemNumber := 1 to ExternalWebService.GetItemCount do begin 
        +      ExternalWebService.GetItem(ItemNumber,ItemJson); 
        +      // create item using the facade 
        +      if not ItemDataMigrationFacade.CreateItemIfNeeded(ItemJson.ItemNumber,ItemJson.ItemName1,
        +      ItemJson.ItemName2,ConvertItemType(ItemJson.ItemType)) then 
        +      exit; // item already exists 
        +      // set some fields using the facade 
        +      ItemDataMigrationFacade.SetVendorItemNo(ItemJson.VendItemNumber); 
        +      ItemDataMigrationFacade.SetUnitVolume(ItemJson.Volume); 
        +      ItemDataMigrationFacade.SetAlternativeItemNo(ItemJson.AltItemNumber); 
        +      if ItemJson.PrimaryVendor <\> '' then 
        +      ItemDataMigrationFacade.SetVendorNo(ItemJson.PrimaryVendor); 
        +      // migrate dependencies 
        +      MigrateItemUnitOfMeasure(ItemDataMigrationFacade,ItemJson); 
        +      // modify the item (+run trigger) to save the changes made by setters 
        +      ItemDataMigrationFacade.ModifyItem(true); 
        +      // update the status in the migration dashboard 
        +      DataMigrationStatusFacade.IncrementMigratedRecordCount('My Migration Type',
        +      Database::Item,1); 
        +      end; 
        +      end;
        +      procedure MigrateItemUnitOfMeasure(ItemDataMigrationFacade : Codeunit "Item Data Migration Facade";
        +      ItemJson : Text); 
        +      var 
        +      MyUnitCodeStagingTable: Record "My Unit Code Staging Table"; 
        +      DataMigrationStatusFacade: Codeunit "Data Migration Status Facade"; 
        +      DescriptionToSet: Text\[10\]; 
        +      UnitCodeJson: Text; 
        +      begin 
        +      if ItemJson.UnitCode = '' then 
        +      // log an error using the Data migration façade 
        +      DataMigrationStatusFacade.RegisterErrorNoStagingTablesCase(
        +      'My Migration Type',Database::Item,'Unit of measure is empty.'); 
        +      if ExternalWebService.GetUnitCode(ItemJson.UnitCode,UnitCodeJson) then 
        +      DescriptionToSet := UnitCodeJson.Description; 
        +      ItemDataMigrationFacade.CreateUnitOfMeasureIfNeeded(ItemJson.UnitCode, DescriptionToSet); 
        +      // set the unit of measure on the item 
        +      ItemDataMigrationFacade.SetBaseUnitOfMeasure(ItemJson.UnitCode); 
        +    end;
        +

        _Figure 2: Example of Item and Item Unit of Measure migration without staging tables _

        +

        Usage with staging tables:

        The overall workflow is:

        • @@ -373,76 +372,73 @@ end;

        -

        _Figure 3: Simplified sequence diagram of the data migration with staging tables _

        +

        Figure 3: Simplified sequence diagram of the data migration with staging tables

        Below is a simplified example showing how to create an item:

        -
        \[EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Data Migration Facade", 'OnMigrateItem', '', true, true)\] 
        -procedure OnMigrateItem(VAR Sender : Codeunit "Item Data Migration Facade";RecordIdToMigrate : RecordId); 
        -var 
        -MyItemStagingTable : Record "My Item Staging Table"; 
        -begin 
        -// handle the event if it targets this extension's staging table 
        -if RecordIdToMigrate.TableNo <\> Database::"My Item Staging Table" then 
        -exit; 
        -MyItemStagingTable.Get(RecordIdToMigrate); 
        -// create item using the facade 
        -if not Sender.CreateItemIfNeeded(MyItemStagingTable.ItemNumber,MyItemStagingTable.ItemName1,
        -MyItemStagingTable.ItemName2,ConvertItemType(MyItemStagingTable.ItemType)) then 
        -exit; // item already exists 
        -// set some fields using the facade 
        -Sender.SetVendorItemNo(MyItemStagingTable.VendItemNumber); 
        -Sender.SetUnitVolume(MyItemStagingTable.Volume); 
        -Sender.SetAlternativeItemNo(MyItemStagingTable.AltItemNumber); 
        -if MyItemStagingTable.PrimaryVendor <\> '' then 
        -Sender.SetVendorNo(MyItemStagingTable.PrimaryVendor); 
        -// modify the item (+run trigger) to save the changes made by setters 
        -Sender.ModifyItem(true); 
        -end;
        -
        -

        _Figure 4: Example of event subscriber for Item migration _

        -

        __

        +
            [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Data Migration Facade", 'OnMigrateItem', '', true, true)] 
        +    procedure OnMigrateItem(VAR Sender : Codeunit "Item Data Migration Facade";RecordIdToMigrate : RecordId); 
        +    var 
        +      MyItemStagingTable : Record "My Item Staging Table"; 
        +    begin 
        +      // handle the event if it targets this extension's staging table 
        +      if RecordIdToMigrate.TableNo <\> Database::"My Item Staging Table" then 
        +      exit; 
        +      MyItemStagingTable.Get(RecordIdToMigrate); 
        +      // create item using the facade 
        +      if not Sender.CreateItemIfNeeded(MyItemStagingTable.ItemNumber,MyItemStagingTable.ItemName1,
        +      MyItemStagingTable.ItemName2,ConvertItemType(MyItemStagingTable.ItemType)) then 
        +      exit; // item already exists 
        +      // set some fields using the facade 
        +      Sender.SetVendorItemNo(MyItemStagingTable.VendItemNumber); 
        +      Sender.SetUnitVolume(MyItemStagingTable.Volume); 
        +      Sender.SetAlternativeItemNo(MyItemStagingTable.AltItemNumber); 
        +      if MyItemStagingTable.PrimaryVendor <\> '' then 
        +      Sender.SetVendorNo(MyItemStagingTable.PrimaryVendor); 
        +      // modify the item (+run trigger) to save the changes made by setters 
        +      Sender.ModifyItem(true); 
        +    end;
        +

        Figure 4: Example of event subscriber for Item migration

        Below is another example showing how to use additional events to set fields that reference other tables, here the unit of measure:

        -
        \[EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Data Migration Facade", 'OnMigrateItemUnitOfMeasure', '', true, true)\] 
        -procedure OnMigrateItemUnitOfMeasure(VAR Sender : Codeunit "Item Data Migration Facade";RecordIdToMigrate : RecordId); 
        -var 
        -MyItemStagingTable : Record "My Item Staging Table"; 
        -MyUnitCodeStagingTable : Record "My Unit Code Staging Table"; 
        -DescriptionToSet: Text\[10\]; 
        -begin 
        -// handle the event if it targets this extension's staging table 
        -if RecordIdToMigrate.TableNo <\> Database::"My Item Staging Table" then 
        -exit; 
        -MyItemStagingTable.Get(RecordIdToMigrate); 
        -if MyItemStagingTable.UnitCode = '' then 
        -error('Unit of measure is empty.'); 
        -MyUnitCodeStagingTable.SetRange(UnitCode,MyItemStagingTable.UnitCode); 
        -if MyUnitCodeStagingTable.FindFirst then 
        -DescriptionToSet := MyUnitCodeStagingTable.Description; 
        -// create the unit of measure through the facade 
        -Sender.CreateUnitOfMeasureIfNeeded(MyItemStagingTable.UnitCode, DescriptionToSet); 
        -// set the unit of measure on the item 
        -Sender.SetBaseUnitOfMeasure(MyItemStagingTable.UnitCode); 
        -// modify the item to save the changes made by setter 
        -Sender.ModifyItem(false); 
        -end; 
        -
        -

        _Figure 5: Example of event subscriber for Item Unit of Measure migration _

        -

        Combining both approaches:

        +
            [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Data Migration Facade", 'OnMigrateItemUnitOfMeasure', '', true, true)] 
        +    procedure OnMigrateItemUnitOfMeasure(VAR Sender : Codeunit "Item Data Migration Facade";RecordIdToMigrate : RecordId); 
        +    var 
        +      MyItemStagingTable : Record "My Item Staging Table"; 
        +      MyUnitCodeStagingTable : Record "My Unit Code Staging Table"; 
        +      DescriptionToSet: Text[10]; 
        +    begin 
        +      // handle the event if it targets this extension's staging table 
        +      if RecordIdToMigrate.TableNo <\> Database::"My Item Staging Table" then 
        +      exit; 
        +      MyItemStagingTable.Get(RecordIdToMigrate); 
        +      if MyItemStagingTable.UnitCode = '' then 
        +      error('Unit of measure is empty.'); 
        +      MyUnitCodeStagingTable.SetRange(UnitCode,MyItemStagingTable.UnitCode); 
        +      if MyUnitCodeStagingTable.FindFirst then 
        +      DescriptionToSet := MyUnitCodeStagingTable.Description; 
        +      // create the unit of measure through the facade 
        +      Sender.CreateUnitOfMeasureIfNeeded(MyItemStagingTable.UnitCode, DescriptionToSet); 
        +      // set the unit of measure on the item 
        +      Sender.SetBaseUnitOfMeasure(MyItemStagingTable.UnitCode); 
        +      // modify the item to save the changes made by setter 
        +      Sender.ModifyItem(false); 
        +    end; 
        +

        Figure 5: Example of event subscriber for Item Unit of Measure migration

        +

        Combining both approaches:

        If you want to migrate additional entities, the **Data Migration **framework lets you initialize the migration with entities other than master data. In this case, the Data Migration Overview page will show additional lines. Item, vendor, customer, an general ledger accounts are migrated with an event driven approach, and the additional entities are migrated by calling an extension codeunit OnRun method.

        -

        Error handling with staging tables:

        +

        Error handling with staging tables:

        The migration starts by calling RUN on the façade codeunit. Errors thrown during the call are captured by GETLASTERRORTEXT and displayed when you choose the Show Errors action on the Data Migration Overview page.

        -

        _Figure 6: List of errors shown when clicking Show Errors on the Data Migration Overview page _

        +

        Figure 6: List of errors shown when clicking Show Errors on the Data Migration Overview page

        __

        The Edit Record action opens a view of the staging table, where you can edit fields to fix errors. Figure 4 shows an example of a page for the vendor staging table in a migration from C5.

        -

        _Figure 7: Edit a staging table record _

        +

        Figure 7: Edit a staging table record

        __

        The Staging Table ID determines the page to open, so it is important that the page ID is equal to the Staging Table ID, at least for the master data staging tables, for example, forG/L Accounts, Items, Customers and Vendor. You should ensure that pages to edit related entities are linked on this page by means of new actions. For example, Figure 4 uses the C5 Purchaser action.

        After you fix the staging table record, you can choose the Migrate action to mark the selected records as records to retry, and then run StartMigration with the Retry flag set to true. This is the only place where the retry flag should be set to true in the StartMigration procedure.

        Error handling without staging tables

        When migrating data without staging tables, errors can be registered manually by the extension using DataMigrationStatusFacade.RegisterErrorNoStagingTablesCase. Otherwise they can be registered automatically if the codeunits fail when called on their OnRun procedure.

        Errors will be displayed in the error list, but you cannot open and edit records because there is no staging table. The Edit action will not be available.

        -

        Limitations:

        +

        Limitations:

        • Data migration will fail if there are customers, vendors, items in the database and if these entities are selected for migration. For example, if you choose to migrate items and your company already contains items, you will get an error. This should not be an issue if you migrate your data from another tool to NAV, in which case you will most likely start on a fresh empty company. However, if you just want to import additional items to a company with existing items, then it is not supported by the framework. however, you can still use the different functions provided by the different codeunits (such as Item Data Migration Facade) to create the entities without strong coupling on the NAV data model.

          @@ -454,7 +450,7 @@ end;

          There is no automated rollback in case of failure: data that is successfully migrated will be commited, and data that is not successfully migrated with be shown in the errors list. The retry feature (in case of staging tables) then makes it possible for you to retry individual entities or ignore them.

        -

        Usages in NAV:

        +

        Usages in NAV:

        The Data Migration Façade is available starting from version 2018.

        The following Façade codeunits for data migration management are available:

          @@ -483,7 +479,7 @@ end;

          COD6114 (Ex. Rate Data Migration Facade)

        -

        References:

        +

        References:

        Façade pattern on Wikipedia: https://en.wikipedia.org/wiki/Facade_pattern

        @@ -497,12 +493,12 @@ end;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/discovery-event/index.html b/navpatterns/1-patterns/discovery-event/index.html index 666c9972..7802f0d2 100644 --- a/navpatterns/1-patterns/discovery-event/index.html +++ b/navpatterns/1-patterns/discovery-event/index.html @@ -2,19 +2,19 @@ - + Discovery Event :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -263,12 +263,12 @@ You see I can use the “sender” as a normal Record-variable. I access
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/document/index.html b/navpatterns/1-patterns/document/index.html index 67b8477e..2546be38 100644 --- a/navpatterns/1-patterns/document/index.html +++ b/navpatterns/1-patterns/document/index.html @@ -2,19 +2,19 @@ - + Document :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -297,12 +297,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/easy-update-of-setup-or-supplementary-information/index.html b/navpatterns/1-patterns/easy-update-of-setup-or-supplementary-information/index.html index 881d27f1..4761c1fa 100644 --- a/navpatterns/1-patterns/easy-update-of-setup-or-supplementary-information/index.html +++ b/navpatterns/1-patterns/easy-update-of-setup-or-supplementary-information/index.html @@ -2,19 +2,19 @@ - + Easy Update Of Setup Or Supplementary Information :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -275,12 +275,12 @@ Error(Field X is missing a value. Please correct it.)

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/error-message-processing/index.html b/navpatterns/1-patterns/error-message-processing/index.html index faa5e62c..5fdc1f55 100644 --- a/navpatterns/1-patterns/error-message-processing/index.html +++ b/navpatterns/1-patterns/error-message-processing/index.html @@ -2,19 +2,19 @@ - + Error Message Processing :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -296,12 +296,12 @@ END ELSE
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/extending-the-role-center-headlines/index.html b/navpatterns/1-patterns/extending-the-role-center-headlines/index.html index 49397edc..78bc4e0c 100644 --- a/navpatterns/1-patterns/extending-the-role-center-headlines/index.html +++ b/navpatterns/1-patterns/extending-the-role-center-headlines/index.html @@ -2,19 +2,19 @@ - + Extending the Role Center Headlines :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -355,12 +355,12 @@ _
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/feature-localization-for-data-structures/index.html b/navpatterns/1-patterns/feature-localization-for-data-structures/index.html index 8cccdd6f..98ec0026 100644 --- a/navpatterns/1-patterns/feature-localization-for-data-structures/index.html +++ b/navpatterns/1-patterns/feature-localization-for-data-structures/index.html @@ -2,19 +2,19 @@ - + Feature Localization For Data Structures :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -380,12 +380,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/hooks/index.html b/navpatterns/1-patterns/hooks/index.html index 5645efda..61cac5ff 100644 --- a/navpatterns/1-patterns/hooks/index.html +++ b/navpatterns/1-patterns/hooks/index.html @@ -2,19 +2,19 @@ - + Hooks :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -297,12 +297,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/implementation-of-surrogate-keys-using-autoincrement-pattern/index.html b/navpatterns/1-patterns/implementation-of-surrogate-keys-using-autoincrement-pattern/index.html index c97ed47c..f6425eb8 100644 --- a/navpatterns/1-patterns/implementation-of-surrogate-keys-using-autoincrement-pattern/index.html +++ b/navpatterns/1-patterns/implementation-of-surrogate-keys-using-autoincrement-pattern/index.html @@ -2,19 +2,19 @@ - + Surrogate keys using Autoincrement Pattern :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -309,12 +309,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/index.html b/navpatterns/1-patterns/index.html index 74fc2964..7aed585c 100644 --- a/navpatterns/1-patterns/index.html +++ b/navpatterns/1-patterns/index.html @@ -2,20 +2,20 @@ - + 1. Patterns :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -215,12 +215,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/index.xml b/navpatterns/1-patterns/index.xml index e570aa43..c214bf86 100644 --- a/navpatterns/1-patterns/index.xml +++ b/navpatterns/1-patterns/index.xml @@ -11,7 +11,7 @@ Lost reference to centralizer: An instance of a relevant object could attempt to Activity Log Abstract The Activity Log pattern tracks execution of activities. This is a Dynamics NAV specific implementation of the Audit Log pattern. Problem -In general, integrating with external systems can be very challenging, due to the complexity of the situation &ndash; connectivity issues, asynchronous operations, user errors, etc. These challenges require sometimes re-trying several times, polling the external system, re-send/re-get data as all these activities can succeed but can very well fail.Argument Tablehttps://bcalhelp.dev/navpatterns/1-patterns/argument-table/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/argument-table/Argument table pattern Originally By Nikola Kukrika and Waldo +In general, integrating with external systems can be very challenging, due to the complexity of the situation &ndash; connectivity issues, asynchronous operations, user errors, etc. These challenges require sometimes re-trying several times, polling the external system, re-send/re-get data as all these activities can succeed but can very well fail.Argument Tablehttps://bcalhelp.dev/navpatterns/1-patterns/argument-table/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/argument-table/Argument table pattern Originally By Nikola Kukrika and waldo Abstract The Argument Table pattern is used to provide an extension point for adding new arguments without changing the signature. By grouping multiple arguments into a table the code becomes more readable (function signature and the usage of the function). Problem In CAL overloading function signature is not supported. It is also not possible to provide default values for the function arguments.Cached Web Server Callshttps://bcalhelp.dev/navpatterns/1-patterns/cached-web-service-calls/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/cached-web-service-calls/Originally by Mostafa Balat, Microsoft Development Center Copenhagen Abstract In a service-oriented deployment, web services are used to extend NAV&rsquo;s functionality and reach. Depending on how volatile this data is and the corresponding usage scheme, it is expected to be up-to-date within a pre-defined period of time (e.g. once a day). @@ -25,7 +25,7 @@ We can group sets of data as templates to speed up and simplify the process of e Abstract This article illustrates NAV platform functionality to be used by C/AL developers. The URL builder function, GETURL, is released in Microsoft Dynamics NAV 2013 R2 to reduce coding time for developers who need to create various URL strings to run application objects in either the win client, the web client, or on web services. In addition, the GETURL function makes multitenancy features more transparent to C/AL developers.Creating Custom Chartshttps://bcalhelp.dev/navpatterns/1-patterns/creating-custom-charts/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/creating-custom-charts/Originally by Nikola Kukrika at Microsoft Development Center Copenhagen Abstract The goal of this solution is to enable you to: -Use charts in the web client. Create charts with custom functionality. Description This pattern enables you to implement a business chart (Specific Chart type) in a way that is maintainable and reusable on other pages. This also enables you to provide specific functionality that is not possible with the Generic Chart type and it enables you to show charts in the web client.Cross Session Eventshttps://bcalhelp.dev/navpatterns/1-patterns/cross-session-events/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/cross-session-events/By Nikolai L&rsquo;Estrange, from TVision Technology Ltd. in the UK_ _ +Use charts in the web client. Create charts with custom functionality. Description This pattern enables you to implement a business chart (Specific Chart type) in a way that is maintainable and reusable on other pages. This also enables you to provide specific functionality that is not possible with the Generic Chart type and it enables you to show charts in the web client.Cross Session Eventshttps://bcalhelp.dev/navpatterns/1-patterns/cross-session-events/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/cross-session-events/By Nikolai L&rsquo;Estrange, from TVision Technology Ltd. in the UK Abstract Track things that happen in other NAV Sessions. Problem In Microsoft Dynamics NAV you can fire a function whenever something changes within your session (and from NAV 2016 this is even easier with the new Event model), however there is not an easy way to know what is happening in other sessions. Sometimes you would like to know what has happened since your last read, without reading everything again, e.Currently Active Recordhttps://bcalhelp.dev/navpatterns/1-patterns/currently-active-record/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/currently-active-record/Authors: Henrik Langbak and Kim Ginnerup, Bording Data Abstract Date controlled data is expensive to find in the database. This pattern describes how using a view with a sub-select and a linked table object will minimize the returned dataset. @@ -105,6 +105,6 @@ Description While writing reports in NAV, we have the luxury of using a built-in iterator. So, once we define the dataitem and the ordering, the runtime takes care of the iteration. The iterator has one shortcoming: It can only run through records written into the database.Totals and Discounts on Subpages Sales and Purchaseshttps://bcalhelp.dev/navpatterns/1-patterns/totals-and-discounts-on-subpages-sales-and-purchases/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/totals-and-discounts-on-subpages-sales-and-purchases/By Nikola Kukrika at Microsoft Development Center Copenhagen Abstract To increase discoverability and productivity, critical information, such as statistics, can be moved from separate pages onto the document where it is needed. -For example, documents should clearly display totals and discounts information to provide quick overview, make it easy to relate the amounts to the document currency, and to allow the user to see and apply discounts directly on the document.Transfer Custom Fieldshttps://bcalhelp.dev/navpatterns/1-patterns/transfer-custom-fields/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/transfer-custom-fields/watch?v=cGaBqwfGCws&amp;list=PLhZ3P LY7CqmVszuvtJLujFyHpsVN0Uw&amp;index=9Variant Facadehttps://bcalhelp.dev/navpatterns/1-patterns/variant-facade/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/variant-facade/Variant Façade By Nikola Kukrika, Waldo and Gary Winter +For example, documents should clearly display totals and discounts information to provide quick overview, make it easy to relate the amounts to the document currency, and to allow the user to see and apply discounts directly on the document.Transfer Custom Fieldshttps://bcalhelp.dev/navpatterns/1-patterns/transfer-custom-fields/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/transfer-custom-fields/watch?v=cGaBqwfGCws&amp;list=PLhZ3P LY7CqmVszuvtJLujFyHpsVN0Uw&amp;index=9Variant Facadehttps://bcalhelp.dev/navpatterns/1-patterns/variant-facade/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/1-patterns/variant-facade/Variant Façade By Nikola Kukrika, waldo and Gary Winter Abstract The Variant façade provides a single interface that can take any Record, RecordRef or RecordID as an argument. With this pattern the code is encapsulated within the single object, with clear separation between common and table specific code. Problem Since NAV is strongly typed, developers often need to duplicate functionality in order to add support for a new table. \ No newline at end of file diff --git a/navpatterns/1-patterns/instructions-in-the-ui/index.html b/navpatterns/1-patterns/instructions-in-the-ui/index.html index e368a91d..4b8ed24c 100644 --- a/navpatterns/1-patterns/instructions-in-the-ui/index.html +++ b/navpatterns/1-patterns/instructions-in-the-ui/index.html @@ -2,19 +2,19 @@ - + Instructions in the UI :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -310,12 +310,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/integration-of-addresses/index.html b/navpatterns/1-patterns/integration-of-addresses/index.html index e7193ff3..9ef5d22f 100644 --- a/navpatterns/1-patterns/integration-of-addresses/index.html +++ b/navpatterns/1-patterns/integration-of-addresses/index.html @@ -2,19 +2,19 @@ - + Integration of Addresses :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -219,12 +219,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/journal-error-processing/index.html b/navpatterns/1-patterns/journal-error-processing/index.html index f1bc8bdf..6df0a972 100644 --- a/navpatterns/1-patterns/journal-error-processing/index.html +++ b/navpatterns/1-patterns/journal-error-processing/index.html @@ -2,19 +2,19 @@ - + Journal Error Processing :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -343,12 +343,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/journal-template-batch-line/index.html b/navpatterns/1-patterns/journal-template-batch-line/index.html index b445f0ce..1bd3bf1a 100644 --- a/navpatterns/1-patterns/journal-template-batch-line/index.html +++ b/navpatterns/1-patterns/journal-template-batch-line/index.html @@ -2,19 +2,19 @@ - + Journal Template Batch Line :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -359,12 +359,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/master-data/index.html b/navpatterns/1-patterns/master-data/index.html index 08267a48..a9dbc852 100644 --- a/navpatterns/1-patterns/master-data/index.html +++ b/navpatterns/1-patterns/master-data/index.html @@ -2,19 +2,19 @@ - + Master Data :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -306,12 +306,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/multi-file-download/index.html b/navpatterns/1-patterns/multi-file-download/index.html index fe87f6db..107d94af 100644 --- a/navpatterns/1-patterns/multi-file-download/index.html +++ b/navpatterns/1-patterns/multi-file-download/index.html @@ -2,19 +2,19 @@ - + Multi-file Download :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -297,12 +297,12 @@ FileMgt.GetExtension(FileName));
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/multi-page-list/index.html b/navpatterns/1-patterns/multi-page-list/index.html index b2c056f8..57e3721d 100644 --- a/navpatterns/1-patterns/multi-page-list/index.html +++ b/navpatterns/1-patterns/multi-page-list/index.html @@ -2,19 +2,19 @@ - + Multi-Page List :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -293,12 +293,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/multilanguage-application-data/index.html b/navpatterns/1-patterns/multilanguage-application-data/index.html index 7c556d72..5408a893 100644 --- a/navpatterns/1-patterns/multilanguage-application-data/index.html +++ b/navpatterns/1-patterns/multilanguage-application-data/index.html @@ -2,19 +2,19 @@ - + Multilanguage Application Data :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -288,12 +288,12 @@ All document types are affected.

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/net-exception-handling-in-cal/index.html b/navpatterns/1-patterns/net-exception-handling-in-cal/index.html index 8e733e40..2a641952 100644 --- a/navpatterns/1-patterns/net-exception-handling-in-cal/index.html +++ b/navpatterns/1-patterns/net-exception-handling-in-cal/index.html @@ -2,20 +2,20 @@ - + NET Exception Handling in CAL :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -381,12 +381,12 @@ END.
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/net-exception-handling-in-cal/tryfunction-net-exception-handling-in-cal/index.html b/navpatterns/1-patterns/net-exception-handling-in-cal/tryfunction-net-exception-handling-in-cal/index.html index d5d079d8..308425f7 100644 --- a/navpatterns/1-patterns/net-exception-handling-in-cal/tryfunction-net-exception-handling-in-cal/index.html +++ b/navpatterns/1-patterns/net-exception-handling-in-cal/tryfunction-net-exception-handling-in-cal/index.html @@ -2,19 +2,19 @@ - + TryFunction NET Exception Handling in CAL :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -393,12 +393,12 @@ END.
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/no-series/index.html b/navpatterns/1-patterns/no-series/index.html index f7f4fd05..4bba78c9 100644 --- a/navpatterns/1-patterns/no-series/index.html +++ b/navpatterns/1-patterns/no-series/index.html @@ -2,19 +2,19 @@ - + No Series :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -375,12 +375,12 @@ BEGIN

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/notifications/in-context-notifications/index.html b/navpatterns/1-patterns/notifications/in-context-notifications/index.html index b43abef6..f0ad74fa 100644 --- a/navpatterns/1-patterns/notifications/in-context-notifications/index.html +++ b/navpatterns/1-patterns/notifications/in-context-notifications/index.html @@ -2,19 +2,19 @@ - + In-context Notifications :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -366,12 +366,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/notifications/index.html b/navpatterns/1-patterns/notifications/index.html index 3dd51d32..18de040b 100644 --- a/navpatterns/1-patterns/notifications/index.html +++ b/navpatterns/1-patterns/notifications/index.html @@ -2,20 +2,20 @@ - + Notifications :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -220,12 +220,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/notifications/notification-lifecycle-management-pattern/index.html b/navpatterns/1-patterns/notifications/notification-lifecycle-management-pattern/index.html index 424cb4e7..2ed03d4f 100644 --- a/navpatterns/1-patterns/notifications/notification-lifecycle-management-pattern/index.html +++ b/navpatterns/1-patterns/notifications/notification-lifecycle-management-pattern/index.html @@ -2,19 +2,19 @@ - + Notification Lifecycle Management Pattern :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -369,12 +369,12 @@ END;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/observer/index.html b/navpatterns/1-patterns/observer/index.html index bcf7e2fb..b00d3270 100644 --- a/navpatterns/1-patterns/observer/index.html +++ b/navpatterns/1-patterns/observer/index.html @@ -2,19 +2,19 @@ - + Observer :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -292,12 +292,12 @@ IF Observable.Get(RecRef.NUMBER) AND Observable.TrackRename THEN
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/posting-routine-select-behavior/index.html b/navpatterns/1-patterns/posting-routine-select-behavior/index.html index 4963a98c..28e19129 100644 --- a/navpatterns/1-patterns/posting-routine-select-behavior/index.html +++ b/navpatterns/1-patterns/posting-routine-select-behavior/index.html @@ -2,19 +2,19 @@ - + Posting Routine - Select Behavior :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -267,12 +267,12 @@ Invoice := Selection IN [2,3];

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/product-name/index.html b/navpatterns/1-patterns/product-name/index.html index bc7726c8..c2b1392a 100644 --- a/navpatterns/1-patterns/product-name/index.html +++ b/navpatterns/1-patterns/product-name/index.html @@ -2,19 +2,19 @@ - + Product Name :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -249,12 +249,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/queries/index.html b/navpatterns/1-patterns/queries/index.html index 635a830b..fef074dc 100644 --- a/navpatterns/1-patterns/queries/index.html +++ b/navpatterns/1-patterns/queries/index.html @@ -2,20 +2,20 @@ - + Queries :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -220,12 +220,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/queries/select-distinct-with-queries/index.html b/navpatterns/1-patterns/queries/select-distinct-with-queries/index.html index effbcc85..69ad35c6 100644 --- a/navpatterns/1-patterns/queries/select-distinct-with-queries/index.html +++ b/navpatterns/1-patterns/queries/select-distinct-with-queries/index.html @@ -2,19 +2,19 @@ - + SELECT DISTINCT with Queries :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -267,12 +267,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/queries/use-queries-to-detect-duplicate-records/index.html b/navpatterns/1-patterns/queries/use-queries-to-detect-duplicate-records/index.html index cf31159a..57e301fb 100644 --- a/navpatterns/1-patterns/queries/use-queries-to-detect-duplicate-records/index.html +++ b/navpatterns/1-patterns/queries/use-queries-to-detect-duplicate-records/index.html @@ -2,19 +2,19 @@ - + use Queries to Detect Duplicate Records :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -304,12 +304,12 @@ methods CheckDuplicateAnalysisLineDescription and CheckDuplicateAnalysisColumnHe
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/queries/use-queries-to-replace-nested-loops/index.html b/navpatterns/1-patterns/queries/use-queries-to-replace-nested-loops/index.html index ef06776c..4079f602 100644 --- a/navpatterns/1-patterns/queries/use-queries-to-replace-nested-loops/index.html +++ b/navpatterns/1-patterns/queries/use-queries-to-replace-nested-loops/index.html @@ -2,19 +2,19 @@ - + Use Queries to Replace Nested Loops :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -403,12 +403,12 @@ END.
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/read-once-initialization-and-validation/index.html b/navpatterns/1-patterns/read-once-initialization-and-validation/index.html index 8cc3bac2..fa2fc82f 100644 --- a/navpatterns/1-patterns/read-once-initialization-and-validation/index.html +++ b/navpatterns/1-patterns/read-once-initialization-and-validation/index.html @@ -2,19 +2,19 @@ - + Read-once Initialization and Validation :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -261,12 +261,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/released-entity/index.html b/navpatterns/1-patterns/released-entity/index.html index 32255180..f35ed5bf 100644 --- a/navpatterns/1-patterns/released-entity/index.html +++ b/navpatterns/1-patterns/released-entity/index.html @@ -2,19 +2,19 @@ - + Released Entity :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -287,12 +287,12 @@ When talking about hierarchical data structures and the Release State is held on
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/report-selection/index.html b/navpatterns/1-patterns/report-selection/index.html index 64b77c65..698d061f 100644 --- a/navpatterns/1-patterns/report-selection/index.html +++ b/navpatterns/1-patterns/report-selection/index.html @@ -2,19 +2,19 @@ - + Report Selection :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -328,12 +328,12 @@ END;

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/security/index.html b/navpatterns/1-patterns/security/index.html index 8476593b..a412364b 100644 --- a/navpatterns/1-patterns/security/index.html +++ b/navpatterns/1-patterns/security/index.html @@ -2,19 +2,19 @@ - + Security :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -241,12 +241,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/setup-specificity-fallback/index.html b/navpatterns/1-patterns/setup-specificity-fallback/index.html index fde257e6..e1be97f4 100644 --- a/navpatterns/1-patterns/setup-specificity-fallback/index.html +++ b/navpatterns/1-patterns/setup-specificity-fallback/index.html @@ -2,19 +2,19 @@ - + Setup Specificity Fallback :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -265,12 +265,12 @@ If found, return record; if not, optionally return hard-coded value

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/silent-file-upload-and-download/index.html b/navpatterns/1-patterns/silent-file-upload-and-download/index.html index f19d8f9f..9994085f 100644 --- a/navpatterns/1-patterns/silent-file-upload-and-download/index.html +++ b/navpatterns/1-patterns/silent-file-upload-and-download/index.html @@ -2,19 +2,19 @@ - + Silent File Upload and Download :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -274,12 +274,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/singleton/index.html b/navpatterns/1-patterns/singleton/index.html index feebffa1..8fb6ff20 100644 --- a/navpatterns/1-patterns/singleton/index.html +++ b/navpatterns/1-patterns/singleton/index.html @@ -2,20 +2,20 @@ - + Singleton :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -242,12 +242,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/singleton/singleton-codeunit/index.html b/navpatterns/1-patterns/singleton/singleton-codeunit/index.html index 7df90863..21c08ca9 100644 --- a/navpatterns/1-patterns/singleton/singleton-codeunit/index.html +++ b/navpatterns/1-patterns/singleton/singleton-codeunit/index.html @@ -2,19 +2,19 @@ - + Singleton Codeunit :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -290,12 +290,12 @@ END;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/singleton/singleton-table/cue-table/index.html b/navpatterns/1-patterns/singleton/singleton-table/cue-table/index.html index 71f0bb47..35fe2e87 100644 --- a/navpatterns/1-patterns/singleton/singleton-table/cue-table/index.html +++ b/navpatterns/1-patterns/singleton/singleton-table/cue-table/index.html @@ -2,19 +2,19 @@ - + Cue Table :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -298,12 +298,12 @@ _

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/singleton/singleton-table/index.html b/navpatterns/1-patterns/singleton/singleton-table/index.html index 2b2a714c..5c46f313 100644 --- a/navpatterns/1-patterns/singleton/singleton-table/index.html +++ b/navpatterns/1-patterns/singleton/singleton-table/index.html @@ -2,20 +2,20 @@ - + Singleton Table :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -287,12 +287,12 @@ GLSetupRead := TRUE;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/singleton/singleton-table/setup-table/index.html b/navpatterns/1-patterns/singleton/singleton-table/setup-table/index.html index 5d472ed1..a2763f2f 100644 --- a/navpatterns/1-patterns/singleton/singleton-table/setup-table/index.html +++ b/navpatterns/1-patterns/singleton/singleton-table/setup-table/index.html @@ -2,19 +2,19 @@ - + Setup Table :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -266,12 +266,12 @@ END;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/standard-journal/index.html b/navpatterns/1-patterns/standard-journal/index.html index 6dc60c28..fb4d7003 100644 --- a/navpatterns/1-patterns/standard-journal/index.html +++ b/navpatterns/1-patterns/standard-journal/index.html @@ -2,19 +2,19 @@ - + Standard Journal :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -264,12 +264,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/temporary-dataset-report/index.html b/navpatterns/1-patterns/temporary-dataset-report/index.html index a2480510..c8a47f2e 100644 --- a/navpatterns/1-patterns/temporary-dataset-report/index.html +++ b/navpatterns/1-patterns/temporary-dataset-report/index.html @@ -2,19 +2,19 @@ - + Temporary Dataset Report :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -329,12 +329,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/totals-and-discounts-on-subpages-sales-and-purchases/index.html b/navpatterns/1-patterns/totals-and-discounts-on-subpages-sales-and-purchases/index.html index 1cee23a7..925c1754 100644 --- a/navpatterns/1-patterns/totals-and-discounts-on-subpages-sales-and-purchases/index.html +++ b/navpatterns/1-patterns/totals-and-discounts-on-subpages-sales-and-purchases/index.html @@ -2,19 +2,19 @@ - + Totals and Discounts on Subpages Sales and Purchases :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -341,12 +341,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/transfer-custom-fields/index.html b/navpatterns/1-patterns/transfer-custom-fields/index.html index f458dd5c..d509d71f 100644 --- a/navpatterns/1-patterns/transfer-custom-fields/index.html +++ b/navpatterns/1-patterns/transfer-custom-fields/index.html @@ -2,19 +2,19 @@ - + Transfer Custom Fields :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -219,12 +219,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/1-patterns/variant-facade/index.html b/navpatterns/1-patterns/variant-facade/index.html index eec63692..e9eb3c02 100644 --- a/navpatterns/1-patterns/variant-facade/index.html +++ b/navpatterns/1-patterns/variant-facade/index.html @@ -2,19 +2,19 @@ - + Variant Facade :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -214,7 +214,7 @@ BC AL Help . dev

        Variant Facade

        Variant Façade

        -

        By Nikola Kukrika, Waldo and Gary Winter

        +

        By Nikola Kukrika, waldo and Gary Winter

        Abstract

        The Variant façade provides a single interface that can take any Record, RecordRef or RecordID as an argument. With this pattern the code is encapsulated within the single object, with clear separation between common and table specific code.

        @@ -388,12 +388,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/2-anti-patterns/index.html b/navpatterns/2-anti-patterns/index.html index 976d8967..5b1ea02d 100644 --- a/navpatterns/2-anti-patterns/index.html +++ b/navpatterns/2-anti-patterns/index.html @@ -2,20 +2,20 @@ - + 2. Anti-Patterns :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -218,12 +218,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/2-anti-patterns/index.xml b/navpatterns/2-anti-patterns/index.xml index 77c7040a..44addf97 100644 --- a/navpatterns/2-anti-patterns/index.xml +++ b/navpatterns/2-anti-patterns/index.xml @@ -2,6 +2,6 @@ __ Context: when NAV is upgraded, whether on-premises or in the cloud, developers have the chance to write upgrade code to move data across changing data structures. Writing good quality code will help successful upgrades. General on upgrade **Problem: **assuming that the upgrade table contains data. -If the table is empty, it means that either the upgrade has run, or there was no data in the original tenant; in both cases, the upgrade code should exit immediately.Reusable Bugshttps://bcalhelp.dev/navpatterns/2-anti-patterns/reusable-bugs/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/2-anti-patterns/reusable-bugs/Reusable Bugs By Bogdana Botez, Andreas Moth, Eric Wauters (waldo), Elly Nkya, Nikola Kukrika +If the table is empty, it means that either the upgrade has run, or there was no data in the original tenant; in both cases, the upgrade code should exit immediately.Reusable Bugshttps://bcalhelp.dev/navpatterns/2-anti-patterns/reusable-bugs/Mon, 01 Jan 0001 00:00:00 +0000https://bcalhelp.dev/navpatterns/2-anti-patterns/reusable-bugs/By Bogdana Botez, Andreas Moth, Eric Wauters (waldo), Elly Nkya, Nikola Kukrika April 1st, 2015 Abstract It is difficult to come up with new and different bugs in each release, and it is a waste of resources to not use the ones which already had proven successful in the past. To avoid reinventing the wheel, we propose to come up with new innovative ways to create bugs that are reusable and generic enough to be used in various places of the application. \ No newline at end of file diff --git a/navpatterns/2-anti-patterns/nav-upgrade/index.html b/navpatterns/2-anti-patterns/nav-upgrade/index.html index 751abc31..8d939bfc 100644 --- a/navpatterns/2-anti-patterns/nav-upgrade/index.html +++ b/navpatterns/2-anti-patterns/nav-upgrade/index.html @@ -2,19 +2,19 @@ - + Nav Upgrade :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -269,12 +269,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/2-anti-patterns/reusable-bugs/index.html b/navpatterns/2-anti-patterns/reusable-bugs/index.html index eda2f701..fed769c7 100644 --- a/navpatterns/2-anti-patterns/reusable-bugs/index.html +++ b/navpatterns/2-anti-patterns/reusable-bugs/index.html @@ -2,19 +2,19 @@ - + Reusable Bugs :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -213,7 +213,6 @@ BC AL Help . dev

      Reusable Bugs

      -

      Reusable Bugs

      By Bogdana Botez, Andreas Moth, Eric Wauters (waldo), Elly Nkya, Nikola Kukrika

      April 1st, 2015

      Abstract

      @@ -222,14 +221,11 @@ BC AL Help . dev

      Option Strings

      One example of a reusable bug is to find a heavily used table, like table 36 Sales Header, and observe one of the more important fields of type Option, for example Document Type. The OptionString property has the following value: Quote,Order,Invoice,Credit Memo,Blanket Order,Return Order, which you should update to add one option, for example Transport Order in the beginning.

      The main benefit of this reusable bug is that code changed in one place, has impact in multiple sides on the application: document creation and handling, posting etc.

      -

      **Application Management
      -**

      +

      Application Management

      Codeunit 1, ApplicationManagement is a good place for creating reusable bugs. A simple INSERT on the RecRef on the first line of OnDatabaseInsert will create a sure and versatile bug that is reusable all over the application. Redundancy on database insertion ensures that data is surely conveyed to the data storage layer, twice.

      -

      **God objects
      -**

      +

      God objects

      We are considering to no longer make localization builds for countries. It consumes lab resources to keep running multiple country builds. Instead, we will merge everything into one single build. This is a bigger scale implementation of the “God object”. Inside this unique build, we will use IF statements and sporadically CASE statements to select each country’s behavior. For more help on how to use IFs, see also the IF .. THEN|ELSE C/AL Coding Guideline.

      -

      **Field length economy
      -**

      +

      Field length economy

      When you post a document, make sure to transfer data to a field that is smaller than the field you are assigning from. This will not immediately be caught and will only hurt a subset of the customers who uses Microsoft Dynamics NAV to its fullest.

      Guidelines

      When bug addition is not entirely obvious, there is a second way to approach the problem. By following some general coding best practices like the ones described below, reliable bug innovation is facilitated and can come naturally as a collateral effect.

      @@ -272,12 +268,12 @@ BC AL Help . dev
      - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/design/index.html b/navpatterns/3-cal-coding-guidelines/design/index.html index 0c0d50d1..763cf677 100644 --- a/navpatterns/3-cal-coding-guidelines/design/index.html +++ b/navpatterns/3-cal-coding-guidelines/design/index.html @@ -2,19 +2,19 @@ - + Design :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev - - - + + +
        @@ -231,12 +231,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/index.html b/navpatterns/3-cal-coding-guidelines/index.html index 4ccd4b6b..173c3a04 100644 --- a/navpatterns/3-cal-coding-guidelines/index.html +++ b/navpatterns/3-cal-coding-guidelines/index.html @@ -2,20 +2,20 @@ - + 3. CAL Coding Guidelines :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -221,12 +221,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/internally-used-dot-net-types/index.html b/navpatterns/3-cal-coding-guidelines/internally-used-dot-net-types/index.html index 417b5ae0..051c9a65 100644 --- a/navpatterns/3-cal-coding-guidelines/internally-used-dot-net-types/index.html +++ b/navpatterns/3-cal-coding-guidelines/internally-used-dot-net-types/index.html @@ -2,19 +2,19 @@ - + Internally-used DotNet Types :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -324,12 +324,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/internationalization/index.html b/navpatterns/3-cal-coding-guidelines/internationalization/index.html index 6677a402..2e30d4c6 100644 --- a/navpatterns/3-cal-coding-guidelines/internationalization/index.html +++ b/navpatterns/3-cal-coding-guidelines/internationalization/index.html @@ -2,20 +2,20 @@ - + Internationalization :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -232,12 +232,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/internationalization/using-calcdate/index.html b/navpatterns/3-cal-coding-guidelines/internationalization/using-calcdate/index.html index dde79d54..1126d3d2 100644 --- a/navpatterns/3-cal-coding-guidelines/internationalization/using-calcdate/index.html +++ b/navpatterns/3-cal-coding-guidelines/internationalization/using-calcdate/index.html @@ -2,19 +2,19 @@ - + Using Calcdate :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -230,12 +230,12 @@ THEN
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/localizability/captionml-for-system-tables/index.html b/navpatterns/3-cal-coding-guidelines/localizability/captionml-for-system-tables/index.html index 44c3cfd6..7130ad1a 100644 --- a/navpatterns/3-cal-coding-guidelines/localizability/captionml-for-system-tables/index.html +++ b/navpatterns/3-cal-coding-guidelines/localizability/captionml-for-system-tables/index.html @@ -2,19 +2,19 @@ - + CaptionML on System Pages :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -239,12 +239,12 @@ OBJECT Table 2000000000 User
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/localizability/fieldcaption-and-tablecaption/index.html b/navpatterns/3-cal-coding-guidelines/localizability/fieldcaption-and-tablecaption/index.html index 2c75c570..9fb0eafa 100644 --- a/navpatterns/3-cal-coding-guidelines/localizability/fieldcaption-and-tablecaption/index.html +++ b/navpatterns/3-cal-coding-guidelines/localizability/fieldcaption-and-tablecaption/index.html @@ -2,19 +2,19 @@ - + FIELDCAPTION and TABLECAPTION :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -231,12 +231,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/localizability/global-text-constants/index.html b/navpatterns/3-cal-coding-guidelines/localizability/global-text-constants/index.html index a30b5768..58c31557 100644 --- a/navpatterns/3-cal-coding-guidelines/localizability/global-text-constants/index.html +++ b/navpatterns/3-cal-coding-guidelines/localizability/global-text-constants/index.html @@ -2,19 +2,19 @@ - + Global Text Constants :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -233,12 +233,12 @@ BEGIN
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/localizability/index.html b/navpatterns/3-cal-coding-guidelines/localizability/index.html index c16562b4..d065f36c 100644 --- a/navpatterns/3-cal-coding-guidelines/localizability/index.html +++ b/navpatterns/3-cal-coding-guidelines/localizability/index.html @@ -2,20 +2,20 @@ - + Localizability :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -227,12 +227,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/localizability/use-text-constants/index.html b/navpatterns/3-cal-coding-guidelines/localizability/use-text-constants/index.html index 47007a5b..14a6475f 100644 --- a/navpatterns/3-cal-coding-guidelines/localizability/use-text-constants/index.html +++ b/navpatterns/3-cal-coding-guidelines/localizability/use-text-constants/index.html @@ -2,19 +2,19 @@ - + Use Text Constants :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -248,12 +248,12 @@ ERROR(ProgramTerminatedErr);
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/localizability/using-optioncaptionml/index.html b/navpatterns/3-cal-coding-guidelines/localizability/using-optioncaptionml/index.html index 655d531f..e4dca21a 100644 --- a/navpatterns/3-cal-coding-guidelines/localizability/using-optioncaptionml/index.html +++ b/navpatterns/3-cal-coding-guidelines/localizability/using-optioncaptionml/index.html @@ -2,19 +2,19 @@ - + Using OptionCaptionML :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -236,12 +236,12 @@ Selection@1008 : 'Open,Closed,Open and Closed';
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/begin-as-an-afterword/index.html b/navpatterns/3-cal-coding-guidelines/readability/begin-as-an-afterword/index.html index 2ff948d3..7bbf427f 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/begin-as-an-afterword/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/begin-as-an-afterword/index.html @@ -2,19 +2,19 @@ - + Begin as an 'After Word' :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -230,12 +230,12 @@ END;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/begin-end/index.html b/navpatterns/3-cal-coding-guidelines/readability/begin-end/index.html index 61a2b07e..958b4995 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/begin-end/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/begin-end/index.html @@ -2,19 +2,19 @@ - + Begin-End - Compound Only :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -263,12 +263,12 @@ END ELSE (not X)
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/binary-operator-line-start/index.html b/navpatterns/3-cal-coding-guidelines/readability/binary-operator-line-start/index.html index 38b00c0f..c7e4b7fc 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/binary-operator-line-start/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/binary-operator-line-start/index.html @@ -2,19 +2,19 @@ - + Binary Operator to Start Line :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -229,12 +229,12 @@ Quantity -
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/blank-lines/index.html b/navpatterns/3-cal-coding-guidelines/readability/blank-lines/index.html index 06ad1658..0fcc9e17 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/blank-lines/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/blank-lines/index.html @@ -2,19 +2,19 @@ - + Blank Lines.md :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -243,12 +243,12 @@ THEN
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/case-actions/index.html b/navpatterns/3-cal-coding-guidelines/readability/case-actions/index.html index c94a46a9..62f7b2ec 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/case-actions/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/case-actions/index.html @@ -2,19 +2,19 @@ - + CASE Action :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -231,12 +231,12 @@ Letter2 := '11';
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/colon-usage-in-case/index.html b/navpatterns/3-cal-coding-guidelines/readability/colon-usage-in-case/index.html index 7ac055ac..87f8525e 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/colon-usage-in-case/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/colon-usage-in-case/index.html @@ -2,19 +2,19 @@ - + Colon usage in CASE :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -229,12 +229,12 @@ DimValue."Dimension Code" := GLSetup."Global Dimension 1 Code&quo
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/comments-curly-brackets/index.html b/navpatterns/3-cal-coding-guidelines/readability/comments-curly-brackets/index.html index 0a17df7c..22ee982e 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/comments-curly-brackets/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/comments-curly-brackets/index.html @@ -2,19 +2,19 @@ - + Comments inside Curly Brackets :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -247,12 +247,12 @@ END;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/comments-spacing/index.html b/navpatterns/3-cal-coding-guidelines/readability/comments-spacing/index.html index 11515db8..80059aa3 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/comments-spacing/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/comments-spacing/index.html @@ -2,19 +2,19 @@ - + Comment Spacing :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -226,12 +226,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/end-else-pair/index.html b/navpatterns/3-cal-coding-guidelines/readability/end-else-pair/index.html index eaac4439..7b3723ba 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/end-else-pair/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/end-else-pair/index.html @@ -2,19 +2,19 @@ - + END ELSE Pair :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -235,12 +235,12 @@ END ELSE
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/indentation/index.html b/navpatterns/3-cal-coding-guidelines/readability/indentation/index.html index d39523c7..2f8c1536 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/indentation/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/indentation/index.html @@ -2,19 +2,19 @@ - + Indentation :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -285,12 +285,12 @@ DO
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/index.html b/navpatterns/3-cal-coding-guidelines/readability/index.html index a7074446..439f75c7 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/index.html @@ -2,20 +2,20 @@ - + Readability :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -228,12 +228,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/keyword-pairs-indentation/index.html b/navpatterns/3-cal-coding-guidelines/readability/keyword-pairs-indentation/index.html index 1ea9b619..ba327a29 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/keyword-pairs-indentation/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/keyword-pairs-indentation/index.html @@ -2,19 +2,19 @@ - + Keyword Pairs - Indentation :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -228,12 +228,12 @@ THEN
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/line-start-keywords/index.html b/navpatterns/3-cal-coding-guidelines/readability/line-start-keywords/index.html index 0243b853..a0b560a6 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/line-start-keywords/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/line-start-keywords/index.html @@ -2,19 +2,19 @@ - + Line Start Keywords :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -234,12 +234,12 @@ ValidatSalesCycleCode;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/lonely-repeat/index.html b/navpatterns/3-cal-coding-guidelines/readability/lonely-repeat/index.html index 92bd6756..c29b0314 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/lonely-repeat/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/lonely-repeat/index.html @@ -2,19 +2,19 @@ - + Lonely Repeat :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -227,12 +227,12 @@ REPEAT
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/named-invocations/index.html b/navpatterns/3-cal-coding-guidelines/readability/named-invocations/index.html index c0694b21..a0b819ed 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/named-invocations/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/named-invocations/index.html @@ -2,19 +2,19 @@ - + Named Invocations :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -226,12 +226,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/nested-withs/index.html b/navpatterns/3-cal-coding-guidelines/readability/nested-withs/index.html index b5b5efd5..05697b74 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/nested-withs/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/nested-withs/index.html @@ -2,19 +2,19 @@ - + Nested WITHs :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -235,12 +235,12 @@ END;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/one-statement-per-line/index.html b/navpatterns/3-cal-coding-guidelines/readability/one-statement-per-line/index.html index 7cb7dba6..1a75ef67 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/one-statement-per-line/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/one-statement-per-line/index.html @@ -2,19 +2,19 @@ - + One Statement Per Line :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -234,12 +234,12 @@ TotalAmt += Amt;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/separate-if-and-else/index.html b/navpatterns/3-cal-coding-guidelines/readability/separate-if-and-else/index.html index 7881c78b..01918c40 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/separate-if-and-else/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/separate-if-and-else/index.html @@ -2,19 +2,19 @@ - + Separate IF and ELSE :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -231,12 +231,12 @@ END;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/spacing-binary-operators/index.html b/navpatterns/3-cal-coding-guidelines/readability/spacing-binary-operators/index.html index 44cd9169..f229c4cd 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/spacing-binary-operators/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/spacing-binary-operators/index.html @@ -2,19 +2,19 @@ - + Spacing Binary Operators :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -238,12 +238,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/spacing-brackets-and/index.html b/navpatterns/3-cal-coding-guidelines/readability/spacing-brackets-and/index.html index 0cef30fb..72bb5f5c 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/spacing-brackets-and/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/spacing-brackets-and/index.html @@ -2,19 +2,19 @@ - + Spacing Brackets and :: :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -238,12 +238,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/spacing-unary-operators/index.html b/navpatterns/3-cal-coding-guidelines/readability/spacing-unary-operators/index.html index de9d4346..997ebba5 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/spacing-unary-operators/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/spacing-unary-operators/index.html @@ -2,19 +2,19 @@ - + Spacing Unary Operators :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -232,12 +232,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/suggested-abbreviations/index.html b/navpatterns/3-cal-coding-guidelines/readability/suggested-abbreviations/index.html index fabbc847..7982369e 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/suggested-abbreviations/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/suggested-abbreviations/index.html @@ -2,19 +2,19 @@ - + Suggested Abbreviations :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -924,12 +924,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/temporary-variable-naming/index.html b/navpatterns/3-cal-coding-guidelines/readability/temporary-variable-naming/index.html index daf795fb..7d4c5ea5 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/temporary-variable-naming/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/temporary-variable-naming/index.html @@ -2,19 +2,19 @@ - + Temporary Variable Naming :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -231,12 +231,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/textconst-suffixes/index.html b/navpatterns/3-cal-coding-guidelines/readability/textconst-suffixes/index.html index bf7ce062..6ac6ed02 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/textconst-suffixes/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/textconst-suffixes/index.html @@ -2,19 +2,19 @@ - + TextConst Suffixes :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -294,12 +294,12 @@ ChartOfAccountsLbl@9647 : TextConst 'ENU=Chart of Accounts';
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/unary-operator-line-end/index.html b/navpatterns/3-cal-coding-guidelines/readability/unary-operator-line-end/index.html index 15fff4f5..5f36b80b 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/unary-operator-line-end/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/unary-operator-line-end/index.html @@ -2,19 +2,19 @@ - + Unary Operator Line End :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -228,12 +228,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-compound-parenthesis/index.html b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-compound-parenthesis/index.html index 150afdeb..2098106d 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-compound-parenthesis/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-compound-parenthesis/index.html @@ -2,19 +2,19 @@ - + Unnecessary Compound Parenthesis :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -241,12 +241,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-else/index.html b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-else/index.html index c38b9419..06a9937a 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-else/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-else/index.html @@ -2,19 +2,19 @@ - + Unnecessary ELSE :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -230,12 +230,12 @@ ERROR(BinCodeChangeNotAllowedErr,...);
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-function-parenthesis/index.html b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-function-parenthesis/index.html index 3b037a02..3a1c1434 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-function-parenthesis/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-function-parenthesis/index.html @@ -2,19 +2,19 @@ - + Unnecessary Function Parenthesis :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -232,12 +232,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-separators/index.html b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-separators/index.html index 286e7004..c4afd954 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-separators/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-separators/index.html @@ -2,19 +2,19 @@ - + Unnecessary Separators :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -225,12 +225,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-truefalse/index.html b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-truefalse/index.html index 68cb1812..0753035d 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/unnecessary-truefalse/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/unnecessary-truefalse/index.html @@ -2,19 +2,19 @@ - + Unnecessary TRUE/FALSE :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -232,12 +232,12 @@ Bad code

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/variable-already-scoped/index.html b/navpatterns/3-cal-coding-guidelines/readability/variable-already-scoped/index.html index e33eac85..2a76e579 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/variable-already-scoped/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/variable-already-scoped/index.html @@ -2,19 +2,19 @@ - + Variable Already Scoped :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -240,12 +240,12 @@ END;
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/variable-naming/index.html b/navpatterns/3-cal-coding-guidelines/readability/variable-naming/index.html index 0388a03b..872ccefb 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/variable-naming/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/variable-naming/index.html @@ -2,19 +2,19 @@ - + Variable Naming :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -263,12 +263,12 @@ THEN BEGIN
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/readability/variables-declarations-order/index.html b/navpatterns/3-cal-coding-guidelines/readability/variables-declarations-order/index.html index ca1379ea..f796617c 100644 --- a/navpatterns/3-cal-coding-guidelines/readability/variables-declarations-order/index.html +++ b/navpatterns/3-cal-coding-guidelines/readability/variables-declarations-order/index.html @@ -2,19 +2,19 @@ - + Variables Declarations Order :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -227,12 +227,12 @@ StartingDateFilter@1002 : Text\[30\];
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/ux/actions-images/index.html b/navpatterns/3-cal-coding-guidelines/ux/actions-images/index.html index f6c8fda3..0be6c634 100644 --- a/navpatterns/3-cal-coding-guidelines/ux/actions-images/index.html +++ b/navpatterns/3-cal-coding-guidelines/ux/actions-images/index.html @@ -2,19 +2,19 @@ - + Actions - Images :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -231,12 +231,12 @@ Image=Report }
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/ux/confirm/index.html b/navpatterns/3-cal-coding-guidelines/ux/confirm/index.html index 64c0a24d..a15ba60e 100644 --- a/navpatterns/3-cal-coding-guidelines/ux/confirm/index.html +++ b/navpatterns/3-cal-coding-guidelines/ux/confirm/index.html @@ -2,19 +2,19 @@ - + CONFIRM :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -230,12 +230,12 @@ IF CONFIRM(ChangeAllOpenedEntriesQst,TRUE) THEN
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/ux/fielderror/index.html b/navpatterns/3-cal-coding-guidelines/ux/fielderror/index.html index 57fb3037..e6709712 100644 --- a/navpatterns/3-cal-coding-guidelines/ux/fielderror/index.html +++ b/navpatterns/3-cal-coding-guidelines/ux/fielderror/index.html @@ -2,19 +2,19 @@ - + FIELDERROR :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -230,12 +230,12 @@ Cust.FIELDERROR("No.",InvalidValue);
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/ux/index.html b/navpatterns/3-cal-coding-guidelines/ux/index.html index eb7f5699..ed857fa3 100644 --- a/navpatterns/3-cal-coding-guidelines/ux/index.html +++ b/navpatterns/3-cal-coding-guidelines/ux/index.html @@ -2,20 +2,20 @@ - + UX :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -227,12 +227,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/3-cal-coding-guidelines/ux/message-and-error/index.html b/navpatterns/3-cal-coding-guidelines/ux/message-and-error/index.html index 50609031..2e8f4b1f 100644 --- a/navpatterns/3-cal-coding-guidelines/ux/message-and-error/index.html +++ b/navpatterns/3-cal-coding-guidelines/ux/message-and-error/index.html @@ -2,19 +2,19 @@ - + MESSAGE and ERROR :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -230,12 +230,12 @@ ERROR(CustIsBlockedErr,...);
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/4-get-involved/code-of-conduct/index.html b/navpatterns/4-get-involved/code-of-conduct/index.html index 98323d1b..ebfcd983 100644 --- a/navpatterns/4-get-involved/code-of-conduct/index.html +++ b/navpatterns/4-get-involved/code-of-conduct/index.html @@ -2,19 +2,19 @@ - + Code of Conduct :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -227,12 +227,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/4-get-involved/index.html b/navpatterns/4-get-involved/index.html index 9ff17982..586a6b42 100644 --- a/navpatterns/4-get-involved/index.html +++ b/navpatterns/4-get-involved/index.html @@ -2,20 +2,20 @@ - + (OLD) Get Involved :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -224,12 +224,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/4-get-involved/patterns-authors/index.html b/navpatterns/4-get-involved/patterns-authors/index.html index 4399c6ff..fa9ac5c1 100644 --- a/navpatterns/4-get-involved/patterns-authors/index.html +++ b/navpatterns/4-get-involved/patterns-authors/index.html @@ -2,19 +2,19 @@ - + Patterns Authors :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -512,12 +512,12 @@ _ (2 patterns)

        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/4-get-involved/template-for-writing-nav-design-patterns/index.html b/navpatterns/4-get-involved/template-for-writing-nav-design-patterns/index.html index 16c59d93..6bd35f6c 100644 --- a/navpatterns/4-get-involved/template-for-writing-nav-design-patterns/index.html +++ b/navpatterns/4-get-involved/template-for-writing-nav-design-patterns/index.html @@ -2,19 +2,19 @@ - + Template for writing Nav Design Patterns :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -256,12 +256,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/index.html b/navpatterns/index.html index 1ef85706..8bc6831b 100644 --- a/navpatterns/index.html +++ b/navpatterns/index.html @@ -2,20 +2,20 @@ - + NAV Patterns Archive :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -222,12 +222,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/navpatterns/related-links/index.html b/navpatterns/related-links/index.html index 6a626f69..4ae3edd5 100644 --- a/navpatterns/related-links/index.html +++ b/navpatterns/related-links/index.html @@ -2,19 +2,19 @@ - + Related Links :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -32,9 +32,9 @@ BC AL Help . dev
      - - - + + +
        @@ -221,12 +221,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index 71730aea..082c6918 100644 --- a/tags/index.html +++ b/tags/index.html @@ -2,20 +2,20 @@ - + Tags :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -211,12 +211,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file diff --git a/welcome/index.html b/welcome/index.html index ecb7b507..327726f3 100644 --- a/welcome/index.html +++ b/welcome/index.html @@ -2,20 +2,20 @@ - + Welcome :: BC AL Help - - - - - - - - - - + + + + + + + + + + @@ -33,9 +33,9 @@ BC AL Help . dev
      - - - + + +
        @@ -215,12 +215,12 @@ BC AL Help . dev
        - - - - - - - + + + + + + + \ No newline at end of file