傻瓜式一键生成主子表
直接将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使用混乱。
以上是个人对数据生成实体类的一些理解,由于个人能力有限,欢迎大家提出意见,共同交流。


















