Fórum Erro na query #373242
07/08/2009
0
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
Curtir tópico
+ 0Posts
07/08/2009
Elip2008
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
07/08/2009
Osocram
Os try finally estão corretos.
Em que linha da sua rotina esta dando o erro?
Gostei + 0
07/08/2009
Tchucky
Gostei + 0
07/08/2009
Tchucky
Q.ParamByName(´ID_ITEM´).AsInteger := dm_loc_item.sq_loc_item.Fields[2].AsInteger;
Q.Open;
Gostei + 0
07/08/2009
Emerson Nascimento
Gostei + 0
07/08/2009
Tchucky
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
07/08/2009
Osocram
Q.ParamByName(´ID_ITEM´).AsInteger := 1
se funcionar o problema esta no dm_loc_item.sq_loc_item.Fields[2].AsInteger;
Gostei + 0
07/08/2009
Tchucky
dessa forma da erro de parametro
ID_LOTE_ESTOQUE not fond
Gostei + 0
07/08/2009
Osocram
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.
Gostei + 0
07/08/2009
Tchucky
Gostei + 0
07/08/2009
Elip2008
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
07/08/2009
Tchucky
Gostei + 0
07/08/2009
Elip2008
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
08/08/2009
Tchucky
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
08/08/2009
Elip2008
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
Clique aqui para fazer login e interagir na Comunidade :)