query-template.cls 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /// Query定义模板
  2. /// 请根据实际业务需求修改以下内容:
  3. /// 1. Query名称:遵循{动词}{名词}格式
  4. /// 2. ROWSPEC:定义返回结果的列名和数据类型
  5. /// 3. 参数:使用p前缀
  6. /// 4. 必须实现Execute、Fetch、Close三个方法
  7. /// 5. 数据准备方式:选择SQL查询、对象查询或游标
  8. Class src.SamplePackage.SampleQuery Extends %RegisteredObject
  9. {
  10. /// 获取订单详细信息
  11. ///
  12. /// @param pOrderDr 订单ID
  13. /// @returns ROWSPEC: OrderNo:%String,OrderDate:%Date,Amount:%Numeric,Status:%String
  14. Query GetOrderDetail(pOrderDr As %String) As %Query(ROWSPEC = "OrderNo:%String,OrderDate:%Date,Amount:%Numeric,Status:%String")
  15. {
  16. }
  17. /// 执行Query
  18. ///
  19. /// @param qHandle Query句柄
  20. /// @param pOrderDr 订单ID
  21. /// @return 操作状态
  22. ClassMethod GetOrderDetailExecute(ByRef qHandle As %Binary, pOrderDr As %String) As %Status
  23. {
  24. Set tSC = $$$OK
  25. // 参数验证
  26. If (pOrderDr = "") {
  27. Quit $System.Status.Error(5001, "订单ID不能为空")
  28. }
  29. // 获取订单对象
  30. Set tOrder = ##class(User.BSOrderDetail).%OpenId(pOrderDr)
  31. If '$IsObject(tOrder) {
  32. Quit $System.Status.Error(5002, "订单不存在")
  33. }
  34. // 准备数据
  35. Set tData = ##class(%ArrayOfDataTypes).%New()
  36. Set tData.OrderNo = tOrder.OrderNo
  37. Set tData.OrderDate = tOrder.OrderDate
  38. Set tData.Amount = tOrder.Amount
  39. Set tData.Status = tOrder.Status
  40. // 关闭对象
  41. Do tOrder.%Close()
  42. // 设置句柄
  43. Set qHandle = tData
  44. Quit tSC
  45. }
  46. /// 获取下一行数据
  47. ///
  48. /// @param qHandle Query句柄
  49. /// @param Row 返回的数据行
  50. /// @param AtEnd 是否到达末尾
  51. /// @param pOrderDr 订单ID
  52. /// @return 操作状态
  53. ClassMethod GetOrderDetailFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer, pOrderDr As %String) As %Status
  54. {
  55. Set tSC = $$$OK
  56. Set AtEnd = 1 // 默认已结束
  57. Try {
  58. If $IsObject(qHandle) {
  59. // 构建返回行(注意:顺序必须与ROWSPEC一致)
  60. Set Row = $ListBuild(
  61. qHandle.OrderNo,
  62. qHandle.OrderDate,
  63. qHandle.Amount,
  64. qHandle.Status
  65. )
  66. Set AtEnd = 0 // 还有数据
  67. // 释放句柄
  68. Kill qHandle
  69. }
  70. } Catch {
  71. Set tSC = $System.Status.Error(5001, "Fetch数据失败: " _ $ze)
  72. }
  73. Quit tSC
  74. }
  75. /// 关闭Query
  76. ///
  77. /// @param qHandle Query句柄
  78. /// @param pOrderDr 订单ID
  79. /// @return 操作状态
  80. ClassMethod GetOrderDetailClose(ByRef qHandle As %Binary, pOrderDr As %String) As %Status
  81. {
  82. // 释放资源
  83. If $IsObject(qHandle) {
  84. Kill qHandle
  85. }
  86. Quit $$$OK
  87. }
  88. /// 获取用户列表(使用SQL查询)
  89. ///
  90. /// @param pOrganizationDr 机构ID
  91. /// @returns ROWSPEC: UserName:%String,UserCode:%String,Department:%String
  92. Query GetUserList(pOrganizationDr As %String) As %Query(ROWSPEC = "UserName:%String,UserCode:%String,Department:%String")
  93. {
  94. }
  95. /// 执行Query(SQL查询方式)
  96. ClassMethod GetUserListExecute(ByRef qHandle As %Binary, pOrganizationDr As %String) As %Status
  97. {
  98. Set tSC = $$$OK
  99. // 参数验证
  100. If (pOrganizationDr = "") {
  101. Quit $System.Status.Error(5001, "机构ID不能为空")
  102. }
  103. // 准备SQL
  104. Set tSQL = "SELECT u.Descripts, u.Code, d.Descripts FROM User.CBUser u "
  105. Set tSQL = tSQL _ " LEFT JOIN User.CBDepartment d ON u.DepartmentDr = d.Code "
  106. Set tSQL = tSQL _ " WHERE u.OrganizationDr = ? AND u.Deleted = 0"
  107. // 执行SQL
  108. Set tRS = ##class(%ResultSet).%New("%DynamicQuery:SQL")
  109. Set tSC = tRS.Prepare(tSQL)
  110. If $$$ISERR(tSC) Quit tSC
  111. Set tSC = tRS.Execute(pOrganizationDr)
  112. If $$$ISERR(tSC) {
  113. Kill tRS
  114. Quit tSC
  115. }
  116. // 设置句柄
  117. Set qHandle = tRS
  118. Quit tSC
  119. }
  120. /// 获取下一行数据(SQL查询方式)
  121. ClassMethod GetUserListFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer, pOrganizationDr As %String) As %Status
  122. {
  123. Set tSC = $$$OK
  124. Set AtEnd = 1
  125. Try {
  126. If $IsObject(qHandle) {
  127. If qHandle.Next() {
  128. Set tUserName = qHandle.GetData(1)
  129. Set tUserCode = qHandle.GetData(2)
  130. Set tDepartment = qHandle.GetData(3)
  131. // 构建返回行
  132. Set Row = $ListBuild(tUserName, tUserCode, tDepartment)
  133. Set AtEnd = 0
  134. } Else {
  135. // 关闭ResultSet
  136. Do qHandle.Close()
  137. Kill qHandle
  138. }
  139. }
  140. } Catch {
  141. Set tSC = $System.Status.Error(5001, "Fetch数据失败")
  142. }
  143. Quit tSC
  144. }
  145. /// 关闭Query(SQL查询方式)
  146. ClassMethod GetUserListClose(ByRef qHandle As %Binary, pOrganizationDr As %String) As %Status
  147. {
  148. If $IsObject(qHandle) {
  149. Do qHandle.Close()
  150. Kill qHandle
  151. }
  152. Quit $$$OK
  153. }
  154. /// 获取所有产品(使用游标方式)
  155. ///
  156. /// @param pCategoryDr 产品分类ID
  157. /// @returns ROWSPEC: ProductCode:%String,ProductName:%String,Price:%Numeric
  158. Query GetAllProducts(pCategoryDr As %String) As %Query(ROWSPEC = "ProductCode:%String,ProductName:%String,Price:%Numeric")
  159. {
  160. }
  161. /// 执行Query(游标方式)
  162. ClassMethod GetAllProductsExecute(ByRef qHandle As %Binary, pCategoryDr As %String) As %Status
  163. {
  164. Set tSC = $$$OK
  165. // 初始化游标数据
  166. Set qHandle("index") = 0
  167. Set qHandle("data") = ##class(%ArrayOfDataTypes).%New()
  168. // 执行SQL获取所有产品
  169. Set tRS = ##class(%ResultSet).%New("%DynamicQuery:SQL")
  170. Set tSQL = "SELECT Code, Descripts, Price FROM User.CBProduct WHERE CategoryDr = ? AND Deleted = 0"
  171. Do tRS.Prepare(tSQL)
  172. Do tRS.Execute(pCategoryDr)
  173. // 将数据存入数组
  174. Set tIndex = 0
  175. While tRS.Next() {
  176. Set tIndex = tIndex + 1
  177. Set tCode = tRS.GetData(1)
  178. Set tName = tRS.GetData(2)
  179. Set tPrice = tRS.GetData(3)
  180. Set qHandle("data", tIndex, "Code") = tCode
  181. Set qHandle("data", tIndex, "Name") = tName
  182. Set qHandle("data", tIndex, "Price") = tPrice
  183. }
  184. Do tRS.Close()
  185. // 保存数据条数
  186. Set qHandle("count") = tIndex
  187. Quit tSC
  188. }
  189. /// 获取下一行数据(游标方式)
  190. ClassMethod GetAllProductsFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer, pCategoryDr As %String) As %Status
  191. {
  192. Set tSC = $$$OK
  193. Set AtEnd = 1
  194. Try {
  195. If $Data(qHandle) {
  196. Set tIndex = qHandle("index") + 1
  197. If (tIndex <= qHandle("count")) {
  198. Set tCode = qHandle("data", tIndex, "Code")
  199. Set tName = qHandle("data", tIndex, "Name")
  200. Set tPrice = qHandle("data", tIndex, "Price")
  201. // 构建返回行
  202. Set Row = $ListBuild(tCode, tName, tPrice)
  203. Set AtEnd = 0
  204. // 更新索引
  205. Set qHandle("index") = tIndex
  206. } Else {
  207. // 数据已读完
  208. Kill qHandle
  209. }
  210. }
  211. } Catch {
  212. Set tSC = $System.Status.Error(5001, "Fetch数据失败")
  213. }
  214. Quit tSC
  215. }
  216. /// 关闭Query(游标方式)
  217. ClassMethod GetAllProductsClose(ByRef qHandle As %Binary, pCategoryDr As %String) As %Status
  218. {
  219. If $Data(qHandle) {
  220. Kill qHandle
  221. }
  222. Quit $$$OK
  223. }
  224. }