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

No onclink do botao que chama o relatorio

Acho que o código do s3c ta ok...

é só colocar no botao que chama o relatorio, mas lembra de apontar o relatorio para a QUERY

funciona mais ou menos assim:

Ele adiciona o Select e tal....

e para cada linha da lista2 adiciona as selecao, pra primeira linha (item 0 ele adiciona junto o where, e para as outras ele adiciona o comando OR de SQL)

var i:Integer; sWhe:String;
begin
Query1.Close;
Query1.clear;
Query1.SQL.Text := 'Select * From Tabela ';

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

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

Query1.Open;

//chama o relatorio aqui

end;

Link para o comentário
Compartilhar em outros sites

  • 0
Guest - Everton -
var i:Integer; sIn:String;
begin
    
  sIn := '';  

  for i := 0 to Lista2.Items.Count-1 do
  begin 
    sIN := sIN + ' " ' + Lista2.Items[i] + ' " ';    
    if ( i <> Lista2.Items.Count-1) then
      sIN := sIN + ','; 
  end;

  Query1.Close;
  Query1.clear;
  Query1.SQL.Add('Select * From Tabela ');

  if Lista2.Items.Count > 0 then
     Query1.SQL.Add('Where CodPart in (' + sIN + ')');

  Query1.Open;

  //chama o relatorio aqui
end;

Link para o comentário
Compartilhar em outros sites

  • 0

1º Utilizei o código feito pelo s3c e deu erro na linha :

Query1.clear;

Então eu tirei esta parte e ele compilou...

2º Deu este erro :

Clique aqui para ver o Erro

Coloquei uma Query e um DataSource no Form das duas listas e ficou a seguinte dúvida :

Quando o Corposemalma diz :

...é só colocar no botao que chama o relatorio, mas lembra de apontar o relatorio para a QUERY.

Eu aponto o relatório para query dessa forma :

Clica aqui para ver como eu apontei

Tentei de várias formas mas o erro persistiu.....

ahh, o código do éverton compilou sem o Query1.clear e não deu erro ao clicar no botão, mas não obtive o resultado...

Resumindo ...

meu código ficou assim :

No evento Onclick do botão "Gerar" (onde estão as duas listas)

procedure TfmGerarRelAt.btnGerarClick(Sender: TObject);
var i:Integer; sWhe:String;
begin
Query1.Close;
//Query1.clear;
Query1.SQL.Text := 'Select * From dbCadAt.db ';

for i := 0 to Lista2.Items.Count-1 do
  if i = 0 then
   sWhe := 'Where CodPart = :P' + IntToStr(i)
  else
    sWhe := sWhe + ' or CodPart = :P' + IntToStr(i);
    Query1.SQL.Add(sWhe);
  for i := 0 to Lista2.Items.Count-1 do
    Query1.ParamByName('P'+IntToStr(i)).asString := Lista2.Items[i];
    Query1.Open;
   //chama o relatorio aqui
    fmRelAt := tfmRelAt.create(application);
    fmRelAt.QuickRep1.Preview;
    fmRelAt.Release;
end;

Ps. mó chatão eu...... wink.gif

Link para o comentário
Compartilhar em outros sites

  • 0

erro meu o clear tongue.gif

o erro dá ao gerar o relatório? Vamos fazer um teste....

utilize esse codigo:

procedure TfmGerarRelAt.btnGerarClick(Sender: TObject);
var i:Integer; sWhe:String;
begin

Query1.Close;
Query1.SQL.Text := 'Select * From dbCadAt.db Where ';

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

Query1.SQL.Add(sWhe);

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

   Query1.Open;

end;

e coloque um DBgrid nesse mesmo form apontando para essa query.... e veja qual o resultado ele vai mostrar wink.gif não chame o relatorio ainda

Link para o comentário
Compartilhar em outros sites

  • 0

Confirmando, você quer que eu faça isso :

Clique aqui para ver o Form com dbGrid

O fonte :

Clique aqui para ver a Unit

Criei o dbGrid e apontei para Query...deu o mesmo erro :

Clique aqui para ver o Erro

Ps(Livro).O cruel é que eu aprendi muito pouco sobre os conceitos do Delphi na facul, 99% do que sei hj foi autodidata, comprei livro e perguntei aqui no forum, eu manjo de lógica pois me dou mais com Java...lá eu entendo essas coisas de "parâmetros, instâncias,métodos...até porque eu fiquei 1 ano só na unha...", no delphi eu tive só uma pincelada.....sabe como é faculdade.....mas pode deixar que td serve como estímulo....penso em fazer um curso bom de delphi....este sisteminha que estou fazendo é para uso de duas pessoas, eu e meu companheiro de trabalho....da mesma forma que vocês me passam informação eu passo pra ele....e assim a gente vai mexendo nessa ferramenta que é o DELPHI hehehe... smile.gif

Link para o comentário
Compartilhar em outros sites

  • 0

1º Utilizei o código feito pelo s3c e deu erro na linha :

Query1.clear;

Olha eu me intrometendo também!! O certo não seria: Query1.Sql.Clear;

Agora, quanto ao erro eu nem sei o que dizer...

Por acaso esse erro aqui foi sanado?

Link para o comentário
Compartilhar em outros sites

  • 0

Caro colega, conforme a imagem postada, sua Lista2 está vazia e com o código iniciando em: Query1.SQL.Text := 'Select * From dbCadAt.db Where ';

você não terá nenhum parâmetro na cláusula Where e certamente quando for executando Query1.Open dará um erro.

Link para o comentário
Compartilhar em outros sites

  • 0

Outra coisa, na consulta não se deve colocar a extensão da tabela, somente o nome dela (pelo menos é assim que eu faço), o certo não seria:

Query1.SQL.Text := 'Select * From dbCadAt Where...'

Link para o comentário
Compartilhar em outros sites

  • 0

Por acaso esse erro aqui foi sanado?

Sim, Arlon...estou fazendo um teste com o corposemalma para ver se aparece no dbGrid.....agora eu tirei o WHERE pois não estava passando nenhum parametro....

sc3 foi mal cara, seu código não tinha esse Where, agora está somente :

'Select * From dbCadAt.db'

Por fim o resultado não está sendo como o corposemalma previa...q é aparecer no dbGrid....dá este erro aqui :

Erro

Por fim o código está assim :

var i:Integer; sWhe:String;
begin
Query1.Close;
Query1.SQL.Text := 'Select * From dbCadAt.db';
for i := 0 to Lista2.Items.Count-1 do
begin
if i = 0 then
  sWhe := 'CodPart = :P' + IntToStr(i)
else
  sWhe := sWhe + ' or CodPart = :P' + IntToStr(i);
end;

Query1.SQL.Add(sWhe);

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;

wink.gif

PS.Desculpe-me pelo deslize....

Link para o comentário
Compartilhar em outros sites

  • 0

na verdade o deslize foi meu.. eu que passei o where pra cima e não pensei na possibilidade da lista2 estar vazia ^^

var i:Integer; sWhe:String;
begin
Query1.Close;
Query1.SQL.Text := 'Select * From dbCadAt.db ';
for i := 0 to Lista2.Items.Count-1 do
begin
if i = 0 then
 sWhe := 'Where CodPart = :P' + IntToStr(i)
else
 sWhe := sWhe + ' or CodPart = :P' + IntToStr(i);
end;

Query1.SQL.Add(sWhe);

//um teste a mais:

ShowMessage(sWhe); //deve mostrar a senteça Where do Sql (não estou certo de que o showmessage funciona, use qualquer sistema de mensagem ou um label.text mesmo;) )

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; 

Link para o comentário
Compartilhar em outros sites

  • 0

Desculpe...mas eu não conhecia este comando é:

break-point???

Bom, eu coloquei abaixo do showMessage o compilador

break-point
apontou o erro para o for.

Coloquei o "ponto e virgula ;" e o compilador apontou o erro para o comando break-point;

Não chegou a passar disso....

Link para o comentário
Compartilhar em outros sites

  • 0

Break-point é um ponto de parada quando você debuga o programa.

Vá até a linha do For após o ShowMessage.

Tecle F5 nessa linha.

Tecle F9, o programa começará a executar.

Após o ShowMessage, ele pára na linha do For.

Continue executando passo a passo teclando F8.

Link para o comentário
Compartilhar em outros sites

  • 0

blink.gif daaaard....hehe....foi mal s3c...agora entendi...

Fiz td isso, pressionei o F5 no for abaixo do showMessage e compilei...

Selecionei 3 códigos para a Lista para aparecer no relatório...

Depois que cliquei em gerar ele retornou para o código e eu fui pressionando o F8...

Reparei que o compilador entrou 3 vezes no for, ou seja, foi o nº de códigos que solicitei....

Depois deu erro....

Imagem do Break-Point

Imagem do compilador saido do for

Imagem do compilador saindo do for e dando o erro

huh.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Só p/ teste. Após a linha

Query1.SQL.Text := 'Select * From dbCadAt.db ';

Coloque:

Query1.Open;

Digite F5 nesta útilma linha.

Digite F9.

Quando ele parar em Query1.Open, digite F8 e veja se ele vai p/ próxima linha sem dar erro.

Depois retire a linha Query1.Open

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, retire o Query1.Open inserido anteriormente.

Limpe todos os break-points(F5).

Vá na linha do Query1.Open após o For.

Digite F5.

Digite F9.

Quando parar no Query1.Open, digite F8 e veja se dá erro ou passa para a linha seguinte.

Link para o comentário
Compartilhar em outros sites

  • 0

Então, seu código está redondo até o quey1.open;

Ele passa pelo 1º for, pelo show message, pelo 2º for e quando chega no Query1.open...eu pressiono F8 na linha Break-Point e então mostra aquele erro...depois a tela aponta para o código que eu chamo o form Gerar Relatório (Esse que a gente está trabalhando)... wink.gif

Vê se isso ajuda.....é o showMessage :

Imagem do que aparece no showMessage

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,2k
×
×
  • Criar Novo...