Ir para conteúdo
Fórum Script Brasil
  • 0

Imprimir apenas linhas selecionadas no DBGRID


Guest Dionísio Júnior

Pergunta

Guest Dionísio Júnior

Olá pessoal,

estou com um problema aqui. Já bati cabeça de todas as formas e não consegui ver uma solução. É o seguinte:

Estou desenvolvendo um programa para uma operadora de planos de saúde apenas para verificar quais os beneficiários que foram inativados por inadimplencia e gerar uma notificação pra esses contratos.

Ocorre que não consegui fazer com que gere para uma massa grande, ou então para os contratos que forem selecionados pelo usuário.

No exemplo abaixo:

01.jpg

A seleção está alternada.

No exemplo abaixo:

02.jpg

A seleção está sequencial.

A pergunta é:

De que forma eu poderei imprimir apenas os contratos selecionados???

Não achei nenhuma propriedade do DBGrid que me possibilite trabalhar apenas com as linhas selecionadas.

Alguém poderia me ajudar e dizer como posso imprimir as notificações apenas das linhas selecionadas pelo usuário?

Segue abaixo o código do botão imprimir:

procedure TFrmPrincipal.BtnImprimirClick(Sender: TObject);
var
  i : integer;
begin

    c := DM.Pesquisa_contratos.FieldByName('CONTRATO').AsString;

    with DM.Pesquisa_Parcelas do
      begin
         ParamByName('contrato').AsString := c;
         Open;

         for i := 1 to RecordCount do
           begin
              p := p + FieldByName('MESES').AsString + ', ';
              Next;
           end;
           Close;
      end;

    QRCompositeReport1.Prepare;
    QRCompositeReport1.Preview;
end;

OBS: Na seleção, o usuário pode utilizar tanto o mouse quanto o teclado, usando a tecla shift e as direcionais.

Preciso de ajuda, por favor.

Agradeço a todos.

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Cara, uma coisa que a gente usa aqui no nosso sistema e que funciona muito bem, é uma "coluna de seleção" dentro da tabela. Como funciona:

Navegando pelo Grid, o usuário usa a tecla "ESPAÇO" para selecionar, no nosso exemplo, o cliente. Um asterisco é gravado em um campo do cadastro desse cliente. Vamos supor que esse campo seja "SELECAO". Então, ao clicar na tecla "ESPAÇO", o campo "SELECAO" é preenchido com um asterisco.

Então o usuário vai marcando todos os clientes desejados. Quando ele clica em imprimir, o filtro SQL inclui esse campo SELECAO, assim:

SELECT CAMPOS FROM TABELA WHERE CONDICAO 1 AND CONDICAO 2
.
.
. AND SELECAO = '*'

Quando sair da impressao, lembre-se de desmarcar as seleções.

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

  • 0
Guest Dionísio Júnior

Certo, só que não estou utilizando tabela no DBGrid.

No meu caso, o DBGrid está linkado em uma query simples. Assim, não tem como gravar nada lá!

Link para o comentário
Compartilhar em outros sites

  • 0

Cara, nosso sistema também usa Querys, tanto que no exemplo que te passei o código SQL é inserido em uma das Querys do Form. Esse exemplo só não te serviria se você não pudesse alterar a estrutura da sua base de dados. Caso contrário, serve perfeitamente. Abraço!

Link para o comentário
Compartilhar em outros sites

  • 0
Estou desenvolvendo um programa para uma operadora de planos de saúde apenas para verificar quais os beneficiários que foram inativados por inadimplencia e gerar uma notificação pra esses contratos.

Ocorre que não consegui fazer com que gere para uma massa grande, ou então para os contratos que forem selecionados pelo usuário.

Dionísio Júnior, isto não seria uma outra questão?

A pergunta é:

De que forma eu poderei imprimir apenas os contratos selecionados???

Não achei nenhuma propriedade do DBGrid que me possibilite trabalhar apenas com as linhas selecionadas.

Chegou a verificar no help o que a classe tem a lhe oferecer?

O caminho passa por uma propriedade, da classe TDBGrid, chamada SelectedRows (linhas selecionadas). Nestes tópicos já foram tratadas algumas aplicações dela - dê uma olhada, poderá lhe ser útil futuramente.

Alguém poderia me ajudar e dizer como posso imprimir as notificações apenas das linhas selecionadas pelo usuário?
O procedimento é bem simples. Entretanto, para evitar mal entendidos com o exemplo, seria conveniente que você informasse:

- qual a relação do código do botão imprimir postado. Vejo que você trata de UM contrado, procurando suas parcelas mas pretende imprimir vários contratos;

- qual o nome do dataset em questão (aquele que está ligado ao DBGrid)? Ele está no form ou no datamodule DM?

- já que você está utilizando um TQRComposite, qual o nome do quickreport que listará a seleção?

Adiantando um pouco... , para obter o efeito desejado:

- o dataset ligado ao DBGrid, deverá estar acessível ao form do quickreport que listará a seleção;

- este quickreport terá sua impressão gerenciada via evento OnNeedData e não lhe atribuiremos o dataset na respectiva propriedade;

- neste quickreport deverá ser declarada uma variável indexadora que gerenciará a "navegação" pelos registros selecionados;

...

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Dionísio Júnior
O procedimento é bem simples. Entretanto, para evitar mal entendidos com o exemplo, seria conveniente que você informasse:

- qual a relação do código do botão imprimir postado. Vejo que você trata de UM contrado, procurando suas parcelas mas pretende imprimir vários contratos;

- qual o nome do dataset em questão (aquele que está ligado ao DBGrid)? Ele está no form ou no datamodule DM?

- já que você está utilizando um TQRComposite, qual o nome do quickreport que listará a seleção?

Ok, vamos lá.

1) Quando o usuário do programa clicar em processa, será executado uma query que listará todos os contratos que foram rescindidos na data informada. O usuário selecionará os contratos que deseja imprimir e então clicará no botão "Imprimir Carta de Inativação" para imprimir a carta ao beneficiário que foi inativado.

2) Estou usando o QRCompositeReport porque estou usando dois QR diferentes, um que seria a capa da carta, onde vai o endereço do beneficiário, dados da operadora de plano de saúde, etc, e outro que irá informações do contrato do usuário, o texto informando a rescisão e as parcelas que estavam em atraso. Assim, são dois relatórios diferentes, por isso utilizo o QRCompositeReport para agrupar os dois QR.

3) Não sei se estou fazendo corretamente, mas só consegui fazer com que imprima uma carta de cada vez. Exemplo: O usuário selecionou 5 cartas. Quando ele clica em imprimir, abre a primeira carta, ele imprime e depois fecha o QR para então abrir a 2ª carta automáticamente (loop) e assim sucessivamente até terminar de imprimir todas as cartas.

Encontrei uma possível solução para o problema da seleção de linhas, mas quando ele faz o loop, para fazer a impressão do próximo relatório, acontece um erro.

A solução é a seguinte:

procedure TFrmPrincipal.BtnImprimirClick(Sender: TObject);
var
  idx, i : integer;
  c : String;
begin
  //Verifica as linhas selecionadas
  with DBGrid1.DataSource do
    if DBGrid1.SelectedRows.Count > 0 then
      //loop para impressão das cartas
      for idx := 0 to DBGrid1.SelectedRows.Count -1 do
        begin
           //Adiciona os valores das linhas selecionadas ao dataset
           DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[idx]));
           //limpa variáveis
           p := '';
           c := '';
           //Adiciona a variável "c" o valor da coluna CONTRATO
           c := DataSet.FieldByName('CONTRATO').Value;
           //Pesquisa de parcelas em aberto do contrato selecionado
           with DM.Pesquisa_Parcelas do
             begin
                ParamByName('contrato').AsString := c;
                Open;

                for i := 1 to RecordCount do
                  begin
                     //Aqui adiciona à variável "p", todas as parcelas em aberto do contrato selecionado.
                     //Essa variável é lida pelo QR que contém o texto da carta
                     p := p + FieldByName('MESES').AsString + ', ';
                     Next;
                  end;
                Close;
             end;
           //Abre o QR da carta para impressão
           QRCompositeReport1.Prepare;
           QRCompositeReport1.Preview;
        end;
end;
No QR da capa da carta de inativação, no evento QuickRepBeforePrint adicionei o seguinte código:
procedure TQRCapa_Carta.QuickRepBeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  with FrmPrincipal.DBGrid1.DataSource do
    begin
      QRLabel2.Caption := UpperCase(DataSet.FieldByName('NOME DO CONTRATANTE').AsString);
      QRLabel3.Caption := UpperCase(DataSet.FieldByName('ENDEREÇO').AsString);
      QRLabel4.Caption := UpperCase(DataSet.FieldByName('CEP').AsString) + '   ' + UpperCase(DataSet.FieldByName('CIDADE').AsString);

      QRNome.Caption := UpperCase(DataSet.FieldByName('NOME DO CONTRATANTE').AsString) + ' - Contrato: ' + Dataset.FieldByname('CONTRATO').AsString;
      QREndereco.Caption := UpperCase(DataSet.FieldByName('ENDEREÇO').AsString);
      QRLabel29.Caption := UpperCase(DataSet.FieldByName('CEP').AsString) + '   ' + UpperCase(DataSet.FieldByName('CIDADE').AsString);
    end;
end;
No QR do texto da carta está adicionado o seguinte código:
procedure TQRCartaTexto.QRBand2BeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
var
      c,n,p : String;
begin
  p := '';

  c := FrmPrincipal.DBGrid1.DataSource.DataSet.FIeldByName('CONTRATO').AsString;
  n := FrmPrincipal.DBGrid1.DataSource.DataSet.FieldByName('NOME DO CONTRATANTE').AsString;

  QRLabel9.Caption := UpperCase(n);

  p := FrmPrincipal.p;

  P1 := '                     A presente NOTIFICAÇÃO tem o objetivo de cientificá-lo da rescisão de seu Plano de Assistência à Saúde - ';
  P2 := 'Contrato nº ' + c;
  P3 := ' - contratado com ';
  P4 := 'PRESTADORA DO PLANO DE SAÚDE';
  P5 := ', nos exatos termos da ';
  P6 := 'Lei n. 9.656, de 3 de junho de 1998, destacadamente art.13, inc.II.';
  P7 := '' + #13 + #13 + #13 + '';
  P8 := '                     É que, muito embora devidamente Notificado da inadimplência relativa ao(s) mês(es) de ';
  P9 := p + 'Vossa Senhoria quedou inerte ao implemento do pagamento a que contratualmente estava obrigado, consumando período superior a 60 (sessenta ) dias consecutivos/alternados, nos últimos 12 (doze) meses de contrato.';
  P11 := '                     Ante a tanto, fica Vossa Senhoria Notificado da ocorrência de Rescisão Contratual, colocando-nos a disposição para quaisquer esclarecimentos.';
  P12 := '                     Prezado (a) Sr( a),';
  P10 := '                                   Macapá-AP, ' + FrmPrincipal.DBGrid1.DataSource.DataSet.FieldByName('DATA DA INATIVAÇÃO').AsString;
  P13 := '                     Atenciosamente,';
  P14 := '                     Unimed Macapá';

  Texto1.Lines.Text := P12 + P7 + P1 + P2 + P3 + P4 + P5 + P6 + P7 + P8 + P9 + P7 + P11 + P7 + P10 + P7 + P13 + P7 + P14;

  Texto1.Alignment := taLeftJustify;
end;
A seleção está ok, pois já testei através do ShowMessage. Agora a questão é a seguinte, quando mando imprimir, ele imprime a primeira carta sem problema, já na segunda carta, as parcelas saem ok, mas não aparece os dados do beneficiário, quando ele abre a terceira carta, aparece o seguinte erro:
Project cartas_inadimplencia.exe raised exception class EStringListError with message 'List index out of bounds(2)'. Process stopped. Use step or run to continue'

Alguém poderia me ajudar a resolver esse problema?? Acredito que já falta poucou para resolvermos todo o problema.

Aguardo resposta de alguém.

Link para o comentário
Compartilhar em outros sites

  • 0

Dionísio Júnior, lendo o post anterior e pensando melhor sobre a questão, vejo que usar o QRComposit não cabe no seu caso, porque o objetvo dele é agrupar relatórios (um após o outro). Ele não iria imprimir uma linha detalhe do primeiro, depois uma do segundo, depois a próxima do primeiro, .... Que parece-me é o que você precisa.

Como sugeri antes, há um modo que considero simples de fazer isto. Usa apenas um form de relatório, menos componentes, agrupa e diminui a codificação. Porém, do ponto de vista do desesenho do relatório, o processo não é dos mais elegantes.

Como estou em viajem de trabalho, não tenho tempo para explicar detalhadamente agora - se julgar necessário, volto a postar aqui no fim de semana.

Deixo o link para um exemplo que fiz e coloquei alguns comentários nele que tenho certeza você conseguirá aproveitar se lhe interessar: Relarorio Composto.zip (descompactar e testar para observar o resultado)

Abraços

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...