Selecionar linha no DBGrid em Delphi

SQL Server

Delphi

FastReport

18/09/2019

Olá, este é meu primeiro post no fórum, estou feliz por fazer parte do DevMedia.

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

Gustavo Machado

Curtidas 0

Respostas

Ricardo Araujo

Ricardo Araujo

18/09/2019

Bom dia,

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
Gustavo Machado

Gustavo Machado

18/09/2019

Bom dia,

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
Gustavo Machado

Gustavo Machado

18/09/2019

Acabei de encontrar uma maneira de exibir o relatório pela linha que selecionei, porém por mais que eu selecione mais de uma linha, só é considerada somente a última selecionada e automaticamente é gerada somente uma página do relatório.

    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
Ricardo Araujo

Ricardo Araujo

18/09/2019

Bom dia,

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
Gustavo Machado

Gustavo Machado

18/09/2019

Bom dia,

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
Gustavo Machado

Gustavo Machado

18/09/2019

Bom dia,

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
Ricardo Araujo

Ricardo Araujo

18/09/2019

Boa noite,

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
Gustavo Machado

Gustavo Machado

18/09/2019

Boa noite,

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
Gustavo Machado

Gustavo Machado

18/09/2019

Boa noite,

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
POSTAR