Fórum Left Join nao retornou nada #267059
01/02/2005
0
´Select Vendas.*,Clientes.NomCli FROM Vendas Left Join Clientes ON (Vendas.Codcli=Clientes.CodCli) WHERE (Vendas.CodEmp=:vCodEmp and Vendas.CodEmp=Clientes.CodEmp) ORDER BY Vendas.Data+Vendas.Pedido DESC´;
Após abrir o Client, debugo as variáveis para ver seu conteúdo:
DM.CDS_Vendas.FieldByName(´Pedido´).asstring ---> Traz o valor correto
DM.CDS_Vendas.FieldByName(´CodCli´).asstring ---> Traz o valor correto
Quando debugo a variável NomCli
DM.CDS_Vendas.FieldByName(´NomCli´).asstring ---> Traz o seguinte erro
Delphi exception EDatabaseError at $84BF92D
Aproveitando o tópico, como incluo esse campo no ClientDataSet para acessá-lo no dbGrid? Já que os demais campos da tabela vendas existem fisicamente e já os inclui no DataModule, e esse campo ´Virtual´ NomCli só passou a existir quando da execução dessa Query acima.
O que está errado?
Abraços
Mario
Aldus
Curtir tópico
+ 0Posts
02/02/2005
Emerson Nascimento
Select Vendas.*, Clientes.NomCli
FROM Vendas
Left Join Clientes ON (Clientes.CodCli=Vendas.Codcli and Clientes.CodEmp=Vendas.CodEmp)
WHERE Vendas.CodEmp=:vCodEmp
ORDER BY Vendas.Data, Vendas.Pedido DESC
para incluir esse campo no ClientDataset você precisa colocar essa instrução nele e abri-lo em tempo de projeto. Depois você executa os procedimentos normais para inclusão do campo persistente e fecha o ClientDataset.
mas fiquei com um dúvida: porque você tem o campo CodEmp na tabela de clientes?
Gostei + 0
02/02/2005
Aldus
Quanto a sua resposta. Eu estou utilizando apenas um clientdataset para cada tabela, nesses casos que tenho que buscar o conteúdo de outras, seria interessante ter um clientdataset apenas para consulta?
Atenciosamente
Mario
Gostei + 0
02/02/2005
Emerson Nascimento
Gostei + 0
02/02/2005
Emerson Nascimento
porque creio que o correto seria ter um banco de dados para cada empresa, e dentro desse banco apontar as filiais. pois supõe-se que todas as filiais tenham o mesmo foco, tanto em clientes quanto em produtos. o que não é necessariamente verdadeiro em se tratando de empresas diferentes.
mesmo porque isso garantiria o bom gerenciamento dos dados, tanto em performance quanto em segurança.
imagine que você tem dados de três empresas distintas num mesmo banco de dados. se por acaso esse banco de dados sofrer algum dano, as três empresas serão prejudicadas (mesmo que momentaneamente), o que não ocorreria se esses dados estivessem distribuídos em três bancos diferentes: apenas uma empresa seria prejudicada.
então, a estrutura deveria ser mais ou menos assim:
bancoXX (onde XX é o código da empresa) clientes (não me preocupo com a filial) id_cliente cnpjcpf endereco produtos (não me preocupo com a filial) id_produto codigo nome descricao saldos (me preocupo com a filial) id_produto id_local id_filial saldoatual pedidos (me preocupo com a filial) id_pedido id_filial numero data pedidositens (não me preocupo com a filial, pois está embutida no pedido) id_item id_pedido id_produto valorunitario quantidade e assim por diante
Gostei + 0
02/02/2005
Aldus
Eu tenho um form de consulta padrão e já crio os campos manualmente, como abaixo, só que como citei acima, era para o campo ´NomCli´ estar disponível quando debugo após a query, não era?
Lista.DataSource := DM.DS_Vendas ; Lista.Columns.Add; Lista.Columns[0].FieldName := ´PEDIDO´; Lista.Columns[0].Title.Caption:= ´Pedido´; Lista.Columns.Add; Lista.Columns[1].FieldName := ´DATA´; Lista.Columns[1].Title.Caption:= ´Data da Venda´; Lista.Columns.Add; Lista.Columns[2].FieldName := ´CODCLI´; Lista.Columns[2].Title.Caption:= ´Cliente´; Lista.Columns.Add; Lista.Columns[3].FieldName := ´NOMCLI´; Lista.Columns[3].Title.Caption:= ´Nome do Cliente´; Lista.Columns.Add; Lista.Columns[4].FieldName := ´CODPLA´; Lista.Columns[4].Title.Caption:= ´Pagamento´; Lista.Columns.Add; Lista.Columns[5].FieldName := ´TOTALBRU´; Lista.Columns[5].Title.Caption:= ´Total Bruto´; Lista.Columns.Add; Lista.Columns[6].FieldName := ´TOTALLIQ´; Lista.Columns[6].Title.Caption:= ´Total Líquido´;
Até
Gostei + 0
02/02/2005
Emerson Nascimento
Gostei + 0
02/02/2005
Aldus
Após o Open, debugo todos os campos para testar ´dm.cds_vendas.fieldbyname(nomedocampo).asstring´, todos retornam o seu conteúdo, exceto o danado ´NomCli´ que retorna aquele erro ´Delphi exception EDatabaseError at $84BF92D´
O que está errado, a sintaxe da instrução está correta?
Mario
Gostei + 0
02/02/2005
Paulo_amorim
Após abrir, debugue e tente verificar:
Só pra começar, o número de campos que o Cds está retornando. Se for diferente do esperado (o total de campos da tabela vendas + NomCli) pode ser isso
Depois, verifique o nome dos campos (Fields[i].FieldName) , principalmente os últimos. Certifique-se de que o seu campo está lá
Provavelmente o erro está em alguma coisa nesses passos... senão ele traria normalmente...
Até+
Gostei + 0
02/02/2005
Emerson Nascimento
como eu disse antes, apenas por estética, eu faria assim:
with DM.CDS_Vendas do begin Close; CommandText := ´Select Vendas.*, Clientes.NomCli FROM Vendas ´+ ´Left Join Clientes ON (Clientes.CodCli=Vendas.Codcli and Clientes.CodEmp=Vendas.CodEmp) ´+ ´WHERE Vendas.CodEmp=:vCodEmp ´+ ´ORDER BY Vendas.Data, Vendas.Pedido DESC ´; ParamByName(´vCodEmp´).AsInteger := fMenu.CodEmpSelec; Open; end
outra coisa: na tabela Vendas não há um campo [i:940ffb318d]NomCli[/i:940ffb318d], né? Se houver, talvez o sistema esteja se perdendo por não saber qual campo utilizar...
Gostei + 0
02/02/2005
Aldus
Daí o dilema, se incluo todos no cds, não aparece o NomCli no grid ou se não incluo nenhum, aparece tudo mas não posso formatar os valores no grid, pois como você viu acima, eu incluo os campos em runtime e não há propriedade para formatá-los.
E agora brother, sabes o que posso fazer?
Gostei + 0
02/02/2005
Emerson Nascimento
você pode, sim, criar as máscaras de formatação em tempo de execução.
por exemplo:
depois de abrir a query:
with DM.CDS_Vendas do begin TDateTimeField(FieldByName(´DATA´)).DisplayFormat := ´dd/mm/yyyy´; TFloatField(FieldByName(´TOTALBRU´)).DisplayFormat := ´,#0.00´; TFloatField(FieldByName(´TOTALLIQ´)).DisplayFormat := ´,0.00´; end;
Gostei + 0
02/02/2005
Aldus
Aguardo ancioso seu retorno.
Mario
Gostei + 0
02/02/2005
Emerson Nascimento
Gostei + 0
02/02/2005
Aldus
Gostei + 0
02/02/2005
Emerson Nascimento
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)