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

Respondam Qdo Puder (RESOLVIDO ENFIM)


Alessandro

Pergunta

Serei breve...

Tenho um Form chamado fmGerarRelAt :

Clique aqui para ver o Form Gerar Relatório

Preciso que somente os código selecionados apareçam no relatório, e para isso eu coloquei este código no evento OnCreate do Form do Relatório :

procedure TfmRelAt.FormCreate(Sender: TObject);
var Total : Integer;
begin
  Total := 0;
  modProjeto.tbCadAt.First;  
  while not modProjeto.tbCadAt.Eof do 
    begin
     query1.active := false;
     query1.sql.clear;
     query1.sql.add('SELECT Quantidade FROM dbCadAt.db WHERE CodPart = "'+fmGerarRelAt.Lista2.Items.Text+'"');
     query1.active:= true;
     Total := modProjeto.tbCadAtQuantidade.Value + Total;
     modProjeto.tbCadAt.Next;
    end;
     qrLabel5.Caption := inttostr(Total);
end;

fmGerarRelAt : é o nome do Form do Relatório

Lista2 : é o nome da minha ListBox

O problema é que mesmo com esse código, o sistema compila mas acaba trazendo todos os códigos como a vocês podem ver na figura abaixo :

Clique aqui para ver como sai o Relatório

Se alguém tiver alguma sugestão postaí para eu tentar....valeu smile.gif

Link para o comentário
Compartilhar em outros sites

  • Respostas 93
  • Created
  • Última resposta

Top Posters For This Question

Posts Recomendados

  • 0

hummmm.. Cara não sei o porque do erro... Deve ser por causa dos varios OR..

Muda uma coisinha... vai saber né! Estou só chutando ^^

var i:Integer; sWhe:String;
begin
Query1.Close;

sWhe  := 'Select * From dbCadAt.db ';

for i := 0 to Lista2.Items.Count-1 do
begin
if i = 0 then
sWhe := sWhe + 'Where CodPart = :P' + IntToStr(i)
else
sWhe := sWhe + ' or CodPart = :P' + IntToStr(i);
end;

Query1.SQL.Text := sWhe;

ShowMessage(sWhe); <- vamu ver agora...

for i := 0 to Lista2.Items.Count-1 do
begin
Query1.ParamByName('P'+IntToStr(i)).asString := Lista2.Items[i];
end;

end;

Link para o comentário
Compartilhar em outros sites

  • 0

if i = 0 then
  sWhe := sWhe + 'Where CodPart = :P' + IntToStr(i)
else
  sWhe := sWhe + ' or CodPart = :P' + IntToStr(i);
end;
Entendi seu tratamento, fiz os testes e notei que quando eu seleciono apenas 1 ele com certeza entra no if i = 0, se eu clico em gerar e não seleciono nenhum aparecem todos no dbGrid e se são mais de 1 código jogados na lista2, ele entra no else....aparece o ShowMessage :
Select * From dbCadAt.db Where CodPart = :P0 or CodPart = :P1
em seguida gera o erro.... Acho que o or pode estar estranho....tentei jogar and em seu lugar, não deu certo !!! mas não deu erro.... O Resultado do ShowMessage com apenas 1 selecionado é :
Select * From dbCadAt.db Where CodPart = :P0

Link para o comentário
Compartilhar em outros sites

  • 0

Com AND não irá dar certo porque nenhum codigo se repete smile.gif

Como disse não sei o que ta gerando o erro, entaum vamu por testes

não sei se pode, ou se funciona, mas tenta concatenar a senteça SQL: (to sem delphi pra testar)

if i = 0 then
 sWhe := sWhe + 'Where (CodPart = :P' + IntToStr(i) +')'
else
 sWhe := sWhe + ' or (CodPart = :P' + IntToStr(i) + ')';
end;
Agora eu me pergunto: Sera que pode usar OR com o mesmo campo? Hummm... Suspeito que esse seja o erro ^^ Outra tentativa sem OR smile.gif :
if i = 0 then
 sWhe := sWhe + 'Where CodPart IN (:P' + IntToStr(i)
else
 sWhe := sWhe + ', :P' + IntToStr(i);
end;
 sWhe := sWhe + ' )'; //fechando o parenteses antes do showmessage ou query.open ^^

Se não entendeu o IN da uma olhada aqui: http://www.w3schools.com/sql/sql_in.asp

Link para o comentário
Compartilhar em outros sites

  • 0

O IN especifica o valor selecionado, ou seja, o registro não é isso ?!?!

Bom, ele não rolou e o 1º ficou na mesma, só funciona com 1 selecionado....

Analisando ...

Ele sempre vai passar pelo :

if i = 0 then sWhe := sWhe + 'Where (CodPart = :P' + IntToStr(i) +')'

Depois o problema é quando ele vai acumular né?!?!

Tá cruel....estou dando trabalho.... wink.gif

Uma dúvida.....O dbGrid vai aceitar mais de 2 códigos ??? Será que o erro é porque ele não está aceitando dois registros.

Link para o comentário
Compartilhar em outros sites

  • 0

Essa query é um objeto TQuery?

Se for, verifique a propriedade RequestLive e deixe-a false.

É sim !!! só que estava false, mas mudando para TRUE funcionou..... biggrin.gif

SUCESSO s3c...

Agora o que eu seleciono na lista 2 está aparecendo no dbGrid...(somente os selecionados)...

Bom, o código ficou assim :

var i:Integer; sWhe:String;
begin
Query1.Close;

sWhe := 'Select * From dbCadAt.db ';

for i := 0 to Lista2.Items.Count-1 do
begin
if i = 0 then
sWhe := sWhe + 'Where (CodPart = :P' + IntToStr(i) +')'
else
sWhe := sWhe + ' or (CodPart = :P' + IntToStr(i) + ')';
end;


Query1.SQL.Text := sWhe;

ShowMessage(sWhe); //<- vamu ver agora...

for i := 0 to Lista2.Items.Count-1 do
begin
Query1.ParamByName('P'+IntToStr(i)).asString := Lista2.Items[i];
end;
Query1.Open;
fmRelAt := tfmRelAt.Create(application);
fmRelAt.QuickRep1.Preview;
fmRelAt.Release;
end;

Fiz um teste para ver o Relatório mas ainda está chamando tudo, porém o código está redondinho no dbGrid...

Lembra do código que você me passou para mostrar somente o total dos selecionados, pois é....está mostrando somente o total.....ou seja....agora só falta fazer aparecer os benditos da Lista2 no relatório......Será que é possível....senão estou muito satisfeito com o suporte que tive até aqui.....

Link para o comentário
Compartilhar em outros sites

  • 0

É estranho que o RequestLive só funcione em true e não em false.

Para mim costumava acontecer o oposto, ou seja, tinha bancos que quando havia seleção de registros, você tinha que deixar RequestLive=false; daí ele exibia normalmente, mas você não conseguia atualizar o DBGrid.

Bom, agora é com o Corposemalma p/ você ligar o seu relatório à esta query.

A soma das quantidades você pode fazer no loop desta query.

Link para o comentário
Compartilhar em outros sites

  • 0

Então ficou assim, com a ajuda da galera eu tenho o form que irá gerar um relatórório Clique aqui para ver o form

no evento onclick do botão gerar tem o seguinte código :

procedure TfmGerarRelAt.SpeedButton1Click(Sender: TObject);
var i:Integer; sWhe:String;
begin
Query1.Close;

sWhe := 'Select * From dbCadAt.db ';

for i := 0 to Lista2.Items.Count-1 do
begin
if i = 0 then
sWhe := sWhe + 'Where (CodPart = :P' + IntToStr(i) +')'
else
sWhe := sWhe + ' or (CodPart = :P' + IntToStr(i) + ')';
end;

Query1.SQL.Text := sWhe;

ShowMessage(sWhe); //<- vamu ver agora...

for i := 0 to Lista2.Items.Count-1 do
begin
Query1.ParamByName('P'+IntToStr(i)).asString := Lista2.Items[i];
end;
Query1.Open;
fmRelAt := tfmRelAt.Create(application);
fmRelAt.QuickRep1.Preview;
fmRelAt.Release;
end;
end;
Selecionando os código e passando para a Lista2 eles estão temporariamente aparecendo em um dbGrid. No evento oncreate do form do Relatório : Clique aqui para ver o relatório Tem o seguinte código :
procedure TfmRelAt.FormCreate(Sender: TObject);
var i,Total:Integer;
begin
  Total := 0;
  Query1.Close;
  Query1.SQL.Text := 'Select Quantidade From dbCadAt.db Where CodPart = :cod';
   for i := 0 to fmGerarRelAt.Lista2.Items.Count-1 do
     begin
      Query1.ParamByName('cod').asString := fmGerarRelAt.Lista2.Items[i];
      Query1.Open;
      Total := Total + Query1.FieldByName('Quantidade').asInteger;
      Query1.Close;
    end;
   qrLabel5.Caption := IntToStr(Total);
end;

Por fim ficou assim...

1º Eu seleciono códigos e clico em gerar chamando o form do relatório

2º no Total aparece o total dos códigos selecionados mas na relação aparecem todos os código, os selecionados e os não-selecionados.

Portanto o código que o s3c passou e está no oncreate está fiel, pois conta o total somente dos que eu seleciono...

A única coisa agora é fazer com que o relatório imprima de acordo com o que é solicitado. biggrin.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Sim.. esse datasource esta ligado na Query?

Sim, está....

E os campos no relatorios estao apontando para esse DataSource?

Não sei qual a propriedade...seria a do QuickRep1 ?

Vê aí

Seria a propriedade DataSet do QuickRep1 ?

Olha qtos eu selecionei

Se for vê como sai o relatório :

Relatório

Ele está aparecendo o número de vezes referente ao nº de códigos que eu selecionei, porém todos iguais ao primeiro....

Link para o comentário
Compartilhar em outros sites

  • 0

Isso, voce esta fazendo a query e quer buscar os dados dela, então o Relatoria tem que estar apontado para o DataSource ligado a Query (Se ele estiver no DataSource da Tabela, vai trazer todos os valores ^^)

Link para o comentário
Compartilhar em outros sites

  • 0

Estou meio por fora da amarração do Dataset ao relatório porque eu utilizo o evento onNeedData do TQuickRep para imprimir sem precisar ligar Datasets, mas deve ter um furo muito grande para só sair o primeiro registro várias vezes.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.



  • Estatísticas dos Fóruns

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