 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
tecjuniorap Novato

Registrado: Terça-Feira, 9 de Setembro de 2008 Mensagens: 6
|
Enviada: Ter Set 09, 2008 4:11 pm Assunto: Imprimir apenas linhas selecionadas no DBGRID |
|
|
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 |
|
 |
tecjuniorap Novato

Registrado: Terça-Feira, 9 de Setembro de 2008 Mensagens: 6
|
Enviada: Ter Set 09, 2008 5:42 pm Assunto: |
|
|
| Será q ninguém tem uma solução pra esse problema??? |
|
| Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Ter Set 09, 2008 6:04 pm Assunto: |
|
|
| 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 |
|
 |
tecjuniorap Novato

Registrado: Terça-Feira, 9 de Setembro de 2008 Mensagens: 6
|
Enviada: Qua Set 10, 2008 11:17 am Assunto: Beleza... |
|
|
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 |
|
 |
pestana Colaborador

Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qua Set 10, 2008 2:46 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|