明细表

在框架中,明细表用于处理与实体项对应的表中记录相关的数据。

例如,演示应用程序中,业务台账下的 发票(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_idmaster_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();
}