JMann 0 Denunciar post Postado Março 28, 2009 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
Paulo do Brasil 0 Denunciar post Postado Março 30, 2009 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
JMann 0 Denunciar post Postado Março 31, 2009 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