@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,484 @@
|
|
|
1
|
+
# Boolean Expression Simplification in AL - Code Examples
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Complex boolean expressions in AL code can significantly impact readability, maintainability, and performance. This sample demonstrates systematic approaches to simplifying boolean logic while maintaining functionality and improving code clarity.
|
|
5
|
+
|
|
6
|
+
## Fundamental Simplification Patterns
|
|
7
|
+
|
|
8
|
+
### Example 1: Basic De Morgan's Laws Application
|
|
9
|
+
|
|
10
|
+
**Problematic Code:**
|
|
11
|
+
```al
|
|
12
|
+
procedure ValidateCustomerOrder(SalesHeader: Record "Sales Header"): Boolean
|
|
13
|
+
var
|
|
14
|
+
Customer: Record Customer;
|
|
15
|
+
begin
|
|
16
|
+
Customer.Get(SalesHeader."Sell-to Customer No.");
|
|
17
|
+
|
|
18
|
+
// Complex negative condition - hard to read and understand
|
|
19
|
+
if not (Customer.Blocked = Customer.Blocked::" ") or
|
|
20
|
+
not (SalesHeader.Status = SalesHeader.Status::Open) or
|
|
21
|
+
not (SalesHeader."Document Date" >= Today()) then
|
|
22
|
+
exit(false);
|
|
23
|
+
|
|
24
|
+
exit(true);
|
|
25
|
+
end;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Simplified Code:**
|
|
29
|
+
```al
|
|
30
|
+
procedure ValidateCustomerOrder(SalesHeader: Record "Sales Header"): Boolean
|
|
31
|
+
var
|
|
32
|
+
Customer: Record Customer;
|
|
33
|
+
CustomerBlocked: Boolean;
|
|
34
|
+
OrderNotOpen: Boolean;
|
|
35
|
+
OrderDateInvalid: Boolean;
|
|
36
|
+
begin
|
|
37
|
+
Customer.Get(SalesHeader."Sell-to Customer No.");
|
|
38
|
+
|
|
39
|
+
// Apply De Morgan's law: not (A or B or C) = (not A) and (not B) and (not C)
|
|
40
|
+
// Then simplify by removing double negatives
|
|
41
|
+
CustomerBlocked := Customer.Blocked <> Customer.Blocked::" ";
|
|
42
|
+
OrderNotOpen := SalesHeader.Status <> SalesHeader.Status::Open;
|
|
43
|
+
OrderDateInvalid := SalesHeader."Document Date" < Today();
|
|
44
|
+
|
|
45
|
+
// Clear positive logic: ALL conditions must be false for validation to pass
|
|
46
|
+
if CustomerBlocked or OrderNotOpen or OrderDateInvalid then
|
|
47
|
+
exit(false);
|
|
48
|
+
|
|
49
|
+
exit(true);
|
|
50
|
+
end;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Example 2: Condition Extraction and Grouping
|
|
54
|
+
|
|
55
|
+
**Problematic Code:**
|
|
56
|
+
```al
|
|
57
|
+
procedure CanPostSalesDocument(SalesHeader: Record "Sales Header"): Boolean
|
|
58
|
+
var
|
|
59
|
+
SalesLine: Record "Sales Line";
|
|
60
|
+
GeneralLedgerSetup: Record "General Ledger Setup";
|
|
61
|
+
UserSetup: Record "User Setup";
|
|
62
|
+
begin
|
|
63
|
+
GeneralLedgerSetup.Get();
|
|
64
|
+
UserSetup.Get(UserId());
|
|
65
|
+
|
|
66
|
+
// Extremely complex boolean expression mixing different concerns
|
|
67
|
+
if (SalesHeader.Status = SalesHeader.Status::Released) and
|
|
68
|
+
(SalesHeader."Posting Date" <> 0D) and
|
|
69
|
+
(SalesHeader."Document Date" <> 0D) and
|
|
70
|
+
((SalesHeader."Posting Date" >= GeneralLedgerSetup."Allow Posting From") and
|
|
71
|
+
(SalesHeader."Posting Date" <= GeneralLedgerSetup."Allow Posting To")) and
|
|
72
|
+
((UserSetup."Allow Posting From" = 0D) or (SalesHeader."Posting Date" >= UserSetup."Allow Posting From")) and
|
|
73
|
+
((UserSetup."Allow Posting To" = 0D) or (SalesHeader."Posting Date" <= UserSetup."Allow Posting To")) and
|
|
74
|
+
(SalesHeader."Sell-to Customer No." <> '') and
|
|
75
|
+
(SalesHeader.Amount > 0) then
|
|
76
|
+
exit(true)
|
|
77
|
+
else
|
|
78
|
+
exit(false);
|
|
79
|
+
end;
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Simplified Code:**
|
|
83
|
+
```al
|
|
84
|
+
procedure CanPostSalesDocument(SalesHeader: Record "Sales Header"): Boolean
|
|
85
|
+
begin
|
|
86
|
+
// Break complex validation into logical groups
|
|
87
|
+
if not IsDocumentStatusValid(SalesHeader) then
|
|
88
|
+
exit(false);
|
|
89
|
+
|
|
90
|
+
if not AreDatesValid(SalesHeader) then
|
|
91
|
+
exit(false);
|
|
92
|
+
|
|
93
|
+
if not IsPostingDateAllowed(SalesHeader."Posting Date") then
|
|
94
|
+
exit(false);
|
|
95
|
+
|
|
96
|
+
if not IsDocumentContentValid(SalesHeader) then
|
|
97
|
+
exit(false);
|
|
98
|
+
|
|
99
|
+
exit(true);
|
|
100
|
+
end;
|
|
101
|
+
|
|
102
|
+
local procedure IsDocumentStatusValid(SalesHeader: Record "Sales Header"): Boolean
|
|
103
|
+
begin
|
|
104
|
+
exit(SalesHeader.Status = SalesHeader.Status::Released);
|
|
105
|
+
end;
|
|
106
|
+
|
|
107
|
+
local procedure AreDatesValid(SalesHeader: Record "Sales Header"): Boolean
|
|
108
|
+
begin
|
|
109
|
+
exit((SalesHeader."Posting Date" <> 0D) and (SalesHeader."Document Date" <> 0D));
|
|
110
|
+
end;
|
|
111
|
+
|
|
112
|
+
local procedure IsPostingDateAllowed(PostingDate: Date): Boolean
|
|
113
|
+
var
|
|
114
|
+
GeneralLedgerSetup: Record "General Ledger Setup";
|
|
115
|
+
UserSetup: Record "User Setup";
|
|
116
|
+
begin
|
|
117
|
+
GeneralLedgerSetup.Get();
|
|
118
|
+
|
|
119
|
+
// Check system-wide posting date restrictions
|
|
120
|
+
if not ((PostingDate >= GeneralLedgerSetup."Allow Posting From") and
|
|
121
|
+
(PostingDate <= GeneralLedgerSetup."Allow Posting To")) then
|
|
122
|
+
exit(false);
|
|
123
|
+
|
|
124
|
+
// Check user-specific posting date restrictions
|
|
125
|
+
if UserSetup.Get(UserId()) then
|
|
126
|
+
exit(IsWithinUserDateRange(PostingDate, UserSetup));
|
|
127
|
+
|
|
128
|
+
exit(true);
|
|
129
|
+
end;
|
|
130
|
+
|
|
131
|
+
local procedure IsWithinUserDateRange(PostingDate: Date; UserSetup: Record "User Setup"): Boolean
|
|
132
|
+
var
|
|
133
|
+
WithinFromDate: Boolean;
|
|
134
|
+
WithinToDate: Boolean;
|
|
135
|
+
begin
|
|
136
|
+
WithinFromDate := (UserSetup."Allow Posting From" = 0D) or (PostingDate >= UserSetup."Allow Posting From");
|
|
137
|
+
WithinToDate := (UserSetup."Allow Posting To" = 0D) or (PostingDate <= UserSetup."Allow Posting To");
|
|
138
|
+
|
|
139
|
+
exit(WithinFromDate and WithinToDate);
|
|
140
|
+
end;
|
|
141
|
+
|
|
142
|
+
local procedure IsDocumentContentValid(SalesHeader: Record "Sales Header"): Boolean
|
|
143
|
+
begin
|
|
144
|
+
exit((SalesHeader."Sell-to Customer No." <> '') and (SalesHeader.Amount > 0));
|
|
145
|
+
end;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Advanced Boolean Simplification Techniques
|
|
149
|
+
|
|
150
|
+
### Example 3: Short-Circuit Evaluation Optimization
|
|
151
|
+
|
|
152
|
+
**Problematic Code:**
|
|
153
|
+
```al
|
|
154
|
+
procedure ValidateItemForSale(ItemNo: Code[20]; LocationCode: Code[10]; Quantity: Decimal): Boolean
|
|
155
|
+
var
|
|
156
|
+
Item: Record Item;
|
|
157
|
+
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
158
|
+
Location: Record Location;
|
|
159
|
+
StockkeepingUnit: Record "Stockkeeping Unit";
|
|
160
|
+
AvailableInventory: Decimal;
|
|
161
|
+
IsReserved: Boolean;
|
|
162
|
+
HasSpecialPricing: Boolean;
|
|
163
|
+
begin
|
|
164
|
+
// Poor ordering - expensive operations performed regardless of simple checks
|
|
165
|
+
Item.Get(ItemNo);
|
|
166
|
+
Item.CalcFields(Inventory);
|
|
167
|
+
AvailableInventory := CalculateAvailableInventory(ItemNo, LocationCode);
|
|
168
|
+
IsReserved := CheckReservationStatus(ItemNo, LocationCode);
|
|
169
|
+
HasSpecialPricing := CheckSpecialPricing(ItemNo);
|
|
170
|
+
Location.Get(LocationCode);
|
|
171
|
+
|
|
172
|
+
if (Item.Blocked = false) and
|
|
173
|
+
(Item.Type = Item.Type::Inventory) and
|
|
174
|
+
(Location."Use As In-Transit" = false) and
|
|
175
|
+
(Quantity > 0) and
|
|
176
|
+
(AvailableInventory >= Quantity) and
|
|
177
|
+
(IsReserved = false) and
|
|
178
|
+
(HasSpecialPricing = true) then
|
|
179
|
+
exit(true)
|
|
180
|
+
else
|
|
181
|
+
exit(false);
|
|
182
|
+
end;
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Optimized Code:**
|
|
186
|
+
```al
|
|
187
|
+
procedure ValidateItemForSale(ItemNo: Code[20]; LocationCode: Code[10]; Quantity: Decimal): Boolean
|
|
188
|
+
var
|
|
189
|
+
Item: Record Item;
|
|
190
|
+
Location: Record Location;
|
|
191
|
+
begin
|
|
192
|
+
// Fast validation first - fail early on simple checks
|
|
193
|
+
if Quantity <= 0 then
|
|
194
|
+
exit(false);
|
|
195
|
+
|
|
196
|
+
if not Item.Get(ItemNo) then
|
|
197
|
+
exit(false);
|
|
198
|
+
|
|
199
|
+
// Basic item validation
|
|
200
|
+
if not IsItemAvailableForSale(Item) then
|
|
201
|
+
exit(false);
|
|
202
|
+
|
|
203
|
+
// Location validation
|
|
204
|
+
if not IsLocationValidForSale(LocationCode) then
|
|
205
|
+
exit(false);
|
|
206
|
+
|
|
207
|
+
// Expensive operations only after basic validation passes
|
|
208
|
+
if not HasSufficientInventory(ItemNo, LocationCode, Quantity) then
|
|
209
|
+
exit(false);
|
|
210
|
+
|
|
211
|
+
if not IsInventoryUnreserved(ItemNo, LocationCode) then
|
|
212
|
+
exit(false);
|
|
213
|
+
|
|
214
|
+
if not HasValidPricing(ItemNo) then
|
|
215
|
+
exit(false);
|
|
216
|
+
|
|
217
|
+
exit(true);
|
|
218
|
+
end;
|
|
219
|
+
|
|
220
|
+
local procedure IsItemAvailableForSale(Item: Record Item): Boolean
|
|
221
|
+
begin
|
|
222
|
+
exit((Item.Blocked = false) and (Item.Type = Item.Type::Inventory));
|
|
223
|
+
end;
|
|
224
|
+
|
|
225
|
+
local procedure IsLocationValidForSale(LocationCode: Code[10]): Boolean
|
|
226
|
+
var
|
|
227
|
+
Location: Record Location;
|
|
228
|
+
begin
|
|
229
|
+
if not Location.Get(LocationCode) then
|
|
230
|
+
exit(false);
|
|
231
|
+
|
|
232
|
+
exit(Location."Use As In-Transit" = false);
|
|
233
|
+
end;
|
|
234
|
+
|
|
235
|
+
local procedure HasSufficientInventory(ItemNo: Code[20]; LocationCode: Code[10]; RequiredQty: Decimal): Boolean
|
|
236
|
+
var
|
|
237
|
+
AvailableInventory: Decimal;
|
|
238
|
+
begin
|
|
239
|
+
AvailableInventory := CalculateAvailableInventory(ItemNo, LocationCode);
|
|
240
|
+
exit(AvailableInventory >= RequiredQty);
|
|
241
|
+
end;
|
|
242
|
+
|
|
243
|
+
local procedure IsInventoryUnreserved(ItemNo: Code[20]; LocationCode: Code[10]): Boolean
|
|
244
|
+
begin
|
|
245
|
+
exit(not CheckReservationStatus(ItemNo, LocationCode));
|
|
246
|
+
end;
|
|
247
|
+
|
|
248
|
+
local procedure HasValidPricing(ItemNo: Code[20]): Boolean
|
|
249
|
+
begin
|
|
250
|
+
exit(CheckSpecialPricing(ItemNo));
|
|
251
|
+
end;
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Example 4: Complex Range and Set Validation
|
|
255
|
+
|
|
256
|
+
**Problematic Code:**
|
|
257
|
+
```al
|
|
258
|
+
procedure ValidateGLAccountPosting(GLAccountNo: Code[20]; PostingDate: Date; Amount: Decimal): Boolean
|
|
259
|
+
var
|
|
260
|
+
GLAccount: Record "G/L Account";
|
|
261
|
+
AccountingPeriod: Record "Accounting Period";
|
|
262
|
+
GLSetup: Record "General Ledger Setup";
|
|
263
|
+
UserSetup: Record "User Setup";
|
|
264
|
+
begin
|
|
265
|
+
GLAccount.Get(GLAccountNo);
|
|
266
|
+
GLSetup.Get();
|
|
267
|
+
|
|
268
|
+
// Overly complex condition mixing different validation concerns
|
|
269
|
+
if (GLAccount.Blocked = false) and
|
|
270
|
+
(GLAccount."Direct Posting" = true) and
|
|
271
|
+
((GLAccount."Account Type" = GLAccount."Account Type"::Posting) or
|
|
272
|
+
(GLAccount."Account Type" = GLAccount."Account Type"::"Begin-Total") or
|
|
273
|
+
(GLAccount."Account Type" = GLAccount."Account Type"::"End-Total")) and
|
|
274
|
+
(PostingDate <> 0D) and
|
|
275
|
+
(PostingDate >= GLSetup."Allow Posting From") and
|
|
276
|
+
(PostingDate <= GLSetup."Allow Posting To") and
|
|
277
|
+
((Amount > 0) or (Amount < 0)) and
|
|
278
|
+
(Amount <> 0) and
|
|
279
|
+
((UserSetup.Get(UserId()) and
|
|
280
|
+
((UserSetup."Allow Posting From" = 0D) or (PostingDate >= UserSetup."Allow Posting From")) and
|
|
281
|
+
((UserSetup."Allow Posting To" = 0D) or (PostingDate <= UserSetup."Allow Posting To"))) or
|
|
282
|
+
(not UserSetup.Get(UserId()))) then
|
|
283
|
+
exit(true)
|
|
284
|
+
else
|
|
285
|
+
exit(false);
|
|
286
|
+
end;
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**Simplified Code:**
|
|
290
|
+
```al
|
|
291
|
+
procedure ValidateGLAccountPosting(GLAccountNo: Code[20]; PostingDate: Date; Amount: Decimal): Boolean
|
|
292
|
+
var
|
|
293
|
+
GLAccount: Record "G/L Account";
|
|
294
|
+
begin
|
|
295
|
+
if not GLAccount.Get(GLAccountNo) then
|
|
296
|
+
exit(false);
|
|
297
|
+
|
|
298
|
+
// Separate validation concerns for clarity
|
|
299
|
+
exit(IsAccountValidForPosting(GLAccount) and
|
|
300
|
+
IsPostingDateValid(PostingDate) and
|
|
301
|
+
IsAmountValid(Amount));
|
|
302
|
+
end;
|
|
303
|
+
|
|
304
|
+
local procedure IsAccountValidForPosting(GLAccount: Record "G/L Account"): Boolean
|
|
305
|
+
begin
|
|
306
|
+
if GLAccount.Blocked then
|
|
307
|
+
exit(false);
|
|
308
|
+
|
|
309
|
+
if not GLAccount."Direct Posting" then
|
|
310
|
+
exit(false);
|
|
311
|
+
|
|
312
|
+
// Simplified account type check using set inclusion
|
|
313
|
+
exit(GLAccount."Account Type" in [
|
|
314
|
+
GLAccount."Account Type"::Posting,
|
|
315
|
+
GLAccount."Account Type"::"Begin-Total",
|
|
316
|
+
GLAccount."Account Type"::"End-Total"
|
|
317
|
+
]);
|
|
318
|
+
end;
|
|
319
|
+
|
|
320
|
+
local procedure IsPostingDateValid(PostingDate: Date): Boolean
|
|
321
|
+
begin
|
|
322
|
+
if PostingDate = 0D then
|
|
323
|
+
exit(false);
|
|
324
|
+
|
|
325
|
+
exit(IsWithinSystemDateRange(PostingDate) and IsWithinUserDateRange(PostingDate));
|
|
326
|
+
end;
|
|
327
|
+
|
|
328
|
+
local procedure IsWithinSystemDateRange(PostingDate: Date): Boolean
|
|
329
|
+
var
|
|
330
|
+
GLSetup: Record "General Ledger Setup";
|
|
331
|
+
begin
|
|
332
|
+
GLSetup.Get();
|
|
333
|
+
exit((PostingDate >= GLSetup."Allow Posting From") and
|
|
334
|
+
(PostingDate <= GLSetup."Allow Posting To"));
|
|
335
|
+
end;
|
|
336
|
+
|
|
337
|
+
local procedure IsWithinUserDateRange(PostingDate: Date): Boolean
|
|
338
|
+
var
|
|
339
|
+
UserSetup: Record "User Setup";
|
|
340
|
+
begin
|
|
341
|
+
// If no user setup exists, allow posting (system rules apply)
|
|
342
|
+
if not UserSetup.Get(UserId()) then
|
|
343
|
+
exit(true);
|
|
344
|
+
|
|
345
|
+
// Check user-specific date restrictions
|
|
346
|
+
if (UserSetup."Allow Posting From" <> 0D) and (PostingDate < UserSetup."Allow Posting From") then
|
|
347
|
+
exit(false);
|
|
348
|
+
|
|
349
|
+
if (UserSetup."Allow Posting To" <> 0D) and (PostingDate > UserSetup."Allow Posting To") then
|
|
350
|
+
exit(false);
|
|
351
|
+
|
|
352
|
+
exit(true);
|
|
353
|
+
end;
|
|
354
|
+
|
|
355
|
+
local procedure IsAmountValid(Amount: Decimal): Boolean
|
|
356
|
+
begin
|
|
357
|
+
// Simplified: amount must be non-zero (positive or negative)
|
|
358
|
+
exit(Amount <> 0);
|
|
359
|
+
end;
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## Performance-Oriented Boolean Optimization
|
|
363
|
+
|
|
364
|
+
### Example 5: Database Query Optimization Through Boolean Logic
|
|
365
|
+
|
|
366
|
+
**Problematic Code:**
|
|
367
|
+
```al
|
|
368
|
+
procedure FindEligibleCustomersForPromotion(): List of [Code[20]]
|
|
369
|
+
var
|
|
370
|
+
Customer: Record Customer;
|
|
371
|
+
CustomerList: List of [Code[20]];
|
|
372
|
+
SalesHeader: Record "Sales Header";
|
|
373
|
+
TotalSales: Decimal;
|
|
374
|
+
HasRecentOrder: Boolean;
|
|
375
|
+
IsHighValue: Boolean;
|
|
376
|
+
IsActiveAccount: Boolean;
|
|
377
|
+
begin
|
|
378
|
+
// Inefficient: processes all customers regardless of basic criteria
|
|
379
|
+
if Customer.FindSet() then
|
|
380
|
+
repeat
|
|
381
|
+
// Multiple database hits per customer
|
|
382
|
+
Customer.CalcFields("Sales (LCY)");
|
|
383
|
+
TotalSales := Customer."Sales (LCY)";
|
|
384
|
+
|
|
385
|
+
SalesHeader.SetRange("Sell-to Customer No.", Customer."No.");
|
|
386
|
+
SalesHeader.SetFilter("Order Date", '>=%1', CalcDate('-6M', Today()));
|
|
387
|
+
HasRecentOrder := not SalesHeader.IsEmpty();
|
|
388
|
+
|
|
389
|
+
IsHighValue := TotalSales > 50000;
|
|
390
|
+
IsActiveAccount := Customer.Blocked = Customer.Blocked::" ";
|
|
391
|
+
|
|
392
|
+
// Complex condition evaluated for every customer
|
|
393
|
+
if (IsActiveAccount = true) and
|
|
394
|
+
(IsHighValue = true) and
|
|
395
|
+
(HasRecentOrder = true) and
|
|
396
|
+
(Customer."Country/Region Code" = 'US') and
|
|
397
|
+
(Customer."Customer Posting Group" <> 'CASH') then
|
|
398
|
+
CustomerList.Add(Customer."No.");
|
|
399
|
+
until Customer.Next() = 0;
|
|
400
|
+
|
|
401
|
+
exit(CustomerList);
|
|
402
|
+
end;
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**Optimized Code:**
|
|
406
|
+
```al
|
|
407
|
+
procedure FindEligibleCustomersForPromotion(): List of [Code[20]]
|
|
408
|
+
var
|
|
409
|
+
Customer: Record Customer;
|
|
410
|
+
CustomerList: List of [Code[20]];
|
|
411
|
+
begin
|
|
412
|
+
// Pre-filter customers to reduce dataset
|
|
413
|
+
SetCustomerFiltersForPromotion(Customer);
|
|
414
|
+
|
|
415
|
+
if Customer.FindSet() then
|
|
416
|
+
repeat
|
|
417
|
+
if IsCustomerEligibleForPromotion(Customer) then
|
|
418
|
+
CustomerList.Add(Customer."No.");
|
|
419
|
+
until Customer.Next() = 0;
|
|
420
|
+
|
|
421
|
+
exit(CustomerList);
|
|
422
|
+
end;
|
|
423
|
+
|
|
424
|
+
local procedure SetCustomerFiltersForPromotion(var Customer: Record Customer)
|
|
425
|
+
begin
|
|
426
|
+
// Apply filters early to reduce record set
|
|
427
|
+
Customer.SetRange(Blocked, Customer.Blocked::" "); // Active accounts only
|
|
428
|
+
Customer.SetRange("Country/Region Code", 'US'); // US customers only
|
|
429
|
+
Customer.SetFilter("Customer Posting Group", '<>%1', 'CASH'); // Exclude cash customers
|
|
430
|
+
end;
|
|
431
|
+
|
|
432
|
+
local procedure IsCustomerEligibleForPromotion(Customer: Record Customer): Boolean
|
|
433
|
+
begin
|
|
434
|
+
// Short-circuit evaluation: check expensive operations last
|
|
435
|
+
exit(IsHighValueCustomer(Customer) and HasRecentActivity(Customer));
|
|
436
|
+
end;
|
|
437
|
+
|
|
438
|
+
local procedure IsHighValueCustomer(Customer: Record Customer): Boolean
|
|
439
|
+
begin
|
|
440
|
+
Customer.CalcFields("Sales (LCY)");
|
|
441
|
+
exit(Customer."Sales (LCY)" > 50000);
|
|
442
|
+
end;
|
|
443
|
+
|
|
444
|
+
local procedure HasRecentActivity(Customer: Record Customer): Boolean
|
|
445
|
+
var
|
|
446
|
+
SalesHeader: Record "Sales Header";
|
|
447
|
+
begin
|
|
448
|
+
SalesHeader.SetRange("Sell-to Customer No.", Customer."No.");
|
|
449
|
+
SalesHeader.SetFilter("Order Date", '>=%1', CalcDate('-6M', Today()));
|
|
450
|
+
exit(not SalesHeader.IsEmpty());
|
|
451
|
+
end;
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## Best Practices for Boolean Expression Simplification
|
|
455
|
+
|
|
456
|
+
### Readability Improvements
|
|
457
|
+
1. **Extract conditions into well-named boolean variables** for complex expressions
|
|
458
|
+
2. **Use early return patterns** to avoid deeply nested if-else structures
|
|
459
|
+
3. **Group related conditions** into separate validation methods
|
|
460
|
+
4. **Apply De Morgan's laws** to eliminate complex negative conditions
|
|
461
|
+
|
|
462
|
+
### Performance Optimizations
|
|
463
|
+
1. **Order conditions by evaluation cost** - simple checks first, expensive operations last
|
|
464
|
+
2. **Use short-circuit evaluation** to avoid unnecessary calculations
|
|
465
|
+
3. **Pre-filter datasets** before applying complex boolean logic
|
|
466
|
+
4. **Cache expensive boolean calculations** when used multiple times
|
|
467
|
+
|
|
468
|
+
### Maintainability Patterns
|
|
469
|
+
1. **Separate concerns** - group related validation logic together
|
|
470
|
+
2. **Use meaningful method names** that clearly indicate validation purpose
|
|
471
|
+
3. **Avoid magic numbers and values** in boolean expressions
|
|
472
|
+
4. **Document complex business logic** with comments explaining the reasoning
|
|
473
|
+
|
|
474
|
+
### Common Anti-Patterns to Avoid
|
|
475
|
+
1. **Redundant conditions** like `(Amount > 0) or (Amount < 0)` instead of `Amount <> 0`
|
|
476
|
+
2. **Comparing booleans to true/false** like `if (IsValid = true)` instead of `if IsValid`
|
|
477
|
+
3. **Complex negative conditions** that can be simplified with De Morgan's laws
|
|
478
|
+
4. **Mixing different validation concerns** in single boolean expressions
|
|
479
|
+
|
|
480
|
+
## Related Concepts
|
|
481
|
+
- **Guard Clauses**: Using early returns to simplify validation logic
|
|
482
|
+
- **Specification Pattern**: Encapsulating business rules in reusable boolean expressions
|
|
483
|
+
- **Chain of Responsibility**: Breaking complex validation into sequential checks
|
|
484
|
+
- **Short-Circuit Evaluation**: Leveraging AL's boolean evaluation order for performance
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Case Statement Error Handling - AL Code Samples
|
|
2
|
+
|
|
3
|
+
## Basic Error Handling Pattern
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
procedure ProcessOrderStatus(OrderStatus: Enum "Sales Document Status")
|
|
7
|
+
begin
|
|
8
|
+
case OrderStatus of
|
|
9
|
+
OrderStatus::Open:
|
|
10
|
+
ProcessOpenOrder();
|
|
11
|
+
OrderStatus::Released:
|
|
12
|
+
ProcessReleasedOrder();
|
|
13
|
+
OrderStatus::"Pending Approval":
|
|
14
|
+
ProcessPendingOrder();
|
|
15
|
+
else
|
|
16
|
+
Error('Unsupported order status: %1', OrderStatus);
|
|
17
|
+
end;
|
|
18
|
+
end;
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Safe Processing with TryFunction
|
|
22
|
+
|
|
23
|
+
```al
|
|
24
|
+
[TryFunction]
|
|
25
|
+
procedure ProcessOrderStatusSafe(OrderStatus: Enum "Sales Document Status"): Boolean
|
|
26
|
+
begin
|
|
27
|
+
case OrderStatus of
|
|
28
|
+
OrderStatus::Open:
|
|
29
|
+
exit(TryProcessOpenOrder());
|
|
30
|
+
OrderStatus::Released:
|
|
31
|
+
exit(TryProcessReleasedOrder());
|
|
32
|
+
else
|
|
33
|
+
exit(false);
|
|
34
|
+
end;
|
|
35
|
+
end;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Exception Recovery Pattern
|
|
39
|
+
|
|
40
|
+
```al
|
|
41
|
+
procedure ProcessWithRecovery(ProcessingType: Text; MaxAttempts: Integer)
|
|
42
|
+
var
|
|
43
|
+
Attempts: Integer;
|
|
44
|
+
Success: Boolean;
|
|
45
|
+
begin
|
|
46
|
+
repeat
|
|
47
|
+
Attempts += 1;
|
|
48
|
+
case ProcessingType of
|
|
49
|
+
'STANDARD':
|
|
50
|
+
Success := TryStandardProcessing();
|
|
51
|
+
'FALLBACK':
|
|
52
|
+
Success := TryFallbackProcessing();
|
|
53
|
+
else
|
|
54
|
+
Success := false;
|
|
55
|
+
end;
|
|
56
|
+
|
|
57
|
+
if not Success and (Attempts < MaxAttempts) then
|
|
58
|
+
Sleep(1000);
|
|
59
|
+
until Success or (Attempts >= MaxAttempts);
|
|
60
|
+
|
|
61
|
+
if not Success then
|
|
62
|
+
Error('Failed after %1 attempts', MaxAttempts);
|
|
63
|
+
end;
|
|
64
|
+
```
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# AL Compound Statement Readability Examples
|
|
2
|
+
|
|
3
|
+
## Basic Conditional Enhancement
|
|
4
|
+
|
|
5
|
+
### Before: Single Statement
|
|
6
|
+
```al
|
|
7
|
+
if CustomerExists then
|
|
8
|
+
CreateOrder();
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### After: Compound Statement
|
|
12
|
+
```al
|
|
13
|
+
if CustomerExists then begin
|
|
14
|
+
CreateOrder();
|
|
15
|
+
end;
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Complex Conditional Logic
|
|
19
|
+
|
|
20
|
+
### Nested Conditions with Clear Structure
|
|
21
|
+
```al
|
|
22
|
+
if ValidateCustomer(CustomerNo) then begin
|
|
23
|
+
if CheckCreditLimit(CustomerNo, OrderAmount) then begin
|
|
24
|
+
CreateSalesOrder(CustomerNo, OrderAmount);
|
|
25
|
+
UpdateCustomerBalance(CustomerNo, OrderAmount);
|
|
26
|
+
SendOrderConfirmation(CustomerNo);
|
|
27
|
+
end else begin
|
|
28
|
+
LogCreditLimitExceeded(CustomerNo, OrderAmount);
|
|
29
|
+
NotifyCustomerService(CustomerNo);
|
|
30
|
+
end;
|
|
31
|
+
end else begin
|
|
32
|
+
LogInvalidCustomer(CustomerNo);
|
|
33
|
+
RaiseCustomerValidationError(CustomerNo);
|
|
34
|
+
end;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Loop Structure Clarification
|
|
38
|
+
|
|
39
|
+
### For Loop with Single Statement
|
|
40
|
+
```al
|
|
41
|
+
for i := 1 to ItemCount do begin
|
|
42
|
+
ProcessItem(i);
|
|
43
|
+
end;
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### While Loop with Multiple Operations
|
|
47
|
+
```al
|
|
48
|
+
while not ItemLedgerEntry.IsEmpty() do begin
|
|
49
|
+
ItemLedgerEntry.CalcFields("Remaining Quantity");
|
|
50
|
+
if ItemLedgerEntry."Remaining Quantity" > 0 then begin
|
|
51
|
+
UpdateInventoryPosition(ItemLedgerEntry);
|
|
52
|
+
LogInventoryTransaction(ItemLedgerEntry);
|
|
53
|
+
end;
|
|
54
|
+
ItemLedgerEntry.Next();
|
|
55
|
+
end;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Error Handling Organization
|
|
59
|
+
|
|
60
|
+
### Exception Handling with Compound Blocks
|
|
61
|
+
```al
|
|
62
|
+
if not ValidateOrderData(SalesHeader) then begin
|
|
63
|
+
LogValidationError(SalesHeader."No.");
|
|
64
|
+
NotifyUser('Order validation failed');
|
|
65
|
+
exit(false);
|
|
66
|
+
end;
|
|
67
|
+
|
|
68
|
+
try
|
|
69
|
+
ProcessSalesOrder(SalesHeader);
|
|
70
|
+
except
|
|
71
|
+
on E: Exception do begin
|
|
72
|
+
LogException(E.Message, SalesHeader."No.");
|
|
73
|
+
RollbackTransaction();
|
|
74
|
+
RaiseOrderProcessingError(E.Message);
|
|
75
|
+
end;
|
|
76
|
+
end;
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Case Statement Structure
|
|
80
|
+
|
|
81
|
+
### Clear Case Branch Organization
|
|
82
|
+
```al
|
|
83
|
+
case DocumentType of
|
|
84
|
+
DocumentType::Quote:
|
|
85
|
+
begin
|
|
86
|
+
ValidateQuoteData();
|
|
87
|
+
UpdateQuoteStatus();
|
|
88
|
+
end;
|
|
89
|
+
DocumentType::Order:
|
|
90
|
+
begin
|
|
91
|
+
ValidateOrderData();
|
|
92
|
+
ReserveInventory();
|
|
93
|
+
UpdateOrderStatus();
|
|
94
|
+
end;
|
|
95
|
+
DocumentType::Invoice:
|
|
96
|
+
begin
|
|
97
|
+
ValidateInvoiceData();
|
|
98
|
+
PostToGeneralLedger();
|
|
99
|
+
UpdateInvoiceStatus();
|
|
100
|
+
end;
|
|
101
|
+
else
|
|
102
|
+
begin
|
|
103
|
+
LogUnsupportedDocumentType(DocumentType);
|
|
104
|
+
Error('Unsupported document type: %1', DocumentType);
|
|
105
|
+
end;
|
|
106
|
+
end;
|
|
107
|
+
```
|