renanbg Postado Setembro 27, 2017 Denunciar Share Postado Setembro 27, 2017 (editado) Tenho um select que traz os dados da tabela contas a receber. Nesse select adicionei um campo virtual chamado MARCADO. A finalidade desse campo é marcar os registros no dbgrid, via checkbox. Imagine que o select trouxe 10 contas para o dbgrid, mas o cliente deseja pagar apenas 3. Preciso obter o somatorio dessas 3 contas e atualizar o status para pago. Como poderia fazer isso? Editado Setembro 28, 2017 por renanbg Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 27, 2017 Denunciar Share Postado Setembro 27, 2017 use o bookmark do delphi com ele voce pode marcar somente os registros que voce quer trabalhar http://josehenriquebr.blogspot.com.br/2009/11/usando-bookmark-de-maneira-simples.html abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renanbg Postado Setembro 28, 2017 Autor Denunciar Share Postado Setembro 28, 2017 (editado) Bom dia Jhonas. Obrigado pela dica. Não entendi como aplicar isso na minha situação atual. Vou tentar explicar. Tenho um checkbox para cada registro do dbgrid. Ao dar um duplo clique no registro, seto um campo chamado MARCADO para S e caso desmarque, para N Imagine que eu tenha selecionado 800 registros. Como aplicar essa técnica do bookmark para atualizar o campo PAGO de não para SIM, em todos eles? Um amigo de outro forum me sugeriu um while: var TotValor: Double; TotRegistros: Integer; begin TotValor := 0; TotRegistros := 0; with FrmDm.cdsContasReceber do begin First; while not eof do begin if FieldByName('MARCADO').AsString = 'S' then begin TotValor := TotValor + FieldByName('TOTAL').AsFloat; TotRegistros := TotRegistros + 1; end; Next; end; ShowMessage(Format('%m', [TotValor])); ShowMessage(IntToStr(TotRegistros)); end; O que acha? Depois vou precisar atualizar o campo PAGO para SIM, daí pensei em usar o mesmo while with FrmDm.cdsContasReceber do begin First; while not eof do begin if FieldByName('MARCADO').AsString = 'S' then begin Edit; FieldByName('PAGO').AsString = 'SIM'; Post; end; Next; end; ShowMessage('ok'); end; Só tenho duvidas se isso pode implicar na performance, caso tenha muitos registros em memória Editado Setembro 28, 2017 por renanbg Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 28, 2017 Denunciar Share Postado Setembro 28, 2017 Ok ... agora entendi melhor a sua dúvida. ,,,, não é preciso usar o comando While se voce quer ganho de performance, voce vai usar um componente TQuery ou outro conforme o banco de dados que estiver usando. simplesmente coloque um componente TQuery no Form e coloque esse código em algum procedimento ou botão, Query1.SQL.Clear; Query1.SQL.Append('UPDATE ContasReceber SET MARCADO = "S" WHERE MARCADO = "N"'); Query1.ExecSQL; Query1.Close; OBS: na clausula SQL voce pode ainda filtrar os registros por data se quiser, da maneira como esta, todos os registros da tabela ( ContasReceber) que estiverem marcados como Não serão marcados como Sim abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renanbg Postado Setembro 28, 2017 Autor Denunciar Share Postado Setembro 28, 2017 Eu tinha pensado nessa solução, mas meu campo MARCADO é virtual, crio ele no momento do select. Por esse motivo não consigo usar Update. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 28, 2017 Denunciar Share Postado Setembro 28, 2017 sugiro que voce não use esse campo como virtual, coloque ele na tabela ... vai facilitar muito abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renanbg Postado Setembro 28, 2017 Autor Denunciar Share Postado Setembro 28, 2017 Pois é, duvida cruel pois com ele na tabela, cada vez que eu marcar ou desmarcar um registro, precisaria dar um EDIT e um POST. Daí pensei na situação de fechamento de convenio, onde o select vai me trazer cerca de 1.000 registros. Então fiquei na duvida. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 28, 2017 Denunciar Share Postado Setembro 28, 2017 Não fique na dúvida .... coloque o campo na tabela e não vai se arrepender... trabalho com tabelas com mais de 250 mil registros e a solução que te passei é muito rapida abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renanbg Postado Setembro 28, 2017 Autor Denunciar Share Postado Setembro 28, 2017 Beleza Jhonas. Desta forma então creio que não terei problemas. Só me tira uma duvida: após o update que marca como paga, você também da um update que desmarca o registro ou deixa ele marcado mesmo? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 28, 2017 Denunciar Share Postado Setembro 28, 2017 O campo da sua tabela sempre tera o valor N ou S voce é que determina na select quais são os registros que voce quer fazer isso ( marcar com S ou N ) voce pode pegar registros de uma data ou de um período e aplicar o UPDATE abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renanbg Postado Setembro 28, 2017 Autor Denunciar Share Postado Setembro 28, 2017 Beleza, obrigado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
renanbg
Tenho um select que traz os dados da tabela contas a receber.
Nesse select adicionei um campo virtual chamado MARCADO. A finalidade desse campo é marcar os registros no dbgrid, via checkbox.
Imagine que o select trouxe 10 contas para o dbgrid, mas o cliente deseja pagar apenas 3.
Preciso obter o somatorio dessas 3 contas e atualizar o status para pago.
Como poderia fazer isso?
Link para o comentário
Compartilhar em outros sites
10 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.