Hey,
I am having issues with our invoicers creating duplicate external document numbers in the header on SOs, is there an out-of-the-box way to prevent this from happening?
Thanks,
There is no standard (out-of-the-box) function to check if the value entered in the field "External Document No." is unique.
https://learn.microsoft.com/en-us/dynamics365/business-central/across-enter-external-document-numbers
Customization is needed for this, which is pretty simple to create.
I would create a global procedure to be called onAferValidateEvent for field "External Document No." on any business document you need to check for duplicated value (i.e. Sales Header for Sales Quotes, Sales Orders, Sales Header Archive for Archived Sales Quotes and Orders, etc.). Procedure should check if any duplicated value exists in T36 - "Sales Header", same would then needed to be done for T5107 - "Sales Header Archive", etc.
Code sample below
[EventSubscriber(ObjectType::Table, Database::"Sales Header", 'OnAfterValidateEvent', 'External Document No.', false, false)] procedure CheckForDuplicatedExternalDocumentNo(var Rec: Record "Sales Header"; var xRec: Record "Sales Header"; CurrFieldNo: Integer) var SalesHeaderRec: Record "Sales Header"; SalesHeaderArchiveRec: Record "Sales Header Archive"; SalesCrMemoArchiveRec: Record "Sales Cr.Memo Header"; WKText001: Label 'External Document No. %1 already exist on %2 %3'; WKText002: Label 'External Document No. %1 already exist on %2 %3'; DocumentType: Label 'Sales %1'; Archive: Label 'Archive'; SalesDocument: Text; begin SalesHeaderRec.Reset(); SalesHeaderRec.SetCurrentKey("External Document No."); SalesHeaderRec.SetRange(SalesHeaderRec."External Document No.", Rec."External Document No."); if SalesHeaderRec.Find('-') then begin SalesDocument := StrSubstNo(DocumentType, SalesHeaderRec."Document Type"); Error(WKText001, Rec."External Document No.", SalesDocument, SalesHeaderRec."No."); end; SalesHeaderArchiveRec.Reset(); SalesHeaderArchiveRec.SetCurrentKey("External Document No."); SalesHeaderArchiveRec.SetRange(SalesHeaderArchiveRec."External Document No.", Rec."External Document No."); if SalesHeaderArchiveRec.Find('-') then begin SalesDocument := StrSubstNo(DocumentType, SalesHeaderArchiveRec."Document Type"); SalesDocument := Format(SalesDocument ' ' Archive); Error(WKText002, Rec."External Document No.", SalesDocument, SalesHeaderArchiveRec."No."); end; SalesCrMemoArchiveRec.Reset(); SalesCrMemoArchiveRec.SetCurrentKey("External Document No."); SalesCrMemoArchiveRec.SetRange(SalesCrMemoArchiveRec."External Document No.", Rec."External Document No."); if SalesCrMemoArchiveRec.FindFirst() then begin SalesDocument := StrSubstNo(DocumentType, SalesHeaderArchiveRec."Document Type"); SalesDocument := Format(SalesDocument ' ' Archive); Error(WKText002, Rec."External Document No.", SalesDocument, SalesCrMemoArchiveRec."No."); end; end;
Please accept the answer it it resolves your issue.
Thank you
BR Damjan
This does not sound like standard behavior. Are the sales orders imported into your system and do you have any customizations done to your system?
André Arnaud de Cal...
291,979
Super User 2025 Season 1
Martin Dráb
230,848
Most Valuable Professional
nmaenpaa
101,156