Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Set 12, 2017 2:45 pm Assunto: Seleção de registros com checkbox |
|
|
Estou trabalhando numa tela onde o usuario localiza as contas a receber.
A busca retorna um ou mais registros. Em alguns casos pode retornar mais de 1000 registros.
ex:
Código: | SELECT CAMPOS FROM CONTAS_RECEBER WHERE STATUS = NÃO PAGO |
Pensei em adicionar um checkbox no dbgrid e um checkbox chamado Selecionar Todos no formulario, para então fazer a baixa das contas selecionadas
Minha duvida é:
Tem como selecionar os registros sem gravar um campo na tabela?
Tudo que encontrei foi fazendo algo assim:
Código: | procedure TFrmBusca.CheckTodosClick(Sender: TObject);
begin
query.First;
while not query.EOF do
begin
query.Edit;
if query.FieldByName('FLAG').AsInteger = 1 then
query.FieldByName('FLAG').AsInteger := 0
else
query.FieldByName('FLAG').AsInteger := 1;
query.Post;
end;
query.Next;
end; |
|
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Ter Set 12, 2017 3:25 pm Assunto: |
|
|
Acredito que nesse caso, você deveria utilizar um ClientDataSet, ai vc cria uma coluna virtual no ClientDataSet que vai informar se o checkbox está marcado ou não, e por ser ClientDataSet, você pode trabalhar com os dados sem fazer o commit direto no banco |
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Set 12, 2017 3:26 pm Assunto: |
|
|
Certo Leo, mas me tira uma duvida.
Após o select, como jogo os dados no clientdataset e depois de alterados, como jogo as atualizações de volta no banco?
Teria que trabalhar com um datasetprovider? |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Ter Set 12, 2017 3:43 pm Assunto: |
|
|
Pra jogar do select no clientdataset é só fazer as ligações entre os componentes que ele já pega os dados sozinho.
ai para pegar a coluna de controle você pode fazer assim por exemplo:
Código: | SELECT Nome, Endereco, 0 Marcado
FROM Clientes |
ai para salvar, você vai ter que alterar as opções de ProviderFlag da coluna Marcado para que o valor da mesma não tente ser salvo no banco. |
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Set 12, 2017 4:51 pm Assunto: |
|
|
Sim, então a ligação é usando o datasetprovider.
Acredito que tenha que ser assim, para não dar commit direto no banco diversas vezes. |
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Set 14, 2017 10:57 am Assunto: |
|
|
Leo, me tira uma dúvida sobre esse campo virtual.
Pra entender, removi o updatesql e adicionei o datasetprovider e o clientdataset.
Adicionei todos os campos da query no clientdataset e criei um novo campo, pelo fieldseditor do clientdataset, chamado SELECIONADO, do tipo integer.
Ao fazer uma busca, o erro informando que o campo SELECIONADO não existe no clientdataset aparece. |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Set 14, 2017 11:23 am Assunto: |
|
|
mas ele existe na sua query?
pois como o ClientDataSet está ligado à query, ele vai buscar todos os dados de lá, inclusive o campo SELECIONADO.
Ex:
Código: | SELECT Nome, Endereco, 0 SELECIONADO
FROM Clientes |
|
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Set 14, 2017 11:43 am Assunto: |
|
|
Então.
Fui na query e adicionei o campo.
Em seguida fui no cds e cliquei em add all, mas ele diz que o campo no existe na query. |
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Sex Set 15, 2017 8:45 am Assunto: |
|
|
Leo, fiz um select mais ou menos assim
Código: | SELECT
CodConta,
DataVencimento,
Valor,
'N' as Marcado <-- essa é um coluna falsa para controlar a marcação
FROM
ContasReceber |
Trouxe essa coluna "falsa", para evitar ter que dar edit e post no banco a cada registro que eu selecionar.
Agora restou a duvida. Como marcar?
Via banco de dados seria algo assim
Código: |
edit;
(Sender as TDBGrid).DataSource.Dataset.FieldByName('MARCADO').AsString :=
IfThen((Sender as TDBGrid).DataSource.Dataset.FieldByName('MARCADO').AsString = 'S', 'N', 'S');
post; |
|
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Sex Set 15, 2017 8:57 am Assunto: |
|
|
você atualiza pelo ClientDataSet, usando o edit e post, porém não utiliza o ApplyUpdates |
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Sex Set 15, 2017 10:49 am Assunto: |
|
|
Sem interação com o banco de dados não tem como marcar e desmarcar esse campo né?
Me evitaria um bom trabalho. |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Sex Set 15, 2017 11:52 am Assunto: |
|
|
Daria pra utilizar apenas o ClientDataSet sem nenhuma ligação com a query, mas ai você teria que passar registro por registro (acredito que a função de clone do ClientDataSet funcione apenas para outro ClientDataSet), o que dependendo da quantidade de registros faça com que o método fique bem demorado. |
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Sex Set 15, 2017 1:34 pm Assunto: |
|
|
Pois é.
Não queria ter que usar datasetprovider e clientdataset para essa rotina, pois terei que alterar outras partes do sistema só por isso.
Dar 1.000 edits e posts é preocupante, por outro lado será feito apenas 1x por mês, no fechamento do convenio.
Decisão dificil, vou dar uma pensada.
Obrigado pelas dicas. |
|
Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
|
Voltar ao Topo |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Sex Set 15, 2017 7:17 pm Assunto: |
|
|
Olá natanbh1.
O listview seria uma opção, mas seria mais trabalhoso configurá-lo.
Fiz um select com um campo falso, mas mesmo sem esse campo na tabela, não fujo do edit e post.
Minha conclusão é que vou precisar usar o datasetprovider e o clientdataset.
Já sei fazer as ligações. Minha unica duvida é quanto ao select que trará os dados.
- devo fazer esse select na query ou no clientdataset?
Pergunto pois tenho selects pre-definidos direto no sql da query que recebem os parametros só no momento da pesquisa só quando clico no botão de pesquisa no formulario. |
|
Voltar ao Topo |
|
 |
|