@jwikman/bc-code-intelligence-mcp 1.5.7-dev.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 +165 -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 +440 -0
- package/dist/cli/bc-code-intel-cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +28 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +497 -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 +608 -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 +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1211 -0
- package/dist/index.js.map +1 -0
- package/dist/layers/base-layer.d.ts +133 -0
- package/dist/layers/base-layer.d.ts.map +1 -0
- package/dist/layers/base-layer.js +290 -0
- package/dist/layers/base-layer.js.map +1 -0
- package/dist/layers/embedded-layer.d.ts +130 -0
- package/dist/layers/embedded-layer.d.ts.map +1 -0
- package/dist/layers/embedded-layer.js +612 -0
- package/dist/layers/embedded-layer.js.map +1 -0
- package/dist/layers/git-layer.d.ts +77 -0
- package/dist/layers/git-layer.d.ts.map +1 -0
- package/dist/layers/git-layer.js +529 -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 +135 -0
- package/dist/layers/layer-service.d.ts.map +1 -0
- package/dist/layers/layer-service.js +586 -0
- package/dist/layers/layer-service.js.map +1 -0
- package/dist/layers/project-layer.d.ts +58 -0
- package/dist/layers/project-layer.d.ts.map +1 -0
- package/dist/layers/project-layer.js +286 -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 +358 -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 +818 -0
- package/dist/services/code-analysis-service.js.map +1 -0
- package/dist/services/enhanced-prompt-service.d.ts +56 -0
- package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
- package/dist/services/enhanced-prompt-service.js +165 -0
- package/dist/services/enhanced-prompt-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +90 -0
- package/dist/services/knowledge-service.d.ts.map +1 -0
- package/dist/services/knowledge-service.js +342 -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 +423 -0
- package/dist/services/methodology-service.js.map +1 -0
- package/dist/services/multi-content-layer-service.d.ts +198 -0
- package/dist/services/multi-content-layer-service.d.ts.map +1 -0
- package/dist/services/multi-content-layer-service.js +991 -0
- package/dist/services/multi-content-layer-service.js.map +1 -0
- package/dist/services/roleplay-engine.d.ts +161 -0
- package/dist/services/roleplay-engine.d.ts.map +1 -0
- package/dist/services/roleplay-engine.js +994 -0
- package/dist/services/roleplay-engine.js.map +1 -0
- package/dist/services/session-storage/file-storage.d.ts +30 -0
- package/dist/services/session-storage/file-storage.d.ts.map +1 -0
- package/dist/services/session-storage/file-storage.js +229 -0
- package/dist/services/session-storage/file-storage.js.map +1 -0
- package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
- package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
- package/dist/services/session-storage/in-memory-storage.js +142 -0
- package/dist/services/session-storage/in-memory-storage.js.map +1 -0
- package/dist/services/specialist-discovery.d.ts +98 -0
- package/dist/services/specialist-discovery.d.ts.map +1 -0
- package/dist/services/specialist-discovery.js +387 -0
- package/dist/services/specialist-discovery.js.map +1 -0
- package/dist/services/specialist-loader.d.ts +101 -0
- package/dist/services/specialist-loader.d.ts.map +1 -0
- package/dist/services/specialist-loader.js +256 -0
- package/dist/services/specialist-loader.js.map +1 -0
- package/dist/services/specialist-session-manager.d.ts +76 -0
- package/dist/services/specialist-session-manager.d.ts.map +1 -0
- package/dist/services/specialist-session-manager.js +255 -0
- package/dist/services/specialist-session-manager.js.map +1 -0
- package/dist/services/workflow-service.d.ts +146 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +409 -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 +94 -0
- package/dist/streamlined-handlers.d.ts.map +1 -0
- package/dist/streamlined-handlers.js +665 -0
- package/dist/streamlined-handlers.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/tools/config-diagnostic-tools.d.ts +234 -0
- package/dist/tools/config-diagnostic-tools.d.ts.map +1 -0
- package/dist/tools/config-diagnostic-tools.js +887 -0
- package/dist/tools/config-diagnostic-tools.js.map +1 -0
- package/dist/tools/core-tools.d.ts +26 -0
- package/dist/tools/core-tools.d.ts.map +1 -0
- package/dist/tools/core-tools.js +241 -0
- package/dist/tools/core-tools.js.map +1 -0
- package/dist/tools/handoff-tools.d.ts +37 -0
- package/dist/tools/handoff-tools.d.ts.map +1 -0
- package/dist/tools/handoff-tools.js +265 -0
- package/dist/tools/handoff-tools.js.map +1 -0
- package/dist/tools/index.d.ts +61 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +75 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/onboarding-tools.d.ts +43 -0
- package/dist/tools/onboarding-tools.d.ts.map +1 -0
- package/dist/tools/onboarding-tools.js +353 -0
- package/dist/tools/onboarding-tools.js.map +1 -0
- package/dist/tools/specialist-discovery-tools.d.ts +27 -0
- package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
- package/dist/tools/specialist-discovery-tools.js +275 -0
- package/dist/tools/specialist-discovery-tools.js.map +1 -0
- package/dist/tools/specialist-tools.d.ts +43 -0
- package/dist/tools/specialist-tools.d.ts.map +1 -0
- package/dist/tools/specialist-tools.js +372 -0
- package/dist/tools/specialist-tools.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +96 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +188 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/types/bc-knowledge.d.ts +303 -0
- package/dist/types/bc-knowledge.d.ts.map +1 -0
- package/dist/types/bc-knowledge.js +69 -0
- package/dist/types/bc-knowledge.js.map +1 -0
- package/dist/types/config-types.d.ts +186 -0
- package/dist/types/config-types.d.ts.map +1 -0
- package/dist/types/config-types.js +109 -0
- package/dist/types/config-types.js.map +1 -0
- package/dist/types/enhanced-layer-types.d.ts +193 -0
- package/dist/types/enhanced-layer-types.d.ts.map +1 -0
- package/dist/types/enhanced-layer-types.js +9 -0
- package/dist/types/enhanced-layer-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 +173 -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/roleplay-types.d.ts +156 -0
- package/dist/types/roleplay-types.d.ts.map +1 -0
- package/dist/types/roleplay-types.js +8 -0
- package/dist/types/roleplay-types.js.map +1 -0
- package/dist/types/session-types.d.ts +127 -0
- package/dist/types/session-types.d.ts.map +1 -0
- package/dist/types/session-types.js +8 -0
- package/dist/types/session-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 +178 -0
- package/embedded-knowledge/CONTRIBUTING.md +58 -0
- package/embedded-knowledge/LICENSE +21 -0
- package/embedded-knowledge/README.md +32 -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/delegating-to-github-copilot-agents.md +371 -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/object-id-ninja-integration.md +281 -0
- package/embedded-knowledge/domains/alex-architect/recommend-object-id-ninja.md +248 -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/samples/testability-design-patterns.md +223 -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/alex-architect/testability-design-patterns.md +77 -0
- package/embedded-knowledge/domains/casey-copilot/long-running-session-instructions.md +263 -0
- package/embedded-knowledge/domains/casey-copilot/samples/long-running-session-instructions.md +323 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-discovery.md +846 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-formats.md +595 -0
- package/embedded-knowledge/domains/chris-config/content-types-structure.md +421 -0
- package/embedded-knowledge/domains/chris-config/knowledge-content-creation.md +437 -0
- package/embedded-knowledge/domains/chris-config/layer-system-fundamentals.md +257 -0
- package/embedded-knowledge/domains/chris-config/multi-team-layer-configuration.md +302 -0
- package/embedded-knowledge/domains/chris-config/workspace-detection-solutions.md +336 -0
- package/embedded-knowledge/domains/dean-debug/bc-telemetry-buddy-integration.md +453 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -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/recommend-bc-telemetry-buddy.md +160 -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/codeunit-run-pattern.md +159 -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/codeunit-run-pattern.md +239 -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/samples/try-function-usage.md +195 -0
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
- package/embedded-knowledge/domains/eva-errors/try-function-usage.md +129 -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/morgan-market/partner-readiness-analysis.md +201 -0
- package/embedded-knowledge/domains/morgan-market/samples/partner-readiness-checklist.md +288 -0
- package/embedded-knowledge/domains/parker-pragmatic/README.md +39 -0
- package/embedded-knowledge/domains/parker-pragmatic/proposal-workflows/creating-effective-proposals.md +583 -0
- package/embedded-knowledge/domains/parker-pragmatic/trust-building/working-with-ai-skeptics.md +587 -0
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
- package/embedded-knowledge/domains/quinn-tester/isolation-testing-patterns.md +82 -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/isolation-testing-patterns.md +424 -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/roger-reviewer/samples/testability-code-smells.md +256 -0
- package/embedded-knowledge/domains/roger-reviewer/testability-code-smells.md +67 -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/shared/al-file-naming-conventions.md +146 -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/embedded-knowledge/methodologies/workflows/proposal-review-workflow.md +535 -0
- package/embedded-knowledge/specialists/alex-architect.md +305 -0
- package/embedded-knowledge/specialists/casey-copilot.md +314 -0
- package/embedded-knowledge/specialists/chris-config.md +226 -0
- package/embedded-knowledge/specialists/dean-debug.md +365 -0
- package/embedded-knowledge/specialists/eva-errors.md +291 -0
- package/embedded-knowledge/specialists/jordan-bridge.md +291 -0
- package/embedded-knowledge/specialists/logan-legacy.md +265 -0
- package/embedded-knowledge/specialists/maya-mentor.md +299 -0
- package/embedded-knowledge/specialists/morgan-market.md +281 -0
- package/embedded-knowledge/specialists/parker-pragmatic.md +564 -0
- package/embedded-knowledge/specialists/quinn-tester.md +323 -0
- package/embedded-knowledge/specialists/roger-reviewer.md +317 -0
- package/embedded-knowledge/specialists/sam-coder.md +342 -0
- package/embedded-knowledge/specialists/seth-security.md +290 -0
- package/embedded-knowledge/specialists/taylor-docs.md +312 -0
- package/embedded-knowledge/specialists/uma-ux.md +291 -0
- package/package.json +82 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Table Safety Validation Patterns
|
|
2
|
+
|
|
3
|
+
## IsTemporary Safeguard Implementation
|
|
4
|
+
```al
|
|
5
|
+
procedure ProcessBulkData(var DataBuffer: Record "Data Processing Buffer")
|
|
6
|
+
begin
|
|
7
|
+
// Always validate temporary status before bulk operations
|
|
8
|
+
if not DataBuffer.IsTemporary then
|
|
9
|
+
Error('This procedure requires a temporary table to prevent data corruption.');
|
|
10
|
+
|
|
11
|
+
DataBuffer.Reset();
|
|
12
|
+
if DataBuffer.FindSet() then
|
|
13
|
+
repeat
|
|
14
|
+
ProcessIndividualRecord(DataBuffer);
|
|
15
|
+
DataBuffer.Delete(); // Safe because table is confirmed temporary
|
|
16
|
+
until DataBuffer.Next() = 0;
|
|
17
|
+
end;
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Database Write Protection
|
|
21
|
+
```al
|
|
22
|
+
procedure SafeDataManipulation(var TempCustomer: Record Customer temporary)
|
|
23
|
+
var
|
|
24
|
+
Customer: Record Customer;
|
|
25
|
+
begin
|
|
26
|
+
// Validate temporary status before any modifications
|
|
27
|
+
if not TempCustomer.IsTemporary then
|
|
28
|
+
Error('Database safety violation: Expected temporary table for data manipulation.');
|
|
29
|
+
|
|
30
|
+
// Safe to perform destructive operations
|
|
31
|
+
TempCustomer.Reset();
|
|
32
|
+
TempCustomer.DeleteAll();
|
|
33
|
+
|
|
34
|
+
// Load fresh data from permanent table
|
|
35
|
+
Customer.FindSet();
|
|
36
|
+
repeat
|
|
37
|
+
TempCustomer := Customer;
|
|
38
|
+
TempCustomer.Insert();
|
|
39
|
+
until Customer.Next() = 0;
|
|
40
|
+
end;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Bulk Operation Validation
|
|
44
|
+
```al
|
|
45
|
+
procedure ProcessLargeDataSet(var TempItem: Record Item temporary; ProcessingMode: Option Validate,Update,Delete)
|
|
46
|
+
begin
|
|
47
|
+
// Critical safety check for bulk operations
|
|
48
|
+
if not TempItem.IsTemporary then
|
|
49
|
+
Error('Bulk processing operations require temporary tables. This prevents accidental permanent data modification.');
|
|
50
|
+
|
|
51
|
+
case ProcessingMode of
|
|
52
|
+
ProcessingMode::Validate:
|
|
53
|
+
ValidateAllRecords(TempItem);
|
|
54
|
+
ProcessingMode::Update:
|
|
55
|
+
UpdateAllRecords(TempItem);
|
|
56
|
+
ProcessingMode::Delete:
|
|
57
|
+
TempItem.DeleteAll(); // Safe deletion
|
|
58
|
+
end;
|
|
59
|
+
end;
|
|
60
|
+
|
|
61
|
+
local procedure ValidateAllRecords(var TempItem: Record Item temporary)
|
|
62
|
+
begin
|
|
63
|
+
TempItem.Reset();
|
|
64
|
+
if TempItem.FindSet() then
|
|
65
|
+
repeat
|
|
66
|
+
ValidateItemData(TempItem);
|
|
67
|
+
until TempItem.Next() = 0;
|
|
68
|
+
end;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Data Integrity Protection
|
|
72
|
+
```al
|
|
73
|
+
procedure SecureDataProcessing(var WorkingTable: Record "Working Data Buffer")
|
|
74
|
+
var
|
|
75
|
+
OriginalFilters: Text;
|
|
76
|
+
begin
|
|
77
|
+
// Mandatory safety validation
|
|
78
|
+
if not WorkingTable.IsTemporary then
|
|
79
|
+
Error('Data integrity protection: This operation requires a temporary working table.');
|
|
80
|
+
|
|
81
|
+
OriginalFilters := WorkingTable.GetFilters();
|
|
82
|
+
|
|
83
|
+
try
|
|
84
|
+
WorkingTable.Reset();
|
|
85
|
+
ProcessAllRecords(WorkingTable);
|
|
86
|
+
finally
|
|
87
|
+
// Restore original state
|
|
88
|
+
WorkingTable.Reset();
|
|
89
|
+
WorkingTable.SetView(OriginalFilters);
|
|
90
|
+
end;
|
|
91
|
+
end;
|
|
92
|
+
|
|
93
|
+
local procedure ProcessAllRecords(var WorkingTable: Record "Working Data Buffer")
|
|
94
|
+
begin
|
|
95
|
+
if WorkingTable.FindSet(true) then
|
|
96
|
+
repeat
|
|
97
|
+
WorkingTable."Processing Status" := WorkingTable."Processing Status"::Completed;
|
|
98
|
+
WorkingTable.Modify();
|
|
99
|
+
until WorkingTable.Next() = 0;
|
|
100
|
+
end;
|
|
101
|
+
```
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# TestField Error Handling Patterns
|
|
2
|
+
|
|
3
|
+
## Try-Catch with TestField
|
|
4
|
+
```al
|
|
5
|
+
procedure ValidateDocumentSafely(var SalesHeader: Record "Sales Header"): Boolean
|
|
6
|
+
begin
|
|
7
|
+
if not TryValidateDocument(SalesHeader) then begin
|
|
8
|
+
LogValidationError(GetLastErrorText());
|
|
9
|
+
exit(false);
|
|
10
|
+
end;
|
|
11
|
+
exit(true);
|
|
12
|
+
end;
|
|
13
|
+
|
|
14
|
+
local procedure TryValidateDocument(var SalesHeader: Record "Sales Header")
|
|
15
|
+
begin
|
|
16
|
+
SalesHeader.TestField("Document Type");
|
|
17
|
+
SalesHeader.TestField("No.");
|
|
18
|
+
SalesHeader.TestField("Sell-to Customer No.");
|
|
19
|
+
end;
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Batch Validation with Error Collection
|
|
23
|
+
```al
|
|
24
|
+
procedure ValidateCustomerBatch(var TempCustomer: Record Customer temporary): Text
|
|
25
|
+
var
|
|
26
|
+
ErrorMessages: Text;
|
|
27
|
+
Customer: Record Customer;
|
|
28
|
+
begin
|
|
29
|
+
TempCustomer.Reset();
|
|
30
|
+
if TempCustomer.FindSet() then
|
|
31
|
+
repeat
|
|
32
|
+
Customer := TempCustomer;
|
|
33
|
+
if not TryValidateCustomer(Customer) then
|
|
34
|
+
ErrorMessages += StrSubstNo('Customer %1: %2\', Customer."No.", GetLastErrorText());
|
|
35
|
+
until TempCustomer.Next() = 0;
|
|
36
|
+
|
|
37
|
+
exit(ErrorMessages);
|
|
38
|
+
end;
|
|
39
|
+
|
|
40
|
+
local procedure TryValidateCustomer(Customer: Record Customer): Boolean
|
|
41
|
+
begin
|
|
42
|
+
Customer.TestField(Name);
|
|
43
|
+
Customer.TestField("Customer Posting Group");
|
|
44
|
+
exit(true);
|
|
45
|
+
end;
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Conditional TestField with Fallback
|
|
49
|
+
```al
|
|
50
|
+
procedure ValidateVendorWithDefaults(var Vendor: Record Vendor)
|
|
51
|
+
var
|
|
52
|
+
VendorPostingGroup: Record "Vendor Posting Group";
|
|
53
|
+
begin
|
|
54
|
+
if not TryTestVendorFields(Vendor) then begin
|
|
55
|
+
// Apply defaults and retry
|
|
56
|
+
if Vendor."Vendor Posting Group" = '' then begin
|
|
57
|
+
VendorPostingGroup.FindFirst();
|
|
58
|
+
Vendor."Vendor Posting Group" := VendorPostingGroup.Code;
|
|
59
|
+
end;
|
|
60
|
+
|
|
61
|
+
// Retry validation
|
|
62
|
+
Vendor.TestField("Vendor Posting Group");
|
|
63
|
+
end;
|
|
64
|
+
end;
|
|
65
|
+
|
|
66
|
+
local procedure TryTestVendorFields(Vendor: Record Vendor): Boolean
|
|
67
|
+
begin
|
|
68
|
+
Vendor.TestField("Vendor Posting Group");
|
|
69
|
+
exit(true);
|
|
70
|
+
end;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Graceful Degradation Pattern
|
|
74
|
+
```al
|
|
75
|
+
procedure ProcessOrderWithValidation(var SalesHeader: Record "Sales Header"): Boolean
|
|
76
|
+
var
|
|
77
|
+
ValidationLevel: Integer;
|
|
78
|
+
begin
|
|
79
|
+
// Try strict validation first
|
|
80
|
+
ValidationLevel := 1;
|
|
81
|
+
if TryValidateOrderStrict(SalesHeader) then
|
|
82
|
+
exit(true);
|
|
83
|
+
|
|
84
|
+
// Fall back to basic validation
|
|
85
|
+
ValidationLevel := 2;
|
|
86
|
+
if TryValidateOrderBasic(SalesHeader) then begin
|
|
87
|
+
LogWarning('Order %1 processed with basic validation only', SalesHeader."No.");
|
|
88
|
+
exit(true);
|
|
89
|
+
end;
|
|
90
|
+
|
|
91
|
+
exit(false);
|
|
92
|
+
end;
|
|
93
|
+
|
|
94
|
+
local procedure TryValidateOrderStrict(SalesHeader: Record "Sales Header"): Boolean
|
|
95
|
+
begin
|
|
96
|
+
SalesHeader.TestField("External Document No.");
|
|
97
|
+
SalesHeader.TestField("Requested Delivery Date");
|
|
98
|
+
SalesHeader.TestField("Shipment Method Code");
|
|
99
|
+
exit(true);
|
|
100
|
+
end;
|
|
101
|
+
|
|
102
|
+
local procedure TryValidateOrderBasic(SalesHeader: Record "Sales Header"): Boolean
|
|
103
|
+
begin
|
|
104
|
+
SalesHeader.TestField("Sell-to Customer No.");
|
|
105
|
+
SalesHeader.TestField("Order Date");
|
|
106
|
+
exit(true);
|
|
107
|
+
end;
|
|
108
|
+
```
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Try Function Usage Samples
|
|
2
|
+
|
|
3
|
+
## External Web Service Call
|
|
4
|
+
```al
|
|
5
|
+
procedure CallExternalAPI(CustomerNo: Code[20]): Boolean
|
|
6
|
+
var
|
|
7
|
+
CustomerData: JsonObject;
|
|
8
|
+
begin
|
|
9
|
+
// Prepare data OUTSIDE try function
|
|
10
|
+
CustomerData := PrepareCustomerPayload(CustomerNo);
|
|
11
|
+
|
|
12
|
+
// External call INSIDE try function
|
|
13
|
+
if not TrySendToExternalAPI(CustomerData) then begin
|
|
14
|
+
LogAPIError(CustomerNo, GetLastErrorText());
|
|
15
|
+
exit(false);
|
|
16
|
+
end;
|
|
17
|
+
|
|
18
|
+
// Database write OUTSIDE try function
|
|
19
|
+
MarkCustomerAsSynced(CustomerNo);
|
|
20
|
+
exit(true);
|
|
21
|
+
end;
|
|
22
|
+
|
|
23
|
+
[TryFunction]
|
|
24
|
+
local procedure TrySendToExternalAPI(Payload: JsonObject)
|
|
25
|
+
var
|
|
26
|
+
Client: HttpClient;
|
|
27
|
+
Response: HttpResponseMessage;
|
|
28
|
+
Content: HttpContent;
|
|
29
|
+
begin
|
|
30
|
+
Content.WriteFrom(Payload.AsText());
|
|
31
|
+
Client.Post('https://api.example.com/customers', Content, Response);
|
|
32
|
+
|
|
33
|
+
if not Response.IsSuccessStatusCode() then
|
|
34
|
+
Error('API returned status %1', Response.HttpStatusCode());
|
|
35
|
+
end;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Batch Validation Pattern
|
|
39
|
+
```al
|
|
40
|
+
procedure ValidateImportBatch(var TempImportBuffer: Record "Import Buffer" temporary): Boolean
|
|
41
|
+
var
|
|
42
|
+
AllValid: Boolean;
|
|
43
|
+
ErrorLog: Text;
|
|
44
|
+
begin
|
|
45
|
+
AllValid := true;
|
|
46
|
+
|
|
47
|
+
if TempImportBuffer.FindSet() then
|
|
48
|
+
repeat
|
|
49
|
+
// Read-only validation in try function
|
|
50
|
+
if not TryValidateImportRecord(TempImportBuffer) then begin
|
|
51
|
+
AllValid := false;
|
|
52
|
+
ErrorLog += StrSubstNo('Line %1: %2\',
|
|
53
|
+
TempImportBuffer."Line No.", GetLastErrorText());
|
|
54
|
+
end;
|
|
55
|
+
until TempImportBuffer.Next() = 0;
|
|
56
|
+
|
|
57
|
+
if not AllValid then
|
|
58
|
+
Message('Validation errors:\%1', ErrorLog);
|
|
59
|
+
|
|
60
|
+
exit(AllValid);
|
|
61
|
+
end;
|
|
62
|
+
|
|
63
|
+
[TryFunction]
|
|
64
|
+
local procedure TryValidateImportRecord(ImportBuffer: Record "Import Buffer" temporary)
|
|
65
|
+
var
|
|
66
|
+
Customer: Record Customer;
|
|
67
|
+
Item: Record Item;
|
|
68
|
+
begin
|
|
69
|
+
// These are read-only checks - safe in try function
|
|
70
|
+
Customer.Get(ImportBuffer."Customer No.");
|
|
71
|
+
Item.Get(ImportBuffer."Item No.");
|
|
72
|
+
|
|
73
|
+
if ImportBuffer.Quantity <= 0 then
|
|
74
|
+
Error('Quantity must be positive');
|
|
75
|
+
|
|
76
|
+
if ImportBuffer."Unit Price" < 0 then
|
|
77
|
+
Error('Unit price cannot be negative');
|
|
78
|
+
end;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## File Operation Wrapper
|
|
82
|
+
```al
|
|
83
|
+
procedure ProcessImportFile(FilePath: Text): Boolean
|
|
84
|
+
var
|
|
85
|
+
FileContent: Text;
|
|
86
|
+
begin
|
|
87
|
+
if not TryReadFile(FilePath, FileContent) then begin
|
|
88
|
+
LogError('File read failed: ' + GetLastErrorText());
|
|
89
|
+
exit(false);
|
|
90
|
+
end;
|
|
91
|
+
|
|
92
|
+
// Process content and write to database OUTSIDE try
|
|
93
|
+
ProcessFileContent(FileContent);
|
|
94
|
+
exit(true);
|
|
95
|
+
end;
|
|
96
|
+
|
|
97
|
+
[TryFunction]
|
|
98
|
+
local procedure TryReadFile(FilePath: Text; var Content: Text)
|
|
99
|
+
var
|
|
100
|
+
InStream: InStream;
|
|
101
|
+
TempBlob: Codeunit "Temp Blob";
|
|
102
|
+
FileManagement: Codeunit "File Management";
|
|
103
|
+
begin
|
|
104
|
+
FileManagement.BLOBImportFromServerFile(TempBlob, FilePath);
|
|
105
|
+
TempBlob.CreateInStream(InStream);
|
|
106
|
+
InStream.ReadText(Content);
|
|
107
|
+
end;
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## WRONG: Write Operations Inside Try Function
|
|
111
|
+
```al
|
|
112
|
+
// ❌ THIS IS WRONG - DO NOT DO THIS
|
|
113
|
+
[TryFunction]
|
|
114
|
+
local procedure TryUpdateCustomerStatus(CustomerNo: Code[20])
|
|
115
|
+
var
|
|
116
|
+
Customer: Record Customer;
|
|
117
|
+
begin
|
|
118
|
+
Customer.Get(CustomerNo);
|
|
119
|
+
Customer.Status := Customer.Status::Active;
|
|
120
|
+
Customer.Modify(); // ❌ WRITE OPERATION INSIDE TRY - NOT ALLOWED
|
|
121
|
+
end;
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## CORRECT: Separation of Concerns
|
|
125
|
+
```al
|
|
126
|
+
// âś… CORRECT PATTERN
|
|
127
|
+
procedure UpdateCustomerStatusSafely(CustomerNo: Code[20]): Boolean
|
|
128
|
+
var
|
|
129
|
+
Customer: Record Customer;
|
|
130
|
+
begin
|
|
131
|
+
// Validate in try function (read-only)
|
|
132
|
+
if not TryValidateCustomerForActivation(CustomerNo) then begin
|
|
133
|
+
LogError(CustomerNo, GetLastErrorText());
|
|
134
|
+
exit(false);
|
|
135
|
+
end;
|
|
136
|
+
|
|
137
|
+
// Write operation OUTSIDE try function
|
|
138
|
+
Customer.Get(CustomerNo);
|
|
139
|
+
Customer.Status := Customer.Status::Active;
|
|
140
|
+
Customer.Modify();
|
|
141
|
+
exit(true);
|
|
142
|
+
end;
|
|
143
|
+
|
|
144
|
+
[TryFunction]
|
|
145
|
+
local procedure TryValidateCustomerForActivation(CustomerNo: Code[20])
|
|
146
|
+
var
|
|
147
|
+
Customer: Record Customer;
|
|
148
|
+
begin
|
|
149
|
+
Customer.Get(CustomerNo);
|
|
150
|
+
Customer.TestField("Payment Terms Code");
|
|
151
|
+
Customer.TestField("Customer Posting Group");
|
|
152
|
+
|
|
153
|
+
if Customer.Balance > Customer."Credit Limit" then
|
|
154
|
+
Error('Customer exceeds credit limit');
|
|
155
|
+
end;
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## HTTP Client with Retry Logic
|
|
159
|
+
```al
|
|
160
|
+
procedure CallAPIWithRetry(Endpoint: Text; var ResponseText: Text): Boolean
|
|
161
|
+
var
|
|
162
|
+
RetryCount: Integer;
|
|
163
|
+
MaxRetries: Integer;
|
|
164
|
+
begin
|
|
165
|
+
MaxRetries := 3;
|
|
166
|
+
|
|
167
|
+
for RetryCount := 1 to MaxRetries do begin
|
|
168
|
+
if TryCallAPI(Endpoint, ResponseText) then
|
|
169
|
+
exit(true);
|
|
170
|
+
|
|
171
|
+
// Log retry attempt
|
|
172
|
+
LogInfo(StrSubstNo('API call attempt %1 failed: %2',
|
|
173
|
+
RetryCount, GetLastErrorText()));
|
|
174
|
+
|
|
175
|
+
if RetryCount < MaxRetries then
|
|
176
|
+
Sleep(1000 * RetryCount); // Exponential backoff
|
|
177
|
+
end;
|
|
178
|
+
|
|
179
|
+
LogError('API call failed after ' + Format(MaxRetries) + ' attempts');
|
|
180
|
+
exit(false);
|
|
181
|
+
end;
|
|
182
|
+
|
|
183
|
+
[TryFunction]
|
|
184
|
+
local procedure TryCallAPI(Endpoint: Text; var ResponseText: Text)
|
|
185
|
+
var
|
|
186
|
+
Client: HttpClient;
|
|
187
|
+
Response: HttpResponseMessage;
|
|
188
|
+
begin
|
|
189
|
+
Client.Get(Endpoint, Response);
|
|
190
|
+
Response.Content().ReadAs(ResponseText);
|
|
191
|
+
|
|
192
|
+
if not Response.IsSuccessStatusCode() then
|
|
193
|
+
Error('HTTP %1: %2', Response.HttpStatusCode(), ResponseText);
|
|
194
|
+
end;
|
|
195
|
+
```
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "TestField Error Handling and Custom Messages"
|
|
3
|
+
domain: "eva-errors"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["error-handling", "validation", "user-experience", "custom-messages"]
|
|
7
|
+
prerequisites: ["testfield-basic-syntax", "error-handling-fundamentals"]
|
|
8
|
+
samples: "samples/testfield-error-handling.md"
|
|
9
|
+
---
|
|
10
|
+
# TestField Error Handling and Custom Messages
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
TestField generates automatic error messages, but business scenarios often require custom error handling and messaging. Understanding TestField error behavior enables better user experience and error management strategies.
|
|
15
|
+
|
|
16
|
+
**Key Principle**: TestField errors are runtime exceptions that halt procedure execution unless caught and handled.
|
|
17
|
+
|
|
18
|
+
## Default Error Behavior
|
|
19
|
+
|
|
20
|
+
### Standard Error Messages
|
|
21
|
+
TestField generates system messages like "You must specify Name in Customer" when validation fails. These messages include:
|
|
22
|
+
- Field caption from table definition
|
|
23
|
+
- Table name
|
|
24
|
+
- Current record context when available
|
|
25
|
+
|
|
26
|
+
### Error Flow Impact
|
|
27
|
+
TestField errors immediately terminate current procedure execution. Control returns to calling code or user interface with error state.
|
|
28
|
+
|
|
29
|
+
## Custom Error Handling Patterns
|
|
30
|
+
|
|
31
|
+
### Try-Function Approach
|
|
32
|
+
Wrap TestField calls in TryFunction procedures to catch validation errors without terminating execution. Returns boolean success indicator for error-tolerant processing scenarios.
|
|
33
|
+
|
|
34
|
+
### Custom Validation with Better Messages
|
|
35
|
+
Replace TestField with custom validation logic when business context requires specific error messages. Provides more meaningful feedback to users than system-generated messages.
|
|
36
|
+
|
|
37
|
+
### Conditional TestField Usage
|
|
38
|
+
Apply TestField validation based on business rules or record state. Ensures appropriate validation intensity for different scenarios without over-validating.
|
|
39
|
+
|
|
40
|
+
## Advanced Error Management
|
|
41
|
+
|
|
42
|
+
### Error Context Enhancement
|
|
43
|
+
Capture TestField errors using TryFunction pattern and enhance with business context before re-throwing. Provides users with meaningful error information including document details.
|
|
44
|
+
|
|
45
|
+
### Multiple Field Validation with Aggregated Errors
|
|
46
|
+
Collect multiple validation failures before reporting to users. Improves user experience by showing all validation issues at once rather than one-by-one error correction.
|
|
47
|
+
|
|
48
|
+
## Integration with Business Logic
|
|
49
|
+
|
|
50
|
+
### Workflow Integration
|
|
51
|
+
TestField works seamlessly with workflow validations. Use TestField for mandatory data checks within workflow step validations.
|
|
52
|
+
|
|
53
|
+
### API Integration
|
|
54
|
+
For API endpoints, catch TestField errors and return structured error responses rather than allowing raw BC errors to propagate.
|
|
55
|
+
|
|
56
|
+
### Batch Processing
|
|
57
|
+
In batch processing scenarios, use TryFunction pattern to continue processing other records when individual record validation fails.
|
|
58
|
+
|
|
59
|
+
## User Experience Considerations
|
|
60
|
+
|
|
61
|
+
### Progressive Validation
|
|
62
|
+
Validate fields in logical order so users get meaningful first-error feedback rather than random field validation failures.
|
|
63
|
+
|
|
64
|
+
### Context-Aware Messages
|
|
65
|
+
Include business context in custom error messages to help users understand why specific fields are required.
|
|
66
|
+
|
|
67
|
+
### Field Focus Integration
|
|
68
|
+
Custom validation procedures can integrate with page field focus to direct users to specific fields requiring attention.
|
|
69
|
+
|
|
70
|
+
## Common Patterns
|
|
71
|
+
|
|
72
|
+
### Validation Procedures
|
|
73
|
+
Create dedicated validation procedures that use TestField internally but provide business-context error messages.
|
|
74
|
+
|
|
75
|
+
### Status-Based Validation
|
|
76
|
+
Use TestField with status checks to enforce business rules at specific workflow stages.
|
|
77
|
+
|
|
78
|
+
### Cross-Table Validation
|
|
79
|
+
Combine TestField with related table lookups to validate complex business relationships.
|
|
80
|
+
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Try Function Usage Guidelines"
|
|
3
|
+
domain: "eva-errors"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["try-function", "error-handling", "transactions", "external-systems", "best-practices"]
|
|
7
|
+
samples: "samples/try-function-usage.md"
|
|
8
|
+
related_topics:
|
|
9
|
+
- "codeunit-run-pattern.md"
|
|
10
|
+
- "testfield-error-handling.md"
|
|
11
|
+
---
|
|
12
|
+
# Try Function Usage Guidelines
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
Try functions in Business Central provide a mechanism to catch runtime errors without terminating execution. While powerful, they have significant constraints around transaction handling that must be understood to use them correctly.
|
|
17
|
+
|
|
18
|
+
**Core Principle**: Try functions are designed for error detection and graceful handling—not for suppressing errors during write operations.
|
|
19
|
+
|
|
20
|
+
## When to Use Try Functions
|
|
21
|
+
|
|
22
|
+
### External System Calls
|
|
23
|
+
Try functions are ideal for wrapping calls to external systems where failures are expected and recoverable:
|
|
24
|
+
- Web service calls that may timeout or fail
|
|
25
|
+
- External API integrations
|
|
26
|
+
- File system operations
|
|
27
|
+
- HTTP client requests
|
|
28
|
+
|
|
29
|
+
External systems are inherently unreliable, and wrapping these calls allows your code to detect failures and respond appropriately rather than crashing.
|
|
30
|
+
|
|
31
|
+
### Validation Without Termination
|
|
32
|
+
Use try functions when you need to validate data or test conditions without stopping execution:
|
|
33
|
+
- Pre-flight checks before processing
|
|
34
|
+
- Batch validation scenarios
|
|
35
|
+
- User input validation with graceful feedback
|
|
36
|
+
|
|
37
|
+
### Read-Only Operations
|
|
38
|
+
Try functions work well for read operations that might fail:
|
|
39
|
+
- Record lookups that may not find results
|
|
40
|
+
- Configuration checks
|
|
41
|
+
- Data existence verification
|
|
42
|
+
|
|
43
|
+
## When NOT to Use Try Functions
|
|
44
|
+
|
|
45
|
+
### Write Operations in the Call Stack
|
|
46
|
+
**Critical Rule**: Never perform database write operations (INSERT, MODIFY, DELETE) inside a try function or any procedure called from within a try function.
|
|
47
|
+
|
|
48
|
+
This is prohibited because:
|
|
49
|
+
- The transaction behavior becomes unpredictable
|
|
50
|
+
- Partial writes cannot be properly rolled back
|
|
51
|
+
- Data integrity cannot be guaranteed
|
|
52
|
+
- The AL runtime explicitly prevents this pattern
|
|
53
|
+
|
|
54
|
+
### Suppressing Legitimate Errors
|
|
55
|
+
Don't use try functions to hide errors that indicate real problems:
|
|
56
|
+
- Business rule violations should be reported, not hidden
|
|
57
|
+
- Data validation failures need user attention
|
|
58
|
+
- Configuration errors require administrator action
|
|
59
|
+
|
|
60
|
+
### Complex Transaction Scenarios
|
|
61
|
+
Avoid try functions in the middle of multi-step transaction processes where you need consistent state management.
|
|
62
|
+
|
|
63
|
+
## Transaction Behavior
|
|
64
|
+
|
|
65
|
+
### Try Function Transaction Rules
|
|
66
|
+
When a try function catches an error:
|
|
67
|
+
- Any pending database changes within the try scope are rolled back
|
|
68
|
+
- The calling code continues execution
|
|
69
|
+
- GetLastErrorText() captures the error message
|
|
70
|
+
|
|
71
|
+
### Write Operation Restrictions
|
|
72
|
+
The Business Central runtime enforces that write transactions cannot occur within a try function's call stack. Attempting this will result in a runtime error indicating the operation is not allowed.
|
|
73
|
+
|
|
74
|
+
## Implementation Patterns
|
|
75
|
+
|
|
76
|
+
### External Service Wrapper
|
|
77
|
+
Create try functions specifically for external calls, keeping all database operations outside:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
// Correct pattern:
|
|
81
|
+
1. Prepare data (outside try)
|
|
82
|
+
2. Call try function for external operation
|
|
83
|
+
3. Check result
|
|
84
|
+
4. Write to database based on result (outside try)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Error Detection and Logging
|
|
88
|
+
Use try functions to detect errors, capture details, then handle the situation outside the try scope:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
// Pattern:
|
|
92
|
+
1. Call try function
|
|
93
|
+
2. If failed: capture GetLastErrorText()
|
|
94
|
+
3. Log error or notify user
|
|
95
|
+
4. Take appropriate action
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Best Practices
|
|
99
|
+
|
|
100
|
+
### Keep Try Functions Focused
|
|
101
|
+
- Single responsibility: one external call or validation per try function
|
|
102
|
+
- Minimal code inside the try function
|
|
103
|
+
- No side effects beyond the intended operation
|
|
104
|
+
|
|
105
|
+
### Handle Errors Appropriately
|
|
106
|
+
- Always check the return value of try function calls
|
|
107
|
+
- Use GetLastErrorText() to capture error details
|
|
108
|
+
- Provide meaningful feedback or logging
|
|
109
|
+
|
|
110
|
+
### Separate Concerns
|
|
111
|
+
- Database operations: outside try functions
|
|
112
|
+
- External calls: inside try functions
|
|
113
|
+
- Error handling logic: after try function returns
|
|
114
|
+
|
|
115
|
+
## Common Mistakes
|
|
116
|
+
|
|
117
|
+
### Database Writes Inside Try
|
|
118
|
+
Attempting to modify, insert, or delete records inside a try function or its call stack will fail at runtime.
|
|
119
|
+
|
|
120
|
+
### Ignoring Return Values
|
|
121
|
+
Calling a try function without checking its boolean return defeats the purpose of error handling.
|
|
122
|
+
|
|
123
|
+
### Over-Reliance on Try Functions
|
|
124
|
+
Using try functions as a general error suppression mechanism rather than for specific, expected failure scenarios creates fragile code.
|
|
125
|
+
|
|
126
|
+
## Related Patterns
|
|
127
|
+
|
|
128
|
+
For scenarios requiring transaction isolation with error handling, see the Codeunit.Run() pattern which provides proper transaction boundaries with error capture capabilities.
|
|
129
|
+
|