Onvalidation - SQLFORM.grid

34 views
Skip to first unread message

Adriano Marinho

unread,
May 17, 2016, 3:08:37 PM5/17/16
to web2py-users-brazil
Boa Tarde..

Tenho uma tabela Pagar e outra Pagar_parcelas.

Gostaria de validar a inclusão de parcelas(tabela Pagar_Parcelas), onde a soma das parcelas não pode ser maior que o valor do documento(tabela Pagar).

Ao adicionar uma nova parcela o validador funciona , porém na alteração eu preciso descontar o valor existente 

Como eu consigo setar a variável old_valor com o valor da parcela existente antes da alteração?

    def validar(form,total_parcela=total_parcela,pagar_valor=pagar_valor,old_valor=old_valor):
        if (total_parcela + float(form.vars.valor) - old_valor)) > pagar_valor:
            form.errors.valor = "A soma das parcelas e maior que o valor do documento " 

    form = SQLFORM.grid((Pagar_parcelas.pagar==id_pagar),
            buttons_placement='left', # Botões a esquerda
            formname="parcelas",
            searchable = False,
            showbuttontext=False, # Exibe os botões
            args=[id_pagar],
            csv=False,
            onvalidation=validar,
            )

grato
Adriano

Carlos Costa

unread,
May 17, 2016, 4:52:21 PM5/17/16
to web2py-us...@googlegroups.com
Você usar uma variável global como valor ou dentro da validação buscar o registro antigo através do id em form.vars.id

--
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 J. Costa
Cientista da Computação  | BS Computer Science
Esp. Gestão em Telecom   |
PgC Telecom Mangement
<º))><

Adriano Marinho

unread,
May 17, 2016, 6:01:56 PM5/17/16
to web2py-users-brazil
Carlos

No caso da variável global em que momento e pego esse valor, tentei com request.vars.valor,  requeste.args, form.vars.valor no momento do click em editar, mas esse argumento não sendo passado,

    if request.args(-3) == "edit":
        session.valor =form.vars.valor

Também pensei em buscar dentro do validador através do id, mas como forma de aprendizado (teimosia mesmo) queria resolver através de variável.

Como uma boa prática, você acha que devemos evitar quando possível consultas em banco ou a perda de performance é insignificante?.

obrigado
Adriano  

Carlos Costa

unread,
May 17, 2016, 8:30:26 PM5/17/16
to web2py-us...@googlegroups.com
Variáveis globais é que devem ser evitadas.
Deixam o código mais difícil de ler.
Uma busca no banco é mais legível.
E a não ser que performance seja algo muito crítico nessa página específica, não há com o que se preocupar.
Eu particularmente só me preocupo mais com número de consultas quando está em algum loop ou uma chamada ajax.

o form.vars só vai ser populado depois de .process()

Pra falar a verdade, eu acho ótimo o .grid para protótipos rápidos, mas é chato de customizar.
Nesses casos prefiro fazer do zero ou fazer meu próprio form de edição, mantendo o grid.

--
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.

Adriano Marinho

unread,
May 17, 2016, 8:58:26 PM5/17/16
to web2py-users-brazil
Obrigado Carlos

resolvido com a solução de buscar dentro do validador

    def validar(form,total_parcela=total_parcela,pagar_valor=pagar_valor):
        id_parcela = int(request.args(-1))
        old_valor = float(Pagar_parcelas(id_parcela).valor)
        if (total_parcela + float(form.vars.valor) - old_valor) > pagar_valor:
            form.errors.valor = "Soma das Parcelas é Maior que o Valor do Documento" 

Você tem razão, apesar de ser iniciante já percebi que se perde mais tempo com o grid.

Só mais uma dúvida, nesse caso eu validei para valores maiores que o documento, porém vai ficar aberto para o usuário lançar um valor menor.
Você tem ideia que como validar nesse caso, talvez  somente  um alerta quando o usuário sair da view. o Web2py captura esse evento?

Obrigado
Adriano











Em terça-feira, 17 de maio de 2016 16:08:37 UTC-3, Adriano Marinho escreveu:

Carlos Costa

unread,
May 17, 2016, 9:09:35 PM5/17/16
to web2py-us...@googlegroups.com
Pode usar o response.flash pra pipocar uma mensagem.

Nota: para melhor a questão de desemepnho, procure buscar só os campos que vai usar no momento.

--
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.

Adriano Marinho

unread,
May 19, 2016, 9:04:48 AM5/19/16
to web2py-users-brazil
Valeu Carlos, Obrigado

    def validar(form,total_parcela=total_parcela,pagar_valor=pagar_valor):
        if  'edit' in request.args:
            id_parcela = request.args(-1)
            old_valor = float(Pagar_parcelas(id_parcela).valor)
        else:
            old_valor = 0    
        if (total_parcela + float(form.vars.valor) - old_valor) > pagar_valor:
            form.errors.valor = "Soma das Parcelas é Maior que o Valor do Documento"
        elif (total_parcela + float(form.vars.valor) - old_valor) < pagar_valor:
            session.flash = 'Valor do Ducumento: %s Soma das Parcelas: %s ' %(pagar_valor,total_parcela) 


Em terça-feira, 17 de maio de 2016 16:08:37 UTC-3, Adriano Marinho escreveu:
Reply all
Reply to author
Forward
0 new messages