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,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Facade Pattern AL Implementation"
|
|
3
|
+
domain: "alex-architect"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["facade-pattern", "structural-patterns", "api-simplification", "complexity-hiding"]
|
|
7
|
+
prerequisites: ["object-orientation-al", "interface-basics", "module-design"]
|
|
8
|
+
samples: "samples/facade-pattern-al.md"
|
|
9
|
+
related_topics: ["complex-facade-patterns", "adapter-pattern-al"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Facade Pattern AL Implementation
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
The Facade Pattern provides a simplified interface to a complex subsystem, hiding the complexity of multiple interacting objects behind a single, easy-to-use interface. In AL development, facades are essential for creating clean APIs and managing complex business logic interactions.
|
|
17
|
+
|
|
18
|
+
**Key Benefit**: Simplifies client code by providing a unified interface to complex subsystems while maintaining loose coupling and flexibility.
|
|
19
|
+
|
|
20
|
+
## Core Facade Architecture
|
|
21
|
+
|
|
22
|
+
### Unified Interface Design
|
|
23
|
+
Create single interfaces that encapsulate complex operations across multiple AL objects, procedures, and business logic components.
|
|
24
|
+
|
|
25
|
+
### Complexity Encapsulation
|
|
26
|
+
Hide implementation details of complex subsystems behind simple, focused facade methods that handle coordination and orchestration.
|
|
27
|
+
|
|
28
|
+
### Dependency Management
|
|
29
|
+
Manage dependencies between multiple subsystem components within the facade, preventing clients from needing to understand complex relationships.
|
|
30
|
+
|
|
31
|
+
## Implementation Strategies
|
|
32
|
+
|
|
33
|
+
### Business Process Facades
|
|
34
|
+
Design facades that encapsulate complete business processes, coordinating multiple tables, pages, and codeunits to provide single-operation interfaces.
|
|
35
|
+
|
|
36
|
+
### Data Access Facades
|
|
37
|
+
Implement facades that simplify complex data access patterns, hiding join operations, filtering logic, and data transformation from client code.
|
|
38
|
+
|
|
39
|
+
### Integration Facades
|
|
40
|
+
Create facades for external system integration that hide protocol details, authentication, and error handling behind simple method calls.
|
|
41
|
+
|
|
42
|
+
## AL-Specific Patterns
|
|
43
|
+
|
|
44
|
+
### Codeunit Facade Implementation
|
|
45
|
+
Use codeunits as facade implementations that coordinate multiple AL objects while providing clean, procedure-based interfaces.
|
|
46
|
+
|
|
47
|
+
### Table Facade Extensions
|
|
48
|
+
Extend table objects with facade methods that encapsulate complex business logic while maintaining data integrity and validation rules.
|
|
49
|
+
|
|
50
|
+
### Page Integration Facades
|
|
51
|
+
Design page-level facades that coordinate multiple page elements and actions to provide simplified user interaction patterns.
|
|
52
|
+
|
|
53
|
+
## Advanced Facade Techniques
|
|
54
|
+
|
|
55
|
+
### Layered Facade Architecture
|
|
56
|
+
Implement multiple facade layers that provide different levels of abstraction for different types of clients and usage scenarios.
|
|
57
|
+
|
|
58
|
+
### Context-Aware Facades
|
|
59
|
+
Design facades that adapt their behavior based on user context, permissions, or system configuration while maintaining consistent interfaces.
|
|
60
|
+
|
|
61
|
+
### Event-Integrated Facades
|
|
62
|
+
Integrate facade operations with AL event systems to provide notifications and enable extensibility without facade modification.
|
|
63
|
+
|
|
64
|
+
## Performance Considerations
|
|
65
|
+
|
|
66
|
+
### Operation Optimization
|
|
67
|
+
Optimize facade operations to minimize unnecessary object instantiation and method calls while maintaining interface simplicity.
|
|
68
|
+
|
|
69
|
+
### Caching Integration
|
|
70
|
+
Implement intelligent caching within facades to improve performance for frequently accessed complex operations.
|
|
71
|
+
|
|
72
|
+
### Resource Management
|
|
73
|
+
Design facades to efficiently manage resources and connections, especially for integration and external system access scenarios.
|
|
74
|
+
|
|
75
|
+
## Error Handling and Validation
|
|
76
|
+
|
|
77
|
+
### Unified Error Management
|
|
78
|
+
- Implement consistent error handling across all facade operations
|
|
79
|
+
- Provide meaningful error messages that abstract subsystem complexity
|
|
80
|
+
- Support error recovery and retry mechanisms within facade logic
|
|
81
|
+
- Maintain error logging and diagnostics for troubleshooting
|
|
82
|
+
|
|
83
|
+
### Input Validation
|
|
84
|
+
- Centralize validation logic within facade methods
|
|
85
|
+
- Provide comprehensive parameter validation before subsystem operations
|
|
86
|
+
- Support business rule validation across multiple subsystem components
|
|
87
|
+
- Enable early error detection to prevent inconsistent states
|
|
88
|
+
|
|
89
|
+
## Best Practices
|
|
90
|
+
|
|
91
|
+
### Design Principles
|
|
92
|
+
- Keep facade interfaces focused and cohesive
|
|
93
|
+
- Implement facades at appropriate abstraction levels for target clients
|
|
94
|
+
- Maintain clear separation between facade logic and subsystem implementation
|
|
95
|
+
- Design for both simplicity and extensibility
|
|
96
|
+
|
|
97
|
+
### Documentation Standards
|
|
98
|
+
- Provide clear documentation for facade capabilities and limitations
|
|
99
|
+
- Include examples of common usage patterns and scenarios
|
|
100
|
+
- Document any performance characteristics or constraints
|
|
101
|
+
- Maintain clear guidance for when to use facade versus direct subsystem access
|
|
102
|
+
|
|
103
|
+
## Integration Patterns
|
|
104
|
+
|
|
105
|
+
### Service Layer Integration
|
|
106
|
+
Integrate facades with service layer patterns to provide business service interfaces that coordinate multiple business capabilities.
|
|
107
|
+
|
|
108
|
+
### API Gateway Patterns
|
|
109
|
+
Use facades as API gateways that provide external access to internal Business Central capabilities with appropriate security and validation.
|
|
110
|
+
|
|
111
|
+
### Microservice Coordination
|
|
112
|
+
Design facades that coordinate microservice interactions while providing unified interfaces for complex business operations.
|
|
113
|
+
|
|
114
|
+
## Testing Strategies
|
|
115
|
+
|
|
116
|
+
### Facade Testing
|
|
117
|
+
- Implement comprehensive testing for facade operations and edge cases
|
|
118
|
+
- Mock subsystem dependencies to enable isolated facade testing
|
|
119
|
+
- Test error handling and recovery scenarios thoroughly
|
|
120
|
+
- Validate facade performance under different load conditions
|
|
121
|
+
|
|
122
|
+
### Integration Testing
|
|
123
|
+
- Test complete end-to-end scenarios through facade interfaces
|
|
124
|
+
- Validate subsystem coordination and data consistency
|
|
125
|
+
- Test facade behavior under various system conditions and configurations
|
|
126
|
+
- Ensure facade operations maintain transactional integrity
|
|
127
|
+
|
|
128
|
+
## Common Pitfalls
|
|
129
|
+
|
|
130
|
+
### Over-Simplification
|
|
131
|
+
Avoid over-simplifying facades to the point where necessary functionality becomes inaccessible to clients requiring more control.
|
|
132
|
+
|
|
133
|
+
### Facade Bloat
|
|
134
|
+
Prevent facades from becoming bloated with too many responsibilities that reduce their effectiveness and maintainability.
|
|
135
|
+
|
|
136
|
+
*Complete facade implementation examples: samples/facade-pattern-al.md*
|
|
137
|
+
*Complex facade patterns: complex-facade-patterns.md*
|
|
138
|
+
*Related structural patterns: adapter-pattern-al.md*
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "AL Facade Pattern for External API Integration"
|
|
3
|
+
domain: "alex-architect"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["facade-pattern", "api-integration", "abstraction", "maintainability"]
|
|
7
|
+
samples: "samples/facade-pattern.md"
|
|
8
|
+
type: improvement-pattern
|
|
9
|
+
category: "architectural-patterns"
|
|
10
|
+
pattern_type: good
|
|
11
|
+
severity: medium
|
|
12
|
+
impact_level: medium
|
|
13
|
+
improvement_suggestion: "Use facade pattern to simplify external API integration"
|
|
14
|
+
implementation_steps: ["create-facade-codeunit", "abstract-api-calls", "centralize-error-handling"]
|
|
15
|
+
validation_criteria: ["single-entry-point", "hidden-complexity", "clean-interfaces"]
|
|
16
|
+
technical_areas: ["al-code", "integration"]
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# AL Facade Pattern for External API Integration
|
|
20
|
+
|
|
21
|
+
## Overview
|
|
22
|
+
|
|
23
|
+
The facade pattern creates a unified, simplified interface to complex external API systems. Instead of exposing raw API complexity throughout your AL codebase, the facade provides a clean business-focused entry point that handles all technical implementation details internally.
|
|
24
|
+
|
|
25
|
+
**Core Principle**: One dedicated codeunit acts as the single gateway to external systems, abstracting authentication, error handling, retry logic, and data transformation.
|
|
26
|
+
|
|
27
|
+
## Strategic Framework
|
|
28
|
+
|
|
29
|
+
### When to Apply Facade Pattern
|
|
30
|
+
- **Multiple API endpoints** required for single business operation
|
|
31
|
+
- **Complex authentication flows** (OAuth, JWT, multi-step auth)
|
|
32
|
+
- **Inconsistent external API responses** requiring normalization
|
|
33
|
+
- **Rate limiting and retry logic** needed across multiple calls
|
|
34
|
+
- **Future API changes** anticipated requiring isolation from business logic
|
|
35
|
+
|
|
36
|
+
### Architecture Benefits
|
|
37
|
+
- **Dependency Isolation**: External system changes don't cascade through codebase
|
|
38
|
+
- **Simplified Testing**: Clear boundaries for mocking external dependencies
|
|
39
|
+
- **Centralized Logic**: Authentication, error handling, and retry patterns in one place
|
|
40
|
+
- **Business Focus**: Consuming objects work with business concepts, not technical APIs
|
|
41
|
+
|
|
42
|
+
## Architecture Focus
|
|
43
|
+
|
|
44
|
+
### Facade Structure
|
|
45
|
+
Create a dedicated codeunit containing:
|
|
46
|
+
- **Public Methods**: Business-focused operations (GetCustomerData, SyncOrderStatus)
|
|
47
|
+
- **Private Methods**: Technical API calls, authentication, error handling
|
|
48
|
+
- **Internal State**: Connection management, token caching, configuration
|
|
49
|
+
|
|
50
|
+
### Interface Design Principles
|
|
51
|
+
- **Business Language**: Method names reflect business operations, not API endpoints
|
|
52
|
+
- **Simplified Parameters**: Hide complex API parameter mapping from consumers
|
|
53
|
+
- **Consistent Returns**: Standardized response patterns regardless of underlying API variations
|
|
54
|
+
- **Error Abstraction**: Convert technical errors to business-meaningful messages
|
|
55
|
+
|
|
56
|
+
## Best Practices
|
|
57
|
+
|
|
58
|
+
### Implementation Guidelines
|
|
59
|
+
- **Single Responsibility**: Each facade handles one external system or related service group
|
|
60
|
+
- **Stateless Design**: Avoid maintaining connection state between method calls
|
|
61
|
+
- **Configuration Driven**: Use setup tables for URLs, credentials, and API versions
|
|
62
|
+
- **Comprehensive Logging**: Log all external interactions for troubleshooting
|
|
63
|
+
|
|
64
|
+
### Error Handling Strategy
|
|
65
|
+
- **Graceful Degradation**: Provide fallback behaviors when external systems unavailable
|
|
66
|
+
- **Retry Logic**: Implement exponential backoff for transient failures
|
|
67
|
+
- **Circuit Breaker**: Prevent cascading failures when external system is down
|
|
68
|
+
- **User-Friendly Messages**: Translate technical errors to actionable business guidance
|
|
69
|
+
|
|
70
|
+
## Anti-Patterns
|
|
71
|
+
|
|
72
|
+
### Avoid These Approaches
|
|
73
|
+
- **Direct API Calls** scattered throughout business logic objects
|
|
74
|
+
- **Shared HTTP Client** instances without proper abstraction layer
|
|
75
|
+
- **Exposed Technical Details** like HTTP status codes in business methods
|
|
76
|
+
- **Mixed Responsibilities** combining business logic with API communication
|
|
77
|
+
|
|
78
|
+
**Implementation Reference**: see samples/facade-pattern.md
|
|
79
|
+
**Related Patterns**: error-handling-patterns.md, api-authentication-patterns.md
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# API Delegate Operation Pattern - AL Code Examples
|
|
2
|
+
|
|
3
|
+
This sample demonstrates implementing delegate operations for extensible APIs in Business Central.
|
|
4
|
+
|
|
5
|
+
## Basic Delegate Interface
|
|
6
|
+
|
|
7
|
+
```al
|
|
8
|
+
// Define delegate operation interface
|
|
9
|
+
interface IDelegateOperation
|
|
10
|
+
{
|
|
11
|
+
procedure Execute(var Parameters: Dictionary of [Text, Variant]): Boolean;
|
|
12
|
+
procedure GetName(): Text[50];
|
|
13
|
+
procedure GetDescription(): Text[250];
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Simple Delegate Implementation
|
|
18
|
+
|
|
19
|
+
```al
|
|
20
|
+
// Customer validation delegate example
|
|
21
|
+
codeunit 50100 "Customer Validation Delegate" implements IDelegateOperation
|
|
22
|
+
{
|
|
23
|
+
procedure Execute(var Parameters: Dictionary of [Text, Variant]): Boolean
|
|
24
|
+
var
|
|
25
|
+
Customer: Record Customer;
|
|
26
|
+
CustomerNo: Code[20];
|
|
27
|
+
ValidationResult: Boolean;
|
|
28
|
+
begin
|
|
29
|
+
// Extract parameters
|
|
30
|
+
if not Parameters.Get('CustomerNo', CustomerNo) then
|
|
31
|
+
exit(false);
|
|
32
|
+
|
|
33
|
+
if not Customer.Get(CustomerNo) then
|
|
34
|
+
exit(false);
|
|
35
|
+
|
|
36
|
+
// Custom validation logic
|
|
37
|
+
ValidationResult := ValidateCustomerForOperation(Customer);
|
|
38
|
+
Parameters.Set('IsValid', ValidationResult);
|
|
39
|
+
|
|
40
|
+
exit(ValidationResult);
|
|
41
|
+
end;
|
|
42
|
+
|
|
43
|
+
procedure GetName(): Text[50]
|
|
44
|
+
begin
|
|
45
|
+
exit('CUSTOMER_VALIDATION');
|
|
46
|
+
end;
|
|
47
|
+
|
|
48
|
+
procedure GetDescription(): Text[250]
|
|
49
|
+
begin
|
|
50
|
+
exit('Validates customer eligibility for business operations');
|
|
51
|
+
end;
|
|
52
|
+
|
|
53
|
+
local procedure ValidateCustomerForOperation(Customer: Record Customer): Boolean
|
|
54
|
+
begin
|
|
55
|
+
// Business logic for customer validation
|
|
56
|
+
exit((Customer.Blocked = Customer.Blocked::" ") and (Customer."Credit Limit (LCY)" > 0));
|
|
57
|
+
end;
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Delegate Registry System
|
|
62
|
+
|
|
63
|
+
```al
|
|
64
|
+
// Central delegate registry for operation management
|
|
65
|
+
codeunit 50101 "Delegate Registry"
|
|
66
|
+
{
|
|
67
|
+
var
|
|
68
|
+
DelegateOperations: Dictionary of [Text, Interface IDelegateOperation];
|
|
69
|
+
|
|
70
|
+
procedure RegisterDelegate(OperationType: Text[50]; DelegateOperation: Interface IDelegateOperation)
|
|
71
|
+
begin
|
|
72
|
+
DelegateOperations.Set(OperationType, DelegateOperation);
|
|
73
|
+
end;
|
|
74
|
+
|
|
75
|
+
procedure ExecuteDelegate(OperationType: Text[50]; var Parameters: Dictionary of [Text, Variant]): Boolean
|
|
76
|
+
var
|
|
77
|
+
DelegateOperation: Interface IDelegateOperation;
|
|
78
|
+
begin
|
|
79
|
+
if not DelegateOperations.Get(OperationType, DelegateOperation) then
|
|
80
|
+
exit(false);
|
|
81
|
+
|
|
82
|
+
exit(DelegateOperation.Execute(Parameters));
|
|
83
|
+
end;
|
|
84
|
+
|
|
85
|
+
procedure GetAvailableDelegates(): List of [Text]
|
|
86
|
+
var
|
|
87
|
+
AvailableTypes: List of [Text];
|
|
88
|
+
OperationType: Text;
|
|
89
|
+
begin
|
|
90
|
+
foreach OperationType in DelegateOperations.Keys do
|
|
91
|
+
AvailableTypes.Add(OperationType);
|
|
92
|
+
|
|
93
|
+
exit(AvailableTypes);
|
|
94
|
+
end;
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## API with Delegate Operations
|
|
99
|
+
|
|
100
|
+
```al
|
|
101
|
+
// Sales API that uses delegate operations for extensibility
|
|
102
|
+
page 50100 "Sales API"
|
|
103
|
+
{
|
|
104
|
+
PageType = API;
|
|
105
|
+
APIPublisher = 'mycompany';
|
|
106
|
+
APIGroup = 'sales';
|
|
107
|
+
APIVersion = 'v1.0';
|
|
108
|
+
EntityName = 'salesOrder';
|
|
109
|
+
EntitySetName = 'salesOrders';
|
|
110
|
+
SourceTable = "Sales Header";
|
|
111
|
+
|
|
112
|
+
layout
|
|
113
|
+
{
|
|
114
|
+
area(Content)
|
|
115
|
+
{
|
|
116
|
+
repeater(Group)
|
|
117
|
+
{
|
|
118
|
+
field(documentNo; Rec."No.")
|
|
119
|
+
{
|
|
120
|
+
ApplicationArea = All;
|
|
121
|
+
}
|
|
122
|
+
field(customerNo; Rec."Sell-to Customer No.")
|
|
123
|
+
{
|
|
124
|
+
ApplicationArea = All;
|
|
125
|
+
}
|
|
126
|
+
field(status; Rec.Status)
|
|
127
|
+
{
|
|
128
|
+
ApplicationArea = All;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
trigger OnInsertRecord(BelowxRec: Boolean): Boolean
|
|
135
|
+
var
|
|
136
|
+
DelegateRegistry: Codeunit "Delegate Registry";
|
|
137
|
+
Parameters: Dictionary of [Text, Variant];
|
|
138
|
+
ValidationResult: Boolean;
|
|
139
|
+
begin
|
|
140
|
+
// Use delegate for customer validation
|
|
141
|
+
Parameters.Set('CustomerNo', Rec."Sell-to Customer No.");
|
|
142
|
+
ValidationResult := DelegateRegistry.ExecuteDelegate('CUSTOMER_VALIDATION', Parameters);
|
|
143
|
+
|
|
144
|
+
if not ValidationResult then
|
|
145
|
+
Error('Customer validation failed through delegate operation');
|
|
146
|
+
|
|
147
|
+
exit(true);
|
|
148
|
+
end;
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Advanced Delegate Chain
|
|
153
|
+
|
|
154
|
+
```al
|
|
155
|
+
// Chain multiple delegates for complex operations
|
|
156
|
+
codeunit 50102 "Multi-Step Delegate Chain"
|
|
157
|
+
{
|
|
158
|
+
var
|
|
159
|
+
DelegateRegistry: Codeunit "Delegate Registry";
|
|
160
|
+
|
|
161
|
+
procedure ExecuteChain(ChainName: Text[50]; var Parameters: Dictionary of [Text, Variant]): Boolean
|
|
162
|
+
var
|
|
163
|
+
ChainSteps: List of [Text];
|
|
164
|
+
StepName: Text;
|
|
165
|
+
StepResult: Boolean;
|
|
166
|
+
begin
|
|
167
|
+
ChainSteps := GetChainSteps(ChainName);
|
|
168
|
+
|
|
169
|
+
foreach StepName in ChainSteps do begin
|
|
170
|
+
StepResult := DelegateRegistry.ExecuteDelegate(StepName, Parameters);
|
|
171
|
+
if not StepResult then begin
|
|
172
|
+
Parameters.Set('FailedStep', StepName);
|
|
173
|
+
exit(false);
|
|
174
|
+
end;
|
|
175
|
+
end;
|
|
176
|
+
|
|
177
|
+
exit(true);
|
|
178
|
+
end;
|
|
179
|
+
|
|
180
|
+
local procedure GetChainSteps(ChainName: Text[50]): List of [Text]
|
|
181
|
+
var
|
|
182
|
+
Steps: List of [Text];
|
|
183
|
+
begin
|
|
184
|
+
case ChainName of
|
|
185
|
+
'SALES_VALIDATION':
|
|
186
|
+
begin
|
|
187
|
+
Steps.Add('CUSTOMER_VALIDATION');
|
|
188
|
+
Steps.Add('INVENTORY_CHECK');
|
|
189
|
+
Steps.Add('CREDIT_APPROVAL');
|
|
190
|
+
end;
|
|
191
|
+
'PURCHASE_VALIDATION':
|
|
192
|
+
begin
|
|
193
|
+
Steps.Add('VENDOR_VALIDATION');
|
|
194
|
+
Steps.Add('BUDGET_CHECK');
|
|
195
|
+
Steps.Add('APPROVAL_WORKFLOW');
|
|
196
|
+
end;
|
|
197
|
+
end;
|
|
198
|
+
|
|
199
|
+
exit(Steps);
|
|
200
|
+
end;
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Error Handling Delegate
|
|
205
|
+
|
|
206
|
+
```al
|
|
207
|
+
// Delegate with comprehensive error handling
|
|
208
|
+
codeunit 50103 "Error Handling Delegate" implements IDelegateOperation
|
|
209
|
+
{
|
|
210
|
+
procedure Execute(var Parameters: Dictionary of [Text, Variant]): Boolean
|
|
211
|
+
var
|
|
212
|
+
ErrorMessages: List of [Text];
|
|
213
|
+
HasErrors: Boolean;
|
|
214
|
+
begin
|
|
215
|
+
HasErrors := false;
|
|
216
|
+
Clear(ErrorMessages);
|
|
217
|
+
|
|
218
|
+
// Perform validation with error collection
|
|
219
|
+
if not ValidateRequiredParameters(Parameters, ErrorMessages) then
|
|
220
|
+
HasErrors := true;
|
|
221
|
+
|
|
222
|
+
if not ValidateBusinessRules(Parameters, ErrorMessages) then
|
|
223
|
+
HasErrors := true;
|
|
224
|
+
|
|
225
|
+
// Set error information in parameters
|
|
226
|
+
Parameters.Set('HasErrors', HasErrors);
|
|
227
|
+
Parameters.Set('ErrorMessages', ErrorMessages);
|
|
228
|
+
|
|
229
|
+
exit(not HasErrors);
|
|
230
|
+
end;
|
|
231
|
+
|
|
232
|
+
procedure GetName(): Text[50]
|
|
233
|
+
begin
|
|
234
|
+
exit('ERROR_HANDLING');
|
|
235
|
+
end;
|
|
236
|
+
|
|
237
|
+
procedure GetDescription(): Text[250]
|
|
238
|
+
begin
|
|
239
|
+
exit('Comprehensive error handling and validation delegate');
|
|
240
|
+
end;
|
|
241
|
+
|
|
242
|
+
local procedure ValidateRequiredParameters(Parameters: Dictionary of [Text, Variant]; var ErrorMessages: List of [Text]): Boolean
|
|
243
|
+
var
|
|
244
|
+
IsValid: Boolean;
|
|
245
|
+
begin
|
|
246
|
+
IsValid := true;
|
|
247
|
+
|
|
248
|
+
if not Parameters.ContainsKey('CustomerNo') then begin
|
|
249
|
+
ErrorMessages.Add('Missing required parameter: CustomerNo');
|
|
250
|
+
IsValid := false;
|
|
251
|
+
end;
|
|
252
|
+
|
|
253
|
+
if not Parameters.ContainsKey('Amount') then begin
|
|
254
|
+
ErrorMessages.Add('Missing required parameter: Amount');
|
|
255
|
+
IsValid := false;
|
|
256
|
+
end;
|
|
257
|
+
|
|
258
|
+
exit(IsValid);
|
|
259
|
+
end;
|
|
260
|
+
|
|
261
|
+
local procedure ValidateBusinessRules(Parameters: Dictionary of [Text, Variant]; var ErrorMessages: List of [Text]): Boolean
|
|
262
|
+
var
|
|
263
|
+
Amount: Decimal;
|
|
264
|
+
IsValid: Boolean;
|
|
265
|
+
begin
|
|
266
|
+
IsValid := true;
|
|
267
|
+
|
|
268
|
+
if Parameters.Get('Amount', Amount) then begin
|
|
269
|
+
if Amount <= 0 then begin
|
|
270
|
+
ErrorMessages.Add('Amount must be greater than zero');
|
|
271
|
+
IsValid := false;
|
|
272
|
+
end;
|
|
273
|
+
end;
|
|
274
|
+
|
|
275
|
+
exit(IsValid);
|
|
276
|
+
end;
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
This implementation shows how delegate operations enable flexible, extensible APIs in Business Central while maintaining clean separation of concerns and supporting runtime configuration of business logic.
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# API Fieldset Registration Sample
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
This sample demonstrates how to implement fieldset registration patterns for dynamic API field management and metadata-driven field selection.
|
|
5
|
+
|
|
6
|
+
## Basic Fieldset Registration
|
|
7
|
+
|
|
8
|
+
```al
|
|
9
|
+
codeunit 50100 "API Fieldset Registration"
|
|
10
|
+
{
|
|
11
|
+
procedure RegisterCustomerFieldset()
|
|
12
|
+
var
|
|
13
|
+
FieldsetRegistry: Codeunit "Fieldset Registry";
|
|
14
|
+
CustomerFieldset: Record "API Fieldset";
|
|
15
|
+
begin
|
|
16
|
+
// Register basic customer fieldset
|
|
17
|
+
CustomerFieldset.Init();
|
|
18
|
+
CustomerFieldset."Table ID" := Database::Customer;
|
|
19
|
+
CustomerFieldset."Fieldset Name" := 'BASIC';
|
|
20
|
+
CustomerFieldset."Field No." := Customer.FieldNo("No.");
|
|
21
|
+
CustomerFieldset.Insert();
|
|
22
|
+
|
|
23
|
+
CustomerFieldset."Field No." := Customer.FieldNo(Name);
|
|
24
|
+
CustomerFieldset.Insert();
|
|
25
|
+
|
|
26
|
+
CustomerFieldset."Field No." := Customer.FieldNo("Phone No.");
|
|
27
|
+
CustomerFieldset.Insert();
|
|
28
|
+
|
|
29
|
+
// Register extended customer fieldset
|
|
30
|
+
CustomerFieldset."Fieldset Name" := 'EXTENDED';
|
|
31
|
+
CustomerFieldset."Field No." := Customer.FieldNo("Credit Limit (LCY)");
|
|
32
|
+
CustomerFieldset.Insert();
|
|
33
|
+
|
|
34
|
+
CustomerFieldset."Field No." := Customer.FieldNo("Balance (LCY)");
|
|
35
|
+
CustomerFieldset.Insert();
|
|
36
|
+
end;
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Dynamic Field Selection
|
|
41
|
+
|
|
42
|
+
```al
|
|
43
|
+
codeunit 50101 "Dynamic Field Selection"
|
|
44
|
+
{
|
|
45
|
+
procedure GetCustomerFields(FieldsetName: Text): List of [Integer]
|
|
46
|
+
var
|
|
47
|
+
APIFieldset: Record "API Fieldset";
|
|
48
|
+
FieldList: List of [Integer];
|
|
49
|
+
begin
|
|
50
|
+
APIFieldset.SetRange("Table ID", Database::Customer);
|
|
51
|
+
APIFieldset.SetRange("Fieldset Name", FieldsetName);
|
|
52
|
+
if APIFieldset.FindSet() then
|
|
53
|
+
repeat
|
|
54
|
+
FieldList.Add(APIFieldset."Field No.");
|
|
55
|
+
until APIFieldset.Next() = 0;
|
|
56
|
+
|
|
57
|
+
exit(FieldList);
|
|
58
|
+
end;
|
|
59
|
+
|
|
60
|
+
procedure ApplyFieldset(var CustomerRec: Record Customer; FieldsetName: Text)
|
|
61
|
+
var
|
|
62
|
+
FieldList: List of [Integer];
|
|
63
|
+
FieldNo: Integer;
|
|
64
|
+
begin
|
|
65
|
+
FieldList := GetCustomerFields(FieldsetName);
|
|
66
|
+
CustomerRec.SetLoadFields();
|
|
67
|
+
|
|
68
|
+
foreach FieldNo in FieldList do
|
|
69
|
+
CustomerRec.AddLoadFields(FieldNo);
|
|
70
|
+
end;
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Conditional Registration
|
|
75
|
+
|
|
76
|
+
```al
|
|
77
|
+
codeunit 50102 "Conditional Fieldset Reg"
|
|
78
|
+
{
|
|
79
|
+
procedure RegisterConditionalFieldset(TableID: Integer; Condition: Text)
|
|
80
|
+
var
|
|
81
|
+
ConditionalFieldset: Record "Conditional API Fieldset";
|
|
82
|
+
begin
|
|
83
|
+
ConditionalFieldset.Init();
|
|
84
|
+
ConditionalFieldset."Table ID" := TableID;
|
|
85
|
+
ConditionalFieldset.Condition := Condition;
|
|
86
|
+
ConditionalFieldset."Field Selection" := GetFieldsForCondition(TableID, Condition);
|
|
87
|
+
ConditionalFieldset.Insert();
|
|
88
|
+
end;
|
|
89
|
+
|
|
90
|
+
local procedure GetFieldsForCondition(TableID: Integer; Condition: Text): Text
|
|
91
|
+
var
|
|
92
|
+
FieldSelection: Text;
|
|
93
|
+
begin
|
|
94
|
+
case Condition of
|
|
95
|
+
'MINIMAL':
|
|
96
|
+
FieldSelection := 'No.,Name';
|
|
97
|
+
'STANDARD':
|
|
98
|
+
FieldSelection := 'No.,Name,Phone No.,E-Mail';
|
|
99
|
+
'COMPLETE':
|
|
100
|
+
FieldSelection := '*';
|
|
101
|
+
end;
|
|
102
|
+
|
|
103
|
+
exit(FieldSelection);
|
|
104
|
+
end;
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## API Integration
|
|
109
|
+
|
|
110
|
+
```al
|
|
111
|
+
page 50100 "Customer API with Fieldsets"
|
|
112
|
+
{
|
|
113
|
+
APIPublisher = 'contoso';
|
|
114
|
+
APIGroup = 'sample';
|
|
115
|
+
APIVersion = 'v1.0';
|
|
116
|
+
EntityName = 'customer';
|
|
117
|
+
EntitySetName = 'customers';
|
|
118
|
+
SourceTable = Customer;
|
|
119
|
+
|
|
120
|
+
trigger OnOpenPage()
|
|
121
|
+
var
|
|
122
|
+
FieldsetManager: Codeunit "Dynamic Field Selection";
|
|
123
|
+
RequestedFieldset: Text;
|
|
124
|
+
begin
|
|
125
|
+
// Get fieldset from query parameter
|
|
126
|
+
RequestedFieldset := GetFieldsetFromRequest();
|
|
127
|
+
if RequestedFieldset <> '' then
|
|
128
|
+
FieldsetManager.ApplyFieldset(Rec, RequestedFieldset);
|
|
129
|
+
end;
|
|
130
|
+
|
|
131
|
+
local procedure GetFieldsetFromRequest(): Text
|
|
132
|
+
var
|
|
133
|
+
RequestHeaders: HttpHeaders;
|
|
134
|
+
FieldsetHeader: Text;
|
|
135
|
+
begin
|
|
136
|
+
// Extract fieldset preference from request
|
|
137
|
+
if RequestHeaders.Contains('X-Fieldset') then begin
|
|
138
|
+
RequestHeaders.GetValues('X-Fieldset', FieldsetHeader);
|
|
139
|
+
exit(FieldsetHeader);
|
|
140
|
+
end;
|
|
141
|
+
|
|
142
|
+
exit('STANDARD');
|
|
143
|
+
end;
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Metadata-Driven Configuration
|
|
148
|
+
|
|
149
|
+
```al
|
|
150
|
+
table 50100 "API Fieldset"
|
|
151
|
+
{
|
|
152
|
+
fields
|
|
153
|
+
{
|
|
154
|
+
field(1; "Table ID"; Integer) { }
|
|
155
|
+
field(2; "Fieldset Name"; Code[20]) { }
|
|
156
|
+
field(3; "Field No."; Integer) { }
|
|
157
|
+
field(4; "Field Name"; Text[100]) { }
|
|
158
|
+
field(5; Required; Boolean) { }
|
|
159
|
+
field(6; "Display Order"; Integer) { }
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
keys
|
|
163
|
+
{
|
|
164
|
+
key(PK; "Table ID", "Fieldset Name", "Field No.") { Clustered = true; }
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Performance Considerations
|
|
170
|
+
|
|
171
|
+
```al
|
|
172
|
+
codeunit 50103 "Fieldset Performance Mgmt"
|
|
173
|
+
{
|
|
174
|
+
var
|
|
175
|
+
FieldsetCache: Dictionary of [Text, List of [Integer]];
|
|
176
|
+
|
|
177
|
+
procedure GetCachedFieldset(TableID: Integer; FieldsetName: Text): List of [Integer]
|
|
178
|
+
var
|
|
179
|
+
CacheKey: Text;
|
|
180
|
+
FieldList: List of [Integer];
|
|
181
|
+
begin
|
|
182
|
+
CacheKey := StrSubstNo('%1_%2', TableID, FieldsetName);
|
|
183
|
+
|
|
184
|
+
if FieldsetCache.ContainsKey(CacheKey) then
|
|
185
|
+
exit(FieldsetCache.Get(CacheKey));
|
|
186
|
+
|
|
187
|
+
FieldList := LoadFieldsetFromDatabase(TableID, FieldsetName);
|
|
188
|
+
FieldsetCache.Set(CacheKey, FieldList);
|
|
189
|
+
|
|
190
|
+
exit(FieldList);
|
|
191
|
+
end;
|
|
192
|
+
|
|
193
|
+
procedure ClearCache()
|
|
194
|
+
begin
|
|
195
|
+
Clear(FieldsetCache);
|
|
196
|
+
end;
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
This sample demonstrates comprehensive fieldset registration patterns including basic registration, dynamic selection, conditional logic, API integration, and performance optimization through caching.
|