From 9fab60153f868536e63c9d62626293197288ac94 Mon Sep 17 00:00:00 2001 From: Yahya Touil <60827484+yahyatouil-dev@users.noreply.github.com> Date: Mon, 24 Aug 2026 08:54:37 +0100 Subject: [PATCH] Add TransferFields SkipFieldsNotMatchingType guidance (#133) * Add TransferFields SkipFieldsNotMatchingType guidance * Update transferfields-skip-type-mismatch-can-drop-data.md * Update transferfields-skip-type-mismatch-can-drop-data.good.al * Move good sample reference under Best Practice Aligns the article with the repo convention used by the sibling data-modeling files: the .good.al reference belongs under Best Practice and the .bad.al reference under Anti Pattern. Previously both pointers sat under Anti Pattern, leaving the good-sample reference orphaned in the wrong section. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3c998c71-f30b-40f3-b714-87fafed505d8 --------- Co-authored-by: Jesper Schulz Copilot-Session: 3c998c71-f30b-40f3-b714-87fafed505d8 --- ...ds-skip-type-mismatch-can-drop-data.bad.al | 55 +++++++++++++++++ ...s-skip-type-mismatch-can-drop-data.good.al | 59 +++++++++++++++++++ ...fields-skip-type-mismatch-can-drop-data.md | 26 ++++++++ 3 files changed, 140 insertions(+) create mode 100644 community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.bad.al create mode 100644 community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.good.al create mode 100644 community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.md diff --git a/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.bad.al b/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.bad.al new file mode 100644 index 0000000..691dfd2 --- /dev/null +++ b/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.bad.al @@ -0,0 +1,55 @@ +table 50123 "Transfer Source Bad" +{ + fields + { + field(1; "Entry No."; Integer) + { + DataClassification = CustomerContent; + } + field(2; "Reference"; Code[20]) + { + DataClassification = CustomerContent; + } + } + + keys + { + key(PK; "Entry No.") + { + Clustered = true; + } + } + +} + +table 50124 "Transfer Target Bad" +{ + fields + { + field(1; "Entry No."; Integer) + { + DataClassification = CustomerContent; + } + field(2; "Reference"; Integer) + { + DataClassification = CustomerContent; + } + } + + keys + { + key(PK; "Entry No.") + { + Clustered = true; + } + } + +} + +codeunit 50492 "TransferFields Bad" +{ + procedure CopyData(Source: Record "Transfer Source Bad"; var Target: Record "Transfer Target Bad") + begin + Target.TransferFields(Source, true, true); + end; +} \ No newline at end of file diff --git a/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.good.al b/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.good.al new file mode 100644 index 0000000..a0ac2a8 --- /dev/null +++ b/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.good.al @@ -0,0 +1,59 @@ +table 50121 "Transfer Source" +{ + fields + { + field(1; "Entry No."; Integer) + { + DataClassification = CustomerContent; + } + field(2; "Reference"; Code[20]) + { + DataClassification = CustomerContent; + } + } + + keys + { + key(PK; "Entry No.") + { + Clustered = true; + } + } + +} + +table 50122 "Transfer Target" +{ + fields + { + field(1; "Entry No."; Integer) + { + DataClassification = CustomerContent; + } + field(2; "Reference"; Integer) + { + DataClassification = CustomerContent; + } + } + + keys + { + key(PK; "Entry No.") + { + Clustered = true; + } + } + +} + +codeunit 50491 "TransferFields Good" +{ + procedure CopyData(Source: Record "Transfer Source"; var Target: Record "Transfer Target") + var + ConvertedReference: Integer; + begin + Target."Entry No." := Source."Entry No."; + Evaluate(ConvertedReference, Source."Reference"); + Target.Validate("Reference", ConvertedReference); + end; +} diff --git a/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.md b/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.md new file mode 100644 index 0000000..7d1ea77 --- /dev/null +++ b/community/knowledge/data-modeling/transferfields-skip-type-mismatch-can-drop-data.md @@ -0,0 +1,26 @@ +--- +bc-version: [16..] +domain: data-modeling +keywords: [transferfields, skipfieldsnotmatchingtype, type-mismatch, field-mapping, data-transfer] +technologies: [al] +countries: [w1] +application-area: [all] +--- + +# Do not use SkipFieldsNotMatchingType to hide required TransferFields mismatches + +## Description + +`Record.TransferFields` copies values between fields with matching field numbers. Without `SkipFieldsNotMatchingType` (or with it `false`), a type mismatch between two fields in the same extension raises a runtime error at the point of transfer. Setting `SkipFieldsNotMatchingType` to `true` removes that error: the field is skipped instead, and the rest of the transfer completes normally. The caller gets no indication that a field was not copied. + +## Best Practice + +Use `TransferFields(Source)` only when every field the destination requires, including primary key fields, is guaranteed to share a matching field number and type with the source; this form defaults `InitPrimaryKeyFields` to `true`. Fields with no matching field number, and fields whose types differ across extensions, are skipped regardless of `SkipFieldsNotMatchingType` — that parameter only governs same-extension type mismatches. If the destination depends on a field that falls into either case, map and validate it explicitly in code rather than relying on `TransferFields` to catch the gap. Use `SkipFieldsNotMatchingType = true` only when skipping same-extension type mismatches is an intentional, documented part of the transfer contract. + +See sample: `transferfields-skip-type-mismatch-can-drop-data.good.al`. + +## Anti Pattern + +Using `TransferFields(Source, InitPrimaryKeyFields, true)` as a generic way to make two evolving table schemas transfer without errors, when the destination depends on every required source field being copied. A type change on either table can turn a previously transferred field into a silently skipped one without making the transfer itself fail. + +See sample: `transferfields-skip-type-mismatch-can-drop-data.bad.al`. \ No newline at end of file