如何用 TCL 关联两个 .MST 文件并显示 CLASS.NAME
结论
UniVerse 的 LIST 命令每次只能查询一个主文件,无法直接使用 SQL 式的 INNER JOIN。可以在 STUDENT.MST 的字典中创建 I-descriptor,用 TRANS() 根据 CLASS 中的班级编号查询 CLASS.MST,并显示对应的 CLASS.NAME。
创建字典项后,可执行:
LIST STUDENT.MST CLASS.NAME WITH AGE GT 21
前提条件
使用这种关联方式前,需要确认:
STUDENT.MST的CLASS字段保存的是班级编号。- 班级编号与
CLASS.MST的记录 ID 完全一致。 CLASS.MST的字典中已有CLASS.NAME。- 如果一名学生可以选择多个班级,
CLASS需要按多值字段处理。
例如,学生记录的 CLASS 中有:
CLASS001
CLASS003
CLASS.MST 中就需要有 ID 分别为 CLASS001 和 CLASS003 的记录。
创建关联字典项
在 STUDENT.MST 的字典中创建 CLASS.NAME:
ED DICT STUDENT.MST CLASS.NAME
不同环境可能使用不同的编辑器。系统使用 AE 时,也可以执行:
AE DICT STUDENT.MST CLASS.NAME
I-descriptor 可以按以下形式设置:
001: I
002: TRANS("CLASS.MST", CLASS, "CLASS.NAME", "X")
003:
004: CLASS.NAME
005: 30L
006: M
其中:
- 第 1 行的
I表示计算型字典项。 - 第 2 行调用
TRANS(),将CLASS的值作为CLASS.MST的记录 ID,并读取对应的CLASS.NAME。 - 第 4 行指定输出列标题。
- 第 5 行设置显示宽度和左对齐格式。
- 第 6 行的
M表示多值字段。如果每名学生只有一个班级,可按照实际字典结构改为S。
"X" 通常表示找不到对应记录时返回空值。控制码的具体行为可能因 UniVerse 版本或兼容模式而略有不同,必要时可查阅当前环境的 TRANS 函数文档。
执行查询
保存字典项后执行:
LIST STUDENT.MST CLASS.NAME WITH AGE GT 21
如果需要同时显示班级编号,可以使用:
LIST STUDENT.MST CLASS CLASS.NAME WITH AGE GT 21
UniVerse 默认显示记录 ID,通常无须另外指定学生代码字段。如果学生代码是普通属性而非记录 ID,则需要把相应的字典字段加入 LIST 命令。
为什么不能直接写两个文件名
以下写法不会在两个文件之间建立关联:
LIST STUDENT.MST CLASS.MST ...
UniQuery 的 LIST 语法以单个主文件为基础,跨文件取值通常通过字典转换或 I-descriptor 实现。这里的 TRANS() 类似于 SQL 根据外键读取另一张表的字段,但并不等同于完整的关系型 INNER JOIN。
如果已经启用 UniVerse SQL,并为两个文件配置了合适的 SQL 映射,也可以使用 SQL JOIN。这需要额外配置 SQL schema 和多值字段映射,普通 .MST 文件未必具备这些条件。对于要求使用 TCL LIST 命令的练习,采用字典项和 TRANS() 更合适。
常见问题
查询结果为空时,可以依次检查:
STUDENT.MST中的班级编号是否与CLASS.MST的记录 ID 一致。CLASS.MST中是否存在CLASS.NAME字典项。CLASS是否为多值字段,以及新建的CLASS.NAME是否设置为M。AGE字典项是否采用数值格式。如果系统将其作为字符串比较,年龄筛选结果可能有误。- 字典表达式中的文件名和字段名是否与当前账户中的实际名称完全一致。
备注:内容仅供参考。
