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.
Files changed (522) hide show
  1. package/dist/layers/embedded-layer.d.ts.map +1 -1
  2. package/dist/layers/embedded-layer.js +40 -0
  3. package/dist/layers/embedded-layer.js.map +1 -1
  4. package/dist/services/enhanced-prompt-service.d.ts +1 -12
  5. package/dist/services/enhanced-prompt-service.d.ts.map +1 -1
  6. package/dist/services/enhanced-prompt-service.js +27 -38
  7. package/dist/services/enhanced-prompt-service.js.map +1 -1
  8. package/dist/services/methodology-service.d.ts.map +1 -1
  9. package/dist/services/methodology-service.js +15 -1
  10. package/dist/services/methodology-service.js.map +1 -1
  11. package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
  12. package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
  13. package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
  14. package/embedded-knowledge/AGENTS.md +178 -0
  15. package/embedded-knowledge/CONTRIBUTING.md +58 -0
  16. package/embedded-knowledge/LICENSE +21 -0
  17. package/embedded-knowledge/README.md +32 -0
  18. package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
  19. package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
  20. package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
  21. package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
  22. package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
  23. package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
  24. package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
  25. package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
  26. package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
  27. package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
  28. package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
  29. package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
  30. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
  31. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
  32. package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
  33. package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
  34. package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
  35. package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
  36. package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
  37. package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
  38. package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
  39. package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
  40. package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
  41. package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
  42. package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
  43. package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
  44. package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
  45. package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
  46. package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
  47. package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
  48. package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
  49. package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
  50. package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
  51. package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
  52. package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
  53. package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
  54. package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
  55. package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
  56. package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
  57. package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
  58. package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
  59. package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
  60. package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
  61. package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
  62. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
  63. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
  64. package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
  65. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
  66. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
  67. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
  68. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
  69. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
  70. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
  71. package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
  72. package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
  73. package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
  74. package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
  75. package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
  76. package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
  77. package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
  78. package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
  79. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
  80. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
  81. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
  82. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
  83. package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
  84. package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
  85. package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
  86. package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
  87. package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
  88. package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
  89. package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
  90. package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
  91. package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
  92. package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
  93. package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
  94. package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
  95. package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
  96. package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
  97. package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
  98. package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
  99. package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
  100. package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
  101. package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
  102. package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
  103. package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
  104. package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
  105. package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
  106. package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
  107. package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
  108. package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
  109. package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
  110. package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
  111. package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
  112. package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
  113. package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
  114. package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
  115. package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
  116. package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
  117. package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
  118. package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
  119. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
  120. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
  121. package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
  122. package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
  123. package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
  124. package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
  125. package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
  126. package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
  127. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
  128. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
  129. package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
  130. package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
  131. package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
  132. package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
  133. package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
  134. package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
  135. package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
  136. package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
  137. package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
  138. package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
  139. package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
  140. package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
  141. package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
  142. package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
  143. package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
  144. package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
  145. package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
  146. package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
  147. package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
  148. package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
  149. package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
  150. package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
  151. package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
  152. package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
  153. package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
  154. package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
  155. package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
  156. package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
  157. package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
  158. package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
  159. package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
  160. package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
  161. package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
  162. package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
  163. package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
  164. package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
  165. package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
  166. package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
  167. package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
  168. package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
  169. package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
  170. package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
  171. package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
  172. package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
  173. package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
  174. package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
  175. package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
  176. package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
  177. package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
  178. package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
  179. package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
  180. package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
  181. package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
  182. package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
  183. package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
  184. package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
  185. package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
  186. package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
  187. package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
  188. package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
  189. package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
  190. package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
  191. package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
  192. package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
  193. package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
  194. package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
  195. package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
  196. package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
  197. package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
  198. package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
  199. package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
  200. package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
  201. package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
  202. package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
  203. package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
  204. package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
  205. package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
  206. package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
  207. package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
  208. package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
  209. package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
  210. package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
  211. package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
  212. package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
  213. package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
  214. package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
  215. package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
  216. package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
  217. package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
  218. package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
  219. package/embedded-knowledge/indexes/domain-catalog.json +106 -0
  220. package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
  221. package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
  222. package/embedded-knowledge/indexes/tags/access-control.json +1 -0
  223. package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
  224. package/embedded-knowledge/indexes/tags/actions.json +1 -0
  225. package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
  226. package/embedded-knowledge/indexes/tags/advanced.json +1 -0
  227. package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
  228. package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
  229. package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
  230. package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
  231. package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
  232. package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
  233. package/embedded-knowledge/indexes/tags/analytics.json +1 -0
  234. package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
  235. package/embedded-knowledge/indexes/tags/api-design.json +1 -0
  236. package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
  237. package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
  238. package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
  239. package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
  240. package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
  241. package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
  242. package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
  243. package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
  244. package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
  245. package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
  246. package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
  247. package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
  248. package/embedded-knowledge/indexes/tags/api.json +1 -0
  249. package/embedded-knowledge/indexes/tags/architecture.json +1 -0
  250. package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
  251. package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
  252. package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
  253. package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
  254. package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
  255. package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
  256. package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
  257. package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
  258. package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
  259. package/embedded-knowledge/indexes/tags/binding.json +1 -0
  260. package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
  261. package/embedded-knowledge/indexes/tags/blocks.json +1 -0
  262. package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
  263. package/embedded-knowledge/indexes/tags/branching.json +1 -0
  264. package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
  265. package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
  266. package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
  267. package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
  268. package/embedded-knowledge/indexes/tags/business-process.json +1 -0
  269. package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
  270. package/embedded-knowledge/indexes/tags/caching.json +1 -0
  271. package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
  272. package/embedded-knowledge/indexes/tags/case.json +1 -0
  273. package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
  274. package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
  275. package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
  276. package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
  277. package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
  278. package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
  279. package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
  280. package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
  281. package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
  282. package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
  283. package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
  284. package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
  285. package/embedded-knowledge/indexes/tags/code-style.json +1 -0
  286. package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
  287. package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
  288. package/embedded-knowledge/indexes/tags/comments.json +1 -0
  289. package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
  290. package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
  291. package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
  292. package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
  293. package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
  294. package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
  295. package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
  296. package/embedded-knowledge/indexes/tags/conditional.json +1 -0
  297. package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
  298. package/embedded-knowledge/indexes/tags/consistency.json +1 -0
  299. package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
  300. package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
  301. package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
  302. package/embedded-knowledge/indexes/tags/correlation.json +1 -0
  303. package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
  304. package/embedded-knowledge/indexes/tags/data-access.json +1 -0
  305. package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
  306. package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
  307. package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
  308. package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
  309. package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
  310. package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
  311. package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
  312. package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
  313. package/embedded-knowledge/indexes/tags/database.json +1 -0
  314. package/embedded-knowledge/indexes/tags/debugging.json +1 -0
  315. package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
  316. package/embedded-knowledge/indexes/tags/declaration.json +1 -0
  317. package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
  318. package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
  319. package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
  320. package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
  321. package/embedded-knowledge/indexes/tags/deployment.json +1 -0
  322. package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
  323. package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
  324. package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
  325. package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
  326. package/embedded-knowledge/indexes/tags/documentation.json +1 -0
  327. package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
  328. package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
  329. package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
  330. package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
  331. package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
  332. package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
  333. package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
  334. package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
  335. package/embedded-knowledge/indexes/tags/error-text.json +1 -0
  336. package/embedded-knowledge/indexes/tags/etag.json +1 -0
  337. package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
  338. package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
  339. package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
  340. package/embedded-knowledge/indexes/tags/events.json +1 -0
  341. package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
  342. package/embedded-knowledge/indexes/tags/expressions.json +1 -0
  343. package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
  344. package/embedded-knowledge/indexes/tags/extensions.json +1 -0
  345. package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
  346. package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
  347. package/embedded-knowledge/indexes/tags/field-control.json +1 -0
  348. package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
  349. package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
  350. package/embedded-knowledge/indexes/tags/field-state.json +1 -0
  351. package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
  352. package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
  353. package/embedded-knowledge/indexes/tags/fields.json +1 -0
  354. package/embedded-knowledge/indexes/tags/filtering.json +1 -0
  355. package/embedded-knowledge/indexes/tags/filters.json +1 -0
  356. package/embedded-knowledge/indexes/tags/formatting.json +1 -0
  357. package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
  358. package/embedded-knowledge/indexes/tags/http-status.json +1 -0
  359. package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
  360. package/embedded-knowledge/indexes/tags/implementation.json +1 -0
  361. package/embedded-knowledge/indexes/tags/indentation.json +1 -0
  362. package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
  363. package/embedded-knowledge/indexes/tags/indexing.json +1 -0
  364. package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
  365. package/embedded-knowledge/indexes/tags/integration.json +1 -0
  366. package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
  367. package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
  368. package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
  369. package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
  370. package/embedded-knowledge/indexes/tags/isolation.json +1 -0
  371. package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
  372. package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
  373. package/embedded-knowledge/indexes/tags/keywords.json +1 -0
  374. package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
  375. package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
  376. package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
  377. package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
  378. package/embedded-knowledge/indexes/tags/localization.json +1 -0
  379. package/embedded-knowledge/indexes/tags/logging.json +1 -0
  380. package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
  381. package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
  382. package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
  383. package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
  384. package/embedded-knowledge/indexes/tags/memory.json +1 -0
  385. package/embedded-knowledge/indexes/tags/message-design.json +1 -0
  386. package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
  387. package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
  388. package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
  389. package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
  390. package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
  391. package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
  392. package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
  393. package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
  394. package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
  395. package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
  396. package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
  397. package/embedded-knowledge/indexes/tags/naming.json +1 -0
  398. package/embedded-knowledge/indexes/tags/navigation.json +1 -0
  399. package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
  400. package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
  401. package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
  402. package/embedded-knowledge/indexes/tags/no-series.json +1 -0
  403. package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
  404. package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
  405. package/embedded-knowledge/indexes/tags/odata.json +1 -0
  406. package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
  407. package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
  408. package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
  409. package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
  410. package/embedded-knowledge/indexes/tags/operators.json +1 -0
  411. package/embedded-knowledge/indexes/tags/optimization.json +1 -0
  412. package/embedded-knowledge/indexes/tags/order.json +1 -0
  413. package/embedded-knowledge/indexes/tags/organization.json +1 -0
  414. package/embedded-knowledge/indexes/tags/pages.json +1 -0
  415. package/embedded-knowledge/indexes/tags/parameters.json +1 -0
  416. package/embedded-knowledge/indexes/tags/patterns.json +1 -0
  417. package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
  418. package/embedded-knowledge/indexes/tags/performance.json +1 -0
  419. package/embedded-knowledge/indexes/tags/placement.json +1 -0
  420. package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
  421. package/embedded-knowledge/indexes/tags/posting.json +1 -0
  422. package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
  423. package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
  424. package/embedded-knowledge/indexes/tags/privacy.json +1 -0
  425. package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
  426. package/embedded-knowledge/indexes/tags/production.json +1 -0
  427. package/embedded-knowledge/indexes/tags/productivity.json +1 -0
  428. package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
  429. package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
  430. package/embedded-knowledge/indexes/tags/ranges.json +1 -0
  431. package/embedded-knowledge/indexes/tags/readability.json +1 -0
  432. package/embedded-knowledge/indexes/tags/record-access.json +1 -0
  433. package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
  434. package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
  435. package/embedded-knowledge/indexes/tags/reference.json +1 -0
  436. package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
  437. package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
  438. package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
  439. package/embedded-knowledge/indexes/tags/runtime.json +1 -0
  440. package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
  441. package/embedded-knowledge/indexes/tags/security.json +1 -0
  442. package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
  443. package/embedded-knowledge/indexes/tags/serialization.json +1 -0
  444. package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
  445. package/embedded-knowledge/indexes/tags/session.json +1 -0
  446. package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
  447. package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
  448. package/embedded-knowledge/indexes/tags/sift.json +1 -0
  449. package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
  450. package/embedded-knowledge/indexes/tags/spacing.json +1 -0
  451. package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
  452. package/embedded-knowledge/indexes/tags/standards.json +1 -0
  453. package/embedded-knowledge/indexes/tags/statements.json +1 -0
  454. package/embedded-knowledge/indexes/tags/streaming.json +1 -0
  455. package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
  456. package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
  457. package/embedded-knowledge/indexes/tags/structure.json +1 -0
  458. package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
  459. package/embedded-knowledge/indexes/tags/switch.json +1 -0
  460. package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
  461. package/embedded-knowledge/indexes/tags/syntax.json +1 -0
  462. package/embedded-knowledge/indexes/tags/systemid.json +1 -0
  463. package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
  464. package/embedded-knowledge/indexes/tags/table-events.json +1 -0
  465. package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
  466. package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
  467. package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
  468. package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
  469. package/embedded-knowledge/indexes/tags/template-method.json +1 -0
  470. package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
  471. package/embedded-knowledge/indexes/tags/testfield.json +1 -0
  472. package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
  473. package/embedded-knowledge/indexes/tags/triggers.json +1 -0
  474. package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
  475. package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
  476. package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
  477. package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
  478. package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
  479. package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
  480. package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
  481. package/embedded-knowledge/indexes/tags/validation.json +1 -0
  482. package/embedded-knowledge/indexes/tags/variables.json +1 -0
  483. package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
  484. package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
  485. package/embedded-knowledge/indexes/tags/web-services.json +1 -0
  486. package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
  487. package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
  488. package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
  489. package/embedded-knowledge/indexes/tags/workspace.json +1 -0
  490. package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
  491. package/embedded-knowledge/indexes/topic-relationships.json +128 -0
  492. package/embedded-knowledge/methodologies/index.json +81 -0
  493. package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
  494. package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
  495. package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
  496. package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
  497. package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
  498. package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
  499. package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
  500. package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
  501. package/embedded-knowledge/methodologies/phases/performance.md +211 -0
  502. package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
  503. package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
  504. package/embedded-knowledge/methodologies/phases/verification.md +146 -0
  505. package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
  506. package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
  507. package/embedded-knowledge/specialists/alex-architect.md +216 -0
  508. package/embedded-knowledge/specialists/casey-copilot.md +226 -0
  509. package/embedded-knowledge/specialists/chris-config.md +267 -0
  510. package/embedded-knowledge/specialists/dean-debug.md +222 -0
  511. package/embedded-knowledge/specialists/eva-errors.md +235 -0
  512. package/embedded-knowledge/specialists/jordan-bridge.md +235 -0
  513. package/embedded-knowledge/specialists/logan-legacy.md +209 -0
  514. package/embedded-knowledge/specialists/maya-mentor.md +211 -0
  515. package/embedded-knowledge/specialists/morgan-market.md +226 -0
  516. package/embedded-knowledge/specialists/quinn-tester.md +235 -0
  517. package/embedded-knowledge/specialists/roger-reviewer.md +234 -0
  518. package/embedded-knowledge/specialists/sam-coder.md +359 -0
  519. package/embedded-knowledge/specialists/seth-security.md +235 -0
  520. package/embedded-knowledge/specialists/taylor-docs.md +257 -0
  521. package/embedded-knowledge/specialists/uma-ux.md +235 -0
  522. package/package.json +6 -6
@@ -0,0 +1,889 @@
1
+ # Generic Method Patterns in AL - Code Examples
2
+
3
+ This sample demonstrates implementing generic method patterns for type-safe, reusable operations in AL.
4
+
5
+ ## Basic Generic Interface
6
+
7
+ ```al
8
+ // Generic interface for comparable operations
9
+ interface IComparable
10
+ {
11
+ procedure CompareTo(Other: Interface IComparable): Integer;
12
+ }
13
+
14
+ // Generic interface for collection operations
15
+ interface IGenericCollection
16
+ {
17
+ procedure Add(Item: Variant);
18
+ procedure Remove(Item: Variant): Boolean;
19
+ procedure Contains(Item: Variant): Boolean;
20
+ procedure Count(): Integer;
21
+ procedure Clear();
22
+ procedure ToArray(): Array of [Variant];
23
+ }
24
+ ```
25
+
26
+ ## Generic List Implementation
27
+
28
+ ```al
29
+ // Generic list implementation with type safety
30
+ codeunit 50800 "Generic List Manager"
31
+ {
32
+ var
33
+ Items: List of [Variant];
34
+ ItemType: Text[50];
35
+
36
+ procedure Initialize(ExpectedType: Text[50])
37
+ begin
38
+ Clear(Items);
39
+ ItemType := ExpectedType;
40
+ end;
41
+
42
+ procedure Add(Item: Variant): Boolean
43
+ begin
44
+ if not ValidateItemType(Item) then
45
+ exit(false);
46
+
47
+ Items.Add(Item);
48
+ exit(true);
49
+ end;
50
+
51
+ procedure AddRange(NewItems: List of [Variant]): Integer
52
+ var
53
+ Item: Variant;
54
+ AddedCount: Integer;
55
+ begin
56
+ AddedCount := 0;
57
+ foreach Item in NewItems do begin
58
+ if Add(Item) then
59
+ AddedCount += 1;
60
+ end;
61
+
62
+ exit(AddedCount);
63
+ end;
64
+
65
+ procedure Get(Index: Integer): Variant
66
+ var
67
+ EmptyVariant: Variant;
68
+ begin
69
+ if (Index < 1) or (Index > Items.Count) then
70
+ exit(EmptyVariant);
71
+
72
+ exit(Items.Get(Index));
73
+ end;
74
+
75
+ procedure Set(Index: Integer; Item: Variant): Boolean
76
+ begin
77
+ if not ValidateItemType(Item) then
78
+ exit(false);
79
+
80
+ if (Index < 1) or (Index > Items.Count) then
81
+ exit(false);
82
+
83
+ Items.Set(Index, Item);
84
+ exit(true);
85
+ end;
86
+
87
+ procedure Remove(Item: Variant): Boolean
88
+ var
89
+ Index: Integer;
90
+ begin
91
+ Index := IndexOf(Item);
92
+ if Index > 0 then begin
93
+ Items.RemoveAt(Index);
94
+ exit(true);
95
+ end;
96
+
97
+ exit(false);
98
+ end;
99
+
100
+ procedure RemoveAt(Index: Integer): Boolean
101
+ begin
102
+ if (Index < 1) or (Index > Items.Count) then
103
+ exit(false);
104
+
105
+ Items.RemoveAt(Index);
106
+ exit(true);
107
+ end;
108
+
109
+ procedure IndexOf(Item: Variant): Integer
110
+ var
111
+ i: Integer;
112
+ CurrentItem: Variant;
113
+ begin
114
+ for i := 1 to Items.Count do begin
115
+ CurrentItem := Items.Get(i);
116
+ if AreEqual(CurrentItem, Item) then
117
+ exit(i);
118
+ end;
119
+
120
+ exit(0);
121
+ end;
122
+
123
+ procedure Contains(Item: Variant): Boolean
124
+ begin
125
+ exit(IndexOf(Item) > 0);
126
+ end;
127
+
128
+ procedure Count(): Integer
129
+ begin
130
+ exit(Items.Count);
131
+ end;
132
+
133
+ procedure Clear()
134
+ begin
135
+ Items.Clear();
136
+ end;
137
+
138
+ procedure ToArray(): List of [Variant]
139
+ begin
140
+ exit(Items);
141
+ end;
142
+
143
+ procedure Filter(FilterFunction: Text): List of [Variant]
144
+ var
145
+ FilteredItems: List of [Variant];
146
+ Item: Variant;
147
+ begin
148
+ foreach Item in Items do begin
149
+ if ApplyFilter(Item, FilterFunction) then
150
+ FilteredItems.Add(Item);
151
+ end;
152
+
153
+ exit(FilteredItems);
154
+ end;
155
+
156
+ procedure Map(MapFunction: Text): List of [Variant]
157
+ var
158
+ MappedItems: List of [Variant];
159
+ Item: Variant;
160
+ MappedItem: Variant;
161
+ begin
162
+ foreach Item in Items do begin
163
+ MappedItem := ApplyMap(Item, MapFunction);
164
+ MappedItems.Add(MappedItem);
165
+ end;
166
+
167
+ exit(MappedItems);
168
+ end;
169
+
170
+ procedure Sort(): Boolean
171
+ begin
172
+ exit(SortItems(Items));
173
+ end;
174
+
175
+ procedure SortBy(CompareFunction: Text): Boolean
176
+ begin
177
+ exit(SortItemsBy(Items, CompareFunction));
178
+ end;
179
+
180
+ local procedure ValidateItemType(Item: Variant): Boolean
181
+ var
182
+ ActualType: Text[50];
183
+ begin
184
+ if ItemType = '' then
185
+ exit(true); // No type constraint
186
+
187
+ ActualType := GetVariantType(Item);
188
+ exit(ActualType = ItemType);
189
+ end;
190
+
191
+ local procedure GetVariantType(Item: Variant): Text[50]
192
+ begin
193
+ case true of
194
+ Item.IsText:
195
+ exit('Text');
196
+ Item.IsInteger:
197
+ exit('Integer');
198
+ Item.IsDecimal:
199
+ exit('Decimal');
200
+ Item.IsBoolean:
201
+ exit('Boolean');
202
+ Item.IsDate:
203
+ exit('Date');
204
+ Item.IsTime:
205
+ exit('Time');
206
+ Item.IsDateTime:
207
+ exit('DateTime');
208
+ Item.IsCode:
209
+ exit('Code');
210
+ else
211
+ exit('Unknown');
212
+ end;
213
+ end;
214
+
215
+ local procedure AreEqual(Item1: Variant; Item2: Variant): Boolean
216
+ begin
217
+ // Implement type-specific equality comparison
218
+ if GetVariantType(Item1) <> GetVariantType(Item2) then
219
+ exit(false);
220
+
221
+ exit(Format(Item1) = Format(Item2));
222
+ end;
223
+
224
+ local procedure ApplyFilter(Item: Variant; FilterFunction: Text): Boolean
225
+ begin
226
+ // Simplified filter implementation
227
+ case FilterFunction of
228
+ 'NOT_EMPTY':
229
+ exit(Format(Item) <> '');
230
+ 'POSITIVE':
231
+ begin
232
+ if Item.IsInteger then
233
+ exit(Item > 0);
234
+ if Item.IsDecimal then
235
+ exit(Item > 0);
236
+ exit(false);
237
+ end;
238
+ 'NOT_ZERO':
239
+ begin
240
+ if Item.IsInteger then
241
+ exit(Item <> 0);
242
+ if Item.IsDecimal then
243
+ exit(Item <> 0);
244
+ exit(true);
245
+ end;
246
+ else
247
+ exit(true);
248
+ end;
249
+ end;
250
+
251
+ local procedure ApplyMap(Item: Variant; MapFunction: Text): Variant
252
+ var
253
+ MappedValue: Variant;
254
+ TextValue: Text;
255
+ IntValue: Integer;
256
+ DecValue: Decimal;
257
+ begin
258
+ case MapFunction of
259
+ 'TO_UPPER':
260
+ begin
261
+ if Item.IsText or Item.IsCode then begin
262
+ TextValue := UpperCase(Format(Item));
263
+ MappedValue := TextValue;
264
+ end else
265
+ MappedValue := Item;
266
+ end;
267
+ 'TO_LOWER':
268
+ begin
269
+ if Item.IsText or Item.IsCode then begin
270
+ TextValue := LowerCase(Format(Item));
271
+ MappedValue := TextValue;
272
+ end else
273
+ MappedValue := Item;
274
+ end;
275
+ 'DOUBLE':
276
+ begin
277
+ if Item.IsInteger then begin
278
+ IntValue := Item * 2;
279
+ MappedValue := IntValue;
280
+ end else if Item.IsDecimal then begin
281
+ DecValue := Item * 2;
282
+ MappedValue := DecValue;
283
+ end else
284
+ MappedValue := Item;
285
+ end;
286
+ else
287
+ MappedValue := Item;
288
+ end;
289
+
290
+ exit(MappedValue);
291
+ end;
292
+
293
+ local procedure SortItems(var ItemList: List of [Variant]): Boolean
294
+ var
295
+ i, j: Integer;
296
+ temp: Variant;
297
+ swapped: Boolean;
298
+ begin
299
+ try
300
+ // Bubble sort implementation
301
+ for i := 1 to ItemList.Count - 1 do begin
302
+ swapped := false;
303
+ for j := 1 to ItemList.Count - i do begin
304
+ if CompareVariants(ItemList.Get(j), ItemList.Get(j + 1)) > 0 then begin
305
+ temp := ItemList.Get(j);
306
+ ItemList.Set(j, ItemList.Get(j + 1));
307
+ ItemList.Set(j + 1, temp);
308
+ swapped := true;
309
+ end;
310
+ end;
311
+ if not swapped then
312
+ break;
313
+ end;
314
+
315
+ exit(true);
316
+
317
+ except
318
+ exit(false);
319
+ end;
320
+ end;
321
+
322
+ local procedure SortItemsBy(var ItemList: List of [Variant]; CompareFunction: Text): Boolean
323
+ begin
324
+ // Custom sorting based on compare function
325
+ exit(SortItems(ItemList)); // Simplified
326
+ end;
327
+
328
+ local procedure CompareVariants(Item1: Variant; Item2: Variant): Integer
329
+ var
330
+ Type1, Type2: Text[50];
331
+ Text1, Text2: Text;
332
+ Int1, Int2: Integer;
333
+ Dec1, Dec2: Decimal;
334
+ Date1, Date2: Date;
335
+ begin
336
+ Type1 := GetVariantType(Item1);
337
+ Type2 := GetVariantType(Item2);
338
+
339
+ if Type1 <> Type2 then begin
340
+ Text1 := Format(Item1);
341
+ Text2 := Format(Item2);
342
+ case true of
343
+ Text1 < Text2:
344
+ exit(-1);
345
+ Text1 > Text2:
346
+ exit(1);
347
+ else
348
+ exit(0);
349
+ end;
350
+ end;
351
+
352
+ case Type1 of
353
+ 'Integer':
354
+ begin
355
+ Int1 := Item1;
356
+ Int2 := Item2;
357
+ case true of
358
+ Int1 < Int2:
359
+ exit(-1);
360
+ Int1 > Int2:
361
+ exit(1);
362
+ else
363
+ exit(0);
364
+ end;
365
+ end;
366
+ 'Decimal':
367
+ begin
368
+ Dec1 := Item1;
369
+ Dec2 := Item2;
370
+ case true of
371
+ Dec1 < Dec2:
372
+ exit(-1);
373
+ Dec1 > Dec2:
374
+ exit(1);
375
+ else
376
+ exit(0);
377
+ end;
378
+ end;
379
+ 'Date':
380
+ begin
381
+ Date1 := Item1;
382
+ Date2 := Item2;
383
+ case true of
384
+ Date1 < Date2:
385
+ exit(-1);
386
+ Date1 > Date2:
387
+ exit(1);
388
+ else
389
+ exit(0);
390
+ end;
391
+ end;
392
+ else
393
+ begin
394
+ Text1 := Format(Item1);
395
+ Text2 := Format(Item2);
396
+ case true of
397
+ Text1 < Text2:
398
+ exit(-1);
399
+ Text1 > Text2:
400
+ exit(1);
401
+ else
402
+ exit(0);
403
+ end;
404
+ end;
405
+ end;
406
+ end;
407
+ }
408
+ ```
409
+
410
+ ## Generic Dictionary Implementation
411
+
412
+ ```al
413
+ // Generic dictionary with type-safe key-value operations
414
+ codeunit 50801 "Generic Dictionary Manager"
415
+ {
416
+ var
417
+ Keys: List of [Variant];
418
+ Values: List of [Variant];
419
+ KeyType: Text[50];
420
+ ValueType: Text[50];
421
+
422
+ procedure Initialize(ExpectedKeyType: Text[50]; ExpectedValueType: Text[50])
423
+ begin
424
+ Clear(Keys);
425
+ Clear(Values);
426
+ KeyType := ExpectedKeyType;
427
+ ValueType := ExpectedValueType;
428
+ end;
429
+
430
+ procedure Set(Key: Variant; Value: Variant): Boolean
431
+ var
432
+ ExistingIndex: Integer;
433
+ begin
434
+ if not ValidateKeyType(Key) or not ValidateValueType(Value) then
435
+ exit(false);
436
+
437
+ ExistingIndex := FindKeyIndex(Key);
438
+ if ExistingIndex > 0 then begin
439
+ Values.Set(ExistingIndex, Value);
440
+ end else begin
441
+ Keys.Add(Key);
442
+ Values.Add(Value);
443
+ end;
444
+
445
+ exit(true);
446
+ end;
447
+
448
+ procedure Get(Key: Variant; var Value: Variant): Boolean
449
+ var
450
+ KeyIndex: Integer;
451
+ begin
452
+ KeyIndex := FindKeyIndex(Key);
453
+ if KeyIndex > 0 then begin
454
+ Value := Values.Get(KeyIndex);
455
+ exit(true);
456
+ end;
457
+
458
+ Clear(Value);
459
+ exit(false);
460
+ end;
461
+
462
+ procedure TryGet(Key: Variant): Variant
463
+ var
464
+ Value: Variant;
465
+ EmptyVariant: Variant;
466
+ begin
467
+ if Get(Key, Value) then
468
+ exit(Value)
469
+ else
470
+ exit(EmptyVariant);
471
+ end;
472
+
473
+ procedure ContainsKey(Key: Variant): Boolean
474
+ begin
475
+ exit(FindKeyIndex(Key) > 0);
476
+ end;
477
+
478
+ procedure ContainsValue(Value: Variant): Boolean
479
+ var
480
+ StoredValue: Variant;
481
+ i: Integer;
482
+ begin
483
+ for i := 1 to Values.Count do begin
484
+ StoredValue := Values.Get(i);
485
+ if AreEqual(StoredValue, Value) then
486
+ exit(true);
487
+ end;
488
+
489
+ exit(false);
490
+ end;
491
+
492
+ procedure Remove(Key: Variant): Boolean
493
+ var
494
+ KeyIndex: Integer;
495
+ begin
496
+ KeyIndex := FindKeyIndex(Key);
497
+ if KeyIndex > 0 then begin
498
+ Keys.RemoveAt(KeyIndex);
499
+ Values.RemoveAt(KeyIndex);
500
+ exit(true);
501
+ end;
502
+
503
+ exit(false);
504
+ end;
505
+
506
+ procedure Clear()
507
+ begin
508
+ Keys.Clear();
509
+ Values.Clear();
510
+ end;
511
+
512
+ procedure Count(): Integer
513
+ begin
514
+ exit(Keys.Count);
515
+ end;
516
+
517
+ procedure GetKeys(): List of [Variant]
518
+ begin
519
+ exit(Keys);
520
+ end;
521
+
522
+ procedure GetValues(): List of [Variant]
523
+ begin
524
+ exit(Values);
525
+ end;
526
+
527
+ procedure GetKeyValuePairs(): List of [Dictionary of [Text, Variant]]
528
+ var
529
+ Pairs: List of [Dictionary of [Text, Variant]];
530
+ Pair: Dictionary of [Text, Variant];
531
+ i: Integer;
532
+ begin
533
+ for i := 1 to Keys.Count do begin
534
+ Clear(Pair);
535
+ Pair.Set('Key', Keys.Get(i));
536
+ Pair.Set('Value', Values.Get(i));
537
+ Pairs.Add(Pair);
538
+ end;
539
+
540
+ exit(Pairs);
541
+ end;
542
+
543
+ local procedure FindKeyIndex(Key: Variant): Integer
544
+ var
545
+ i: Integer;
546
+ StoredKey: Variant;
547
+ begin
548
+ for i := 1 to Keys.Count do begin
549
+ StoredKey := Keys.Get(i);
550
+ if AreEqual(StoredKey, Key) then
551
+ exit(i);
552
+ end;
553
+
554
+ exit(0);
555
+ end;
556
+
557
+ local procedure ValidateKeyType(Key: Variant): Boolean
558
+ var
559
+ ActualType: Text[50];
560
+ begin
561
+ if KeyType = '' then
562
+ exit(true);
563
+
564
+ ActualType := GetVariantType(Key);
565
+ exit(ActualType = KeyType);
566
+ end;
567
+
568
+ local procedure ValidateValueType(Value: Variant): Boolean
569
+ var
570
+ ActualType: Text[50];
571
+ begin
572
+ if ValueType = '' then
573
+ exit(true);
574
+
575
+ ActualType := GetVariantType(Value);
576
+ exit(ActualType = ValueType);
577
+ end;
578
+
579
+ local procedure GetVariantType(Item: Variant): Text[50]
580
+ begin
581
+ case true of
582
+ Item.IsText:
583
+ exit('Text');
584
+ Item.IsInteger:
585
+ exit('Integer');
586
+ Item.IsDecimal:
587
+ exit('Decimal');
588
+ Item.IsBoolean:
589
+ exit('Boolean');
590
+ Item.IsDate:
591
+ exit('Date');
592
+ Item.IsTime:
593
+ exit('Time');
594
+ Item.IsDateTime:
595
+ exit('DateTime');
596
+ Item.IsCode:
597
+ exit('Code');
598
+ else
599
+ exit('Unknown');
600
+ end;
601
+ end;
602
+
603
+ local procedure AreEqual(Item1: Variant; Item2: Variant): Boolean
604
+ begin
605
+ if GetVariantType(Item1) <> GetVariantType(Item2) then
606
+ exit(false);
607
+
608
+ exit(Format(Item1) = Format(Item2));
609
+ end;
610
+ }
611
+ ```
612
+
613
+ ## Generic Repository Pattern
614
+
615
+ ```al
616
+ // Generic repository interface
617
+ interface IGenericRepository
618
+ {
619
+ procedure Create(Entity: Dictionary of [Text, Variant]): Variant;
620
+ procedure Read(Id: Variant): Dictionary of [Text, Variant];
621
+ procedure Update(Id: Variant; Entity: Dictionary of [Text, Variant]): Boolean;
622
+ procedure Delete(Id: Variant): Boolean;
623
+ procedure FindAll(): List of [Dictionary of [Text, Variant]];
624
+ procedure FindWhere(Criteria: Dictionary of [Text, Variant]): List of [Dictionary of [Text, Variant]];
625
+ }
626
+
627
+ // Generic repository implementation for customers
628
+ codeunit 50802 "Customer Repository" implements IGenericRepository
629
+ {
630
+ procedure Create(Entity: Dictionary of [Text, Variant]): Variant
631
+ var
632
+ Customer: Record Customer;
633
+ CustomerNo: Code[20];
634
+ Name: Text[100];
635
+ Address: Text[100];
636
+ begin
637
+ Customer.Init();
638
+ Customer."No." := '';
639
+ Customer.Insert(true);
640
+ CustomerNo := Customer."No.";
641
+
642
+ if Entity.Get('Name', Name) then
643
+ Customer.Validate(Name, Name);
644
+
645
+ if Entity.Get('Address', Address) then
646
+ Customer.Validate(Address, Address);
647
+
648
+ Customer.Modify(true);
649
+
650
+ exit(CustomerNo);
651
+ end;
652
+
653
+ procedure Read(Id: Variant): Dictionary of [Text, Variant]
654
+ var
655
+ Customer: Record Customer;
656
+ CustomerData: Dictionary of [Text, Variant];
657
+ CustomerNo: Code[20];
658
+ begin
659
+ CustomerNo := Id;
660
+
661
+ if Customer.Get(CustomerNo) then begin
662
+ CustomerData.Set('CustomerNo', Customer."No.");
663
+ CustomerData.Set('Name', Customer.Name);
664
+ CustomerData.Set('Address', Customer.Address);
665
+ CustomerData.Set('City', Customer.City);
666
+ CustomerData.Set('PostCode', Customer."Post Code");
667
+ CustomerData.Set('PhoneNo', Customer."Phone No.");
668
+ CustomerData.Set('Email', Customer."E-Mail");
669
+ CustomerData.Set('CreditLimit', Customer."Credit Limit (LCY)");
670
+ CustomerData.Set('Blocked', Customer.Blocked);
671
+ end;
672
+
673
+ exit(CustomerData);
674
+ end;
675
+
676
+ procedure Update(Id: Variant; Entity: Dictionary of [Text, Variant]): Boolean
677
+ var
678
+ Customer: Record Customer;
679
+ CustomerNo: Code[20];
680
+ Name: Text[100];
681
+ Address: Text[100];
682
+ City: Text[30];
683
+ PhoneNo: Text[30];
684
+ Email: Text[80];
685
+ begin
686
+ CustomerNo := Id;
687
+
688
+ if not Customer.Get(CustomerNo) then
689
+ exit(false);
690
+
691
+ try
692
+ if Entity.Get('Name', Name) then
693
+ Customer.Validate(Name, Name);
694
+
695
+ if Entity.Get('Address', Address) then
696
+ Customer.Validate(Address, Address);
697
+
698
+ if Entity.Get('City', City) then
699
+ Customer.Validate(City, City);
700
+
701
+ if Entity.Get('PhoneNo', PhoneNo) then
702
+ Customer.Validate("Phone No.", PhoneNo);
703
+
704
+ if Entity.Get('Email', Email) then
705
+ Customer.Validate("E-Mail", Email);
706
+
707
+ Customer.Modify(true);
708
+ exit(true);
709
+
710
+ except
711
+ exit(false);
712
+ end;
713
+ end;
714
+
715
+ procedure Delete(Id: Variant): Boolean
716
+ var
717
+ Customer: Record Customer;
718
+ CustomerNo: Code[20];
719
+ begin
720
+ CustomerNo := Id;
721
+
722
+ if Customer.Get(CustomerNo) then begin
723
+ Customer.Delete(true);
724
+ exit(true);
725
+ end;
726
+
727
+ exit(false);
728
+ end;
729
+
730
+ procedure FindAll(): List of [Dictionary of [Text, Variant]]
731
+ var
732
+ Customer: Record Customer;
733
+ CustomerList: List of [Dictionary of [Text, Variant]];
734
+ CustomerData: Dictionary of [Text, Variant];
735
+ begin
736
+ if Customer.FindSet() then
737
+ repeat
738
+ Clear(CustomerData);
739
+ CustomerData.Set('CustomerNo', Customer."No.");
740
+ CustomerData.Set('Name', Customer.Name);
741
+ CustomerData.Set('Address', Customer.Address);
742
+ CustomerData.Set('City', Customer.City);
743
+ CustomerList.Add(CustomerData);
744
+ until Customer.Next() = 0;
745
+
746
+ exit(CustomerList);
747
+ end;
748
+
749
+ procedure FindWhere(Criteria: Dictionary of [Text, Variant]): List of [Dictionary of [Text, Variant]]
750
+ var
751
+ Customer: Record Customer;
752
+ CustomerList: List of [Dictionary of [Text, Variant]];
753
+ CustomerData: Dictionary of [Text, Variant];
754
+ CityFilter: Text[30];
755
+ BlockedFilter: Boolean;
756
+ begin
757
+ if Criteria.Get('City', CityFilter) then
758
+ Customer.SetRange(City, CityFilter);
759
+
760
+ if Criteria.Get('Blocked', BlockedFilter) then
761
+ Customer.SetRange(Blocked, BlockedFilter);
762
+
763
+ if Customer.FindSet() then
764
+ repeat
765
+ Clear(CustomerData);
766
+ CustomerData.Set('CustomerNo', Customer."No.");
767
+ CustomerData.Set('Name', Customer.Name);
768
+ CustomerData.Set('Address', Customer.Address);
769
+ CustomerData.Set('City', Customer.City);
770
+ CustomerData.Set('Blocked', Customer.Blocked);
771
+ CustomerList.Add(CustomerData);
772
+ until Customer.Next() = 0;
773
+
774
+ exit(CustomerList);
775
+ end;
776
+ }
777
+ ```
778
+
779
+ ## Usage Examples
780
+
781
+ ```al
782
+ // Example of using generic patterns
783
+ codeunit 50803 "Generic Patterns Usage"
784
+ {
785
+ procedure DemonstrateGenericList()
786
+ var
787
+ StringList: Codeunit "Generic List Manager";
788
+ NumberList: Codeunit "Generic List Manager";
789
+ Items: List of [Variant];
790
+ FilteredItems: List of [Variant];
791
+ Item: Variant;
792
+ Count: Integer;
793
+ begin
794
+ // String list example
795
+ StringList.Initialize('Text');
796
+ StringList.Add('Apple');
797
+ StringList.Add('Banana');
798
+ StringList.Add('Cherry');
799
+
800
+ Message('String list count: %1', StringList.Count());
801
+
802
+ // Filter and map operations
803
+ FilteredItems := StringList.Filter('NOT_EMPTY');
804
+ FilteredItems := StringList.Map('TO_UPPER');
805
+
806
+ foreach Item in FilteredItems do
807
+ Message('Filtered item: %1', Item);
808
+
809
+ // Number list example
810
+ NumberList.Initialize('Integer');
811
+ NumberList.Add(10);
812
+ NumberList.Add(5);
813
+ NumberList.Add(15);
814
+ NumberList.Add(3);
815
+
816
+ NumberList.Sort();
817
+ Items := NumberList.ToArray();
818
+
819
+ foreach Item in Items do
820
+ Message('Sorted number: %1', Item);
821
+ end;
822
+
823
+ procedure DemonstrateGenericDictionary()
824
+ var
825
+ CustomerIndex: Codeunit "Generic Dictionary Manager";
826
+ CustomerName: Variant;
827
+ CustomerKeys: List of [Variant];
828
+ Key: Variant;
829
+ begin
830
+ // Initialize dictionary with type constraints
831
+ CustomerIndex.Initialize('Code', 'Text');
832
+
833
+ // Add customer mappings
834
+ CustomerIndex.Set('CUST001', 'Acme Corporation');
835
+ CustomerIndex.Set('CUST002', 'Beta Industries');
836
+ CustomerIndex.Set('CUST003', 'Gamma Solutions');
837
+
838
+ // Retrieve values
839
+ if CustomerIndex.Get('CUST001', CustomerName) then
840
+ Message('Customer CUST001 is: %1', CustomerName);
841
+
842
+ // Iterate through all keys
843
+ CustomerKeys := CustomerIndex.GetKeys();
844
+ foreach Key in CustomerKeys do begin
845
+ CustomerName := CustomerIndex.TryGet(Key);
846
+ Message('Customer %1: %2', Key, CustomerName);
847
+ end;
848
+
849
+ Message('Dictionary contains %1 customers', CustomerIndex.Count());
850
+ end;
851
+
852
+ procedure DemonstrateGenericRepository()
853
+ var
854
+ CustomerRepo: Codeunit "Customer Repository";
855
+ CustomerData: Dictionary of [Text, Variant];
856
+ AllCustomers: List of [Dictionary of [Text, Variant]];
857
+ FilterCriteria: Dictionary of [Text, Variant];
858
+ NewCustomerId: Variant;
859
+ Customer: Dictionary of [Text, Variant];
860
+ begin
861
+ // Create new customer
862
+ CustomerData.Set('Name', 'Generic Customer Ltd.');
863
+ CustomerData.Set('Address', '123 Generic Street');
864
+ CustomerData.Set('City', 'Generic City');
865
+
866
+ NewCustomerId := CustomerRepo.Create(CustomerData);
867
+ Message('Created customer with ID: %1', NewCustomerId);
868
+
869
+ // Read customer back
870
+ Customer := CustomerRepo.Read(NewCustomerId);
871
+ Message('Retrieved customer: %1', Customer.Get('Name'));
872
+
873
+ // Update customer
874
+ Clear(CustomerData);
875
+ CustomerData.Set('Address', '456 Updated Avenue');
876
+ CustomerData.Set('PhoneNo', '555-0123');
877
+
878
+ if CustomerRepo.Update(NewCustomerId, CustomerData) then
879
+ Message('Customer updated successfully');
880
+
881
+ // Find customers by criteria
882
+ FilterCriteria.Set('City', 'Generic City');
883
+ AllCustomers := CustomerRepo.FindWhere(FilterCriteria);
884
+ Message('Found %1 customers in Generic City', AllCustomers.Count);
885
+ end;
886
+ }
887
+ ```
888
+
889
+ This comprehensive implementation demonstrates generic programming patterns in AL, providing type-safe, reusable operations for collections, dictionaries, and repositories while maintaining AL's strong typing benefits.