Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JMann

Banco de Dados

Recommended Posts

Olá a todos, eu sou o jeferson e gostartia de exclarecer algumas dúvidas...

Eu estou fazendo um curso de delphi e estou fazendo um projeto em delphi

de uma loja.Estou começando ainda (eu tenho 17 anos) e estou implementando

uma parte em que ele faz a união de duas tabelas feitas num programa chamado IBExpert

que usa o FireBird como server. Pàra uni-las tenho que usar o seguinte comando SQL:

SELECT

VENDADT_CODPROD, PROD_DESCRICAO, VENDADT_QTD, PROD_VALORU, VENDADT_SUBVALOR

FROM PRODUTO P INNER JOIN VENDA_DETALHES VDT ON

P.PROD_CODIGO = VDT.VENDADT_CODPROD

WHERE VDT.VENDADT_CODVENDA IS NULL.

PRODUTO e VENDA_DETALHES são os nomes das tabelas que serão unidas pelo inner join.

o erro surgiu quando eu fui executar, eu usei uma funcão pegaDescricaoProduto que jogará

a descrição do produto que o cliente comprará num DBGrid que eu usei para mostrar os dados

da venda.enfim, quando executou deu que o delphi não reconheceu o campo VENDADT_CODVENDA.

eu joguei o SQL no componente TSQLQuery do DataModule, só que quando eu vou pegar as tabelas

no componente TClienteDataSet ele diz que o comandoSQL esta errado, que o SELECT é desconhecido,

só que esse mesmo SQL funciona quando chamo os campos no IBExpert.

Enfim, como resolver esse problema????

Alguém me ajude, pois tenho que implemetar mais 6 functions além desse método até segunda-feira e

vale 1/3 dá nota final.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que não seja problema do Delphi e sim da query...

Minha sugestão é de que você normalize os nomes dos campos...

Sua tabela de produtos deve ter estes campos:

codigoean e não codprod

descricao e não prod_descricao

unidade e não prod_unidade

Ou seja, os campos da sua tabela de produtos não deveriam ter "prod" na frente, pois

isso é redudante e só atrapalha você de identificar melhor os campos.

 

Já a tabela de vendas, teria campos assim:

codigoean e não vendadt_codprod

quantidade e não vendadt_qtd

valorunitario e não prod_valoru

 

Não estranhe o campo codigoean aparecer nas duas tabelas... pois a referência nas

queries para um ou outro terá o nome da tabela (o alias) na frente...

 

Então, uma query bem organizada e fácil de entender ficaria assim:

select vendas.codigoean, vendas.quantidade, vendas.valorunitario,
	   (vendas.quantidade*vendas.valorunitario) as subtotal,
	   produtos.descricao, produtos.unidade
from vendas
inner join produtos
  on (vendas.codigoean=produtos.codigoean)
where vendas.dataemissao between "2009/01/01" and "2009/01/31"

Para simplificar os nomes, com "aliases":

 

select v.codigoean, v.quantidade, v.valorunitario,
	   (v.quantidade*v.valorunitario) as subtotal,
	   p.descricao, p.unidade
from vendas as v
inner join produtos as p
  on (v.codigoean=p.codigoean)
where (vendas.dataemissao between "2009/01/01" and "2009/01/31")

Ok?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando se cria uma function como, por exemplo,

function pegaDescricaoProduto (codigo:integer):string + IntToStr (codigo);

 

esse Codigo é a chave primaria da tabela ou é uma variável qualquer que se declara.

A function completa é

function pegaDescricaoProduto(codigo:integer):string + IntToStr(codigo);

 

implementation

 

TfrmVenda . pegaDescricaoProduto(codigo:integer):string + IntToStr(codigo);

 

begin

with DataModule do begin

ClientDataSet.close;

ClientDataSet.datarequest( 'SELECT VENDADT_CODPROD, PROD_DESCRICAO, VENDADT_QTD,

PROD_VALORU, VENDADT_SUBVALOR FROM PRODUTO P INNER JOIN VENDA_DETALHES VDT ON

P.PROD_CODIGO = VDT.VENDADT_CODPROD WHERE VDT.VENDADT_CODVENDA IS NULL');

ClientDataSet.open;

end;

end;

 

Depois essa function é pra ser executada no DBGrid na propriedade OnColenter, mas quando se executa

ele diz que o codigo não está declarado. O que fazer???? Essa function esta correta???

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.