Formatting repair
This commit is contained in:
parent
89ac40c868
commit
26452d5f7c
20 changed files with 134 additions and 179 deletions
|
|
@ -5,70 +5,5 @@ weight = 110
|
|||
+++
|
||||
## 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
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Activity Logs"
|
||||
weight = 210
|
||||
+++
|
||||
## _by Ciprian Iordache at Microsoft Development Center Copenhagen_
|
||||
_Originally by Ciprian Iordache at Microsoft Development Center Copenhagen_
|
||||
|
||||
## 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":
|
||||
|
||||
{ ;1 ;Action ;
|
||||
```AL
|
||||
{ ;1 ;Action ;
|
||||
Name=ActivityLog;
|
||||
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.;
|
||||
ApplicationArea=\#Basic,\#Suite;
|
||||
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.';
|
||||
ApplicationArea=#Basic,#Suite;
|
||||
Image=Log;
|
||||
OnAction=VAR
|
||||
OnAction=
|
||||
VAR
|
||||
ActivityLog@1000 : Record 710;
|
||||
BEGIN
|
||||
ActivityLog.ShowEntries(RECORDID);
|
||||
END;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
**NAV usages**
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ weight = 220
|
|||
+++
|
||||
# Argument table pattern
|
||||
|
||||
_By Nikola Kukrika and Waldo_
|
||||
_Originally By Nikola Kukrika and Waldo_
|
||||
|
||||
# Abstract
|
||||
|
||||
|
|
@ -27,36 +27,37 @@ Few examples of the bad implementations are as illustrated here:
|
|||
## 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);**
|
||||
```AL
|
||||
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
|
||||
**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.
|
||||
|
||||
## Bad example 2
|
||||
|
||||
**LOCAL PROCEDURE GetTableSyncSetupW1@3(**
|
||||
**OldTableId@1002 : Integer;**
|
||||
**VAR UpgradeTableId@1001 : Integer;**
|
||||
**VAR TableUpgradeMode@1000 : 'Check, Copy, Move, Force') : Boolean;**
|
||||
```AL
|
||||
LOCAL PROCEDURE GetTableSyncSetupW1@3(OldTableId@1002 : Integer; VAR UpgradeTableId@1001 : Integer; VAR TableUpgradeMode@1000 : 'Check, Copy, Move, Force') : Boolean;
|
||||
BEGIN
|
||||
CASE OldTableId OF
|
||||
DATABASE::"Sales Header":
|
||||
SetTableSyncSetup(0,TableUpgradeMode::Check,UpgradeTableId,TableUpgradeMode);
|
||||
DATABASE::"Posting Exch. Column Def":
|
||||
SetTableSyncSetup(104025,TableUpgradeMode::Copy,UpgradeTableId,TableUpgradeMode);
|
||||
DATABASE::"Payment Export Data":
|
||||
SetTableSyncSetup(0,TableUpgradeMode::Force,UpgradeTableId,TableUpgradeMode);
|
||||
ELSE
|
||||
EXIT(FALSE);
|
||||
END;
|
||||
EXIT(TRUE);
|
||||
CASE OldTableId OF
|
||||
DATABASE::"Sales Header":
|
||||
SetTableSyncSetup(0,TableUpgradeMode::Check,UpgradeTableId,TableUpgradeMode);
|
||||
DATABASE::"Posting Exch. Column Def":
|
||||
SetTableSyncSetup(104025,TableUpgradeMode::Copy,UpgradeTableId,TableUpgradeMode);
|
||||
DATABASE::"Payment Export Data":
|
||||
SetTableSyncSetup(0,TableUpgradeMode::Force,UpgradeTableId,TableUpgradeMode);
|
||||
ELSE
|
||||
EXIT(FALSE);
|
||||
END;
|
||||
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.
|
||||
|
||||
|
|
@ -75,28 +76,33 @@ The examples of usages addressing problems shown above are:
|
|||
## Good example 1
|
||||
|
||||
New table
|
||||
```AL
|
||||
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.NumberOfCopies := GetDefaultNumberOfCopies;
|
||||
VATReturnData.Uploaded := FALSE;
|
||||
|
||||
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.
|
||||
|
||||
## Good example 2
|
||||
|
||||
Good example
|
||||
**PROCEDURE GetTableSyncSetupW1@3(VAR TableSynchSetup@1000 : Record 2000000135);**
|
||||
```AL
|
||||
PROCEDURE GetTableSyncSetupW1@3(VAR TableSynchSetup@1000 : Record 2000000135);
|
||||
BEGIN
|
||||
SetTableSyncSetup(DATABASE::"Sales Header",0,TableSynchSetup.Mode::Check);
|
||||
SetTableSyncSetup(DATABASE::"Posting Exch. Column Def",104025,TableSynchSetup.Mode::Copy);
|
||||
SetTableSyncSetup(DATABASE::"Payment Export Data",0,TableSynchSetup.Mode::Force);
|
||||
SetTableSyncSetup(DATABASE::"Sales Header",0,TableSynchSetup.Mode::Check);
|
||||
SetTableSyncSetup(DATABASE::"Posting Exch. Column Def",104025,TableSynchSetup.Mode::Copy);
|
||||
SetTableSyncSetup(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.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
+++
|
||||
title = "Blocked Entity.md"
|
||||
title = "Blocked Entity"
|
||||
weight = 270
|
||||
+++
|
||||
_by Abhishek Ghosh at Microsoft Development Center Copenhagen_
|
||||
_Originally by Abhishek Ghosh at Microsoft Development Center Copenhagen_
|
||||
|
||||
## 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].
|
||||
|
||||
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.
|
||||
|
||||
|
|
@ -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:
|
||||
|
||||
_<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.
|
||||
|
||||
|
|
@ -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:
|
||||
|
||||
IF NOT CalledFromAdjustment THEN
|
||||
```AL
|
||||
IF NOT CalledFromAdjustment THEN
|
||||
Item.TESTFIELD(Blocked,FALSE);
|
||||
|
||||
```
|
||||
### Option-Field Implementation
|
||||
|
||||
[![ ][image2]][anchor3]
|
||||
|
|
|
|||
|
|
@ -4,12 +4,10 @@ weight = 470
|
|||
+++
|
||||
_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.
|
||||
|
||||
[![ ][image0]][anchor0]
|
||||
|
||||
**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.
|
||||
|
|
@ -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.
|
||||
|
||||
******Example**
|
||||
****
|
||||
|
||||
**Example**
|
||||
|
||||
For example, we want to restrict posting Gen. Journal Lines if a customer has not been added in Account No. field.
|
||||
|
||||
|
|
@ -66,8 +66,9 @@ The code behind the "Add record restriction" workflow response:
|
|||
|
||||
The code behind the "Remove record restriction" response:
|
||||
|
||||
RecRef.GETTABLE(Variant);
|
||||
CASE RecRef.NUMBER OF
|
||||
```AL
|
||||
RecRef.GETTABLE(Variant);
|
||||
CASE RecRef.NUMBER OF
|
||||
DATABASE::"Approval Entry":
|
||||
BEGIN
|
||||
RecordRestrictionMgt.AllowRecordUsage(RecRef.RECORDID);
|
||||
|
|
@ -82,18 +83,20 @@ The code behind the "Remove record restriction" response:
|
|||
END
|
||||
ELSE
|
||||
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.
|
||||
|
||||
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\.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
+++
|
||||
title = "Cached Web Server Calls.md"
|
||||
title = "Cached Web Server Calls"
|
||||
weight = 290
|
||||
+++
|
||||
_by Mostafa Balat, Microsoft Development Center Copenhagen_
|
||||
_Originally by Mostafa Balat, Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
@ -44,32 +44,36 @@ If **PAG1259 Bank Name - Data Conv. List** is being open and the cached data is
|
|||
|
||||
### Code Sample
|
||||
|
||||
OnInit=BEGIN
|
||||
```AL
|
||||
OnInit=BEGIN
|
||||
ShortTimeout := 5000;
|
||||
LongTimeout := 30000;
|
||||
END;
|
||||
OnOpenPage=VAR
|
||||
END;
|
||||
|
||||
OnOpenPage=VAR
|
||||
BankDataConvBank@1002 : Record 1259;
|
||||
ImpBankListExtDataHndl@1000 : Codeunit 1289;
|
||||
CountryRegionCode@1004 : Text;
|
||||
HideErrors@1003 : Boolean;
|
||||
BEGIN
|
||||
BEGIN
|
||||
CountryRegionCode := IdentifyCountryRegionCode(Rec,GETFILTER("Country/Region Code"));
|
||||
IF BankDataConvBank.ISEMPTY THEN BEGIN
|
||||
ImpBankListExtDataHndl.GetBankListFromConversionService(HideErrors,CountryRegionCode,ShortTimeout);
|
||||
EXIT;
|
||||
END;
|
||||
RefreshBankNamesOlderThanToday(CountryRegionCode,HideErrors,ShortTimeout);
|
||||
END;
|
||||
OnAction=VAR
|
||||
END;
|
||||
|
||||
OnAction=VAR
|
||||
ImpBankListExtDataHndl@1000 : Codeunit 1289;
|
||||
FilterNotUsed@1001 : Text;
|
||||
ShowErrors@1003 : Boolean;
|
||||
BEGIN
|
||||
BEGIN
|
||||
ShowErrors := TRUE;
|
||||
ImpBankListExtDataHndl.GetBankListFromConversionService(ShowErrors,FilterNotUsed,LongTimeout);
|
||||
END;
|
||||
LOCAL PROCEDURE IdentifyCountryRegionCode@1(VAR BankDataConvBank@1002 : Record 1259;Filter@1000 : Text) : Text;
|
||||
END;
|
||||
|
||||
LOCAL PROCEDURE IdentifyCountryRegionCode@1(VAR BankDataConvBank@1002 : Record 1259;Filter@1000 : Text) : Text;
|
||||
VAR
|
||||
CompanyInformation@1001 : Record 79;
|
||||
BlankFilter@1003 : Text;
|
||||
|
|
@ -82,7 +86,8 @@ If **PAG1259 Bank Name - Data Conv. List** is being open and the cached data is
|
|||
END;
|
||||
EXIT(Filter);
|
||||
END;
|
||||
LOCAL PROCEDURE RefreshBankNamesOlderThanToday@5(CountryRegionCode@1000 : Text;ShowErrors@1002 : Boolean;Timeout@1004 : Integer);
|
||||
|
||||
LOCAL PROCEDURE RefreshBankNamesOlderThanToday@5(CountryRegionCode@1000 : Text;ShowErrors@1002 : Boolean;Timeout@1004 : Integer);
|
||||
VAR
|
||||
BankDataConvBank@1001 : Record 1259;
|
||||
ImpBankListExtDataHndl@1003 : Codeunit 1289;
|
||||
|
|
@ -92,8 +97,8 @@ If **PAG1259 Bank Name - Data Conv. List** is being open and the cached data is
|
|||
BankDataConvBank.SETFILTER("Last Update Date",'<%1',TODAY);
|
||||
IF BankDataConvBank.FINDFIRST THEN
|
||||
ImpBankListExtDataHndl.GetBankListFromConversionService(ShowErrors,CountryRegionCode,Timeout);
|
||||
END;
|
||||
|
||||
END;
|
||||
```
|
||||
## NAV Usages
|
||||
|
||||
Bank name lookup on the Bank Account card for dynamically identifying the format to use to generate a bank-specific payment file.
|
||||
|
|
|
|||
|
|
@ -2,14 +2,13 @@
|
|||
title = "Conditional Cascading Update"
|
||||
weight = 370
|
||||
+++
|
||||
_by Jan Hoek at IDYN _
|
||||
_Originally by Jan Hoek at IDYN _
|
||||
|
||||
## **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.
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Create Data from Templates"
|
||||
weight = 400
|
||||
+++
|
||||
_by Nikola Kukrika at Microsoft Development Center Copenhagen_
|
||||
_Originally by Nikola Kukrika at Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Creating Custom Charts"
|
||||
weight = 420
|
||||
+++
|
||||
_by Nikola Kukrika at Microsoft Development Center Copenhagen_
|
||||
_Originally by Nikola Kukrika at Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Easy Update Of Setup Or Supplementary Information"
|
||||
weight = 520
|
||||
+++
|
||||
_by Anders Larsen at Microsoft Development Center Copenhagen_
|
||||
_Originally by Anders Larsen at Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Feature Localization For Data Structures"
|
||||
weight = 570
|
||||
+++
|
||||
_by Bogdan Sturzoiu at Microsoft Development Center Copenhagen_
|
||||
_Originally by Bogdan Sturzoiu at Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Instructions in the UI"
|
||||
weight = 670
|
||||
+++
|
||||
_by Nikola Kukrika at Microsoft Development Center Copenhagen_
|
||||
_Originally by Nikola Kukrika at Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Journal Error Processing"
|
||||
weight = 710
|
||||
+++
|
||||
_by Bogdana Botez at Microsoft Development Center Copenhagen_
|
||||
_Originally by Bogdana Botez at Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Journal Template Batch Line"
|
||||
weight = 720
|
||||
+++
|
||||
_by Bogdana Botez at Microsoft Development Center Copenhagen_
|
||||
_Originally by Bogdana Botez at Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Multilanguage Application Data"
|
||||
weight = 820
|
||||
+++
|
||||
_by Bogdana Botez at Microsoft Development Center Copenhagen_
|
||||
_Originally by Bogdana Botez at Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "NET Exception Handling in CAL"
|
||||
weight = 860
|
||||
+++
|
||||
_by Mostafa Balat, Microsoft Development Center Copenhagen_
|
||||
_Originally by Mostafa Balat, Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "TryFunction NET Exception Handling in CAL"
|
||||
weight = 1240
|
||||
+++
|
||||
_by Mostafa Balat, Microsoft Development Center Copenhagen_
|
||||
_Originally by Mostafa Balat, Microsoft Development Center Copenhagen_
|
||||
|
||||
## Abstract
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "use Queries to Detect Duplicate Records"
|
||||
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**
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Use Queries to Replace Nested Loops"
|
||||
weight = 1350
|
||||
+++
|
||||
#### _by Bogdan Sturzoiu, Microsoft Development Center Copenhagen_
|
||||
#### _Originally by Bogdan Sturzoiu, Microsoft Development Center Copenhagen_
|
||||
|
||||
## **Abstract**
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
title = "Temporary Dataset Report"
|
||||
weight = 1190
|
||||
+++
|
||||
_by Abhishek Ghosh, at Microsoft Development Center Copenhagen_
|
||||
_Originally by Abhishek Ghosh, at Microsoft Development Center Copenhagen_
|
||||
|
||||
Abstract
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue