Formulário que referencia campo de outra tabela que referencia campo de outra tabela.

44 views
Skip to first unread message

Carlos A Locatelli Jr

unread,
Jan 24, 2019, 8:23:16 AM1/24/19
to web2py-users-brazil
Pessoal é o seguinte:
  Tenho um sistema de estoque que criei e está funcionando ok no banco. Fiquei muito feliz de ver que as triggers e stored procedures que criei no MySQL funcionam perfeitamente no web2py.
  Meu problema é que o "IdEstoque" de "ControleRetiradas" referencia o "IdEstoque" da tabela Estoque, este por sua vez referencia o "IdMaterial" da tabela Materiais. Assim, na tabela estoque, consigo ver o material pelo seu nome. Já no formulário de retiradas não estou conseguindo que fique desta forma na caixa de seleção.

O código está assim:
--db.py--

Materiais = dbentidades.define_table ('Materiais',
    Field ('Id', 'id', required=True),
    Field ('IdCat', 'integer', required=True),
    Field ('IdSub', 'integer', required=True),
    Field ('Cod', 'integer', required=True),
    Field ('Material', 'text', required=True),
    Field ('Unidade', 'text', length=40),
    format = '%(Material)s',
    migrate = False    )
dbentidades.Materiais.Id.writable = dbentidades.Materiais.Id.readable = False

Estoque = dbentidades.define_table('Estoque',
    Field('Id', 'id'),
    Field('IdMaterial', 'reference Materiais', requires=IS_IN_DB(dbentidades, 'Materiais.Id', dbentidades.Materiais._format)),
    Field('Qtd', 'decimal(10,2)'),
    Field('IdLocal', 'integer'),
    Field('DataValidade', 'date'),
    Field('DataReg', 'datetime'),
    format = '%(IdMaterial)s',
    migrate=False
    )
dbentidades.Estoque.Id.writable = dbentidades.Estoque.Id.readable = False

ControleRetirada = dbdocumentos.define_table ('ControleRetirada',
    Field('Id', 'id'),
    Field('IdEstoque', 'reference Estoque', requires=IS_IN_DB(dbentidades, 'Estoque.Id', dbentidades.Estoque._format)),
    Field('Qtd', 'decimal(10,2)'),
    Field('DataReg', 'datetime'),
    Field('IdPessoa', 'integer', requires=IS_IN_DB(dbpessoas, 'Pessoas.Id', dbpessoas.Pessoas._format)),
    Field('Uso', 'text', length='512'),
    Field('QtdDevolvido', 'decimal(8,2)'),
    migrate = False)

--controller--

@auth.requires_login()
def ControleDeRetiradas():
    formRetiradas = SQLFORM(dbdocumentos.ControleRetirada, submit_button='Registrar')
    return dict(formRetiradas=formRetiradas)

Grato pela atenção.

Carlos Costa

unread,
Jan 24, 2019, 11:27:31 AM1/24/19
to web2py-us...@googlegroups.com
Você quer que apareça o material na caixa de seleção do form retiradas?

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.


--
At.

Carlos J. Costa
--------------------------------------------------------------
Cientista da Computação - Esp. Gestão em Telecom

Carlos A Locatelli Jr

unread,
Jan 24, 2019, 11:52:59 AM1/24/19
to web2py-users-brazil
Sim, exatamente isso. Na caixa de seleção do formulário de retiradas deve aparecer os nomes de materiais que estão no estoque.
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Carlos Costa

unread,
Jan 25, 2019, 5:28:44 AM1/25/19
to web2py-us...@googlegroups.com
Você também pode usar um lambda ou uma função para criar represents mais complexos.

def estoque_represent(row):
    material = dbentidades( (dbentidades.Estoque.id == row.id) &
                                       (dbentidades.Material == dbentidades.Estoque.idMaterial)
                                      ).select(dbentidades.Material.Material).first()
    return material.Material

...
Field('IdEstoque', 'reference Estoque', requires=IS_IN_DB(dbentidades, 'Estoque.Id', estoque_represent)),
...

Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.


--
At.

Carlos J. Costa
--------------------------------------------------------------
Cientista da Computação - Esp. Gestão em Telecom

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Carlos A Locatelli Jr

unread,
Jan 25, 2019, 11:43:04 AM1/25/19
to web2py-users-brazil
Chará,
 
 Segui sua dica e implementei a função conforme você sugeriu. E, embora no terminal ela funcione direitinho, substituindo o "row.id" por um id da tabela Estoque, na caixa de seleção da aplicação aparecem vários  "none" ,"none", "none"...

Carlos Costa

unread,
Jan 25, 2019, 11:55:26 AM1/25/19
to web2py-us...@googlegroups.com
Você tem que usar o row mesmo porque é por essa variável que ele vai passar o registro atual quando ele for gerar a representação do registro.
row.id então seria o id da tabela.
Provavelmente tem alguma problema nesse select que eu fiz:
material = dbentidades( (dbentidades.Estoque.id == row.id) &
                                       (dbentidades.Material == dbentidades.Estoque.idMaterial)
                                      ).select(dbentidades.Material.Material).first()
ele está retornando nada.
Execute o form normalmente e dá um print/debuga essa consulta.

Em sex, 25 de jan de 2019 às 14:43, Carlos A Locatelli Jr <call....@gmail.com> escreveu:
Chará,
 
 Segui sua dica e implementei a função conforme você sugeriu. E, embora no terminal ela funcione direitinho, substituindo o "row.id" por um id da tabela Estoque, na caixa de seleção da aplicação aparecem vários  "none" ,"none", "none"...

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Carlos A Locatelli Jr

unread,
Jan 25, 2019, 11:59:17 AM1/25/19
to web2py-users-brazil
Ok. Desculpe,
  Agora parece que foi certinho.
 

Carlos A Locatelli Jr

unread,
Jan 25, 2019, 1:20:10 PM1/25/19
to web2py-users-brazil
 Carlos,
 Agora reparei no seguinte: Deu certo, a caixa de listagem agora mostra o material. Só que: O formulário construido com SQLFORM(dbdocumentos.Retiradas) não está inserindo o dado enviado. Apenas o formulário do Appadmin insere corretamente.

Carlos Costa

unread,
Jan 25, 2019, 1:34:05 PM1/25/19
to web2py-us...@googlegroups.com
Faltou você executar o SQLFORM(....).process()

Em sex, 25 de jan de 2019 às 16:20, Carlos A Locatelli Jr <call....@gmail.com> escreveu:
 Carlos,
 Agora reparei no seguinte: Deu certo, a caixa de listagem agora mostra o material. Só que: O formulário construido com SQLFORM(dbdocumentos.Retiradas) não está inserindo o dado enviado. Apenas o formulário do Appadmin insere corretamente.

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Carlos A Locatelli Jr

unread,
Jan 25, 2019, 1:40:12 PM1/25/19
to web2py-users-brazil
Maravilha. Funcionou perfeitamente agora!

Esqueci de dizer:

No Field eu tive que colocar o campo como 'list', pois de outra forma dava erro. Ficou assim:
----
Field('IdEstoque', 'list', requires=IS_IN_DB(dbentidades, 'Estoque.Id', estoque_represent)),

Carlos Costa

unread,
Jan 25, 2019, 2:05:28 PM1/25/19
to web2py-us...@googlegroups.com
Acho que o erro é por que você está usando duas conexões diferentes (talvez dois bancos, o motivo eu não entendi).
Sendo assim uma instância da DAL não tem as referências da outra.
Eu tinha achado até estranho que você não tinha mencionado erro nesse sentido.

O list passou porque ele não faz validação da chave em nenhum nível, vai aceita ruma lista de números.
Quem está fazendo a mágica é o validador.

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Carlos A Locatelli Jr

unread,
Jan 28, 2019, 10:11:32 AM1/28/19
to web2py-users-brazil
Sim. O que ocorre é que os Bancos são Legados. Eu que fiz, mas na época não pensei que um dia viria a junta-los em uma aplicação. E como existe outra aplicação que manipula eles de outra forma, tenho que mante-los assim, pelo menos por enquanto.

 

Em sexta-feira, 25 de janeiro de 2019 17:05:28 UTC-2, Carlos Costa escreveu:
Acho que o erro é por que você está usando duas conexões diferentes (talvez dois bancos, o motivo eu não entendi).
Sendo assim uma instância da DAL não tem as referências da outra.
Eu tinha achado até estranho que você não tinha mencionado erro nesse sentido.

O list passou porque ele não faz validação da chave em nenhum nível, vai aceita ruma lista de números.
Quem está fazendo a mágica é o validador.

Em sex, 25 de jan de 2019 às 16:40, Carlos A Locatelli Jr <call....@gmail.com> escreveu:
Maravilha. Funcionou perfeitamente agora!

Esqueci de dizer:

No Field eu tive que colocar o campo como 'list', pois de outra forma dava erro. Ficou assim:
----
Field('IdEstoque', 'list', requires=IS_IN_DB(dbentidades, 'Estoque.Id', estoque_represent)),

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Carlos Costa

unread,
Jan 28, 2019, 11:19:15 AM1/28/19
to web2py-us...@googlegroups.com
Entendi. 
Realmente aí complica e traz algumas limitações.

Em seg, 28 de jan de 2019 às 13:11, Carlos A Locatelli Jr <call....@gmail.com> escreveu:
Sim. O que ocorre é que os Bancos são Legados. Eu que fiz, mas na época não pensei que um dia viria a junta-los em uma aplicação. E como existe outra aplicação que manipula eles de outra forma, tenho que mante-los assim, pelo menos por enquanto.

 

Em sexta-feira, 25 de janeiro de 2019 17:05:28 UTC-2, Carlos Costa escreveu:
Acho que o erro é por que você está usando duas conexões diferentes (talvez dois bancos, o motivo eu não entendi).
Sendo assim uma instância da DAL não tem as referências da outra.
Eu tinha achado até estranho que você não tinha mencionado erro nesse sentido.

O list passou porque ele não faz validação da chave em nenhum nível, vai aceita ruma lista de números.
Quem está fazendo a mágica é o validador.

Em sex, 25 de jan de 2019 às 16:40, Carlos A Locatelli Jr <call....@gmail.com> escreveu:
Maravilha. Funcionou perfeitamente agora!

Esqueci de dizer:

No Field eu tive que colocar o campo como 'list', pois de outra forma dava erro. Ficou assim:
----
Field('IdEstoque', 'list', requires=IS_IN_DB(dbentidades, 'Estoque.Id', estoque_represent)),

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.


--
At.

Carlos J. Costa
--------------------------------------------------------------
Cientista da Computação - Esp. Gestão em Telecom

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages