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,412 @@
|
|
|
1
|
+
# SetLoadFields Performance Optimization - AL Code Examples
|
|
2
|
+
|
|
3
|
+
## Basic SetLoadFields Implementation
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
// Optimized: Load only required fields
|
|
7
|
+
procedure GetCustomerNameOptimized(CustomerNo: Code[20]): Text[100]
|
|
8
|
+
var
|
|
9
|
+
Customer: Record Customer;
|
|
10
|
+
begin
|
|
11
|
+
Customer.SetLoadFields(Name);
|
|
12
|
+
if Customer.Get(CustomerNo) then
|
|
13
|
+
exit(Customer.Name);
|
|
14
|
+
exit('');
|
|
15
|
+
end;
|
|
16
|
+
|
|
17
|
+
// Non-optimized: Loads all fields
|
|
18
|
+
procedure GetCustomerNameUnoptimized(CustomerNo: Code[20]): Text[100]
|
|
19
|
+
var
|
|
20
|
+
Customer: Record Customer;
|
|
21
|
+
begin
|
|
22
|
+
if Customer.Get(CustomerNo) then
|
|
23
|
+
exit(Customer.Name);
|
|
24
|
+
exit('');
|
|
25
|
+
end;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Bulk Operations Optimization
|
|
29
|
+
|
|
30
|
+
```al
|
|
31
|
+
procedure ProcessCustomerListOptimized()
|
|
32
|
+
var
|
|
33
|
+
Customer: Record Customer;
|
|
34
|
+
ProcessedCount: Integer;
|
|
35
|
+
begin
|
|
36
|
+
Customer.SetLoadFields("No.", Name, "Customer Posting Group", Blocked);
|
|
37
|
+
|
|
38
|
+
if Customer.FindSet() then
|
|
39
|
+
repeat
|
|
40
|
+
if not Customer.Blocked then begin
|
|
41
|
+
ProcessCustomerRecord(Customer."No.", Customer.Name, Customer."Customer Posting Group");
|
|
42
|
+
ProcessedCount += 1;
|
|
43
|
+
end;
|
|
44
|
+
until Customer.Next() = 0;
|
|
45
|
+
|
|
46
|
+
Message('Processed %1 customers with optimized field loading', ProcessedCount);
|
|
47
|
+
end;
|
|
48
|
+
|
|
49
|
+
procedure ProcessCustomerListUnoptimized()
|
|
50
|
+
var
|
|
51
|
+
Customer: Record Customer;
|
|
52
|
+
ProcessedCount: Integer;
|
|
53
|
+
begin
|
|
54
|
+
if Customer.FindSet() then
|
|
55
|
+
repeat
|
|
56
|
+
if not Customer.Blocked then begin
|
|
57
|
+
ProcessCustomerRecord(Customer."No.", Customer.Name, Customer."Customer Posting Group");
|
|
58
|
+
ProcessedCount += 1;
|
|
59
|
+
end;
|
|
60
|
+
until Customer.Next() = 0;
|
|
61
|
+
|
|
62
|
+
Message('Processed %1 customers with full field loading', ProcessedCount);
|
|
63
|
+
end;
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Report Generation with Selective Loading
|
|
67
|
+
|
|
68
|
+
```al
|
|
69
|
+
procedure GenerateCustomerReportOptimized()
|
|
70
|
+
var
|
|
71
|
+
Customer: Record Customer;
|
|
72
|
+
ReportData: JsonObject;
|
|
73
|
+
CustomerArray: JsonArray;
|
|
74
|
+
CustomerJson: JsonObject;
|
|
75
|
+
begin
|
|
76
|
+
Customer.SetLoadFields("No.", Name, "Phone No.", "E-Mail", "Country/Region Code", "Credit Limit (LCY)");
|
|
77
|
+
|
|
78
|
+
if Customer.FindSet() then
|
|
79
|
+
repeat
|
|
80
|
+
Clear(CustomerJson);
|
|
81
|
+
CustomerJson.Add('number', Customer."No.");
|
|
82
|
+
CustomerJson.Add('name', Customer.Name);
|
|
83
|
+
CustomerJson.Add('phone', Customer."Phone No.");
|
|
84
|
+
CustomerJson.Add('email', Customer."E-Mail");
|
|
85
|
+
CustomerJson.Add('country', Customer."Country/Region Code");
|
|
86
|
+
CustomerJson.Add('creditLimit', Customer."Credit Limit (LCY)");
|
|
87
|
+
CustomerArray.Add(CustomerJson);
|
|
88
|
+
until Customer.Next() = 0;
|
|
89
|
+
|
|
90
|
+
ReportData.Add('customers', CustomerArray);
|
|
91
|
+
end;
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Advanced Memory Optimization
|
|
95
|
+
|
|
96
|
+
```al
|
|
97
|
+
procedure ProcessSalesOrdersWithItems()
|
|
98
|
+
var
|
|
99
|
+
SalesHeader: Record "Sales Header";
|
|
100
|
+
SalesLine: Record "Sales Line";
|
|
101
|
+
OrderCount: Integer;
|
|
102
|
+
LineCount: Integer;
|
|
103
|
+
begin
|
|
104
|
+
SalesHeader.SetLoadFields("No.", "Sell-to Customer No.", "Order Date", "Amount Including VAT");
|
|
105
|
+
SalesHeader.SetRange("Document Type", SalesHeader."Document Type"::Order);
|
|
106
|
+
|
|
107
|
+
if SalesHeader.FindSet() then
|
|
108
|
+
repeat
|
|
109
|
+
OrderCount += 1;
|
|
110
|
+
|
|
111
|
+
SalesLine.SetLoadFields("Document No.", "Line No.", "No.", Quantity, "Unit Price", "Line Amount");
|
|
112
|
+
SalesLine.SetRange("Document Type", SalesLine."Document Type"::Order);
|
|
113
|
+
SalesLine.SetRange("Document No.", SalesHeader."No.");
|
|
114
|
+
|
|
115
|
+
if SalesLine.FindSet() then
|
|
116
|
+
repeat
|
|
117
|
+
LineCount += 1;
|
|
118
|
+
ProcessSalesLineData(SalesLine."No.", SalesLine.Quantity, SalesLine."Unit Price");
|
|
119
|
+
until SalesLine.Next() = 0;
|
|
120
|
+
|
|
121
|
+
until SalesHeader.Next() = 0;
|
|
122
|
+
|
|
123
|
+
Message('Processed %1 orders with %2 lines using optimized field loading', OrderCount, LineCount);
|
|
124
|
+
end;
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Conditional Field Loading
|
|
128
|
+
|
|
129
|
+
```al
|
|
130
|
+
procedure ProcessCustomersConditional(IncludeFinancialData: Boolean; IncludeContactData: Boolean)
|
|
131
|
+
var
|
|
132
|
+
Customer: Record Customer;
|
|
133
|
+
FieldList: List of [Integer];
|
|
134
|
+
begin
|
|
135
|
+
FieldList.Add(Customer.FieldNo("No."));
|
|
136
|
+
FieldList.Add(Customer.FieldNo(Name));
|
|
137
|
+
|
|
138
|
+
if IncludeFinancialData then begin
|
|
139
|
+
FieldList.Add(Customer.FieldNo("Credit Limit (LCY)"));
|
|
140
|
+
FieldList.Add(Customer.FieldNo("Balance (LCY)"));
|
|
141
|
+
FieldList.Add(Customer.FieldNo("Sales (LCY)"));
|
|
142
|
+
end;
|
|
143
|
+
|
|
144
|
+
if IncludeContactData then begin
|
|
145
|
+
FieldList.Add(Customer.FieldNo("Phone No."));
|
|
146
|
+
FieldList.Add(Customer.FieldNo("E-Mail"));
|
|
147
|
+
FieldList.Add(Customer.FieldNo("Contact"));
|
|
148
|
+
end;
|
|
149
|
+
|
|
150
|
+
Customer.SetLoadFields(FieldList);
|
|
151
|
+
|
|
152
|
+
if Customer.FindSet() then
|
|
153
|
+
repeat
|
|
154
|
+
ProcessCustomerConditionally(Customer, IncludeFinancialData, IncludeContactData);
|
|
155
|
+
until Customer.Next() = 0;
|
|
156
|
+
end;
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Performance Comparison
|
|
160
|
+
|
|
161
|
+
```al
|
|
162
|
+
procedure CompareMemoryUsage()
|
|
163
|
+
var
|
|
164
|
+
Customer: Record Customer;
|
|
165
|
+
StartTime: DateTime;
|
|
166
|
+
EndTime: DateTime;
|
|
167
|
+
RecordCount: Integer;
|
|
168
|
+
begin
|
|
169
|
+
// Test 1: With SetLoadFields optimization
|
|
170
|
+
StartTime := CurrentDateTime;
|
|
171
|
+
Customer.SetLoadFields("No.", Name);
|
|
172
|
+
if Customer.FindSet() then
|
|
173
|
+
repeat
|
|
174
|
+
RecordCount += 1;
|
|
175
|
+
ProcessBasicCustomerInfo(Customer."No.", Customer.Name);
|
|
176
|
+
until Customer.Next() = 0;
|
|
177
|
+
EndTime := CurrentDateTime;
|
|
178
|
+
|
|
179
|
+
Message('Optimized: Processed %1 records in %2 ms', RecordCount, EndTime - StartTime);
|
|
180
|
+
|
|
181
|
+
// Test 2: Without SetLoadFields
|
|
182
|
+
Clear(Customer);
|
|
183
|
+
RecordCount := 0;
|
|
184
|
+
StartTime := CurrentDateTime;
|
|
185
|
+
if Customer.FindSet() then
|
|
186
|
+
repeat
|
|
187
|
+
RecordCount += 1;
|
|
188
|
+
ProcessBasicCustomerInfo(Customer."No.", Customer.Name);
|
|
189
|
+
until Customer.Next() = 0;
|
|
190
|
+
EndTime := CurrentDateTime;
|
|
191
|
+
|
|
192
|
+
Message('Unoptimized: Processed %1 records in %2 ms', RecordCount, EndTime - StartTime);
|
|
193
|
+
end;
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Query Efficiency Demonstration
|
|
197
|
+
|
|
198
|
+
```al
|
|
199
|
+
procedure DemonstrateQueryEfficiency()
|
|
200
|
+
var
|
|
201
|
+
Item: Record Item;
|
|
202
|
+
ItemCount: Integer;
|
|
203
|
+
FilteredCount: Integer;
|
|
204
|
+
begin
|
|
205
|
+
Item.SetLoadFields("No.", Description, "Unit Price", "Inventory Posting Group", Blocked);
|
|
206
|
+
Item.SetFilter("Unit Price", '>%1', 100);
|
|
207
|
+
Item.SetRange(Blocked, false);
|
|
208
|
+
|
|
209
|
+
if Item.FindSet() then
|
|
210
|
+
repeat
|
|
211
|
+
ItemCount += 1;
|
|
212
|
+
if StrPos(Item.Description, 'PREMIUM') > 0 then begin
|
|
213
|
+
FilteredCount += 1;
|
|
214
|
+
ProcessPremiumItem(Item."No.", Item.Description, Item."Unit Price");
|
|
215
|
+
end;
|
|
216
|
+
until Item.Next() = 0;
|
|
217
|
+
|
|
218
|
+
Message('Found %1 premium items from %2 total items using optimized loading', FilteredCount, ItemCount);
|
|
219
|
+
end;
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Anti-Pattern Examples
|
|
223
|
+
|
|
224
|
+
```al
|
|
225
|
+
// ❌ ANTI-PATTERN: Loading unnecessary fields
|
|
226
|
+
procedure AntiPatternUnnecessaryFields()
|
|
227
|
+
var
|
|
228
|
+
Customer: Record Customer;
|
|
229
|
+
begin
|
|
230
|
+
Customer.SetLoadFields("No.", Name, "Phone No.", "E-Mail", "Address", "City",
|
|
231
|
+
"Credit Limit (LCY)", "Balance (LCY)", "Sales (LCY)");
|
|
232
|
+
|
|
233
|
+
if Customer.FindSet() then
|
|
234
|
+
repeat
|
|
235
|
+
ProcessBasicCustomerInfo(Customer."No.", Customer.Name);
|
|
236
|
+
until Customer.Next() = 0;
|
|
237
|
+
end;
|
|
238
|
+
|
|
239
|
+
// ❌ ANTI-PATTERN: Not using SetLoadFields in loops
|
|
240
|
+
procedure AntiPatternNoOptimizationInLoops()
|
|
241
|
+
var
|
|
242
|
+
SalesHeader: Record "Sales Header";
|
|
243
|
+
Customer: Record Customer;
|
|
244
|
+
begin
|
|
245
|
+
if SalesHeader.FindSet() then
|
|
246
|
+
repeat
|
|
247
|
+
if Customer.Get(SalesHeader."Sell-to Customer No.") then
|
|
248
|
+
ProcessCustomerInOrder(Customer.Name, Customer."Credit Limit (LCY)");
|
|
249
|
+
until SalesHeader.Next() = 0;
|
|
250
|
+
end;
|
|
251
|
+
|
|
252
|
+
// ✅ CORRECTED: Proper SetLoadFields usage
|
|
253
|
+
procedure CorrectedOptimizationInLoops()
|
|
254
|
+
var
|
|
255
|
+
SalesHeader: Record "Sales Header";
|
|
256
|
+
Customer: Record Customer;
|
|
257
|
+
begin
|
|
258
|
+
SalesHeader.SetLoadFields("No.", "Sell-to Customer No.");
|
|
259
|
+
|
|
260
|
+
if SalesHeader.FindSet() then
|
|
261
|
+
repeat
|
|
262
|
+
Customer.SetLoadFields(Name, "Credit Limit (LCY)");
|
|
263
|
+
if Customer.Get(SalesHeader."Sell-to Customer No.") then
|
|
264
|
+
ProcessCustomerInOrder(Customer.Name, Customer."Credit Limit (LCY)");
|
|
265
|
+
until SalesHeader.Next() = 0;
|
|
266
|
+
end;
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Performance Impact Measurement
|
|
270
|
+
|
|
271
|
+
```al
|
|
272
|
+
procedure MeasureAntiPatternImpact()
|
|
273
|
+
var
|
|
274
|
+
Item: Record Item;
|
|
275
|
+
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
276
|
+
StartTime: DateTime;
|
|
277
|
+
EndTime: DateTime;
|
|
278
|
+
EntryCount: Integer;
|
|
279
|
+
begin
|
|
280
|
+
StartTime := CurrentDateTime;
|
|
281
|
+
|
|
282
|
+
if ItemLedgerEntry.FindSet() then
|
|
283
|
+
repeat
|
|
284
|
+
EntryCount += 1;
|
|
285
|
+
if Item.Get(ItemLedgerEntry."Item No.") then begin
|
|
286
|
+
ProcessItemLedgerWithDescription(ItemLedgerEntry."Entry No.", Item.Description);
|
|
287
|
+
end;
|
|
288
|
+
until (ItemLedgerEntry.Next() = 0) or (EntryCount > 1000);
|
|
289
|
+
|
|
290
|
+
EndTime := CurrentDateTime;
|
|
291
|
+
Message('Anti-pattern: Processed %1 entries in %2 ms', EntryCount, EndTime - StartTime);
|
|
292
|
+
|
|
293
|
+
ProcessItemLedgerOptimized();
|
|
294
|
+
end;
|
|
295
|
+
|
|
296
|
+
local procedure ProcessItemLedgerOptimized()
|
|
297
|
+
var
|
|
298
|
+
Item: Record Item;
|
|
299
|
+
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
300
|
+
StartTime: DateTime;
|
|
301
|
+
EndTime: DateTime;
|
|
302
|
+
EntryCount: Integer;
|
|
303
|
+
begin
|
|
304
|
+
StartTime := CurrentDateTime;
|
|
305
|
+
|
|
306
|
+
ItemLedgerEntry.SetLoadFields("Entry No.", "Item No.");
|
|
307
|
+
Item.SetLoadFields(Description);
|
|
308
|
+
|
|
309
|
+
if ItemLedgerEntry.FindSet() then
|
|
310
|
+
repeat
|
|
311
|
+
EntryCount += 1;
|
|
312
|
+
if Item.Get(ItemLedgerEntry."Item No.") then
|
|
313
|
+
ProcessItemLedgerWithDescription(ItemLedgerEntry."Entry No.", Item.Description);
|
|
314
|
+
until (ItemLedgerEntry.Next() = 0) or (EntryCount > 1000);
|
|
315
|
+
|
|
316
|
+
EndTime := CurrentDateTime;
|
|
317
|
+
Message('Optimized: Processed %1 entries in %2 ms', EntryCount, EndTime - StartTime);
|
|
318
|
+
end;
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Best Practice Implementation
|
|
322
|
+
|
|
323
|
+
```al
|
|
324
|
+
procedure BestPracticeImplementation()
|
|
325
|
+
var
|
|
326
|
+
Customer: Record Customer;
|
|
327
|
+
ProcessedCount: Integer;
|
|
328
|
+
ErrorCount: Integer;
|
|
329
|
+
begin
|
|
330
|
+
Customer.SetLoadFields("No.", Name, "Customer Posting Group", Blocked);
|
|
331
|
+
|
|
332
|
+
if Customer.FindSet() then
|
|
333
|
+
repeat
|
|
334
|
+
if ProcessCustomerSafely(Customer) then
|
|
335
|
+
ProcessedCount += 1
|
|
336
|
+
else
|
|
337
|
+
ErrorCount += 1;
|
|
338
|
+
until Customer.Next() = 0;
|
|
339
|
+
|
|
340
|
+
if ErrorCount > 0 then
|
|
341
|
+
Message('Processed %1 customers successfully, %2 errors encountered', ProcessedCount, ErrorCount);
|
|
342
|
+
end;
|
|
343
|
+
|
|
344
|
+
local procedure ProcessCustomerSafely(Customer: Record Customer): Boolean
|
|
345
|
+
begin
|
|
346
|
+
if (Customer."No." = '') or (Customer.Name = '') then
|
|
347
|
+
exit(false);
|
|
348
|
+
|
|
349
|
+
if Customer.Blocked then
|
|
350
|
+
exit(true);
|
|
351
|
+
|
|
352
|
+
ProcessBasicCustomerInfo(Customer."No.", Customer.Name);
|
|
353
|
+
exit(true);
|
|
354
|
+
end;
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
## Dynamic Field Loading
|
|
358
|
+
|
|
359
|
+
```al
|
|
360
|
+
procedure DynamicFieldLoading(ProcessingMode: Option Basic,Extended,Full)
|
|
361
|
+
var
|
|
362
|
+
Customer: Record Customer;
|
|
363
|
+
FieldsToLoad: List of [Integer];
|
|
364
|
+
begin
|
|
365
|
+
FieldsToLoad.Add(Customer.FieldNo("No."));
|
|
366
|
+
FieldsToLoad.Add(Customer.FieldNo(Name));
|
|
367
|
+
|
|
368
|
+
case ProcessingMode of
|
|
369
|
+
ProcessingMode::Extended:
|
|
370
|
+
begin
|
|
371
|
+
FieldsToLoad.Add(Customer.FieldNo("Phone No."));
|
|
372
|
+
FieldsToLoad.Add(Customer.FieldNo("E-Mail"));
|
|
373
|
+
end;
|
|
374
|
+
ProcessingMode::Full:
|
|
375
|
+
begin
|
|
376
|
+
FieldsToLoad.Add(Customer.FieldNo("Phone No."));
|
|
377
|
+
FieldsToLoad.Add(Customer.FieldNo("E-Mail"));
|
|
378
|
+
FieldsToLoad.Add(Customer.FieldNo("Credit Limit (LCY)"));
|
|
379
|
+
FieldsToLoad.Add(Customer.FieldNo("Balance (LCY)"));
|
|
380
|
+
end;
|
|
381
|
+
end;
|
|
382
|
+
|
|
383
|
+
Customer.SetLoadFields(FieldsToLoad);
|
|
384
|
+
|
|
385
|
+
if Customer.FindSet() then
|
|
386
|
+
repeat
|
|
387
|
+
ProcessCustomerByMode(Customer, ProcessingMode);
|
|
388
|
+
until Customer.Next() = 0;
|
|
389
|
+
end;
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
## Performance Guidelines Summary
|
|
393
|
+
|
|
394
|
+
### Implementation Strategy
|
|
395
|
+
1. **Analyze field usage** before applying SetLoadFields
|
|
396
|
+
2. **Load minimal field sets** required for processing
|
|
397
|
+
3. **Apply early** - call SetLoadFields immediately after record declaration
|
|
398
|
+
4. **Measure impact** - validate performance improvements
|
|
399
|
+
5. **Document rationale** - explain field selection decisions
|
|
400
|
+
|
|
401
|
+
### Memory Optimization Benefits
|
|
402
|
+
- 70-90% memory reduction for large recordsets
|
|
403
|
+
- Improved garbage collection performance
|
|
404
|
+
- Better system scalability with reduced memory pressure
|
|
405
|
+
- Faster record processing with smaller data structures
|
|
406
|
+
|
|
407
|
+
### Common Mistakes to Avoid
|
|
408
|
+
1. Loading fields "just in case" without actual usage
|
|
409
|
+
2. Forgetting SetLoadFields in nested record lookups
|
|
410
|
+
3. Excluding primary key fields needed for record operations
|
|
411
|
+
4. Applying optimization to small datasets where overhead exceeds benefits
|
|
412
|
+
5. Not measuring actual performance improvement
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# SetLoadFields Performance Optimization - AL Examples
|
|
2
|
+
|
|
3
|
+
## Basic Usage Pattern
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
codeunit 50100 "SetLoadFields Examples"
|
|
7
|
+
{
|
|
8
|
+
// Basic SetLoadFields usage for loading only needed fields
|
|
9
|
+
procedure GetCustomerNameAndPhone(CustomerNo: Code[20]): Text
|
|
10
|
+
var
|
|
11
|
+
Customer: Record Customer;
|
|
12
|
+
Result: Text;
|
|
13
|
+
begin
|
|
14
|
+
Customer.Get(CustomerNo);
|
|
15
|
+
|
|
16
|
+
// Load only the fields we actually need
|
|
17
|
+
Customer.SetLoadFields(Name, "Phone No.");
|
|
18
|
+
Customer.Find(); // Refresh with partial loading
|
|
19
|
+
|
|
20
|
+
Result := Customer.Name + ' - ' + Customer."Phone No.";
|
|
21
|
+
exit(Result);
|
|
22
|
+
end;
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Performance Impact Demonstration
|
|
27
|
+
|
|
28
|
+
### Before: Full Record Loading
|
|
29
|
+
```al
|
|
30
|
+
// Traditional approach - loads all 100+ fields from Customer table
|
|
31
|
+
procedure ProcessCustomerListSlow()
|
|
32
|
+
var
|
|
33
|
+
Customer: Record Customer;
|
|
34
|
+
ProcessedCount: Integer;
|
|
35
|
+
begin
|
|
36
|
+
// This loads ALL fields for each customer record
|
|
37
|
+
// Network overhead: ~8KB per record for full Customer table
|
|
38
|
+
// Memory usage: Significant for large datasets
|
|
39
|
+
if Customer.FindSet() then
|
|
40
|
+
repeat
|
|
41
|
+
// Only using Name and "No." but loaded entire record
|
|
42
|
+
if Customer.Name <> '' then
|
|
43
|
+
ProcessedCount += 1;
|
|
44
|
+
until Customer.Next() = 0;
|
|
45
|
+
|
|
46
|
+
Message('Processed %1 customers (slow method)', ProcessedCount);
|
|
47
|
+
end;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### After: Optimized with SetLoadFields
|
|
51
|
+
```al
|
|
52
|
+
// Optimized approach - loads only required fields
|
|
53
|
+
procedure ProcessCustomerListFast()
|
|
54
|
+
var
|
|
55
|
+
Customer: Record Customer;
|
|
56
|
+
ProcessedCount: Integer;
|
|
57
|
+
begin
|
|
58
|
+
// Load only the fields we actually use
|
|
59
|
+
Customer.SetLoadFields("No.", Name);
|
|
60
|
+
|
|
61
|
+
// Network overhead: ~50 bytes per record (vs 8KB)
|
|
62
|
+
// Memory usage: 99% reduction for this scenario
|
|
63
|
+
// Performance gain: 10-50x faster depending on table size
|
|
64
|
+
if Customer.FindSet() then
|
|
65
|
+
repeat
|
|
66
|
+
if Customer.Name <> '' then
|
|
67
|
+
ProcessedCount += 1;
|
|
68
|
+
until Customer.Next() = 0;
|
|
69
|
+
|
|
70
|
+
Message('Processed %1 customers (fast method)', ProcessedCount);
|
|
71
|
+
end;
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Anti-Pattern: Field Access After SetLoadFields
|
|
75
|
+
|
|
76
|
+
```al
|
|
77
|
+
// WRONG: Accessing fields not included in SetLoadFields
|
|
78
|
+
procedure CustomerAnalysisAntiPattern(CustomerNo: Code[20])
|
|
79
|
+
var
|
|
80
|
+
Customer: Record Customer;
|
|
81
|
+
begin
|
|
82
|
+
Customer.Get(CustomerNo);
|
|
83
|
+
|
|
84
|
+
// Only load basic fields
|
|
85
|
+
Customer.SetLoadFields("No.", Name);
|
|
86
|
+
Customer.Find();
|
|
87
|
+
|
|
88
|
+
// BAD: Accessing field not in SetLoadFields causes additional database hit
|
|
89
|
+
// This negates the performance benefit and adds overhead
|
|
90
|
+
if Customer."Credit Limit (LCY)" > 0 then // Database hit here!
|
|
91
|
+
Message('Customer %1 has credit limit', Customer.Name);
|
|
92
|
+
|
|
93
|
+
// WORSE: Multiple unloaded field accesses = multiple database hits
|
|
94
|
+
Customer."Phone No."; // Database hit!
|
|
95
|
+
Customer."E-Mail"; // Another database hit!
|
|
96
|
+
Customer."VAT Registration No."; // Yet another database hit!
|
|
97
|
+
end;
|
|
98
|
+
|
|
99
|
+
// CORRECT: Include all needed fields in SetLoadFields
|
|
100
|
+
procedure CustomerAnalysisCorrectPattern(CustomerNo: Code[20])
|
|
101
|
+
var
|
|
102
|
+
Customer: Record Customer;
|
|
103
|
+
begin
|
|
104
|
+
Customer.Get(CustomerNo);
|
|
105
|
+
|
|
106
|
+
// Load ALL fields we plan to use
|
|
107
|
+
Customer.SetLoadFields("No.", Name, "Credit Limit (LCY)", "Phone No.", "E-Mail", "VAT Registration No.");
|
|
108
|
+
Customer.Find();
|
|
109
|
+
|
|
110
|
+
// Now all field accesses are served from memory - no additional database hits
|
|
111
|
+
if Customer."Credit Limit (LCY)" > 0 then
|
|
112
|
+
Message('Customer %1 (%2) has credit limit. Contact: %3',
|
|
113
|
+
Customer.Name, Customer."VAT Registration No.", Customer."E-Mail");
|
|
114
|
+
end;
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Batch Processing Optimization
|
|
118
|
+
|
|
119
|
+
```al
|
|
120
|
+
// SetLoadFields optimization for processing large datasets
|
|
121
|
+
procedure OptimizeBatchCustomerUpdate()
|
|
122
|
+
var
|
|
123
|
+
Customer: Record Customer;
|
|
124
|
+
SalesHeader: Record "Sales Header";
|
|
125
|
+
UpdateCount: Integer;
|
|
126
|
+
begin
|
|
127
|
+
// Scenario: Update customer last sale date based on sales orders
|
|
128
|
+
// Performance critical when processing thousands of records
|
|
129
|
+
|
|
130
|
+
// Step 1: Optimize customer record loading
|
|
131
|
+
Customer.SetLoadFields("No.", "Last Date Modified");
|
|
132
|
+
|
|
133
|
+
if Customer.FindSet(true) then // Modifiable RecordSet
|
|
134
|
+
repeat
|
|
135
|
+
// Step 2: Optimize sales header lookup - only need posting date
|
|
136
|
+
SalesHeader.SetRange("Sell-to Customer No.", Customer."No.");
|
|
137
|
+
SalesHeader.SetRange("Document Type", SalesHeader."Document Type"::Order);
|
|
138
|
+
SalesHeader.SetLoadFields("Posting Date");
|
|
139
|
+
|
|
140
|
+
if SalesHeader.FindLast() then begin
|
|
141
|
+
// Only modify if there's an actual change
|
|
142
|
+
if Customer."Last Date Modified" <> SalesHeader."Posting Date" then begin
|
|
143
|
+
Customer."Last Date Modified" := SalesHeader."Posting Date";
|
|
144
|
+
Customer.Modify(); // Only updates loaded fields + modified fields
|
|
145
|
+
UpdateCount += 1;
|
|
146
|
+
end;
|
|
147
|
+
end;
|
|
148
|
+
until Customer.Next() = 0;
|
|
149
|
+
|
|
150
|
+
Message('Updated %1 customer records', UpdateCount);
|
|
151
|
+
end;
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Performance Monitoring Example
|
|
155
|
+
|
|
156
|
+
```al
|
|
157
|
+
// Measure SetLoadFields impact
|
|
158
|
+
procedure MeasureSetLoadFieldsImpact()
|
|
159
|
+
var
|
|
160
|
+
Customer: Record Customer;
|
|
161
|
+
StartTime: DateTime;
|
|
162
|
+
EndTime: DateTime;
|
|
163
|
+
RecordCount: Integer;
|
|
164
|
+
begin
|
|
165
|
+
// Test 1: Traditional full record loading
|
|
166
|
+
StartTime := CurrentDateTime;
|
|
167
|
+
RecordCount := 0;
|
|
168
|
+
|
|
169
|
+
if Customer.FindSet() then
|
|
170
|
+
repeat
|
|
171
|
+
RecordCount += 1;
|
|
172
|
+
until Customer.Next() = 0;
|
|
173
|
+
|
|
174
|
+
EndTime := CurrentDateTime;
|
|
175
|
+
Message('Full loading: %1 records in %2ms', RecordCount, EndTime - StartTime);
|
|
176
|
+
|
|
177
|
+
// Test 2: Optimized with SetLoadFields
|
|
178
|
+
StartTime := CurrentDateTime;
|
|
179
|
+
RecordCount := 0;
|
|
180
|
+
Customer.Reset();
|
|
181
|
+
Customer.SetLoadFields("No."); // Minimal field loading
|
|
182
|
+
|
|
183
|
+
if Customer.FindSet() then
|
|
184
|
+
repeat
|
|
185
|
+
RecordCount += 1;
|
|
186
|
+
until Customer.Next() = 0;
|
|
187
|
+
|
|
188
|
+
EndTime := CurrentDateTime;
|
|
189
|
+
Message('SetLoadFields: %1 records in %2ms', RecordCount, EndTime - StartTime);
|
|
190
|
+
|
|
191
|
+
// Typical results: 70-90% performance improvement for large datasets
|
|
192
|
+
end;
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Performance Guidelines:**
|
|
196
|
+
|
|
197
|
+
1. **SetLoadFields Benefits**:
|
|
198
|
+
- Network traffic reduction: 80-95% for wide tables
|
|
199
|
+
- Memory usage reduction: Proportional to excluded fields
|
|
200
|
+
- Query performance: Faster due to less data transfer
|
|
201
|
+
|
|
202
|
+
2. **Best Practices**:
|
|
203
|
+
- Always include primary key fields
|
|
204
|
+
- Plan field usage before calling SetLoadFields
|
|
205
|
+
- Use SetLoadFields before FindSet() for maximum benefit
|
|
206
|
+
- Avoid accessing non-loaded fields after SetLoadFields
|
|
207
|
+
|
|
208
|
+
3. **Performance Impact**:
|
|
209
|
+
- Small datasets (<1000 records): 20-50% improvement
|
|
210
|
+
- Medium datasets (1000-10000 records): 50-300% improvement
|
|
211
|
+
- Large datasets (>10000 records): 300-1000% improvement
|