bc-code-intelligence-mcp 1.3.3 → 1.3.4

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 (548) hide show
  1. package/dist/config/test-enhanced-layer-service.js +10 -10
  2. package/dist/config/test-enhanced-layer-service.js.map +1 -1
  3. package/dist/dev/hot-reload.d.ts +2 -2
  4. package/dist/dev/hot-reload.d.ts.map +1 -1
  5. package/dist/dev/hot-reload.js.map +1 -1
  6. package/dist/index.d.ts +0 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +34 -38
  9. package/dist/index.js.map +1 -1
  10. package/dist/layers/index.d.ts +1 -1
  11. package/dist/layers/index.d.ts.map +1 -1
  12. package/dist/layers/index.js +1 -1
  13. package/dist/layers/index.js.map +1 -1
  14. package/dist/services/code-analysis-service.d.ts.map +1 -1
  15. package/dist/services/code-analysis-service.js +4 -0
  16. package/dist/services/code-analysis-service.js.map +1 -1
  17. package/dist/services/knowledge-service.d.ts +21 -10
  18. package/dist/services/knowledge-service.d.ts.map +1 -1
  19. package/dist/services/knowledge-service.js +71 -54
  20. package/dist/services/knowledge-service.js.map +1 -1
  21. package/dist/services/multi-content-layer-service.d.ts +90 -0
  22. package/dist/services/multi-content-layer-service.d.ts.map +1 -1
  23. package/dist/services/multi-content-layer-service.js +380 -0
  24. package/dist/services/multi-content-layer-service.js.map +1 -1
  25. package/dist/services/workflow-service.d.ts +11 -3
  26. package/dist/services/workflow-service.d.ts.map +1 -1
  27. package/dist/services/workflow-service.js +119 -78
  28. package/dist/services/workflow-service.js.map +1 -1
  29. package/dist/streamlined-handlers.d.ts +31 -2
  30. package/dist/streamlined-handlers.d.ts.map +1 -1
  31. package/dist/streamlined-handlers.js +151 -109
  32. package/dist/streamlined-handlers.js.map +1 -1
  33. package/dist/streamlined-tools.d.ts +12 -0
  34. package/dist/streamlined-tools.d.ts.map +1 -1
  35. package/dist/streamlined-tools.js +11 -6
  36. package/dist/streamlined-tools.js.map +1 -1
  37. package/package.json +13 -4
  38. package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +0 -24
  39. package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +0 -24
  40. package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +0 -30
  41. package/embedded-knowledge/AGENTS.md +0 -178
  42. package/embedded-knowledge/CONTRIBUTING.md +0 -58
  43. package/embedded-knowledge/LICENSE +0 -21
  44. package/embedded-knowledge/README.md +0 -32
  45. package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +0 -90
  46. package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +0 -113
  47. package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +0 -101
  48. package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +0 -87
  49. package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +0 -155
  50. package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +0 -138
  51. package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +0 -79
  52. package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +0 -280
  53. package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +0 -200
  54. package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +0 -565
  55. package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +0 -665
  56. package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +0 -325
  57. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +0 -696
  58. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +0 -320
  59. package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +0 -102
  60. package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +0 -433
  61. package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +0 -66
  62. package/embedded-knowledge/domains/alex-architect/systemid-integration.md +0 -115
  63. package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +0 -360
  64. package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +0 -86
  65. package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +0 -96
  66. package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +0 -70
  67. package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +0 -84
  68. package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +0 -93
  69. package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +0 -73
  70. package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +0 -78
  71. package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +0 -79
  72. package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +0 -87
  73. package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +0 -209
  74. package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +0 -246
  75. package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +0 -107
  76. package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +0 -105
  77. package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +0 -186
  78. package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +0 -60
  79. package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +0 -139
  80. package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +0 -190
  81. package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +0 -516
  82. package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +0 -298
  83. package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +0 -324
  84. package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +0 -344
  85. package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +0 -137
  86. package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +0 -340
  87. package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +0 -810
  88. package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +0 -86
  89. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +0 -110
  90. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +0 -758
  91. package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +0 -665
  92. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +0 -316
  93. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +0 -223
  94. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +0 -149
  95. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +0 -412
  96. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +0 -211
  97. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +0 -155
  98. package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +0 -475
  99. package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +0 -238
  100. package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +0 -97
  101. package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +0 -666
  102. package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +0 -319
  103. package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +0 -236
  104. package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +0 -59
  105. package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +0 -67
  106. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +0 -70
  107. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +0 -90
  108. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +0 -87
  109. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +0 -70
  110. package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +0 -74
  111. package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +0 -81
  112. package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +0 -56
  113. package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +0 -66
  114. package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +0 -79
  115. package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +0 -78
  116. package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +0 -83
  117. package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +0 -76
  118. package/embedded-knowledge/domains/dean-debug/testfield-performance.md +0 -104
  119. package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +0 -145
  120. package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +0 -104
  121. package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +0 -114
  122. package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +0 -356
  123. package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +0 -256
  124. package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +0 -101
  125. package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +0 -108
  126. package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +0 -80
  127. package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +0 -98
  128. package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +0 -123
  129. package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +0 -96
  130. package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +0 -115
  131. package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +0 -115
  132. package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +0 -114
  133. package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +0 -395
  134. package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +0 -479
  135. package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +0 -548
  136. package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +0 -287
  137. package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +0 -434
  138. package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +0 -508
  139. package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +0 -615
  140. package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +0 -144
  141. package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +0 -96
  142. package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +0 -124
  143. package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +0 -84
  144. package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +0 -75
  145. package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +0 -96
  146. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +0 -385
  147. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +0 -72
  148. package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +0 -48
  149. package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +0 -49
  150. package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +0 -67
  151. package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +0 -119
  152. package/embedded-knowledge/domains/quinn-tester/rule-execution.md +0 -123
  153. package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +0 -64
  154. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +0 -60
  155. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +0 -83
  156. package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +0 -716
  157. package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +0 -101
  158. package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +0 -91
  159. package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +0 -79
  160. package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +0 -79
  161. package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +0 -89
  162. package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +0 -76
  163. package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +0 -76
  164. package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +0 -76
  165. package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +0 -81
  166. package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +0 -76
  167. package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +0 -75
  168. package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +0 -76
  169. package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +0 -76
  170. package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +0 -76
  171. package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +0 -96
  172. package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +0 -76
  173. package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +0 -86
  174. package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +0 -90
  175. package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +0 -82
  176. package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +0 -78
  177. package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +0 -76
  178. package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +0 -78
  179. package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +0 -100
  180. package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +0 -115
  181. package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +0 -124
  182. package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +0 -110
  183. package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +0 -438
  184. package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +0 -255
  185. package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +0 -209
  186. package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +0 -218
  187. package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +0 -218
  188. package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +0 -280
  189. package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +0 -188
  190. package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +0 -245
  191. package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +0 -244
  192. package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +0 -278
  193. package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +0 -484
  194. package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +0 -64
  195. package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +0 -107
  196. package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +0 -280
  197. package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +0 -75
  198. package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +0 -67
  199. package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +0 -76
  200. package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +0 -98
  201. package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +0 -128
  202. package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +0 -75
  203. package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +0 -95
  204. package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +0 -141
  205. package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +0 -91
  206. package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +0 -118
  207. package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +0 -111
  208. package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +0 -113
  209. package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +0 -127
  210. package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +0 -141
  211. package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +0 -66
  212. package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +0 -96
  213. package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +0 -161
  214. package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +0 -177
  215. package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +0 -239
  216. package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +0 -346
  217. package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +0 -298
  218. package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +0 -677
  219. package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +0 -117
  220. package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +0 -75
  221. package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +0 -169
  222. package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +0 -399
  223. package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +0 -356
  224. package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +0 -889
  225. package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +0 -84
  226. package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +0 -127
  227. package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +0 -89
  228. package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +0 -516
  229. package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +0 -61
  230. package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +0 -427
  231. package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +0 -122
  232. package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +0 -96
  233. package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +0 -101
  234. package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +0 -149
  235. package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +0 -107
  236. package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +0 -95
  237. package/embedded-knowledge/domains/seth-security/api-permission-model.md +0 -115
  238. package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +0 -78
  239. package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +0 -373
  240. package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +0 -308
  241. package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +0 -146
  242. package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +0 -79
  243. package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +0 -78
  244. package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +0 -81
  245. package/embedded-knowledge/indexes/bc-version-matrix.json +0 -188
  246. package/embedded-knowledge/indexes/domain-catalog.json +0 -106
  247. package/embedded-knowledge/indexes/tags/abbreviations.json +0 -1
  248. package/embedded-knowledge/indexes/tags/abstraction.json +0 -1
  249. package/embedded-knowledge/indexes/tags/access-control.json +0 -1
  250. package/embedded-knowledge/indexes/tags/accessibility.json +0 -1
  251. package/embedded-knowledge/indexes/tags/actions.json +0 -1
  252. package/embedded-knowledge/indexes/tags/advanced-patterns.json +0 -1
  253. package/embedded-knowledge/indexes/tags/advanced.json +0 -1
  254. package/embedded-knowledge/indexes/tags/al-extension.json +0 -1
  255. package/embedded-knowledge/indexes/tags/al-generics.json +0 -1
  256. package/embedded-knowledge/indexes/tags/al-objects.json +0 -1
  257. package/embedded-knowledge/indexes/tags/al-syntax.json +0 -1
  258. package/embedded-knowledge/indexes/tags/algorithm-structure.json +0 -1
  259. package/embedded-knowledge/indexes/tags/alternatives.json +0 -1
  260. package/embedded-knowledge/indexes/tags/analytics.json +0 -1
  261. package/embedded-knowledge/indexes/tags/api-delegates.json +0 -1
  262. package/embedded-knowledge/indexes/tags/api-design.json +0 -1
  263. package/embedded-knowledge/indexes/tags/api-documentation.json +0 -1
  264. package/embedded-knowledge/indexes/tags/api-endpoints.json +0 -1
  265. package/embedded-knowledge/indexes/tags/api-extensibility.json +0 -1
  266. package/embedded-knowledge/indexes/tags/api-fieldsets.json +0 -1
  267. package/embedded-knowledge/indexes/tags/api-integration.json +0 -1
  268. package/embedded-knowledge/indexes/tags/api-interfaces.json +0 -1
  269. package/embedded-knowledge/indexes/tags/api-optimization.json +0 -1
  270. package/embedded-knowledge/indexes/tags/api-pages.json +0 -1
  271. package/embedded-knowledge/indexes/tags/api-patterns.json +0 -1
  272. package/embedded-knowledge/indexes/tags/api-permissions.json +0 -1
  273. package/embedded-knowledge/indexes/tags/api-responses.json +0 -1
  274. package/embedded-knowledge/indexes/tags/api-simplification.json +0 -1
  275. package/embedded-knowledge/indexes/tags/api.json +0 -1
  276. package/embedded-knowledge/indexes/tags/architecture.json +0 -1
  277. package/embedded-knowledge/indexes/tags/async-patterns.json +0 -1
  278. package/embedded-knowledge/indexes/tags/async-processing.json +0 -1
  279. package/embedded-knowledge/indexes/tags/automatic-registration.json +0 -1
  280. package/embedded-knowledge/indexes/tags/batch-operations.json +0 -1
  281. package/embedded-knowledge/indexes/tags/bc24-migration.json +0 -1
  282. package/embedded-knowledge/indexes/tags/begin-blocks.json +0 -1
  283. package/embedded-knowledge/indexes/tags/begin-end.json +0 -1
  284. package/embedded-knowledge/indexes/tags/behavioral-patterns.json +0 -1
  285. package/embedded-knowledge/indexes/tags/best-practices.json +0 -1
  286. package/embedded-knowledge/indexes/tags/binding.json +0 -1
  287. package/embedded-knowledge/indexes/tags/block-structure.json +0 -1
  288. package/embedded-knowledge/indexes/tags/blocks.json +0 -1
  289. package/embedded-knowledge/indexes/tags/boolean-expressions.json +0 -1
  290. package/embedded-knowledge/indexes/tags/branching.json +0 -1
  291. package/embedded-knowledge/indexes/tags/breaking-changes.json +0 -1
  292. package/embedded-knowledge/indexes/tags/breakpoints.json +0 -1
  293. package/embedded-knowledge/indexes/tags/business-foundation.json +0 -1
  294. package/embedded-knowledge/indexes/tags/business-infrastructure.json +0 -1
  295. package/embedded-knowledge/indexes/tags/business-process.json +0 -1
  296. package/embedded-knowledge/indexes/tags/business-rules.json +0 -1
  297. package/embedded-knowledge/indexes/tags/caching.json +0 -1
  298. package/embedded-knowledge/indexes/tags/case-statements.json +0 -1
  299. package/embedded-knowledge/indexes/tags/case.json +0 -1
  300. package/embedded-knowledge/indexes/tags/code-analysis.json +0 -1
  301. package/embedded-knowledge/indexes/tags/code-clarity.json +0 -1
  302. package/embedded-knowledge/indexes/tags/code-comprehension.json +0 -1
  303. package/embedded-knowledge/indexes/tags/code-conversion.json +0 -1
  304. package/embedded-knowledge/indexes/tags/code-formatting.json +0 -1
  305. package/embedded-knowledge/indexes/tags/code-organization.json +0 -1
  306. package/embedded-knowledge/indexes/tags/code-patterns.json +0 -1
  307. package/embedded-knowledge/indexes/tags/code-quality.json +0 -1
  308. package/embedded-knowledge/indexes/tags/code-reuse.json +0 -1
  309. package/embedded-knowledge/indexes/tags/code-simplification.json +0 -1
  310. package/embedded-knowledge/indexes/tags/code-standards.json +0 -1
  311. package/embedded-knowledge/indexes/tags/code-structure.json +0 -1
  312. package/embedded-knowledge/indexes/tags/code-style.json +0 -1
  313. package/embedded-knowledge/indexes/tags/codeunit-design.json +0 -1
  314. package/embedded-knowledge/indexes/tags/command-queue.json +0 -1
  315. package/embedded-knowledge/indexes/tags/comments.json +0 -1
  316. package/embedded-knowledge/indexes/tags/compile-time-validation.json +0 -1
  317. package/embedded-knowledge/indexes/tags/complex-facade.json +0 -1
  318. package/embedded-knowledge/indexes/tags/complexity-hiding.json +0 -1
  319. package/embedded-knowledge/indexes/tags/complexity-management.json +0 -1
  320. package/embedded-knowledge/indexes/tags/compound-statements.json +0 -1
  321. package/embedded-knowledge/indexes/tags/concurrency.json +0 -1
  322. package/embedded-knowledge/indexes/tags/conditional-logic.json +0 -1
  323. package/embedded-knowledge/indexes/tags/conditional.json +0 -1
  324. package/embedded-knowledge/indexes/tags/conflict-resolution.json +0 -1
  325. package/embedded-knowledge/indexes/tags/consistency.json +0 -1
  326. package/embedded-knowledge/indexes/tags/contract-design.json +0 -1
  327. package/embedded-knowledge/indexes/tags/control-flow.json +0 -1
  328. package/embedded-knowledge/indexes/tags/conversion-guide.json +0 -1
  329. package/embedded-knowledge/indexes/tags/correlation.json +0 -1
  330. package/embedded-knowledge/indexes/tags/custom-messages.json +0 -1
  331. package/embedded-knowledge/indexes/tags/data-access.json +0 -1
  332. package/embedded-knowledge/indexes/tags/data-exposure.json +0 -1
  333. package/embedded-knowledge/indexes/tags/data-integrity.json +0 -1
  334. package/embedded-knowledge/indexes/tags/data-loading.json +0 -1
  335. package/embedded-knowledge/indexes/tags/data-manipulation.json +0 -1
  336. package/embedded-knowledge/indexes/tags/data-modeling.json +0 -1
  337. package/embedded-knowledge/indexes/tags/data-patterns.json +0 -1
  338. package/embedded-knowledge/indexes/tags/data-protection.json +0 -1
  339. package/embedded-knowledge/indexes/tags/data-validation.json +0 -1
  340. package/embedded-knowledge/indexes/tags/database.json +0 -1
  341. package/embedded-knowledge/indexes/tags/debugging.json +0 -1
  342. package/embedded-knowledge/indexes/tags/decision-making.json +0 -1
  343. package/embedded-knowledge/indexes/tags/declaration.json +0 -1
  344. package/embedded-knowledge/indexes/tags/default-messages.json +0 -1
  345. package/embedded-knowledge/indexes/tags/defensive-programming.json +0 -1
  346. package/embedded-knowledge/indexes/tags/deleteall.json +0 -1
  347. package/embedded-knowledge/indexes/tags/dependencies.json +0 -1
  348. package/embedded-knowledge/indexes/tags/deployment.json +0 -1
  349. package/embedded-knowledge/indexes/tags/developer-productivity.json +0 -1
  350. package/embedded-knowledge/indexes/tags/development-workflow.json +0 -1
  351. package/embedded-knowledge/indexes/tags/diagnostics.json +0 -1
  352. package/embedded-knowledge/indexes/tags/dimensions.json +0 -1
  353. package/embedded-knowledge/indexes/tags/documentation.json +0 -1
  354. package/embedded-knowledge/indexes/tags/early-exit.json +0 -1
  355. package/embedded-knowledge/indexes/tags/else-clauses.json +0 -1
  356. package/embedded-knowledge/indexes/tags/end-statements.json +0 -1
  357. package/embedded-knowledge/indexes/tags/enterprise-patterns.json +0 -1
  358. package/embedded-knowledge/indexes/tags/entity-relationships.json +0 -1
  359. package/embedded-knowledge/indexes/tags/error-handling.json +0 -1
  360. package/embedded-knowledge/indexes/tags/error-messages.json +0 -1
  361. package/embedded-knowledge/indexes/tags/error-prevention.json +0 -1
  362. package/embedded-knowledge/indexes/tags/error-text.json +0 -1
  363. package/embedded-knowledge/indexes/tags/etag.json +0 -1
  364. package/embedded-knowledge/indexes/tags/event-bridge.json +0 -1
  365. package/embedded-knowledge/indexes/tags/event-payload.json +0 -1
  366. package/embedded-knowledge/indexes/tags/event-routing.json +0 -1
  367. package/embedded-knowledge/indexes/tags/events.json +0 -1
  368. package/embedded-knowledge/indexes/tags/execution-flow.json +0 -1
  369. package/embedded-knowledge/indexes/tags/expressions.json +0 -1
  370. package/embedded-knowledge/indexes/tags/extensibility.json +0 -1
  371. package/embedded-knowledge/indexes/tags/extensions.json +0 -1
  372. package/embedded-knowledge/indexes/tags/facade-composition.json +0 -1
  373. package/embedded-knowledge/indexes/tags/facade-pattern.json +0 -1
  374. package/embedded-knowledge/indexes/tags/field-control.json +0 -1
  375. package/embedded-knowledge/indexes/tags/field-exclusion.json +0 -1
  376. package/embedded-knowledge/indexes/tags/field-registration.json +0 -1
  377. package/embedded-knowledge/indexes/tags/field-state.json +0 -1
  378. package/embedded-knowledge/indexes/tags/field-validation.json +0 -1
  379. package/embedded-knowledge/indexes/tags/fielderror.json +0 -1
  380. package/embedded-knowledge/indexes/tags/fields.json +0 -1
  381. package/embedded-knowledge/indexes/tags/filtering.json +0 -1
  382. package/embedded-knowledge/indexes/tags/filters.json +0 -1
  383. package/embedded-knowledge/indexes/tags/formatting.json +0 -1
  384. package/embedded-knowledge/indexes/tags/generic-methods.json +0 -1
  385. package/embedded-knowledge/indexes/tags/http-status.json +0 -1
  386. package/embedded-knowledge/indexes/tags/if-statements.json +0 -1
  387. package/embedded-knowledge/indexes/tags/implementation.json +0 -1
  388. package/embedded-knowledge/indexes/tags/indentation.json +0 -1
  389. package/embedded-knowledge/indexes/tags/index-summary.json +0 -277
  390. package/embedded-knowledge/indexes/tags/indexing.json +0 -1
  391. package/embedded-knowledge/indexes/tags/inheritance.json +0 -1
  392. package/embedded-knowledge/indexes/tags/integration.json +0 -1
  393. package/embedded-knowledge/indexes/tags/integrity-checking.json +0 -1
  394. package/embedded-knowledge/indexes/tags/intellisense.json +0 -1
  395. package/embedded-knowledge/indexes/tags/interface-design.json +0 -1
  396. package/embedded-knowledge/indexes/tags/interface-segregation.json +0 -1
  397. package/embedded-knowledge/indexes/tags/isolation.json +0 -1
  398. package/embedded-knowledge/indexes/tags/job-processing.json +0 -1
  399. package/embedded-knowledge/indexes/tags/keyboard-navigation.json +0 -1
  400. package/embedded-knowledge/indexes/tags/keywords.json +0 -1
  401. package/embedded-knowledge/indexes/tags/legacy-modernization.json +0 -1
  402. package/embedded-knowledge/indexes/tags/line-breaks.json +0 -1
  403. package/embedded-knowledge/indexes/tags/line-organization.json +0 -1
  404. package/embedded-knowledge/indexes/tags/line-positioning.json +0 -1
  405. package/embedded-knowledge/indexes/tags/localization.json +0 -1
  406. package/embedded-knowledge/indexes/tags/logging.json +0 -1
  407. package/embedded-knowledge/indexes/tags/loose-coupling.json +0 -1
  408. package/embedded-knowledge/indexes/tags/maintainability.json +0 -1
  409. package/embedded-knowledge/indexes/tags/memory-management.json +0 -1
  410. package/embedded-knowledge/indexes/tags/memory-optimization.json +0 -1
  411. package/embedded-knowledge/indexes/tags/memory.json +0 -1
  412. package/embedded-knowledge/indexes/tags/message-design.json +0 -1
  413. package/embedded-knowledge/indexes/tags/message-formatting.json +0 -1
  414. package/embedded-knowledge/indexes/tags/message-patterns.json +0 -1
  415. package/embedded-knowledge/indexes/tags/metadata-driven.json +0 -1
  416. package/embedded-knowledge/indexes/tags/method-comparison.json +0 -1
  417. package/embedded-knowledge/indexes/tags/module-architecture.json +0 -1
  418. package/embedded-knowledge/indexes/tags/module-validation.json +0 -1
  419. package/embedded-knowledge/indexes/tags/monitoring.json +0 -1
  420. package/embedded-knowledge/indexes/tags/multi-layer-facade.json +0 -1
  421. package/embedded-knowledge/indexes/tags/multi-tenancy.json +0 -1
  422. package/embedded-knowledge/indexes/tags/multiple-values.json +0 -1
  423. package/embedded-knowledge/indexes/tags/naming-conventions.json +0 -1
  424. package/embedded-knowledge/indexes/tags/naming.json +0 -1
  425. package/embedded-knowledge/indexes/tags/navigation.json +0 -1
  426. package/embedded-knowledge/indexes/tags/nested-statements.json +0 -1
  427. package/embedded-knowledge/indexes/tags/no-series-conversion.json +0 -1
  428. package/embedded-knowledge/indexes/tags/no-series-validation.json +0 -1
  429. package/embedded-knowledge/indexes/tags/no-series.json +0 -1
  430. package/embedded-knowledge/indexes/tags/number-generation.json +0 -1
  431. package/embedded-knowledge/indexes/tags/object-documentation.json +0 -1
  432. package/embedded-knowledge/indexes/tags/odata.json +0 -1
  433. package/embedded-knowledge/indexes/tags/ondelete.json +0 -1
  434. package/embedded-knowledge/indexes/tags/onvalidate.json +0 -1
  435. package/embedded-knowledge/indexes/tags/operation-delegation.json +0 -1
  436. package/embedded-knowledge/indexes/tags/operation-safety.json +0 -1
  437. package/embedded-knowledge/indexes/tags/operators.json +0 -1
  438. package/embedded-knowledge/indexes/tags/optimization.json +0 -1
  439. package/embedded-knowledge/indexes/tags/order.json +0 -1
  440. package/embedded-knowledge/indexes/tags/organization.json +0 -1
  441. package/embedded-knowledge/indexes/tags/pages.json +0 -1
  442. package/embedded-knowledge/indexes/tags/parameters.json +0 -1
  443. package/embedded-knowledge/indexes/tags/patterns.json +0 -1
  444. package/embedded-knowledge/indexes/tags/performance-optimization.json +0 -1
  445. package/embedded-knowledge/indexes/tags/performance.json +0 -1
  446. package/embedded-knowledge/indexes/tags/placement.json +0 -1
  447. package/embedded-knowledge/indexes/tags/posting-codeunits.json +0 -1
  448. package/embedded-knowledge/indexes/tags/posting.json +0 -1
  449. package/embedded-knowledge/indexes/tags/preconditions.json +0 -1
  450. package/embedded-knowledge/indexes/tags/primary-key.json +0 -1
  451. package/embedded-knowledge/indexes/tags/privacy.json +0 -1
  452. package/embedded-knowledge/indexes/tags/process-automation.json +0 -1
  453. package/embedded-knowledge/indexes/tags/production.json +0 -1
  454. package/embedded-knowledge/indexes/tags/productivity.json +0 -1
  455. package/embedded-knowledge/indexes/tags/query-performance.json +0 -1
  456. package/embedded-knowledge/indexes/tags/queue-management.json +0 -1
  457. package/embedded-knowledge/indexes/tags/ranges.json +0 -1
  458. package/embedded-knowledge/indexes/tags/readability.json +0 -1
  459. package/embedded-knowledge/indexes/tags/record-access.json +0 -1
  460. package/embedded-knowledge/indexes/tags/record-methods.json +0 -1
  461. package/embedded-knowledge/indexes/tags/refactoring.json +0 -1
  462. package/embedded-knowledge/indexes/tags/reference.json +0 -1
  463. package/embedded-knowledge/indexes/tags/repeat-loops.json +0 -1
  464. package/embedded-knowledge/indexes/tags/repeat-statement.json +0 -1
  465. package/embedded-knowledge/indexes/tags/runtime-errors.json +0 -1
  466. package/embedded-knowledge/indexes/tags/runtime.json +0 -1
  467. package/embedded-knowledge/indexes/tags/safeguards.json +0 -1
  468. package/embedded-knowledge/indexes/tags/security.json +0 -1
  469. package/embedded-knowledge/indexes/tags/sequence-management.json +0 -1
  470. package/embedded-knowledge/indexes/tags/serialization.json +0 -1
  471. package/embedded-knowledge/indexes/tags/session-logmessage.json +0 -1
  472. package/embedded-knowledge/indexes/tags/session.json +0 -1
  473. package/embedded-knowledge/indexes/tags/setloadfields.json +0 -1
  474. package/embedded-knowledge/indexes/tags/shortcuts.json +0 -1
  475. package/embedded-knowledge/indexes/tags/sift.json +0 -1
  476. package/embedded-knowledge/indexes/tags/singleinstance.json +0 -1
  477. package/embedded-knowledge/indexes/tags/spacing.json +0 -1
  478. package/embedded-knowledge/indexes/tags/sql-translation.json +0 -1
  479. package/embedded-knowledge/indexes/tags/standards.json +0 -1
  480. package/embedded-knowledge/indexes/tags/statements.json +0 -1
  481. package/embedded-knowledge/indexes/tags/streaming.json +0 -1
  482. package/embedded-knowledge/indexes/tags/strong-typing.json +0 -1
  483. package/embedded-knowledge/indexes/tags/structural-patterns.json +0 -1
  484. package/embedded-knowledge/indexes/tags/structure.json +0 -1
  485. package/embedded-knowledge/indexes/tags/subscribers.json +0 -1
  486. package/embedded-knowledge/indexes/tags/switch.json +0 -1
  487. package/embedded-knowledge/indexes/tags/symbol-search.json +0 -1
  488. package/embedded-knowledge/indexes/tags/syntax.json +0 -1
  489. package/embedded-knowledge/indexes/tags/systemid.json +0 -1
  490. package/embedded-knowledge/indexes/tags/table-configuration.json +0 -1
  491. package/embedded-knowledge/indexes/tags/table-events.json +0 -1
  492. package/embedded-knowledge/indexes/tags/table-keys.json +0 -1
  493. package/embedded-knowledge/indexes/tags/table-safety.json +0 -1
  494. package/embedded-knowledge/indexes/tags/task-scheduler.json +0 -1
  495. package/embedded-knowledge/indexes/tags/telemetry.json +0 -1
  496. package/embedded-knowledge/indexes/tags/template-method.json +0 -1
  497. package/embedded-knowledge/indexes/tags/temporary-tables.json +0 -1
  498. package/embedded-knowledge/indexes/tags/testfield.json +0 -1
  499. package/embedded-knowledge/indexes/tags/tradeoffs.json +0 -1
  500. package/embedded-knowledge/indexes/tags/triggers.json +0 -1
  501. package/embedded-knowledge/indexes/tags/troubleshooting.json +0 -1
  502. package/embedded-knowledge/indexes/tags/type-safety.json +0 -1
  503. package/embedded-knowledge/indexes/tags/url-structure.json +0 -1
  504. package/embedded-knowledge/indexes/tags/user-experience.json +0 -1
  505. package/embedded-knowledge/indexes/tags/user-feedback.json +0 -1
  506. package/embedded-knowledge/indexes/tags/user-interface.json +0 -1
  507. package/embedded-knowledge/indexes/tags/validation-feedback.json +0 -1
  508. package/embedded-knowledge/indexes/tags/validation.json +0 -1
  509. package/embedded-knowledge/indexes/tags/variables.json +0 -1
  510. package/embedded-knowledge/indexes/tags/verbosity.json +0 -1
  511. package/embedded-knowledge/indexes/tags/vs-code.json +0 -1
  512. package/embedded-knowledge/indexes/tags/web-services.json +0 -1
  513. package/embedded-knowledge/indexes/tags/workflow-management.json +0 -1
  514. package/embedded-knowledge/indexes/tags/workflow-optimization.json +0 -1
  515. package/embedded-knowledge/indexes/tags/workflow-templates.json +0 -1
  516. package/embedded-knowledge/indexes/tags/workspace.json +0 -1
  517. package/embedded-knowledge/indexes/tags/xml-documentation.json +0 -1
  518. package/embedded-knowledge/indexes/topic-relationships.json +0 -128
  519. package/embedded-knowledge/methodologies/index.json +0 -81
  520. package/embedded-knowledge/methodologies/phases/analysis-full.md +0 -208
  521. package/embedded-knowledge/methodologies/phases/analysis-quick.md +0 -44
  522. package/embedded-knowledge/methodologies/phases/analysis.md +0 -182
  523. package/embedded-knowledge/methodologies/phases/execution-validation-full.md +0 -174
  524. package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +0 -31
  525. package/embedded-knowledge/methodologies/phases/execution-validation.md +0 -174
  526. package/embedded-knowledge/methodologies/phases/performance-full.md +0 -211
  527. package/embedded-knowledge/methodologies/phases/performance-quick.md +0 -32
  528. package/embedded-knowledge/methodologies/phases/performance.md +0 -211
  529. package/embedded-knowledge/methodologies/phases/verification-full.md +0 -162
  530. package/embedded-knowledge/methodologies/phases/verification-quick.md +0 -48
  531. package/embedded-knowledge/methodologies/phases/verification.md +0 -146
  532. package/embedded-knowledge/methodologies/workflow-enforcement.md +0 -142
  533. package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +0 -99
  534. package/embedded-knowledge/specialists/alex-architect.md +0 -216
  535. package/embedded-knowledge/specialists/casey-copilot.md +0 -226
  536. package/embedded-knowledge/specialists/chris-config.md +0 -267
  537. package/embedded-knowledge/specialists/dean-debug.md +0 -222
  538. package/embedded-knowledge/specialists/eva-errors.md +0 -235
  539. package/embedded-knowledge/specialists/jordan-bridge.md +0 -235
  540. package/embedded-knowledge/specialists/logan-legacy.md +0 -209
  541. package/embedded-knowledge/specialists/maya-mentor.md +0 -211
  542. package/embedded-knowledge/specialists/morgan-market.md +0 -226
  543. package/embedded-knowledge/specialists/quinn-tester.md +0 -235
  544. package/embedded-knowledge/specialists/roger-reviewer.md +0 -234
  545. package/embedded-knowledge/specialists/sam-coder.md +0 -359
  546. package/embedded-knowledge/specialists/seth-security.md +0 -235
  547. package/embedded-knowledge/specialists/taylor-docs.md +0 -257
  548. package/embedded-knowledge/specialists/uma-ux.md +0 -235
@@ -1,810 +0,0 @@
1
- # No Series Implementation Patterns - AL Code Examples
2
-
3
- This sample demonstrates implementing robust number generation and sequence management in Business Central.
4
-
5
- ## Basic No Series Implementation
6
-
7
- ```al
8
- // Custom number generation codeunit
9
- codeunit 50500 "Custom No. Series Management"
10
- {
11
- procedure GetNextNo(NoSeriesCode: Code[20]; SeriesDate: Date): Code[20]
12
- var
13
- NoSeries: Record "No. Series";
14
- NoSeriesLine: Record "No. Series Line";
15
- NextNo: Code[20];
16
- begin
17
- if not NoSeries.Get(NoSeriesCode) then
18
- Error('No. Series %1 does not exist', NoSeriesCode);
19
-
20
- NoSeriesLine := FindApplicableNoSeriesLine(NoSeriesCode, SeriesDate);
21
- NextNo := GenerateNextNumber(NoSeriesLine);
22
-
23
- UpdateNoSeriesLine(NoSeriesLine, NextNo);
24
- LogNumberGeneration(NoSeriesCode, NextNo);
25
-
26
- exit(NextNo);
27
- end;
28
-
29
- procedure GetNextNoWithGapManagement(NoSeriesCode: Code[20]; SeriesDate: Date; FillGaps: Boolean): Code[20]
30
- var
31
- NextNo: Code[20];
32
- GapNo: Code[20];
33
- begin
34
- if FillGaps then begin
35
- GapNo := FindFirstGap(NoSeriesCode);
36
- if GapNo <> '' then begin
37
- MarkGapAsFilled(NoSeriesCode, GapNo);
38
- exit(GapNo);
39
- end;
40
- end;
41
-
42
- exit(GetNextNo(NoSeriesCode, SeriesDate));
43
- end;
44
-
45
- procedure CreateCustomNoSeries(NoSeriesCode: Code[20]; Description: Text[100]; StartingNo: Code[20]; EndingNo: Code[20]): Boolean
46
- var
47
- NoSeries: Record "No. Series";
48
- NoSeriesLine: Record "No. Series Line";
49
- begin
50
- // Create No. Series header
51
- if NoSeries.Get(NoSeriesCode) then
52
- exit(false); // Already exists
53
-
54
- NoSeries.Init();
55
- NoSeries.Code := NoSeriesCode;
56
- NoSeries.Description := Description;
57
- NoSeries."Default Nos." := true;
58
- NoSeries."Manual Nos." := false;
59
- NoSeries.Insert(true);
60
-
61
- // Create No. Series line
62
- NoSeriesLine.Init();
63
- NoSeriesLine."Series Code" := NoSeriesCode;
64
- NoSeriesLine."Line No." := 10000;
65
- NoSeriesLine."Starting Date" := Today;
66
- NoSeriesLine."Starting No." := StartingNo;
67
- NoSeriesLine."Ending No." := EndingNo;
68
- NoSeriesLine."Last No. Used" := '';
69
- NoSeriesLine."Increment-by No." := 1;
70
- NoSeriesLine.Insert(true);
71
-
72
- exit(true);
73
- end;
74
-
75
- local procedure FindApplicableNoSeriesLine(NoSeriesCode: Code[20]; SeriesDate: Date): Record "No. Series Line"
76
- var
77
- NoSeriesLine: Record "No. Series Line";
78
- begin
79
- NoSeriesLine.SetRange("Series Code", NoSeriesCode);
80
- NoSeriesLine.SetFilter("Starting Date", '<=%1', SeriesDate);
81
- NoSeriesLine.SetFilter("Ending Date", '%1|>=%2', 0D, SeriesDate);
82
-
83
- if not NoSeriesLine.FindLast() then
84
- Error('No applicable No. Series Line found for %1 on %2', NoSeriesCode, SeriesDate);
85
-
86
- exit(NoSeriesLine);
87
- end;
88
-
89
- local procedure GenerateNextNumber(var NoSeriesLine: Record "No. Series Line"): Code[20]
90
- var
91
- NextNo: Code[20];
92
- NumberPart: BigInteger;
93
- PrefixPart: Text;
94
- SuffixPart: Text;
95
- NumberLength: Integer;
96
- begin
97
- if NoSeriesLine."Last No. Used" = '' then
98
- NextNo := NoSeriesLine."Starting No."
99
- else begin
100
- // Parse current number
101
- ParseNumberComponents(NoSeriesLine."Last No. Used", PrefixPart, NumberPart, SuffixPart, NumberLength);
102
-
103
- // Increment number
104
- NumberPart += NoSeriesLine."Increment-by No.";
105
-
106
- // Reconstruct number
107
- NextNo := ReconstructNumber(PrefixPart, NumberPart, SuffixPart, NumberLength);
108
- end;
109
-
110
- // Validate against ending number
111
- if (NoSeriesLine."Ending No." <> '') and (NextNo > NoSeriesLine."Ending No.") then
112
- Error('No. Series %1 has reached its ending number %2', NoSeriesLine."Series Code", NoSeriesLine."Ending No.");
113
-
114
- exit(NextNo);
115
- end;
116
-
117
- local procedure UpdateNoSeriesLine(var NoSeriesLine: Record "No. Series Line"; NextNo: Code[20])
118
- begin
119
- NoSeriesLine."Last No. Used" := NextNo;
120
- NoSeriesLine."Last Date Used" := Today;
121
- NoSeriesLine.Modify(true);
122
- end;
123
-
124
- local procedure ParseNumberComponents(NumberStr: Code[20]; var Prefix: Text; var Number: BigInteger; var Suffix: Text; var NumberLength: Integer)
125
- var
126
- i: Integer;
127
- CurrentChar: Char;
128
- NumberStartPos: Integer;
129
- NumberEndPos: Integer;
130
- NumberPart: Text;
131
- begin
132
- Clear(Prefix);
133
- Clear(Suffix);
134
- Number := 0;
135
- NumberLength := 0;
136
- NumberStartPos := 0;
137
- NumberEndPos := 0;
138
-
139
- // Find the start of the numeric part
140
- for i := 1 to StrLen(NumberStr) do begin
141
- CurrentChar := NumberStr[i];
142
- if CurrentChar in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] then begin
143
- if NumberStartPos = 0 then
144
- NumberStartPos := i;
145
- NumberEndPos := i;
146
- end else begin
147
- if NumberStartPos > 0 then
148
- break;
149
- end;
150
- end;
151
-
152
- if NumberStartPos > 0 then begin
153
- // Extract components
154
- if NumberStartPos > 1 then
155
- Prefix := CopyStr(NumberStr, 1, NumberStartPos - 1);
156
-
157
- NumberPart := CopyStr(NumberStr, NumberStartPos, NumberEndPos - NumberStartPos + 1);
158
- NumberLength := StrLen(NumberPart);
159
- Evaluate(Number, NumberPart);
160
-
161
- if NumberEndPos < StrLen(NumberStr) then
162
- Suffix := CopyStr(NumberStr, NumberEndPos + 1);
163
- end;
164
- end;
165
-
166
- local procedure ReconstructNumber(Prefix: Text; Number: BigInteger; Suffix: Text; NumberLength: Integer): Code[20]
167
- var
168
- NumberPart: Text;
169
- Result: Text;
170
- begin
171
- NumberPart := Format(Number);
172
-
173
- // Pad with leading zeros if necessary
174
- while StrLen(NumberPart) < NumberLength do
175
- NumberPart := '0' + NumberPart;
176
-
177
- Result := Prefix + NumberPart + Suffix;
178
- exit(CopyStr(Result, 1, 20));
179
- end;
180
-
181
- local procedure FindFirstGap(NoSeriesCode: Code[20]): Code[20]
182
- var
183
- NoSeriesGap: Record "No. Series Gap";
184
- begin
185
- NoSeriesGap.SetRange("Series Code", NoSeriesCode);
186
- NoSeriesGap.SetRange(Filled, false);
187
- if NoSeriesGap.FindFirst() then
188
- exit(NoSeriesGap."Gap No.");
189
-
190
- exit('');
191
- end;
192
-
193
- local procedure MarkGapAsFilled(NoSeriesCode: Code[20]; GapNo: Code[20])
194
- var
195
- NoSeriesGap: Record "No. Series Gap";
196
- begin
197
- if NoSeriesGap.Get(NoSeriesCode, GapNo) then begin
198
- NoSeriesGap.Filled := true;
199
- NoSeriesGap."Fill Date" := Today;
200
- NoSeriesGap."Fill Time" := Time;
201
- NoSeriesGap.Modify(true);
202
- end;
203
- end;
204
-
205
- local procedure LogNumberGeneration(NoSeriesCode: Code[20]; GeneratedNo: Code[20])
206
- var
207
- NoSeriesLog: Record "No. Series Log";
208
- begin
209
- NoSeriesLog.Init();
210
- NoSeriesLog."Entry No." := GetNextLogEntryNo();
211
- NoSeriesLog."Series Code" := NoSeriesCode;
212
- NoSeriesLog."Generated No." := GeneratedNo;
213
- NoSeriesLog."Generation Date" := Today;
214
- NoSeriesLog."Generation Time" := Time;
215
- NoSeriesLog."User ID" := UserId;
216
- NoSeriesLog.Insert(true);
217
- end;
218
-
219
- local procedure GetNextLogEntryNo(): Integer
220
- var
221
- NoSeriesLog: Record "No. Series Log";
222
- begin
223
- if NoSeriesLog.FindLast() then
224
- exit(NoSeriesLog."Entry No." + 1)
225
- else
226
- exit(1);
227
- end;
228
- }
229
- ```
230
-
231
- ## Concurrency-Safe Number Generation
232
-
233
- ```al
234
- // High-performance number generation with concurrency control
235
- codeunit 50501 "Concurrent No. Series Management"
236
- {
237
- procedure GetNextNoSafe(NoSeriesCode: Code[20]; SeriesDate: Date): Code[20]
238
- var
239
- NoSeriesLine: Record "No. Series Line";
240
- NextNo: Code[20];
241
- RetryCount: Integer;
242
- MaxRetries: Integer;
243
- begin
244
- MaxRetries := 10;
245
- RetryCount := 0;
246
-
247
- repeat
248
- RetryCount += 1;
249
-
250
- if TryGetNextNoWithLock(NoSeriesCode, SeriesDate, NextNo) then
251
- exit(NextNo);
252
-
253
- if RetryCount >= MaxRetries then
254
- Error('Unable to generate next number after %1 attempts. Series may be in use by another user.', MaxRetries);
255
-
256
- // Wait before retry (exponential backoff)
257
- Sleep(RetryCount * 100);
258
-
259
- until false;
260
- end;
261
-
262
- [TryFunction]
263
- local procedure TryGetNextNoWithLock(NoSeriesCode: Code[20]; SeriesDate: Date; var NextNo: Code[20])
264
- var
265
- NoSeriesLine: Record "No. Series Line";
266
- NoSeriesLock: Record "No. Series Lock";
267
- LockAcquired: Boolean;
268
- begin
269
- // Attempt to acquire lock
270
- LockAcquired := TryAcquireSeriesLock(NoSeriesCode);
271
- if not LockAcquired then
272
- Error('Lock not acquired');
273
-
274
- try
275
- // Find applicable line
276
- NoSeriesLine := FindApplicableNoSeriesLine(NoSeriesCode, SeriesDate);
277
-
278
- // Generate next number
279
- NextNo := GenerateNextNumberSafe(NoSeriesLine);
280
-
281
- // Update line
282
- UpdateNoSeriesLineSafe(NoSeriesLine, NextNo);
283
-
284
- // Commit changes
285
- Commit();
286
-
287
- finally
288
- // Always release lock
289
- ReleaseSeriesLock(NoSeriesCode);
290
- end;
291
- end;
292
-
293
- [TryFunction]
294
- local procedure TryAcquireSeriesLock(NoSeriesCode: Code[20]): Boolean
295
- var
296
- NoSeriesLock: Record "No. Series Lock";
297
- LockTimeout: DateTime;
298
- begin
299
- LockTimeout := CurrentDateTime + 5000; // 5 second timeout
300
-
301
- NoSeriesLock.SetRange("Series Code", NoSeriesCode);
302
-
303
- repeat
304
- if not NoSeriesLock.FindFirst() then begin
305
- // Create lock record
306
- NoSeriesLock.Init();
307
- NoSeriesLock."Series Code" := NoSeriesCode;
308
- NoSeriesLock."Locked By" := UserId;
309
- NoSeriesLock."Lock Time" := CurrentDateTime;
310
- NoSeriesLock.Insert(true);
311
- exit(true);
312
- end;
313
-
314
- // Check if lock is stale (older than 1 minute)
315
- if NoSeriesLock."Lock Time" < (CurrentDateTime - 60000) then begin
316
- NoSeriesLock.Delete(true);
317
- continue;
318
- end;
319
-
320
- Sleep(50); // Wait 50ms before retry
321
-
322
- until CurrentDateTime > LockTimeout;
323
-
324
- exit(false);
325
- end;
326
-
327
- local procedure ReleaseSeriesLock(NoSeriesCode: Code[20])
328
- var
329
- NoSeriesLock: Record "No. Series Lock";
330
- begin
331
- NoSeriesLock.SetRange("Series Code", NoSeriesCode);
332
- NoSeriesLock.SetRange("Locked By", UserId);
333
- if NoSeriesLock.FindFirst() then
334
- NoSeriesLock.Delete(true);
335
- end;
336
-
337
- local procedure FindApplicableNoSeriesLine(NoSeriesCode: Code[20]; SeriesDate: Date): Record "No. Series Line"
338
- var
339
- NoSeriesLine: Record "No. Series Line";
340
- begin
341
- NoSeriesLine.SetRange("Series Code", NoSeriesCode);
342
- NoSeriesLine.SetFilter("Starting Date", '<=%1', SeriesDate);
343
- NoSeriesLine.SetFilter("Ending Date", '%1|>=%2', 0D, SeriesDate);
344
-
345
- if not NoSeriesLine.FindLast() then
346
- Error('No applicable No. Series Line found for %1 on %2', NoSeriesCode, SeriesDate);
347
-
348
- exit(NoSeriesLine);
349
- end;
350
-
351
- local procedure GenerateNextNumberSafe(var NoSeriesLine: Record "No. Series Line"): Code[20]
352
- var
353
- NextNo: Code[20];
354
- LastUsedNo: Code[20];
355
- begin
356
- // Re-read to get latest values
357
- NoSeriesLine.Find();
358
-
359
- if NoSeriesLine."Last No. Used" = '' then
360
- NextNo := NoSeriesLine."Starting No."
361
- else begin
362
- NextNo := IncrementNumber(NoSeriesLine."Last No. Used", NoSeriesLine."Increment-by No.");
363
- end;
364
-
365
- // Validate against ending number
366
- if (NoSeriesLine."Ending No." <> '') and (NextNo > NoSeriesLine."Ending No.") then
367
- Error('No. Series %1 has reached its ending number %2', NoSeriesLine."Series Code", NoSeriesLine."Ending No.");
368
-
369
- exit(NextNo);
370
- end;
371
-
372
- local procedure UpdateNoSeriesLineSafe(var NoSeriesLine: Record "No. Series Line"; NextNo: Code[20])
373
- begin
374
- NoSeriesLine."Last No. Used" := NextNo;
375
- NoSeriesLine."Last Date Used" := Today;
376
- NoSeriesLine.Modify(true);
377
- end;
378
-
379
- local procedure IncrementNumber(CurrentNo: Code[20]; IncrementBy: Integer): Code[20]
380
- var
381
- NumberPart: BigInteger;
382
- PrefixPart: Text;
383
- SuffixPart: Text;
384
- NumberLength: Integer;
385
- begin
386
- ParseNumberComponents(CurrentNo, PrefixPart, NumberPart, SuffixPart, NumberLength);
387
- NumberPart += IncrementBy;
388
- exit(ReconstructNumber(PrefixPart, NumberPart, SuffixPart, NumberLength));
389
- end;
390
-
391
- local procedure ParseNumberComponents(NumberStr: Code[20]; var Prefix: Text; var Number: BigInteger; var Suffix: Text; var NumberLength: Integer)
392
- begin
393
- // Implementation from previous example
394
- end;
395
-
396
- local procedure ReconstructNumber(Prefix: Text; Number: BigInteger; Suffix: Text; NumberLength: Integer): Code[20]
397
- begin
398
- // Implementation from previous example
399
- end;
400
- }
401
- ```
402
-
403
- ## Batch Number Allocation
404
-
405
- ```al
406
- // Optimized batch allocation for high-volume scenarios
407
- codeunit 50502 "Batch No. Series Allocation"
408
- {
409
- var
410
- AllocatedNumbers: Dictionary of [Code[20], List of [Code[20]]];
411
-
412
- procedure AllocateNumberBatch(NoSeriesCode: Code[20]; BatchSize: Integer): List of [Code[20]]
413
- var
414
- NoSeriesLine: Record "No. Series Line";
415
- AllocatedBatch: List of [Code[20]];
416
- NextNo: Code[20];
417
- i: Integer;
418
- begin
419
- if BatchSize <= 0 then
420
- Error('Batch size must be greater than zero');
421
-
422
- if BatchSize > 1000 then
423
- Error('Batch size cannot exceed 1000');
424
-
425
- // Lock the series for batch allocation
426
- LockNoSeriesForBatch(NoSeriesCode);
427
-
428
- try
429
- NoSeriesLine := FindApplicableNoSeriesLine(NoSeriesCode, Today);
430
-
431
- // Allocate batch
432
- for i := 1 to BatchSize do begin
433
- NextNo := GenerateNextNumberInBatch(NoSeriesLine, i);
434
- AllocatedBatch.Add(NextNo);
435
- end;
436
-
437
- // Update the line with the last allocated number
438
- UpdateNoSeriesLineForBatch(NoSeriesLine, AllocatedBatch.Get(BatchSize));
439
-
440
- // Cache allocated numbers
441
- AllocatedNumbers.Set(NoSeriesCode, AllocatedBatch);
442
-
443
- Commit();
444
-
445
- finally
446
- UnlockNoSeriesForBatch(NoSeriesCode);
447
- end;
448
-
449
- exit(AllocatedBatch);
450
- end;
451
-
452
- procedure GetNextFromBatch(NoSeriesCode: Code[20]): Code[20]
453
- var
454
- BatchList: List of [Code[20]];
455
- NextNo: Code[20];
456
- begin
457
- if not AllocatedNumbers.Get(NoSeriesCode, BatchList) then
458
- Error('No allocated batch found for series %1', NoSeriesCode);
459
-
460
- if BatchList.Count = 0 then begin
461
- // Batch exhausted, allocate new batch
462
- BatchList := AllocateNumberBatch(NoSeriesCode, 100); // Default batch size
463
- end;
464
-
465
- NextNo := BatchList.Get(1);
466
- BatchList.RemoveAt(1);
467
- AllocatedNumbers.Set(NoSeriesCode, BatchList);
468
-
469
- LogBatchUsage(NoSeriesCode, NextNo);
470
-
471
- exit(NextNo);
472
- end;
473
-
474
- procedure GetBatchStatus(NoSeriesCode: Code[20]): Dictionary of [Text, Variant]
475
- var
476
- Status: Dictionary of [Text, Variant];
477
- BatchList: List of [Code[20]];
478
- begin
479
- Status.Set('SeriesCode', NoSeriesCode);
480
-
481
- if AllocatedNumbers.Get(NoSeriesCode, BatchList) then begin
482
- Status.Set('HasBatch', true);
483
- Status.Set('RemainingNumbers', BatchList.Count);
484
- if BatchList.Count > 0 then begin
485
- Status.Set('NextAvailable', BatchList.Get(1));
486
- Status.Set('LastInBatch', BatchList.Get(BatchList.Count));
487
- end;
488
- end else begin
489
- Status.Set('HasBatch', false);
490
- Status.Set('RemainingNumbers', 0);
491
- end;
492
-
493
- exit(Status);
494
- end;
495
-
496
- local procedure FindApplicableNoSeriesLine(NoSeriesCode: Code[20]; SeriesDate: Date): Record "No. Series Line"
497
- var
498
- NoSeriesLine: Record "No. Series Line";
499
- begin
500
- NoSeriesLine.SetRange("Series Code", NoSeriesCode);
501
- NoSeriesLine.SetFilter("Starting Date", '<=%1', SeriesDate);
502
- NoSeriesLine.SetFilter("Ending Date", '%1|>=%2', 0D, SeriesDate);
503
-
504
- if not NoSeriesLine.FindLast() then
505
- Error('No applicable No. Series Line found for %1 on %2', NoSeriesCode, SeriesDate);
506
-
507
- exit(NoSeriesLine);
508
- end;
509
-
510
- local procedure GenerateNextNumberInBatch(var NoSeriesLine: Record "No. Series Line"; BatchIndex: Integer): Code[20]
511
- var
512
- BaseNumber: Code[20];
513
- NumberPart: BigInteger;
514
- PrefixPart: Text;
515
- SuffixPart: Text;
516
- NumberLength: Integer;
517
- begin
518
- if BatchIndex = 1 then begin
519
- if NoSeriesLine."Last No. Used" = '' then
520
- BaseNumber := NoSeriesLine."Starting No."
521
- else
522
- BaseNumber := IncrementNumber(NoSeriesLine."Last No. Used", NoSeriesLine."Increment-by No.");
523
- end else begin
524
- BaseNumber := IncrementNumber(BaseNumber, NoSeriesLine."Increment-by No.");
525
- end;
526
-
527
- // Validate against ending number
528
- if (NoSeriesLine."Ending No." <> '') and (BaseNumber > NoSeriesLine."Ending No.") then
529
- Error('No. Series %1 would exceed its ending number %2 in batch allocation', NoSeriesLine."Series Code", NoSeriesLine."Ending No.");
530
-
531
- exit(BaseNumber);
532
- end;
533
-
534
- local procedure UpdateNoSeriesLineForBatch(var NoSeriesLine: Record "No. Series Line"; LastAllocatedNo: Code[20])
535
- begin
536
- NoSeriesLine."Last No. Used" := LastAllocatedNo;
537
- NoSeriesLine."Last Date Used" := Today;
538
- NoSeriesLine.Modify(true);
539
- end;
540
-
541
- local procedure LockNoSeriesForBatch(NoSeriesCode: Code[20])
542
- var
543
- NoSeriesBatchLock: Record "No. Series Batch Lock";
544
- begin
545
- NoSeriesBatchLock.Init();
546
- NoSeriesBatchLock."Series Code" := NoSeriesCode;
547
- NoSeriesBatchLock."Locked By" := UserId;
548
- NoSeriesBatchLock."Lock Time" := CurrentDateTime;
549
- NoSeriesBatchLock.Insert(true);
550
- end;
551
-
552
- local procedure UnlockNoSeriesForBatch(NoSeriesCode: Code[20])
553
- var
554
- NoSeriesBatchLock: Record "No. Series Batch Lock";
555
- begin
556
- NoSeriesBatchLock.SetRange("Series Code", NoSeriesCode);
557
- NoSeriesBatchLock.SetRange("Locked By", UserId);
558
- if NoSeriesBatchLock.FindFirst() then
559
- NoSeriesBatchLock.Delete(true);
560
- end;
561
-
562
- local procedure IncrementNumber(CurrentNo: Code[20]; IncrementBy: Integer): Code[20]
563
- begin
564
- // Implementation from previous examples
565
- end;
566
-
567
- local procedure LogBatchUsage(NoSeriesCode: Code[20]; UsedNo: Code[20])
568
- var
569
- NoSeriesBatchLog: Record "No. Series Batch Log";
570
- begin
571
- NoSeriesBatchLog.Init();
572
- NoSeriesBatchLog."Entry No." := GetNextBatchLogEntryNo();
573
- NoSeriesBatchLog."Series Code" := NoSeriesCode;
574
- NoSeriesBatchLog."Used No." := UsedNo;
575
- NoSeriesBatchLog."Usage Date" := Today;
576
- NoSeriesBatchLog."Usage Time" := Time;
577
- NoSeriesBatchLog."User ID" := UserId;
578
- NoSeriesBatchLog.Insert(true);
579
- end;
580
-
581
- local procedure GetNextBatchLogEntryNo(): Integer
582
- var
583
- NoSeriesBatchLog: Record "No. Series Batch Log";
584
- begin
585
- if NoSeriesBatchLog.FindLast() then
586
- exit(NoSeriesBatchLog."Entry No." + 1)
587
- else
588
- exit(1);
589
- end;
590
- }
591
- ```
592
-
593
- ## Multi-Dimensional Number Generation
594
-
595
- ```al
596
- // Support for complex numbering schemes with multiple dimensions
597
- codeunit 50503 "Multi-Dimensional No. Series"
598
- {
599
- procedure GetNextCompoundNo(BaseSeriesCode: Code[20]; Dimensions: Dictionary of [Text, Text]): Code[20]
600
- var
601
- CompoundCode: Code[20];
602
- GeneratedNo: Code[20];
603
- begin
604
- CompoundCode := BuildCompoundSeriesCode(BaseSeriesCode, Dimensions);
605
- GeneratedNo := GetOrCreateCompoundSeries(CompoundCode, Dimensions);
606
-
607
- LogCompoundNumberGeneration(BaseSeriesCode, CompoundCode, GeneratedNo, Dimensions);
608
-
609
- exit(GeneratedNo);
610
- end;
611
-
612
- procedure GetLocationBasedNo(BaseSeriesCode: Code[20]; LocationCode: Code[10]): Code[20]
613
- var
614
- Dimensions: Dictionary of [Text, Text];
615
- begin
616
- Dimensions.Set('LOCATION', LocationCode);
617
- exit(GetNextCompoundNo(BaseSeriesCode, Dimensions));
618
- end;
619
-
620
- procedure GetYearBasedNo(BaseSeriesCode: Code[20]; FiscalYear: Integer): Code[20]
621
- var
622
- Dimensions: Dictionary of [Text, Text];
623
- begin
624
- Dimensions.Set('YEAR', Format(FiscalYear));
625
- exit(GetNextCompoundNo(BaseSeriesCode, Dimensions));
626
- end;
627
-
628
- procedure GetDepartmentBasedNo(BaseSeriesCode: Code[20]; DepartmentCode: Code[10]; LocationCode: Code[10]): Code[20]
629
- var
630
- Dimensions: Dictionary of [Text, Text];
631
- begin
632
- Dimensions.Set('DEPARTMENT', DepartmentCode);
633
- Dimensions.Set('LOCATION', LocationCode);
634
- exit(GetNextCompoundNo(BaseSeriesCode, Dimensions));
635
- end;
636
-
637
- local procedure BuildCompoundSeriesCode(BaseSeriesCode: Code[20]; Dimensions: Dictionary of [Text, Text]): Code[20]
638
- var
639
- CompoundCode: Text;
640
- DimensionKey: Text;
641
- DimensionValue: Text;
642
- SortedKeys: List of [Text];
643
- begin
644
- CompoundCode := BaseSeriesCode;
645
-
646
- // Sort dimension keys for consistent ordering
647
- foreach DimensionKey in Dimensions.Keys do
648
- SortedKeys.Add(DimensionKey);
649
-
650
- SortDimensionKeys(SortedKeys);
651
-
652
- // Build compound code
653
- foreach DimensionKey in SortedKeys do begin
654
- Dimensions.Get(DimensionKey, DimensionValue);
655
- CompoundCode += '-' + DimensionKey + '-' + DimensionValue;
656
- end;
657
-
658
- // Ensure code fits in 20 characters
659
- if StrLen(CompoundCode) > 20 then
660
- CompoundCode := CreateHashedCompoundCode(BaseSeriesCode, Dimensions);
661
-
662
- exit(CopyStr(CompoundCode, 1, 20));
663
- end;
664
-
665
- local procedure GetOrCreateCompoundSeries(CompoundCode: Code[20]; Dimensions: Dictionary of [Text, Text]): Code[20]
666
- var
667
- NoSeries: Record "No. Series";
668
- CustomNoSeriesManagement: Codeunit "Custom No. Series Management";
669
- StartingNo: Code[20];
670
- EndingNo: Code[20];
671
- begin
672
- if not NoSeries.Get(CompoundCode) then begin
673
- // Create new compound series
674
- StartingNo := BuildStartingNumber(Dimensions);
675
- EndingNo := BuildEndingNumber(Dimensions);
676
-
677
- if not CustomNoSeriesManagement.CreateCustomNoSeries(
678
- CompoundCode,
679
- 'Auto-generated compound series',
680
- StartingNo,
681
- EndingNo) then
682
- Error('Failed to create compound No. Series %1', CompoundCode);
683
- end;
684
-
685
- exit(CustomNoSeriesManagement.GetNextNo(CompoundCode, Today));
686
- end;
687
-
688
- local procedure BuildStartingNumber(Dimensions: Dictionary of [Text, Text]): Code[20]
689
- var
690
- StartingNo: Text;
691
- DimensionKey: Text;
692
- DimensionValue: Text;
693
- begin
694
- StartingNo := '';
695
-
696
- // Build starting number based on dimensions
697
- if Dimensions.Get('LOCATION', DimensionValue) then
698
- StartingNo += DimensionValue;
699
-
700
- if Dimensions.Get('DEPARTMENT', DimensionValue) then
701
- StartingNo += DimensionValue;
702
-
703
- if Dimensions.Get('YEAR', DimensionValue) then
704
- StartingNo += CopyStr(DimensionValue, 3, 2); // Last 2 digits of year
705
-
706
- StartingNo += '00001';
707
-
708
- exit(CopyStr(StartingNo, 1, 20));
709
- end;
710
-
711
- local procedure BuildEndingNumber(Dimensions: Dictionary of [Text, Text]): Code[20]
712
- var
713
- EndingNo: Text;
714
- DimensionKey: Text;
715
- DimensionValue: Text;
716
- begin
717
- EndingNo := '';
718
-
719
- // Build ending number based on dimensions
720
- if Dimensions.Get('LOCATION', DimensionValue) then
721
- EndingNo += DimensionValue;
722
-
723
- if Dimensions.Get('DEPARTMENT', DimensionValue) then
724
- EndingNo += DimensionValue;
725
-
726
- if Dimensions.Get('YEAR', DimensionValue) then
727
- EndingNo += CopyStr(DimensionValue, 3, 2); // Last 2 digits of year
728
-
729
- EndingNo += '99999';
730
-
731
- exit(CopyStr(EndingNo, 1, 20));
732
- end;
733
-
734
- local procedure CreateHashedCompoundCode(BaseSeriesCode: Code[20]; Dimensions: Dictionary of [Text, Text]): Code[20]
735
- var
736
- HashInput: Text;
737
- DimensionKey: Text;
738
- DimensionValue: Text;
739
- HashValue: Text;
740
- begin
741
- HashInput := BaseSeriesCode;
742
-
743
- foreach DimensionKey in Dimensions.Keys do begin
744
- Dimensions.Get(DimensionKey, DimensionValue);
745
- HashInput += DimensionKey + DimensionValue;
746
- end;
747
-
748
- // Create simple hash (in production, use proper hashing)
749
- HashValue := Format(HashInput.GetHashCode(), 0, '<Integer,8><Filler Character,0>');
750
-
751
- exit(CopyStr(BaseSeriesCode + '-' + HashValue, 1, 20));
752
- end;
753
-
754
- local procedure SortDimensionKeys(var Keys: List of [Text])
755
- var
756
- i, j: Integer;
757
- temp: Text;
758
- begin
759
- // Simple bubble sort for demonstration
760
- for i := 1 to Keys.Count - 1 do begin
761
- for j := 1 to Keys.Count - i do begin
762
- if Keys.Get(j) > Keys.Get(j + 1) then begin
763
- temp := Keys.Get(j);
764
- Keys.Set(j, Keys.Get(j + 1));
765
- Keys.Set(j + 1, temp);
766
- end;
767
- end;
768
- end;
769
- end;
770
-
771
- local procedure LogCompoundNumberGeneration(BaseSeriesCode: Code[20]; CompoundCode: Code[20]; GeneratedNo: Code[20]; Dimensions: Dictionary of [Text, Text])
772
- var
773
- CompoundNoLog: Record "Compound No. Log";
774
- DimensionText: Text;
775
- DimensionKey: Text;
776
- DimensionValue: Text;
777
- begin
778
- // Build dimension text
779
- foreach DimensionKey in Dimensions.Keys do begin
780
- Dimensions.Get(DimensionKey, DimensionValue);
781
- if DimensionText <> '' then
782
- DimensionText += '; ';
783
- DimensionText += DimensionKey + '=' + DimensionValue;
784
- end;
785
-
786
- CompoundNoLog.Init();
787
- CompoundNoLog."Entry No." := GetNextCompoundLogEntryNo();
788
- CompoundNoLog."Base Series Code" := BaseSeriesCode;
789
- CompoundNoLog."Compound Series Code" := CompoundCode;
790
- CompoundNoLog."Generated No." := GeneratedNo;
791
- CompoundNoLog."Dimensions" := CopyStr(DimensionText, 1, 250);
792
- CompoundNoLog."Generation Date" := Today;
793
- CompoundNoLog."Generation Time" := Time;
794
- CompoundNoLog."User ID" := UserId;
795
- CompoundNoLog.Insert(true);
796
- end;
797
-
798
- local procedure GetNextCompoundLogEntryNo(): Integer
799
- var
800
- CompoundNoLog: Record "Compound No. Log";
801
- begin
802
- if CompoundNoLog.FindLast() then
803
- exit(CompoundNoLog."Entry No." + 1)
804
- else
805
- exit(1);
806
- end;
807
- }
808
- ```
809
-
810
- This comprehensive implementation provides robust number generation capabilities including basic number series management, concurrency control, batch allocation, and multi-dimensional numbering for complex Business Central scenarios.