bc-code-intelligence-mcp 1.3.3 → 1.3.5

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 (552) 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/enhanced-prompt-service.d.ts +1 -12
  18. package/dist/services/enhanced-prompt-service.d.ts.map +1 -1
  19. package/dist/services/enhanced-prompt-service.js +27 -38
  20. package/dist/services/enhanced-prompt-service.js.map +1 -1
  21. package/dist/services/knowledge-service.d.ts +21 -10
  22. package/dist/services/knowledge-service.d.ts.map +1 -1
  23. package/dist/services/knowledge-service.js +71 -54
  24. package/dist/services/knowledge-service.js.map +1 -1
  25. package/dist/services/multi-content-layer-service.d.ts +90 -0
  26. package/dist/services/multi-content-layer-service.d.ts.map +1 -1
  27. package/dist/services/multi-content-layer-service.js +380 -0
  28. package/dist/services/multi-content-layer-service.js.map +1 -1
  29. package/dist/services/workflow-service.d.ts +11 -3
  30. package/dist/services/workflow-service.d.ts.map +1 -1
  31. package/dist/services/workflow-service.js +119 -78
  32. package/dist/services/workflow-service.js.map +1 -1
  33. package/dist/streamlined-handlers.d.ts +31 -2
  34. package/dist/streamlined-handlers.d.ts.map +1 -1
  35. package/dist/streamlined-handlers.js +151 -109
  36. package/dist/streamlined-handlers.js.map +1 -1
  37. package/dist/streamlined-tools.d.ts +12 -0
  38. package/dist/streamlined-tools.d.ts.map +1 -1
  39. package/dist/streamlined-tools.js +11 -6
  40. package/dist/streamlined-tools.js.map +1 -1
  41. package/package.json +13 -4
  42. package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +0 -24
  43. package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +0 -24
  44. package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +0 -30
  45. package/embedded-knowledge/AGENTS.md +0 -178
  46. package/embedded-knowledge/CONTRIBUTING.md +0 -58
  47. package/embedded-knowledge/LICENSE +0 -21
  48. package/embedded-knowledge/README.md +0 -32
  49. package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +0 -90
  50. package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +0 -113
  51. package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +0 -101
  52. package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +0 -87
  53. package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +0 -155
  54. package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +0 -138
  55. package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +0 -79
  56. package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +0 -280
  57. package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +0 -200
  58. package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +0 -565
  59. package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +0 -665
  60. package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +0 -325
  61. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +0 -696
  62. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +0 -320
  63. package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +0 -102
  64. package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +0 -433
  65. package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +0 -66
  66. package/embedded-knowledge/domains/alex-architect/systemid-integration.md +0 -115
  67. package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +0 -360
  68. package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +0 -86
  69. package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +0 -96
  70. package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +0 -70
  71. package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +0 -84
  72. package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +0 -93
  73. package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +0 -73
  74. package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +0 -78
  75. package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +0 -79
  76. package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +0 -87
  77. package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +0 -209
  78. package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +0 -246
  79. package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +0 -107
  80. package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +0 -105
  81. package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +0 -186
  82. package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +0 -60
  83. package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +0 -139
  84. package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +0 -190
  85. package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +0 -516
  86. package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +0 -298
  87. package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +0 -324
  88. package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +0 -344
  89. package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +0 -137
  90. package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +0 -340
  91. package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +0 -810
  92. package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +0 -86
  93. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +0 -110
  94. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +0 -758
  95. package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +0 -665
  96. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +0 -316
  97. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +0 -223
  98. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +0 -149
  99. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +0 -412
  100. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +0 -211
  101. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +0 -155
  102. package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +0 -475
  103. package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +0 -238
  104. package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +0 -97
  105. package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +0 -666
  106. package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +0 -319
  107. package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +0 -236
  108. package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +0 -59
  109. package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +0 -67
  110. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +0 -70
  111. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +0 -90
  112. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +0 -87
  113. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +0 -70
  114. package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +0 -74
  115. package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +0 -81
  116. package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +0 -56
  117. package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +0 -66
  118. package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +0 -79
  119. package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +0 -78
  120. package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +0 -83
  121. package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +0 -76
  122. package/embedded-knowledge/domains/dean-debug/testfield-performance.md +0 -104
  123. package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +0 -145
  124. package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +0 -104
  125. package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +0 -114
  126. package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +0 -356
  127. package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +0 -256
  128. package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +0 -101
  129. package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +0 -108
  130. package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +0 -80
  131. package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +0 -98
  132. package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +0 -123
  133. package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +0 -96
  134. package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +0 -115
  135. package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +0 -115
  136. package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +0 -114
  137. package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +0 -395
  138. package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +0 -479
  139. package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +0 -548
  140. package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +0 -287
  141. package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +0 -434
  142. package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +0 -508
  143. package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +0 -615
  144. package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +0 -144
  145. package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +0 -96
  146. package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +0 -124
  147. package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +0 -84
  148. package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +0 -75
  149. package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +0 -96
  150. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +0 -385
  151. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +0 -72
  152. package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +0 -48
  153. package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +0 -49
  154. package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +0 -67
  155. package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +0 -119
  156. package/embedded-knowledge/domains/quinn-tester/rule-execution.md +0 -123
  157. package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +0 -64
  158. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +0 -60
  159. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +0 -83
  160. package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +0 -716
  161. package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +0 -101
  162. package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +0 -91
  163. package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +0 -79
  164. package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +0 -79
  165. package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +0 -89
  166. package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +0 -76
  167. package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +0 -76
  168. package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +0 -76
  169. package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +0 -81
  170. package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +0 -76
  171. package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +0 -75
  172. package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +0 -76
  173. package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +0 -76
  174. package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +0 -76
  175. package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +0 -96
  176. package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +0 -76
  177. package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +0 -86
  178. package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +0 -90
  179. package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +0 -82
  180. package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +0 -78
  181. package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +0 -76
  182. package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +0 -78
  183. package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +0 -100
  184. package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +0 -115
  185. package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +0 -124
  186. package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +0 -110
  187. package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +0 -438
  188. package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +0 -255
  189. package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +0 -209
  190. package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +0 -218
  191. package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +0 -218
  192. package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +0 -280
  193. package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +0 -188
  194. package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +0 -245
  195. package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +0 -244
  196. package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +0 -278
  197. package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +0 -484
  198. package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +0 -64
  199. package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +0 -107
  200. package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +0 -280
  201. package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +0 -75
  202. package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +0 -67
  203. package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +0 -76
  204. package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +0 -98
  205. package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +0 -128
  206. package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +0 -75
  207. package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +0 -95
  208. package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +0 -141
  209. package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +0 -91
  210. package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +0 -118
  211. package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +0 -111
  212. package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +0 -113
  213. package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +0 -127
  214. package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +0 -141
  215. package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +0 -66
  216. package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +0 -96
  217. package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +0 -161
  218. package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +0 -177
  219. package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +0 -239
  220. package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +0 -346
  221. package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +0 -298
  222. package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +0 -677
  223. package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +0 -117
  224. package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +0 -75
  225. package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +0 -169
  226. package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +0 -399
  227. package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +0 -356
  228. package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +0 -889
  229. package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +0 -84
  230. package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +0 -127
  231. package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +0 -89
  232. package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +0 -516
  233. package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +0 -61
  234. package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +0 -427
  235. package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +0 -122
  236. package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +0 -96
  237. package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +0 -101
  238. package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +0 -149
  239. package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +0 -107
  240. package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +0 -95
  241. package/embedded-knowledge/domains/seth-security/api-permission-model.md +0 -115
  242. package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +0 -78
  243. package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +0 -373
  244. package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +0 -308
  245. package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +0 -146
  246. package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +0 -79
  247. package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +0 -78
  248. package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +0 -81
  249. package/embedded-knowledge/indexes/bc-version-matrix.json +0 -188
  250. package/embedded-knowledge/indexes/domain-catalog.json +0 -106
  251. package/embedded-knowledge/indexes/tags/abbreviations.json +0 -1
  252. package/embedded-knowledge/indexes/tags/abstraction.json +0 -1
  253. package/embedded-knowledge/indexes/tags/access-control.json +0 -1
  254. package/embedded-knowledge/indexes/tags/accessibility.json +0 -1
  255. package/embedded-knowledge/indexes/tags/actions.json +0 -1
  256. package/embedded-knowledge/indexes/tags/advanced-patterns.json +0 -1
  257. package/embedded-knowledge/indexes/tags/advanced.json +0 -1
  258. package/embedded-knowledge/indexes/tags/al-extension.json +0 -1
  259. package/embedded-knowledge/indexes/tags/al-generics.json +0 -1
  260. package/embedded-knowledge/indexes/tags/al-objects.json +0 -1
  261. package/embedded-knowledge/indexes/tags/al-syntax.json +0 -1
  262. package/embedded-knowledge/indexes/tags/algorithm-structure.json +0 -1
  263. package/embedded-knowledge/indexes/tags/alternatives.json +0 -1
  264. package/embedded-knowledge/indexes/tags/analytics.json +0 -1
  265. package/embedded-knowledge/indexes/tags/api-delegates.json +0 -1
  266. package/embedded-knowledge/indexes/tags/api-design.json +0 -1
  267. package/embedded-knowledge/indexes/tags/api-documentation.json +0 -1
  268. package/embedded-knowledge/indexes/tags/api-endpoints.json +0 -1
  269. package/embedded-knowledge/indexes/tags/api-extensibility.json +0 -1
  270. package/embedded-knowledge/indexes/tags/api-fieldsets.json +0 -1
  271. package/embedded-knowledge/indexes/tags/api-integration.json +0 -1
  272. package/embedded-knowledge/indexes/tags/api-interfaces.json +0 -1
  273. package/embedded-knowledge/indexes/tags/api-optimization.json +0 -1
  274. package/embedded-knowledge/indexes/tags/api-pages.json +0 -1
  275. package/embedded-knowledge/indexes/tags/api-patterns.json +0 -1
  276. package/embedded-knowledge/indexes/tags/api-permissions.json +0 -1
  277. package/embedded-knowledge/indexes/tags/api-responses.json +0 -1
  278. package/embedded-knowledge/indexes/tags/api-simplification.json +0 -1
  279. package/embedded-knowledge/indexes/tags/api.json +0 -1
  280. package/embedded-knowledge/indexes/tags/architecture.json +0 -1
  281. package/embedded-knowledge/indexes/tags/async-patterns.json +0 -1
  282. package/embedded-knowledge/indexes/tags/async-processing.json +0 -1
  283. package/embedded-knowledge/indexes/tags/automatic-registration.json +0 -1
  284. package/embedded-knowledge/indexes/tags/batch-operations.json +0 -1
  285. package/embedded-knowledge/indexes/tags/bc24-migration.json +0 -1
  286. package/embedded-knowledge/indexes/tags/begin-blocks.json +0 -1
  287. package/embedded-knowledge/indexes/tags/begin-end.json +0 -1
  288. package/embedded-knowledge/indexes/tags/behavioral-patterns.json +0 -1
  289. package/embedded-knowledge/indexes/tags/best-practices.json +0 -1
  290. package/embedded-knowledge/indexes/tags/binding.json +0 -1
  291. package/embedded-knowledge/indexes/tags/block-structure.json +0 -1
  292. package/embedded-knowledge/indexes/tags/blocks.json +0 -1
  293. package/embedded-knowledge/indexes/tags/boolean-expressions.json +0 -1
  294. package/embedded-knowledge/indexes/tags/branching.json +0 -1
  295. package/embedded-knowledge/indexes/tags/breaking-changes.json +0 -1
  296. package/embedded-knowledge/indexes/tags/breakpoints.json +0 -1
  297. package/embedded-knowledge/indexes/tags/business-foundation.json +0 -1
  298. package/embedded-knowledge/indexes/tags/business-infrastructure.json +0 -1
  299. package/embedded-knowledge/indexes/tags/business-process.json +0 -1
  300. package/embedded-knowledge/indexes/tags/business-rules.json +0 -1
  301. package/embedded-knowledge/indexes/tags/caching.json +0 -1
  302. package/embedded-knowledge/indexes/tags/case-statements.json +0 -1
  303. package/embedded-knowledge/indexes/tags/case.json +0 -1
  304. package/embedded-knowledge/indexes/tags/code-analysis.json +0 -1
  305. package/embedded-knowledge/indexes/tags/code-clarity.json +0 -1
  306. package/embedded-knowledge/indexes/tags/code-comprehension.json +0 -1
  307. package/embedded-knowledge/indexes/tags/code-conversion.json +0 -1
  308. package/embedded-knowledge/indexes/tags/code-formatting.json +0 -1
  309. package/embedded-knowledge/indexes/tags/code-organization.json +0 -1
  310. package/embedded-knowledge/indexes/tags/code-patterns.json +0 -1
  311. package/embedded-knowledge/indexes/tags/code-quality.json +0 -1
  312. package/embedded-knowledge/indexes/tags/code-reuse.json +0 -1
  313. package/embedded-knowledge/indexes/tags/code-simplification.json +0 -1
  314. package/embedded-knowledge/indexes/tags/code-standards.json +0 -1
  315. package/embedded-knowledge/indexes/tags/code-structure.json +0 -1
  316. package/embedded-knowledge/indexes/tags/code-style.json +0 -1
  317. package/embedded-knowledge/indexes/tags/codeunit-design.json +0 -1
  318. package/embedded-knowledge/indexes/tags/command-queue.json +0 -1
  319. package/embedded-knowledge/indexes/tags/comments.json +0 -1
  320. package/embedded-knowledge/indexes/tags/compile-time-validation.json +0 -1
  321. package/embedded-knowledge/indexes/tags/complex-facade.json +0 -1
  322. package/embedded-knowledge/indexes/tags/complexity-hiding.json +0 -1
  323. package/embedded-knowledge/indexes/tags/complexity-management.json +0 -1
  324. package/embedded-knowledge/indexes/tags/compound-statements.json +0 -1
  325. package/embedded-knowledge/indexes/tags/concurrency.json +0 -1
  326. package/embedded-knowledge/indexes/tags/conditional-logic.json +0 -1
  327. package/embedded-knowledge/indexes/tags/conditional.json +0 -1
  328. package/embedded-knowledge/indexes/tags/conflict-resolution.json +0 -1
  329. package/embedded-knowledge/indexes/tags/consistency.json +0 -1
  330. package/embedded-knowledge/indexes/tags/contract-design.json +0 -1
  331. package/embedded-knowledge/indexes/tags/control-flow.json +0 -1
  332. package/embedded-knowledge/indexes/tags/conversion-guide.json +0 -1
  333. package/embedded-knowledge/indexes/tags/correlation.json +0 -1
  334. package/embedded-knowledge/indexes/tags/custom-messages.json +0 -1
  335. package/embedded-knowledge/indexes/tags/data-access.json +0 -1
  336. package/embedded-knowledge/indexes/tags/data-exposure.json +0 -1
  337. package/embedded-knowledge/indexes/tags/data-integrity.json +0 -1
  338. package/embedded-knowledge/indexes/tags/data-loading.json +0 -1
  339. package/embedded-knowledge/indexes/tags/data-manipulation.json +0 -1
  340. package/embedded-knowledge/indexes/tags/data-modeling.json +0 -1
  341. package/embedded-knowledge/indexes/tags/data-patterns.json +0 -1
  342. package/embedded-knowledge/indexes/tags/data-protection.json +0 -1
  343. package/embedded-knowledge/indexes/tags/data-validation.json +0 -1
  344. package/embedded-knowledge/indexes/tags/database.json +0 -1
  345. package/embedded-knowledge/indexes/tags/debugging.json +0 -1
  346. package/embedded-knowledge/indexes/tags/decision-making.json +0 -1
  347. package/embedded-knowledge/indexes/tags/declaration.json +0 -1
  348. package/embedded-knowledge/indexes/tags/default-messages.json +0 -1
  349. package/embedded-knowledge/indexes/tags/defensive-programming.json +0 -1
  350. package/embedded-knowledge/indexes/tags/deleteall.json +0 -1
  351. package/embedded-knowledge/indexes/tags/dependencies.json +0 -1
  352. package/embedded-knowledge/indexes/tags/deployment.json +0 -1
  353. package/embedded-knowledge/indexes/tags/developer-productivity.json +0 -1
  354. package/embedded-knowledge/indexes/tags/development-workflow.json +0 -1
  355. package/embedded-knowledge/indexes/tags/diagnostics.json +0 -1
  356. package/embedded-knowledge/indexes/tags/dimensions.json +0 -1
  357. package/embedded-knowledge/indexes/tags/documentation.json +0 -1
  358. package/embedded-knowledge/indexes/tags/early-exit.json +0 -1
  359. package/embedded-knowledge/indexes/tags/else-clauses.json +0 -1
  360. package/embedded-knowledge/indexes/tags/end-statements.json +0 -1
  361. package/embedded-knowledge/indexes/tags/enterprise-patterns.json +0 -1
  362. package/embedded-knowledge/indexes/tags/entity-relationships.json +0 -1
  363. package/embedded-knowledge/indexes/tags/error-handling.json +0 -1
  364. package/embedded-knowledge/indexes/tags/error-messages.json +0 -1
  365. package/embedded-knowledge/indexes/tags/error-prevention.json +0 -1
  366. package/embedded-knowledge/indexes/tags/error-text.json +0 -1
  367. package/embedded-knowledge/indexes/tags/etag.json +0 -1
  368. package/embedded-knowledge/indexes/tags/event-bridge.json +0 -1
  369. package/embedded-knowledge/indexes/tags/event-payload.json +0 -1
  370. package/embedded-knowledge/indexes/tags/event-routing.json +0 -1
  371. package/embedded-knowledge/indexes/tags/events.json +0 -1
  372. package/embedded-knowledge/indexes/tags/execution-flow.json +0 -1
  373. package/embedded-knowledge/indexes/tags/expressions.json +0 -1
  374. package/embedded-knowledge/indexes/tags/extensibility.json +0 -1
  375. package/embedded-knowledge/indexes/tags/extensions.json +0 -1
  376. package/embedded-knowledge/indexes/tags/facade-composition.json +0 -1
  377. package/embedded-knowledge/indexes/tags/facade-pattern.json +0 -1
  378. package/embedded-knowledge/indexes/tags/field-control.json +0 -1
  379. package/embedded-knowledge/indexes/tags/field-exclusion.json +0 -1
  380. package/embedded-knowledge/indexes/tags/field-registration.json +0 -1
  381. package/embedded-knowledge/indexes/tags/field-state.json +0 -1
  382. package/embedded-knowledge/indexes/tags/field-validation.json +0 -1
  383. package/embedded-knowledge/indexes/tags/fielderror.json +0 -1
  384. package/embedded-knowledge/indexes/tags/fields.json +0 -1
  385. package/embedded-knowledge/indexes/tags/filtering.json +0 -1
  386. package/embedded-knowledge/indexes/tags/filters.json +0 -1
  387. package/embedded-knowledge/indexes/tags/formatting.json +0 -1
  388. package/embedded-knowledge/indexes/tags/generic-methods.json +0 -1
  389. package/embedded-knowledge/indexes/tags/http-status.json +0 -1
  390. package/embedded-knowledge/indexes/tags/if-statements.json +0 -1
  391. package/embedded-knowledge/indexes/tags/implementation.json +0 -1
  392. package/embedded-knowledge/indexes/tags/indentation.json +0 -1
  393. package/embedded-knowledge/indexes/tags/index-summary.json +0 -277
  394. package/embedded-knowledge/indexes/tags/indexing.json +0 -1
  395. package/embedded-knowledge/indexes/tags/inheritance.json +0 -1
  396. package/embedded-knowledge/indexes/tags/integration.json +0 -1
  397. package/embedded-knowledge/indexes/tags/integrity-checking.json +0 -1
  398. package/embedded-knowledge/indexes/tags/intellisense.json +0 -1
  399. package/embedded-knowledge/indexes/tags/interface-design.json +0 -1
  400. package/embedded-knowledge/indexes/tags/interface-segregation.json +0 -1
  401. package/embedded-knowledge/indexes/tags/isolation.json +0 -1
  402. package/embedded-knowledge/indexes/tags/job-processing.json +0 -1
  403. package/embedded-knowledge/indexes/tags/keyboard-navigation.json +0 -1
  404. package/embedded-knowledge/indexes/tags/keywords.json +0 -1
  405. package/embedded-knowledge/indexes/tags/legacy-modernization.json +0 -1
  406. package/embedded-knowledge/indexes/tags/line-breaks.json +0 -1
  407. package/embedded-knowledge/indexes/tags/line-organization.json +0 -1
  408. package/embedded-knowledge/indexes/tags/line-positioning.json +0 -1
  409. package/embedded-knowledge/indexes/tags/localization.json +0 -1
  410. package/embedded-knowledge/indexes/tags/logging.json +0 -1
  411. package/embedded-knowledge/indexes/tags/loose-coupling.json +0 -1
  412. package/embedded-knowledge/indexes/tags/maintainability.json +0 -1
  413. package/embedded-knowledge/indexes/tags/memory-management.json +0 -1
  414. package/embedded-knowledge/indexes/tags/memory-optimization.json +0 -1
  415. package/embedded-knowledge/indexes/tags/memory.json +0 -1
  416. package/embedded-knowledge/indexes/tags/message-design.json +0 -1
  417. package/embedded-knowledge/indexes/tags/message-formatting.json +0 -1
  418. package/embedded-knowledge/indexes/tags/message-patterns.json +0 -1
  419. package/embedded-knowledge/indexes/tags/metadata-driven.json +0 -1
  420. package/embedded-knowledge/indexes/tags/method-comparison.json +0 -1
  421. package/embedded-knowledge/indexes/tags/module-architecture.json +0 -1
  422. package/embedded-knowledge/indexes/tags/module-validation.json +0 -1
  423. package/embedded-knowledge/indexes/tags/monitoring.json +0 -1
  424. package/embedded-knowledge/indexes/tags/multi-layer-facade.json +0 -1
  425. package/embedded-knowledge/indexes/tags/multi-tenancy.json +0 -1
  426. package/embedded-knowledge/indexes/tags/multiple-values.json +0 -1
  427. package/embedded-knowledge/indexes/tags/naming-conventions.json +0 -1
  428. package/embedded-knowledge/indexes/tags/naming.json +0 -1
  429. package/embedded-knowledge/indexes/tags/navigation.json +0 -1
  430. package/embedded-knowledge/indexes/tags/nested-statements.json +0 -1
  431. package/embedded-knowledge/indexes/tags/no-series-conversion.json +0 -1
  432. package/embedded-knowledge/indexes/tags/no-series-validation.json +0 -1
  433. package/embedded-knowledge/indexes/tags/no-series.json +0 -1
  434. package/embedded-knowledge/indexes/tags/number-generation.json +0 -1
  435. package/embedded-knowledge/indexes/tags/object-documentation.json +0 -1
  436. package/embedded-knowledge/indexes/tags/odata.json +0 -1
  437. package/embedded-knowledge/indexes/tags/ondelete.json +0 -1
  438. package/embedded-knowledge/indexes/tags/onvalidate.json +0 -1
  439. package/embedded-knowledge/indexes/tags/operation-delegation.json +0 -1
  440. package/embedded-knowledge/indexes/tags/operation-safety.json +0 -1
  441. package/embedded-knowledge/indexes/tags/operators.json +0 -1
  442. package/embedded-knowledge/indexes/tags/optimization.json +0 -1
  443. package/embedded-knowledge/indexes/tags/order.json +0 -1
  444. package/embedded-knowledge/indexes/tags/organization.json +0 -1
  445. package/embedded-knowledge/indexes/tags/pages.json +0 -1
  446. package/embedded-knowledge/indexes/tags/parameters.json +0 -1
  447. package/embedded-knowledge/indexes/tags/patterns.json +0 -1
  448. package/embedded-knowledge/indexes/tags/performance-optimization.json +0 -1
  449. package/embedded-knowledge/indexes/tags/performance.json +0 -1
  450. package/embedded-knowledge/indexes/tags/placement.json +0 -1
  451. package/embedded-knowledge/indexes/tags/posting-codeunits.json +0 -1
  452. package/embedded-knowledge/indexes/tags/posting.json +0 -1
  453. package/embedded-knowledge/indexes/tags/preconditions.json +0 -1
  454. package/embedded-knowledge/indexes/tags/primary-key.json +0 -1
  455. package/embedded-knowledge/indexes/tags/privacy.json +0 -1
  456. package/embedded-knowledge/indexes/tags/process-automation.json +0 -1
  457. package/embedded-knowledge/indexes/tags/production.json +0 -1
  458. package/embedded-knowledge/indexes/tags/productivity.json +0 -1
  459. package/embedded-knowledge/indexes/tags/query-performance.json +0 -1
  460. package/embedded-knowledge/indexes/tags/queue-management.json +0 -1
  461. package/embedded-knowledge/indexes/tags/ranges.json +0 -1
  462. package/embedded-knowledge/indexes/tags/readability.json +0 -1
  463. package/embedded-knowledge/indexes/tags/record-access.json +0 -1
  464. package/embedded-knowledge/indexes/tags/record-methods.json +0 -1
  465. package/embedded-knowledge/indexes/tags/refactoring.json +0 -1
  466. package/embedded-knowledge/indexes/tags/reference.json +0 -1
  467. package/embedded-knowledge/indexes/tags/repeat-loops.json +0 -1
  468. package/embedded-knowledge/indexes/tags/repeat-statement.json +0 -1
  469. package/embedded-knowledge/indexes/tags/runtime-errors.json +0 -1
  470. package/embedded-knowledge/indexes/tags/runtime.json +0 -1
  471. package/embedded-knowledge/indexes/tags/safeguards.json +0 -1
  472. package/embedded-knowledge/indexes/tags/security.json +0 -1
  473. package/embedded-knowledge/indexes/tags/sequence-management.json +0 -1
  474. package/embedded-knowledge/indexes/tags/serialization.json +0 -1
  475. package/embedded-knowledge/indexes/tags/session-logmessage.json +0 -1
  476. package/embedded-knowledge/indexes/tags/session.json +0 -1
  477. package/embedded-knowledge/indexes/tags/setloadfields.json +0 -1
  478. package/embedded-knowledge/indexes/tags/shortcuts.json +0 -1
  479. package/embedded-knowledge/indexes/tags/sift.json +0 -1
  480. package/embedded-knowledge/indexes/tags/singleinstance.json +0 -1
  481. package/embedded-knowledge/indexes/tags/spacing.json +0 -1
  482. package/embedded-knowledge/indexes/tags/sql-translation.json +0 -1
  483. package/embedded-knowledge/indexes/tags/standards.json +0 -1
  484. package/embedded-knowledge/indexes/tags/statements.json +0 -1
  485. package/embedded-knowledge/indexes/tags/streaming.json +0 -1
  486. package/embedded-knowledge/indexes/tags/strong-typing.json +0 -1
  487. package/embedded-knowledge/indexes/tags/structural-patterns.json +0 -1
  488. package/embedded-knowledge/indexes/tags/structure.json +0 -1
  489. package/embedded-knowledge/indexes/tags/subscribers.json +0 -1
  490. package/embedded-knowledge/indexes/tags/switch.json +0 -1
  491. package/embedded-knowledge/indexes/tags/symbol-search.json +0 -1
  492. package/embedded-knowledge/indexes/tags/syntax.json +0 -1
  493. package/embedded-knowledge/indexes/tags/systemid.json +0 -1
  494. package/embedded-knowledge/indexes/tags/table-configuration.json +0 -1
  495. package/embedded-knowledge/indexes/tags/table-events.json +0 -1
  496. package/embedded-knowledge/indexes/tags/table-keys.json +0 -1
  497. package/embedded-knowledge/indexes/tags/table-safety.json +0 -1
  498. package/embedded-knowledge/indexes/tags/task-scheduler.json +0 -1
  499. package/embedded-knowledge/indexes/tags/telemetry.json +0 -1
  500. package/embedded-knowledge/indexes/tags/template-method.json +0 -1
  501. package/embedded-knowledge/indexes/tags/temporary-tables.json +0 -1
  502. package/embedded-knowledge/indexes/tags/testfield.json +0 -1
  503. package/embedded-knowledge/indexes/tags/tradeoffs.json +0 -1
  504. package/embedded-knowledge/indexes/tags/triggers.json +0 -1
  505. package/embedded-knowledge/indexes/tags/troubleshooting.json +0 -1
  506. package/embedded-knowledge/indexes/tags/type-safety.json +0 -1
  507. package/embedded-knowledge/indexes/tags/url-structure.json +0 -1
  508. package/embedded-knowledge/indexes/tags/user-experience.json +0 -1
  509. package/embedded-knowledge/indexes/tags/user-feedback.json +0 -1
  510. package/embedded-knowledge/indexes/tags/user-interface.json +0 -1
  511. package/embedded-knowledge/indexes/tags/validation-feedback.json +0 -1
  512. package/embedded-knowledge/indexes/tags/validation.json +0 -1
  513. package/embedded-knowledge/indexes/tags/variables.json +0 -1
  514. package/embedded-knowledge/indexes/tags/verbosity.json +0 -1
  515. package/embedded-knowledge/indexes/tags/vs-code.json +0 -1
  516. package/embedded-knowledge/indexes/tags/web-services.json +0 -1
  517. package/embedded-knowledge/indexes/tags/workflow-management.json +0 -1
  518. package/embedded-knowledge/indexes/tags/workflow-optimization.json +0 -1
  519. package/embedded-knowledge/indexes/tags/workflow-templates.json +0 -1
  520. package/embedded-knowledge/indexes/tags/workspace.json +0 -1
  521. package/embedded-knowledge/indexes/tags/xml-documentation.json +0 -1
  522. package/embedded-knowledge/indexes/topic-relationships.json +0 -128
  523. package/embedded-knowledge/methodologies/index.json +0 -81
  524. package/embedded-knowledge/methodologies/phases/analysis-full.md +0 -208
  525. package/embedded-knowledge/methodologies/phases/analysis-quick.md +0 -44
  526. package/embedded-knowledge/methodologies/phases/analysis.md +0 -182
  527. package/embedded-knowledge/methodologies/phases/execution-validation-full.md +0 -174
  528. package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +0 -31
  529. package/embedded-knowledge/methodologies/phases/execution-validation.md +0 -174
  530. package/embedded-knowledge/methodologies/phases/performance-full.md +0 -211
  531. package/embedded-knowledge/methodologies/phases/performance-quick.md +0 -32
  532. package/embedded-knowledge/methodologies/phases/performance.md +0 -211
  533. package/embedded-knowledge/methodologies/phases/verification-full.md +0 -162
  534. package/embedded-knowledge/methodologies/phases/verification-quick.md +0 -48
  535. package/embedded-knowledge/methodologies/phases/verification.md +0 -146
  536. package/embedded-knowledge/methodologies/workflow-enforcement.md +0 -142
  537. package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +0 -99
  538. package/embedded-knowledge/specialists/alex-architect.md +0 -216
  539. package/embedded-knowledge/specialists/casey-copilot.md +0 -226
  540. package/embedded-knowledge/specialists/chris-config.md +0 -267
  541. package/embedded-knowledge/specialists/dean-debug.md +0 -222
  542. package/embedded-knowledge/specialists/eva-errors.md +0 -235
  543. package/embedded-knowledge/specialists/jordan-bridge.md +0 -235
  544. package/embedded-knowledge/specialists/logan-legacy.md +0 -209
  545. package/embedded-knowledge/specialists/maya-mentor.md +0 -211
  546. package/embedded-knowledge/specialists/morgan-market.md +0 -226
  547. package/embedded-knowledge/specialists/quinn-tester.md +0 -235
  548. package/embedded-knowledge/specialists/roger-reviewer.md +0 -234
  549. package/embedded-knowledge/specialists/sam-coder.md +0 -359
  550. package/embedded-knowledge/specialists/seth-security.md +0 -235
  551. package/embedded-knowledge/specialists/taylor-docs.md +0 -257
  552. package/embedded-knowledge/specialists/uma-ux.md +0 -235
@@ -1,508 +0,0 @@
1
- # ETag Implementation for Optimistic Concurrency - AL Code Sample
2
-
3
- ## Basic ETag Implementation
4
-
5
- ```al
6
- page 50300 "Customer ETag API"
7
- {
8
- PageType = API;
9
- APIPublisher = 'contoso';
10
- APIGroup = 'customers';
11
- APIVersion = 'v1.0';
12
- EntityName = 'customer';
13
- EntitySetName = 'customers';
14
- SourceTable = Customer;
15
- DelayedInsert = true;
16
- ODataKeyFields = SystemId;
17
-
18
- layout
19
- {
20
- area(Content)
21
- {
22
- repeater(GroupName)
23
- {
24
- field(id; Rec.SystemId)
25
- {
26
- Caption = 'Id';
27
- Editable = false;
28
- }
29
- field(number; Rec."No.")
30
- {
31
- Caption = 'Number';
32
- }
33
- field(displayName; Rec.Name)
34
- {
35
- Caption = 'Display Name';
36
- }
37
- field(lastModifiedDateTime; Rec.SystemModifiedAt)
38
- {
39
- Caption = 'Last Modified Date Time';
40
- Editable = false;
41
- // Used for ETag generation
42
- }
43
- // ETag field for optimistic concurrency control
44
- field(etag; ETagValue)
45
- {
46
- Caption = 'ETag';
47
- Editable = false;
48
- }
49
- }
50
- }
51
- }
52
-
53
- var
54
- ETagValue: Text;
55
- OriginalETagValue: Text;
56
-
57
- trigger OnAfterGetRecord()
58
- begin
59
- // Generate ETag based on SystemModifiedAt
60
- ETagValue := GenerateETag(Rec.SystemModifiedAt, Rec.SystemId);
61
- end;
62
-
63
- trigger OnModifyRecord(): Boolean
64
- var
65
- CurrentRecord: Record Customer;
66
- CurrentETag: Text;
67
- begin
68
- // Validate ETag for optimistic concurrency
69
- if CurrentRecord.GetBySystemId(Rec.SystemId) then begin
70
- CurrentETag := GenerateETag(CurrentRecord.SystemModifiedAt, CurrentRecord.SystemId);
71
-
72
- // Check if record was modified by another user
73
- if CurrentETag <> OriginalETagValue then
74
- Error('The record has been modified by another user. Please refresh and try again.');
75
- end;
76
-
77
- exit(true);
78
- end;
79
-
80
- local procedure GenerateETag(ModifiedDateTime: DateTime; RecordSystemId: Guid): Text
81
- var
82
- TypeHelper: Codeunit "Type Helper";
83
- ETagSource: Text;
84
- begin
85
- // Combine timestamp and SystemId for unique ETag
86
- ETagSource := Format(ModifiedDateTime, 0, 9) + Format(RecordSystemId);
87
- exit(TypeHelper.GetMD5Hash(ETagSource));
88
- end;
89
- }
90
- ```
91
-
92
- ## Advanced ETag with Custom Versioning
93
-
94
- ```al
95
- // Custom versioning table for ETag management
96
- table 50300 "Record Version Control"
97
- {
98
- Caption = 'Record Version Control';
99
- DataClassification = SystemMetadata;
100
-
101
- fields
102
- {
103
- field(1; "Table ID"; Integer)
104
- {
105
- Caption = 'Table ID';
106
- }
107
- field(2; "Record SystemId"; Guid)
108
- {
109
- Caption = 'Record SystemId';
110
- }
111
- field(3; "Version Number"; Integer)
112
- {
113
- Caption = 'Version Number';
114
- InitValue = 1;
115
- }
116
- field(4; "Last Modified DateTime"; DateTime)
117
- {
118
- Caption = 'Last Modified DateTime';
119
- }
120
- field(5; "Modified By User"; Text[100])
121
- {
122
- Caption = 'Modified By User';
123
- }
124
- field(6; "ETag Value"; Text[100])
125
- {
126
- Caption = 'ETag Value';
127
- }
128
- }
129
-
130
- keys
131
- {
132
- key(PK; "Table ID", "Record SystemId")
133
- {
134
- Clustered = true;
135
- }
136
- key(ETag; "ETag Value")
137
- {
138
- // Index for fast ETag lookups
139
- }
140
- }
141
- }
142
-
143
- // ETag management codeunit
144
- codeunit 50300 "ETag Manager"
145
- {
146
- // Generate and store ETag for record
147
- procedure GenerateETag(TableID: Integer; RecordSystemId: Guid): Text
148
- var
149
- VersionControl: Record "Record Version Control";
150
- ETagValue: Text;
151
- VersionNumber: Integer;
152
- begin
153
- // Get or create version record
154
- if VersionControl.Get(TableID, RecordSystemId) then begin
155
- VersionNumber := VersionControl."Version Number" + 1;
156
- end else begin
157
- VersionControl.Init();
158
- VersionControl."Table ID" := TableID;
159
- VersionControl."Record SystemId" := RecordSystemId;
160
- VersionNumber := 1;
161
- end;
162
-
163
- // Generate ETag from version and timestamp
164
- ETagValue := StrSubstNo('%1-%2-%3',
165
- TableID,
166
- VersionNumber,
167
- Format(CurrentDateTime, 0, 9));
168
-
169
- // Update version control record
170
- VersionControl."Version Number" := VersionNumber;
171
- VersionControl."Last Modified DateTime" := CurrentDateTime;
172
- VersionControl."Modified By User" := UserId;
173
- VersionControl."ETag Value" := ETagValue;
174
-
175
- if VersionControl."Version Number" = 1 then
176
- VersionControl.Insert()
177
- else
178
- VersionControl.Modify();
179
-
180
- exit(ETagValue);
181
- end;
182
-
183
- // Validate ETag for concurrency control
184
- procedure ValidateETag(TableID: Integer; RecordSystemId: Guid; ProvidedETag: Text): Boolean
185
- var
186
- VersionControl: Record "Record Version Control";
187
- begin
188
- if not VersionControl.Get(TableID, RecordSystemId) then
189
- exit(false); // No version record exists
190
-
191
- exit(VersionControl."ETag Value" = ProvidedETag);
192
- end;
193
-
194
- // Get current ETag for record
195
- procedure GetCurrentETag(TableID: Integer; RecordSystemId: Guid): Text
196
- var
197
- VersionControl: Record "Record Version Control";
198
- begin
199
- if VersionControl.Get(TableID, RecordSystemId) then
200
- exit(VersionControl."ETag Value");
201
- exit('');
202
- end;
203
- }
204
-
205
- // API page with advanced ETag implementation
206
- page 50301 "Item Advanced ETag API"
207
- {
208
- PageType = API;
209
- APIPublisher = 'contoso';
210
- APIGroup = 'inventory';
211
- APIVersion = 'v1.0';
212
- EntityName = 'item';
213
- EntitySetName = 'items';
214
- SourceTable = Item;
215
- DelayedInsert = true;
216
- ODataKeyFields = SystemId;
217
-
218
- layout
219
- {
220
- area(Content)
221
- {
222
- repeater(GroupName)
223
- {
224
- field(id; Rec.SystemId)
225
- {
226
- Caption = 'Id';
227
- Editable = false;
228
- }
229
- field(number; Rec."No.")
230
- {
231
- Caption = 'Number';
232
- }
233
- field(displayName; Rec.Description)
234
- {
235
- Caption = 'Display Name';
236
- }
237
- field(unitPrice; Rec."Unit Price")
238
- {
239
- Caption = 'Unit Price';
240
- }
241
- field(inventory; Rec.Inventory)
242
- {
243
- Caption = 'Inventory';
244
- Editable = false;
245
- }
246
- field(etag; ETagValue)
247
- {
248
- Caption = 'ETag';
249
- Editable = false;
250
- }
251
- field(version; VersionNumber)
252
- {
253
- Caption = 'Version';
254
- Editable = false;
255
- }
256
- }
257
- }
258
- }
259
-
260
- var
261
- ETagValue: Text;
262
- VersionNumber: Integer;
263
- ETagManager: Codeunit "ETag Manager";
264
- ProvidedETag: Text;
265
-
266
- trigger OnAfterGetRecord()
267
- var
268
- VersionControl: Record "Record Version Control";
269
- begin
270
- // Get current ETag and version
271
- ETagValue := ETagManager.GetCurrentETag(Database::Item, Rec.SystemId);
272
-
273
- if VersionControl.Get(Database::Item, Rec.SystemId) then
274
- VersionNumber := VersionControl."Version Number"
275
- else
276
- VersionNumber := 0;
277
-
278
- // Generate ETag if not exists
279
- if ETagValue = '' then
280
- ETagValue := ETagManager.GenerateETag(Database::Item, Rec.SystemId);
281
- end;
282
-
283
- trigger OnInsertRecord(BelowxRec: Boolean): Boolean
284
- begin
285
- // Generate initial ETag for new record
286
- ETagValue := ETagManager.GenerateETag(Database::Item, Rec.SystemId);
287
- exit(true);
288
- end;
289
-
290
- trigger OnModifyRecord(): Boolean
291
- begin
292
- // Validate provided ETag before modification
293
- if ProvidedETag <> '' then begin
294
- if not ETagManager.ValidateETag(Database::Item, Rec.SystemId, ProvidedETag) then
295
- Error('Concurrency conflict detected. The record has been modified by another user. ETag: %1', ProvidedETag);
296
- end;
297
-
298
- // Generate new ETag after successful modification
299
- ETagValue := ETagManager.GenerateETag(Database::Item, Rec.SystemId);
300
- exit(true);
301
- end;
302
-
303
- trigger OnDeleteRecord(): Boolean
304
- var
305
- VersionControl: Record "Record Version Control";
306
- begin
307
- // Validate ETag before deletion
308
- if ProvidedETag <> '' then begin
309
- if not ETagManager.ValidateETag(Database::Item, Rec.SystemId, ProvidedETag) then
310
- Error('Concurrency conflict detected. Cannot delete record that has been modified.');
311
- end;
312
-
313
- // Clean up version control record
314
- if VersionControl.Get(Database::Item, Rec.SystemId) then
315
- VersionControl.Delete();
316
-
317
- exit(true);
318
- end;
319
- }
320
- ```
321
-
322
- ## HTTP Header ETag Processing
323
-
324
- ```al
325
- // Codeunit for processing ETag HTTP headers
326
- codeunit 50301 "HTTP ETag Processor"
327
- {
328
- // Extract ETag from If-Match header
329
- procedure ExtractETagFromHeader(HttpHeaders: Dictionary of [Text, Text]): Text
330
- var
331
- ETagHeader: Text;
332
- ETagValue: Text;
333
- begin
334
- // Check If-Match header for ETag value
335
- if HttpHeaders.Get('If-Match', ETagHeader) then begin
336
- // Remove quotes from ETag value
337
- ETagValue := ETagHeader.Replace('"', '');
338
- exit(ETagValue);
339
- end;
340
-
341
- // Check If-None-Match header
342
- if HttpHeaders.Get('If-None-Match', ETagHeader) then begin
343
- ETagValue := ETagHeader.Replace('"', '');
344
- exit(ETagValue);
345
- end;
346
-
347
- exit('');
348
- end;
349
-
350
- // Set ETag in response headers
351
- procedure SetETagResponseHeader(var HttpHeaders: Dictionary of [Text, Text]; ETagValue: Text)
352
- begin
353
- if ETagValue <> '' then
354
- HttpHeaders.Set('ETag', '"' + ETagValue + '"');
355
- end;
356
-
357
- // Process conditional request based on ETag
358
- procedure ProcessConditionalRequest(ProvidedETag: Text; CurrentETag: Text; RequestMethod: Text): Boolean
359
- begin
360
- case RequestMethod of
361
- 'GET':
362
- // If-None-Match: return 304 if ETags match
363
- exit(ProvidedETag <> CurrentETag);
364
- 'PUT', 'PATCH', 'DELETE':
365
- // If-Match: proceed only if ETags match
366
- exit(ProvidedETag = CurrentETag);
367
- else
368
- exit(true);
369
- end;
370
- end;
371
- }
372
-
373
- // API page with HTTP ETag header processing
374
- page 50302 "Sales Order ETag API"
375
- {
376
- PageType = API;
377
- APIPublisher = 'contoso';
378
- APIGroup = 'sales';
379
- APIVersion = 'v1.0';
380
- EntityName = 'salesOrder';
381
- EntitySetName = 'salesOrders';
382
- SourceTable = "Sales Header";
383
- DelayedInsert = true;
384
- ODataKeyFields = SystemId;
385
- SourceTableView = WHERE("Document Type" = CONST(Order));
386
-
387
- layout
388
- {
389
- area(Content)
390
- {
391
- repeater(GroupName)
392
- {
393
- field(id; Rec.SystemId)
394
- {
395
- Caption = 'Id';
396
- Editable = false;
397
- }
398
- field(number; Rec."No.")
399
- {
400
- Caption = 'Number';
401
- }
402
- field(customerNumber; Rec."Sell-to Customer No.")
403
- {
404
- Caption = 'Customer Number';
405
- }
406
- field(orderDate; Rec."Order Date")
407
- {
408
- Caption = 'Order Date';
409
- }
410
- field(totalAmount; TotalAmount)
411
- {
412
- Caption = 'Total Amount';
413
- Editable = false;
414
- }
415
- field(etag; ETagValue)
416
- {
417
- Caption = 'ETag';
418
- Editable = false;
419
- }
420
- }
421
- }
422
- }
423
-
424
- var
425
- ETagValue: Text;
426
- TotalAmount: Decimal;
427
- ETagManager: Codeunit "ETag Manager";
428
- HttpETagProcessor: Codeunit "HTTP ETag Processor";
429
- RequestETag: Text;
430
-
431
- trigger OnAfterGetRecord()
432
- begin
433
- // Calculate totals
434
- Rec.CalcFields("Amount Including VAT");
435
- TotalAmount := Rec."Amount Including VAT";
436
-
437
- // Generate ETag based on header and line modifications
438
- ETagValue := GenerateOrderETag();
439
- end;
440
-
441
- trigger OnModifyRecord(): Boolean
442
- var
443
- CurrentETag: Text;
444
- begin
445
- // Get current ETag for comparison
446
- CurrentETag := GenerateOrderETag();
447
-
448
- // Validate provided ETag matches current state
449
- if (RequestETag <> '') and (RequestETag <> CurrentETag) then
450
- Error('Concurrency conflict: Order has been modified by another user. Current ETag: %1, Provided ETag: %2', CurrentETag, RequestETag);
451
-
452
- exit(true);
453
- end;
454
-
455
- local procedure GenerateOrderETag(): Text
456
- var
457
- SalesLine: Record "Sales Line";
458
- ETagSource: Text;
459
- TypeHelper: Codeunit "Type Helper";
460
- LineModificationTime: DateTime;
461
- begin
462
- // Build ETag from header and all related lines
463
- ETagSource := Format(Rec.SystemModifiedAt, 0, 9);
464
-
465
- // Include line modifications in ETag
466
- SalesLine.SetRange("Document Type", Rec."Document Type");
467
- SalesLine.SetRange("Document No.", Rec."No.");
468
- if SalesLine.FindLast() then
469
- LineModificationTime := SalesLine.SystemModifiedAt
470
- else
471
- LineModificationTime := Rec.SystemModifiedAt;
472
-
473
- ETagSource += Format(LineModificationTime, 0, 9);
474
- ETagSource += Format(Rec.SystemId);
475
-
476
- // Generate hash-based ETag
477
- exit(TypeHelper.GetMD5Hash(ETagSource));
478
- end;
479
- }
480
- ```
481
-
482
- ## Implementation Notes
483
-
484
- **ETag Implementation Best Practices:**
485
-
486
- 1. **ETag Generation Strategies:**
487
- - Use SystemModifiedAt for simple timestamp-based ETags
488
- - Combine multiple factors (timestamp + SystemId + version) for robust ETags
489
- - Include related record modifications for composite entities
490
- - Use consistent hashing algorithms (MD5, SHA-256) for ETag values
491
-
492
- 2. **Concurrency Control:**
493
- - Validate ETags on all modification operations (PUT, PATCH, DELETE)
494
- - Return appropriate HTTP status codes (409 Conflict, 412 Precondition Failed)
495
- - Implement version tracking for detailed conflict resolution
496
- - Provide clear error messages for concurrency conflicts
497
-
498
- 3. **Performance Optimization:**
499
- - Index ETag fields for fast lookups
500
- - Cache ETag values to avoid recalculation
501
- - Use efficient ETag generation algorithms
502
- - Minimize database queries during ETag validation
503
-
504
- 4. **HTTP Integration:**
505
- - Process If-Match and If-None-Match headers correctly
506
- - Set ETag response headers for all API responses
507
- - Support conditional requests (304 Not Modified responses)
508
- - Handle weak vs strong ETag semantics appropriately