Selecionar linha no DBGrid em Delphi
18/09/2019
0
Sou iniciante em Delphi e gostaria de saber se tem uma maneira de eu selecionar uma linha ou várias no DBGrid e com um botão ele exibir o relatório do FastReport somente das linhas que selecionei.
Gustavo Machado
Posts
19/09/2019
Ricardo Araujo
Existem um jeito de selecionar as linha, só que, quando form gerar o relatório terá que fazer um tratamento para imprimir somente a seleção dos registros selecionando via dbgrid.
no dbgrid, existe uma propriedade chamado options - > dgRowSelect, procurar ai e testa qualquer coisa me avise.
19/09/2019
Gustavo Machado
Existem um jeito de selecionar as linha, só que, quando form gerar o relatório terá que fazer um tratamento para imprimir somente a seleção dos registros selecionando via dbgrid.
no dbgrid, existe uma propriedade chamado options - > dgRowSelect, procurar ai e testa qualquer coisa me avise.
Bom dia Ricardo,
Já encontrei a maneira de selecionar as linhas, porém não encontro uma maneira de exibir os relatórios pelos registros que foram selecionados no DBGrid.
19/09/2019
Gustavo Machado
var idx: integer; c: String; begin with DBGrid1.DataSource do if DBGrid1.SelectedRows.Count > 0 then for idx := 0 to DBGrid1.SelectedRows.Count -1 do begin DataSet.GotoBookmark((DBGrid1.SelectedRows.Items[idx])); c := ''; c := DataSet.FieldByName('NumeroNF').Value; end;
19/09/2019
Ricardo Araujo
Neste caso, terá que trabalhar com ClientDataSet em Runtime, os arquivo selecionando você vai adicionando num clientDataSet vazio, e quando terminar de adicionar visualizar os dados selecionandos, entendeu ?
19/09/2019
Gustavo Machado
Neste caso, terá que trabalhar com ClientDataSet em Runtime, os arquivo selecionando você vai adicionando num clientDataSet vazio, e quando terminar de adicionar visualizar os dados selecionandos, entendeu ?
Entendi sim, vou fazer aqui e vou ver qual o resultado.
24/09/2019
Gustavo Machado
Neste caso, terá que trabalhar com ClientDataSet em Runtime, os arquivo selecionando você vai adicionando num clientDataSet vazio, e quando terminar de adicionar visualizar os dados selecionandos, entendeu ?
Entendi sim, vou fazer aqui e vou ver qual o resultado.
Bom dia,
Desculpem a demora, fiquei um tempo sem trabalhar nesse projeto, mas agora que voltei a desenvolve-lo tentei fazer o que o Ricardo me sugeriu, então criei o DataSet, fiz um LiveBinding com um StringGrid pois o mesmo é mais fácil de manipular, pelo menos pelo que eu percebi, mas quando eu tento inserir o campo booleano o Delphi apresenta dois erros conforme imagens:
https://drive.google.com/file/d/1266MuQ6HwPGu3Qh3k9xb93fgWVBAgurl/view
https://drive.google.com/file/d/1egaAW5QKfKsR2lzuhd53FUDtqQDNA2uD/view
O conteúdo do erro maior é esse:
https://drive.google.com/file/d/1nrABa9xnU8Lp-usGtnpYKGgJoLGm1Cwj/view
Se puderem me esclarecer o que tem de errado no meu projeto eu agradeço imensamente.
24/09/2019
Ricardo Araujo
com LiveBinding e não sei como fazer, eu sei fazer usando um ClientDataSet e um DataSet, criando os campos e passsando os arquivos direto, se eu pode ajudar de outra forma, estou a disposição, blz.....
30/09/2019
Gustavo Machado
com LiveBinding e não sei como fazer, eu sei fazer usando um ClientDataSet e um DataSet, criando os campos e passsando os arquivos direto, se eu pode ajudar de outra forma, estou a disposição, blz.....
Bom dia,
Após um bom tempo quebrando a cabeça consegui fazer da maneira que o Ricardo recomendou...
//PROCEDIMENTO QUE INSERE OS CHECKBOXES NO DBGRID procedure TfrmPrincipal.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); Var Check: Integer; R: TRect; begin if Column.FieldName = 'Imprimir' then begin DBGrid1.Canvas.FillRect(Rect); Check := 0; if uDataModule.ModuloSQL.cdsRuntimeImprimir.AsBoolean = true then Check := DFCS_CHECKED else Check := 0; R:=Rect; InflateRect(R,-2,-2); DBCheckBox1.Caption := ''; DrawFrameControl(DBGrid1.Canvas.Handle,R,DFC_BUTTON, DFCS_BUTTONCHECK or Check); end; end;
//IMPRIMIR LINHA SELECIONADA SELECIONADA procedure TfrmPrincipal.DBGrid1TitleClick(Column: TColumn); var I: integer; begin if Column.Title.Caption = 'Imprimir' then begin ModuloSQL.cdsRuntime.First; while not ModuloSQL.cdsRuntime.Eof do begin if (ModuloSQL.cdsRuntimeImprimir.AsBoolean = false) and (DBGrid1.SelectedIndex = 0) then for I:= 0 to ModuloSQL.cdsRuntime.RecordCount - 1 do begin ModuloSQL.cdsRuntime.Edit; ModuloSQL.cdsRuntimeImprimir.AsBoolean := true; ModuloSQL.cdsRuntime.Post; ModuloSQL.cdsRuntime.Next; end else if (ModuloSQL.cdsRuntimeImprimir.AsBoolean = true) and (DBGrid1.SelectedIndex = 0) then for I:= 0 to ModuloSQL.cdsRuntime.RecordCount - 1 do begin ModuloSQL.cdsRuntime.Edit; ModuloSQL.cdsRuntimeImprimir.AsBoolean := false; ModuloSQL.cdsRuntime.Post; ModuloSQL.cdsRuntime.Next; end; end; end; end;
procedure TfrmPrincipal.DBGrid1ColExit(Sender: TObject); begin if DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField then DBCheckBox1.Visible := False; end;
//PROCEDIMENTO PARA MARCAR OU DESMARCAR OS CHECKBOX NO DBGRID procedure TfrmPrincipal.DBGrid1CellClick(Column: TColumn); begin ModuloSQL.cdsRuntime.Edit; if (ModuloSQL.cdsRuntimeImprimir.AsBoolean = false) and (DBGrid1.SelectedIndex = 0) then ModuloSQL.cdsRuntimeImprimir.AsBoolean := true else if (ModuloSQL.cdsRuntimeImprimir.AsBoolean = true) and (DBGrid1.SelectedIndex = 0) then ModuloSQL.cdsRuntimeImprimir.AsBoolean := false; uDataModule.ModuloSQL.cdsRuntime.Post; end;
procedure TfrmPrincipal.btnImprimirClick(Sender: TObject); var I: Integer; begin //FILTRA O CLIENTDATASET ATRAVÉS DOS CHECKBOXES MARCADOS NO DBGRID ModuloSQL.cdsRuntime.Filtered:= False; ModuloSQL.cdsRuntime.Filter:= 'Imprimir = ' + BoolToStr(True); ModuloSQL.cdsRuntime.Filtered:= True; ModuloSQL.cdsRuntime.First; //ENVIA OS REGISTROS SELECIONADOS PARA IMPRESSÃO while not ModuloSQL.cdsRuntime.Eof do begin for I := 1 to ModuloSQL.cdsRuntimeEtiquetas.AsInteger do begin frmEtiqueta.frxReport1.PrintOptions.Printer:= cbbImpressoras.Text; frmEtiqueta.frxReport1.PrintOptions.ShowDialog:= False; frmEtiqueta.frxReport1.PrepareReport; frmEtiqueta.frxReport1.Print; end; ModuloSQL.cdsRuntime.Next; end; if ModuloSQL.cdsRuntime.RecordCount = 0 then ShowMessage('Nenhum registro selecionado para impressão'); ModuloSQL.cdsRuntime.Filtered:= False; edtNumeroNF.Clear; edtNumeroNF.SetFocus; end;
procedure TfrmPrincipal.btnBuscarClick(Sender: TObject); begin //SELECT NA QUERY PARA POPULAR DATASET begin //CASO ENCONTRE ALGUM REGISTRO, ESVAZIA E DEPOIS POPULA NO //CLIENTDATASET(cdsRuntime) begin ModuloSQL.cdsRuntime.EmptyDataSet; ModuloSQL.Query.First; while not ModuloSQL.Query.Eof do begin ModuloSQL.cdsRuntime.Append; ModuloSQL.cdsRuntimeImprimir.AsBoolean:= True; ModuloSQL.cdsRuntimeCodCliente.AsString:= ModuloSQL.Query['CAMPO1']; ModuloSQL.cdsRuntimeNomeCliente.AsString:= ModuloSQL.Query['CAMPO2']; ModuloSQL.cdsRuntimeCodItem.AsString:= ModuloSQL.Query['CAMPO3']; ModuloSQL.cdsRuntimeNomeItem.AsString:= ModuloSQL.Query['CAMPO4']; ModuloSQL.cdsRuntimeNumeroNF.AsString:= ModuloSQL.Query['CAMPO5']; ModuloSQL.cdsRuntimeDataEmissao.AsString:= ModuloSQL.Query['CAMPO6']; ModuloSQL.cdsRuntimeUnidade.AsString:= ModuloSQL.Query['CAMPO7']; ModuloSQL.cdsRuntimeQuantidade.AsString:= ModuloSQL.Query['CAMPO8']; ModuloSQL.cdsRuntimeEtiquetas.AsInteger:= 1; ModuloSQL.cdsRuntime.Post; ModuloSQL.Query.Next; end; DBGrid1.Show; btnImprimir.Enabled:= true; cbbImpressoras.Enabled:= true; end; end; end;
30/09/2019
Gustavo Machado
com LiveBinding e não sei como fazer, eu sei fazer usando um ClientDataSet e um DataSet, criando os campos e passsando os arquivos direto, se eu pode ajudar de outra forma, estou a disposição, blz.....
Conforme podem ver, no meu código eu desenhei os checkboxes, fiz uma consulta em uma Query e depois peguei os resultados da consulta e mandei para um ClientDataSet, onde o mesmo pode ser manipulado através do DBGrid, diferente do meu banco de dados.
Clique aqui para fazer login e interagir na Comunidade :)