bc-code-intelligence-mcp 1.3.3 → 1.3.4
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/dist/config/test-enhanced-layer-service.js +10 -10
- package/dist/config/test-enhanced-layer-service.js.map +1 -1
- package/dist/dev/hot-reload.d.ts +2 -2
- package/dist/dev/hot-reload.d.ts.map +1 -1
- package/dist/dev/hot-reload.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -38
- package/dist/index.js.map +1 -1
- package/dist/layers/index.d.ts +1 -1
- package/dist/layers/index.d.ts.map +1 -1
- package/dist/layers/index.js +1 -1
- package/dist/layers/index.js.map +1 -1
- package/dist/services/code-analysis-service.d.ts.map +1 -1
- package/dist/services/code-analysis-service.js +4 -0
- package/dist/services/code-analysis-service.js.map +1 -1
- package/dist/services/knowledge-service.d.ts +21 -10
- package/dist/services/knowledge-service.d.ts.map +1 -1
- package/dist/services/knowledge-service.js +71 -54
- package/dist/services/knowledge-service.js.map +1 -1
- package/dist/services/multi-content-layer-service.d.ts +90 -0
- package/dist/services/multi-content-layer-service.d.ts.map +1 -1
- package/dist/services/multi-content-layer-service.js +380 -0
- package/dist/services/multi-content-layer-service.js.map +1 -1
- package/dist/services/workflow-service.d.ts +11 -3
- package/dist/services/workflow-service.d.ts.map +1 -1
- package/dist/services/workflow-service.js +119 -78
- package/dist/services/workflow-service.js.map +1 -1
- package/dist/streamlined-handlers.d.ts +31 -2
- package/dist/streamlined-handlers.d.ts.map +1 -1
- package/dist/streamlined-handlers.js +151 -109
- package/dist/streamlined-handlers.js.map +1 -1
- package/dist/streamlined-tools.d.ts +12 -0
- package/dist/streamlined-tools.d.ts.map +1 -1
- package/dist/streamlined-tools.js +11 -6
- package/dist/streamlined-tools.js.map +1 -1
- package/package.json +13 -4
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +0 -24
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +0 -24
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +0 -30
- package/embedded-knowledge/AGENTS.md +0 -178
- package/embedded-knowledge/CONTRIBUTING.md +0 -58
- package/embedded-knowledge/LICENSE +0 -21
- package/embedded-knowledge/README.md +0 -32
- package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +0 -90
- package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +0 -113
- package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +0 -101
- package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +0 -87
- package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +0 -155
- package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +0 -138
- package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +0 -79
- package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +0 -280
- package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +0 -200
- package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +0 -565
- package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +0 -665
- package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +0 -325
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +0 -696
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +0 -320
- package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +0 -102
- package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +0 -433
- package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +0 -66
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +0 -115
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +0 -360
- package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +0 -86
- package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +0 -96
- package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +0 -70
- package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +0 -84
- package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +0 -93
- package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +0 -73
- package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +0 -78
- package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +0 -79
- package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +0 -87
- package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +0 -209
- package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +0 -246
- package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +0 -107
- package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +0 -105
- package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +0 -186
- package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +0 -60
- package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +0 -139
- package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +0 -190
- package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +0 -516
- package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +0 -298
- package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +0 -324
- package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +0 -344
- package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +0 -137
- package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +0 -340
- package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +0 -810
- package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +0 -86
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +0 -110
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +0 -758
- package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +0 -665
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +0 -316
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +0 -223
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +0 -149
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +0 -412
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +0 -211
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +0 -155
- package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +0 -475
- package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +0 -238
- package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +0 -97
- package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +0 -666
- package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +0 -319
- package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +0 -236
- package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +0 -59
- package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +0 -67
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +0 -70
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +0 -90
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +0 -87
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +0 -70
- package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +0 -74
- package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +0 -81
- package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +0 -56
- package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +0 -66
- package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +0 -79
- package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +0 -78
- package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +0 -83
- package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +0 -76
- package/embedded-knowledge/domains/dean-debug/testfield-performance.md +0 -104
- package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +0 -145
- package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +0 -104
- package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +0 -114
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +0 -356
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +0 -256
- package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +0 -101
- package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +0 -108
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +0 -80
- package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +0 -98
- package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +0 -123
- package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +0 -96
- package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +0 -115
- package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +0 -115
- package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +0 -114
- package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +0 -395
- package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +0 -479
- package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +0 -548
- package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +0 -287
- package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +0 -434
- package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +0 -508
- package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +0 -615
- package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +0 -144
- package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +0 -96
- package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +0 -124
- package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +0 -84
- package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +0 -75
- package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +0 -96
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +0 -385
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +0 -72
- package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +0 -48
- package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +0 -49
- package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +0 -67
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +0 -119
- package/embedded-knowledge/domains/quinn-tester/rule-execution.md +0 -123
- package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +0 -64
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +0 -60
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +0 -83
- package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +0 -716
- package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +0 -101
- package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +0 -91
- package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +0 -79
- package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +0 -79
- package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +0 -89
- package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +0 -81
- package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +0 -75
- package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +0 -96
- package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +0 -86
- package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +0 -90
- package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +0 -82
- package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +0 -78
- package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +0 -76
- package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +0 -78
- package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +0 -100
- package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +0 -115
- package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +0 -124
- package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +0 -110
- package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +0 -438
- package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +0 -255
- package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +0 -209
- package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +0 -218
- package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +0 -218
- package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +0 -280
- package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +0 -188
- package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +0 -245
- package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +0 -244
- package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +0 -278
- package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +0 -484
- package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +0 -64
- package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +0 -107
- package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +0 -280
- package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +0 -75
- package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +0 -67
- package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +0 -76
- package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +0 -98
- package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +0 -128
- package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +0 -75
- package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +0 -95
- package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +0 -141
- package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +0 -91
- package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +0 -118
- package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +0 -111
- package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +0 -113
- package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +0 -127
- package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +0 -141
- package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +0 -66
- package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +0 -96
- package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +0 -161
- package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +0 -177
- package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +0 -239
- package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +0 -346
- package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +0 -298
- package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +0 -677
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +0 -117
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +0 -75
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +0 -169
- package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +0 -399
- package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +0 -356
- package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +0 -889
- package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +0 -84
- package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +0 -127
- package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +0 -89
- package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +0 -516
- package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +0 -61
- package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +0 -427
- package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +0 -122
- package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +0 -96
- package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +0 -101
- package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +0 -149
- package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +0 -107
- package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +0 -95
- package/embedded-knowledge/domains/seth-security/api-permission-model.md +0 -115
- package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +0 -78
- package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +0 -373
- package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +0 -308
- package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +0 -146
- package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +0 -79
- package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +0 -78
- package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +0 -81
- package/embedded-knowledge/indexes/bc-version-matrix.json +0 -188
- package/embedded-knowledge/indexes/domain-catalog.json +0 -106
- package/embedded-knowledge/indexes/tags/abbreviations.json +0 -1
- package/embedded-knowledge/indexes/tags/abstraction.json +0 -1
- package/embedded-knowledge/indexes/tags/access-control.json +0 -1
- package/embedded-knowledge/indexes/tags/accessibility.json +0 -1
- package/embedded-knowledge/indexes/tags/actions.json +0 -1
- package/embedded-knowledge/indexes/tags/advanced-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/advanced.json +0 -1
- package/embedded-knowledge/indexes/tags/al-extension.json +0 -1
- package/embedded-knowledge/indexes/tags/al-generics.json +0 -1
- package/embedded-knowledge/indexes/tags/al-objects.json +0 -1
- package/embedded-knowledge/indexes/tags/al-syntax.json +0 -1
- package/embedded-knowledge/indexes/tags/algorithm-structure.json +0 -1
- package/embedded-knowledge/indexes/tags/alternatives.json +0 -1
- package/embedded-knowledge/indexes/tags/analytics.json +0 -1
- package/embedded-knowledge/indexes/tags/api-delegates.json +0 -1
- package/embedded-knowledge/indexes/tags/api-design.json +0 -1
- package/embedded-knowledge/indexes/tags/api-documentation.json +0 -1
- package/embedded-knowledge/indexes/tags/api-endpoints.json +0 -1
- package/embedded-knowledge/indexes/tags/api-extensibility.json +0 -1
- package/embedded-knowledge/indexes/tags/api-fieldsets.json +0 -1
- package/embedded-knowledge/indexes/tags/api-integration.json +0 -1
- package/embedded-knowledge/indexes/tags/api-interfaces.json +0 -1
- package/embedded-knowledge/indexes/tags/api-optimization.json +0 -1
- package/embedded-knowledge/indexes/tags/api-pages.json +0 -1
- package/embedded-knowledge/indexes/tags/api-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/api-permissions.json +0 -1
- package/embedded-knowledge/indexes/tags/api-responses.json +0 -1
- package/embedded-knowledge/indexes/tags/api-simplification.json +0 -1
- package/embedded-knowledge/indexes/tags/api.json +0 -1
- package/embedded-knowledge/indexes/tags/architecture.json +0 -1
- package/embedded-knowledge/indexes/tags/async-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/async-processing.json +0 -1
- package/embedded-knowledge/indexes/tags/automatic-registration.json +0 -1
- package/embedded-knowledge/indexes/tags/batch-operations.json +0 -1
- package/embedded-knowledge/indexes/tags/bc24-migration.json +0 -1
- package/embedded-knowledge/indexes/tags/begin-blocks.json +0 -1
- package/embedded-knowledge/indexes/tags/begin-end.json +0 -1
- package/embedded-knowledge/indexes/tags/behavioral-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/best-practices.json +0 -1
- package/embedded-knowledge/indexes/tags/binding.json +0 -1
- package/embedded-knowledge/indexes/tags/block-structure.json +0 -1
- package/embedded-knowledge/indexes/tags/blocks.json +0 -1
- package/embedded-knowledge/indexes/tags/boolean-expressions.json +0 -1
- package/embedded-knowledge/indexes/tags/branching.json +0 -1
- package/embedded-knowledge/indexes/tags/breaking-changes.json +0 -1
- package/embedded-knowledge/indexes/tags/breakpoints.json +0 -1
- package/embedded-knowledge/indexes/tags/business-foundation.json +0 -1
- package/embedded-knowledge/indexes/tags/business-infrastructure.json +0 -1
- package/embedded-knowledge/indexes/tags/business-process.json +0 -1
- package/embedded-knowledge/indexes/tags/business-rules.json +0 -1
- package/embedded-knowledge/indexes/tags/caching.json +0 -1
- package/embedded-knowledge/indexes/tags/case-statements.json +0 -1
- package/embedded-knowledge/indexes/tags/case.json +0 -1
- package/embedded-knowledge/indexes/tags/code-analysis.json +0 -1
- package/embedded-knowledge/indexes/tags/code-clarity.json +0 -1
- package/embedded-knowledge/indexes/tags/code-comprehension.json +0 -1
- package/embedded-knowledge/indexes/tags/code-conversion.json +0 -1
- package/embedded-knowledge/indexes/tags/code-formatting.json +0 -1
- package/embedded-knowledge/indexes/tags/code-organization.json +0 -1
- package/embedded-knowledge/indexes/tags/code-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/code-quality.json +0 -1
- package/embedded-knowledge/indexes/tags/code-reuse.json +0 -1
- package/embedded-knowledge/indexes/tags/code-simplification.json +0 -1
- package/embedded-knowledge/indexes/tags/code-standards.json +0 -1
- package/embedded-knowledge/indexes/tags/code-structure.json +0 -1
- package/embedded-knowledge/indexes/tags/code-style.json +0 -1
- package/embedded-knowledge/indexes/tags/codeunit-design.json +0 -1
- package/embedded-knowledge/indexes/tags/command-queue.json +0 -1
- package/embedded-knowledge/indexes/tags/comments.json +0 -1
- package/embedded-knowledge/indexes/tags/compile-time-validation.json +0 -1
- package/embedded-knowledge/indexes/tags/complex-facade.json +0 -1
- package/embedded-knowledge/indexes/tags/complexity-hiding.json +0 -1
- package/embedded-knowledge/indexes/tags/complexity-management.json +0 -1
- package/embedded-knowledge/indexes/tags/compound-statements.json +0 -1
- package/embedded-knowledge/indexes/tags/concurrency.json +0 -1
- package/embedded-knowledge/indexes/tags/conditional-logic.json +0 -1
- package/embedded-knowledge/indexes/tags/conditional.json +0 -1
- package/embedded-knowledge/indexes/tags/conflict-resolution.json +0 -1
- package/embedded-knowledge/indexes/tags/consistency.json +0 -1
- package/embedded-knowledge/indexes/tags/contract-design.json +0 -1
- package/embedded-knowledge/indexes/tags/control-flow.json +0 -1
- package/embedded-knowledge/indexes/tags/conversion-guide.json +0 -1
- package/embedded-knowledge/indexes/tags/correlation.json +0 -1
- package/embedded-knowledge/indexes/tags/custom-messages.json +0 -1
- package/embedded-knowledge/indexes/tags/data-access.json +0 -1
- package/embedded-knowledge/indexes/tags/data-exposure.json +0 -1
- package/embedded-knowledge/indexes/tags/data-integrity.json +0 -1
- package/embedded-knowledge/indexes/tags/data-loading.json +0 -1
- package/embedded-knowledge/indexes/tags/data-manipulation.json +0 -1
- package/embedded-knowledge/indexes/tags/data-modeling.json +0 -1
- package/embedded-knowledge/indexes/tags/data-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/data-protection.json +0 -1
- package/embedded-knowledge/indexes/tags/data-validation.json +0 -1
- package/embedded-knowledge/indexes/tags/database.json +0 -1
- package/embedded-knowledge/indexes/tags/debugging.json +0 -1
- package/embedded-knowledge/indexes/tags/decision-making.json +0 -1
- package/embedded-knowledge/indexes/tags/declaration.json +0 -1
- package/embedded-knowledge/indexes/tags/default-messages.json +0 -1
- package/embedded-knowledge/indexes/tags/defensive-programming.json +0 -1
- package/embedded-knowledge/indexes/tags/deleteall.json +0 -1
- package/embedded-knowledge/indexes/tags/dependencies.json +0 -1
- package/embedded-knowledge/indexes/tags/deployment.json +0 -1
- package/embedded-knowledge/indexes/tags/developer-productivity.json +0 -1
- package/embedded-knowledge/indexes/tags/development-workflow.json +0 -1
- package/embedded-knowledge/indexes/tags/diagnostics.json +0 -1
- package/embedded-knowledge/indexes/tags/dimensions.json +0 -1
- package/embedded-knowledge/indexes/tags/documentation.json +0 -1
- package/embedded-knowledge/indexes/tags/early-exit.json +0 -1
- package/embedded-knowledge/indexes/tags/else-clauses.json +0 -1
- package/embedded-knowledge/indexes/tags/end-statements.json +0 -1
- package/embedded-knowledge/indexes/tags/enterprise-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/entity-relationships.json +0 -1
- package/embedded-knowledge/indexes/tags/error-handling.json +0 -1
- package/embedded-knowledge/indexes/tags/error-messages.json +0 -1
- package/embedded-knowledge/indexes/tags/error-prevention.json +0 -1
- package/embedded-knowledge/indexes/tags/error-text.json +0 -1
- package/embedded-knowledge/indexes/tags/etag.json +0 -1
- package/embedded-knowledge/indexes/tags/event-bridge.json +0 -1
- package/embedded-knowledge/indexes/tags/event-payload.json +0 -1
- package/embedded-knowledge/indexes/tags/event-routing.json +0 -1
- package/embedded-knowledge/indexes/tags/events.json +0 -1
- package/embedded-knowledge/indexes/tags/execution-flow.json +0 -1
- package/embedded-knowledge/indexes/tags/expressions.json +0 -1
- package/embedded-knowledge/indexes/tags/extensibility.json +0 -1
- package/embedded-knowledge/indexes/tags/extensions.json +0 -1
- package/embedded-knowledge/indexes/tags/facade-composition.json +0 -1
- package/embedded-knowledge/indexes/tags/facade-pattern.json +0 -1
- package/embedded-knowledge/indexes/tags/field-control.json +0 -1
- package/embedded-knowledge/indexes/tags/field-exclusion.json +0 -1
- package/embedded-knowledge/indexes/tags/field-registration.json +0 -1
- package/embedded-knowledge/indexes/tags/field-state.json +0 -1
- package/embedded-knowledge/indexes/tags/field-validation.json +0 -1
- package/embedded-knowledge/indexes/tags/fielderror.json +0 -1
- package/embedded-knowledge/indexes/tags/fields.json +0 -1
- package/embedded-knowledge/indexes/tags/filtering.json +0 -1
- package/embedded-knowledge/indexes/tags/filters.json +0 -1
- package/embedded-knowledge/indexes/tags/formatting.json +0 -1
- package/embedded-knowledge/indexes/tags/generic-methods.json +0 -1
- package/embedded-knowledge/indexes/tags/http-status.json +0 -1
- package/embedded-knowledge/indexes/tags/if-statements.json +0 -1
- package/embedded-knowledge/indexes/tags/implementation.json +0 -1
- package/embedded-knowledge/indexes/tags/indentation.json +0 -1
- package/embedded-knowledge/indexes/tags/index-summary.json +0 -277
- package/embedded-knowledge/indexes/tags/indexing.json +0 -1
- package/embedded-knowledge/indexes/tags/inheritance.json +0 -1
- package/embedded-knowledge/indexes/tags/integration.json +0 -1
- package/embedded-knowledge/indexes/tags/integrity-checking.json +0 -1
- package/embedded-knowledge/indexes/tags/intellisense.json +0 -1
- package/embedded-knowledge/indexes/tags/interface-design.json +0 -1
- package/embedded-knowledge/indexes/tags/interface-segregation.json +0 -1
- package/embedded-knowledge/indexes/tags/isolation.json +0 -1
- package/embedded-knowledge/indexes/tags/job-processing.json +0 -1
- package/embedded-knowledge/indexes/tags/keyboard-navigation.json +0 -1
- package/embedded-knowledge/indexes/tags/keywords.json +0 -1
- package/embedded-knowledge/indexes/tags/legacy-modernization.json +0 -1
- package/embedded-knowledge/indexes/tags/line-breaks.json +0 -1
- package/embedded-knowledge/indexes/tags/line-organization.json +0 -1
- package/embedded-knowledge/indexes/tags/line-positioning.json +0 -1
- package/embedded-knowledge/indexes/tags/localization.json +0 -1
- package/embedded-knowledge/indexes/tags/logging.json +0 -1
- package/embedded-knowledge/indexes/tags/loose-coupling.json +0 -1
- package/embedded-knowledge/indexes/tags/maintainability.json +0 -1
- package/embedded-knowledge/indexes/tags/memory-management.json +0 -1
- package/embedded-knowledge/indexes/tags/memory-optimization.json +0 -1
- package/embedded-knowledge/indexes/tags/memory.json +0 -1
- package/embedded-knowledge/indexes/tags/message-design.json +0 -1
- package/embedded-knowledge/indexes/tags/message-formatting.json +0 -1
- package/embedded-knowledge/indexes/tags/message-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/metadata-driven.json +0 -1
- package/embedded-knowledge/indexes/tags/method-comparison.json +0 -1
- package/embedded-knowledge/indexes/tags/module-architecture.json +0 -1
- package/embedded-knowledge/indexes/tags/module-validation.json +0 -1
- package/embedded-knowledge/indexes/tags/monitoring.json +0 -1
- package/embedded-knowledge/indexes/tags/multi-layer-facade.json +0 -1
- package/embedded-knowledge/indexes/tags/multi-tenancy.json +0 -1
- package/embedded-knowledge/indexes/tags/multiple-values.json +0 -1
- package/embedded-knowledge/indexes/tags/naming-conventions.json +0 -1
- package/embedded-knowledge/indexes/tags/naming.json +0 -1
- package/embedded-knowledge/indexes/tags/navigation.json +0 -1
- package/embedded-knowledge/indexes/tags/nested-statements.json +0 -1
- package/embedded-knowledge/indexes/tags/no-series-conversion.json +0 -1
- package/embedded-knowledge/indexes/tags/no-series-validation.json +0 -1
- package/embedded-knowledge/indexes/tags/no-series.json +0 -1
- package/embedded-knowledge/indexes/tags/number-generation.json +0 -1
- package/embedded-knowledge/indexes/tags/object-documentation.json +0 -1
- package/embedded-knowledge/indexes/tags/odata.json +0 -1
- package/embedded-knowledge/indexes/tags/ondelete.json +0 -1
- package/embedded-knowledge/indexes/tags/onvalidate.json +0 -1
- package/embedded-knowledge/indexes/tags/operation-delegation.json +0 -1
- package/embedded-knowledge/indexes/tags/operation-safety.json +0 -1
- package/embedded-knowledge/indexes/tags/operators.json +0 -1
- package/embedded-knowledge/indexes/tags/optimization.json +0 -1
- package/embedded-knowledge/indexes/tags/order.json +0 -1
- package/embedded-knowledge/indexes/tags/organization.json +0 -1
- package/embedded-knowledge/indexes/tags/pages.json +0 -1
- package/embedded-knowledge/indexes/tags/parameters.json +0 -1
- package/embedded-knowledge/indexes/tags/patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/performance-optimization.json +0 -1
- package/embedded-knowledge/indexes/tags/performance.json +0 -1
- package/embedded-knowledge/indexes/tags/placement.json +0 -1
- package/embedded-knowledge/indexes/tags/posting-codeunits.json +0 -1
- package/embedded-knowledge/indexes/tags/posting.json +0 -1
- package/embedded-knowledge/indexes/tags/preconditions.json +0 -1
- package/embedded-knowledge/indexes/tags/primary-key.json +0 -1
- package/embedded-knowledge/indexes/tags/privacy.json +0 -1
- package/embedded-knowledge/indexes/tags/process-automation.json +0 -1
- package/embedded-knowledge/indexes/tags/production.json +0 -1
- package/embedded-knowledge/indexes/tags/productivity.json +0 -1
- package/embedded-knowledge/indexes/tags/query-performance.json +0 -1
- package/embedded-knowledge/indexes/tags/queue-management.json +0 -1
- package/embedded-knowledge/indexes/tags/ranges.json +0 -1
- package/embedded-knowledge/indexes/tags/readability.json +0 -1
- package/embedded-knowledge/indexes/tags/record-access.json +0 -1
- package/embedded-knowledge/indexes/tags/record-methods.json +0 -1
- package/embedded-knowledge/indexes/tags/refactoring.json +0 -1
- package/embedded-knowledge/indexes/tags/reference.json +0 -1
- package/embedded-knowledge/indexes/tags/repeat-loops.json +0 -1
- package/embedded-knowledge/indexes/tags/repeat-statement.json +0 -1
- package/embedded-knowledge/indexes/tags/runtime-errors.json +0 -1
- package/embedded-knowledge/indexes/tags/runtime.json +0 -1
- package/embedded-knowledge/indexes/tags/safeguards.json +0 -1
- package/embedded-knowledge/indexes/tags/security.json +0 -1
- package/embedded-knowledge/indexes/tags/sequence-management.json +0 -1
- package/embedded-knowledge/indexes/tags/serialization.json +0 -1
- package/embedded-knowledge/indexes/tags/session-logmessage.json +0 -1
- package/embedded-knowledge/indexes/tags/session.json +0 -1
- package/embedded-knowledge/indexes/tags/setloadfields.json +0 -1
- package/embedded-knowledge/indexes/tags/shortcuts.json +0 -1
- package/embedded-knowledge/indexes/tags/sift.json +0 -1
- package/embedded-knowledge/indexes/tags/singleinstance.json +0 -1
- package/embedded-knowledge/indexes/tags/spacing.json +0 -1
- package/embedded-knowledge/indexes/tags/sql-translation.json +0 -1
- package/embedded-knowledge/indexes/tags/standards.json +0 -1
- package/embedded-knowledge/indexes/tags/statements.json +0 -1
- package/embedded-knowledge/indexes/tags/streaming.json +0 -1
- package/embedded-knowledge/indexes/tags/strong-typing.json +0 -1
- package/embedded-knowledge/indexes/tags/structural-patterns.json +0 -1
- package/embedded-knowledge/indexes/tags/structure.json +0 -1
- package/embedded-knowledge/indexes/tags/subscribers.json +0 -1
- package/embedded-knowledge/indexes/tags/switch.json +0 -1
- package/embedded-knowledge/indexes/tags/symbol-search.json +0 -1
- package/embedded-knowledge/indexes/tags/syntax.json +0 -1
- package/embedded-knowledge/indexes/tags/systemid.json +0 -1
- package/embedded-knowledge/indexes/tags/table-configuration.json +0 -1
- package/embedded-knowledge/indexes/tags/table-events.json +0 -1
- package/embedded-knowledge/indexes/tags/table-keys.json +0 -1
- package/embedded-knowledge/indexes/tags/table-safety.json +0 -1
- package/embedded-knowledge/indexes/tags/task-scheduler.json +0 -1
- package/embedded-knowledge/indexes/tags/telemetry.json +0 -1
- package/embedded-knowledge/indexes/tags/template-method.json +0 -1
- package/embedded-knowledge/indexes/tags/temporary-tables.json +0 -1
- package/embedded-knowledge/indexes/tags/testfield.json +0 -1
- package/embedded-knowledge/indexes/tags/tradeoffs.json +0 -1
- package/embedded-knowledge/indexes/tags/triggers.json +0 -1
- package/embedded-knowledge/indexes/tags/troubleshooting.json +0 -1
- package/embedded-knowledge/indexes/tags/type-safety.json +0 -1
- package/embedded-knowledge/indexes/tags/url-structure.json +0 -1
- package/embedded-knowledge/indexes/tags/user-experience.json +0 -1
- package/embedded-knowledge/indexes/tags/user-feedback.json +0 -1
- package/embedded-knowledge/indexes/tags/user-interface.json +0 -1
- package/embedded-knowledge/indexes/tags/validation-feedback.json +0 -1
- package/embedded-knowledge/indexes/tags/validation.json +0 -1
- package/embedded-knowledge/indexes/tags/variables.json +0 -1
- package/embedded-knowledge/indexes/tags/verbosity.json +0 -1
- package/embedded-knowledge/indexes/tags/vs-code.json +0 -1
- package/embedded-knowledge/indexes/tags/web-services.json +0 -1
- package/embedded-knowledge/indexes/tags/workflow-management.json +0 -1
- package/embedded-knowledge/indexes/tags/workflow-optimization.json +0 -1
- package/embedded-knowledge/indexes/tags/workflow-templates.json +0 -1
- package/embedded-knowledge/indexes/tags/workspace.json +0 -1
- package/embedded-knowledge/indexes/tags/xml-documentation.json +0 -1
- package/embedded-knowledge/indexes/topic-relationships.json +0 -128
- package/embedded-knowledge/methodologies/index.json +0 -81
- package/embedded-knowledge/methodologies/phases/analysis-full.md +0 -208
- package/embedded-knowledge/methodologies/phases/analysis-quick.md +0 -44
- package/embedded-knowledge/methodologies/phases/analysis.md +0 -182
- package/embedded-knowledge/methodologies/phases/execution-validation-full.md +0 -174
- package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +0 -31
- package/embedded-knowledge/methodologies/phases/execution-validation.md +0 -174
- package/embedded-knowledge/methodologies/phases/performance-full.md +0 -211
- package/embedded-knowledge/methodologies/phases/performance-quick.md +0 -32
- package/embedded-knowledge/methodologies/phases/performance.md +0 -211
- package/embedded-knowledge/methodologies/phases/verification-full.md +0 -162
- package/embedded-knowledge/methodologies/phases/verification-quick.md +0 -48
- package/embedded-knowledge/methodologies/phases/verification.md +0 -146
- package/embedded-knowledge/methodologies/workflow-enforcement.md +0 -142
- package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +0 -99
- package/embedded-knowledge/specialists/alex-architect.md +0 -216
- package/embedded-knowledge/specialists/casey-copilot.md +0 -226
- package/embedded-knowledge/specialists/chris-config.md +0 -267
- package/embedded-knowledge/specialists/dean-debug.md +0 -222
- package/embedded-knowledge/specialists/eva-errors.md +0 -235
- package/embedded-knowledge/specialists/jordan-bridge.md +0 -235
- package/embedded-knowledge/specialists/logan-legacy.md +0 -209
- package/embedded-knowledge/specialists/maya-mentor.md +0 -211
- package/embedded-knowledge/specialists/morgan-market.md +0 -226
- package/embedded-knowledge/specialists/quinn-tester.md +0 -235
- package/embedded-knowledge/specialists/roger-reviewer.md +0 -234
- package/embedded-knowledge/specialists/sam-coder.md +0 -359
- package/embedded-knowledge/specialists/seth-security.md +0 -235
- package/embedded-knowledge/specialists/taylor-docs.md +0 -257
- package/embedded-knowledge/specialists/uma-ux.md +0 -235
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
# DeleteAll SQL Translation and Performance - Examples
|
|
2
|
-
|
|
3
|
-
## Performance Comparison: DeleteAll vs Loop
|
|
4
|
-
|
|
5
|
-
```al
|
|
6
|
-
// High-Performance Approach: DeleteAll for bulk operations
|
|
7
|
-
// Translates to single SQL DELETE statement
|
|
8
|
-
codeunit 50200 "Order Cleanup Manager"
|
|
9
|
-
{
|
|
10
|
-
procedure CleanupOldOrders(CutoffDate: Date): Integer
|
|
11
|
-
var
|
|
12
|
-
SalesHeader: Record "Sales Header";
|
|
13
|
-
DeletedCount: Integer;
|
|
14
|
-
begin
|
|
15
|
-
// Single SQL operation - optimal for large datasets
|
|
16
|
-
SalesHeader.SetRange("Document Type", SalesHeader."Document Type"::Quote);
|
|
17
|
-
SalesHeader.SetFilter("Document Date", '<%1', CutoffDate);
|
|
18
|
-
SalesHeader.SetRange(Status, SalesHeader.Status::Open);
|
|
19
|
-
|
|
20
|
-
// Count before deletion for reporting
|
|
21
|
-
DeletedCount := SalesHeader.Count();
|
|
22
|
-
|
|
23
|
-
// Execute as single SQL DELETE statement
|
|
24
|
-
// SQL: DELETE FROM "Sales Header" WHERE "Document Type" = 1
|
|
25
|
-
// AND "Document Date" < @CutoffDate AND Status = 0
|
|
26
|
-
SalesHeader.DeleteAll();
|
|
27
|
-
|
|
28
|
-
exit(DeletedCount);
|
|
29
|
-
end;
|
|
30
|
-
|
|
31
|
-
procedure CleanupByStatus(DocumentType: Enum "Sales Document Type"; StatusFilter: Text)
|
|
32
|
-
var
|
|
33
|
-
SalesHeader: Record "Sales Header";
|
|
34
|
-
begin
|
|
35
|
-
SalesHeader.SetRange("Document Type", DocumentType);
|
|
36
|
-
SalesHeader.SetFilter(Status, StatusFilter);
|
|
37
|
-
|
|
38
|
-
// Leverages database indexing for optimal performance
|
|
39
|
-
// SQL engine handles WHERE clause optimization
|
|
40
|
-
SalesHeader.DeleteAll();
|
|
41
|
-
end;
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Event Bypass Behavior
|
|
46
|
-
|
|
47
|
-
```al
|
|
48
|
-
// Understanding Event Bypass: DeleteAll skips AL table events
|
|
49
|
-
codeunit 50201 "Archive vs Delete Demo"
|
|
50
|
-
{
|
|
51
|
-
procedure SafeBulkDeletion(var SalesHeader: Record "Sales Header")
|
|
52
|
-
var
|
|
53
|
-
TempSalesHeader: Record "Sales Header" temporary;
|
|
54
|
-
ArchiveManagement: Codeunit ArchiveManagement;
|
|
55
|
-
begin
|
|
56
|
-
// Collect records for event processing if needed
|
|
57
|
-
if SalesHeader.FindSet() then
|
|
58
|
-
repeat
|
|
59
|
-
TempSalesHeader := SalesHeader;
|
|
60
|
-
TempSalesHeader.Insert();
|
|
61
|
-
until SalesHeader.Next() = 0;
|
|
62
|
-
|
|
63
|
-
// Process AL events manually if required
|
|
64
|
-
if TempSalesHeader.FindSet() then
|
|
65
|
-
repeat
|
|
66
|
-
// Execute necessary validations/archiving before bulk delete
|
|
67
|
-
ArchiveManagement.StoreSalesDocument(TempSalesHeader, false);
|
|
68
|
-
until TempSalesHeader.Next() = 0;
|
|
69
|
-
|
|
70
|
-
// Now safe to use DeleteAll - events already processed
|
|
71
|
-
SalesHeader.DeleteAll();
|
|
72
|
-
end;
|
|
73
|
-
|
|
74
|
-
procedure CompareEventBehavior()
|
|
75
|
-
var
|
|
76
|
-
SalesLine: Record "Sales Line";
|
|
77
|
-
SingleLine: Record "Sales Line";
|
|
78
|
-
begin
|
|
79
|
-
// DELETEALL APPROACH: Events bypassed
|
|
80
|
-
SalesLine.SetRange("Document No.", 'ORDER001');
|
|
81
|
-
SalesLine.DeleteAll(); // OnDelete triggers NOT called
|
|
82
|
-
|
|
83
|
-
// ITERATIVE APPROACH: Events execute
|
|
84
|
-
SingleLine.SetRange("Document No.", 'ORDER002');
|
|
85
|
-
if SingleLine.FindSet() then
|
|
86
|
-
repeat
|
|
87
|
-
SingleLine.Delete(); // OnDelete triggers ARE called
|
|
88
|
-
until SingleLine.Next() = 0;
|
|
89
|
-
end;
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## SQL Translation Patterns
|
|
94
|
-
|
|
95
|
-
```al
|
|
96
|
-
// Filter optimization impacts SQL DELETE performance
|
|
97
|
-
codeunit 50202 "SQL Optimization Examples"
|
|
98
|
-
{
|
|
99
|
-
procedure OptimizedFilters()
|
|
100
|
-
var
|
|
101
|
-
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
102
|
-
begin
|
|
103
|
-
// GOOD: Uses indexed fields for optimal SQL performance
|
|
104
|
-
ItemLedgerEntry.SetRange("Item No.", 'ITEM001');
|
|
105
|
-
ItemLedgerEntry.SetRange("Posting Date", 20240101D, 20241231D);
|
|
106
|
-
ItemLedgerEntry.SetRange("Entry Type", ItemLedgerEntry."Entry Type"::Sale);
|
|
107
|
-
|
|
108
|
-
// SQL: DELETE FROM "Item Ledger Entry"
|
|
109
|
-
// WHERE "Item No." = 'ITEM001'
|
|
110
|
-
// AND "Posting Date" BETWEEN '2024-01-01' AND '2024-12-31'
|
|
111
|
-
// AND "Entry Type" = 1
|
|
112
|
-
// Database can use compound index efficiently
|
|
113
|
-
ItemLedgerEntry.DeleteAll();
|
|
114
|
-
end;
|
|
115
|
-
|
|
116
|
-
procedure SuboptimalFilters()
|
|
117
|
-
var
|
|
118
|
-
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
119
|
-
begin
|
|
120
|
-
// SUBOPTIMAL: Complex filters may require full table scan
|
|
121
|
-
ItemLedgerEntry.SetFilter("Description", '@*SAMPLE*');
|
|
122
|
-
ItemLedgerEntry.SetFilter("Quantity", '>0&<100');
|
|
123
|
-
|
|
124
|
-
// SQL: DELETE FROM "Item Ledger Entry"
|
|
125
|
-
// WHERE "Description" LIKE '%SAMPLE%'
|
|
126
|
-
// AND "Quantity" > 0 AND "Quantity" < 100
|
|
127
|
-
// May require table scan without proper indexing
|
|
128
|
-
ItemLedgerEntry.DeleteAll();
|
|
129
|
-
end;
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
## Transaction Boundary Considerations
|
|
134
|
-
|
|
135
|
-
```al
|
|
136
|
-
// Managing large DeleteAll operations within transaction limits
|
|
137
|
-
codeunit 50203 "Batch Delete Manager"
|
|
138
|
-
{
|
|
139
|
-
procedure LargeBatchDeletion(TableID: Integer; FilterText: Text): Boolean
|
|
140
|
-
var
|
|
141
|
-
RecRef: RecordRef;
|
|
142
|
-
TotalRecords: Integer;
|
|
143
|
-
BatchSize: Integer;
|
|
144
|
-
ProcessedCount: Integer;
|
|
145
|
-
begin
|
|
146
|
-
RecRef.Open(TableID);
|
|
147
|
-
RecRef.SetView(FilterText);
|
|
148
|
-
|
|
149
|
-
TotalRecords := RecRef.Count();
|
|
150
|
-
BatchSize := 10000; // Adjust based on transaction log limits
|
|
151
|
-
|
|
152
|
-
if TotalRecords <= BatchSize then begin
|
|
153
|
-
// Single DeleteAll for smaller datasets
|
|
154
|
-
RecRef.DeleteAll();
|
|
155
|
-
exit(true);
|
|
156
|
-
end;
|
|
157
|
-
|
|
158
|
-
// Process in batches for very large datasets
|
|
159
|
-
repeat
|
|
160
|
-
RecRef.SetView(FilterText);
|
|
161
|
-
if RecRef.FindSet() then begin
|
|
162
|
-
ProcessedCount := 0;
|
|
163
|
-
repeat
|
|
164
|
-
RecRef.Delete();
|
|
165
|
-
ProcessedCount += 1;
|
|
166
|
-
if ProcessedCount >= BatchSize then begin
|
|
167
|
-
Commit(); // Release transaction log space
|
|
168
|
-
RecRef.SetView(FilterText);
|
|
169
|
-
RecRef.FindFirst();
|
|
170
|
-
ProcessedCount := 0;
|
|
171
|
-
end;
|
|
172
|
-
until (RecRef.Next() = 0) or (ProcessedCount >= BatchSize);
|
|
173
|
-
end;
|
|
174
|
-
until RecRef.Count() = 0;
|
|
175
|
-
|
|
176
|
-
exit(true);
|
|
177
|
-
end;
|
|
178
|
-
}
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## Performance Monitoring
|
|
182
|
-
|
|
183
|
-
```al
|
|
184
|
-
// Measuring DeleteAll performance characteristics
|
|
185
|
-
codeunit 50204 "Delete Performance Monitor"
|
|
186
|
-
{
|
|
187
|
-
procedure BenchmarkDeletionMethods(RecordCount: Integer)
|
|
188
|
-
var
|
|
189
|
-
TempInteger: Record "Integer" temporary;
|
|
190
|
-
StartTime: Time;
|
|
191
|
-
DeleteAllTime: Duration;
|
|
192
|
-
IterativeTime: Duration;
|
|
193
|
-
i: Integer;
|
|
194
|
-
begin
|
|
195
|
-
// Setup test data
|
|
196
|
-
for i := 1 to RecordCount do begin
|
|
197
|
-
TempInteger.Number := i;
|
|
198
|
-
TempInteger.Insert();
|
|
199
|
-
end;
|
|
200
|
-
|
|
201
|
-
// Benchmark DeleteAll approach
|
|
202
|
-
StartTime := Time;
|
|
203
|
-
TempInteger.DeleteAll();
|
|
204
|
-
DeleteAllTime := Time - StartTime;
|
|
205
|
-
|
|
206
|
-
// Recreate test data for iterative test
|
|
207
|
-
for i := 1 to RecordCount do begin
|
|
208
|
-
TempInteger.Number := i;
|
|
209
|
-
TempInteger.Insert();
|
|
210
|
-
end;
|
|
211
|
-
|
|
212
|
-
// Benchmark iterative deletion
|
|
213
|
-
StartTime := Time;
|
|
214
|
-
if TempInteger.FindSet() then
|
|
215
|
-
repeat
|
|
216
|
-
TempInteger.Delete();
|
|
217
|
-
until TempInteger.Next() = 0;
|
|
218
|
-
IterativeTime := Time - StartTime;
|
|
219
|
-
|
|
220
|
-
// Log performance comparison
|
|
221
|
-
Message('DeleteAll: %1ms, Iterative: %2ms, Ratio: %3:1',
|
|
222
|
-
DeleteAllTime, IterativeTime,
|
|
223
|
-
Round(IterativeTime / DeleteAllTime, 0.1));
|
|
224
|
-
end;
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
## Anti-Pattern: Mixed Deletion Approaches
|
|
229
|
-
|
|
230
|
-
```al
|
|
231
|
-
// ANTI-PATTERN: Inconsistent deletion methods in same operation
|
|
232
|
-
codeunit 50299 "Deletion Anti-Patterns" // DON'T DO THIS
|
|
233
|
-
{
|
|
234
|
-
procedure InconsistentCleanup(OrderNo: Code[20]) // BAD EXAMPLE
|
|
235
|
-
var
|
|
236
|
-
SalesHeader: Record "Sales Header";
|
|
237
|
-
SalesLine: Record "Sales Line";
|
|
238
|
-
SalesCommentLine: Record "Sales Comment Line";
|
|
239
|
-
begin
|
|
240
|
-
// PROBLEM: Mixing deletion methods without understanding implications
|
|
241
|
-
|
|
242
|
-
// Uses DeleteAll (bypasses events)
|
|
243
|
-
SalesLine.SetRange("Document No.", OrderNo);
|
|
244
|
-
SalesLine.DeleteAll(); // OnDelete events NOT called
|
|
245
|
-
|
|
246
|
-
// Uses iterative deletion (processes events)
|
|
247
|
-
SalesCommentLine.SetRange("Document Type", SalesCommentLine."Document Type"::Order);
|
|
248
|
-
SalesCommentLine.SetRange("No.", OrderNo);
|
|
249
|
-
if SalesCommentLine.FindSet() then
|
|
250
|
-
repeat
|
|
251
|
-
SalesCommentLine.Delete(); // OnDelete events ARE called
|
|
252
|
-
until SalesCommentLine.Next() = 0;
|
|
253
|
-
|
|
254
|
-
// Manual deletion (bypasses AL Delete method entirely)
|
|
255
|
-
SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo);
|
|
256
|
-
SalesHeader.Delete(); // OnDelete events ARE called
|
|
257
|
-
|
|
258
|
-
// PROBLEMS:
|
|
259
|
-
// 1. Inconsistent event processing across related tables
|
|
260
|
-
// 2. Potential data integrity issues from partial event execution
|
|
261
|
-
// 3. Unpredictable behavior for consuming code
|
|
262
|
-
end;
|
|
263
|
-
|
|
264
|
-
procedure UnoptimizedBulkDeletion() // BAD EXAMPLE
|
|
265
|
-
var
|
|
266
|
-
Item: Record Item;
|
|
267
|
-
begin
|
|
268
|
-
// ANTI-PATTERN: Using loop when DeleteAll would be more efficient
|
|
269
|
-
Item.SetRange(Blocked, true);
|
|
270
|
-
Item.SetFilter("Last Date Modified", '<%1', CalcDate('-1Y', Today));
|
|
271
|
-
|
|
272
|
-
// INEFFICIENT: Creates individual SQL DELETE statements
|
|
273
|
-
if Item.FindSet() then
|
|
274
|
-
repeat
|
|
275
|
-
Item.Delete(); // Each iteration = separate SQL statement
|
|
276
|
-
until Item.Next() = 0;
|
|
277
|
-
|
|
278
|
-
// BETTER APPROACH: Single SQL operation
|
|
279
|
-
// Item.DeleteAll(); // One SQL DELETE statement
|
|
280
|
-
end;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/*
|
|
284
|
-
CORRECT DELETEALL USAGE PRINCIPLES:
|
|
285
|
-
|
|
286
|
-
1. Consistency: Use same deletion method for related operations
|
|
287
|
-
2. Event Awareness: Understand which events are bypassed
|
|
288
|
-
3. Performance Priority: Choose DeleteAll for bulk operations
|
|
289
|
-
4. Documentation: Clearly document event bypass behavior
|
|
290
|
-
5. Validation: Ensure database constraints handle integrity
|
|
291
|
-
6. Testing: Verify behavior matches expectations in all scenarios
|
|
292
|
-
|
|
293
|
-
DECISION MATRIX:
|
|
294
|
-
- Large datasets + No critical AL events = DeleteAll
|
|
295
|
-
- Small datasets + Complex AL logic = Iterative deletion
|
|
296
|
-
- Mixed requirements = Separate phases or manual event processing
|
|
297
|
-
*/
|
|
298
|
-
```
|
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
# Error Correlation Implementation Patterns - AL Code Samples
|
|
2
|
-
|
|
3
|
-
## Correlation ID Management
|
|
4
|
-
```al
|
|
5
|
-
codeunit 50140 "Error Correlation Manager"
|
|
6
|
-
{
|
|
7
|
-
var
|
|
8
|
-
CurrentCorrelationId: Text;
|
|
9
|
-
CorrelationIdStack: List of [Text];
|
|
10
|
-
ErrorContext: Dictionary of [Text, Text];
|
|
11
|
-
|
|
12
|
-
// Example 1: Transaction-scoped correlation tracking
|
|
13
|
-
procedure BeginCorrelatedOperation(OperationName: Text): Text
|
|
14
|
-
var
|
|
15
|
-
CorrelationId: Text;
|
|
16
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
17
|
-
begin
|
|
18
|
-
CorrelationId := CreateCorrelationId();
|
|
19
|
-
|
|
20
|
-
// Push current correlation ID to stack for nested operations
|
|
21
|
-
if CurrentCorrelationId <> '' then
|
|
22
|
-
CorrelationIdStack.Add(CurrentCorrelationId);
|
|
23
|
-
|
|
24
|
-
CurrentCorrelationId := CorrelationId;
|
|
25
|
-
|
|
26
|
-
// Initialize error context for this correlation
|
|
27
|
-
ClearErrorContext();
|
|
28
|
-
ErrorContext.Add('OperationName', OperationName);
|
|
29
|
-
ErrorContext.Add('StartTime', Format(CurrentDateTime, 0, 9));
|
|
30
|
-
ErrorContext.Add('UserID', UserId());
|
|
31
|
-
ErrorContext.Add('CompanyName', CompanyName());
|
|
32
|
-
|
|
33
|
-
// Log operation start
|
|
34
|
-
CustomDimensions := BuildCorrelationDimensions(CorrelationId);
|
|
35
|
-
CustomDimensions.Add('EventType', 'OperationStart');
|
|
36
|
-
CustomDimensions.Add('OperationName', OperationName);
|
|
37
|
-
|
|
38
|
-
Session.LogMessage('COR001', StrSubstNo('Operation started: %1', OperationName),
|
|
39
|
-
Verbosity::Verbose, DataClassification::SystemMetadata,
|
|
40
|
-
TelemetryScope::ExtensionPublisher, CustomDimensions);
|
|
41
|
-
|
|
42
|
-
exit(CorrelationId);
|
|
43
|
-
end;
|
|
44
|
-
|
|
45
|
-
procedure EndCorrelatedOperation(CorrelationId: Text; Success: Boolean)
|
|
46
|
-
var
|
|
47
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
48
|
-
Duration: Duration;
|
|
49
|
-
StartTimeText: Text;
|
|
50
|
-
StartTime: DateTime;
|
|
51
|
-
begin
|
|
52
|
-
CustomDimensions := BuildCorrelationDimensions(CorrelationId);
|
|
53
|
-
CustomDimensions.Add('EventType', 'OperationEnd');
|
|
54
|
-
CustomDimensions.Add('Success', Format(Success));
|
|
55
|
-
|
|
56
|
-
// Calculate operation duration
|
|
57
|
-
if ErrorContext.Get('StartTime', StartTimeText) then begin
|
|
58
|
-
if Evaluate(StartTime, StartTimeText) then begin
|
|
59
|
-
Duration := CurrentDateTime - StartTime;
|
|
60
|
-
CustomDimensions.Add('DurationMs', Format(Duration));
|
|
61
|
-
end;
|
|
62
|
-
end;
|
|
63
|
-
|
|
64
|
-
// Add operation context
|
|
65
|
-
AddErrorContextToDimensions(CustomDimensions);
|
|
66
|
-
|
|
67
|
-
Session.LogMessage('COR002',
|
|
68
|
-
StrSubstNo('Operation completed: %1 (Success: %2)',
|
|
69
|
-
ErrorContext.Get('OperationName'), Success),
|
|
70
|
-
Verbosity::Normal, DataClassification::SystemMetadata,
|
|
71
|
-
TelemetryScope::ExtensionPublisher, CustomDimensions);
|
|
72
|
-
|
|
73
|
-
// Restore previous correlation ID
|
|
74
|
-
if CorrelationIdStack.Count > 0 then begin
|
|
75
|
-
CurrentCorrelationId := CorrelationIdStack.Get(CorrelationIdStack.Count);
|
|
76
|
-
CorrelationIdStack.RemoveAt(CorrelationIdStack.Count);
|
|
77
|
-
end else begin
|
|
78
|
-
CurrentCorrelationId := '';
|
|
79
|
-
ClearErrorContext();
|
|
80
|
-
end;
|
|
81
|
-
end;
|
|
82
|
-
|
|
83
|
-
// Example 2: Error correlation with full context capture
|
|
84
|
-
procedure LogCorrelatedError(ErrorMessage: Text; ErrorCode: Text; AdditionalContext: Dictionary of [Text, Text])
|
|
85
|
-
var
|
|
86
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
87
|
-
StackTrace: Text;
|
|
88
|
-
begin
|
|
89
|
-
if CurrentCorrelationId = '' then
|
|
90
|
-
CurrentCorrelationId := CreateCorrelationId();
|
|
91
|
-
|
|
92
|
-
CustomDimensions := BuildCorrelationDimensions(CurrentCorrelationId);
|
|
93
|
-
CustomDimensions.Add('EventType', 'Error');
|
|
94
|
-
CustomDimensions.Add('ErrorCode', ErrorCode);
|
|
95
|
-
CustomDimensions.Add('ErrorMessage', ErrorMessage);
|
|
96
|
-
|
|
97
|
-
// Add error context
|
|
98
|
-
AddErrorContextToDimensions(CustomDimensions);
|
|
99
|
-
|
|
100
|
-
// Add additional context provided by caller
|
|
101
|
-
AddAdditionalContextToDimensions(CustomDimensions, AdditionalContext);
|
|
102
|
-
|
|
103
|
-
// Capture stack trace information
|
|
104
|
-
StackTrace := CaptureStackTrace();
|
|
105
|
-
if StackTrace <> '' then
|
|
106
|
-
CustomDimensions.Add('StackTrace', StackTrace);
|
|
107
|
-
|
|
108
|
-
Session.LogMessage('COR003', StrSubstNo('Correlated error: %1', ErrorMessage),
|
|
109
|
-
Verbosity::Error, DataClassification::SystemMetadata,
|
|
110
|
-
TelemetryScope::ExtensionPublisher, CustomDimensions);
|
|
111
|
-
end;
|
|
112
|
-
|
|
113
|
-
local procedure CreateCorrelationId(): Text
|
|
114
|
-
begin
|
|
115
|
-
exit(CreateGuid());
|
|
116
|
-
end;
|
|
117
|
-
|
|
118
|
-
local procedure BuildCorrelationDimensions(CorrelationId: Text): Dictionary of [Text, Text]
|
|
119
|
-
var
|
|
120
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
121
|
-
begin
|
|
122
|
-
CustomDimensions.Add('CorrelationId', CorrelationId);
|
|
123
|
-
CustomDimensions.Add('SessionId', Format(SessionId()));
|
|
124
|
-
CustomDimensions.Add('UserID', UserId());
|
|
125
|
-
CustomDimensions.Add('CompanyName', CompanyName());
|
|
126
|
-
CustomDimensions.Add('Timestamp', Format(CurrentDateTime, 0, 9));
|
|
127
|
-
exit(CustomDimensions);
|
|
128
|
-
end;
|
|
129
|
-
|
|
130
|
-
local procedure ClearErrorContext()
|
|
131
|
-
begin
|
|
132
|
-
ErrorContext.Clear();
|
|
133
|
-
end;
|
|
134
|
-
|
|
135
|
-
local procedure AddErrorContextToDimensions(var CustomDimensions: Dictionary of [Text, Text])
|
|
136
|
-
var
|
|
137
|
-
Key: Text;
|
|
138
|
-
begin
|
|
139
|
-
foreach Key in ErrorContext.Keys do
|
|
140
|
-
CustomDimensions.Add('Context_' + Key, ErrorContext.Get(Key));
|
|
141
|
-
end;
|
|
142
|
-
|
|
143
|
-
local procedure AddAdditionalContextToDimensions(var CustomDimensions: Dictionary of [Text, Text]; AdditionalContext: Dictionary of [Text, Text])
|
|
144
|
-
var
|
|
145
|
-
Key: Text;
|
|
146
|
-
begin
|
|
147
|
-
foreach Key in AdditionalContext.Keys do
|
|
148
|
-
CustomDimensions.Add(Key, AdditionalContext.Get(Key));
|
|
149
|
-
end;
|
|
150
|
-
|
|
151
|
-
local procedure CaptureStackTrace(): Text
|
|
152
|
-
begin
|
|
153
|
-
// Implement stack trace capture if available
|
|
154
|
-
exit('');
|
|
155
|
-
end;
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
## Cross-Process Error Correlation
|
|
160
|
-
```al
|
|
161
|
-
codeunit 50141 "Cross Process Correlation"
|
|
162
|
-
{
|
|
163
|
-
// Example 3: API integration error correlation
|
|
164
|
-
procedure LogAPICorrelatedCall(APIEndpoint: Text; HTTPMethod: Text; RequestCorrelationId: Text): Text
|
|
165
|
-
var
|
|
166
|
-
CallCorrelationId: Text;
|
|
167
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
168
|
-
begin
|
|
169
|
-
CallCorrelationId := CreateGuid();
|
|
170
|
-
|
|
171
|
-
CustomDimensions.Add('CallCorrelationId', CallCorrelationId);
|
|
172
|
-
CustomDimensions.Add('RequestCorrelationId', RequestCorrelationId);
|
|
173
|
-
CustomDimensions.Add('APIEndpoint', APIEndpoint);
|
|
174
|
-
CustomDimensions.Add('HTTPMethod', HTTPMethod);
|
|
175
|
-
CustomDimensions.Add('EventType', 'APICallStart');
|
|
176
|
-
CustomDimensions.Add('UserID', UserId());
|
|
177
|
-
CustomDimensions.Add('CompanyName', CompanyName());
|
|
178
|
-
|
|
179
|
-
Session.LogMessage('API001', StrSubstNo('API call initiated: %1 %2', HTTPMethod, APIEndpoint),
|
|
180
|
-
Verbosity::Normal, DataClassification::SystemMetadata,
|
|
181
|
-
TelemetryScope::ExtensionPublisher, CustomDimensions);
|
|
182
|
-
|
|
183
|
-
exit(CallCorrelationId);
|
|
184
|
-
end;
|
|
185
|
-
|
|
186
|
-
procedure LogAPICorrelatedResponse(CallCorrelationId: Text; HTTPStatusCode: Integer; ResponseTime: Integer; ErrorMessage: Text)
|
|
187
|
-
var
|
|
188
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
189
|
-
IsSuccess: Boolean;
|
|
190
|
-
begin
|
|
191
|
-
IsSuccess := (HTTPStatusCode >= 200) and (HTTPStatusCode < 300);
|
|
192
|
-
|
|
193
|
-
CustomDimensions.Add('CallCorrelationId', CallCorrelationId);
|
|
194
|
-
CustomDimensions.Add('HTTPStatusCode', Format(HTTPStatusCode));
|
|
195
|
-
CustomDimensions.Add('ResponseTime', Format(ResponseTime));
|
|
196
|
-
CustomDimensions.Add('Success', Format(IsSuccess));
|
|
197
|
-
CustomDimensions.Add('EventType', 'APICallEnd');
|
|
198
|
-
|
|
199
|
-
if not IsSuccess then begin
|
|
200
|
-
CustomDimensions.Add('ErrorMessage', ErrorMessage);
|
|
201
|
-
CustomDimensions.Add('ErrorCategory', 'APIError');
|
|
202
|
-
end;
|
|
203
|
-
|
|
204
|
-
Session.LogMessage('API002',
|
|
205
|
-
StrSubstNo('API call completed: Status %1, Duration %2ms', HTTPStatusCode, ResponseTime),
|
|
206
|
-
if IsSuccess then Verbosity::Normal else Verbosity::Error,
|
|
207
|
-
DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, CustomDimensions);
|
|
208
|
-
end;
|
|
209
|
-
|
|
210
|
-
// Example 4: Business process correlation
|
|
211
|
-
procedure TrackBusinessProcessFlow(ProcessName: Text; ProcessStage: Text; BusinessData: Dictionary of [Text, Text])
|
|
212
|
-
var
|
|
213
|
-
ProcessCorrelationId: Text;
|
|
214
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
215
|
-
begin
|
|
216
|
-
ProcessCorrelationId := GetOrCreateProcessCorrelation(ProcessName, BusinessData);
|
|
217
|
-
|
|
218
|
-
CustomDimensions.Add('ProcessCorrelationId', ProcessCorrelationId);
|
|
219
|
-
CustomDimensions.Add('ProcessName', ProcessName);
|
|
220
|
-
CustomDimensions.Add('ProcessStage', ProcessStage);
|
|
221
|
-
CustomDimensions.Add('EventType', 'ProcessFlow');
|
|
222
|
-
|
|
223
|
-
// Add business context
|
|
224
|
-
AddBusinessContextToDimensions(CustomDimensions, BusinessData);
|
|
225
|
-
|
|
226
|
-
Session.LogMessage('PROC001', StrSubstNo('Business process flow: %1 - %2', ProcessName, ProcessStage),
|
|
227
|
-
Verbosity::Normal, DataClassification::SystemMetadata,
|
|
228
|
-
TelemetryScope::ExtensionPublisher, CustomDimensions);
|
|
229
|
-
end;
|
|
230
|
-
|
|
231
|
-
local procedure GetOrCreateProcessCorrelation(ProcessName: Text; BusinessData: Dictionary of [Text, Text]): Text
|
|
232
|
-
var
|
|
233
|
-
ProcessKey: Text;
|
|
234
|
-
ProcessCorrelationMap: Dictionary of [Text, Text];
|
|
235
|
-
begin
|
|
236
|
-
ProcessKey := ProcessName + '_' + BusinessData.Get('DocumentNo');
|
|
237
|
-
|
|
238
|
-
if not ProcessCorrelationMap.ContainsKey(ProcessKey) then
|
|
239
|
-
ProcessCorrelationMap.Add(ProcessKey, CreateGuid());
|
|
240
|
-
|
|
241
|
-
exit(ProcessCorrelationMap.Get(ProcessKey));
|
|
242
|
-
end;
|
|
243
|
-
|
|
244
|
-
local procedure AddBusinessContextToDimensions(var CustomDimensions: Dictionary of [Text, Text]; BusinessData: Dictionary of [Text, Text])
|
|
245
|
-
var
|
|
246
|
-
Key: Text;
|
|
247
|
-
begin
|
|
248
|
-
foreach Key in BusinessData.Keys do
|
|
249
|
-
CustomDimensions.Add('Business_' + Key, BusinessData.Get(Key));
|
|
250
|
-
end;
|
|
251
|
-
}
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
## Database Transaction Correlation
|
|
255
|
-
```al
|
|
256
|
-
codeunit 50142 "Database Transaction Correlation"
|
|
257
|
-
{
|
|
258
|
-
var
|
|
259
|
-
TransactionStartTimes: Dictionary of [Text, DateTime];
|
|
260
|
-
|
|
261
|
-
// Example 5: Database transaction correlation
|
|
262
|
-
procedure BeginDatabaseTransaction(TransactionType: Text; TableName: Text): Text
|
|
263
|
-
var
|
|
264
|
-
TransactionId: Text;
|
|
265
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
266
|
-
begin
|
|
267
|
-
TransactionId := CreateTransactionId();
|
|
268
|
-
|
|
269
|
-
TransactionStartTimes.Add(TransactionId, CurrentDateTime);
|
|
270
|
-
|
|
271
|
-
CustomDimensions.Add('TransactionId', TransactionId);
|
|
272
|
-
CustomDimensions.Add('TransactionType', TransactionType);
|
|
273
|
-
CustomDimensions.Add('TableName', TableName);
|
|
274
|
-
CustomDimensions.Add('EventType', 'TransactionStart');
|
|
275
|
-
CustomDimensions.Add('UserID', UserId());
|
|
276
|
-
CustomDimensions.Add('CompanyName', CompanyName());
|
|
277
|
-
|
|
278
|
-
Session.LogMessage('TXN001', StrSubstNo('Database transaction started: %1 on %2', TransactionType, TableName),
|
|
279
|
-
Verbosity::Verbose, DataClassification::SystemMetadata,
|
|
280
|
-
TelemetryScope::ExtensionPublisher, CustomDimensions);
|
|
281
|
-
|
|
282
|
-
exit(TransactionId);
|
|
283
|
-
end;
|
|
284
|
-
|
|
285
|
-
procedure LogTransactionError(TransactionId: Text; ErrorMessage: Text; RecordContext: Dictionary of [Text, Text])
|
|
286
|
-
var
|
|
287
|
-
CustomDimensions: Dictionary of [Text, Text];
|
|
288
|
-
TransactionDuration: Duration;
|
|
289
|
-
StartTime: DateTime;
|
|
290
|
-
begin
|
|
291
|
-
CustomDimensions.Add('TransactionId', TransactionId);
|
|
292
|
-
CustomDimensions.Add('EventType', 'TransactionError');
|
|
293
|
-
CustomDimensions.Add('ErrorMessage', ErrorMessage);
|
|
294
|
-
CustomDimensions.Add('ErrorCategory', 'DatabaseError');
|
|
295
|
-
|
|
296
|
-
// Calculate transaction duration
|
|
297
|
-
if TransactionStartTimes.Get(TransactionId, StartTime) then begin
|
|
298
|
-
TransactionDuration := CurrentDateTime - StartTime;
|
|
299
|
-
CustomDimensions.Add('TransactionDuration', Format(TransactionDuration));
|
|
300
|
-
end;
|
|
301
|
-
|
|
302
|
-
// Add record context for debugging
|
|
303
|
-
AddRecordContextToDimensions(CustomDimensions, RecordContext);
|
|
304
|
-
|
|
305
|
-
Session.LogMessage('TXN002', StrSubstNo('Database transaction error: %1', ErrorMessage),
|
|
306
|
-
Verbosity::Error, DataClassification::SystemMetadata,
|
|
307
|
-
TelemetryScope::ExtensionPublisher, CustomDimensions);
|
|
308
|
-
end;
|
|
309
|
-
|
|
310
|
-
local procedure CreateTransactionId(): Text
|
|
311
|
-
begin
|
|
312
|
-
exit('TXN-' + Format(CurrentDateTime, 0, '<Year4><Month,2><Day,2><Hours24><Minutes,2><Seconds,2>') +
|
|
313
|
-
'-' + Format(Random(9999), 4, '<Integer,4><Filler Character,0>'));
|
|
314
|
-
end;
|
|
315
|
-
|
|
316
|
-
local procedure AddRecordContextToDimensions(var CustomDimensions: Dictionary of [Text, Text]; RecordContext: Dictionary of [Text, Text])
|
|
317
|
-
var
|
|
318
|
-
Key: Text;
|
|
319
|
-
begin
|
|
320
|
-
foreach Key in RecordContext.Keys do
|
|
321
|
-
CustomDimensions.Add('Record_' + Key, RecordContext.Get(Key));
|
|
322
|
-
end;
|
|
323
|
-
}
|
|
324
|
-
```
|