临时表
临时表是一种特殊的数据库表,用于存储临时数据。与普通表不同,临时表通常在数据源中定义了结构(即列和数据类型),但不在磁盘上持久存储数据,而是将数据存储在内存中。下面是对临时表的详细描述,包括其特点、用途,以及如何通过代码对数据进行增删改查(CRUD)操作。
临时表的特点
- 表结构定义:
- 临时表具有明确的表结构,包括列名、数据类型和约束等,通常在创建临时表时定义。
- 非持久化存储:
- 临时表的数据通常存储在内存中,意味着它们在会话结束或事务完成后可能会被清除,具体取决于数据库的实现和配置。
- 性能优势:
- 由于数据存储在内存中,临时表的读写速度通常比从磁盘读取数据要快,适用于需要快速访问和处理大量数据的场景。
- 会话级别:
- 临时表通常与特定的数据库会话或用户操作相关联,其他会话无法访问同一会话中的临时表数据。
- 数据隔离性:
- 不同会话中的临时表数据互不干扰,确保数据的隔离性。
临时表的用途
- 数据处理:临时表可以用于处理复杂的查询和数据计算,尤其是在需要多次访问相同数据时,可以减少重复的查询操作。
- 数据转换:在数据导入、导出和转换过程中,临时表可以作为中间存储区域。
- 报告生成:在生成报表时,可以使用临时表存储中间计算结果,方便后续的处理和展示。
正式表用于临时表
在平台中 可以用Table 类型为normal的正式表当作 临时表来使用
操作如下:
1.新建一张正式版(也可以使用原有正式表)
2.把正式表作为数据源构造 Form,注意 需要把 数据源类型(DataSourceType)设置为Temporary
3.构造正常的画面元素结构 如 构造DataGrid
4.代码构造数据 如:
//在画面初始化之后的方法中 去构造临时表数据 然后 插入到对应的数据源
public CommandResult afterInit(CommandArg arg) {
CommandResult result = new CommandResult();
List<Student> list = new ArrayList<>();
//以下3种方法任选其一
//每次打开画面都会进该方法 如果需要避免数据重复插入 需要先清空数据源临时数据 tmpRecordClear 方法在3.13及之后版本不推荐使用
result.tmpRecordClear().setGroup(__DS_Student);
cleanTemporaryData(__DS_Student);
GongqiFormUtils.cleanTemporaryDSData(GOTHelper.getEntityId(Form_Student.class),
Form_Student.__DS_Student);
for(int i=0;i<10;i++) {
Student st = Student.newInstance();
st.initAsTempTable();
st.setNumber("ST_00"+i);
st.setName("Name_"+i);
list.add(st);
}
//以下2种方法任选其一
//注意 该方法在 3.13之后 不建议使用
result.tmpRecordAdd(list).setGroup(__DS_Student);
//3.13之后插入数据源临时数据 并且需要执行 executeQuery命令刷新数据 否则 初始化不存在数据
addTemporaryRecordData(__DS_Student, list);
result.executeQuery().setGroup(__DS_Student);
return result;
}
正式临时表
在平台中 可以直接创建类型为 Temporary 的临时表 之后 用该表作为数据源时 数据源类型(DataSourceType)自动设置为Temporary
操作如下:
1.新建一张Table属性Temporary的临时表
2.把该Table 拖入Form 中 构造 Form
3.构造正常的画面元素结构 如 构造DataGrid
4.代码构造数据 如:
//在画面初始化之后的方法中 去构造临时表数据 然后 插入到对应的数据源
public CommandResult afterInit(CommandArg arg) {
CommandResult result = new CommandResult();
List<Student> list = new ArrayList<>();
for(int i=0;i<10;i++) {
Student st = Student.newInstance();
st.initAsTempTable();
st.setNumber("ST_00"+i);
st.setName("Name_"+i);
list.add(st);
}
//注意 该方法在 3.13之后 不建议使用
result.tmpRecordAdd(list).setGroup(__DS_Student);
//3.13之后插入数据源临时数据 并且需要执行 executeQuery命令刷新数据 否则 初始化不存在数据
addTemporaryRecordData(__DS_Student, list);
result.executeQuery().setGroup(__DS_Student);
return result;
}
代码构造临时表
在平台在 存在特殊情况 开发人员 不建议表结构 纯粹用代码构造其结构
[!WARNING]
在3.13版本及之后版本 该构造成的临时表 不支持在PC端进一步过滤排序 不推荐长期使用 仅作为临时处理展示数据使用
操作如下:
1.新建一个Form
2.新建一个DataSource 继承 SysTmp
3.在Desgin 下 新建 一个DataGird
4.在DataGird下新建具体类型字段 如 StringEditor 并且把DataSource属性设置为 SysTmp ,把DataMethod属性设置为Normal
数据代码操作
对于不同版本的数据操作 存在版本代码差异
数据插入
tmpRecordAdd
CommandResult 命令 作用是对临时表数据源增加临时表记录,传List
方法签名
gongqi.erp.gotmodel.form.remote.CommandResult.tmpRecordAdd(List<?>)
方法入参
- List
list:列表数据 T 为具体的 临时表对象 也可以是Map
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
List<TestTmpTable> list = new ArrayList<TestTmpTable>();
//新建 一条TestTmpTable 存入到 list 内
TestTmpTable tt = new TestTmpTable();
tt.initAsTempTable();
tt.setA_TableField("小明");
tt.setA_TableField1(1);
list.add(tt);
tt = new TestTmpTable();
tt.initAsTempTable();
tt.setA_TableField("小红");
tt.setA_TableField1(2);
list.add(tt);
CommandResult result = new CommandResult();
//此画面有多个数据源,所以当赋值的时候必须指定数据源
//使用 tmpRecordAdd 给临时数据源TestTmpTable 添加数据
result.tmpRecordAdd(list).setGroup(__DS_TestTmpTable);
//结合 executeQuery刷新数据
result.executeQuery();
return result;
}
[!WARNING]
3.13版本 标记为不可用 不推荐使用
addTemporaryRecordData(String, List<? extends GongqiRecord>)
Form上命令 作用是对临时表数据源增加临时表记录
方法签名
gongqi.erp.gotmodel.form.GongqiForm.addTemporaryRecordData(String, List<? extends GongqiRecord>)
方法入参
- String datasource :指定数据源
- List<? extends GongqiRecord> list:列表数据 T 为具体的 临时表对象
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
List<TestTmpTable> list = new ArrayList<TestTmpTable>();
//新建 一条TestTmpTable 存入到 list 内
TestTmpTable tt = new TestTmpTable();
tt.initAsTempTable();
tt.setA_TableField("小明");
tt.setA_TableField1(1);
list.add(tt);
tt = new TestTmpTable();
tt.initAsTempTable();
tt.setA_TableField("小红");
tt.setA_TableField1(2);
list.add(tt);
CommandResult result = new CommandResult();
//使用 addTemporaryRecordData 命令 给Student数据 添加list 数据
addTemporaryRecordData(__DS_Student, list);
//结合 executeQuery刷新数据
result.executeQuery();
return result;
}
addTemporaryMapData(String, List
Form上命令 作用是对临时表数据源增加临时表记录
方法签名
gongqi.erp.gotmodel.form.GongqiForm.addTemporaryMapData(String, List<Map<String, Object>>)
方法入参
- String datasource :指定数据源
- List
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
List<Map<String,Object>> list = new ArrayList<TestTmpTable>();
//新建 一条TestTmpTable 存入到 list 内
TestTmpTable tt = new TestTmpTable();
tt.initAsTempTable();
Map<String, Object> castToMap = tt.castToMap();
tt.put("Name","小明");
tt.put("Num",1);
list.add(tt);
tt = new TestTmpTable();
tt.initAsTempTable();
Map<String, Object> castToMap2 = tt.castToMap();
castToMap2.put("Name","小红");
castToMap2.put("Num",2);
list.add(tt);
CommandResult result = new CommandResult();
//使用 addTemporaryRecordData 命令 给Student数据 添加list 数据
addTemporaryMapData(__DS_Student, list);
//结合 executeQuery刷新数据
result.executeQuery();
return result;
}
putTemporaryDSData(String, String, List
GongqiFormUtils 内的命令 作用是对临时表数据源增加临时表记录
方法签名
gongqi.erp.gotmodel.util.GongqiFormUtils.putTemporaryDSData(String, String, List<Map<String, Object>>)
方法入参
- String formId:指定画面Form的Id 一般通过GotHelper.getEntityId获取
- String datasource :指定数据源
- List
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
List<TestTmpTable> list = new ArrayList<TestTmpTable>();
//新建 一条TestTmpTable 存入到 list 内
TestTmpTable tt = new TestTmpTable();
tt.initAsTempTable();
Map<String, Object> castToMap = tt.castToMap();
tt.put("Name","小明");
tt.put("Num",1);
list.add(tt);
tt = new TestTmpTable();
tt.initAsTempTable();
Map<String, Object> castToMap2 = tt.castToMap();
castToMap2.put("Name","小红");
castToMap2.put("Num",2);
list.add(tt);
CommandResult result = new CommandResult();
//使用 GongqiFormUtils.putTemporaryDSData 命令 给Student数据 添加list 数据
GongqiFormUtils.putTemporaryDSData(GOTHelper.getEntityId(Form_Student.class), Form_Student.__DS_Student, list);
//结合 executeQuery刷新数据
result.executeQuery();
return result;
}
数据删除
tmpRecordClear()
CommandResult 命令 作用是对临时表数据源清空数据 结合setGroup 指定数据源
方法签名
gongqi.erp.gotmodel.form.remote.CommandResult.tmpRecordClear()
方法入参
- 无
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
//结合setGroup 指定清空数据源临时数据
result.tmpRecordClear().setGroup(__DS_Student);
result.executeQuery().setGroup(__DS_Student);
return result;
}
[!WARNING]
3.13版本 标记为不可用 不推荐使用
cleanTemporaryData(String)
Form上命令 作用是对临时表数据源清空临时数据
方法签名
gongqi.erp.gotmodel.form.GongqiForm.cleanTemporaryData(String)
方法入参
- String datasourcename:数据源名称
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
//结合setGroup 指定清空数据源临时数据
result.cleanTemporaryData(__DS_Student);
result.executeQuery().setGroup(__DS_Student);
return result;
}
cleanTemporaryDSData(String, String)
Form上命令 作用是对临时表数据源清空临时数据
方法签名
gongqi.erp.gotmodel.util.GongqiFormUtils.cleanTemporaryDSData(String, String)
方法入参
- String formId:指定画面Form的Id 一般通过GotHelper.getEntityId获取
- String datasource :指定数据源
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
//结合setGroup 指定清空数据源临时数据
result.cleanTemporaryDSData(GOTHelper.getEntityId(Form_Student.class), Form_Student.__DS_Student);
result.executeQuery().setGroup(__DS_Student);
return result;
}
removeTemporaryDSData(String, String, long)
Form上命令 作用是对临时表数据源清空临时数据
方法签名
gongqi.erp.gotmodel.util.GongqiFormUtils.removeTemporaryDSData(String, String, long)
方法入参
- String formId:指定画面Form的Id 一般通过GotHelper.getEntityId获取
- String datasource :指定数据源
- Long recId:recId 编号
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
//结合setGroup 指定清空数据源临时数据
GongqiFormUtils.removeTemporaryDSData(GOTHelper.getEntityId(Form_Student.class), Form_Student.__DS_Student,100L);
result.executeQuery().setGroup(__DS_Student);
return result;
}
removeTemporaryDSData(String, String, long)
Form上命令 作用是对临时表数据源数据 删除部分
方法签名
gongqi.erp.gotmodel.util.GongqiFormUtils.removeTemporaryDSData(String, String, long)
方法入参
- String formId:指定画面Form的Id 一般通过GotHelper.getEntityId获取
- String datasource :指定数据源
- Long recId:recId 编号
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
//结合setGroup 指定清空数据源临时数据
GongqiFormUtils.removeTemporaryDSData(GOTHelper.getEntityId(Form_Student.class), Form_Student.__DS_Student,100L);
result.executeQuery().setGroup(__DS_Student);
return result;
}
removeTemporaryDSData(String, String, Predicate
Form上命令 作用是对临时表数据源数据 删除部分
方法签名
gongqi.erp.gotmodel.util.GongqiFormUtils.removeTemporaryDSData(String, String, Predicate<Map<String, Object>>)
方法入参
- String formId:指定画面Form的Id 一般通过GotHelper.getEntityId获取
- String datasource :指定数据源
- Predicate
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
Predicate pda = new Predicate<Map<String,Object>>() {
@Override
public boolean test(Map<String, Object> t) {
//根据 每个记录转换的 map t 判断 是否需要删除 true 删除 false 保留
return false;
}
};
GongqiFormUtils.removeTemporaryDSData(arg.formParam.formId, __DS_A_TablE,pda);
//刷新数据
result.executeQuery();
return result;
}
数据更新
临时表数据更新操作
可以使用 数据插入的命令 结合 数据删除清理 操作
tmpRecordRefresh(List<?>)
CommandResult 命令 作用是对临时表数据源 数据根据RecId找出对应记录 进行 更新
方法签名
gongqi.erp.gotmodel.form.remote.CommandResult.tmpRecordRefresh(List<?>)
方法入参
- List
list:列表数据 T 为具体的 临时表对象 也可以是Map
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
//获取当前指定记录
List<Map<String,Object>> selectedMaps = arg.getSelectedMaps();
for (Map<String, Object> map : selectedMaps) {
map.put("Name", "newName");
}
result.tmpRecordRefresh(selectedMaps).setGroup(__DS_Student);
return result;
}
[!WARNING]
3.13版本 标记为不可用 不推荐使用
数据获取
临时表的数据获取一个是通过 CommandArg 获取 一个通过 GongqiFormUtils 获取
getAllRecords
得到画面上所有记录 返回一个List ,List中是GongqiRecord对象 可以强转成对应表对象
方法签名
List<? extends GongqiRecord> allRecords = arg.getAllRecords();
方法入参
- 无
getCurrentMap
得到当前选中记录(包括DataMethod这样不在表中存在的字段)返回值为一个Map
方法签名
Map<String, Object> currentMap = arg.getCurrentMap();
方法入参
- 无
getCurrentRecord
得到画面上当前的选中记录 返回 GongqiRecord对象 可以强制成对应表对象
方法签名
GongqiRecord currentRecord = arg.getCurrentRecord();
方法入参
- 无
示例代码
//获取到画面上SysUser数据源选中的记录 返回 SysUser对象
SysUser user = (SysUser)arg.getCurrentRecord();
getSelectedRecords
得到当前选中的记录
方法签名
List<? extends GongqiRecord> selectedRecords = arg.getSelectedRecords();
方法入参
- 无
示例代码
//获取到画面上SysUser数据源选中的记录 返回 SysUser对象
List<SysUser> users = (List<SysUser>)arg.getSelectedRecords();
getTemporaryDSData(String, String, long)
根据RecId 获取临时表数据
方法签名
gongqi.erp.gotmodel.util.GongqiFormUtils.getTemporaryDSData(String, String, long))
方法入参
String formId:form的编号
String formDataSourceName:数据源名称
long recId:recId
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
SysReportTable currentRecord =(SysReportTable) arg.getCurrentRecord();
GongqiFormUtils.getTemporaryDSData(arg.formParam.formId, __DS_A_TablE,currentRecord.getRecId());
return result;
}
getTemporaryDSData(String, String, QueryTable)
根据QueryTable 获取临时表数据
方法签名
gongqi.erp.gotmodel.util.GongqiFormUtils.getTemporaryDSData(String, String, QueryTable)
方法入参
String formId:form的编号
String formDataSourceName:数据源名称
long recId:recId
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
QueryTable formQuery = arg.getFormQuery();
formQuery.findOrCreateWhereItem(A_TablE._Nmemmeme).setValue("<>''");
List<Map<String,Object>> temporaryDSData =
GongqiFormUtils.getTemporaryDSData(arg.formParam.formId, __DS_A_TablE,formQuery);
return result;
}
getTemporaryDSData(String, String, Predicate
根据QueryTable 获取临时表数据
方法签名
gongqi.erp.gotmodel.util.GongqiFormUtils.getTemporaryDSData(String, String, Predicate<Map<String, Object>>)
方法入参
String formId:form的编号
String formDataSourceName:数据源名称
long recId:recId
示例代码
public CommandResult buttonOK_Button(CommandArg arg) {
CommandResult result = new CommandResult();
Predicate pda = new Predicate<Map<String,Object>>() {
@Override
public boolean test(Map<String, Object> t) {
//根据 每个记录转换的 map t 判断 是否需要 true 需要
return false;
}
};;
List<Map<String,Object>> temporaryDSData =
GongqiFormUtils.getTemporaryDSData(arg.formParam.formId, __DS_A_TablE,pda);
return result;
}