明细表
在框架中,明细表用于处理与实体项对应的表中记录相关的数据。
例如,演示应用程序中,业务台账下的 发票(Invoices) 拥有 发票表格(InvoiceTable) 明细表,用于保存客户发票中的项目列表。
明细表与明细实体项共用同一个底层数据库表。
要创建明细表,您必须首先创建一个明细实体项(选择项目树中的明细表组(Details), 然后点击新建按钮(New)),然后使用 明细表对话框 (在项目树中选择实体项,然后点击细表按钮(Details)) 为实体项添加明细表。
例如,以下代码
def on_created(task):
task.invoice_table.open()
print task.invoice_table.record_count()
task.invoices.open(limit=1)
task.invoices.invoice_table.open()
print task.invoices.invoice_table.record_count()
将打印
2259
6
在 Jam.py v5 中,明细表有两个 公共字段 - master_id 和 master_rec_id ,用于存储有关主表 ID 的信息(每个实体项都有自己唯一的 ID)以及其主表记录的主字段值。
这样,每个表都可以被链接到多个实体项。同样,每个实体项也可以有多个明细表。
要访问实体项的明细表,请使用其 details 属性。要访问明细表的主表,请使用其 master 属性。
在 Jam.py v7 中,上述两个字段不再存在,但对于迁移的 v5 应用程序,它们仍受支持。 Jam.py v7 应用程序将使用查找字段作为主表的明细表,通常作为外键字段。
用于创建明细表的 Detail 类是 Item 类的祖先,并继承了其所有的属性、方法和事件。
备注
Detail 类的 apply 方法不执行任何操作。要保存对明细表所做的更改,
请使用其主表的 apply 方法。
要使用明细表,其主表必须处于活动状态。
要对明细表进行任何更改,其主表必须处于编辑或插入模式。
示例
在这个来自 演示项目 的 发票(Invoices) 实体项客户端模块的示例中,每次其主表的游标移动到另一条记录时, 发票表格(Invoice_table) 明细表都会重新打开。
var ScrollTimeOut;
function on_after_scroll(item) {
clearTimeout(ScrollTimeOut);
ScrollTimeOut = setTimeout(
function() {
item.invoice_table.open(function() {});
},
100
);
}
以下是一个示例:
from datetime import datetime, timedelta
def on_created(task):
invoices = task.invoices.copy()
invoices.set_where(invoicedate__gt=datetime.now()-timedelta(days=1))
invoices.open()
for i in invoices:
i.invoice_table.open()
i.edit()
for t in i.invoice_table:
t.edit()
t.sales_id.value = '101010'
t.post()
i.post()
invoices.apply()
客户端上功能相同的代码如下:
function on_page_loaded(task) {
var date = new Date(),
invoices = task.invoices.copy();
invoices.set_where({invoicedate__gt: date.setDate(date.getDate() - 1)});
invoices.open();
invoices.each(function(i) {
i.invoice_table.open();
i.edit();
i.invoice_table.each(function(t) {
t.edit();
t.sales_id.value = '101010';
t.post();
});
i.post();
});
invoices.apply();
}