首页 > 代码库 > [码海拾贝 之TC] 使用View 定义动态的Class

[码海拾贝 之TC] 使用View 定义动态的Class

前言

在TC 中,

Persistent Class 和 Table 是对应的关系。

定义一个Persistent的Class , updatedb 的时候就会产生对应的table.

在TC 的开发环境中, 使用一个username . 对应的会在这个username 下产生一个table

在正式环境中, 因为使用到 adm, su ,可key 三个username, 所以在这三个username 下都会生成相应的table.

具体数据保存在哪一张table 中, 就看Class 的定义是继承自哪(如果继承自admin的话, 自然就保存在admin 对应的username下)

之后使用QueryDbObject 对Class 进行查询。

查询的时候可以设置一个Scope 的参数

SC_SCOPE_OF_SESSION                         -- 在当前user 对应的table 中查询(基本上是su)
SC_SCOPE_WHERE_NECESSARY        -- 在所有user 对应的table 中查询


除了QueryDbobject 的方式外, TC 还提供了 QueryDbView 的方式Query View 中的数据。

这个View 不需要对应到一个Persistent 的Class, 而是一个View 就可以了。

那么, 这种开发如何进行呢? 要注意什么状况呢?


Query View

1. 首先, 定义 db view

CREATE OR REPLACE FORCE VIEW "VTEST" AS
SELECT 
	ATT AS ATT,                                                                                                                                                                                        
	
	‘-‘ AS CreationDate , 
	‘-‘ AS CurDbName , 
	‘-‘ AS LastUpdate , 
	‘-‘ AS OBID , 
	NULL AS Recycled , 
	NULL AS SEIndexLanguageList , 
	NULL AS ZBlob , 
	‘VTEST‘ AS Class
FROM View SQL;

这里的ATT代笔需要定义的一个attribute
这里注意的是, 处理定义需要的attribute 外, 还需要定义一些系统使用的attribute


2. 其次, 定义动态的class

define dynamic class VTEST with parent PdmRoot;
{
     attach ATT;
}

3. 定义好之后, View 里面有数据了。就可以使用QueryDbView的方式进行数据查找了。


在正式环境中,


1. 如果创建View 的SQL 在三个db 中都有执行的话, 使用  SC_SCOPE_WHERE_NECESSARY 这个scope 进行query ,

数据就会重复(三笔)

2.如果创建View 的SQL 只在su db 中有执行的话,使用  SC_SCOPE_WHERE_NECESSARY 这个scope 进行query, 就会报找不到table 的错误。


所以好的方式是 ,在su db 中创建view , 使用 SC_SCOPE_OF_SESSION 进行query







[码海拾贝 之TC] 使用View 定义动态的Class