分享一个M把Query处理为JSON数组对象发方法。在有些时候需要把一个Query的输出数据和别的方法一起以JSON返回。
利用了x命令把字符串当M执行。
/// 调用Query得到JSON数组对象
/// ClassName:类名
/// FuncName:Query名字
/// w ##Class(LIS.WS.DHCLISServiceBase).GetQueryJsonArr()
ClassMethod GetQueryJsonArr(ClassName, FuncName, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions)
{
s ClassName=$g(ClassName)
s FuncName=$g(FuncName)
s P0=$g(P0),P1=$g(P1),P2=$g(P2),P3=$g(P3),P4=$g(P4),P5=$g(P5),P6=$g(P6),P7=$g(P7),P8=$g(P8),P9=$g(P9),P10=$g(P10),P11=$g(P11),P12=$g(P12),P13=$g(P13),Sessions=$g(Sessions)
s rsetNew=##class(%XML.DataSet).%New()
s rsetNew.ClassName = ClassName
s rsetNew.QueryName = FuncName
s rsetNew.NeedSchema=1
s rsetNew.DiffGram=0
s sc=rsetNew.Execute(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions)
s colCount=rsetNew.GetColumnCount()
set retArr=[]
While (rsetNew.Next())
{
s OneRow =##class(%DynamicObject).%New()
f i=1:1:colCount
{
s colName=rsetNew.GetColumnName(i)
s colValue=rsetNew.GetDataByName(colName)
s CodeStr="(OneRow,colValue) s OneRow."_colName_"=colValue"
x (CodeStr,.OneRow,colValue)
}
d retArr.%Push(OneRow)
}
q retArr
}
使用场景类似下面
/// 得到选择工作小组的配置
/// w ##Class(IDP.WS.BLL.DHCIDPResult).GetWGMConfigJSONStream(50)
ClassMethod GetWGMConfigJSONStream(WGMDR, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
s WGMDR=$g(WGMDR)
s Sessions=$g(Sessions)
s UserDR=$p(Sessions,"^",1)
s WorkGroupDR=$p(Sessions,"^",2)
s GroupDR=$p(Sessions,"^",4)
set mianObj =##class(%DynamicObject).%New()
//医嘱组查询分组数据
s mianObj.TestSetGroup=[]
//组装医嘱组查询分组数据
s OneGroup =##class(%DynamicObject).%New()
s OneGroup.RowID=""
s OneGroup.Code="All"
s OneGroup.CName="全部医嘱"
d mianObj.TestSetGroup.%Push(OneGroup)
i $d(^dbo.BTWorkGroupMachineRuleI("IndexMaster",WGMDR)) d
.d mianObj.TestSetGroup.%Push(OneGroup)
.s Code="" f s Code=$o(^dbo.BTWorkGroupMachineRuleI("IndexMaster",WGMDR,Code)) Q:Code="" D
..s TestSetQueryGroupDR=$o(^dbo.BTWorkGroupMachineRuleI("IndexMaster",WGMDR,Code,""))
..S RowID=TestSetQueryGroupDR
..S SCode=$lg($g(^dbo.BTWorkGroupMachineRuleD(RowID)),2)
..S CName=$lg($g(^dbo.BTWorkGroupMachineRuleD(RowID)),3)
..s IsShow=$lg($g(^dbo.BTWorkGroupMachineRuleD(RowID)),5)
..i IsShow'=1 q
..s OneGroup =##class(%DynamicObject).%New()
..s OneGroup.RowID=RowID
..s OneGroup.Code=SCode
..s OneGroup.CName=CName
..d mianObj.TestSetGroup.%Push(OneGroup)
//得到系统参数
s mianObj.SYSParameters=##Class(LIS.WS.DHCLISServiceBase).GetQueryJsonArr("LIS.WS.BLL.DHCSysParameter","QrySYSParameters",WGMDR,"LABSaveResultNextRow^LABEntryResultNextRow^LABAuditResultNextRow^LABShowConclusion^LabShowMoreInfo^WGReportUndoStatus^LABAuditResultDeleteRow^LABReportImageWeb^LABReportImageFTP^LABIsNeedAuthPasswd^IsCheckEntryUserPassword^IsCheckAuthUserPassword^RepLargeImage^MICUseLisSen^WGMRedoFlag^RedoFlagAuth^MICEntryDrect^MICBicMemo^LabInfoShowModel^AuthDoSave^MICUseLisSensitivity^MICDefResLoad^MCProcessChildModel^FastQryDemoType^SortRule^RegNoAddLength^EntryAllowEdit^SenAddMicRes^SenShowETest^AuthEffectTime","MICDefDrugRule")
//得到颜色配置参数
s mianObj.ColorParameters=##Class(LIS.WS.DHCLISServiceBase).GetQueryJsonArr("LIS.WS.BLL.DHCColorParameter","QryColorParameters",WGMDR,"ResLowColor^ResHighColor^PanicLowColor^PanicHighColor^UnacceptLowColor^UnacceptHighColor^RegReportColor^EnthReportColor^AuthReportColor^IsPrintedReportColor^NoPrintedReportColor^RepeatReportColor^CancelReportColor^ResultAbnormalColor^ResultNormalColor^SensitiveColor^ResistanceColor^IntermediaryColor","")
//返回JSON
q mianObj.%ToJSON()
}
以前研究重点在C#、js、html那些。8.3之前只学M基础操作,供写业务,那时候还天天吐槽M容易死循环、编辑器难以一堆。8.3才开始学M的tcp,研究检验盒子仪器。8.4才陆续深入M,对进程,死循环,事务,M导入导入,x命令,流,webservice,xml,json,odbc,锁ecp,索引,映射等研究。8.4之后再也不怕踩坑死循环和锁表了,现在我已经是cache库的忠实粉丝了。爱就让他变的更美好,多一点分享-让生态更完美。