傻瓜式一键生成主子表
直接将xml
导入到Studio
里即可。下载文件连接:
CSDN
链接- 阿里云盘
简介
- 很多同学在创建主子表时,都会可能遇到如下一些问题
- 例如编译不过去,
- 创建得子表
ID
每次不重新自增。 - 编译关系时逻辑搞不清,编译不通过。
- 主子表数据
Global
,索引Global
使用混乱。
下面介绍如何一键生成标准的主子表。再也不用为创建主子表而烦恼。
创建主子表
ClassMethod CreateMainSub(mainClassName As %String, mainColumns As %List = "", subClassName As %String, subColumns As %List = "") As %Status
其中:
mainClassName
- 主表类名称。mainColumns
- 主表列名类型为%List
。- 参数示例:
$lb($lb("propName", "propType"), $lb("propName", "%propType"))
- 其中
propName
- 为属性名称,propType
- 为属性类型
- 参数示例:
subClassName
- 子表类名称subColumns
- 主表列名类型为%List
- 参数示例:
$lb($lb("propName", "propType"), $lb("propName", "%propType"))
- 其中
propName
- 为属性名称,propType
- 为属性类型
- 参数示例:
示例
- 首先确定数据库中是否有需要创建的主子表类。这里创建
User.Main
与User.Sub
主子表。
- 运行
CreateMainSub
方法。- 创建主表
User.Main
主表增加列name
类型为%String
,列age
类型为%Integer
。 - 创建主表
User.Sub
主表增加列desc
类型为%String
,列date
类型为%Date
。
- 创建主表
USER>w ##class(Util.GenerateClassUtils).CreateMainSub("User.Main", $lb($lb("name", "%String"), $lb("age", "%Integer")), "User.Sub", $lb($lb("desc", "%String"), $lb("date", "%Date")))
在2023-07-09 13:04:50上启动了编译
,正在编辑2类
编译类 User.Main
编译类 User.Sub
正在编译表 SQLUser.Main
正在编译表 SQLUser.Sub
正在编译routine User.Main.1
正在编译routine User.Sub.1
0.174s中已成功完成编译.
在2023-07-09 13:04:50上启动了编译
编译类 User.Sub
正在编译表 SQLUser.Sub
正在编译routine User.Sub.1
0.118s中已成功完成编译.
在2023-07-09 13:04:50上启动了编译
,正在编辑2类
编译类 User.Main
编译类 User.Sub
正在编译表 SQLUser.Main
正在编译表 SQLUser.Sub
正在编译routine User.Main.1
正在编译routine User.Sub.1
0.217s中已成功完成编译.
1
-
创建后可以查看
Studio
,主子表已经创建完成。查看主表
User.Main
如下图:- 标识
1
处:主表User.Main
自动添加Relationship
关系属性Relationship sub As User.Sub [ Cardinality = children, Inverse = main ];
- 标识
2
处:Global
名称为^User.MainD
,^User.MainI
,^User.MainS
。
- 标识
查看子表User.Sub
如下图:
- 标识
1
处:子表User.Sub
自动添加Relationship
关系属性Relationship main As User.Main [ Cardinality = parent, Inverse = sub ];
- 标识
2
处:DataLocation
与IdLocation
与主表Global
保持一致,且增加I
节点,这样做的目的是每次子表每次插入的数据ID
是重新自增的。 - 标识
3
,4
处:与主表索引Global
流Global
保持一致。
- 插入主子数据验证表创建是否正确。
ClassMethod SaveMainSub()
{
ts
s main = ##class(User.Main).%New()
s main.name = "yx"
s main.age = "18"
s sc = main.%Save()
q:($$$ISERR(sc)) $system.Status.GetErrorText(sc)
s id = main.%Id()
s sub = ##class(User.Sub).%New()
s sub.desc = "苹果"
s sub.date = +$h
d sub.mainSetObjectId(id)
s sc = sub.%Save()
q:($$$ISERR(sc)) $system.Status.GetErrorText(sc)
s sc = main.sub.Insert(sub)
q:($$$ISERR(sc)) $system.Status.GetErrorText(sc)
s sub = ##class(User.Sub).%New()
s sub.desc = "华为"
s sub.date = +$h
s sub.main = main
s sc = sub.%Save()
q:($$$ISERR(sc)) $system.Status.GetErrorText(sc)
s sc = main.sub.Insert(sub)
q:($$$ISERR(sc)) $system.Status.GetErrorText(sc)
tc
q sc
}
USER> w ##class(Util.GenerateClassUtils).SaveMainSub()
1
USER> w ##class(Util.GenerateClassUtils).SaveMainSub()
1
gif
动图示例
根据已有主表创建子表
ClassMethod CreateSub(mainClassName As %String, subClassName As %String, subColumns As %List = "") As %Status
其中:
mainClassName
- 主表类名称。subClassName
- 子表类名称。subColumns
- 子表列名类型为%List
。- 参数示例:
$lb($lb("propName", "propType"), $lb("propName", "%propType"))
- 其中
propName
- 为属性名称,propType
- 为属性类型
- 参数示例:
示例
- 为已经存在的
User.Book
表创建子表。
- 运行
CreateSub
方法。
USER>w ##class(Util.GenerateClassUtils).CreateSub("User.Book", "User.Sub", $lb($lb("desc", "%String"), $lb("date", "%Date")))
在2023-07-09 13:22:12上启动了编译
,正在编辑2类
编译类 User.Book
编译类 User.Sub
正在编译表 SQLUser.Book
正在编译表 SQLUser.Sub
正在编译routine User.Book.1
正在编译routine User.Sub.1
0.195s中已成功完成编译.
在2023-07-09 13:22:12上启动了编译
编译类 User.Sub
正在编译表 SQLUser.Sub
正在编译routine User.Sub.1
0.098s中已成功完成编译.
在2023-07-09 13:22:12上启动了编译
,正在编辑2类
编译类 User.Book
编译类 User.Sub
正在编译表 SQLUser.Book
正在编译表 SQLUser.Sub
正在编译routine User.Book.1
正在编译routine User.Sub.1
0.180s中已成功完成编译.
1
- 会为已经存在的主表自动添加关系属性与子表。
gif
示例
创建空属性主子表
ClassMethod CreateMainSubNoneProp(mainClassName As %String, subClassName As %String) As %Status
其中:
mainClassName
- 主表类名称。subClassName
- 子表类名称。
示例
- 快捷创建主子表,不设置属性,创建主子表后,由开发人员自由定夺添加属性。
总结
- 通过使用傻瓜方式创建主子表,可以方便开发避免之前在开头所描述的一些问题:
- 例如编译不过去,
- 创建得子表
ID
每次不重新自增。 - 编译关系时逻辑搞不清,编译不通过。
- 主子表数据
Global
,索引Global
使用混乱。
以上是个人对数据生成实体类的一些理解,由于个人能力有限,欢迎大家提出意见,共同交流。