bc-code-intelligence-mcp 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +107 -0
- package/dist/cache/cache-manager.d.ts +95 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +328 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cli/bc-code-intel-cli.d.ts +9 -0
- package/dist/cli/bc-code-intel-cli.d.ts.map +1 -0
- package/dist/cli/bc-code-intel-cli.js +441 -0
- package/dist/cli/bc-code-intel-cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +21 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +402 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-validator.d.ts +84 -0
- package/dist/config/config-validator.d.ts.map +1 -0
- package/dist/config/config-validator.js +604 -0
- package/dist/config/config-validator.js.map +1 -0
- package/dist/config/test-config-loader.d.ts +10 -0
- package/dist/config/test-config-loader.d.ts.map +1 -0
- package/dist/config/test-config-loader.js +135 -0
- package/dist/config/test-config-loader.js.map +1 -0
- package/dist/config/test-enhanced-layer-service.d.ts +7 -0
- package/dist/config/test-enhanced-layer-service.d.ts.map +1 -0
- package/dist/config/test-enhanced-layer-service.js +104 -0
- package/dist/config/test-enhanced-layer-service.js.map +1 -0
- package/dist/config/test-git-layer.d.ts +7 -0
- package/dist/config/test-git-layer.d.ts.map +1 -0
- package/dist/config/test-git-layer.js +68 -0
- package/dist/config/test-git-layer.js.map +1 -0
- package/dist/dev/hot-reload.d.ts +91 -0
- package/dist/dev/hot-reload.d.ts.map +1 -0
- package/dist/dev/hot-reload.js +358 -0
- package/dist/dev/hot-reload.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +673 -0
- package/dist/index.js.map +1 -0
- package/dist/layers/base-layer.d.ts +83 -0
- package/dist/layers/base-layer.d.ts.map +1 -0
- package/dist/layers/base-layer.js +166 -0
- package/dist/layers/base-layer.js.map +1 -0
- package/dist/layers/embedded-layer.d.ts +53 -0
- package/dist/layers/embedded-layer.d.ts.map +1 -0
- package/dist/layers/embedded-layer.js +238 -0
- package/dist/layers/embedded-layer.js.map +1 -0
- package/dist/layers/git-layer.d.ts +54 -0
- package/dist/layers/git-layer.d.ts.map +1 -0
- package/dist/layers/git-layer.js +369 -0
- package/dist/layers/git-layer.js.map +1 -0
- package/dist/layers/index.d.ts +12 -0
- package/dist/layers/index.d.ts.map +1 -0
- package/dist/layers/index.js +11 -0
- package/dist/layers/index.js.map +1 -0
- package/dist/layers/layer-service.d.ts +129 -0
- package/dist/layers/layer-service.d.ts.map +1 -0
- package/dist/layers/layer-service.js +570 -0
- package/dist/layers/layer-service.js.map +1 -0
- package/dist/layers/project-layer.d.ts +50 -0
- package/dist/layers/project-layer.d.ts.map +1 -0
- package/dist/layers/project-layer.js +256 -0
- package/dist/layers/project-layer.js.map +1 -0
- package/dist/monitoring/production-monitor.d.ts +148 -0
- package/dist/monitoring/production-monitor.d.ts.map +1 -0
- package/dist/monitoring/production-monitor.js +463 -0
- package/dist/monitoring/production-monitor.js.map +1 -0
- package/dist/performance/performance-monitor.d.ts +99 -0
- package/dist/performance/performance-monitor.d.ts.map +1 -0
- package/dist/performance/performance-monitor.js +253 -0
- package/dist/performance/performance-monitor.js.map +1 -0
- package/dist/sdk/bc-code-intel-client.d.ts +175 -0
- package/dist/sdk/bc-code-intel-client.d.ts.map +1 -0
- package/dist/sdk/bc-code-intel-client.js +380 -0
- package/dist/sdk/bc-code-intel-client.js.map +1 -0
- package/dist/search/intelligent-search.d.ts +97 -0
- package/dist/search/intelligent-search.d.ts.map +1 -0
- package/dist/search/intelligent-search.js +355 -0
- package/dist/search/intelligent-search.js.map +1 -0
- package/dist/security/access-control.d.ts +110 -0
- package/dist/security/access-control.d.ts.map +1 -0
- package/dist/security/access-control.js +353 -0
- package/dist/security/access-control.js.map +1 -0
- package/dist/services/code-analysis-service.d.ts +72 -0
- package/dist/services/code-analysis-service.d.ts.map +1 -0
- package/dist/services/code-analysis-service.js +811 -0
- package/dist/services/code-analysis-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +91 -0
- package/dist/services/knowledge-service.d.ts.map +1 -0
- package/dist/services/knowledge-service.js +370 -0
- package/dist/services/knowledge-service.js.map +1 -0
- package/dist/services/methodology-service.d.ts +91 -0
- package/dist/services/methodology-service.d.ts.map +1 -0
- package/dist/services/methodology-service.js +408 -0
- package/dist/services/methodology-service.js.map +1 -0
- package/dist/services/workflow-service.d.ts +132 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +277 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/setup/post-install.d.ts +12 -0
- package/dist/setup/post-install.d.ts.map +1 -0
- package/dist/setup/post-install.js +81 -0
- package/dist/setup/post-install.js.map +1 -0
- package/dist/streamlined-handlers.d.ts +51 -0
- package/dist/streamlined-handlers.d.ts.map +1 -0
- package/dist/streamlined-handlers.js +287 -0
- package/dist/streamlined-handlers.js.map +1 -0
- package/dist/streamlined-tools.d.ts +316 -0
- package/dist/streamlined-tools.d.ts.map +1 -0
- package/dist/streamlined-tools.js +189 -0
- package/dist/streamlined-tools.js.map +1 -0
- package/dist/test-enhanced-mcp-server.d.ts +7 -0
- package/dist/test-enhanced-mcp-server.d.ts.map +1 -0
- package/dist/test-enhanced-mcp-server.js +177 -0
- package/dist/test-enhanced-mcp-server.js.map +1 -0
- package/dist/types/bc-knowledge.d.ts +294 -0
- package/dist/types/bc-knowledge.d.ts.map +1 -0
- package/dist/types/bc-knowledge.js +44 -0
- package/dist/types/bc-knowledge.js.map +1 -0
- package/dist/types/config-types.d.ts +180 -0
- package/dist/types/config-types.d.ts.map +1 -0
- package/dist/types/config-types.js +104 -0
- package/dist/types/config-types.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/layer-types.d.ts +171 -0
- package/dist/types/layer-types.d.ts.map +1 -0
- package/dist/types/layer-types.js +27 -0
- package/dist/types/layer-types.js.map +1 -0
- package/dist/types/persona-types.d.ts +77 -0
- package/dist/types/persona-types.d.ts.map +1 -0
- package/dist/types/persona-types.js +341 -0
- package/dist/types/persona-types.js.map +1 -0
- package/dist/utils/path-utils.d.ts +5 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +14 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/workflows/domain-workflows.d.ts +8 -0
- package/dist/workflows/domain-workflows.d.ts.map +1 -0
- package/dist/workflows/domain-workflows.js +360 -0
- package/dist/workflows/domain-workflows.js.map +1 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
- package/embedded-knowledge/AGENTS.md +69 -0
- package/embedded-knowledge/CONTRIBUTING.md +58 -0
- package/embedded-knowledge/LICENSE +21 -0
- package/embedded-knowledge/README.md +15 -0
- package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
- package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
- package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
- package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
- package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
- package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
- package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
- package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
- package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +295 -0
- package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
- package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
- package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
- package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
- package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
- package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
- package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
- package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
- package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
- package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
- package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
- package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
- package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
- package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
- package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
- package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
- package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
- package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
- package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
- package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
- package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
- package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
- package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
- package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
- package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
- package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
- package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
- package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
- package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
- package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
- package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
- package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
- package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
- package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
- package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
- package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
- package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
- package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
- package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
- package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
- package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
- package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
- package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
- package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
- package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
- package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
- package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
- package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
- package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
- package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
- package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
- package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
- package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
- package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
- package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
- package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
- package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
- package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
- package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
- package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
- package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
- package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
- package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
- package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
- package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
- package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
- package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
- package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
- package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
- package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
- package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
- package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
- package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
- package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
- package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
- package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
- package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
- package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
- package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
- package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
- package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
- package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
- package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
- package/embedded-knowledge/indexes/domain-catalog.json +106 -0
- package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
- package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
- package/embedded-knowledge/indexes/tags/access-control.json +1 -0
- package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
- package/embedded-knowledge/indexes/tags/actions.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced.json +1 -0
- package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
- package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
- package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
- package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
- package/embedded-knowledge/indexes/tags/analytics.json +1 -0
- package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
- package/embedded-knowledge/indexes/tags/api-design.json +1 -0
- package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
- package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
- package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
- package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
- package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
- package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
- package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/api.json +1 -0
- package/embedded-knowledge/indexes/tags/architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
- package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
- package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
- package/embedded-knowledge/indexes/tags/binding.json +1 -0
- package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/branching.json +1 -0
- package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
- package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
- package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
- package/embedded-knowledge/indexes/tags/business-process.json +1 -0
- package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
- package/embedded-knowledge/indexes/tags/caching.json +1 -0
- package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/case.json +1 -0
- package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
- package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
- package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
- package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
- package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
- package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
- package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/code-style.json +1 -0
- package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
- package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
- package/embedded-knowledge/indexes/tags/comments.json +1 -0
- package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
- package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional.json +1 -0
- package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
- package/embedded-knowledge/indexes/tags/consistency.json +1 -0
- package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
- package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
- package/embedded-knowledge/indexes/tags/correlation.json +1 -0
- package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/data-access.json +1 -0
- package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
- package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
- package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
- package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
- package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
- package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
- package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/database.json +1 -0
- package/embedded-knowledge/indexes/tags/debugging.json +1 -0
- package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
- package/embedded-knowledge/indexes/tags/declaration.json +1 -0
- package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
- package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
- package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
- package/embedded-knowledge/indexes/tags/deployment.json +1 -0
- package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
- package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
- package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
- package/embedded-knowledge/indexes/tags/documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
- package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
- package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
- package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
- package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
- package/embedded-knowledge/indexes/tags/error-text.json +1 -0
- package/embedded-knowledge/indexes/tags/etag.json +1 -0
- package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
- package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
- package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
- package/embedded-knowledge/indexes/tags/events.json +1 -0
- package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/extensions.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
- package/embedded-knowledge/indexes/tags/field-control.json +1 -0
- package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
- package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/field-state.json +1 -0
- package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
- package/embedded-knowledge/indexes/tags/fields.json +1 -0
- package/embedded-knowledge/indexes/tags/filtering.json +1 -0
- package/embedded-knowledge/indexes/tags/filters.json +1 -0
- package/embedded-knowledge/indexes/tags/formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/http-status.json +1 -0
- package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/implementation.json +1 -0
- package/embedded-knowledge/indexes/tags/indentation.json +1 -0
- package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
- package/embedded-knowledge/indexes/tags/indexing.json +1 -0
- package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
- package/embedded-knowledge/indexes/tags/integration.json +1 -0
- package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
- package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
- package/embedded-knowledge/indexes/tags/isolation.json +1 -0
- package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/keywords.json +1 -0
- package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
- package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
- package/embedded-knowledge/indexes/tags/localization.json +1 -0
- package/embedded-knowledge/indexes/tags/logging.json +1 -0
- package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
- package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/memory.json +1 -0
- package/embedded-knowledge/indexes/tags/message-design.json +1 -0
- package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
- package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
- package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
- package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
- package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
- package/embedded-knowledge/indexes/tags/naming.json +1 -0
- package/embedded-knowledge/indexes/tags/navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series.json +1 -0
- package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
- package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/odata.json +1 -0
- package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
- package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/operators.json +1 -0
- package/embedded-knowledge/indexes/tags/optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/order.json +1 -0
- package/embedded-knowledge/indexes/tags/organization.json +1 -0
- package/embedded-knowledge/indexes/tags/pages.json +1 -0
- package/embedded-knowledge/indexes/tags/parameters.json +1 -0
- package/embedded-knowledge/indexes/tags/patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/performance.json +1 -0
- package/embedded-knowledge/indexes/tags/placement.json +1 -0
- package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
- package/embedded-knowledge/indexes/tags/posting.json +1 -0
- package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
- package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
- package/embedded-knowledge/indexes/tags/privacy.json +1 -0
- package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
- package/embedded-knowledge/indexes/tags/production.json +1 -0
- package/embedded-knowledge/indexes/tags/productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
- package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
- package/embedded-knowledge/indexes/tags/ranges.json +1 -0
- package/embedded-knowledge/indexes/tags/readability.json +1 -0
- package/embedded-knowledge/indexes/tags/record-access.json +1 -0
- package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
- package/embedded-knowledge/indexes/tags/reference.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime.json +1 -0
- package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
- package/embedded-knowledge/indexes/tags/security.json +1 -0
- package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
- package/embedded-knowledge/indexes/tags/serialization.json +1 -0
- package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
- package/embedded-knowledge/indexes/tags/session.json +1 -0
- package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
- package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
- package/embedded-knowledge/indexes/tags/sift.json +1 -0
- package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
- package/embedded-knowledge/indexes/tags/spacing.json +1 -0
- package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
- package/embedded-knowledge/indexes/tags/standards.json +1 -0
- package/embedded-knowledge/indexes/tags/statements.json +1 -0
- package/embedded-knowledge/indexes/tags/streaming.json +1 -0
- package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
- package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/structure.json +1 -0
- package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
- package/embedded-knowledge/indexes/tags/switch.json +1 -0
- package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
- package/embedded-knowledge/indexes/tags/syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/systemid.json +1 -0
- package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
- package/embedded-knowledge/indexes/tags/table-events.json +1 -0
- package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
- package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
- package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
- package/embedded-knowledge/indexes/tags/template-method.json +1 -0
- package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
- package/embedded-knowledge/indexes/tags/testfield.json +1 -0
- package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
- package/embedded-knowledge/indexes/tags/triggers.json +1 -0
- package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
- package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
- package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
- package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/validation.json +1 -0
- package/embedded-knowledge/indexes/tags/variables.json +1 -0
- package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
- package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
- package/embedded-knowledge/indexes/tags/web-services.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
- package/embedded-knowledge/indexes/tags/workspace.json +1 -0
- package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
- package/embedded-knowledge/indexes/topic-relationships.json +128 -0
- package/embedded-knowledge/methodologies/index.json +81 -0
- package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
- package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
- package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
- package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
- package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
- package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
- package/embedded-knowledge/methodologies/phases/performance.md +211 -0
- package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
- package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
- package/embedded-knowledge/methodologies/phases/verification.md +146 -0
- package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
- package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
- package/package.json +74 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "FieldError Message Construction Patterns"
|
|
3
|
+
domain: "eva-errors"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["fielderror", "error-messages", "user-experience", "localization", "message-formatting", "validation-feedback"]
|
|
7
|
+
prerequisites: ["fielderror-syntax-usage", "text-constants", "label-variables"]
|
|
8
|
+
samples: "samples/fielderror-message-construction.md"
|
|
9
|
+
related_topics: ["localization-patterns", "user-feedback-design", "validation-error-handling"]
|
|
10
|
+
---
|
|
11
|
+
# FieldError Message Construction Patterns
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
FieldError message construction combines automatic field context with custom messaging to provide meaningful validation feedback. Understanding how FieldError builds error messages enables developers to create user-friendly validation experiences that guide users toward successful data entry.
|
|
16
|
+
|
|
17
|
+
The method automatically includes field captions, current values, and record identification, while allowing custom text to provide specific business context and correction guidance.
|
|
18
|
+
|
|
19
|
+
**Key Principle**: Effective FieldError messages combine system-generated field context with business-specific guidance to create actionable user feedback.
|
|
20
|
+
|
|
21
|
+
## Automatic Message Components
|
|
22
|
+
|
|
23
|
+
### Field Context Integration
|
|
24
|
+
FieldError automatically includes the field caption from table metadata, ensuring consistent field identification across different user interface languages. The system retrieves localized field captions when multiple languages are configured.
|
|
25
|
+
|
|
26
|
+
The current field value is included in the error message, providing users with immediate context about the data that triggered the validation failure. This eliminates ambiguity about which specific value caused the problem.
|
|
27
|
+
|
|
28
|
+
### Record Identification
|
|
29
|
+
FieldError includes the table name and primary key values to identify the specific record where the validation failure occurred. This record context helps users navigate back to the problematic data when working with large datasets.
|
|
30
|
+
|
|
31
|
+
## Default Message Patterns
|
|
32
|
+
|
|
33
|
+
### Empty Field Messages
|
|
34
|
+
When a field is empty and FieldError is called without custom text, the system generates messages following the pattern: "You must specify [Field Caption] in [Table Caption] [Primary Key Values]". This pattern clearly indicates missing required data.
|
|
35
|
+
|
|
36
|
+
### Invalid Value Messages
|
|
37
|
+
When a field contains data and FieldError is called without custom text, the system generates messages following the pattern: "[Field Caption] must not be [Field Value] in [Table Caption] [Primary Key Values]". This pattern indicates that the current value is invalid.
|
|
38
|
+
|
|
39
|
+
## Custom Message Integration
|
|
40
|
+
|
|
41
|
+
### Text Parameter Usage
|
|
42
|
+
The optional text parameter allows developers to provide specific validation guidance while maintaining automatic field context. Custom text becomes the primary error description, with field context appended for complete user guidance.
|
|
43
|
+
|
|
44
|
+
### Message Formatting Rules
|
|
45
|
+
Custom FieldError text should not begin with capital letters, as the system automatically capitalizes the complete error message. This formatting rule ensures grammatically correct error messages when combined with automatic field context.
|
|
46
|
+
|
|
47
|
+
### Business Context Addition
|
|
48
|
+
Custom messages should provide business rule context that helps users understand why the validation failed and what action they need to take to correct the data.
|
|
49
|
+
|
|
50
|
+
## Localization Considerations
|
|
51
|
+
|
|
52
|
+
### Label Variable Integration
|
|
53
|
+
Use Label variables for custom FieldError text to support multilingual applications. Label variables automatically provide localized text based on user language preferences, ensuring consistent user experience across language configurations.
|
|
54
|
+
|
|
55
|
+
### Field Caption Localization
|
|
56
|
+
FieldError automatically uses localized field captions from table metadata, ensuring field names appear in the user's preferred language without additional development effort.
|
|
57
|
+
|
|
58
|
+
### Message Consistency
|
|
59
|
+
Maintain consistent message formatting patterns across the application by establishing standard Label variables for common validation scenarios.
|
|
60
|
+
|
|
61
|
+
## Message Construction Strategies
|
|
62
|
+
|
|
63
|
+
### Actionable Guidance
|
|
64
|
+
Construct custom messages that tell users not only what is wrong but also what they should do to fix the problem. Include specific value ranges, acceptable formats, or procedural steps when appropriate.
|
|
65
|
+
|
|
66
|
+
### Business Rule Explanation
|
|
67
|
+
When FieldError is triggered by complex business rules, provide enough context for users to understand the underlying business logic without overwhelming them with technical details.
|
|
68
|
+
|
|
69
|
+
### Progressive Information
|
|
70
|
+
For complex validation scenarios, consider whether a single FieldError message can adequately explain the problem, or if multiple validation steps with different error messages would provide better user guidance.
|
|
71
|
+
|
|
72
|
+
## Integration with Validation Logic
|
|
73
|
+
|
|
74
|
+
### OnValidate Trigger Usage
|
|
75
|
+
FieldError integrates seamlessly with OnValidate triggers, where business rule validation typically occurs. The method provides immediate feedback when field changes violate business constraints.
|
|
76
|
+
|
|
77
|
+
### Posting Routine Integration
|
|
78
|
+
Business Central's posting codeunits extensively use FieldError to provide specific feedback about data validation failures during complex business processes. This pattern ensures users receive targeted guidance about posting failures.
|
|
79
|
+
|
|
80
|
+
### Cross-Field Validation
|
|
81
|
+
When validation involves multiple fields, FieldError can focus user attention on the specific field that needs correction while explaining the relationship to other field values in the custom message text.
|
|
82
|
+
|
|
83
|
+
## User Experience Design
|
|
84
|
+
|
|
85
|
+
### Clear Problem Identification
|
|
86
|
+
Effective FieldError messages clearly identify what specific validation rule was violated, helping users understand the exact nature of the problem.
|
|
87
|
+
|
|
88
|
+
### Solution Guidance
|
|
89
|
+
Include positive instructions about correct data entry rather than just negative statements about what is wrong. Guide users toward successful completion of their data entry task.
|
|
90
|
+
|
|
91
|
+
### Context Preservation
|
|
92
|
+
Leverage FieldError's automatic context inclusion to help users maintain orientation within complex data entry scenarios, especially when working with large forms or multi-step processes.
|
|
93
|
+
|
|
94
|
+
## Common Message Patterns
|
|
95
|
+
|
|
96
|
+
### Range Validation
|
|
97
|
+
For numeric or date range validation, FieldError messages should specify the acceptable range and explain any business rationale for the constraints.
|
|
98
|
+
|
|
99
|
+
### Format Validation
|
|
100
|
+
For data format requirements, FieldError messages should provide examples of acceptable formats and explain any special formatting rules.
|
|
101
|
+
|
|
102
|
+
### Dependency Validation
|
|
103
|
+
For fields that depend on other field values, FieldError messages should explain the relationship and guide users toward consistent data entry.
|
|
104
|
+
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "FieldError Method Syntax and Behavior"
|
|
3
|
+
domain: "eva-errors"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["fielderror", "validation", "error-messages", "posting"]
|
|
7
|
+
samples: "samples/fielderror-syntax.md"
|
|
8
|
+
---
|
|
9
|
+
# FieldError Method Syntax and Behavior
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
The FieldError method generates field-specific error messages with automatic field name inclusion and record context. Unlike TestField, FieldError assumes validation has already failed and focuses on error message generation rather than condition checking.
|
|
14
|
+
|
|
15
|
+
**Core Purpose**: Generate contextual error messages that clearly identify the problematic field and its current state.
|
|
16
|
+
|
|
17
|
+
## Method Signatures
|
|
18
|
+
|
|
19
|
+
### Basic Syntax
|
|
20
|
+
The FieldError method accepts two forms:
|
|
21
|
+
- `Record.FieldError(FieldNo: Integer)` - Uses default message generation
|
|
22
|
+
- `Record.FieldError(FieldNo: Integer, MsgText: Text)` - Uses custom message text
|
|
23
|
+
|
|
24
|
+
### Parameter Details
|
|
25
|
+
- **FieldNo**: Integer identifying the field causing the error
|
|
26
|
+
- **MsgText**: Optional custom error message text (follows lowercase convention)
|
|
27
|
+
|
|
28
|
+
## Behavioral Characteristics
|
|
29
|
+
|
|
30
|
+
### Automatic Context Building
|
|
31
|
+
FieldError automatically constructs error messages including:
|
|
32
|
+
- Field caption from table metadata
|
|
33
|
+
- Current field value (when not blank)
|
|
34
|
+
- Record identification (primary key values)
|
|
35
|
+
- Table name context
|
|
36
|
+
|
|
37
|
+
### Error Message Structure
|
|
38
|
+
Messages follow the pattern: `[Field Caption] [Current Value] [Custom Message] in [Table Name] [Record Key]`
|
|
39
|
+
|
|
40
|
+
Example output: "Document No. SO-001 must be unique in Sales Header Document Type='Order',No.='SO-001'"
|
|
41
|
+
|
|
42
|
+
## Implementation Patterns
|
|
43
|
+
|
|
44
|
+
### Standard Posting Codeunit Usage
|
|
45
|
+
FieldError is extensively used in standard BC posting codeunits (12 Gen. Jnl.-Post Line, 80 Sales-Post, 90 Purch.-Post) for validation failure reporting after conditions have been tested.
|
|
46
|
+
|
|
47
|
+
### Field Validation Context
|
|
48
|
+
Common usage involves testing business conditions first, then calling FieldError when validation fails. This pattern separates condition testing from error reporting.
|
|
49
|
+
|
|
50
|
+
## FieldError vs TestField Comparison
|
|
51
|
+
|
|
52
|
+
### Use FieldError When
|
|
53
|
+
- **Validation already failed**: Error condition has been determined
|
|
54
|
+
- **Custom error context needed**: Standard TestField message insufficient
|
|
55
|
+
- **Complex validation logic**: Multiple conditions or calculations involved
|
|
56
|
+
- **Posting routine errors**: Standard pattern in posting codeunits
|
|
57
|
+
|
|
58
|
+
### Use TestField When
|
|
59
|
+
- **Simple null/empty checks**: Standard "must have a value" scenarios
|
|
60
|
+
- **Direct field validation**: Single condition testing
|
|
61
|
+
- **Setup validation**: Configuration fields that must be populated
|
|
62
|
+
|
|
63
|
+
### Behavioral Differences
|
|
64
|
+
- **TestField**: Tests condition AND generates error
|
|
65
|
+
- **FieldError**: Only generates error (assumes condition already tested)
|
|
66
|
+
- **TestField**: Limited to empty/non-empty and value matching
|
|
67
|
+
- **FieldError**: Accepts any custom error message
|
|
68
|
+
|
|
69
|
+
## Best Practices
|
|
70
|
+
|
|
71
|
+
### Message Design
|
|
72
|
+
- **Be specific**: Describe exactly what's wrong and why
|
|
73
|
+
- **Include context**: Reference related fields or business rules when relevant
|
|
74
|
+
- **Provide guidance**: Suggest how to resolve the issue when possible
|
|
75
|
+
- **Follow conventions**: Start custom messages with lowercase letter
|
|
76
|
+
|
|
77
|
+
### Error Timing
|
|
78
|
+
- **Use after validation**: Don't duplicate condition checking
|
|
79
|
+
- **Fail fast**: Call FieldError immediately when error is detected
|
|
80
|
+
- **Single responsibility**: One FieldError per validation condition
|
|
81
|
+
|
|
82
|
+
### Performance Considerations
|
|
83
|
+
- **Field number constants**: Use field number constants, not field names
|
|
84
|
+
- **Message construction**: Keep custom messages concise but informative
|
|
85
|
+
- **Early exit**: Place FieldError calls after all condition checks
|
|
86
|
+
|
|
87
|
+
## Common Implementation Scenarios
|
|
88
|
+
|
|
89
|
+
### Required Field Validation
|
|
90
|
+
Use FieldError without custom message for standard empty field scenarios where default messaging is sufficient.
|
|
91
|
+
|
|
92
|
+
### Range Validation
|
|
93
|
+
Combine condition testing with FieldError for numeric range violations, providing specific boundary information in custom messages.
|
|
94
|
+
|
|
95
|
+
### Business Rule Violations
|
|
96
|
+
Apply FieldError for complex business logic failures, including cross-field dependencies and calculated validation scenarios.
|
|
97
|
+
|
|
98
|
+
### Cross-Field Dependencies
|
|
99
|
+
Validate relationships between fields using FieldError to identify the specific field causing the constraint violation.
|
|
100
|
+
|
|
101
|
+
## Anti-Patterns
|
|
102
|
+
|
|
103
|
+
### Avoid These Approaches
|
|
104
|
+
- **Redundant condition checking**: Don't test condition if already validated
|
|
105
|
+
- **Generic error messages**: Don't use FieldError for non-field-specific errors
|
|
106
|
+
- **Message duplication**: Don't repeat information already included automatically
|
|
107
|
+
- **Complex message logic**: Keep message construction simple and direct
|
|
108
|
+
|
|
109
|
+
## Usage Guidelines
|
|
110
|
+
|
|
111
|
+
FieldError is most effective when integrated into structured validation routines where business logic testing precedes error reporting. The method's strength lies in automatic context generation combined with flexible custom messaging.
|
|
112
|
+
|
|
113
|
+
For comprehensive implementation examples and working code samples, see the companion AL code file referenced below.
|
|
114
|
+
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
# FieldError Default Messages - AL Code Sample
|
|
2
|
+
|
|
3
|
+
## Empty Field Default Messages
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
table 50200 "Document Header"
|
|
7
|
+
{
|
|
8
|
+
fields
|
|
9
|
+
{
|
|
10
|
+
field(1; "Document Type"; Enum "Sales Document Type") { }
|
|
11
|
+
field(2; "Document No."; Code[20]) { }
|
|
12
|
+
field(3; "Customer No."; Code[20]) { }
|
|
13
|
+
field(10; "Posting Date"; Date) { }
|
|
14
|
+
field(20; "Amount"; Decimal) { }
|
|
15
|
+
field(30; "Currency Code"; Code[10]) { }
|
|
16
|
+
field(40; "Description"; Text[100]) { }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
keys
|
|
20
|
+
{
|
|
21
|
+
key(PK; "Document Type", "Document No.") { Clustered = true; }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
procedure DemonstrateEmptyFieldMessages()
|
|
25
|
+
begin
|
|
26
|
+
// For empty Code field - generates specific "must have a value" message
|
|
27
|
+
"Customer No." := '';
|
|
28
|
+
// Output: "Customer No. must have a value in Document Header Document Type='Order', Document No.='DOC001'."
|
|
29
|
+
FieldError("Customer No.");
|
|
30
|
+
|
|
31
|
+
// For zero Date field - generates specific "must be filled in" message
|
|
32
|
+
"Posting Date" := 0D;
|
|
33
|
+
// Output: "Posting Date must be filled in in Document Header Document Type='Order', Document No.='DOC001'."
|
|
34
|
+
FieldError("Posting Date");
|
|
35
|
+
|
|
36
|
+
// For zero Decimal field - generates "must not be 0" message
|
|
37
|
+
Amount := 0;
|
|
38
|
+
// Output: "Amount must not be 0 in Document Header Document Type='Order', Document No.='DOC001'."
|
|
39
|
+
FieldError(Amount);
|
|
40
|
+
|
|
41
|
+
// For empty Text field - generates "must have a value" message
|
|
42
|
+
Description := '';
|
|
43
|
+
// Output: "Description must have a value in Document Header Document Type='Order', Document No.='DOC001'."
|
|
44
|
+
FieldError(Description);
|
|
45
|
+
end;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Non-Empty Field Default Messages
|
|
50
|
+
|
|
51
|
+
```al
|
|
52
|
+
table 50201 "Validation Examples"
|
|
53
|
+
{
|
|
54
|
+
fields
|
|
55
|
+
{
|
|
56
|
+
field(1; "Entry No."; Integer) { }
|
|
57
|
+
field(10; "Status"; Option) { OptionMembers = " ",Open,Released,Closed; }
|
|
58
|
+
field(20; "Item No."; Code[20]) { }
|
|
59
|
+
field(30; "Quantity"; Decimal) { }
|
|
60
|
+
field(40; "Unit Price"; Decimal) { }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
keys
|
|
64
|
+
{
|
|
65
|
+
key(PK; "Entry No.") { Clustered = true; }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
procedure DemonstrateNonEmptyFieldMessages()
|
|
69
|
+
begin
|
|
70
|
+
"Entry No." := 1001;
|
|
71
|
+
"Item No." := 'ITEM001';
|
|
72
|
+
Quantity := 5.5;
|
|
73
|
+
"Unit Price" := 100.00;
|
|
74
|
+
Status := Status::Released;
|
|
75
|
+
|
|
76
|
+
// For non-empty Code field - generates "is not valid" message
|
|
77
|
+
// Output: "Item No. ITEM001 is not valid in Validation Examples Entry No.='1001'."
|
|
78
|
+
FieldError("Item No.");
|
|
79
|
+
|
|
80
|
+
// For non-zero Decimal field - generates "is not valid" message
|
|
81
|
+
// Output: "Quantity 5.5 is not valid in Validation Examples Entry No.='1001'."
|
|
82
|
+
FieldError(Quantity);
|
|
83
|
+
|
|
84
|
+
// For non-zero Option field - generates "is not valid" message
|
|
85
|
+
// Output: "Status Released is not valid in Validation Examples Entry No.='1001'."
|
|
86
|
+
FieldError(Status);
|
|
87
|
+
end;
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Record Context in Error Messages
|
|
92
|
+
|
|
93
|
+
```al
|
|
94
|
+
table 50202 "Customer Transaction"
|
|
95
|
+
{
|
|
96
|
+
fields
|
|
97
|
+
{
|
|
98
|
+
field(1; "Customer No."; Code[20]) { }
|
|
99
|
+
field(2; "Transaction Date"; Date) { }
|
|
100
|
+
field(3; "Transaction No."; Code[20]) { }
|
|
101
|
+
field(10; "Amount"; Decimal) { }
|
|
102
|
+
field(20; "Currency Code"; Code[10]) { }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
keys
|
|
106
|
+
{
|
|
107
|
+
key(PK; "Customer No.", "Transaction Date", "Transaction No.") { Clustered = true; }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
procedure DemonstrateRecordContextMessages()
|
|
111
|
+
begin
|
|
112
|
+
"Customer No." := 'CUST001';
|
|
113
|
+
"Transaction Date" := Today;
|
|
114
|
+
"Transaction No." := 'TXN001';
|
|
115
|
+
Amount := 0;
|
|
116
|
+
|
|
117
|
+
// BC automatically includes primary key fields in error message
|
|
118
|
+
// Output: "Amount must not be 0 in Customer Transaction Customer No.='CUST001', Transaction Date='01/28/25', Transaction No.='TXN001'."
|
|
119
|
+
FieldError(Amount);
|
|
120
|
+
|
|
121
|
+
// Even with custom message, record context is automatically included
|
|
122
|
+
// Output: "Amount cannot be zero for transactions in Customer Transaction Customer No.='CUST001', Transaction Date='01/28/25', Transaction No.='TXN001'."
|
|
123
|
+
FieldError(Amount, 'cannot be zero for transactions');
|
|
124
|
+
end;
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Default vs Custom Message Comparison
|
|
129
|
+
|
|
130
|
+
```al
|
|
131
|
+
codeunit 50200 "Message Comparison Examples"
|
|
132
|
+
{
|
|
133
|
+
procedure CompareDefaultAndCustomMessages()
|
|
134
|
+
var
|
|
135
|
+
SalesHeader: Record "Sales Header";
|
|
136
|
+
Customer: Record Customer;
|
|
137
|
+
begin
|
|
138
|
+
SalesHeader."Document Type" := SalesHeader."Document Type"::Order;
|
|
139
|
+
SalesHeader."No." := 'SO001';
|
|
140
|
+
SalesHeader."Sell-to Customer No." := '';
|
|
141
|
+
|
|
142
|
+
// DEFAULT MESSAGE EXAMPLES
|
|
143
|
+
|
|
144
|
+
// Empty field default message
|
|
145
|
+
// "Sell-to Customer No. must have a value in Sales Header Document Type='Order', No.='SO001'."
|
|
146
|
+
// SalesHeader.FieldError("Sell-to Customer No.");
|
|
147
|
+
|
|
148
|
+
// Non-empty field default message
|
|
149
|
+
SalesHeader."Sell-to Customer No." := 'INVALID';
|
|
150
|
+
// "Sell-to Customer No. INVALID is not valid in Sales Header Document Type='Order', No.='SO001'."
|
|
151
|
+
// SalesHeader.FieldError("Sell-to Customer No.");
|
|
152
|
+
|
|
153
|
+
// CUSTOM MESSAGE EXAMPLES
|
|
154
|
+
|
|
155
|
+
// Custom message with empty field
|
|
156
|
+
SalesHeader."Sell-to Customer No." := '';
|
|
157
|
+
// "Sell-to Customer No. is required for sales orders in Sales Header Document Type='Order', No.='SO001'."
|
|
158
|
+
// SalesHeader.FieldError("Sell-to Customer No.", 'is required for sales orders');
|
|
159
|
+
|
|
160
|
+
// Custom message with non-empty field
|
|
161
|
+
SalesHeader."Sell-to Customer No." := 'BLOCKED';
|
|
162
|
+
// "Sell-to Customer No. customer is blocked in Sales Header Document Type='Order', No.='SO001'."
|
|
163
|
+
// SalesHeader.FieldError("Sell-to Customer No.", 'customer is blocked');
|
|
164
|
+
|
|
165
|
+
// Complex custom message with context
|
|
166
|
+
if not Customer.Get(SalesHeader."Sell-to Customer No.") then
|
|
167
|
+
// "Sell-to Customer No. does not exist in customer master in Sales Header Document Type='Order', No.='SO001'."
|
|
168
|
+
SalesHeader.FieldError("Sell-to Customer No.", 'does not exist in customer master');
|
|
169
|
+
end;
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Real-World Message Generation Scenarios
|
|
174
|
+
|
|
175
|
+
```al
|
|
176
|
+
codeunit 50201 "Real-World Validation Messages"
|
|
177
|
+
{
|
|
178
|
+
// Scenario 1: Document Processing Validation
|
|
179
|
+
procedure ValidateDocumentForPosting(var SalesHeader: Record "Sales Header")
|
|
180
|
+
begin
|
|
181
|
+
// Required field validations - using default messages for consistency
|
|
182
|
+
if SalesHeader."Sell-to Customer No." = '' then
|
|
183
|
+
// "Sell-to Customer No. must have a value in Sales Header..."
|
|
184
|
+
SalesHeader.FieldError("Sell-to Customer No.");
|
|
185
|
+
|
|
186
|
+
if SalesHeader."Posting Date" = 0D then
|
|
187
|
+
// "Posting Date must be filled in in Sales Header..."
|
|
188
|
+
SalesHeader.FieldError("Posting Date");
|
|
189
|
+
|
|
190
|
+
// Business rule validations - using custom messages for clarity
|
|
191
|
+
if SalesHeader."Posting Date" > WorkDate() + 30 then
|
|
192
|
+
// "Posting Date cannot be more than 30 days in future in Sales Header..."
|
|
193
|
+
SalesHeader.FieldError("Posting Date", 'cannot be more than 30 days in future');
|
|
194
|
+
end;
|
|
195
|
+
|
|
196
|
+
// Scenario 2: Setup Validation with Detailed Messages
|
|
197
|
+
procedure ValidateCustomerSetup(var Customer: Record Customer)
|
|
198
|
+
var
|
|
199
|
+
PostCode: Record "Post Code";
|
|
200
|
+
begin
|
|
201
|
+
// Default message for required field
|
|
202
|
+
if Customer."No." = '' then
|
|
203
|
+
// "No. must have a value in Customer..."
|
|
204
|
+
Customer.FieldError("No.");
|
|
205
|
+
|
|
206
|
+
// Custom message for business logic
|
|
207
|
+
if Customer."Credit Limit (LCY)" < 0 then
|
|
208
|
+
// "Credit Limit (LCY) cannot be negative in Customer No.='CUST001'."
|
|
209
|
+
Customer.FieldError("Credit Limit (LCY)", 'cannot be negative');
|
|
210
|
+
|
|
211
|
+
// Validation with lookup and detailed custom message
|
|
212
|
+
if (Customer."Post Code" <> '') and not PostCode.Get(Customer."Post Code", Customer.City) then
|
|
213
|
+
// "Post Code is not valid for the specified city in Customer No.='CUST001'."
|
|
214
|
+
Customer.FieldError("Post Code", 'is not valid for the specified city');
|
|
215
|
+
end;
|
|
216
|
+
|
|
217
|
+
// Scenario 3: Line Validation with Context
|
|
218
|
+
procedure ValidateSalesLine(var SalesLine: Record "Sales Line")
|
|
219
|
+
var
|
|
220
|
+
Item: Record Item;
|
|
221
|
+
AvailableInventory: Decimal;
|
|
222
|
+
begin
|
|
223
|
+
// Standard required field validation
|
|
224
|
+
if SalesLine."No." = '' then
|
|
225
|
+
// "No. must have a value in Sales Line Document Type='Order', Document No.='SO001', Line No.='10000'."
|
|
226
|
+
SalesLine.FieldError("No.");
|
|
227
|
+
|
|
228
|
+
// Business logic with calculated values in message
|
|
229
|
+
if SalesLine.Type = SalesLine.Type::Item then begin
|
|
230
|
+
Item.Get(SalesLine."No.");
|
|
231
|
+
Item.CalcFields(Inventory);
|
|
232
|
+
AvailableInventory := Item.Inventory;
|
|
233
|
+
|
|
234
|
+
if SalesLine.Quantity > AvailableInventory then
|
|
235
|
+
// "Quantity exceeds available inventory (50 units available) in Sales Line..."
|
|
236
|
+
SalesLine.FieldError(Quantity,
|
|
237
|
+
StrSubstNo('exceeds available inventory (%1 units available)', AvailableInventory));
|
|
238
|
+
end;
|
|
239
|
+
|
|
240
|
+
// Price validation with business context
|
|
241
|
+
if SalesLine."Unit Price" <= 0 then
|
|
242
|
+
// "Unit Price must be positive for sales transactions in Sales Line..."
|
|
243
|
+
SalesLine.FieldError("Unit Price", 'must be positive for sales transactions');
|
|
244
|
+
end;
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Message Formatting Rules and Patterns
|
|
249
|
+
|
|
250
|
+
```al
|
|
251
|
+
codeunit 50202 "Message Formatting Examples"
|
|
252
|
+
{
|
|
253
|
+
procedure DemonstrateFormattingRules()
|
|
254
|
+
var
|
|
255
|
+
Item: Record Item;
|
|
256
|
+
PurchaseLine: Record "Purchase Line";
|
|
257
|
+
begin
|
|
258
|
+
Item."No." := 'ITEM001';
|
|
259
|
+
|
|
260
|
+
// RULE 1: Default messages automatically include field value for non-empty fields
|
|
261
|
+
Item.Description := 'Invalid Description Content';
|
|
262
|
+
// "Description Invalid Description Content is not valid in Item No.='ITEM001'."
|
|
263
|
+
// Item.FieldError(Description);
|
|
264
|
+
|
|
265
|
+
// RULE 2: Custom messages start with lowercase (BC convention)
|
|
266
|
+
// CORRECT:
|
|
267
|
+
// "Description must not contain special characters in Item No.='ITEM001'."
|
|
268
|
+
// Item.FieldError(Description, 'must not contain special characters');
|
|
269
|
+
|
|
270
|
+
// INCORRECT (would still work but doesn't follow BC conventions):
|
|
271
|
+
// Item.FieldError(Description, 'Must not contain special characters');
|
|
272
|
+
|
|
273
|
+
// RULE 3: Record context automatically appended using primary key
|
|
274
|
+
PurchaseLine."Document Type" := PurchaseLine."Document Type"::Order;
|
|
275
|
+
PurchaseLine."Document No." := 'PO001';
|
|
276
|
+
PurchaseLine."Line No." := 10000;
|
|
277
|
+
PurchaseLine.Quantity := -5;
|
|
278
|
+
|
|
279
|
+
// "Quantity cannot be negative in Purchase Line Document Type='Order', Document No.='PO001', Line No.='10000'."
|
|
280
|
+
PurchaseLine.FieldError(Quantity, 'cannot be negative');
|
|
281
|
+
|
|
282
|
+
// RULE 4: Multiple primary key fields included in order
|
|
283
|
+
// All key fields shown in error context for complete record identification
|
|
284
|
+
end;
|
|
285
|
+
|
|
286
|
+
procedure DemonstrateMessageCustomization()
|
|
287
|
+
var
|
|
288
|
+
Customer: Record Customer;
|
|
289
|
+
CreditLimit: Decimal;
|
|
290
|
+
begin
|
|
291
|
+
Customer."No." := 'CUST001';
|
|
292
|
+
Customer."Credit Limit (LCY)" := 5000;
|
|
293
|
+
CreditLimit := 10000; // Required limit for this customer
|
|
294
|
+
|
|
295
|
+
// Pattern: Specific business context in custom messages
|
|
296
|
+
// "Credit Limit (LCY) insufficient for customer risk category (minimum 10000 required) in Customer No.='CUST001'."
|
|
297
|
+
Customer.FieldError("Credit Limit (LCY)",
|
|
298
|
+
StrSubstNo('insufficient for customer risk category (minimum %1 required)', CreditLimit));
|
|
299
|
+
|
|
300
|
+
// Pattern: Action guidance in custom messages
|
|
301
|
+
// "Credit Limit (LCY) requires manager approval for amounts above 50000 in Customer No.='CUST001'."
|
|
302
|
+
Customer.FieldError("Credit Limit (LCY)", 'requires manager approval for amounts above 50000');
|
|
303
|
+
|
|
304
|
+
// Pattern: Reference to related data in custom messages
|
|
305
|
+
// "Credit Limit (LCY) conflicts with existing payment terms (Net 60) in Customer No.='CUST001'."
|
|
306
|
+
Customer.FieldError("Credit Limit (LCY)", 'conflicts with existing payment terms (Net 60)');
|
|
307
|
+
end;
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Advanced Default Message Scenarios
|
|
312
|
+
|
|
313
|
+
```al
|
|
314
|
+
table 50203 "Advanced Message Examples"
|
|
315
|
+
{
|
|
316
|
+
fields
|
|
317
|
+
{
|
|
318
|
+
field(1; "Primary Key"; Code[20]) { }
|
|
319
|
+
field(10; "Boolean Field"; Boolean) { }
|
|
320
|
+
field(20; "DateTime Field"; DateTime) { }
|
|
321
|
+
field(30; "GUID Field"; Guid) { }
|
|
322
|
+
field(40; "Blob Field"; Blob) { }
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
procedure DemonstrateAdvancedDefaultMessages()
|
|
326
|
+
begin
|
|
327
|
+
"Primary Key" := 'TEST001';
|
|
328
|
+
|
|
329
|
+
// Boolean field default messages
|
|
330
|
+
"Boolean Field" := false;
|
|
331
|
+
// "Boolean Field No is not valid in Advanced Message Examples Primary Key='TEST001'."
|
|
332
|
+
// FieldError("Boolean Field");
|
|
333
|
+
|
|
334
|
+
"Boolean Field" := true;
|
|
335
|
+
// "Boolean Field Yes is not valid in Advanced Message Examples Primary Key='TEST001'."
|
|
336
|
+
// FieldError("Boolean Field");
|
|
337
|
+
|
|
338
|
+
// DateTime field default messages
|
|
339
|
+
"DateTime Field" := 0DT;
|
|
340
|
+
// "DateTime Field must be filled in in Advanced Message Examples Primary Key='TEST001'."
|
|
341
|
+
// FieldError("DateTime Field");
|
|
342
|
+
|
|
343
|
+
"DateTime Field" := CurrentDateTime;
|
|
344
|
+
// "DateTime Field 01/28/25 09:30:00 is not valid in Advanced Message Examples Primary Key='TEST001'."
|
|
345
|
+
// FieldError("DateTime Field");
|
|
346
|
+
|
|
347
|
+
// GUID field default messages
|
|
348
|
+
Clear("GUID Field");
|
|
349
|
+
// "GUID Field must have a value in Advanced Message Examples Primary Key='TEST001'."
|
|
350
|
+
// FieldError("GUID Field");
|
|
351
|
+
|
|
352
|
+
"GUID Field" := CreateGuid();
|
|
353
|
+
// "GUID Field {12345678-1234-1234-1234-123456789012} is not valid in Advanced Message Examples Primary Key='TEST001'."
|
|
354
|
+
// FieldError("GUID Field");
|
|
355
|
+
end;
|
|
356
|
+
}
|