bc-code-intelligence-mcp 1.3.4 → 1.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/layers/embedded-layer.d.ts.map +1 -1
- package/dist/layers/embedded-layer.js +40 -0
- package/dist/layers/embedded-layer.js.map +1 -1
- package/dist/services/enhanced-prompt-service.d.ts +1 -12
- package/dist/services/enhanced-prompt-service.d.ts.map +1 -1
- package/dist/services/enhanced-prompt-service.js +27 -38
- package/dist/services/enhanced-prompt-service.js.map +1 -1
- package/dist/services/methodology-service.d.ts.map +1 -1
- package/dist/services/methodology-service.js +15 -1
- package/dist/services/methodology-service.js.map +1 -1
- 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/facade-pattern-al-implementation.md +138 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
- package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
- package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
- package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
- package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +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/samples/bc24-no-series-conversion.md +186 -0
- package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
- package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
- package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
- package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
- package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
- package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
- package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
- package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
- package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
- package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
- package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
- package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
- package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
- package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
- package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
- package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
- package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
- package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
- package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
- package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
- package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
- package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
- package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
- package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
- package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
- package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
- package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
- package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
- package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
- package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
- package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
- package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
- package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
- package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
- package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
- package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
- package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
- package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
- package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
- package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
- package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
- package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
- package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
- package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
- package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
- package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
- package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
- package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
- package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
- package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
- package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
- package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
- package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
- package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
- package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
- package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
- package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
- package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
- package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
- package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
- package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
- package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
- package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
- package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
- package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
- package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
- package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
- package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
- package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
- package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
- package/embedded-knowledge/domains/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/specialists/alex-architect.md +216 -0
- package/embedded-knowledge/specialists/casey-copilot.md +226 -0
- package/embedded-knowledge/specialists/chris-config.md +267 -0
- package/embedded-knowledge/specialists/dean-debug.md +222 -0
- package/embedded-knowledge/specialists/eva-errors.md +235 -0
- package/embedded-knowledge/specialists/jordan-bridge.md +235 -0
- package/embedded-knowledge/specialists/logan-legacy.md +209 -0
- package/embedded-knowledge/specialists/maya-mentor.md +211 -0
- package/embedded-knowledge/specialists/morgan-market.md +226 -0
- package/embedded-knowledge/specialists/quinn-tester.md +235 -0
- package/embedded-knowledge/specialists/roger-reviewer.md +234 -0
- package/embedded-knowledge/specialists/sam-coder.md +359 -0
- package/embedded-knowledge/specialists/seth-security.md +235 -0
- package/embedded-knowledge/specialists/taylor-docs.md +257 -0
- package/embedded-knowledge/specialists/uma-ux.md +235 -0
- package/package.json +6 -6
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
# API Interface Design Patterns - AL Code Examples
|
|
2
|
+
|
|
3
|
+
This sample demonstrates effective API interface design patterns for maintainable, extensible APIs in Business Central.
|
|
4
|
+
|
|
5
|
+
## Basic Interface Design Patterns
|
|
6
|
+
|
|
7
|
+
```al
|
|
8
|
+
// Clean, focused interface for customer operations
|
|
9
|
+
interface ICustomerService
|
|
10
|
+
{
|
|
11
|
+
procedure CreateCustomer(CustomerData: Dictionary of [Text, Variant]): Code[20];
|
|
12
|
+
procedure UpdateCustomer(CustomerNo: Code[20]; UpdateData: Dictionary of [Text, Variant]): Boolean;
|
|
13
|
+
procedure GetCustomer(CustomerNo: Code[20]): Dictionary of [Text, Variant];
|
|
14
|
+
procedure DeleteCustomer(CustomerNo: Code[20]): Boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Separate interface for customer queries (Command-Query Separation)
|
|
18
|
+
interface ICustomerQuery
|
|
19
|
+
{
|
|
20
|
+
procedure FindCustomersByName(NamePattern: Text): List of [Code[20]];
|
|
21
|
+
procedure GetCustomerSalesHistory(CustomerNo: Code[20]; FromDate: Date; ToDate: Date): List of [Dictionary of [Text, Variant]];
|
|
22
|
+
procedure GetCustomerBalance(CustomerNo: Code[20]): Decimal;
|
|
23
|
+
procedure ValidateCustomerExists(CustomerNo: Code[20]): Boolean;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Fluent Interface Pattern
|
|
28
|
+
|
|
29
|
+
```al
|
|
30
|
+
// Fluent interface for sales order creation
|
|
31
|
+
interface ISalesOrderBuilder
|
|
32
|
+
{
|
|
33
|
+
procedure ForCustomer(CustomerNo: Code[20]): Interface ISalesOrderBuilder;
|
|
34
|
+
procedure WithOrderDate(OrderDate: Date): Interface ISalesOrderBuilder;
|
|
35
|
+
procedure AddItem(ItemNo: Code[20]; Quantity: Decimal): Interface ISalesOrderBuilder;
|
|
36
|
+
procedure AddItemWithPrice(ItemNo: Code[20]; Quantity: Decimal; UnitPrice: Decimal): Interface ISalesOrderBuilder;
|
|
37
|
+
procedure WithShipToAddress(Address: Dictionary of [Text, Variant]): Interface ISalesOrderBuilder;
|
|
38
|
+
procedure WithPaymentTerms(PaymentTermsCode: Code[10]): Interface ISalesOrderBuilder;
|
|
39
|
+
procedure Build(): Code[20];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Implementation of fluent interface
|
|
43
|
+
codeunit 50600 "Sales Order Builder" implements ISalesOrderBuilder
|
|
44
|
+
{
|
|
45
|
+
var
|
|
46
|
+
CustomerNo: Code[20];
|
|
47
|
+
OrderDate: Date;
|
|
48
|
+
Items: List of [Dictionary of [Text, Variant]];
|
|
49
|
+
ShipToAddress: Dictionary of [Text, Variant];
|
|
50
|
+
PaymentTermsCode: Code[10];
|
|
51
|
+
|
|
52
|
+
procedure ForCustomer(NewCustomerNo: Code[20]): Interface ISalesOrderBuilder
|
|
53
|
+
begin
|
|
54
|
+
CustomerNo := NewCustomerNo;
|
|
55
|
+
exit(this);
|
|
56
|
+
end;
|
|
57
|
+
|
|
58
|
+
procedure WithOrderDate(NewOrderDate: Date): Interface ISalesOrderBuilder
|
|
59
|
+
begin
|
|
60
|
+
OrderDate := NewOrderDate;
|
|
61
|
+
exit(this);
|
|
62
|
+
end;
|
|
63
|
+
|
|
64
|
+
procedure AddItem(ItemNo: Code[20]; Quantity: Decimal): Interface ISalesOrderBuilder
|
|
65
|
+
var
|
|
66
|
+
ItemData: Dictionary of [Text, Variant];
|
|
67
|
+
begin
|
|
68
|
+
ItemData.Set('ItemNo', ItemNo);
|
|
69
|
+
ItemData.Set('Quantity', Quantity);
|
|
70
|
+
Items.Add(ItemData);
|
|
71
|
+
exit(this);
|
|
72
|
+
end;
|
|
73
|
+
|
|
74
|
+
procedure AddItemWithPrice(ItemNo: Code[20]; Quantity: Decimal; UnitPrice: Decimal): Interface ISalesOrderBuilder
|
|
75
|
+
var
|
|
76
|
+
ItemData: Dictionary of [Text, Variant];
|
|
77
|
+
begin
|
|
78
|
+
ItemData.Set('ItemNo', ItemNo);
|
|
79
|
+
ItemData.Set('Quantity', Quantity);
|
|
80
|
+
ItemData.Set('UnitPrice', UnitPrice);
|
|
81
|
+
Items.Add(ItemData);
|
|
82
|
+
exit(this);
|
|
83
|
+
end;
|
|
84
|
+
|
|
85
|
+
procedure WithShipToAddress(Address: Dictionary of [Text, Variant]): Interface ISalesOrderBuilder
|
|
86
|
+
begin
|
|
87
|
+
ShipToAddress := Address;
|
|
88
|
+
exit(this);
|
|
89
|
+
end;
|
|
90
|
+
|
|
91
|
+
procedure WithPaymentTerms(NewPaymentTermsCode: Code[10]): Interface ISalesOrderBuilder
|
|
92
|
+
begin
|
|
93
|
+
PaymentTermsCode := NewPaymentTermsCode;
|
|
94
|
+
exit(this);
|
|
95
|
+
end;
|
|
96
|
+
|
|
97
|
+
procedure Build(): Code[20]
|
|
98
|
+
var
|
|
99
|
+
SalesHeader: Record "Sales Header";
|
|
100
|
+
SalesLine: Record "Sales Line";
|
|
101
|
+
ItemData: Dictionary of [Text, Variant];
|
|
102
|
+
LineNo: Integer;
|
|
103
|
+
begin
|
|
104
|
+
if CustomerNo = '' then
|
|
105
|
+
Error('Customer number is required');
|
|
106
|
+
|
|
107
|
+
// Create sales header
|
|
108
|
+
SalesHeader.Init();
|
|
109
|
+
SalesHeader."Document Type" := SalesHeader."Document Type"::Order;
|
|
110
|
+
SalesHeader."No." := '';
|
|
111
|
+
SalesHeader.Insert(true);
|
|
112
|
+
|
|
113
|
+
SalesHeader.Validate("Sell-to Customer No.", CustomerNo);
|
|
114
|
+
|
|
115
|
+
if OrderDate <> 0D then
|
|
116
|
+
SalesHeader.Validate("Order Date", OrderDate);
|
|
117
|
+
|
|
118
|
+
if PaymentTermsCode <> '' then
|
|
119
|
+
SalesHeader.Validate("Payment Terms Code", PaymentTermsCode);
|
|
120
|
+
|
|
121
|
+
SalesHeader.Modify(true);
|
|
122
|
+
|
|
123
|
+
// Add ship-to address if specified
|
|
124
|
+
if ShipToAddress.Count > 0 then
|
|
125
|
+
ApplyShipToAddress(SalesHeader, ShipToAddress);
|
|
126
|
+
|
|
127
|
+
// Add items
|
|
128
|
+
LineNo := 10000;
|
|
129
|
+
foreach ItemData in Items do begin
|
|
130
|
+
CreateSalesLine(SalesHeader, ItemData, LineNo);
|
|
131
|
+
LineNo += 10000;
|
|
132
|
+
end;
|
|
133
|
+
|
|
134
|
+
exit(SalesHeader."No.");
|
|
135
|
+
end;
|
|
136
|
+
|
|
137
|
+
local procedure ApplyShipToAddress(var SalesHeader: Record "Sales Header"; Address: Dictionary of [Text, Variant])
|
|
138
|
+
var
|
|
139
|
+
ShipToName: Text[100];
|
|
140
|
+
ShipToAddress1: Text[100];
|
|
141
|
+
ShipToCity: Text[30];
|
|
142
|
+
begin
|
|
143
|
+
if Address.Get('Name', ShipToName) then
|
|
144
|
+
SalesHeader.Validate("Ship-to Name", ShipToName);
|
|
145
|
+
|
|
146
|
+
if Address.Get('Address', ShipToAddress1) then
|
|
147
|
+
SalesHeader.Validate("Ship-to Address", ShipToAddress1);
|
|
148
|
+
|
|
149
|
+
if Address.Get('City', ShipToCity) then
|
|
150
|
+
SalesHeader.Validate("Ship-to City", ShipToCity);
|
|
151
|
+
|
|
152
|
+
SalesHeader.Modify(true);
|
|
153
|
+
end;
|
|
154
|
+
|
|
155
|
+
local procedure CreateSalesLine(SalesHeader: Record "Sales Header"; ItemData: Dictionary of [Text, Variant]; LineNo: Integer)
|
|
156
|
+
var
|
|
157
|
+
SalesLine: Record "Sales Line";
|
|
158
|
+
ItemNo: Code[20];
|
|
159
|
+
Quantity: Decimal;
|
|
160
|
+
UnitPrice: Decimal;
|
|
161
|
+
begin
|
|
162
|
+
SalesLine.Init();
|
|
163
|
+
SalesLine."Document Type" := SalesHeader."Document Type";
|
|
164
|
+
SalesLine."Document No." := SalesHeader."No.";
|
|
165
|
+
SalesLine."Line No." := LineNo;
|
|
166
|
+
SalesLine.Insert(true);
|
|
167
|
+
|
|
168
|
+
if ItemData.Get('ItemNo', ItemNo) then
|
|
169
|
+
SalesLine.Validate("No.", ItemNo);
|
|
170
|
+
|
|
171
|
+
if ItemData.Get('Quantity', Quantity) then
|
|
172
|
+
SalesLine.Validate(Quantity, Quantity);
|
|
173
|
+
|
|
174
|
+
if ItemData.Get('UnitPrice', UnitPrice) then
|
|
175
|
+
SalesLine.Validate("Unit Price", UnitPrice);
|
|
176
|
+
|
|
177
|
+
SalesLine.Modify(true);
|
|
178
|
+
end;
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Result Pattern for Error Handling
|
|
183
|
+
|
|
184
|
+
```al
|
|
185
|
+
// Result pattern for robust error handling
|
|
186
|
+
interface IOperationResult
|
|
187
|
+
{
|
|
188
|
+
procedure IsSuccess(): Boolean;
|
|
189
|
+
procedure IsFailure(): Boolean;
|
|
190
|
+
procedure GetErrorMessage(): Text;
|
|
191
|
+
procedure GetErrorCode(): Text[20];
|
|
192
|
+
procedure GetData(): Dictionary of [Text, Variant];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Implementation of operation result
|
|
196
|
+
codeunit 50601 "Operation Result" implements IOperationResult
|
|
197
|
+
{
|
|
198
|
+
var
|
|
199
|
+
Success: Boolean;
|
|
200
|
+
ErrorMessage: Text;
|
|
201
|
+
ErrorCode: Text[20];
|
|
202
|
+
Data: Dictionary of [Text, Variant];
|
|
203
|
+
|
|
204
|
+
procedure Initialize(IsSuccessful: Boolean; Message: Text; Code: Text[20]; ResultData: Dictionary of [Text, Variant])
|
|
205
|
+
begin
|
|
206
|
+
Success := IsSuccessful;
|
|
207
|
+
ErrorMessage := Message;
|
|
208
|
+
ErrorCode := Code;
|
|
209
|
+
Data := ResultData;
|
|
210
|
+
end;
|
|
211
|
+
|
|
212
|
+
procedure IsSuccess(): Boolean
|
|
213
|
+
begin
|
|
214
|
+
exit(Success);
|
|
215
|
+
end;
|
|
216
|
+
|
|
217
|
+
procedure IsFailure(): Boolean
|
|
218
|
+
begin
|
|
219
|
+
exit(not Success);
|
|
220
|
+
end;
|
|
221
|
+
|
|
222
|
+
procedure GetErrorMessage(): Text
|
|
223
|
+
begin
|
|
224
|
+
exit(ErrorMessage);
|
|
225
|
+
end;
|
|
226
|
+
|
|
227
|
+
procedure GetErrorCode(): Text[20]
|
|
228
|
+
begin
|
|
229
|
+
exit(ErrorCode);
|
|
230
|
+
end;
|
|
231
|
+
|
|
232
|
+
procedure GetData(): Dictionary of [Text, Variant]
|
|
233
|
+
begin
|
|
234
|
+
exit(Data);
|
|
235
|
+
end;
|
|
236
|
+
|
|
237
|
+
procedure CreateSuccess(ResultData: Dictionary of [Text, Variant]): Interface IOperationResult
|
|
238
|
+
var
|
|
239
|
+
Result: Codeunit "Operation Result";
|
|
240
|
+
begin
|
|
241
|
+
Result.Initialize(true, '', '', ResultData);
|
|
242
|
+
exit(Result);
|
|
243
|
+
end;
|
|
244
|
+
|
|
245
|
+
procedure CreateFailure(Message: Text; Code: Text[20]): Interface IOperationResult
|
|
246
|
+
var
|
|
247
|
+
Result: Codeunit "Operation Result";
|
|
248
|
+
EmptyData: Dictionary of [Text, Variant];
|
|
249
|
+
begin
|
|
250
|
+
Result.Initialize(false, Message, Code, EmptyData);
|
|
251
|
+
exit(Result);
|
|
252
|
+
end;
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Service Interface with Result Pattern
|
|
257
|
+
|
|
258
|
+
```al
|
|
259
|
+
// Enhanced customer service using result pattern
|
|
260
|
+
interface IAdvancedCustomerService
|
|
261
|
+
{
|
|
262
|
+
procedure CreateCustomer(CustomerData: Dictionary of [Text, Variant]): Interface IOperationResult;
|
|
263
|
+
procedure UpdateCustomer(CustomerNo: Code[20]; UpdateData: Dictionary of [Text, Variant]): Interface IOperationResult;
|
|
264
|
+
procedure GetCustomer(CustomerNo: Code[20]): Interface IOperationResult;
|
|
265
|
+
procedure ValidateCustomerData(CustomerData: Dictionary of [Text, Variant]): Interface IOperationResult;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Implementation with comprehensive error handling
|
|
269
|
+
codeunit 50602 "Advanced Customer Service" implements IAdvancedCustomerService
|
|
270
|
+
{
|
|
271
|
+
procedure CreateCustomer(CustomerData: Dictionary of [Text, Variant]): Interface IOperationResult
|
|
272
|
+
var
|
|
273
|
+
Customer: Record Customer;
|
|
274
|
+
ValidationResult: Interface IOperationResult;
|
|
275
|
+
CustomerNo: Code[20];
|
|
276
|
+
ResultData: Dictionary of [Text, Variant];
|
|
277
|
+
OperationResult: Codeunit "Operation Result";
|
|
278
|
+
begin
|
|
279
|
+
// Validate input data
|
|
280
|
+
ValidationResult := ValidateCustomerData(CustomerData);
|
|
281
|
+
if ValidationResult.IsFailure() then
|
|
282
|
+
exit(ValidationResult);
|
|
283
|
+
|
|
284
|
+
try
|
|
285
|
+
// Create customer
|
|
286
|
+
Customer.Init();
|
|
287
|
+
Customer."No." := '';
|
|
288
|
+
Customer.Insert(true);
|
|
289
|
+
CustomerNo := Customer."No.";
|
|
290
|
+
|
|
291
|
+
// Apply data
|
|
292
|
+
ApplyCustomerData(Customer, CustomerData);
|
|
293
|
+
|
|
294
|
+
// Prepare success result
|
|
295
|
+
ResultData.Set('CustomerNo', CustomerNo);
|
|
296
|
+
ResultData.Set('Created', true);
|
|
297
|
+
|
|
298
|
+
exit(OperationResult.CreateSuccess(ResultData));
|
|
299
|
+
|
|
300
|
+
except
|
|
301
|
+
exit(OperationResult.CreateFailure(GetLastErrorText(), 'CREATE_FAILED'));
|
|
302
|
+
end;
|
|
303
|
+
end;
|
|
304
|
+
|
|
305
|
+
procedure UpdateCustomer(CustomerNo: Code[20]; UpdateData: Dictionary of [Text, Variant]): Interface IOperationResult
|
|
306
|
+
var
|
|
307
|
+
Customer: Record Customer;
|
|
308
|
+
ValidationResult: Interface IOperationResult;
|
|
309
|
+
ResultData: Dictionary of [Text, Variant];
|
|
310
|
+
OperationResult: Codeunit "Operation Result";
|
|
311
|
+
begin
|
|
312
|
+
if not Customer.Get(CustomerNo) then
|
|
313
|
+
exit(OperationResult.CreateFailure(StrSubstNo('Customer %1 not found', CustomerNo), 'NOT_FOUND'));
|
|
314
|
+
|
|
315
|
+
// Validate update data
|
|
316
|
+
ValidationResult := ValidateCustomerData(UpdateData);
|
|
317
|
+
if ValidationResult.IsFailure() then
|
|
318
|
+
exit(ValidationResult);
|
|
319
|
+
|
|
320
|
+
try
|
|
321
|
+
ApplyCustomerData(Customer, UpdateData);
|
|
322
|
+
|
|
323
|
+
ResultData.Set('CustomerNo', CustomerNo);
|
|
324
|
+
ResultData.Set('Updated', true);
|
|
325
|
+
|
|
326
|
+
exit(OperationResult.CreateSuccess(ResultData));
|
|
327
|
+
|
|
328
|
+
except
|
|
329
|
+
exit(OperationResult.CreateFailure(GetLastErrorText(), 'UPDATE_FAILED'));
|
|
330
|
+
end;
|
|
331
|
+
end;
|
|
332
|
+
|
|
333
|
+
procedure GetCustomer(CustomerNo: Code[20]): Interface IOperationResult
|
|
334
|
+
var
|
|
335
|
+
Customer: Record Customer;
|
|
336
|
+
CustomerData: Dictionary of [Text, Variant];
|
|
337
|
+
OperationResult: Codeunit "Operation Result";
|
|
338
|
+
begin
|
|
339
|
+
if not Customer.Get(CustomerNo) then
|
|
340
|
+
exit(OperationResult.CreateFailure(StrSubstNo('Customer %1 not found', CustomerNo), 'NOT_FOUND'));
|
|
341
|
+
|
|
342
|
+
CustomerData := ExtractCustomerData(Customer);
|
|
343
|
+
exit(OperationResult.CreateSuccess(CustomerData));
|
|
344
|
+
end;
|
|
345
|
+
|
|
346
|
+
procedure ValidateCustomerData(CustomerData: Dictionary of [Text, Variant]): Interface IOperationResult
|
|
347
|
+
var
|
|
348
|
+
CustomerName: Text[100];
|
|
349
|
+
ValidationErrors: List of [Text];
|
|
350
|
+
ErrorMessage: Text;
|
|
351
|
+
OperationResult: Codeunit "Operation Result";
|
|
352
|
+
ResultData: Dictionary of [Text, Variant];
|
|
353
|
+
begin
|
|
354
|
+
// Validate required fields
|
|
355
|
+
if not CustomerData.Get('Name', CustomerName) or (CustomerName = '') then
|
|
356
|
+
ValidationErrors.Add('Customer name is required');
|
|
357
|
+
|
|
358
|
+
if CustomerName <> '' then begin
|
|
359
|
+
if StrLen(CustomerName) > 100 then
|
|
360
|
+
ValidationErrors.Add('Customer name cannot exceed 100 characters');
|
|
361
|
+
end;
|
|
362
|
+
|
|
363
|
+
// Additional validation logic...
|
|
364
|
+
|
|
365
|
+
if ValidationErrors.Count > 0 then begin
|
|
366
|
+
ErrorMessage := JoinErrors(ValidationErrors);
|
|
367
|
+
exit(OperationResult.CreateFailure(ErrorMessage, 'VALIDATION_FAILED'));
|
|
368
|
+
end;
|
|
369
|
+
|
|
370
|
+
ResultData.Set('Valid', true);
|
|
371
|
+
exit(OperationResult.CreateSuccess(ResultData));
|
|
372
|
+
end;
|
|
373
|
+
|
|
374
|
+
local procedure ApplyCustomerData(var Customer: Record Customer; CustomerData: Dictionary of [Text, Variant])
|
|
375
|
+
var
|
|
376
|
+
CustomerName: Text[100];
|
|
377
|
+
Address: Text[100];
|
|
378
|
+
City: Text[30];
|
|
379
|
+
PhoneNo: Text[30];
|
|
380
|
+
Email: Text[80];
|
|
381
|
+
begin
|
|
382
|
+
if CustomerData.Get('Name', CustomerName) then
|
|
383
|
+
Customer.Validate(Name, CustomerName);
|
|
384
|
+
|
|
385
|
+
if CustomerData.Get('Address', Address) then
|
|
386
|
+
Customer.Validate(Address, Address);
|
|
387
|
+
|
|
388
|
+
if CustomerData.Get('City', City) then
|
|
389
|
+
Customer.Validate(City, City);
|
|
390
|
+
|
|
391
|
+
if CustomerData.Get('PhoneNo', PhoneNo) then
|
|
392
|
+
Customer.Validate("Phone No.", PhoneNo);
|
|
393
|
+
|
|
394
|
+
if CustomerData.Get('Email', Email) then
|
|
395
|
+
Customer.Validate("E-Mail", Email);
|
|
396
|
+
|
|
397
|
+
Customer.Modify(true);
|
|
398
|
+
end;
|
|
399
|
+
|
|
400
|
+
local procedure ExtractCustomerData(Customer: Record Customer): Dictionary of [Text, Variant]
|
|
401
|
+
var
|
|
402
|
+
CustomerData: Dictionary of [Text, Variant];
|
|
403
|
+
begin
|
|
404
|
+
CustomerData.Set('CustomerNo', Customer."No.");
|
|
405
|
+
CustomerData.Set('Name', Customer.Name);
|
|
406
|
+
CustomerData.Set('Address', Customer.Address);
|
|
407
|
+
CustomerData.Set('City', Customer.City);
|
|
408
|
+
CustomerData.Set('PostCode', Customer."Post Code");
|
|
409
|
+
CustomerData.Set('PhoneNo', Customer."Phone No.");
|
|
410
|
+
CustomerData.Set('Email', Customer."E-Mail");
|
|
411
|
+
CustomerData.Set('CreditLimit', Customer."Credit Limit (LCY)");
|
|
412
|
+
CustomerData.Set('Blocked', Customer.Blocked);
|
|
413
|
+
|
|
414
|
+
exit(CustomerData);
|
|
415
|
+
end;
|
|
416
|
+
|
|
417
|
+
local procedure JoinErrors(Errors: List of [Text]): Text
|
|
418
|
+
var
|
|
419
|
+
ErrorMessage: Text;
|
|
420
|
+
Error: Text;
|
|
421
|
+
begin
|
|
422
|
+
foreach Error in Errors do begin
|
|
423
|
+
if ErrorMessage <> '' then
|
|
424
|
+
ErrorMessage += '; ';
|
|
425
|
+
ErrorMessage += Error;
|
|
426
|
+
end;
|
|
427
|
+
|
|
428
|
+
exit(ErrorMessage);
|
|
429
|
+
end;
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## Versioned Interface Pattern
|
|
434
|
+
|
|
435
|
+
```al
|
|
436
|
+
// Interface versioning for backward compatibility
|
|
437
|
+
interface ICustomerServiceV1
|
|
438
|
+
{
|
|
439
|
+
procedure CreateCustomer(Name: Text[100]; Address: Text[100]): Code[20];
|
|
440
|
+
procedure GetCustomerName(CustomerNo: Code[20]): Text[100];
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
interface ICustomerServiceV2 extends ICustomerServiceV1
|
|
444
|
+
{
|
|
445
|
+
procedure CreateCustomerAdvanced(CustomerData: Dictionary of [Text, Variant]): Interface IOperationResult;
|
|
446
|
+
procedure GetCustomerDetails(CustomerNo: Code[20]): Dictionary of [Text, Variant];
|
|
447
|
+
procedure UpdateCustomer(CustomerNo: Code[20]; UpdateData: Dictionary of [Text, Variant]): Interface IOperationResult;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Implementation supporting both versions
|
|
451
|
+
codeunit 50603 "Customer Service V2" implements ICustomerServiceV2
|
|
452
|
+
{
|
|
453
|
+
// V1 methods for backward compatibility
|
|
454
|
+
procedure CreateCustomer(Name: Text[100]; Address: Text[100]): Code[20]
|
|
455
|
+
var
|
|
456
|
+
CustomerData: Dictionary of [Text, Variant];
|
|
457
|
+
Result: Interface IOperationResult;
|
|
458
|
+
CustomerNo: Code[20];
|
|
459
|
+
begin
|
|
460
|
+
CustomerData.Set('Name', Name);
|
|
461
|
+
CustomerData.Set('Address', Address);
|
|
462
|
+
|
|
463
|
+
Result := CreateCustomerAdvanced(CustomerData);
|
|
464
|
+
if Result.IsSuccess() then begin
|
|
465
|
+
Result.GetData().Get('CustomerNo', CustomerNo);
|
|
466
|
+
exit(CustomerNo);
|
|
467
|
+
end else begin
|
|
468
|
+
Error(Result.GetErrorMessage());
|
|
469
|
+
end;
|
|
470
|
+
end;
|
|
471
|
+
|
|
472
|
+
procedure GetCustomerName(CustomerNo: Code[20]): Text[100]
|
|
473
|
+
var
|
|
474
|
+
CustomerDetails: Dictionary of [Text, Variant];
|
|
475
|
+
CustomerName: Text[100];
|
|
476
|
+
begin
|
|
477
|
+
CustomerDetails := GetCustomerDetails(CustomerNo);
|
|
478
|
+
if CustomerDetails.Get('Name', CustomerName) then
|
|
479
|
+
exit(CustomerName);
|
|
480
|
+
|
|
481
|
+
exit('');
|
|
482
|
+
end;
|
|
483
|
+
|
|
484
|
+
// V2 methods with enhanced functionality
|
|
485
|
+
procedure CreateCustomerAdvanced(CustomerData: Dictionary of [Text, Variant]): Interface IOperationResult
|
|
486
|
+
var
|
|
487
|
+
AdvancedService: Codeunit "Advanced Customer Service";
|
|
488
|
+
begin
|
|
489
|
+
exit(AdvancedService.CreateCustomer(CustomerData));
|
|
490
|
+
end;
|
|
491
|
+
|
|
492
|
+
procedure GetCustomerDetails(CustomerNo: Code[20]): Dictionary of [Text, Variant]
|
|
493
|
+
var
|
|
494
|
+
AdvancedService: Codeunit "Advanced Customer Service";
|
|
495
|
+
Result: Interface IOperationResult;
|
|
496
|
+
EmptyData: Dictionary of [Text, Variant];
|
|
497
|
+
begin
|
|
498
|
+
Result := AdvancedService.GetCustomer(CustomerNo);
|
|
499
|
+
if Result.IsSuccess() then
|
|
500
|
+
exit(Result.GetData())
|
|
501
|
+
else
|
|
502
|
+
exit(EmptyData);
|
|
503
|
+
end;
|
|
504
|
+
|
|
505
|
+
procedure UpdateCustomer(CustomerNo: Code[20]; UpdateData: Dictionary of [Text, Variant]): Interface IOperationResult
|
|
506
|
+
var
|
|
507
|
+
AdvancedService: Codeunit "Advanced Customer Service";
|
|
508
|
+
begin
|
|
509
|
+
exit(AdvancedService.UpdateCustomer(CustomerNo, UpdateData));
|
|
510
|
+
end;
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
## Usage Example
|
|
515
|
+
|
|
516
|
+
```al
|
|
517
|
+
// Example of using the designed interfaces
|
|
518
|
+
codeunit 50604 "API Usage Example"
|
|
519
|
+
{
|
|
520
|
+
procedure DemonstrateAPIUsage()
|
|
521
|
+
var
|
|
522
|
+
SalesOrderBuilder: Codeunit "Sales Order Builder";
|
|
523
|
+
CustomerService: Codeunit "Advanced Customer Service";
|
|
524
|
+
CustomerData: Dictionary of [Text, Variant];
|
|
525
|
+
ShipToAddress: Dictionary of [Text, Variant];
|
|
526
|
+
Result: Interface IOperationResult;
|
|
527
|
+
OrderNo: Code[20];
|
|
528
|
+
CustomerNo: Code[20];
|
|
529
|
+
begin
|
|
530
|
+
// Create customer using advanced service
|
|
531
|
+
CustomerData.Set('Name', 'Example Customer');
|
|
532
|
+
CustomerData.Set('Address', '123 Main Street');
|
|
533
|
+
CustomerData.Set('City', 'Example City');
|
|
534
|
+
CustomerData.Set('PhoneNo', '555-0123');
|
|
535
|
+
CustomerData.Set('Email', 'customer@example.com');
|
|
536
|
+
|
|
537
|
+
Result := CustomerService.CreateCustomer(CustomerData);
|
|
538
|
+
|
|
539
|
+
if Result.IsFailure() then begin
|
|
540
|
+
Message('Customer creation failed: %1', Result.GetErrorMessage());
|
|
541
|
+
exit;
|
|
542
|
+
end;
|
|
543
|
+
|
|
544
|
+
Result.GetData().Get('CustomerNo', CustomerNo);
|
|
545
|
+
|
|
546
|
+
// Create sales order using fluent interface
|
|
547
|
+
ShipToAddress.Set('Name', 'Shipping Department');
|
|
548
|
+
ShipToAddress.Set('Address', '456 Shipping Lane');
|
|
549
|
+
ShipToAddress.Set('City', 'Warehouse City');
|
|
550
|
+
|
|
551
|
+
OrderNo := SalesOrderBuilder
|
|
552
|
+
.ForCustomer(CustomerNo)
|
|
553
|
+
.WithOrderDate(Today)
|
|
554
|
+
.AddItem('ITEM001', 5)
|
|
555
|
+
.AddItemWithPrice('ITEM002', 10, 25.50)
|
|
556
|
+
.WithShipToAddress(ShipToAddress)
|
|
557
|
+
.WithPaymentTerms('30 DAYS')
|
|
558
|
+
.Build();
|
|
559
|
+
|
|
560
|
+
Message('Sales order %1 created successfully for customer %2', OrderNo, CustomerNo);
|
|
561
|
+
end;
|
|
562
|
+
}
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
This comprehensive example demonstrates clean API interface design with separation of concerns, fluent interfaces, robust error handling using the result pattern, and interface versioning for backward compatibility.
|