Formatting repair

This commit is contained in:
Jeremy Vyska 2021-10-30 23:55:19 +02:00
parent 89ac40c868
commit 26452d5f7c
20 changed files with 134 additions and 179 deletions

View file

@ -5,70 +5,5 @@ weight = 110
+++ +++
## Browse design patterns by tags ## Browse design patterns by tags
_(for "all patterns", choose a title from the left menu)._ _Originally, this page was categorized set of links to subpages, but that is not necessary now with the menu system to the left._
_
_
"It's all about the user"
* [User eXperience][anchor0]
* [User productivity][anchor1]
* [UI][anchor2]
* [Data entry][anchor3]
Setting NAV up
* [Setup][anchor4]
General software development
* [Error handling][anchor5]
* [.NET][anchor6]
* [Metadata][anchor7]
* [Architecture][anchor8]
* [Caching][anchor9]
A partners' world
* [For new NAV developers][anchor10]
* [Developer productivity][anchor11]
* [Localization][anchor12]
* [Upgrade][anchor13]
* [Make the Web work for you][anchor14]
NAV specifics
* [Event Subscription][anchor15]
* [Journal][anchor16]
* [Query][anchor17]
* [Document][anchor18]
* [Reports][anchor19]
* [Posting][anchor20]
* [MiniApp][anchor21]
* [Files ][anchor22]
[anchor0]: /nav/w/designpatterns/tags/UI/User%2bexperience
[anchor1]: /nav/w/designpatterns/tags/User%2bProductivity
[anchor2]: /nav/w/designpatterns/tags/UI
[anchor3]: /nav/w/designpatterns/tags/data%2bentry
[anchor4]: /nav/w/designpatterns/tags/setup
[anchor5]: /nav/w/designpatterns/tags/error%2bhandling
[anchor6]: /nav/w/designpatterns/tags/-NET
[anchor7]: /nav/w/designpatterns/tags/Metadata
[anchor8]: /nav/w/designpatterns/tags/architecture
[anchor9]: /nav/w/designpatterns/tags/Caching
[anchor10]: /nav/w/designpatterns/tags/For%2bnew%2bNAV%2bdevelopers
[anchor11]: /nav/w/designpatterns/tags/developer%2bproductivity
[anchor12]: /nav/w/designpatterns/tags/Localization
[anchor13]: /nav/w/designpatterns/tags/upgrade
[anchor14]: /nav/w/designpatterns/tags/web
[anchor15]: /nav/w/designpatterns/tags/Event%2bSubscription
[anchor16]: /nav/w/designpatterns/tags/journal
[anchor17]: /nav/w/designpatterns/tags/query
[anchor18]: /nav/w/designpatterns/tags/document
[anchor19]: /nav/w/designpatterns/tags/reports
[anchor20]: /nav/w/designpatterns/tags/posting
[anchor21]: /nav/w/designpatterns/tags/miniapp
[anchor22]: /nav/w/designpatterns/tags/files

View file

@ -2,7 +2,7 @@
title = "Activity Logs" title = "Activity Logs"
weight = 210 weight = 210
+++ +++
## _by Ciprian Iordache at Microsoft Development Center Copenhagen_ _Originally by Ciprian Iordache at Microsoft Development Center Copenhagen_
## Activity Log ## Activity Log
@ -51,18 +51,22 @@ The following parameters should be provided to the function:
To show the log, add a page action, with the caption including the name "<prefix\> Log" and link it to the image named "Log": To show the log, add a page action, with the caption including the name "<prefix\> Log" and link it to the image named "Log":
{ ;1 ;Action ; ```AL
{ ;1 ;Action ;
Name=ActivityLog; Name=ActivityLog;
CaptionML=ENU=Activity Log; CaptionML=ENU='Activity Log';
ToolTipML=ENU=View the status and any errors if the document was sent as an electronic document or OCR file through the document exchange service.; ToolTipML=ENU='View the status and any errors if the document was sent as an electronic document or OCR file through the document exchange service.';
ApplicationArea=\#Basic,\#Suite; ApplicationArea=#Basic,#Suite;
Image=Log; Image=Log;
OnAction=VAR OnAction=
ActivityLog@1000 : Record 710; VAR
ActivityLog@1000 : Record 710;
BEGIN BEGIN
ActivityLog.ShowEntries(RECORDID); ActivityLog.ShowEntries(RECORDID);
END; END;
} }
```
**NAV usages** **NAV usages**

View file

@ -4,7 +4,7 @@ weight = 220
+++ +++
# Argument table pattern # Argument table pattern
_By Nikola Kukrika and Waldo_ _Originally By Nikola Kukrika and Waldo_
# Abstract # Abstract
@ -27,36 +27,37 @@ 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 :** ```AL
**Code\[20\];VAR PeerID@1200002 : Code\[20\]; VAR DocumentNo@1200003 : Code\[20\]; VAR NumberOfCopies@1200007 :** 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);
**Integer; VAR Uploaded@1200004 : Boolean; VAR Correction@1200005 : Boolean; VAR HasValidationErr@1200006 :** ```
**Boolean);**
Call **Call**
**FillInVATReturnData(NoSeries, NextLineID, CustomerID, DocumentNo, SingleCopy, ???, ??, ...., ...)**
```AL
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. 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(** ```AL
**OldTableId@1002 : Integer;** LOCAL PROCEDURE GetTableSyncSetupW1@3(OldTableId@1002 : Integer; VAR UpgradeTableId@1001 : Integer; VAR TableUpgradeMode@1000 : 'Check, Copy, Move, Force') : Boolean;
**VAR UpgradeTableId@1001 : Integer;**
**VAR TableUpgradeMode@1000 : 'Check, Copy, Move, Force') : Boolean;**
BEGIN BEGIN
CASE OldTableId OF CASE OldTableId OF
DATABASE::"Sales Header": DATABASE::"Sales Header":
SetTableSyncSetup(0,TableUpgradeMode::Check,UpgradeTableId,TableUpgradeMode); SetTableSyncSetup(0,TableUpgradeMode::Check,UpgradeTableId,TableUpgradeMode);
DATABASE::"Posting Exch. Column Def": DATABASE::"Posting Exch. Column Def":
SetTableSyncSetup(104025,TableUpgradeMode::Copy,UpgradeTableId,TableUpgradeMode); SetTableSyncSetup(104025,TableUpgradeMode::Copy,UpgradeTableId,TableUpgradeMode);
DATABASE::"Payment Export Data": DATABASE::"Payment Export Data":
SetTableSyncSetup(0,TableUpgradeMode::Force,UpgradeTableId,TableUpgradeMode); SetTableSyncSetup(0,TableUpgradeMode::Force,UpgradeTableId,TableUpgradeMode);
ELSE ELSE
EXIT(FALSE); EXIT(FALSE);
END; END;
EXIT(TRUE); EXIT(TRUE);
END; 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. 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.
@ -75,28 +76,33 @@ The examples of usages addressing problems shown above are:
## Good example 1 ## Good example 1
New table New table
```AL
TAB 50003 VAT Return Data TAB 50003 VAT Return Data
**PROCEDURE FillInVATReturnData@1200001(VAR VATReturnData@1200000 : Record 50003);** PROCEDURE FillInVATReturnData@1200001(VAR VATReturnData@1200000 : Record 50003);
```
**** ****
```AL
VATReturnData.INIT; VATReturnData.INIT;
VATReturnData.NumberOfCopies := GetDefaultNumberOfCopies; VATReturnData.NumberOfCopies := GetDefaultNumberOfCopies;
VATReturnData.Uploaded := FALSE; VATReturnData.Uploaded := FALSE;
FillInVATReturnData(VATReturnData); FillInVATReturnData(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. 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 Good example
**PROCEDURE GetTableSyncSetupW1@3(VAR TableSynchSetup@1000 : Record 2000000135);** ```AL
PROCEDURE GetTableSyncSetupW1@3(VAR TableSynchSetup@1000 : Record 2000000135);
BEGIN BEGIN
SetTableSyncSetup(DATABASE::"Sales Header",0,TableSynchSetup.Mode::Check); SetTableSyncSetup(DATABASE::"Sales Header",0,TableSynchSetup.Mode::Check);
SetTableSyncSetup(DATABASE::"Posting Exch. Column Def",104025,TableSynchSetup.Mode::Copy); SetTableSyncSetup(DATABASE::"Posting Exch. Column Def",104025,TableSynchSetup.Mode::Copy);
SetTableSyncSetup(DATABASE::"Payment Export Data",0,TableSynchSetup.Mode::Force); SetTableSyncSetup(DATABASE::"Payment Export Data",0,TableSynchSetup.Mode::Force);
END; 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. Option definition is not encapsulated within the table. Arguments are grouped and we can add additional arguments without the need to change the signature.

View file

@ -1,8 +1,8 @@
+++ +++
title = "Blocked Entity.md" title = "Blocked Entity"
weight = 270 weight = 270
+++ +++
_by Abhishek Ghosh at Microsoft Development Center Copenhagen_ _Originally by Abhishek Ghosh at Microsoft Development Center Copenhagen_
## Abstract ## Abstract
@ -14,7 +14,7 @@ The Blocked Entity is used when it is required to stop transactions for an entit
To block entities through metadata, read this pattern. To do the same thing through data, read [Data Driven Blocked Entity pattern][anchor1]. To block entities through metadata, read this pattern. To do the same thing through data, read [Data Driven Blocked Entity pattern][anchor1].
The business entity holds a state that controls if a given transaction is allowed. The state is used by the logic controlling transactions.****The change of state could either be temporary or permanent. The business entity holds a state that controls if a given transaction is allowed. The state is used by the logic controlling transactions. The change of state could either be temporary or permanent.
An example of a temporary halt is when a retail chain selling items has received lot of complaints about an item, and the company wants to stop all transactions, both purchase and sale, with that item until the dealer has clarified the issue with his supplier and possibly received a replacement for the defective stock. Another common example is during counting the physical inventory using cycle counting where the counting is done in one section of a warehouse at a time, so that the regular operations can continue in the other parts of the warehouse. In these situations, it is necessary to block all transactions, such as picks and put-aways, for a bin while warehouse counting is in progress for that bin. An example of a temporary halt is when a retail chain selling items has received lot of complaints about an item, and the company wants to stop all transactions, both purchase and sale, with that item until the dealer has clarified the issue with his supplier and possibly received a replacement for the defective stock. Another common example is during counting the physical inventory using cycle counting where the counting is done in one section of a warehouse at a time, so that the regular operations can continue in the other parts of the warehouse. In these situations, it is necessary to block all transactions, such as picks and put-aways, for a bin while warehouse counting is in progress for that bin.
@ -34,7 +34,9 @@ Add a Boolean field named Blocked in the table.
In the relevant logic, add a condition to check the status of the Blocked flag. The cheapest way is to use a TESTFIELD: In the relevant logic, add a condition to check the status of the Blocked flag. The cheapest way is to use a TESTFIELD:
_<rec variable\>.TESTFIELD(Blocked,FALSE);_ ```AL
<rec variable\>.TESTFIELD(Blocked,FALSE);
```
Alternatively, you can throw a custom error message. However, you should only do that if the default error message thrown by TESTFIELD is not sufficient. Alternatively, you can throw a custom error message. However, you should only do that if the default error message thrown by TESTFIELD is not sufficient.
@ -62,9 +64,10 @@ An example of the Boolean implementation on the Item card.
In codeunit 22 -- Item Jnl.-Post Line, the following lines of code have implemented a check based on the value of the Blocked field: In codeunit 22 -- Item Jnl.-Post Line, the following lines of code have implemented a check based on the value of the Blocked field:
IF NOT CalledFromAdjustment THEN ```AL
IF NOT CalledFromAdjustment THEN
Item.TESTFIELD(Blocked,FALSE); Item.TESTFIELD(Blocked,FALSE);
```
### Option-Field Implementation ### Option-Field Implementation
[![ ][image2]][anchor3] [![ ][image2]][anchor3]

View file

@ -4,12 +4,10 @@ weight = 470
+++ +++
_Written by Bogdan Andrei Sturzoiu, at Microsoft Development Center Copenhagen_ _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. This pattern implements a generic mechanism for dynamically restricting and allowing usage of a record by the business process administrator.
[![ ][image0]][anchor0]
**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. 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.
@ -42,7 +40,9 @@ Currently, the restrictions are record-based and type-less. They act as simple t
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. 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 example, we want to restrict posting Gen. Journal Lines if a customer has not been added in Account No. field.
@ -66,34 +66,37 @@ The code behind the "Add record restriction" workflow response:
The code behind the "Remove record restriction" response: The code behind the "Remove record restriction" response:
RecRef.GETTABLE(Variant); ```AL
CASE RecRef.NUMBER OF RecRef.GETTABLE(Variant);
CASE RecRef.NUMBER OF
DATABASE::"Approval Entry": DATABASE::"Approval Entry":
BEGIN BEGIN
RecordRestrictionMgt.AllowRecordUsage(RecRef.RECORDID); RecordRestrictionMgt.AllowRecordUsage(RecRef.RECORDID);
RecRef.SETTABLE(ApprovalEntry); RecRef.SETTABLE(ApprovalEntry);
RecRef.GET(ApprovalEntry."Record ID to Approve"); RecRef.GET(ApprovalEntry."Record ID to Approve");
AllowRecordUsage(RecRef); AllowRecordUsage(RecRef);
END; END;
DATABASE::"Gen. Journal Batch": DATABASE::"Gen. Journal Batch":
BEGIN BEGIN
RecRef.SETTABLE(GenJournalBatch); RecRef.SETTABLE(GenJournalBatch);
RecordRestrictionMgt.AllowGenJournalBatchUsage(GenJournalBatch); RecordRestrictionMgt.AllowGenJournalBatchUsage(GenJournalBatch);
END END
ELSE ELSE
RecordRestrictionMgt.AllowRecordUsage(RecRef.RECORDID); RecordRestrictionMgt.AllowRecordUsage(RecRef.RECORDID);
END; 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).
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. 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. 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** **NAV Versions**
This pattern has been introduced in Dynamics NAV 2016\. This pattern has been introduced in Dynamics NAV 2016\.

View file

@ -1,8 +1,8 @@
+++ +++
title = "Cached Web Server Calls.md" title = "Cached Web Server Calls"
weight = 290 weight = 290
+++ +++
_by Mostafa Balat, Microsoft Development Center Copenhagen_ _Originally by Mostafa Balat, Microsoft Development Center Copenhagen_
## Abstract ## Abstract
@ -44,56 +44,61 @@ If **PAG1259 Bank Name - Data Conv. List** is being open and the cached data is
### Code Sample ### Code Sample
OnInit=BEGIN ```AL
OnInit=BEGIN
ShortTimeout := 5000; ShortTimeout := 5000;
LongTimeout := 30000; LongTimeout := 30000;
END; END;
OnOpenPage=VAR
OnOpenPage=VAR
BankDataConvBank@1002 : Record 1259; BankDataConvBank@1002 : Record 1259;
ImpBankListExtDataHndl@1000 : Codeunit 1289; ImpBankListExtDataHndl@1000 : Codeunit 1289;
CountryRegionCode@1004 : Text; CountryRegionCode@1004 : Text;
HideErrors@1003 : Boolean; HideErrors@1003 : Boolean;
BEGIN BEGIN
CountryRegionCode := IdentifyCountryRegionCode(Rec,GETFILTER("Country/Region Code")); CountryRegionCode := IdentifyCountryRegionCode(Rec,GETFILTER("Country/Region Code"));
IF BankDataConvBank.ISEMPTY THEN BEGIN IF BankDataConvBank.ISEMPTY THEN BEGIN
ImpBankListExtDataHndl.GetBankListFromConversionService(HideErrors,CountryRegionCode,ShortTimeout); ImpBankListExtDataHndl.GetBankListFromConversionService(HideErrors,CountryRegionCode,ShortTimeout);
EXIT; EXIT;
END; END;
RefreshBankNamesOlderThanToday(CountryRegionCode,HideErrors,ShortTimeout); RefreshBankNamesOlderThanToday(CountryRegionCode,HideErrors,ShortTimeout);
END; END;
OnAction=VAR
OnAction=VAR
ImpBankListExtDataHndl@1000 : Codeunit 1289; ImpBankListExtDataHndl@1000 : Codeunit 1289;
FilterNotUsed@1001 : Text; FilterNotUsed@1001 : Text;
ShowErrors@1003 : Boolean; ShowErrors@1003 : Boolean;
BEGIN BEGIN
ShowErrors := TRUE; ShowErrors := TRUE;
ImpBankListExtDataHndl.GetBankListFromConversionService(ShowErrors,FilterNotUsed,LongTimeout); ImpBankListExtDataHndl.GetBankListFromConversionService(ShowErrors,FilterNotUsed,LongTimeout);
END; END;
LOCAL PROCEDURE IdentifyCountryRegionCode@1(VAR BankDataConvBank@1002 : Record 1259;Filter@1000 : Text) : Text;
LOCAL PROCEDURE IdentifyCountryRegionCode@1(VAR BankDataConvBank@1002 : Record 1259;Filter@1000 : Text) : Text;
VAR VAR
CompanyInformation@1001 : Record 79; CompanyInformation@1001 : Record 79;
BlankFilter@1003 : Text; BlankFilter@1003 : Text;
BEGIN BEGIN
BlankFilter := ''''''; BlankFilter := '''''';
IF Filter = BlankFilter THEN BEGIN IF Filter = BlankFilter THEN BEGIN
CompanyInformation.GET; CompanyInformation.GET;
BankDataConvBank.SETFILTER("Country/Region Code",CompanyInformation."Country/Region Code"); BankDataConvBank.SETFILTER("Country/Region Code",CompanyInformation."Country/Region Code");
EXIT(BankDataConvBank.GETFILTER("Country/Region Code")); EXIT(BankDataConvBank.GETFILTER("Country/Region Code"));
END; END;
EXIT(Filter); EXIT(Filter);
END;
LOCAL PROCEDURE RefreshBankNamesOlderThanToday@5(CountryRegionCode@1000 : Text;ShowErrors@1002 : Boolean;Timeout@1004 : Integer);
VAR
BankDataConvBank@1001 : Record 1259;
ImpBankListExtDataHndl@1003 : Codeunit 1289;
BEGIN
IF CountryRegionCode <\> '' THEN
BankDataConvBank.SETFILTER("Country/Region Code",CountryRegionCode);
BankDataConvBank.SETFILTER("Last Update Date",'<%1',TODAY);
IF BankDataConvBank.FINDFIRST THEN
ImpBankListExtDataHndl.GetBankListFromConversionService(ShowErrors,CountryRegionCode,Timeout);
END; END;
LOCAL PROCEDURE RefreshBankNamesOlderThanToday@5(CountryRegionCode@1000 : Text;ShowErrors@1002 : Boolean;Timeout@1004 : Integer);
VAR
BankDataConvBank@1001 : Record 1259;
ImpBankListExtDataHndl@1003 : Codeunit 1289;
BEGIN
IF CountryRegionCode <\> '' THEN
BankDataConvBank.SETFILTER("Country/Region Code",CountryRegionCode);
BankDataConvBank.SETFILTER("Last Update Date",'<%1',TODAY);
IF BankDataConvBank.FINDFIRST THEN
ImpBankListExtDataHndl.GetBankListFromConversionService(ShowErrors,CountryRegionCode,Timeout);
END;
```
## NAV Usages ## NAV Usages
Bank name lookup on the Bank Account card for dynamically identifying the format to use to generate a bank-specific payment file. Bank name lookup on the Bank Account card for dynamically identifying the format to use to generate a bank-specific payment file.

View file

@ -2,14 +2,13 @@
title = "Conditional Cascading Update" title = "Conditional Cascading Update"
weight = 370 weight = 370
+++ +++
_by Jan Hoek at IDYN _ _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". 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. 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.

View file

@ -2,7 +2,7 @@
title = "Create Data from Templates" title = "Create Data from Templates"
weight = 400 weight = 400
+++ +++
_by Nikola Kukrika at Microsoft Development Center Copenhagen_ _Originally by Nikola Kukrika at Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "Creating Custom Charts" title = "Creating Custom Charts"
weight = 420 weight = 420
+++ +++
_by Nikola Kukrika at Microsoft Development Center Copenhagen_ _Originally by Nikola Kukrika at Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "Easy Update Of Setup Or Supplementary Information" title = "Easy Update Of Setup Or Supplementary Information"
weight = 520 weight = 520
+++ +++
_by Anders Larsen at Microsoft Development Center Copenhagen_ _Originally by Anders Larsen at Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "Feature Localization For Data Structures" title = "Feature Localization For Data Structures"
weight = 570 weight = 570
+++ +++
_by Bogdan Sturzoiu at Microsoft Development Center Copenhagen_ _Originally by Bogdan Sturzoiu at Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "Instructions in the UI" title = "Instructions in the UI"
weight = 670 weight = 670
+++ +++
_by Nikola Kukrika at Microsoft Development Center Copenhagen_ _Originally by Nikola Kukrika at Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "Journal Error Processing" title = "Journal Error Processing"
weight = 710 weight = 710
+++ +++
_by Bogdana Botez at Microsoft Development Center Copenhagen_ _Originally by Bogdana Botez at Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "Journal Template Batch Line" title = "Journal Template Batch Line"
weight = 720 weight = 720
+++ +++
_by Bogdana Botez at Microsoft Development Center Copenhagen_ _Originally by Bogdana Botez at Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "Multilanguage Application Data" title = "Multilanguage Application Data"
weight = 820 weight = 820
+++ +++
_by Bogdana Botez at Microsoft Development Center Copenhagen_ _Originally by Bogdana Botez at Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "NET Exception Handling in CAL" title = "NET Exception Handling in CAL"
weight = 860 weight = 860
+++ +++
_by Mostafa Balat, Microsoft Development Center Copenhagen_ _Originally by Mostafa Balat, Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "TryFunction NET Exception Handling in CAL" title = "TryFunction NET Exception Handling in CAL"
weight = 1240 weight = 1240
+++ +++
_by Mostafa Balat, Microsoft Development Center Copenhagen_ _Originally by Mostafa Balat, Microsoft Development Center Copenhagen_
## Abstract ## Abstract

View file

@ -2,7 +2,7 @@
title = "use Queries to Detect Duplicate Records" title = "use Queries to Detect Duplicate Records"
weight = 1340 weight = 1340
+++ +++
_by Abshishek Ghosh and Bogdan Sturzoiu at Microsoft Development Center Copenhagen** _Originally by Abshishek Ghosh and Bogdan Sturzoiu at Microsoft Development Center Copenhagen**
**_ **_
## **Abstract** ## **Abstract**

View file

@ -2,7 +2,7 @@
title = "Use Queries to Replace Nested Loops" title = "Use Queries to Replace Nested Loops"
weight = 1350 weight = 1350
+++ +++
#### _by Bogdan Sturzoiu, Microsoft Development Center Copenhagen_ #### _Originally by Bogdan Sturzoiu, Microsoft Development Center Copenhagen_
## **Abstract** ## **Abstract**

View file

@ -2,7 +2,7 @@
title = "Temporary Dataset Report" title = "Temporary Dataset Report"
weight = 1190 weight = 1190
+++ +++
_by Abhishek Ghosh, at Microsoft Development Center Copenhagen_ _Originally by Abhishek Ghosh, at Microsoft Development Center Copenhagen_
Abstract Abstract