ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Imprimir apenas linhas selecionadas no DBGRID

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
tecjuniorap
Novato
Novato


Registrado: Terça-Feira, 9 de Setembro de 2008
Mensagens: 6

MensagemEnviada: Ter Set 09, 2008 4:11 pm    Assunto: Imprimir apenas linhas selecionadas no DBGRID Responder com Citação

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:


A seleção está alternada.

No exemplo abaixo:


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:

Código:

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.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tecjuniorap
Novato
Novato


Registrado: Terça-Feira, 9 de Setembro de 2008
Mensagens: 6

MensagemEnviada: Ter Set 09, 2008 5:42 pm    Assunto: Responder com Citação

Será q ninguém tem uma solução pra esse problema???
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Ter Set 09, 2008 6:04 pm    Assunto: Responder com Citação

Código:
procedure TForm1.BtnImprimirClick(Sender: TObject);
var
  I : Integer;
begin
  I := DBGrid1.SelectedRows.Count;
  if I < 1 then
  begin
    DBGrid1.SelectedRows.CurrentRowSelected := True;
    I := DBGrid1.SelectedRows.Count;
  end;

  for I := 0 to I -1 do
  begin
    DM.Pesquisa_Parcelas.GotoBookmark(Pointer(DBGrid1.SelectedRows[I]));
    //Imprime Aki
    ShowMessage('Linha: '+IntToStr(DM.Pesquisa_Parcelas.RecNo) +'  '+ DM.Pesquisa_Parcelas.FieldByName('MESES').AsString);
  end;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tecjuniorap
Novato
Novato


Registrado: Terça-Feira, 9 de Setembro de 2008
Mensagens: 6

MensagemEnviada: Qua Set 10, 2008 11:17 am    Assunto: Beleza... Responder com Citação

Beleza gilsonrodrigues, essa sua solução não é o que eu quero, mas ela me abriu uma luz, que me fez desenvolver uma outra solução. Vou descrever abaixo melhor todo o processo que o programa faz:

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:

Código:

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:

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:

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:

Código:

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.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qua Set 10, 2008 2:46 pm    Assunto: Responder com Citação

para imprimir ou não os registros da query coloque este código no evento OnBeforePrint da banda DatailBand:

Código:
procedure TfrmCadCli.DetailBand1BeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
begin
    PrintBand := dbGridTab.SelectedRows.CurrentRowSelected;
end;


isso já deve resolver.
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB