Fórum Selecionar linha no DBGrid em Delphi #605457
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
Curtir tópico
+ 0Posts
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.
Gostei + 0
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.
Gostei + 0
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;
Gostei + 0
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 ?
Gostei + 0
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.
Gostei + 0
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.
Gostei + 0
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.....
Gostei + 0
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;
Gostei + 0
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)