Erro na query

Delphi

07/08/2009

pessoal estou fazendo uma query para consultar se os item tem lotes ou naum faço essa query a baixo mas quando eu vou abrir o fomulario da consulta de lotes ele fala q a tabela esta fechada

primeiro eu faço a consulta por item eu vejo la os itens no grid quando vou clicar duas vezes no grid para abrir a tela de lotes ele fala q a tabela esta fechada....

abaixo esta a funçao q eu chamo a tela de lotes....



var
 Q : TSQLquery;
begin

     fm_loc_lotes := Tfm_loc_lotes.Create(Application);
     Q := TSQLQuery.Create(nil);
     try

      {$REGION ´Busca no BD a lista dos Lote para item em questão´}

///Q.Close;

    Q.SQLConnection := dm_loc_item.sq_loc_item.SQLConnection;
    Q.SQL.Clear;
    Q.SQL.Add(´    SELECT LE.LOTE                          ´);
    Q.SQL.Add(´         , LE.ID_LOTE_ESTOQUE               ´);
    Q.SQL.Add(´         , LE.VENCIMENTO                    ´);
    Q.SQL.Add(´         , LE.MARCA                         ´);
    Q.SQL.Add(´      FROM LOTE_ESTOQUE LE                  ´);
    Q.SQL.Add(´INNER JOIN ITEM I  ON LE.ID_LOTE_ESTOQUE = I.ID_ITEM´);
    Q.SQL.Add(´     WHERE LE.ID_LOTE_ESTOQUE = :ID_ITEM            ´);
    Q.ParamByName(´ID_LOTE_ESTOQUE´).AsInteger := dm_loc_item.sq_loc_item.Fields[2].AsInteger;
    Q.Open;

     if Q.IsEmpty then// se não existir lotes para o item em questão não exibir a tela de lotes;
      Exit;
      dm_compra.cds_lote_saida.Filtered := False;
      dm_compra.cds_lote_saida.Filter := ´ID_ITEM = ´+dm_Item.sq_item.Fields[0].AsString;
      dm_compra.cds_lote_saida.Filtered := True;

      {$ENDREGION ´Busca no BD a lista dos Lote para item em questão´}

      fm_loc_lotes.ShowModal;

     finally
      FreeAndNil(Q);
      FreeAndNil(fm_lote_movimento);
      end;
end;



Tchucky

Tchucky

Curtidas 0

Respostas

Elip2008

Elip2008

07/08/2009

Olha ela tá sendo distruída
vc dah um try nela
mas d kualker forma no finally ela vai passar
entaum qndo vc executa uma vez ela ela vai ser distruída, liberada da memória
Por isso vai dar o erro da tabela fechada.

var
Q : TSQLquery;
begin

fm_loc_lotes := Tfm_loc_lotes.Create(Application);
Q := TSQLQuery.Create(Self);

Q.SQLConnection := dm_loc_item.sq_loc_item.SQLConnection;
Q.Close;
Q.SQL.Clear;
Q.SQL.Add(´ SELECT LE.LOTE ´);
Q.SQL.Add(´ , LE.ID_LOTE_ESTOQUE ´);
Q.SQL.Add(´ , LE.VENCIMENTO ´);
Q.SQL.Add(´ , LE.MARCA ´);
Q.SQL.Add(´ FROM LOTE_ESTOQUE LE ´);
Q.SQL.Add(´INNER JOIN ITEM I ON LE.ID_LOTE_ESTOQUE = I.ID_ITEM´);
Q.SQL.Add(´ WHERE LE.ID_LOTE_ESTOQUE = :ID_ITEM ´);
Q.ParamByName(´ID_ITEM´).AsInteger := dm_loc_item.sq_loc_item.Fields[2].AsInteger;
Q.Open;

if Q.IsEmpty then// se não existir lotes para o item em questão não exibir a tela de lotes;
Exit;
dm_compra.cds_lote_saida.Filtered := False;
dm_compra.cds_lote_saida.Filter := ´ID_ITEM = ´+dm_Item.sq_item.Fields[0].AsString;
dm_compra.cds_lote_saida.Filtered := True;

{$ENDREGION ´Busca no BD a lista dos Lote para item em questão´}

fm_loc_lotes.ShowModal;
end;

//tenta assim
no onclose vc dah freeanil no seus objetos....


GOSTEI 0
Osocram

Osocram

07/08/2009

Não concordo com ´elip2008´
Os try finally estão corretos.

Em que linha da sua rotina esta dando o erro?


GOSTEI 0
Tchucky

Tchucky

07/08/2009

JA TENTEI DESSA FORMA MAS NAUM DA CERTO ELE FALA Q A TABELA ESTA FECHADA


GOSTEI 0
Tchucky

Tchucky

07/08/2009

esta parendo aqui no parametro

Q.ParamByName(´ID_ITEM´).AsInteger := dm_loc_item.sq_loc_item.Fields[2].AsInteger;
Q.Open;


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

07/08/2009

a tabela [i:5148f8d39e]dm_loc_item.sq_loc_item[/i:5148f8d39e] está aberta ?


GOSTEI 0
Tchucky

Tchucky

07/08/2009

sim esta como eu disse acima eu faço a consulta nesta tabela sq_loc_item
listo os item no dbgrid e ao clicar 2 vezes nele abro o form de lotes dos itens...


mas sempre ele m fala q a tabela esta fechada


GOSTEI 0
Osocram

Osocram

07/08/2009

faz assim p testar
Q.ParamByName(´ID_ITEM´).AsInteger := 1

se funcionar o problema esta no dm_loc_item.sq_loc_item.Fields[2].AsInteger;


esta parendo aqui no parametro Q.ParamByName(´ID_ITEM´).AsInteger := dm_loc_item.sq_loc_item.Fields[2].AsInteger; Q.Open;



GOSTEI 0
Tchucky

Tchucky

07/08/2009

osocram

dessa forma da erro de parametro

ID_LOTE_ESTOQUE not fond


GOSTEI 0
Osocram

Osocram

07/08/2009

Então vamos mudar a abordagem
Q.SQL.Add(´ WHERE LE.ID_LOTE_ESTOQUE = 1 ´);
//Q.ParamByName(´ID_ITEM´).AsInteger := dm_loc_item.sq_loc_item.Fields[2].AsInteger;

so p ter certeza q o prob esta no parametro.

osocram dessa forma da erro de parametro ID_LOTE_ESTOQUE not fond



GOSTEI 0
Tchucky

Tchucky

07/08/2009

bom ele naum deu erro mas tambem naum abre a o fomulario de consulta de lotes...


GOSTEI 0
Elip2008

Elip2008

07/08/2009

tenta criando o parâmetro, talvez funcione.

var
Q : TSQLquery;
begin

fm_loc_lotes := Tfm_loc_lotes.Create(Application);
Q := TSQLQuery.Create(nil);
try

{$REGION ´Busca no BD a lista dos Lote para item em questão´}

///Q.Close;

Q.SQLConnection := dm_loc_item.sq_loc_item.SQLConnection;
Q.SQL.Clear;
Q.SQL.Params.CreateParam(ftInteger, ´ID_ITEM´, ptInput);
Q.SQL.Add(´ SELECT LE.LOTE ´);
Q.SQL.Add(´ , LE.ID_LOTE_ESTOQUE ´);
Q.SQL.Add(´ , LE.VENCIMENTO ´);
Q.SQL.Add(´ , LE.MARCA ´);
Q.SQL.Add(´ FROM LOTE_ESTOQUE LE ´);
Q.SQL.Add(´INNER JOIN ITEM I ON LE.ID_LOTE_ESTOQUE = I.ID_ITEM´);
Q.SQL.Add(´ WHERE LE.ID_LOTE_ESTOQUE = :ID_ITEM ´);
Q.ParamByName(´ID_ITEM´).AsInteger := dm_loc_item.sq_loc_item.Fields[2].AsInteger;
Q.Open;

if Q.IsEmpty then// se não existir lotes para o item em questão não exibir a tela de lotes;
Exit;
dm_compra.cds_lote_saida.Filtered := False;
dm_compra.cds_lote_saida.Filter := ´ID_ITEM = ´+dm_Item.sq_item.Fields[0].AsString;
dm_compra.cds_lote_saida.Filtered := True;

{$ENDREGION ´Busca no BD a lista dos Lote para item em questão´}

fm_loc_lotes.ShowModal;

finally
FreeAndNil(Q);
FreeAndNil(fm_lote_movimento);
end;
end;

Abs!


GOSTEI 0
Tchucky

Tchucky

07/08/2009

sempre q eu ativo um parametro ele m fala q a tabela esta fechada...


GOSTEI 0
Elip2008

Elip2008

07/08/2009

if Q.IsEmpty then// se não existir lotes para o item em questão não exibir a tela de lotes;
Exit;
dm_compra.cds_lote_saida.Filtered := False;
dm_compra.cds_lote_saida.Filter := ´ID_ITEM = ´+dm_Item.sq_item.Fields[0].AsString;
dm_compra.cds_lote_saida.Filtered := True;

{$ENDREGION ´Busca no BD a lista dos Lote para item em questão´}

fm_loc_lotes.ShowModal;//se form d lotes não pd ser exibido

se fm_loc_lotes for o formulario de lotes e não pode ser exibido tenta por o codigo assim:

if not Q.isEmpty then
begin
frm_loc_lotes.ShowModal;
end else
begin
Exit;
dm_compra.cds_lote_saida.Filtered := False;
dm_compra.cds_lote_saida.Filter := ´ID_ITEM = ´+dm_Item.sq_item.Fields[0].AsString;
dm_compra.cds_lote_saida.Filtered := True;
end;


GOSTEI 0
Tchucky

Tchucky

07/08/2009

elip2008

eu preciso do parametro da consulta sql para dizer qual lote pertence a qual item


eu ja fis teste so dando um select normal para a consulta e funciona mas preciso do parametro para quando eu clicar no item mostrar os lotes a qual ele pertence....


GOSTEI 0
Elip2008

Elip2008

07/08/2009

Fiz alguns testes aki, com a query criada automaticamente, no meu caso precisei criar o parametro. ela naum kis funcionar sem criar o paramentro assim: Q.Params.CreateParam(...);

Se você estiver utilizando ClientDataSet, acredito q vc tenha q fechá-lo
antes de passar os paramentros de filtra-los, pois eles trabalhos com dados em memória.


GOSTEI 0
Tchucky

Tchucky

07/08/2009

eu ja fiz de tudo e ainda fala q a tabela esta fechada....

tenho até segunda para entregar isso semao vao m dar um sacode na empresa


GOSTEI 0
Tchucky

Tchucky

07/08/2009

pessoal fiz dessa forma agora ele abre o form mas m mostra o dbgrid desativado ainda

mas pelo menos ele esta abrindo o form ja é um bom começo agora falra filtrar os dados la no outro form

var
 Q : TSQLquery;
begin
  fm_loc_lotes := Tfm_loc_lotes.Create(Application);

  Q := TSQLQuery.Create(nil);
  try
{$REGION ´Busca no BD a lista dos Lote para item em questão´}
   Q.Close;
   Q.SQLConnection := dm_loc_item.sq_loc_item.SQLConnection;
   Q.SQL.Add(´    SELECT LE.LOTE                          ´);
   Q.SQL.Add(´         , LE.ID_LOTE_ESTOQUE               ´);
   Q.SQL.Add(´         , LE.VENCIMENTO                    ´);
   Q.SQL.Add(´         , LE.MARCA                         ´);
   Q.SQL.Add(´      FROM LOTE_ESTOQUE LE                  ´);
   Q.SQL.Add(´INNER JOIN ITEM I  ON LE.FK_ID_ITEM = I.ID_ITEM´);
   Q.SQL.Add(´     WHERE LE.FK_ID_ITEM = I.ID_ITEM        ´);
   Q.Open;

    if Q.IsEmpty then// se não existir lotes para o item em questão não exibir a tela de lotes;
      Exit;
  //    dm_loc_item.cds_lote.Filtered := False;
   //   dm_loc_item.cds_lote.Filter := ´FK_ID_ITEM = ´+dm_loc_item.sq_loc_item.Fields[2].AsString;
   //   dm_loc_item.cds_lote.Filtered := True;
{$ENDREGION ´Busca no BD a lista dos Lote para item em questão´}
      fm_loc_lotes.ShowModal;

     finally
      FreeAndNil(Q);
      FreeAndNil(fm_loc_lotes);
  end;
end;



GOSTEI 0
Elip2008

Elip2008

07/08/2009

Verifica se a proprieda datasource do dbgrid está ligada ow se o seu datamodule não está no available form. muitas vezes acontece passar para o available form por engano. Olha se não tem um codigo desabilitando o dbgrid.


GOSTEI 0
Tchucky

Tchucky

07/08/2009

cara esta tudo certo num pq esta acontecendo isso to lascado com isso


GOSTEI 0
Tchucky

Tchucky

07/08/2009

consegui resolver o problema


GOSTEI 0
POSTAR