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

Sql Trava O Programa


Kindelis

Pergunta

é o seguinte eu tenho 3 tabelas: carro, produto e carroxprod, onde tem vários vêículos cadastrados e produtos e na tabela carroxprod eu faço o relacionamento entre essas duas tabelas para mostrar em uma consulta quais produtos são compatíveis com determinado carro, e para os produtos que são compatíveis com todos os carros eu mando salvar no campo carro da tabela carroxprod o codigo "0" ai para fazer a consulta eu utilizei a seguinte sql:

var aspa:string;

begin

aspa:='''';

qrprod.close;

qrprod.sql.Clear;

qrprod.sql.add('select P.Cod_prod, P.Cod_cat, P.Descricao, P.Preco_venda, P.Qtd_disp, F.Nome, CT.Categoria, C.Cod_car, Foto');

qrprod.sql.add('from carro.db as C, carroxprod.db as R, produtos.db as P, fornecedor.db as F, categoria.db as CT, montadora as M, veiculo as V');

qrprod.sql.add('where P.Categoria=CT.Cod_cat and P.Forn_cat=F.Cod_forn and C.Cod_car=R.Cod_carro and P.Cod_prod=R.Cod_prod and C.montadora=M.Cod_Montadora and C.Veiculo=V.Cod_veiculo and C.Montadora='+aspa+Edit1.Text+aspa+' ');

qrprod.SQL.Add('or R.Cod_carro=''0'' and P.Categoria=CT.Cod_cat and P.Forn_cat=F.Cod_forn and P.Cod_prod=R.Cod_prod and C.montadora=M.Cod_Montadora and C.Veiculo=V.Cod_veiculo and C.Montadora='+aspa+Edit1.Text+aspa+'');

qrprod.open;

qrprod.Active;

end;

porém quando eu mando executar esta consulta o programa fica uns 2 minutos pensando para dar a resposta ou então ele trava e fala que não tem espaço sulficiente em disco (não sei por que), porém se eu tirar a linha onde começa o "or" a consulta funciona normal:

var aspa:string;

begin

aspa:='''';

qrprod.close;

qrprod.sql.Clear;

qrprod.sql.add('select P.Cod_prod, P.Cod_cat, P.Descricao, P.Preco_venda, P.Qtd_disp, F.Nome, CT.Categoria, C.Cod_car, Foto');

qrprod.sql.add('from carro.db as C, carroxprod.db as R, produtos.db as P, fornecedor.db as F, categoria.db as CT, montadora as M, veiculo as V');

qrprod.sql.add('where P.Categoria=CT.Cod_cat and P.Forn_cat=F.Cod_forn and C.Cod_car=R.Cod_carro and P.Cod_prod=R.Cod_prod and C.montadora=M.Cod_Montadora and C.Veiculo=V.Cod_veiculo and C.Montadora='+aspa+Edit1.Text+aspa+' ');

qrprod.open;

qrprod.Active;

end;

alguém pode me ajudar eu so to com esse problema para resolver no meu programa se alguém puder me ajudar eu fico muito grato

eu já pensei na ípotese de quando o produto for compatível com todos os veiculos criar um laço que vai adicionar cada veiculo na tabela carroxprod porém não iria fucnionar pois se eu adicioinar um vêículo novo esse mesmo não vai ser compatível com o produto que anteriormente eu marquei como compatível a todos vêículos.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Kindelis, uma sugestão é que separe as expressões "separadas" pelo OR com parênteses. Assim não resta dúvida de como a cláusula where será processada.

Olhando o seu select, pura e simplesmente, e sem maiores detalhes de suas tabelas, acho que há um problema no relacionamento da sua query(veja texto em negrito), o qual provavelmente é o causador da falta de espaço (como tentei explicar no outro seu post):

select P.Cod_prod, P.Cod_cat, P.Descricao, P.Preco_venda, P.Qtd_disp, F.Nome, CT.Categoria, C.Cod_car, Foto

from carro.db as C,

carroxprod.db as R,

produtos.db as P,

fornecedor.db as F,

categoria.db as CT,

montadora as M,

veiculo as V

where (P.Categoria = CT.Cod_cat

and P.Forn_cat = F.Cod_forn

and P.Cod_prod = R.Cod_prod

and C.Cod_car = R.Cod_carro

and C.montadora = M.Cod_Montadora

and C.Veiculo = V.Cod_veiculo

and C.Montadora = '<Montadora>') or

(R.Cod_carro=0

and P.Categoria = CT.Cod_cat

and P.Forn_cat = F.Cod_forn

and P.Cod_prod = R.Cod_prod

and C.montadora = M.Cod_Montadora

and C.Veiculo = V.Cod_veiculo

and C.Montadora = '<Montadora>')

Acredito que o SQL abaixo deva ser o que você está procurando. Observe que quando R.Cod_car for igual a 0 (zero), você não terá como tentar relacionar Carro com Montadora e Veiculo, já que este item deveria existir na tabela Carro e aparentemente não existe. Seria isto?

select P.Cod_prod, P.Cod_cat, P.Descricao, P.Preco_venda, P.Qtd_disp, F.Nome, CT.Categoria, C.Cod_car, Foto
from carro.db as C,
     carroxprod.db as R,
     produtos.db as P,
     fornecedor.db as F,
     categoria.db as CT,
     montadora as M,
     veiculo as V
where (C.Cod_car   = R.Cod_car
  and P.Cod_prod   = R.Cod_prod
  and C.montadora  = M.Cod_Montadora
  and C.Veiculo    = V.Cod_Veiculo
  and P.Cod_cat    = CT.Cod_cat
  and P.Cod_forn   = F.Cod_forn)
  and C.Montadora  = '<Montadora>') or
      (0           = R.Cod_carro
  and P.Cod_prod   = R.Cod_prod
  and P.Cod_cat    = CT.Cod_cat
  and P.Cod_forn   = F.Cod_forn)

[]s

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

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