Detalhes

Detalhes são usados no framework para trabalhar com dados tabulares, pertencentes a um registro na tabela de um item.

Por exemplo, o Registro de Faturas no aplicativo de Demonstração possui o detalhe InvoiceTable, que mantém uma lista de itens na fatura de um cliente.

Detalhes e itens de detalhes compartilham a mesma tabela de banco de dados subjacente.

Para criar um detalhe, você deve primeiro criar um item de detalhe (selecione o grupo de Detalhes na árvore do projeto e clique no botão Novo) e depois usar o Diálogo de Detalhes (selecione o item na árvore do projeto e clique no botão Detalhes) para adicionar um detalhe a um item.

Por exemplo, o seguinte código:

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()

irá imprimir:

2259
6

Detalhes têm dois campos comuns - master_id e master_rec_id, que são usados para armazenar informações sobre o ID do mestre (cada item tem seu próprio ID único) e o valor do campo primário do registro do seu mestre. Dessa forma, cada tabela pode ser vinculada a vários itens. Assim como cada item pode ter vários detalhes. Para acessar os detalhes de um item, use seu atributo details. Para acessar o mestre do detalhe, use seu atributo master.

A classe Detail, usada para criar detalhes, é um ancestral da classe Item e herda todos os seus atributos, métodos e eventos.

Nota

O método apply da classe Detail não faz nada. Para salvar as alterações feitas em um detalhe, use o método apply do seu mestre.

Para trabalhar com um detalhe, seu mestre deve estar ativo

Para fazer alterações em um detalhe, seu mestre deve estar em modo de edição ou inserção.

Exemplos

Neste exemplo do módulo cliente do item Invoices do Demo project, o detalhe Invoice_table é reaberto toda vez que o cursor do seu mestre se move para outro registro.

var ScrollTimeOut;

function on_after_scroll(item) {
    clearTimeout(ScrollTimeOut);
    ScrollTimeOut = setTimeout(
        function() {
            item.invoice_table.open(function() {});
        },
        100
    );
}

And just as an example:

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()

O mesmo código no cliente será o seguinte:

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();
}