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,666 @@
|
|
|
1
|
+
# API Page Source Table Key Requirements - AL Code Sample
|
|
2
|
+
|
|
3
|
+
## Basic Primary Key Configuration
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
table 50130 "API Customer Data"
|
|
7
|
+
{
|
|
8
|
+
Caption = 'API Customer Data';
|
|
9
|
+
DataClassification = CustomerContent;
|
|
10
|
+
|
|
11
|
+
fields
|
|
12
|
+
{
|
|
13
|
+
field(1; "No."; Code[20])
|
|
14
|
+
{
|
|
15
|
+
Caption = 'No.';
|
|
16
|
+
DataClassification = CustomerContent;
|
|
17
|
+
}
|
|
18
|
+
field(2; SystemId; Guid)
|
|
19
|
+
{
|
|
20
|
+
Caption = 'System ID';
|
|
21
|
+
DataClassification = SystemMetadata;
|
|
22
|
+
}
|
|
23
|
+
field(10; Name; Text[100])
|
|
24
|
+
{
|
|
25
|
+
Caption = 'Name';
|
|
26
|
+
DataClassification = CustomerContent;
|
|
27
|
+
}
|
|
28
|
+
field(20; "Credit Limit"; Decimal)
|
|
29
|
+
{
|
|
30
|
+
Caption = 'Credit Limit';
|
|
31
|
+
DataClassification = CustomerContent;
|
|
32
|
+
}
|
|
33
|
+
field(30; "Last Modified DateTime"; DateTime)
|
|
34
|
+
{
|
|
35
|
+
Caption = 'Last Modified Date Time';
|
|
36
|
+
DataClassification = SystemMetadata;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
keys
|
|
41
|
+
{
|
|
42
|
+
// Primary key - MUST be the first key for API performance
|
|
43
|
+
key(PK; "No.")
|
|
44
|
+
{
|
|
45
|
+
Clustered = true; // Clustered index for optimal performance
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// SystemId key - REQUIRED for OData entity identification
|
|
49
|
+
key(SystemIdKey; SystemId)
|
|
50
|
+
{
|
|
51
|
+
// SystemId must be unique and indexed for API operations
|
|
52
|
+
Unique = true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Additional keys for API query performance
|
|
56
|
+
key(NameKey; Name)
|
|
57
|
+
{
|
|
58
|
+
// Enable efficient filtering and sorting by name
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
key(LastModifiedKey; "Last Modified DateTime")
|
|
62
|
+
{
|
|
63
|
+
// Support delta sync and change tracking queries
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Corresponding API page with proper key utilization
|
|
69
|
+
page 50130 "Customer Data API"
|
|
70
|
+
{
|
|
71
|
+
PageType = API;
|
|
72
|
+
APIPublisher = 'contoso';
|
|
73
|
+
APIGroup = 'customers';
|
|
74
|
+
APIVersion = 'v1.0';
|
|
75
|
+
EntityName = 'customerData';
|
|
76
|
+
EntitySetName = 'customerData';
|
|
77
|
+
SourceTable = "API Customer Data";
|
|
78
|
+
DelayedInsert = true;
|
|
79
|
+
|
|
80
|
+
layout
|
|
81
|
+
{
|
|
82
|
+
area(Content)
|
|
83
|
+
{
|
|
84
|
+
repeater(Records)
|
|
85
|
+
{
|
|
86
|
+
// SystemId field - leverages SystemId key
|
|
87
|
+
field(id; Rec.SystemId)
|
|
88
|
+
{
|
|
89
|
+
Caption = 'Id';
|
|
90
|
+
Editable = false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Primary business key - leverages primary key
|
|
94
|
+
field(number; Rec."No.")
|
|
95
|
+
{
|
|
96
|
+
Caption = 'Number';
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
field(name; Rec.Name)
|
|
100
|
+
{
|
|
101
|
+
Caption = 'Name';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
field(creditLimit; Rec."Credit Limit")
|
|
105
|
+
{
|
|
106
|
+
Caption = 'Credit Limit';
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
field(lastModifiedDateTime; Rec."Last Modified DateTime")
|
|
110
|
+
{
|
|
111
|
+
Caption = 'Last Modified Date Time';
|
|
112
|
+
Editable = false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Composite Key Configuration for API Tables
|
|
121
|
+
|
|
122
|
+
```al
|
|
123
|
+
table 50131 "API Sales Line Data"
|
|
124
|
+
{
|
|
125
|
+
Caption = 'API Sales Line Data';
|
|
126
|
+
DataClassification = CustomerContent;
|
|
127
|
+
|
|
128
|
+
fields
|
|
129
|
+
{
|
|
130
|
+
field(1; "Document Type"; Enum "Sales Document Type")
|
|
131
|
+
{
|
|
132
|
+
Caption = 'Document Type';
|
|
133
|
+
DataClassification = CustomerContent;
|
|
134
|
+
}
|
|
135
|
+
field(2; "Document No."; Code[20])
|
|
136
|
+
{
|
|
137
|
+
Caption = 'Document No.';
|
|
138
|
+
DataClassification = CustomerContent;
|
|
139
|
+
}
|
|
140
|
+
field(3; "Line No."; Integer)
|
|
141
|
+
{
|
|
142
|
+
Caption = 'Line No.';
|
|
143
|
+
DataClassification = CustomerContent;
|
|
144
|
+
}
|
|
145
|
+
field(4; SystemId; Guid)
|
|
146
|
+
{
|
|
147
|
+
Caption = 'System ID';
|
|
148
|
+
DataClassification = SystemMetadata;
|
|
149
|
+
}
|
|
150
|
+
field(10; "Item No."; Code[20])
|
|
151
|
+
{
|
|
152
|
+
Caption = 'Item No.';
|
|
153
|
+
DataClassification = CustomerContent;
|
|
154
|
+
}
|
|
155
|
+
field(20; Quantity; Decimal)
|
|
156
|
+
{
|
|
157
|
+
Caption = 'Quantity';
|
|
158
|
+
DataClassification = CustomerContent;
|
|
159
|
+
}
|
|
160
|
+
field(30; "Unit Price"; Decimal)
|
|
161
|
+
{
|
|
162
|
+
Caption = 'Unit Price';
|
|
163
|
+
DataClassification = CustomerContent;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
keys
|
|
168
|
+
{
|
|
169
|
+
// Composite primary key - Essential for line-based entities
|
|
170
|
+
key(PK; "Document Type", "Document No.", "Line No.")
|
|
171
|
+
{
|
|
172
|
+
Clustered = true; // Clustered for optimal range queries
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// SystemId key - Required for OData entity operations
|
|
176
|
+
key(SystemIdKey; SystemId)
|
|
177
|
+
{
|
|
178
|
+
Unique = true;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Document header key - Efficient parent-child queries
|
|
182
|
+
key(DocumentKey; "Document Type", "Document No.")
|
|
183
|
+
{
|
|
184
|
+
// Enables efficient filtering by document
|
|
185
|
+
// Supports OData navigation properties
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Item analysis key - Business intelligence queries
|
|
189
|
+
key(ItemKey; "Item No.", "Document Type")
|
|
190
|
+
{
|
|
191
|
+
// Enables item-based reporting and analytics
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Performance key for aggregations
|
|
195
|
+
key(AggregationKey; "Document Type", "Item No.")
|
|
196
|
+
{
|
|
197
|
+
SumIndexFields = Quantity, "Unit Price";
|
|
198
|
+
// SIFT key for efficient aggregation queries
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// API page utilizing composite keys
|
|
204
|
+
page 50131 "Sales Line Data API"
|
|
205
|
+
{
|
|
206
|
+
PageType = API;
|
|
207
|
+
APIPublisher = 'contoso';
|
|
208
|
+
APIGroup = 'sales';
|
|
209
|
+
APIVersion = 'v1.0';
|
|
210
|
+
EntityName = 'salesLineData';
|
|
211
|
+
EntitySetName = 'salesLineData';
|
|
212
|
+
SourceTable = "API Sales Line Data";
|
|
213
|
+
DelayedInsert = true;
|
|
214
|
+
|
|
215
|
+
layout
|
|
216
|
+
{
|
|
217
|
+
area(Content)
|
|
218
|
+
{
|
|
219
|
+
repeater(Records)
|
|
220
|
+
{
|
|
221
|
+
field(id; Rec.SystemId)
|
|
222
|
+
{
|
|
223
|
+
Caption = 'Id';
|
|
224
|
+
Editable = false;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Primary key components
|
|
228
|
+
field(documentType; Rec."Document Type")
|
|
229
|
+
{
|
|
230
|
+
Caption = 'Document Type';
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
field(documentNumber; Rec."Document No.")
|
|
234
|
+
{
|
|
235
|
+
Caption = 'Document Number';
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
field(lineNumber; Rec."Line No.")
|
|
239
|
+
{
|
|
240
|
+
Caption = 'Line Number';
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
field(itemNumber; Rec."Item No.")
|
|
244
|
+
{
|
|
245
|
+
Caption = 'Item Number';
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
field(quantity; Rec.Quantity)
|
|
249
|
+
{
|
|
250
|
+
Caption = 'Quantity';
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
field(unitPrice; Rec."Unit Price")
|
|
254
|
+
{
|
|
255
|
+
Caption = 'Unit Price';
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Demonstrate key usage in triggers
|
|
262
|
+
trigger OnNewRecord(BelowxRec: Boolean)
|
|
263
|
+
begin
|
|
264
|
+
// Auto-generate line number using primary key
|
|
265
|
+
if Rec."Line No." = 0 then
|
|
266
|
+
Rec."Line No." := GetNextLineNo(Rec."Document Type", Rec."Document No.");
|
|
267
|
+
end;
|
|
268
|
+
|
|
269
|
+
local procedure GetNextLineNo(DocType: Enum "Sales Document Type"; DocNo: Code[20]): Integer
|
|
270
|
+
var
|
|
271
|
+
SalesLine: Record "API Sales Line Data";
|
|
272
|
+
LineNo: Integer;
|
|
273
|
+
begin
|
|
274
|
+
// Use primary key for efficient max line number query
|
|
275
|
+
SalesLine.SetRange("Document Type", DocType);
|
|
276
|
+
SalesLine.SetRange("Document No.", DocNo);
|
|
277
|
+
SalesLine.SetCurrentKey("Document Type", "Document No.", "Line No."); // Use primary key
|
|
278
|
+
SalesLine.Ascending(false); // Descending order to get highest line number
|
|
279
|
+
|
|
280
|
+
if SalesLine.FindFirst() then
|
|
281
|
+
LineNo := SalesLine."Line No." + 10000
|
|
282
|
+
else
|
|
283
|
+
LineNo := 10000;
|
|
284
|
+
|
|
285
|
+
exit(LineNo);
|
|
286
|
+
end;
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## Key Performance Optimization Examples
|
|
291
|
+
|
|
292
|
+
```al
|
|
293
|
+
table 50132 "API Performance Demo"
|
|
294
|
+
{
|
|
295
|
+
Caption = 'API Performance Demo';
|
|
296
|
+
DataClassification = CustomerContent;
|
|
297
|
+
|
|
298
|
+
fields
|
|
299
|
+
{
|
|
300
|
+
field(1; "Entry No."; Integer)
|
|
301
|
+
{
|
|
302
|
+
Caption = 'Entry No.';
|
|
303
|
+
DataClassification = CustomerContent;
|
|
304
|
+
AutoIncrement = true; // Auto-increment primary key
|
|
305
|
+
}
|
|
306
|
+
field(2; SystemId; Guid)
|
|
307
|
+
{
|
|
308
|
+
Caption = 'System ID';
|
|
309
|
+
DataClassification = SystemMetadata;
|
|
310
|
+
}
|
|
311
|
+
field(10; "Customer No."; Code[20])
|
|
312
|
+
{
|
|
313
|
+
Caption = 'Customer No.';
|
|
314
|
+
DataClassification = CustomerContent;
|
|
315
|
+
}
|
|
316
|
+
field(20; "Posting Date"; Date)
|
|
317
|
+
{
|
|
318
|
+
Caption = 'Posting Date';
|
|
319
|
+
DataClassification = CustomerContent;
|
|
320
|
+
}
|
|
321
|
+
field(30; Amount; Decimal)
|
|
322
|
+
{
|
|
323
|
+
Caption = 'Amount';
|
|
324
|
+
DataClassification = CustomerContent;
|
|
325
|
+
}
|
|
326
|
+
field(40; "Document No."; Code[20])
|
|
327
|
+
{
|
|
328
|
+
Caption = 'Document No.';
|
|
329
|
+
DataClassification = CustomerContent;
|
|
330
|
+
}
|
|
331
|
+
field(50; "External Document No."; Code[35])
|
|
332
|
+
{
|
|
333
|
+
Caption = 'External Document No.';
|
|
334
|
+
DataClassification = CustomerContent;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
keys
|
|
339
|
+
{
|
|
340
|
+
// Primary key - Sequential integer for optimal insert performance
|
|
341
|
+
key(PK; "Entry No.")
|
|
342
|
+
{
|
|
343
|
+
Clustered = true;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// SystemId key - Required for API
|
|
347
|
+
key(SystemIdKey; SystemId)
|
|
348
|
+
{
|
|
349
|
+
Unique = true;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Business query keys - Designed for common API filter patterns
|
|
353
|
+
key(CustomerDateKey; "Customer No.", "Posting Date")
|
|
354
|
+
{
|
|
355
|
+
// Optimal for: GET /api/entries?$filter=customerNo eq 'C001' and postingDate ge 2024-01-01
|
|
356
|
+
// Includes Amount for covering index benefits
|
|
357
|
+
IncludedFields = Amount, "Document No.";
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
key(DateCustomerKey; "Posting Date", "Customer No.")
|
|
361
|
+
{
|
|
362
|
+
// Optimal for: GET /api/entries?$filter=postingDate ge 2024-01-01&$orderby=customerNo
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
key(DocumentKey; "Document No.")
|
|
366
|
+
{
|
|
367
|
+
// Optimal for: GET /api/entries?$filter=documentNo eq 'INV-001'
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
key(ExternalDocKey; "External Document No.")
|
|
371
|
+
{
|
|
372
|
+
// Optimal for external system integration queries
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// SIFT key for aggregation queries
|
|
376
|
+
key(SIFTKey; "Customer No.", "Posting Date")
|
|
377
|
+
{
|
|
378
|
+
SumIndexFields = Amount;
|
|
379
|
+
// Optimal for: GET /api/entries?$apply=groupby((customerNo),aggregate(amount with sum as total))
|
|
380
|
+
MaintainSiftIndex = true; // Real-time aggregations
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Performance-optimized API page
|
|
386
|
+
page 50132 "Performance Demo API"
|
|
387
|
+
{
|
|
388
|
+
PageType = API;
|
|
389
|
+
APIPublisher = 'contoso';
|
|
390
|
+
APIGroup = 'performance';
|
|
391
|
+
APIVersion = 'v1.0';
|
|
392
|
+
EntityName = 'performanceEntry';
|
|
393
|
+
EntitySetName = 'performanceEntries';
|
|
394
|
+
SourceTable = "API Performance Demo";
|
|
395
|
+
DelayedInsert = true;
|
|
396
|
+
|
|
397
|
+
layout
|
|
398
|
+
{
|
|
399
|
+
area(Content)
|
|
400
|
+
{
|
|
401
|
+
repeater(Records)
|
|
402
|
+
{
|
|
403
|
+
field(id; Rec.SystemId)
|
|
404
|
+
{
|
|
405
|
+
Caption = 'Id';
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
field(entryNumber; Rec."Entry No.")
|
|
409
|
+
{
|
|
410
|
+
Caption = 'Entry Number';
|
|
411
|
+
Editable = false; // Auto-increment field
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
field(customerNumber; Rec."Customer No.")
|
|
415
|
+
{
|
|
416
|
+
Caption = 'Customer Number';
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
field(postingDate; Rec."Posting Date")
|
|
420
|
+
{
|
|
421
|
+
Caption = 'Posting Date';
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
field(amount; Rec.Amount)
|
|
425
|
+
{
|
|
426
|
+
Caption = 'Amount';
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
field(documentNumber; Rec."Document No.")
|
|
430
|
+
{
|
|
431
|
+
Caption = 'Document Number';
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
field(externalDocumentNumber; Rec."External Document No.")
|
|
435
|
+
{
|
|
436
|
+
Caption = 'External Document Number';
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Demonstrate efficient key usage in code
|
|
443
|
+
trigger OnOpenPage()
|
|
444
|
+
begin
|
|
445
|
+
// Set optimal key for typical API usage patterns
|
|
446
|
+
SetOptimalKey();
|
|
447
|
+
end;
|
|
448
|
+
|
|
449
|
+
local procedure SetOptimalKey()
|
|
450
|
+
begin
|
|
451
|
+
// Default to customer-date key for most common queries
|
|
452
|
+
Rec.SetCurrentKey("Customer No.", "Posting Date");
|
|
453
|
+
|
|
454
|
+
// This key choice optimizes for common OData queries like:
|
|
455
|
+
// $filter=customerNo eq 'value'
|
|
456
|
+
// $filter=customerNo eq 'value' and postingDate ge datetime'2024-01-01T00:00:00Z'
|
|
457
|
+
// $orderby=customerNo,postingDate
|
|
458
|
+
end;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Demonstrate key selection based on query patterns
|
|
462
|
+
codeunit 50132 "API Key Selection Demo"
|
|
463
|
+
{
|
|
464
|
+
procedure DemonstrateKeyUsage()
|
|
465
|
+
var
|
|
466
|
+
PerfEntry: Record "API Performance Demo";
|
|
467
|
+
begin
|
|
468
|
+
// Example 1: Customer-based queries - Use CustomerDateKey
|
|
469
|
+
PerfEntry.Reset();
|
|
470
|
+
PerfEntry.SetCurrentKey("Customer No.", "Posting Date"); // Explicit key selection
|
|
471
|
+
PerfEntry.SetRange("Customer No.", 'C001');
|
|
472
|
+
PerfEntry.SetRange("Posting Date", CalcDate('<-1M>', Today), Today);
|
|
473
|
+
// This query will use CustomerDateKey index efficiently
|
|
474
|
+
|
|
475
|
+
// Example 2: Date range queries - Use DateCustomerKey
|
|
476
|
+
PerfEntry.Reset();
|
|
477
|
+
PerfEntry.SetCurrentKey("Posting Date", "Customer No.");
|
|
478
|
+
PerfEntry.SetRange("Posting Date", CalcDate('<-1W>', Today), Today);
|
|
479
|
+
// This query will use DateCustomerKey index efficiently
|
|
480
|
+
|
|
481
|
+
// Example 3: Document lookup - Use DocumentKey
|
|
482
|
+
PerfEntry.Reset();
|
|
483
|
+
PerfEntry.SetCurrentKey("Document No.");
|
|
484
|
+
PerfEntry.SetRange("Document No.", 'INV-12345');
|
|
485
|
+
// This query will use DocumentKey index efficiently
|
|
486
|
+
|
|
487
|
+
// Example 4: External integration - Use ExternalDocKey
|
|
488
|
+
PerfEntry.Reset();
|
|
489
|
+
PerfEntry.SetCurrentKey("External Document No.");
|
|
490
|
+
PerfEntry.SetRange("External Document No.", 'EXT-789');
|
|
491
|
+
// This query will use ExternalDocKey index efficiently
|
|
492
|
+
end;
|
|
493
|
+
|
|
494
|
+
procedure DemonstrateSIFTUsage()
|
|
495
|
+
var
|
|
496
|
+
PerfEntry: Record "API Performance Demo";
|
|
497
|
+
TotalAmount: Decimal;
|
|
498
|
+
begin
|
|
499
|
+
// SIFT aggregation using optimized key
|
|
500
|
+
PerfEntry.Reset();
|
|
501
|
+
PerfEntry.SetCurrentKey("Customer No.", "Posting Date"); // SIFT key
|
|
502
|
+
PerfEntry.SetRange("Customer No.", 'C001');
|
|
503
|
+
PerfEntry.SetRange("Posting Date", CalcDate('<-CY>', Today), Today);
|
|
504
|
+
|
|
505
|
+
// This leverages the SIFT index for fast aggregation
|
|
506
|
+
PerfEntry.CalcSums(Amount);
|
|
507
|
+
TotalAmount := PerfEntry.Amount;
|
|
508
|
+
|
|
509
|
+
// Equivalent OData query:
|
|
510
|
+
// GET /api/performanceEntries?$filter=customerNo eq 'C001' and postingDate ge 2024-01-01
|
|
511
|
+
// &$apply=aggregate(amount with sum as total)
|
|
512
|
+
end;
|
|
513
|
+
}
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
## Key Design Patterns for Different API Scenarios
|
|
517
|
+
|
|
518
|
+
```al
|
|
519
|
+
// Pattern 1: Master Data API Table Keys
|
|
520
|
+
table 50133 "API Item Master"
|
|
521
|
+
{
|
|
522
|
+
fields
|
|
523
|
+
{
|
|
524
|
+
field(1; "No."; Code[20]) { }
|
|
525
|
+
field(2; SystemId; Guid) { }
|
|
526
|
+
field(10; Description; Text[100]) { }
|
|
527
|
+
field(20; "Item Category Code"; Code[20]) { }
|
|
528
|
+
field(30; "Unit Price"; Decimal) { }
|
|
529
|
+
field(40; "Last Modified"; DateTime) { }
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
keys
|
|
533
|
+
{
|
|
534
|
+
// Primary key - Business identifier
|
|
535
|
+
key(PK; "No.") { Clustered = true; }
|
|
536
|
+
|
|
537
|
+
// SystemId - Required for OData
|
|
538
|
+
key(SystemIdKey; SystemId) { Unique = true; }
|
|
539
|
+
|
|
540
|
+
// Category grouping - Common filter
|
|
541
|
+
key(CategoryKey; "Item Category Code", "No.") { }
|
|
542
|
+
|
|
543
|
+
// Text search - Description lookups
|
|
544
|
+
key(DescriptionKey; Description) { }
|
|
545
|
+
|
|
546
|
+
// Sync/delta queries - Modified date
|
|
547
|
+
key(ModifiedKey; "Last Modified", "No.") { }
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// Pattern 2: Transaction Data API Table Keys
|
|
552
|
+
table 50134 "API Transaction Log"
|
|
553
|
+
{
|
|
554
|
+
fields
|
|
555
|
+
{
|
|
556
|
+
field(1; "Entry No."; BigInteger) { AutoIncrement = true; }
|
|
557
|
+
field(2; SystemId; Guid) { }
|
|
558
|
+
field(10; "Transaction Type"; Code[20]) { }
|
|
559
|
+
field(20; "Source ID"; Code[50]) { }
|
|
560
|
+
field(30; "Timestamp"; DateTime) { }
|
|
561
|
+
field(40; "User ID"; Code[50]) { }
|
|
562
|
+
field(50; Amount; Decimal) { }
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
keys
|
|
566
|
+
{
|
|
567
|
+
// Primary key - Sequential for performance
|
|
568
|
+
key(PK; "Entry No.") { Clustered = true; }
|
|
569
|
+
|
|
570
|
+
// SystemId - OData requirement
|
|
571
|
+
key(SystemIdKey; SystemId) { Unique = true; }
|
|
572
|
+
|
|
573
|
+
// Time-based queries - Most common pattern
|
|
574
|
+
key(TimeKey; "Timestamp", "Transaction Type")
|
|
575
|
+
{
|
|
576
|
+
IncludedFields = "Source ID", Amount; // Covering index
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// Source tracking - Integration scenarios
|
|
580
|
+
key(SourceKey; "Source ID", "Transaction Type", "Timestamp") { }
|
|
581
|
+
|
|
582
|
+
// User activity - Audit queries
|
|
583
|
+
key(UserKey; "User ID", "Timestamp") { }
|
|
584
|
+
|
|
585
|
+
// Type-based aggregations - Reporting
|
|
586
|
+
key(TypeAggKey; "Transaction Type", "Timestamp")
|
|
587
|
+
{
|
|
588
|
+
SumIndexFields = Amount;
|
|
589
|
+
MaintainSiftIndex = false; // On-demand for large tables
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// Pattern 3: Hierarchical Data API Table Keys
|
|
595
|
+
table 50135 "API Organization Unit"
|
|
596
|
+
{
|
|
597
|
+
fields
|
|
598
|
+
{
|
|
599
|
+
field(1; "Code"; Code[20]) { }
|
|
600
|
+
field(2; SystemId; Guid) { }
|
|
601
|
+
field(10; Name; Text[100]) { }
|
|
602
|
+
field(20; "Parent Code"; Code[20]) { }
|
|
603
|
+
field(30; Level; Integer) { }
|
|
604
|
+
field(40; "Full Path"; Text[250]) { }
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
keys
|
|
608
|
+
{
|
|
609
|
+
// Primary key - Business code
|
|
610
|
+
key(PK; "Code") { Clustered = true; }
|
|
611
|
+
|
|
612
|
+
// SystemId - OData standard
|
|
613
|
+
key(SystemIdKey; SystemId) { Unique = true; }
|
|
614
|
+
|
|
615
|
+
// Hierarchy navigation - Parent-child
|
|
616
|
+
key(ParentKey; "Parent Code", "Code") { }
|
|
617
|
+
|
|
618
|
+
// Level-based queries - Reporting
|
|
619
|
+
key(LevelKey; Level, "Code") { }
|
|
620
|
+
|
|
621
|
+
// Path-based searches - Tree operations
|
|
622
|
+
key(PathKey; "Full Path") { }
|
|
623
|
+
|
|
624
|
+
// Name searches - User lookups
|
|
625
|
+
key(NameKey; Name) { }
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
## Implementation Notes
|
|
631
|
+
|
|
632
|
+
**Primary Key Design Principles:**
|
|
633
|
+
- Use business-meaningful keys when possible (No., Code)
|
|
634
|
+
- Consider sequential keys (AutoIncrement) for high-volume transaction data
|
|
635
|
+
- Ensure primary key supports typical query patterns
|
|
636
|
+
- Keep composite keys as narrow as possible for performance
|
|
637
|
+
|
|
638
|
+
**SystemId Key Requirements:**
|
|
639
|
+
- MUST be present and unique for all API tables
|
|
640
|
+
- Used by OData for entity identification and operations
|
|
641
|
+
- Automatically maintained by BC platform
|
|
642
|
+
- Required for proper ETag and concurrency control
|
|
643
|
+
|
|
644
|
+
**Query Optimization Keys:**
|
|
645
|
+
- Design keys based on common API filter patterns
|
|
646
|
+
- Use IncludedFields for covering indexes when beneficial
|
|
647
|
+
- Consider key order: most selective fields first
|
|
648
|
+
- Balance between query performance and maintenance overhead
|
|
649
|
+
|
|
650
|
+
**SIFT Key Considerations:**
|
|
651
|
+
- Use MaintainSiftIndex = true for frequently accessed aggregations
|
|
652
|
+
- Use MaintainSiftIndex = false for large tables with infrequent aggregations
|
|
653
|
+
- Include only necessary fields in SumIndexFields
|
|
654
|
+
- Monitor SIFT maintenance impact on write operations
|
|
655
|
+
|
|
656
|
+
**Performance Testing:**
|
|
657
|
+
- Test key effectiveness with realistic data volumes
|
|
658
|
+
- Monitor query execution plans in SQL Server
|
|
659
|
+
- Validate API response times meet requirements
|
|
660
|
+
- Consider storage overhead of additional indexes
|
|
661
|
+
|
|
662
|
+
**Key Maintenance:**
|
|
663
|
+
- Regularly review key usage statistics
|
|
664
|
+
- Remove unused keys to improve write performance
|
|
665
|
+
- Update key design as API usage patterns evolve
|
|
666
|
+
- Document key design decisions for team knowledge
|