Erro na query
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....
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
Curtidas 0
Respostas
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....
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
07/08/2009
Não concordo com ´elip2008´
Os try finally estão corretos.
Em que linha da sua rotina esta dando o erro?
Os try finally estão corretos.
Em que linha da sua rotina esta dando o erro?
GOSTEI 0
Tchucky
07/08/2009
JA TENTEI DESSA FORMA MAS NAUM DA CERTO ELE FALA Q A TABELA ESTA FECHADA
GOSTEI 0
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;
Q.ParamByName(´ID_ITEM´).AsInteger := dm_loc_item.sq_loc_item.Fields[2].AsInteger;
Q.Open;
GOSTEI 0
Emerson Nascimento
07/08/2009
a tabela [i:5148f8d39e]dm_loc_item.sq_loc_item[/i:5148f8d39e] está aberta ?
GOSTEI 0
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
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
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;
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
07/08/2009
osocram
dessa forma da erro de parametro
ID_LOTE_ESTOQUE not fond
dessa forma da erro de parametro
ID_LOTE_ESTOQUE not fond
GOSTEI 0
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.
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
07/08/2009
bom ele naum deu erro mas tambem naum abre a o fomulario de consulta de lotes...
GOSTEI 0
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!
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
07/08/2009
sempre q eu ativo um parametro ele m fala q a tabela esta fechada...
GOSTEI 0
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;
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
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....
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
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.
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
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
tenho até segunda para entregar isso semao vao m dar um sacode na empresa
GOSTEI 0
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
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
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
07/08/2009
cara esta tudo certo num pq esta acontecendo isso to lascado com isso
GOSTEI 0
Tchucky
07/08/2009
consegui resolver o problema
GOSTEI 0