admin 管理员组

文章数量: 1086019


2023年12月17日发(作者:iview菜单)

1.建父子表看右边页面,新建属性

完成即可

打开自动生成的子表,编译一下,这样,子表自动生成.这就是生成的子表,及存储结构

特别注意{%%PARENT}("TPChild")这要说的是:IdLocation和IndexLocation可以做修改IdLocation修改为{%%PARENT}("TPChild")IndexLocation修改为{%%PARENT}("TPChild")

这样,插入数据可以看一下效果存储结构,跟上一次讲的一样IndexLocation,先按照这种方式建吧^("Person","TPChild")IndexLocation{%%PARENT}("TPChild")这种方式有点问题所有持久类,编译后,下边都可以看到对应table

这是sql查询效果注意子表数据插入TPSParref记录父表ID

看下边的列表TPSParref指向父表,注意,如果父表没有ID为1的记录,子表的数据是插入不进入的.即,子表是父表的下一级数据对照Global看一下.1:^("Person")=3对应父表的IdLocation2:^("Person",1)=$lb("","10","小李")对应父表的主Global对应DataLocation和DataNotes

$lb("","10","小李")这就是CacheStorage的存储结果SQLStorage存储结构为3:AA^BB^CC形式1^("Person",1,"TPChild")=对应子表的idlocation4:BBB")对应子表的DataLocation和DataNotes{%%PARENT}("TPChild")与^("Person",1,"TPChild",1)对照看下.{%%PARENT}即表示^("Person",*)^("Person",1,"TPChild",1)=$lb("","AAAA","B

这就是父子表的索引,也放在一起了.保持一个原则,父子表的Global最好用同一个Global13:^("Person","TPChild","IndexTPSCode","AAAA",1,1)=""^("Person","TPChild","IndexTPSCode","ID,子表ChildSub)=""^("Person","TPChild","IndexTPSCode","ref,childsub)=""对于子表来讲,childsub是自动产生的,不是插入的数据.对于主表来讲,ID是自动产生的,不是插入的数据.子表ID=TPSParref_"||"_childsub从这里也能看出来AAAA",父表AAAA",TPSPar

这种见表方式,就是为了跟原来Termianl下建的表保持统一定义了个属性对应的SqL中的顺序及字段名称BDActive是定义了枚举类型(Y/N)定义属性是,还定义了属性的附加属性.非空,长度等,SqlRowIdName=]BD_RowId,SqlTableName=DHC_MRC_BaseDictionary定义了RowID在SQL中名称,SQL中表名称.再说下Terminal下建的表,基本上dhc-app下都有对应的类

如Pa_打开类看一下.可以注意一下Storage的Type为SQLStorage上图中也有SQLStorage对应的存储结构.这种方式,会查看就行了,不要随便在项目正式库上打开这些持久类变异.

凡是不是以DHC打头的类,都不要随便动.Terminal下的类,基本上都在User包下存在.所以说,原来的持久类都存在User保持啊,业务类都存在web包下.我们组后来又自己建了DHCMed包,举个例子包下的类都是持久类ice下的类都是业务类其他类似我们组所有的程序,基本都是以DHCMed,DHCWMR,DHCCPW开头的.严格遵守W.**这是临床路径的程序DHCMed.*这是医政相关的程序**这是病案的程序老版本的医政程序,*csp基本也是以dhcmed,dhccpw,dhcwmr打头所有的csp,必须为小写字母

这也必须严格遵守还有一种表,简单说下ortInfPosOpr可以看下院感中的这个表Extends%Object这个表没有存储结构他也不能独立的存储数据注意这一行这就说明,InfPosOpr字段的值是以

ortInfPosOpr对象的方式存储就可以以对象的方式存取数据.1.2持久类的数据存取SQL下插入,删除数据.看下DataDisPlayMode的类型LogicalModel表示数据库内部格式数据库中日期,时间内部,注意一下,都是数字.DHC-APP>w62775$zdh("2012-11-14",3)

可以换ODBC方式插入数据也可以以后调试程序,sql查询,插入数据等,注意看错误提示.

保存数据出错,基本上是类型不对,或数据超长插入子表数据如下4,5是刚才插入的数据现在5下插入一条子表数据

删除deletefromupdate表set表where条件字段=值where条件记住,sql时刻要记住条件,否则很容易把整张表的数据都处理了,这后果比较严重时刻要记着where条件sql语法,自己上网上下载个教程自学吧.还有一点说一下这种sql查询,是cache特有的语法.

自己理解吧sql就说到这朱

1.3对象存取数据ClassMethodGetObjById(id{newset(id)return=""returnAs%String)quit:id=""quit:'##class().%ExistsId(+id)setobj=##Class().%OpenId(+id)return

setreturn=objdoobj.%Close()quitreturn}入参,返回值类型(对象)##class().%ExistsId(+id)检查对象是否存在setobj=##Class().%OpenId(+id)通过IdOpen一个对象即取id对应的一条数据doobj.%Close()Open的对象,用完一定要close掉close掉数据,对象还是存在的.setobj=##Class().%OpenId(+id)假如上边获取了一个对象esc即表示获取此条记录的valueDesc字段的值ClassMethodUpdate(InStrAs%String,separeteAs%StringAs%String)

{newifset}(InStr,separete)$g(separete)=""{separete=..#SEPARATEsetsetifset}elseset}setsetsetsetsetsetsetid=0ID=$p(InStr,separete,1)ID=""{obj=##class().%New(){obj=##class().%OpenId(ID)=$p(InStr,separete,2)ption=$p(InStr,separete,3)=$p(InStr,separete,4)esc=$p(InStr,separete,5)tDr=+$p(InStr,separete,6)alDr=+$p(InStr,separete,7)=$p(InStr,separete,8)

setifsc=obj.%Save()$r(sc){//检查Save是否成功dset$yError(sc)id=-1}else{set}doquit}setobj=##class().%New()obj.%Close()idid=obj.%Id()表示New一个对象,即插入一条记录的时候用到=$p(InStr,separete,2)给对象赋值setsc=obj.%Save()保存数据,可能是更新,可能是插入插入跟New对应,更新跟OpenId对应if$r(sc){

判断save是否报错d$yError(sc)表示有错误,输出错误setid=obj.%Id()获取ID的值如果更新或插入数据,一定在save完后closeClassMethodDeleteById(Id){new(Id)setsc=##class().%DeleteId(+Id)if$r(sc){删除是否成功d$yError(sc)setret=-1}else{setret=0}quitret}//检查

setsc=##class().%DeleteId(+Id)删除数据以上是最基本的增删改查SetSetIfSetParRef=$p(aInput,CHR1,1)ChildSub=$p(aInput,CHR1,2)(ChildSub=""){obj=##class(ortAnti).%New()}SetElse{obj=##class(ortAnti).%OpenId(ParRef_"||"_ChildSub)}Quit:'$IsObject(obj)=##class(ort).GetObjById(ParRef)=##class(ort).GetObjById(ParRef)这句话表示子表保存,保存在那条父表记录下.ort是ortAnti表父表.

其他都一样.r数据删除与保存问ortInfPosOpr题注意黑色标记部分ortInfPosOpr

他的数据删除与保存问题.通过SQL无法处理这种数据WhileDo}SetForSet(()>0){At(1)InfPosOprLB=""ind=1:1:$length(InfPosOprs,CHR2)InfPosOpr=$p(InfPosOprs,CHR2,ind){Continue:($listfind(InfPosOprLB,InfPosOpr)>0)SetSetInfPosOprLB=InfPosOprLB_$lb(InfPosOpr)objInfPosOpr=##class(ortInfPosOpr).GetObj(InfPosOpr,CHR3)Continue:'$IsObject(objInfPosOpr)Do}这句话()作用是取字段值数量(list中值的数量)At(1)(objInfPosOpr)移除第一位的数据.只有移除后,表save后才起作用,否则是不起作用的.

(objInfPosOpr)表示把数据存入InfPosOpr字段的List列表中最后SetIfsc=obj.%Save()$r(sc)DoSet}Set}Doobj.%Close()Else{{//检查Save是否成功$yError(sc)return=-1return=obj.%Id()最后save,close就可以了.医政可以看一下ortInfPosOpr类临床路径,可以看一下,ClinPathWaysEpStepItemysARCIM///w##Class(pStepItem).GetStepItemNum(ClinPathWa"1||1||1","1||1||1||3")

ClassMethodGetStepItemNum(argStepRowIDRowID{NewSetSet(argStepRowID,argItemRowID)num=0As%String)As%String,argItemrset=##class(%ResultSet).%New("pStepItem:GetPathEpStepItem")SetscWhile{If{SetSetnum=num+1ItemRowID=("StepItemRowid")($(sc))=e(argStepRowID,"")((.sc))Quit:ItemRowID=argItemRowID}Else{Quit}}If{Do$yError(sc)$r(sc)

}Quit}上边这个类方法,就是类方法中调用pStepItem:GetPathEpStepItem表示pStepItem类的GetPathEpStepItem这个QuerySetsc=e(argStepRowID,"")num执行Query,参数argStepRowID,""While{循环Query的记录SetItemRowID=("StepItemRowid")((.sc))取Query的值IfIf.($(sc))$r(sc)


本文标签: 数据 插入 子表 对象 注意