@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,280 @@
|
|
|
1
|
+
# AL Separate If-Else Formatting - Code Examples
|
|
2
|
+
|
|
3
|
+
## Good Examples
|
|
4
|
+
|
|
5
|
+
### Proper If-Else Separation with Clear Structure
|
|
6
|
+
```al
|
|
7
|
+
procedure ProcessCustomerStatus(CustomerNo: Code[20])
|
|
8
|
+
var
|
|
9
|
+
Customer: Record Customer;
|
|
10
|
+
begin
|
|
11
|
+
if Customer.Get(CustomerNo) then
|
|
12
|
+
begin
|
|
13
|
+
if not Customer.Blocked then
|
|
14
|
+
begin
|
|
15
|
+
Customer."Last Contact Date" := Today;
|
|
16
|
+
Customer.Modify();
|
|
17
|
+
Message('Customer %1 updated successfully', CustomerNo);
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
begin
|
|
21
|
+
Message('Customer %1 is blocked and cannot be updated', CustomerNo);
|
|
22
|
+
end;
|
|
23
|
+
end
|
|
24
|
+
else
|
|
25
|
+
begin
|
|
26
|
+
Error('Customer %1 does not exist', CustomerNo);
|
|
27
|
+
end;
|
|
28
|
+
end;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Multiple If-Else Conditions with Proper Separation
|
|
32
|
+
```al
|
|
33
|
+
procedure HandleOrderStatus(var SalesHeader: Record "Sales Header")
|
|
34
|
+
begin
|
|
35
|
+
if SalesHeader.Status = SalesHeader.Status::Open then
|
|
36
|
+
begin
|
|
37
|
+
EnableEditingActions();
|
|
38
|
+
SetStatusColor('Green');
|
|
39
|
+
ShowMessage('Order is open for editing');
|
|
40
|
+
end
|
|
41
|
+
else if SalesHeader.Status = SalesHeader.Status::Released then
|
|
42
|
+
begin
|
|
43
|
+
DisableEditingActions();
|
|
44
|
+
SetStatusColor('Blue');
|
|
45
|
+
ShowMessage('Order has been released');
|
|
46
|
+
end
|
|
47
|
+
else if SalesHeader.Status = SalesHeader.Status::"Pending Approval" then
|
|
48
|
+
begin
|
|
49
|
+
DisableEditingActions();
|
|
50
|
+
SetStatusColor('Yellow');
|
|
51
|
+
ShowMessage('Order is pending approval');
|
|
52
|
+
RequestApproval(SalesHeader);
|
|
53
|
+
end
|
|
54
|
+
else
|
|
55
|
+
begin
|
|
56
|
+
DisableAllActions();
|
|
57
|
+
SetStatusColor('Red');
|
|
58
|
+
ShowMessage('Order status is invalid');
|
|
59
|
+
end;
|
|
60
|
+
end;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Nested If-Else with Clear Block Structure
|
|
64
|
+
```al
|
|
65
|
+
procedure ValidateAndProcessOrder(OrderNo: Code[20])
|
|
66
|
+
var
|
|
67
|
+
SalesHeader: Record "Sales Header";
|
|
68
|
+
Customer: Record Customer;
|
|
69
|
+
begin
|
|
70
|
+
if SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo) then
|
|
71
|
+
begin
|
|
72
|
+
if Customer.Get(SalesHeader."Sell-to Customer No.") then
|
|
73
|
+
begin
|
|
74
|
+
if not Customer.Blocked then
|
|
75
|
+
begin
|
|
76
|
+
if SalesHeader."Order Date" <> 0D then
|
|
77
|
+
begin
|
|
78
|
+
ProcessValidOrder(SalesHeader);
|
|
79
|
+
Message('Order processed successfully');
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
begin
|
|
83
|
+
Error('Order date is required');
|
|
84
|
+
end;
|
|
85
|
+
end
|
|
86
|
+
else
|
|
87
|
+
begin
|
|
88
|
+
Error('Customer %1 is blocked', Customer."No.");
|
|
89
|
+
end;
|
|
90
|
+
end
|
|
91
|
+
else
|
|
92
|
+
begin
|
|
93
|
+
Error('Customer does not exist');
|
|
94
|
+
end;
|
|
95
|
+
end
|
|
96
|
+
else
|
|
97
|
+
begin
|
|
98
|
+
Error('Order %1 not found', OrderNo);
|
|
99
|
+
end;
|
|
100
|
+
end;
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Complex Business Logic with Proper If-Else Structure
|
|
104
|
+
```al
|
|
105
|
+
procedure CalculateDiscount(CustomerNo: Code[20]; OrderAmount: Decimal): Decimal
|
|
106
|
+
var
|
|
107
|
+
Customer: Record Customer;
|
|
108
|
+
DiscountPct: Decimal;
|
|
109
|
+
begin
|
|
110
|
+
if Customer.Get(CustomerNo) then
|
|
111
|
+
begin
|
|
112
|
+
if Customer."Customer Posting Group" = 'VIP' then
|
|
113
|
+
begin
|
|
114
|
+
if OrderAmount >= 10000 then
|
|
115
|
+
begin
|
|
116
|
+
DiscountPct := 15;
|
|
117
|
+
end
|
|
118
|
+
else if OrderAmount >= 5000 then
|
|
119
|
+
begin
|
|
120
|
+
DiscountPct := 10;
|
|
121
|
+
end
|
|
122
|
+
else
|
|
123
|
+
begin
|
|
124
|
+
DiscountPct := 5;
|
|
125
|
+
end;
|
|
126
|
+
end
|
|
127
|
+
else if Customer."Customer Posting Group" = 'PREMIUM' then
|
|
128
|
+
begin
|
|
129
|
+
if OrderAmount >= 5000 then
|
|
130
|
+
begin
|
|
131
|
+
DiscountPct := 8;
|
|
132
|
+
end
|
|
133
|
+
else
|
|
134
|
+
begin
|
|
135
|
+
DiscountPct := 3;
|
|
136
|
+
end;
|
|
137
|
+
end
|
|
138
|
+
else
|
|
139
|
+
begin
|
|
140
|
+
if OrderAmount >= 1000 then
|
|
141
|
+
begin
|
|
142
|
+
DiscountPct := 2;
|
|
143
|
+
end
|
|
144
|
+
else
|
|
145
|
+
begin
|
|
146
|
+
DiscountPct := 0;
|
|
147
|
+
end;
|
|
148
|
+
end;
|
|
149
|
+
end
|
|
150
|
+
else
|
|
151
|
+
begin
|
|
152
|
+
DiscountPct := 0;
|
|
153
|
+
end;
|
|
154
|
+
|
|
155
|
+
exit(DiscountPct);
|
|
156
|
+
end;
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Bad Examples
|
|
160
|
+
|
|
161
|
+
### Cramped If-Else on Same Lines
|
|
162
|
+
```al
|
|
163
|
+
procedure BadIfElseFormatting(CustomerNo: Code[20])
|
|
164
|
+
var
|
|
165
|
+
Customer: Record Customer;
|
|
166
|
+
begin
|
|
167
|
+
if Customer.Get(CustomerNo) then begin Customer."Last Contact Date" := Today; Customer.Modify(); end else begin Error('Customer not found'); end; // Bad: entire if-else on one line
|
|
168
|
+
|
|
169
|
+
if not Customer.Blocked then Message('Active customer') else Message('Blocked customer'); // Bad: no begin-end blocks, single line
|
|
170
|
+
end;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Poor Else Positioning
|
|
174
|
+
```al
|
|
175
|
+
procedure PoorElsePositioning(OrderNo: Code[20])
|
|
176
|
+
var
|
|
177
|
+
SalesHeader: Record "Sales Header";
|
|
178
|
+
begin
|
|
179
|
+
if SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo) then
|
|
180
|
+
begin
|
|
181
|
+
ProcessOrder(SalesHeader);
|
|
182
|
+
end else begin // Bad: else on same line as end
|
|
183
|
+
Error('Order not found');
|
|
184
|
+
end;
|
|
185
|
+
|
|
186
|
+
if SalesHeader.Status = SalesHeader.Status::Open then
|
|
187
|
+
begin
|
|
188
|
+
EnableEditing();
|
|
189
|
+
end
|
|
190
|
+
else // Bad: else indented incorrectly
|
|
191
|
+
begin
|
|
192
|
+
DisableEditing();
|
|
193
|
+
end;
|
|
194
|
+
end;
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Missing Begin-End Blocks
|
|
198
|
+
```al
|
|
199
|
+
procedure MissingBeginEnd(CustomerNo: Code[20])
|
|
200
|
+
var
|
|
201
|
+
Customer: Record Customer;
|
|
202
|
+
begin
|
|
203
|
+
if Customer.Get(CustomerNo) then
|
|
204
|
+
Customer."Last Contact Date" := Today;
|
|
205
|
+
Customer.Modify(); // Bad: this executes regardless of if condition
|
|
206
|
+
else
|
|
207
|
+
Error('Customer not found'); // Bad: this causes compilation error
|
|
208
|
+
|
|
209
|
+
if Customer.Blocked then
|
|
210
|
+
Customer.Blocked := false;
|
|
211
|
+
Message('Customer unblocked'); // Bad: this executes regardless of if condition
|
|
212
|
+
else
|
|
213
|
+
Message('Customer is active');
|
|
214
|
+
end;
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Inconsistent Formatting Styles
|
|
218
|
+
```al
|
|
219
|
+
procedure InconsistentFormatting(OrderNo: Code[20])
|
|
220
|
+
var
|
|
221
|
+
SalesHeader: Record "Sales Header";
|
|
222
|
+
Customer: Record Customer;
|
|
223
|
+
begin
|
|
224
|
+
// Style 1: proper formatting
|
|
225
|
+
if SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo) then
|
|
226
|
+
begin
|
|
227
|
+
ProcessOrder(SalesHeader);
|
|
228
|
+
end
|
|
229
|
+
else
|
|
230
|
+
begin
|
|
231
|
+
Error('Order not found');
|
|
232
|
+
end;
|
|
233
|
+
|
|
234
|
+
// Style 2: cramped formatting
|
|
235
|
+
if Customer.Get(SalesHeader."Sell-to Customer No.") then begin ProcessCustomer(Customer); end else begin Error('Customer not found'); end;
|
|
236
|
+
|
|
237
|
+
// Style 3: missing blocks
|
|
238
|
+
if SalesHeader."Order Date" = Today then
|
|
239
|
+
Message('Today order')
|
|
240
|
+
else
|
|
241
|
+
Message('Past order');
|
|
242
|
+
end;
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Complex Nested Logic Without Clear Structure
|
|
246
|
+
```al
|
|
247
|
+
procedure PoorNestedStructure(OrderNo: Code[20])
|
|
248
|
+
var
|
|
249
|
+
SalesHeader: Record "Sales Header";
|
|
250
|
+
Customer: Record Customer;
|
|
251
|
+
begin
|
|
252
|
+
if SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo) then if Customer.Get(SalesHeader."Sell-to Customer No.") then if not Customer.Blocked then if SalesHeader."Order Date" <> 0D then ProcessValidOrder(SalesHeader) else Error('No order date') else Error('Customer blocked') else Error('Customer not found') else Error('Order not found'); // Bad: entire nested structure on one line
|
|
253
|
+
end;
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Poor Else-If Chain Formatting
|
|
257
|
+
```al
|
|
258
|
+
procedure PoorElseIfChain(Status: Option Open,Released,Pending,Cancelled)
|
|
259
|
+
begin
|
|
260
|
+
if Status = Status::Open then begin
|
|
261
|
+
EnableEditing();
|
|
262
|
+
end else if Status = Status::Released then begin // Bad: else if on same line as end
|
|
263
|
+
DisableEditing();
|
|
264
|
+
end
|
|
265
|
+
else if Status = Status::Pending then // Bad: inconsistent else positioning
|
|
266
|
+
begin
|
|
267
|
+
RequestApproval();
|
|
268
|
+
end else begin // Bad: else on same line as end
|
|
269
|
+
ShowError();
|
|
270
|
+
end;
|
|
271
|
+
end;
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Best Practices
|
|
275
|
+
|
|
276
|
+
1. **Separate if and else blocks** with proper line breaks
|
|
277
|
+
2. **Use begin-end blocks** for all multi-statement conditions
|
|
278
|
+
3. **Consistent else positioning** - always on its own line aligned with corresponding if
|
|
279
|
+
4. **Clear visual hierarchy** through proper indentation
|
|
280
|
+
5. **Avoid cramping** multiple conditions or statements on single lines
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# AL Statement Per Line Rule - Code Examples
|
|
2
|
+
|
|
3
|
+
## Good Examples
|
|
4
|
+
|
|
5
|
+
### Single Statement Per Line
|
|
6
|
+
```al
|
|
7
|
+
procedure ProcessCustomerOrder(CustomerNo: Code[20])
|
|
8
|
+
var
|
|
9
|
+
Customer: Record Customer;
|
|
10
|
+
SalesHeader: Record "Sales Header";
|
|
11
|
+
OrderNo: Code[20];
|
|
12
|
+
begin
|
|
13
|
+
// Each statement on its own line for clarity
|
|
14
|
+
Customer.Get(CustomerNo);
|
|
15
|
+
Customer.CalcFields("Balance (LCY)");
|
|
16
|
+
|
|
17
|
+
SalesHeader.Init();
|
|
18
|
+
SalesHeader."Document Type" := SalesHeader."Document Type"::Order;
|
|
19
|
+
SalesHeader."Sell-to Customer No." := CustomerNo;
|
|
20
|
+
SalesHeader."Order Date" := Today;
|
|
21
|
+
SalesHeader.Insert(true);
|
|
22
|
+
|
|
23
|
+
OrderNo := SalesHeader."No.";
|
|
24
|
+
Message('Order %1 created successfully', OrderNo);
|
|
25
|
+
end;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Variable Declarations - One Per Line
|
|
29
|
+
```al
|
|
30
|
+
procedure CalculateOrderTotals(OrderNo: Code[20])
|
|
31
|
+
var
|
|
32
|
+
SalesHeader: Record "Sales Header";
|
|
33
|
+
SalesLine: Record "Sales Line";
|
|
34
|
+
TotalAmount: Decimal;
|
|
35
|
+
TotalQuantity: Decimal;
|
|
36
|
+
LineCount: Integer;
|
|
37
|
+
DiscountAmount: Decimal;
|
|
38
|
+
begin
|
|
39
|
+
SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo);
|
|
40
|
+
|
|
41
|
+
SalesLine.SetRange("Document Type", SalesLine."Document Type"::Order);
|
|
42
|
+
SalesLine.SetRange("Document No.", OrderNo);
|
|
43
|
+
|
|
44
|
+
if SalesLine.FindSet() then
|
|
45
|
+
repeat
|
|
46
|
+
TotalAmount += SalesLine."Line Amount";
|
|
47
|
+
TotalQuantity += SalesLine.Quantity;
|
|
48
|
+
LineCount += 1;
|
|
49
|
+
DiscountAmount += SalesLine."Line Discount Amount";
|
|
50
|
+
until SalesLine.Next() = 0;
|
|
51
|
+
|
|
52
|
+
SalesHeader."Total Amount" := TotalAmount;
|
|
53
|
+
SalesHeader."Total Quantity" := TotalQuantity;
|
|
54
|
+
SalesHeader.Modify();
|
|
55
|
+
end;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Control Flow Statements
|
|
59
|
+
```al
|
|
60
|
+
procedure ValidateOrderData(var SalesHeader: Record "Sales Header"): Boolean
|
|
61
|
+
var
|
|
62
|
+
Customer: Record Customer;
|
|
63
|
+
ValidationResult: Boolean;
|
|
64
|
+
begin
|
|
65
|
+
ValidationResult := true;
|
|
66
|
+
|
|
67
|
+
if SalesHeader."Sell-to Customer No." = '' then
|
|
68
|
+
ValidationResult := false;
|
|
69
|
+
|
|
70
|
+
if ValidationResult then
|
|
71
|
+
if not Customer.Get(SalesHeader."Sell-to Customer No.") then
|
|
72
|
+
ValidationResult := false;
|
|
73
|
+
|
|
74
|
+
if ValidationResult then
|
|
75
|
+
if Customer.Blocked then
|
|
76
|
+
ValidationResult := false;
|
|
77
|
+
|
|
78
|
+
if ValidationResult then
|
|
79
|
+
if SalesHeader."Order Date" = 0D then
|
|
80
|
+
ValidationResult := false;
|
|
81
|
+
|
|
82
|
+
exit(ValidationResult);
|
|
83
|
+
end;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Complex Expressions Broken Down
|
|
87
|
+
```al
|
|
88
|
+
procedure CalculateComplexPricing(ItemNo: Code[20]; CustomerNo: Code[20]; Quantity: Decimal): Decimal
|
|
89
|
+
var
|
|
90
|
+
Item: Record Item;
|
|
91
|
+
Customer: Record Customer;
|
|
92
|
+
BasePrice: Decimal;
|
|
93
|
+
CustomerDiscount: Decimal;
|
|
94
|
+
VolumeDiscount: Decimal;
|
|
95
|
+
FinalPrice: Decimal;
|
|
96
|
+
begin
|
|
97
|
+
Item.Get(ItemNo);
|
|
98
|
+
Customer.Get(CustomerNo);
|
|
99
|
+
|
|
100
|
+
BasePrice := Item."Unit Price";
|
|
101
|
+
CustomerDiscount := GetCustomerDiscount(CustomerNo);
|
|
102
|
+
VolumeDiscount := GetVolumeDiscount(Quantity);
|
|
103
|
+
|
|
104
|
+
FinalPrice := BasePrice;
|
|
105
|
+
FinalPrice := FinalPrice * (1 - CustomerDiscount / 100);
|
|
106
|
+
FinalPrice := FinalPrice * (1 - VolumeDiscount / 100);
|
|
107
|
+
|
|
108
|
+
exit(FinalPrice);
|
|
109
|
+
end;
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Bad Examples
|
|
113
|
+
|
|
114
|
+
### Multiple Statements Per Line
|
|
115
|
+
```al
|
|
116
|
+
procedure BadMultipleStatements(CustomerNo: Code[20])
|
|
117
|
+
var
|
|
118
|
+
Customer: Record Customer; SalesHeader: Record "Sales Header"; OrderNo: Code[20]; // Bad: multiple declarations
|
|
119
|
+
begin
|
|
120
|
+
Customer.Get(CustomerNo); Customer.CalcFields("Balance (LCY)"); SalesHeader.Init(); // Bad: multiple statements
|
|
121
|
+
SalesHeader."Document Type" := SalesHeader."Document Type"::Order; SalesHeader."Sell-to Customer No." := CustomerNo; SalesHeader.Insert(true); // Bad: cramped assignments
|
|
122
|
+
OrderNo := SalesHeader."No."; Message('Order %1 created', OrderNo); // Bad: multiple statements
|
|
123
|
+
end;
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Cramped Control Flow
|
|
127
|
+
```al
|
|
128
|
+
procedure BadControlFlow(OrderNo: Code[20])
|
|
129
|
+
var
|
|
130
|
+
SalesLine: Record "Sales Line"; Total: Decimal; // Bad: multiple declarations
|
|
131
|
+
begin
|
|
132
|
+
SalesLine.SetRange("Document No.", OrderNo); if SalesLine.FindSet() then repeat Total += SalesLine."Line Amount"; until SalesLine.Next() = 0; // Bad: entire loop on one line
|
|
133
|
+
if Total > 1000 then Message('Large order') else Message('Small order'); // Bad: if-else on one line
|
|
134
|
+
end;
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Complex Expressions on Single Lines
|
|
138
|
+
```al
|
|
139
|
+
procedure BadComplexExpressions(ItemNo: Code[20]; CustomerNo: Code[20]; Qty: Decimal): Decimal
|
|
140
|
+
var
|
|
141
|
+
Item: Record Item; Customer: Record Customer; // Bad: multiple declarations
|
|
142
|
+
begin
|
|
143
|
+
Item.Get(ItemNo); Customer.Get(CustomerNo); // Bad: multiple statements
|
|
144
|
+
exit(Item."Unit Price" * (1 - GetCustomerDiscount(CustomerNo) / 100) * (1 - GetVolumeDiscount(Qty) / 100) * Qty); // Bad: complex calculation on one line
|
|
145
|
+
end;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Nested Structures Cramped
|
|
149
|
+
```al
|
|
150
|
+
procedure BadNesting(OrderNo: Code[20])
|
|
151
|
+
var
|
|
152
|
+
SalesLine: Record "Sales Line"; Item: Record Item; // Bad: multiple declarations
|
|
153
|
+
begin
|
|
154
|
+
SalesLine.SetRange("Document No.", OrderNo); if SalesLine.FindSet() then repeat if SalesLine.Type = SalesLine.Type::Item then if Item.Get(SalesLine."No.") then if Item.Inventory < SalesLine.Quantity then Error('Low inventory') else Item.Modify(); until SalesLine.Next() = 0; // Bad: complex nested logic on one line
|
|
155
|
+
end;
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Variable Assignments and Calculations Cramped
|
|
159
|
+
```al
|
|
160
|
+
procedure BadCalculations()
|
|
161
|
+
var
|
|
162
|
+
Price, Discount, Tax, Total: Decimal; // Bad: multiple declarations on one line
|
|
163
|
+
Qty1, Qty2, Qty3: Integer; // Bad: multiple declarations
|
|
164
|
+
begin
|
|
165
|
+
Price := 100; Discount := 0.1; Tax := 0.08; Qty1 := 5; Qty2 := 3; Qty3 := 2; // Bad: multiple assignments
|
|
166
|
+
Total := (Price * (Qty1 + Qty2 + Qty3)) * (1 - Discount) * (1 + Tax); // Bad: complex calculation
|
|
167
|
+
Message('Total: %1', Total); Exit(Total); // Bad: multiple statements
|
|
168
|
+
end;
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Poor Error Handling Structure
|
|
172
|
+
```al
|
|
173
|
+
procedure BadErrorHandling(CustomerNo: Code[20])
|
|
174
|
+
var
|
|
175
|
+
Customer: Record Customer; ErrorMsg: Text; // Bad: multiple declarations
|
|
176
|
+
begin
|
|
177
|
+
if not Customer.Get(CustomerNo) then ErrorMsg := 'Customer not found'; if Customer.Blocked then ErrorMsg += ' and blocked'; if ErrorMsg <> '' then Error(ErrorMsg); // Bad: complex error logic on one line
|
|
178
|
+
end;
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Best Practices
|
|
182
|
+
|
|
183
|
+
1. **One statement per line** - each operation should have its own line
|
|
184
|
+
2. **One variable declaration per line** - easier to read and maintain
|
|
185
|
+
3. **Break complex expressions** into multiple assignment statements
|
|
186
|
+
4. **Separate logical operations** even if they could be combined
|
|
187
|
+
5. **Use meaningful intermediate variables** for complex calculations
|
|
188
|
+
6. **Structure control flow** with proper line breaks and indentation
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# Unnecessary Else Elimination - AL Code Examples
|
|
2
|
+
|
|
3
|
+
## Good Examples
|
|
4
|
+
|
|
5
|
+
### Early Return Pattern
|
|
6
|
+
```al
|
|
7
|
+
procedure ValidateCustomerCredit(CustomerNo: Code[20]): Boolean
|
|
8
|
+
var
|
|
9
|
+
Customer: Record Customer;
|
|
10
|
+
CustLedgerEntry: Record "Cust. Ledger Entry";
|
|
11
|
+
TotalOutstanding: Decimal;
|
|
12
|
+
begin
|
|
13
|
+
// Early exit for invalid customer
|
|
14
|
+
if not Customer.Get(CustomerNo) then
|
|
15
|
+
exit(false);
|
|
16
|
+
|
|
17
|
+
// Early exit if credit check disabled
|
|
18
|
+
if not Customer."Credit Limit (LCY)" > 0 then
|
|
19
|
+
exit(true);
|
|
20
|
+
|
|
21
|
+
// Calculate outstanding amount
|
|
22
|
+
CustLedgerEntry.SetRange("Customer No.", CustomerNo);
|
|
23
|
+
CustLedgerEntry.SetRange(Open, true);
|
|
24
|
+
CustLedgerEntry.CalcSums("Remaining Amt. (LCY)");
|
|
25
|
+
TotalOutstanding := CustLedgerEntry."Remaining Amt. (LCY)";
|
|
26
|
+
|
|
27
|
+
// Direct return without else
|
|
28
|
+
exit(TotalOutstanding <= Customer."Credit Limit (LCY)");
|
|
29
|
+
end;
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Guard Clause Implementation
|
|
33
|
+
```al
|
|
34
|
+
procedure ProcessSalesOrder(DocumentNo: Code[20]): Boolean
|
|
35
|
+
var
|
|
36
|
+
SalesHeader: Record "Sales Header";
|
|
37
|
+
SalesLine: Record "Sales Line";
|
|
38
|
+
begin
|
|
39
|
+
// Guard clause - early exit
|
|
40
|
+
if DocumentNo = '' then
|
|
41
|
+
exit(false);
|
|
42
|
+
|
|
43
|
+
// Guard clause - record validation
|
|
44
|
+
if not SalesHeader.Get(SalesHeader."Document Type"::Order, DocumentNo) then
|
|
45
|
+
exit(false);
|
|
46
|
+
|
|
47
|
+
// Guard clause - status validation
|
|
48
|
+
if SalesHeader.Status <> SalesHeader.Status::Open then
|
|
49
|
+
exit(false);
|
|
50
|
+
|
|
51
|
+
// Main processing logic
|
|
52
|
+
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
|
|
53
|
+
SalesLine.SetRange("Document No.", SalesHeader."No.");
|
|
54
|
+
if SalesLine.FindSet() then
|
|
55
|
+
repeat
|
|
56
|
+
ProcessSalesLine(SalesLine);
|
|
57
|
+
until SalesLine.Next() = 0;
|
|
58
|
+
|
|
59
|
+
exit(true);
|
|
60
|
+
end;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Streamlined Control Flow
|
|
64
|
+
```al
|
|
65
|
+
procedure CalculateItemCost(ItemNo: Code[20]; Quantity: Decimal): Decimal
|
|
66
|
+
var
|
|
67
|
+
Item: Record Item;
|
|
68
|
+
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
69
|
+
begin
|
|
70
|
+
// Early validation without nested else
|
|
71
|
+
if ItemNo = '' then
|
|
72
|
+
exit(0);
|
|
73
|
+
|
|
74
|
+
if Quantity <= 0 then
|
|
75
|
+
exit(0);
|
|
76
|
+
|
|
77
|
+
if not Item.Get(ItemNo) then
|
|
78
|
+
exit(0);
|
|
79
|
+
|
|
80
|
+
// Calculate based on costing method
|
|
81
|
+
case Item."Costing Method" of
|
|
82
|
+
Item."Costing Method"::FIFO:
|
|
83
|
+
exit(CalculateFIFOCost(ItemNo, Quantity));
|
|
84
|
+
Item."Costing Method"::LIFO:
|
|
85
|
+
exit(CalculateLIFOCost(ItemNo, Quantity));
|
|
86
|
+
Item."Costing Method"::Average:
|
|
87
|
+
exit(Item."Unit Cost" * Quantity);
|
|
88
|
+
else
|
|
89
|
+
exit(Item."Last Direct Cost" * Quantity);
|
|
90
|
+
end;
|
|
91
|
+
end;
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Bad Examples
|
|
95
|
+
|
|
96
|
+
### Unnecessary Else Chains
|
|
97
|
+
```al
|
|
98
|
+
procedure ValidateCustomerCredit(CustomerNo: Code[20]): Boolean
|
|
99
|
+
var
|
|
100
|
+
Customer: Record Customer;
|
|
101
|
+
CustLedgerEntry: Record "Cust. Ledger Entry";
|
|
102
|
+
TotalOutstanding: Decimal;
|
|
103
|
+
begin
|
|
104
|
+
if CustomerNo = '' then begin
|
|
105
|
+
exit(false);
|
|
106
|
+
end else begin
|
|
107
|
+
if Customer.Get(CustomerNo) then begin
|
|
108
|
+
if Customer."Credit Limit (LCY)" > 0 then begin
|
|
109
|
+
CustLedgerEntry.SetRange("Customer No.", CustomerNo);
|
|
110
|
+
CustLedgerEntry.SetRange(Open, true);
|
|
111
|
+
CustLedgerEntry.CalcSums("Remaining Amt. (LCY)");
|
|
112
|
+
TotalOutstanding := CustLedgerEntry."Remaining Amt. (LCY)";
|
|
113
|
+
if TotalOutstanding <= Customer."Credit Limit (LCY)" then begin
|
|
114
|
+
exit(true);
|
|
115
|
+
end else begin
|
|
116
|
+
exit(false);
|
|
117
|
+
end;
|
|
118
|
+
end else begin
|
|
119
|
+
exit(true);
|
|
120
|
+
end;
|
|
121
|
+
end else begin
|
|
122
|
+
exit(false);
|
|
123
|
+
end;
|
|
124
|
+
end;
|
|
125
|
+
end;
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Nested Else Complexity
|
|
129
|
+
```al
|
|
130
|
+
procedure ProcessDocument(DocumentType: Integer; DocumentNo: Code[20]): Boolean
|
|
131
|
+
var
|
|
132
|
+
ProcessingResult: Boolean;
|
|
133
|
+
begin
|
|
134
|
+
if DocumentType = 1 then begin
|
|
135
|
+
ProcessingResult := ProcessSalesDocument(DocumentNo);
|
|
136
|
+
if ProcessingResult then begin
|
|
137
|
+
exit(true);
|
|
138
|
+
end else begin
|
|
139
|
+
exit(false);
|
|
140
|
+
end;
|
|
141
|
+
end else begin
|
|
142
|
+
if DocumentType = 2 then begin
|
|
143
|
+
ProcessingResult := ProcessPurchaseDocument(DocumentNo);
|
|
144
|
+
if ProcessingResult then begin
|
|
145
|
+
exit(true);
|
|
146
|
+
end else begin
|
|
147
|
+
exit(false);
|
|
148
|
+
end;
|
|
149
|
+
end else begin
|
|
150
|
+
if DocumentType = 3 then begin
|
|
151
|
+
ProcessingResult := ProcessServiceDocument(DocumentNo);
|
|
152
|
+
if ProcessingResult then begin
|
|
153
|
+
exit(true);
|
|
154
|
+
end else begin
|
|
155
|
+
exit(false);
|
|
156
|
+
end;
|
|
157
|
+
end else begin
|
|
158
|
+
exit(false);
|
|
159
|
+
end;
|
|
160
|
+
end;
|
|
161
|
+
end;
|
|
162
|
+
end;
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Best Practices
|
|
166
|
+
|
|
167
|
+
### Boolean Return Simplification
|
|
168
|
+
```al
|
|
169
|
+
procedure IsItemBlocked(ItemNo: Code[20]): Boolean
|
|
170
|
+
var
|
|
171
|
+
Item: Record Item;
|
|
172
|
+
begin
|
|
173
|
+
// Good: Direct boolean return
|
|
174
|
+
if not Item.Get(ItemNo) then
|
|
175
|
+
exit(true);
|
|
176
|
+
|
|
177
|
+
exit(Item.Blocked);
|
|
178
|
+
|
|
179
|
+
// Avoid: Unnecessary if-then-else for boolean
|
|
180
|
+
// if Item.Blocked then
|
|
181
|
+
// exit(true)
|
|
182
|
+
// else
|
|
183
|
+
// exit(false);
|
|
184
|
+
end;
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Case Statement Optimization
|
|
188
|
+
```al
|
|
189
|
+
procedure GetDocumentStatus(Status: Option Open,Released,Pending): Text
|
|
190
|
+
begin
|
|
191
|
+
// Good: Case with early returns
|
|
192
|
+
case Status of
|
|
193
|
+
Status::Open:
|
|
194
|
+
exit('OPEN');
|
|
195
|
+
Status::Released:
|
|
196
|
+
exit('RELEASED');
|
|
197
|
+
Status::Pending:
|
|
198
|
+
exit('PENDING');
|
|
199
|
+
else
|
|
200
|
+
exit('UNKNOWN');
|
|
201
|
+
end;
|
|
202
|
+
|
|
203
|
+
// Avoid: Nested if-else chains
|
|
204
|
+
// if Status = Status::Open then
|
|
205
|
+
// exit('OPEN')
|
|
206
|
+
// else if Status = Status::Released then
|
|
207
|
+
// exit('RELEASED')
|
|
208
|
+
// else if Status = Status::Pending then
|
|
209
|
+
// exit('PENDING')
|
|
210
|
+
// else
|
|
211
|
+
// exit('UNKNOWN');
|
|
212
|
+
end;
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Exception Handling Pattern
|
|
216
|
+
```al
|
|
217
|
+
procedure SafelyProcessRecord(RecordID: RecordID): Boolean
|
|
218
|
+
var
|
|
219
|
+
RecordRef: RecordRef;
|
|
220
|
+
begin
|
|
221
|
+
// Early exit on invalid input
|
|
222
|
+
if RecordID.TableNo = 0 then
|
|
223
|
+
exit(false);
|
|
224
|
+
|
|
225
|
+
// Early exit if record doesn't exist
|
|
226
|
+
if not RecordRef.Get(RecordID) then
|
|
227
|
+
exit(false);
|
|
228
|
+
|
|
229
|
+
// Early exit if record is already processed
|
|
230
|
+
if IsRecordProcessed(RecordRef) then
|
|
231
|
+
exit(true);
|
|
232
|
+
|
|
233
|
+
// Main processing
|
|
234
|
+
exit(ProcessRecord(RecordRef));
|
|
235
|
+
end;
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Implementation Guidelines
|
|
239
|
+
|
|
240
|
+
1. **Replace nested if-else with early returns** - Reduce cognitive complexity
|
|
241
|
+
2. **Use guard clauses for validation** - Handle edge cases at procedure start
|
|
242
|
+
3. **Simplify boolean returns** - Return boolean expressions directly
|
|
243
|
+
4. **Prefer case statements** - For multiple discrete value comparisons
|
|
244
|
+
5. **Apply consistent patterns** - Use same structure across similar procedures
|
|
245
|
+
6. **Test thoroughly** - Ensure refactored logic maintains original behavior
|