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,256 @@
|
|
|
1
|
+
# FieldError Method Syntax - AL Code Sample
|
|
2
|
+
|
|
3
|
+
## Basic FieldError Syntax
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
// Basic FieldError syntax with automatic message
|
|
7
|
+
table 50100 "Sales Document"
|
|
8
|
+
{
|
|
9
|
+
fields
|
|
10
|
+
{
|
|
11
|
+
field(1; "Document Type"; Enum "Sales Document Type") { }
|
|
12
|
+
field(2; "Document No."; Code[20]) { }
|
|
13
|
+
field(3; "Sell-to Customer No."; Code[20]) { }
|
|
14
|
+
field(10; "Currency Code"; Code[10]) { }
|
|
15
|
+
field(20; "Amount"; Decimal) { }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
trigger OnInsert()
|
|
19
|
+
begin
|
|
20
|
+
// Validate required fields before insert
|
|
21
|
+
ValidateRequiredFields();
|
|
22
|
+
end;
|
|
23
|
+
|
|
24
|
+
local procedure ValidateRequiredFields()
|
|
25
|
+
begin
|
|
26
|
+
// FieldError assumes validation already failed - no testing performed
|
|
27
|
+
if "Sell-to Customer No." = '' then
|
|
28
|
+
FieldError("Sell-to Customer No."); // Generates: "Sell-to Customer No. must have a value in Sales Document Document Type='Order', Document No.='SO001'."
|
|
29
|
+
|
|
30
|
+
if Amount <= 0 then
|
|
31
|
+
FieldError(Amount); // Generates: "Amount must not be 0 in Sales Document..."
|
|
32
|
+
end;
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## FieldError vs TestField Comparison
|
|
37
|
+
|
|
38
|
+
```al
|
|
39
|
+
codeunit 50100 "Validation Examples"
|
|
40
|
+
{
|
|
41
|
+
procedure DemonstrateFieldErrorVsTestField()
|
|
42
|
+
var
|
|
43
|
+
SalesHeader: Record "Sales Header";
|
|
44
|
+
Customer: Record Customer;
|
|
45
|
+
begin
|
|
46
|
+
SalesHeader.Get(SalesHeader."Document Type"::Order, 'SO001');
|
|
47
|
+
|
|
48
|
+
// TestField approach - tests condition AND throws error if failed
|
|
49
|
+
SalesHeader.TestField("Sell-to Customer No."); // Tests if empty, then errors
|
|
50
|
+
SalesHeader.TestField(Amount); // Tests if zero, then errors
|
|
51
|
+
|
|
52
|
+
// FieldError approach - assumes you already validated the condition
|
|
53
|
+
if SalesHeader."Sell-to Customer No." = '' then
|
|
54
|
+
SalesHeader.FieldError("Sell-to Customer No."); // Only errors, no testing
|
|
55
|
+
|
|
56
|
+
if SalesHeader.Amount <= 0 then
|
|
57
|
+
SalesHeader.FieldError(Amount, 'must be positive'); // Custom message
|
|
58
|
+
|
|
59
|
+
// Practical usage: FieldError for complex validation logic
|
|
60
|
+
if not Customer.Get(SalesHeader."Sell-to Customer No.") then
|
|
61
|
+
SalesHeader.FieldError("Sell-to Customer No.", 'customer does not exist');
|
|
62
|
+
|
|
63
|
+
if Customer.Blocked <> Customer.Blocked::" " then
|
|
64
|
+
SalesHeader.FieldError("Sell-to Customer No.",
|
|
65
|
+
StrSubstNo('customer is blocked (%1)', Customer.Blocked));
|
|
66
|
+
end;
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Custom Message Examples
|
|
71
|
+
|
|
72
|
+
```al
|
|
73
|
+
table 50101 "Purchase Document"
|
|
74
|
+
{
|
|
75
|
+
fields
|
|
76
|
+
{
|
|
77
|
+
field(1; "Document Type"; Enum "Purchase Document Type") { }
|
|
78
|
+
field(2; "Document No."; Code[20]) { }
|
|
79
|
+
field(3; "Buy-from Vendor No."; Code[20]) { }
|
|
80
|
+
field(10; "Expected Receipt Date"; Date) { }
|
|
81
|
+
field(20; "Amount Including VAT"; Decimal) { }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
procedure ValidateBusinessRules()
|
|
85
|
+
var
|
|
86
|
+
Vendor: Record Vendor;
|
|
87
|
+
begin
|
|
88
|
+
// Custom message examples - note lowercase first word convention
|
|
89
|
+
if "Expected Receipt Date" < WorkDate() then
|
|
90
|
+
FieldError("Expected Receipt Date", 'cannot be in the past');
|
|
91
|
+
|
|
92
|
+
if "Amount Including VAT" > 10000 then
|
|
93
|
+
FieldError("Amount Including VAT", 'exceeds approval limit');
|
|
94
|
+
|
|
95
|
+
// Complex validation with detailed custom message
|
|
96
|
+
if Vendor.Get("Buy-from Vendor No.") then begin
|
|
97
|
+
if Vendor.Blocked <> Vendor.Blocked::" " then
|
|
98
|
+
FieldError("Buy-from Vendor No.",
|
|
99
|
+
StrSubstNo('vendor is blocked for %1', Vendor.Blocked));
|
|
100
|
+
|
|
101
|
+
if (Vendor."Payment Terms Code" = '') and ("Amount Including VAT" > 1000) then
|
|
102
|
+
FieldError("Buy-from Vendor No.",
|
|
103
|
+
'requires payment terms for amounts over 1000');
|
|
104
|
+
end else
|
|
105
|
+
FieldError("Buy-from Vendor No.", 'vendor does not exist');
|
|
106
|
+
end;
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Real-World Posting Codeunit Pattern
|
|
111
|
+
|
|
112
|
+
```al
|
|
113
|
+
codeunit 50102 "Sales Document Validation"
|
|
114
|
+
{
|
|
115
|
+
// Pattern used in standard BC posting codeunits (12, 80, 90)
|
|
116
|
+
|
|
117
|
+
procedure ValidateSalesDocument(var SalesHeader: Record "Sales Header")
|
|
118
|
+
begin
|
|
119
|
+
// Comprehensive validation before posting
|
|
120
|
+
with SalesHeader do begin
|
|
121
|
+
// Required field validation
|
|
122
|
+
if "Sell-to Customer No." = '' then
|
|
123
|
+
FieldError("Sell-to Customer No.");
|
|
124
|
+
|
|
125
|
+
if "Document Date" = 0D then
|
|
126
|
+
FieldError("Document Date");
|
|
127
|
+
|
|
128
|
+
// Business logic validation with custom messages
|
|
129
|
+
if "Posting Date" < "Document Date" then
|
|
130
|
+
FieldError("Posting Date", 'cannot be before document date');
|
|
131
|
+
|
|
132
|
+
if Status <> Status::Released then
|
|
133
|
+
FieldError(Status, 'must be Released before posting');
|
|
134
|
+
|
|
135
|
+
// Complex validation scenarios
|
|
136
|
+
ValidateCustomerCredit(SalesHeader);
|
|
137
|
+
ValidateDimensions(SalesHeader);
|
|
138
|
+
end;
|
|
139
|
+
end;
|
|
140
|
+
|
|
141
|
+
local procedure ValidateCustomerCredit(var SalesHeader: Record "Sales Header")
|
|
142
|
+
var
|
|
143
|
+
Customer: Record Customer;
|
|
144
|
+
CustLedgerEntry: Record "Cust. Ledger Entry";
|
|
145
|
+
RemainingAmount: Decimal;
|
|
146
|
+
begin
|
|
147
|
+
Customer.Get(SalesHeader."Sell-to Customer No.");
|
|
148
|
+
|
|
149
|
+
// Calculate customer's remaining credit
|
|
150
|
+
CustLedgerEntry.SetRange("Customer No.", Customer."No.");
|
|
151
|
+
CustLedgerEntry.SetRange(Open, true);
|
|
152
|
+
CustLedgerEntry.CalcSums("Remaining Amt. (LCY)");
|
|
153
|
+
RemainingAmount := CustLedgerEntry."Remaining Amt. (LCY)";
|
|
154
|
+
|
|
155
|
+
// Validate credit limit
|
|
156
|
+
if (Customer."Credit Limit (LCY)" > 0) and
|
|
157
|
+
(RemainingAmount + SalesHeader."Amount Including VAT" > Customer."Credit Limit (LCY)") then
|
|
158
|
+
SalesHeader.FieldError("Sell-to Customer No.",
|
|
159
|
+
StrSubstNo('credit limit exceeded. Available credit: %1',
|
|
160
|
+
Customer."Credit Limit (LCY)" - RemainingAmount));
|
|
161
|
+
end;
|
|
162
|
+
|
|
163
|
+
local procedure ValidateDimensions(var SalesHeader: Record "Sales Header")
|
|
164
|
+
var
|
|
165
|
+
DimMgt: Codeunit DimensionManagement;
|
|
166
|
+
DimSetID: Integer;
|
|
167
|
+
begin
|
|
168
|
+
DimSetID := SalesHeader."Dimension Set ID";
|
|
169
|
+
|
|
170
|
+
// Validate required dimensions
|
|
171
|
+
if not DimMgt.CheckDimIDComb(DimSetID) then
|
|
172
|
+
SalesHeader.FieldError("Dimension Set ID", 'invalid dimension combination');
|
|
173
|
+
|
|
174
|
+
// Validate dimension values against posting rules
|
|
175
|
+
if not DimMgt.CheckDimValuePosting(DimSetID, DATABASE::"Sales Header", SalesHeader."No.") then
|
|
176
|
+
SalesHeader.FieldError("Dimension Set ID", 'dimension values not allowed for posting');
|
|
177
|
+
end;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Advanced FieldError Patterns
|
|
182
|
+
|
|
183
|
+
```al
|
|
184
|
+
codeunit 50103 "Advanced Validation Patterns"
|
|
185
|
+
{
|
|
186
|
+
// Pattern: Conditional validation with detailed context
|
|
187
|
+
procedure ValidateItemAvailability(var SalesLine: Record "Sales Line")
|
|
188
|
+
var
|
|
189
|
+
Item: Record Item;
|
|
190
|
+
AvailableQty: Decimal;
|
|
191
|
+
begin
|
|
192
|
+
if SalesLine.Type <> SalesLine.Type::Item then
|
|
193
|
+
exit; // Only validate items
|
|
194
|
+
|
|
195
|
+
Item.Get(SalesLine."No.");
|
|
196
|
+
Item.CalcFields(Inventory, "Reserved Qty. on Inventory");
|
|
197
|
+
AvailableQty := Item.Inventory - Item."Reserved Qty. on Inventory";
|
|
198
|
+
|
|
199
|
+
if SalesLine.Quantity > AvailableQty then
|
|
200
|
+
SalesLine.FieldError(Quantity,
|
|
201
|
+
StrSubstNo('exceeds available inventory (%1 available)', AvailableQty));
|
|
202
|
+
end;
|
|
203
|
+
|
|
204
|
+
// Pattern: Multi-field validation with specific field error
|
|
205
|
+
procedure ValidatePriceAndDiscount(var SalesLine: Record "Sales Line")
|
|
206
|
+
begin
|
|
207
|
+
// Validate that discount doesn't exceed unit price
|
|
208
|
+
if (SalesLine."Unit Price" > 0) and
|
|
209
|
+
(SalesLine."Line Discount Amount" > SalesLine."Unit Price" * SalesLine.Quantity) then
|
|
210
|
+
SalesLine.FieldError("Line Discount Amount",
|
|
211
|
+
'cannot exceed line amount');
|
|
212
|
+
|
|
213
|
+
// Validate price against minimum price rules
|
|
214
|
+
if SalesLine."Unit Price" < GetMinimumPrice(SalesLine) then
|
|
215
|
+
SalesLine.FieldError("Unit Price",
|
|
216
|
+
StrSubstNo('cannot be below minimum price (%1)', GetMinimumPrice(SalesLine)));
|
|
217
|
+
end;
|
|
218
|
+
|
|
219
|
+
local procedure GetMinimumPrice(SalesLine: Record "Sales Line"): Decimal
|
|
220
|
+
var
|
|
221
|
+
Item: Record Item;
|
|
222
|
+
begin
|
|
223
|
+
if Item.Get(SalesLine."No.") then
|
|
224
|
+
exit(Item."Unit Cost" * 1.1) // 10% markup minimum
|
|
225
|
+
else
|
|
226
|
+
exit(0);
|
|
227
|
+
end;
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Error Context and Message Output Examples
|
|
232
|
+
|
|
233
|
+
```al
|
|
234
|
+
// When this validation fails:
|
|
235
|
+
procedure ExampleValidationScenarios()
|
|
236
|
+
var
|
|
237
|
+
SalesHeader: Record "Sales Header";
|
|
238
|
+
begin
|
|
239
|
+
SalesHeader."Document Type" := SalesHeader."Document Type"::Order;
|
|
240
|
+
SalesHeader."No." := 'SO001';
|
|
241
|
+
SalesHeader."Sell-to Customer No." := ''; // Empty value
|
|
242
|
+
|
|
243
|
+
// This will generate message:
|
|
244
|
+
// "Sell-to Customer No. must have a value in Sales Header Document Type='Order', No.='SO001'."
|
|
245
|
+
SalesHeader.FieldError("Sell-to Customer No.");
|
|
246
|
+
|
|
247
|
+
// With custom message:
|
|
248
|
+
// "Sell-to Customer No. is required for orders in Sales Header Document Type='Order', No.='SO001'."
|
|
249
|
+
SalesHeader.FieldError("Sell-to Customer No.", 'is required for orders');
|
|
250
|
+
|
|
251
|
+
// For non-empty field with custom message:
|
|
252
|
+
SalesHeader."Sell-to Customer No." := 'INVALID';
|
|
253
|
+
// "Sell-to Customer No. customer does not exist in Sales Header Document Type='Order', No.='SO001'."
|
|
254
|
+
SalesHeader.FieldError("Sell-to Customer No.", 'customer does not exist');
|
|
255
|
+
end;
|
|
256
|
+
```
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Table Safety Validation Patterns
|
|
2
|
+
|
|
3
|
+
## IsTemporary Safeguard Implementation
|
|
4
|
+
```al
|
|
5
|
+
procedure ProcessBulkData(var DataBuffer: Record "Data Processing Buffer")
|
|
6
|
+
begin
|
|
7
|
+
// Always validate temporary status before bulk operations
|
|
8
|
+
if not DataBuffer.IsTemporary then
|
|
9
|
+
Error('This procedure requires a temporary table to prevent data corruption.');
|
|
10
|
+
|
|
11
|
+
DataBuffer.Reset();
|
|
12
|
+
if DataBuffer.FindSet() then
|
|
13
|
+
repeat
|
|
14
|
+
ProcessIndividualRecord(DataBuffer);
|
|
15
|
+
DataBuffer.Delete(); // Safe because table is confirmed temporary
|
|
16
|
+
until DataBuffer.Next() = 0;
|
|
17
|
+
end;
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Database Write Protection
|
|
21
|
+
```al
|
|
22
|
+
procedure SafeDataManipulation(var TempCustomer: Record Customer temporary)
|
|
23
|
+
var
|
|
24
|
+
Customer: Record Customer;
|
|
25
|
+
begin
|
|
26
|
+
// Validate temporary status before any modifications
|
|
27
|
+
if not TempCustomer.IsTemporary then
|
|
28
|
+
Error('Database safety violation: Expected temporary table for data manipulation.');
|
|
29
|
+
|
|
30
|
+
// Safe to perform destructive operations
|
|
31
|
+
TempCustomer.Reset();
|
|
32
|
+
TempCustomer.DeleteAll();
|
|
33
|
+
|
|
34
|
+
// Load fresh data from permanent table
|
|
35
|
+
Customer.FindSet();
|
|
36
|
+
repeat
|
|
37
|
+
TempCustomer := Customer;
|
|
38
|
+
TempCustomer.Insert();
|
|
39
|
+
until Customer.Next() = 0;
|
|
40
|
+
end;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Bulk Operation Validation
|
|
44
|
+
```al
|
|
45
|
+
procedure ProcessLargeDataSet(var TempItem: Record Item temporary; ProcessingMode: Option Validate,Update,Delete)
|
|
46
|
+
begin
|
|
47
|
+
// Critical safety check for bulk operations
|
|
48
|
+
if not TempItem.IsTemporary then
|
|
49
|
+
Error('Bulk processing operations require temporary tables. This prevents accidental permanent data modification.');
|
|
50
|
+
|
|
51
|
+
case ProcessingMode of
|
|
52
|
+
ProcessingMode::Validate:
|
|
53
|
+
ValidateAllRecords(TempItem);
|
|
54
|
+
ProcessingMode::Update:
|
|
55
|
+
UpdateAllRecords(TempItem);
|
|
56
|
+
ProcessingMode::Delete:
|
|
57
|
+
TempItem.DeleteAll(); // Safe deletion
|
|
58
|
+
end;
|
|
59
|
+
end;
|
|
60
|
+
|
|
61
|
+
local procedure ValidateAllRecords(var TempItem: Record Item temporary)
|
|
62
|
+
begin
|
|
63
|
+
TempItem.Reset();
|
|
64
|
+
if TempItem.FindSet() then
|
|
65
|
+
repeat
|
|
66
|
+
ValidateItemData(TempItem);
|
|
67
|
+
until TempItem.Next() = 0;
|
|
68
|
+
end;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Data Integrity Protection
|
|
72
|
+
```al
|
|
73
|
+
procedure SecureDataProcessing(var WorkingTable: Record "Working Data Buffer")
|
|
74
|
+
var
|
|
75
|
+
OriginalFilters: Text;
|
|
76
|
+
begin
|
|
77
|
+
// Mandatory safety validation
|
|
78
|
+
if not WorkingTable.IsTemporary then
|
|
79
|
+
Error('Data integrity protection: This operation requires a temporary working table.');
|
|
80
|
+
|
|
81
|
+
OriginalFilters := WorkingTable.GetFilters();
|
|
82
|
+
|
|
83
|
+
try
|
|
84
|
+
WorkingTable.Reset();
|
|
85
|
+
ProcessAllRecords(WorkingTable);
|
|
86
|
+
finally
|
|
87
|
+
// Restore original state
|
|
88
|
+
WorkingTable.Reset();
|
|
89
|
+
WorkingTable.SetView(OriginalFilters);
|
|
90
|
+
end;
|
|
91
|
+
end;
|
|
92
|
+
|
|
93
|
+
local procedure ProcessAllRecords(var WorkingTable: Record "Working Data Buffer")
|
|
94
|
+
begin
|
|
95
|
+
if WorkingTable.FindSet(true) then
|
|
96
|
+
repeat
|
|
97
|
+
WorkingTable."Processing Status" := WorkingTable."Processing Status"::Completed;
|
|
98
|
+
WorkingTable.Modify();
|
|
99
|
+
until WorkingTable.Next() = 0;
|
|
100
|
+
end;
|
|
101
|
+
```
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# TestField Error Handling Patterns
|
|
2
|
+
|
|
3
|
+
## Try-Catch with TestField
|
|
4
|
+
```al
|
|
5
|
+
procedure ValidateDocumentSafely(var SalesHeader: Record "Sales Header"): Boolean
|
|
6
|
+
begin
|
|
7
|
+
if not TryValidateDocument(SalesHeader) then begin
|
|
8
|
+
LogValidationError(GetLastErrorText());
|
|
9
|
+
exit(false);
|
|
10
|
+
end;
|
|
11
|
+
exit(true);
|
|
12
|
+
end;
|
|
13
|
+
|
|
14
|
+
local procedure TryValidateDocument(var SalesHeader: Record "Sales Header")
|
|
15
|
+
begin
|
|
16
|
+
SalesHeader.TestField("Document Type");
|
|
17
|
+
SalesHeader.TestField("No.");
|
|
18
|
+
SalesHeader.TestField("Sell-to Customer No.");
|
|
19
|
+
end;
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Batch Validation with Error Collection
|
|
23
|
+
```al
|
|
24
|
+
procedure ValidateCustomerBatch(var TempCustomer: Record Customer temporary): Text
|
|
25
|
+
var
|
|
26
|
+
ErrorMessages: Text;
|
|
27
|
+
Customer: Record Customer;
|
|
28
|
+
begin
|
|
29
|
+
TempCustomer.Reset();
|
|
30
|
+
if TempCustomer.FindSet() then
|
|
31
|
+
repeat
|
|
32
|
+
Customer := TempCustomer;
|
|
33
|
+
if not TryValidateCustomer(Customer) then
|
|
34
|
+
ErrorMessages += StrSubstNo('Customer %1: %2\', Customer."No.", GetLastErrorText());
|
|
35
|
+
until TempCustomer.Next() = 0;
|
|
36
|
+
|
|
37
|
+
exit(ErrorMessages);
|
|
38
|
+
end;
|
|
39
|
+
|
|
40
|
+
local procedure TryValidateCustomer(Customer: Record Customer): Boolean
|
|
41
|
+
begin
|
|
42
|
+
Customer.TestField(Name);
|
|
43
|
+
Customer.TestField("Customer Posting Group");
|
|
44
|
+
exit(true);
|
|
45
|
+
end;
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Conditional TestField with Fallback
|
|
49
|
+
```al
|
|
50
|
+
procedure ValidateVendorWithDefaults(var Vendor: Record Vendor)
|
|
51
|
+
var
|
|
52
|
+
VendorPostingGroup: Record "Vendor Posting Group";
|
|
53
|
+
begin
|
|
54
|
+
if not TryTestVendorFields(Vendor) then begin
|
|
55
|
+
// Apply defaults and retry
|
|
56
|
+
if Vendor."Vendor Posting Group" = '' then begin
|
|
57
|
+
VendorPostingGroup.FindFirst();
|
|
58
|
+
Vendor."Vendor Posting Group" := VendorPostingGroup.Code;
|
|
59
|
+
end;
|
|
60
|
+
|
|
61
|
+
// Retry validation
|
|
62
|
+
Vendor.TestField("Vendor Posting Group");
|
|
63
|
+
end;
|
|
64
|
+
end;
|
|
65
|
+
|
|
66
|
+
local procedure TryTestVendorFields(Vendor: Record Vendor): Boolean
|
|
67
|
+
begin
|
|
68
|
+
Vendor.TestField("Vendor Posting Group");
|
|
69
|
+
exit(true);
|
|
70
|
+
end;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Graceful Degradation Pattern
|
|
74
|
+
```al
|
|
75
|
+
procedure ProcessOrderWithValidation(var SalesHeader: Record "Sales Header"): Boolean
|
|
76
|
+
var
|
|
77
|
+
ValidationLevel: Integer;
|
|
78
|
+
begin
|
|
79
|
+
// Try strict validation first
|
|
80
|
+
ValidationLevel := 1;
|
|
81
|
+
if TryValidateOrderStrict(SalesHeader) then
|
|
82
|
+
exit(true);
|
|
83
|
+
|
|
84
|
+
// Fall back to basic validation
|
|
85
|
+
ValidationLevel := 2;
|
|
86
|
+
if TryValidateOrderBasic(SalesHeader) then begin
|
|
87
|
+
LogWarning('Order %1 processed with basic validation only', SalesHeader."No.");
|
|
88
|
+
exit(true);
|
|
89
|
+
end;
|
|
90
|
+
|
|
91
|
+
exit(false);
|
|
92
|
+
end;
|
|
93
|
+
|
|
94
|
+
local procedure TryValidateOrderStrict(SalesHeader: Record "Sales Header"): Boolean
|
|
95
|
+
begin
|
|
96
|
+
SalesHeader.TestField("External Document No.");
|
|
97
|
+
SalesHeader.TestField("Requested Delivery Date");
|
|
98
|
+
SalesHeader.TestField("Shipment Method Code");
|
|
99
|
+
exit(true);
|
|
100
|
+
end;
|
|
101
|
+
|
|
102
|
+
local procedure TryValidateOrderBasic(SalesHeader: Record "Sales Header"): Boolean
|
|
103
|
+
begin
|
|
104
|
+
SalesHeader.TestField("Sell-to Customer No.");
|
|
105
|
+
SalesHeader.TestField("Order Date");
|
|
106
|
+
exit(true);
|
|
107
|
+
end;
|
|
108
|
+
```
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "TestField Error Handling and Custom Messages"
|
|
3
|
+
domain: "eva-errors"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["error-handling", "validation", "user-experience", "custom-messages"]
|
|
7
|
+
prerequisites: ["testfield-basic-syntax", "error-handling-fundamentals"]
|
|
8
|
+
samples: "samples/testfield-error-handling.md"
|
|
9
|
+
---
|
|
10
|
+
# TestField Error Handling and Custom Messages
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
TestField generates automatic error messages, but business scenarios often require custom error handling and messaging. Understanding TestField error behavior enables better user experience and error management strategies.
|
|
15
|
+
|
|
16
|
+
**Key Principle**: TestField errors are runtime exceptions that halt procedure execution unless caught and handled.
|
|
17
|
+
|
|
18
|
+
## Default Error Behavior
|
|
19
|
+
|
|
20
|
+
### Standard Error Messages
|
|
21
|
+
TestField generates system messages like "You must specify Name in Customer" when validation fails. These messages include:
|
|
22
|
+
- Field caption from table definition
|
|
23
|
+
- Table name
|
|
24
|
+
- Current record context when available
|
|
25
|
+
|
|
26
|
+
### Error Flow Impact
|
|
27
|
+
TestField errors immediately terminate current procedure execution. Control returns to calling code or user interface with error state.
|
|
28
|
+
|
|
29
|
+
## Custom Error Handling Patterns
|
|
30
|
+
|
|
31
|
+
### Try-Function Approach
|
|
32
|
+
Wrap TestField calls in TryFunction procedures to catch validation errors without terminating execution. Returns boolean success indicator for error-tolerant processing scenarios.
|
|
33
|
+
|
|
34
|
+
### Custom Validation with Better Messages
|
|
35
|
+
Replace TestField with custom validation logic when business context requires specific error messages. Provides more meaningful feedback to users than system-generated messages.
|
|
36
|
+
|
|
37
|
+
### Conditional TestField Usage
|
|
38
|
+
Apply TestField validation based on business rules or record state. Ensures appropriate validation intensity for different scenarios without over-validating.
|
|
39
|
+
|
|
40
|
+
## Advanced Error Management
|
|
41
|
+
|
|
42
|
+
### Error Context Enhancement
|
|
43
|
+
Capture TestField errors using TryFunction pattern and enhance with business context before re-throwing. Provides users with meaningful error information including document details.
|
|
44
|
+
|
|
45
|
+
### Multiple Field Validation with Aggregated Errors
|
|
46
|
+
Collect multiple validation failures before reporting to users. Improves user experience by showing all validation issues at once rather than one-by-one error correction.
|
|
47
|
+
|
|
48
|
+
## Integration with Business Logic
|
|
49
|
+
|
|
50
|
+
### Workflow Integration
|
|
51
|
+
TestField works seamlessly with workflow validations. Use TestField for mandatory data checks within workflow step validations.
|
|
52
|
+
|
|
53
|
+
### API Integration
|
|
54
|
+
For API endpoints, catch TestField errors and return structured error responses rather than allowing raw BC errors to propagate.
|
|
55
|
+
|
|
56
|
+
### Batch Processing
|
|
57
|
+
In batch processing scenarios, use TryFunction pattern to continue processing other records when individual record validation fails.
|
|
58
|
+
|
|
59
|
+
## User Experience Considerations
|
|
60
|
+
|
|
61
|
+
### Progressive Validation
|
|
62
|
+
Validate fields in logical order so users get meaningful first-error feedback rather than random field validation failures.
|
|
63
|
+
|
|
64
|
+
### Context-Aware Messages
|
|
65
|
+
Include business context in custom error messages to help users understand why specific fields are required.
|
|
66
|
+
|
|
67
|
+
### Field Focus Integration
|
|
68
|
+
Custom validation procedures can integrate with page field focus to direct users to specific fields requiring attention.
|
|
69
|
+
|
|
70
|
+
## Common Patterns
|
|
71
|
+
|
|
72
|
+
### Validation Procedures
|
|
73
|
+
Create dedicated validation procedures that use TestField internally but provide business-context error messages.
|
|
74
|
+
|
|
75
|
+
### Status-Based Validation
|
|
76
|
+
Use TestField with status checks to enforce business rules at specific workflow stages.
|
|
77
|
+
|
|
78
|
+
### Cross-Table Validation
|
|
79
|
+
Combine TestField with related table lookups to validate complex business relationships.
|
|
80
|
+
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "AL Event Subscriber Architecture"
|
|
3
|
+
domain: "jordan-bridge"
|
|
4
|
+
difficulty: "advanced"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["events", "subscribers", "integration", "extensibility"]
|
|
7
|
+
type: "improvement-pattern"
|
|
8
|
+
category: "architecture"
|
|
9
|
+
pattern_type: "good"
|
|
10
|
+
severity: "high"
|
|
11
|
+
impact_level: "high"
|
|
12
|
+
improvement_suggestion: "Design event subscriber architecture for maintainable, performant integration solutions"
|
|
13
|
+
implementation_steps: ["design-subscriber-structure", "implement-loose-coupling", "validate-performance"]
|
|
14
|
+
validation_criteria: ["maintained-loose-coupling", "acceptable-performance-impact"]
|
|
15
|
+
technical_areas: ["al-code", "integration"]
|
|
16
|
+
samples: "samples/al-event-subscriber-architecture.md"
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# AL Event Subscriber Architecture
|
|
20
|
+
|
|
21
|
+
## Overview
|
|
22
|
+
|
|
23
|
+
Event subscriber architecture in AL enables loosely coupled integration patterns that extend base functionality without modifying existing code. Proper subscriber design ensures maintainable, performant, and scalable integration solutions.
|
|
24
|
+
|
|
25
|
+
**Key Principle**: Event subscribers should maintain loose coupling, minimize performance impact, and provide clear integration contracts.
|
|
26
|
+
|
|
27
|
+
## Strategic Framework
|
|
28
|
+
|
|
29
|
+
### Subscriber Design Patterns
|
|
30
|
+
**Single Responsibility**: Each subscriber handles one specific integration concern
|
|
31
|
+
**Loose Coupling**: Subscribers depend only on event contracts, not implementation details
|
|
32
|
+
**Error Isolation**: Subscriber failures don't impact publisher or other subscribers
|
|
33
|
+
**Performance Conscious**: Minimal processing overhead in subscriber implementations
|
|
34
|
+
|
|
35
|
+
### Integration Architecture
|
|
36
|
+
Events enable clean separation between core business logic and integration concerns, supporting modular application design and third-party extensions.
|
|
37
|
+
|
|
38
|
+
### Extensibility Framework
|
|
39
|
+
Subscribers provide extension points for customization without code modification, supporting ISV and customer enhancement scenarios.
|
|
40
|
+
|
|
41
|
+
## Architecture Focus
|
|
42
|
+
|
|
43
|
+
### Decoupling Benefits
|
|
44
|
+
**Module Independence**: Publishers and subscribers can evolve independently
|
|
45
|
+
**Extension Points**: Well-defined integration points for custom functionality
|
|
46
|
+
**Testing Isolation**: Subscribers can be tested independently of publishers
|
|
47
|
+
**Deployment Flexibility**: Subscribers can be deployed separately from base functionality
|
|
48
|
+
|
|
49
|
+
### Performance Considerations
|
|
50
|
+
**Event Overhead**: Each subscriber adds processing overhead to publisher execution
|
|
51
|
+
**Synchronous Execution**: Subscribers execute synchronously unless using background sessions
|
|
52
|
+
**Error Propagation**: Subscriber errors can impact publisher performance and reliability
|
|
53
|
+
**Memory Impact**: Multiple subscribers increase memory usage during event processing
|
|
54
|
+
|
|
55
|
+
### Integration Patterns
|
|
56
|
+
- **Data Transformation**: Transform data between systems during business processes
|
|
57
|
+
- **Audit Logging**: Capture business events for compliance and monitoring
|
|
58
|
+
- **External Integration**: Trigger external system calls based on BC events
|
|
59
|
+
- **Custom Validation**: Add business-specific validation to standard processes
|
|
60
|
+
|
|
61
|
+
## Best Practices
|
|
62
|
+
|
|
63
|
+
### Subscriber Implementation
|
|
64
|
+
- **Minimal Processing**: Keep subscriber logic lightweight and focused
|
|
65
|
+
- **Error Handling**: Implement robust error handling to prevent publisher disruption
|
|
66
|
+
- **Conditional Execution**: Use appropriate conditions to avoid unnecessary processing
|
|
67
|
+
- **Clear Contracts**: Design clear interfaces between publishers and subscribers
|
|
68
|
+
|
|
69
|
+
### Performance Optimization
|
|
70
|
+
- **Efficient Filtering**: Apply early filtering to avoid unnecessary subscriber execution
|
|
71
|
+
- **Background Processing**: Use background sessions for time-intensive operations
|
|
72
|
+
- **Bulk Operations**: Design subscribers to handle bulk scenarios efficiently
|
|
73
|
+
- **Resource Management**: Monitor memory and database usage in subscribers
|
|
74
|
+
|
|
75
|
+
### Architecture Design
|
|
76
|
+
- **Codeunit Organization**: Group related subscribers in dedicated codeunits by functional area
|
|
77
|
+
- **Event Contract Stability**: Design event parameters for long-term stability
|
|
78
|
+
- **Documentation**: Document event contracts and subscriber responsibilities clearly
|
|
79
|
+
- **Version Management**: Plan for event contract evolution without breaking subscribers
|
|
80
|
+
|
|
81
|
+
### Error Handling Strategy
|
|
82
|
+
- **Graceful Degradation**: Handle subscriber failures without impacting core functionality
|
|
83
|
+
- **Logging and Monitoring**: Implement comprehensive logging for troubleshooting
|
|
84
|
+
- **Retry Mechanisms**: Design appropriate retry logic for transient failures
|
|
85
|
+
- **Circuit Breaker**: Implement circuit breaker patterns for failing external integrations
|
|
86
|
+
|
|
87
|
+
## Anti-Patterns
|
|
88
|
+
|
|
89
|
+
### Avoid These Approaches
|
|
90
|
+
- **Tight Coupling Issues**: Subscribers that depend on publisher implementation details
|
|
91
|
+
- **Direct Data Access**: Bypassing event parameters to access publisher data directly
|
|
92
|
+
- **Circular Dependencies**: Publishers depending on subscriber functionality
|
|
93
|
+
- **Version Coupling**: Subscribers tied to specific publisher versions
|
|
94
|
+
|
|
95
|
+
Poor subscriber design can compromise system reliability and create maintenance burdens that outweigh the benefits of event-driven architecture.
|
|
96
|
+
|
|
97
|
+
*Related patterns: al-event-publishers.md, al-integration-patterns.md*
|
|
98
|
+
*Implementation examples: see samples/al-event-subscriber-architecture.md*
|