RES: [firebase-br] Ajuda com SQL: ainda procurando solução

Jony jonyridel em yahoo.com.br
Ter Jan 31 14:57:29 -03 2006


José, não sei se entendi direito seu select esta retornando o valor do frete
de acordo com a linha que esta ligada ao produtor:

SELECT 
  RL.LEI_PRODUTOR, 
  P.PRO_NOME, 
  P.PRO_CNPJCPF, 
  P.PRO_COTALITRO,
  P.PRO_COTAPERC, 
  P.PRO_BONIFICAVLR, 
  P.PRO_BONIFICAPERC, 
  P.PRO_TANQUE,
  P.PRO_TAXATANQUE, 
  P.PRO_FRETEPERC, 
  P.PRO_FRETEVALOR,
  SUM(CASE L.LIN_PAGAFRETE
      WHEN 'True' THEN
        CASE
          WHEN P.PRO_FRETEVALOR = 0 THEN 
                    ((P.PRO_FRETEPERC * (RL.LEI_BOM + RL.LEI_ACIDO)) / 100)
          WHEN P.PRO_FRETEVALOR > 0 THEN
                    (P.PRO_FRETEVALOR * (RL.LEI_BOM + RL.LEI_ACIDO))
        END
      WHEN 'False' THEN 0
      END) AS PRO_FRETE,
  SUM(RL.LEI_BOM) AS LEI_BOM, SUM(RL.LEI_ACIDO) AS LEI_ACIDO,
  L.LIN_CODIGO, 
  L.LIN_CARRETEIRO 
FROM 
  RECLEITE RL
  LEFT JOIN PRODUTORES P ON (P.PRO_CODIGO = RL.LEI_PRODUTOR)
  LEFT JOIN LINHAS L ON (L.LIN_CODIGO = P.PRO_LINHA)
WHERE 
  RL.LEI_DATA BETWEEN '01.01.2006' AND '31.01.2006'
GROUP BY 
  RL.LEI_PRODUTOR, 
  P.PRO_NOME, 
  P.PRO_CNPJCPF, 
  P.PRO_COTALITRO,
  P.PRO_COTAPERC, 
  P.PRO_BONIFICAVLR, 
  P.PRO_BONIFICAPERC, 
  P.PRO_TANQUE,
  P.PRO_TAXATANQUE, 
  P.PRO_FRETEPERC, 
  P.PRO_FRETEVALOR, 
  L.LIN_CODIGO,
  L.LIN_CARRETEIRO
ORDER BY 
  L.LIN_CARRETEIRO, 
  P.PRO_NOME

Você quer que o frete seja calculado de acordo apenas com a linha inserida
nesta tabela de movimentação RECLEITE, neste caso acredito que você resolve
a situação fazendo o Join direto da tabela RECLEITE para a tabela de linhas.
Agora notei que você esta usando Left Join as colunas em REC_LEITE para
linha e produto aceitam nulo ? Se não use o Join direto como segue abaixo.

SELECT 
  RL.LEI_PRODUTOR, 
  P.PRO_NOME, 
  P.PRO_CNPJCPF, 
  P.PRO_COTALITRO,
  P.PRO_COTAPERC, 
  P.PRO_BONIFICAVLR, 
  P.PRO_BONIFICAPERC, 
  P.PRO_TANQUE,
  P.PRO_TAXATANQUE, 
  P.PRO_FRETEPERC, 
  P.PRO_FRETEVALOR,
  SUM(CASE L.LIN_PAGAFRETE
      WHEN 'True' THEN
        CASE
          WHEN P.PRO_FRETEVALOR = 0 THEN 
                    ((P.PRO_FRETEPERC * (RL.LEI_BOM + RL.LEI_ACIDO)) / 100)
          WHEN P.PRO_FRETEVALOR > 0 THEN
                    (P.PRO_FRETEVALOR * (RL.LEI_BOM + RL.LEI_ACIDO))
        END
      WHEN 'False' THEN 0
      END) AS PRO_FRETE,
  SUM(RL.LEI_BOM) AS LEI_BOM, SUM(RL.LEI_ACIDO) AS LEI_ACIDO,
  L.LIN_CODIGO, 
  L.LIN_CARRETEIRO 
FROM 
  RECLEITE RL
  JOIN PRODUTORES P ON (P.PRO_CODIGO = RL.LEI_PRODUTOR)
  JOIN LINHAS L ON (L.LIN_CODIGO = RL.LEI_LINHA)
WHERE 
  RL.LEI_DATA BETWEEN '01.01.2006' AND '31.01.2006'
GROUP BY 
  RL.LEI_PRODUTOR, 
  P.PRO_NOME, 
  P.PRO_CNPJCPF, 
  P.PRO_COTALITRO,
  P.PRO_COTAPERC, 
  P.PRO_BONIFICAVLR, 
  P.PRO_BONIFICAPERC, 
  P.PRO_TANQUE,
  P.PRO_TAXATANQUE, 
  P.PRO_FRETEPERC, 
  P.PRO_FRETEVALOR, 
  L.LIN_CODIGO,
  L.LIN_CARRETEIRO
ORDER BY 
  L.LIN_CARRETEIRO, 
  P.PRO_NOME

Caso não seja isso pode me enviar outro e-mail explicando melhor a situação
?

----------------------------
Jony Ridel 
---------------------------

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de José Filho (UOL)
Enviada em: segunda-feira, 30 de janeiro de 2006 11:10
Para: FireBase
Assunto: [firebase-br] Ajuda com SQL: ainda procurando solução

Bom dia, comunidade firebird!

            Tenho uma aplicação que faz o controle de recebimento de leite
de um laticínio. Foram utilizadas as ferramentas D7, o trio SQLDataSet,
DataSetProvider, ClientDataSet e o FB 1.5.3, para o seu desenvolvimento. Me
deparei com a seguinte situação:


1) Existe no BD três tabelas (além de tantas outras) onde são cadastrados os
produtores de leite (PRODUTORES), as linhas de leite (LINHAS) e o
recebimento diário de leite (RECLEITE);

2) A tabela PRODUTORES possui como chave primária o campo PRO_CODIGO.

3) A tabela LINHAS possui como chave primária o campo LIN_CODIGO. Possui,
ainda, um campo do tipo "lógico" chamado LIN_PAGAFRETE;

4) A tabela PRODUTORES está relacionada com a tabela LINHAS através do campo
PRO_LINHA. Ela possui, também, outros campos para o cálculo de taxas de
acréscimo e desconto: bonificação e frete;

5) A tabela RECLEITE está relacionada com as tabelas PRODUTORES e LINHAS
através dos campos LEI_PRODUTOR e LEI_LINHA, respectivamente;

            Existe uma informação a saber: o produtor pode entregar leite em
outra linha que não seja a que ele esteja cadastrado. Aí está o problema com
minha SQL. Segue o código abaixo:

SELECT RL.LEI_PRODUTOR, P.PRO_NOME, P.PRO_CNPJCPF, P.PRO_COTALITRO,
P.PRO_COTAPERC, P.PRO_BONIFICAVLR, P.PRO_BONIFICAPERC, P.PRO_TANQUE,
P.PRO_TAXATANQUE, P.PRO_FRETEPERC, P.PRO_FRETEVALOR,
SUM(CASE L.LIN_PAGAFRETE
      WHEN 'True' THEN
        CASE
          WHEN P.PRO_FRETEVALOR = 0 THEN ((P.PRO_FRETEPERC * (RL.LEI_BOM +
RL.LEI_ACIDO)) / 100)
          WHEN P.PRO_FRETEVALOR > 0 THEN (P.PRO_FRETEVALOR * (RL.LEI_BOM +
RL.LEI_ACIDO))
        END
      WHEN 'False' THEN 0
    END) AS PRO_FRETE,
SUM(RL.LEI_BOM) AS LEI_BOM, SUM(RL.LEI_ACIDO) AS LEI_ACIDO,
L.LIN_CODIGO, L.LIN_CARRETEIRO FROM RECLEITE RL
LEFT JOIN PRODUTORES P
ON (P.PRO_CODIGO = RL.LEI_PRODUTOR)
LEFT JOIN LINHAS L
ON (L.LIN_CODIGO = P.PRO_LINHA)
WHERE RL.LEI_DATA BETWEEN '01.01.2006' AND '31.01.2006'
GROUP BY RL.LEI_PRODUTOR, P.PRO_NOME, P.PRO_CNPJCPF, P.PRO_COTALITRO,
P.PRO_COTAPERC, P.PRO_BONIFICAVLR, P.PRO_BONIFICAPERC, P.PRO_TANQUE,
P.PRO_TAXATANQUE, P.PRO_FRETEPERC, P.PRO_FRETEVALOR, L.LIN_CODIGO,
L.LIN_CARRETEIRO
ORDER BY L.LIN_CARRETEIRO, P.PRO_NOME

                De acordo com o código acima, se o produtor é cadastrado em
uma linha que não paga frete, entrega leite nessa linha e em outra que paga
frete, minha SQL retorna o cálculo do frete zerado, obviamente. O que quero
é saber como fazer pra SQL calcular o frete do leite que foi entregue na
linha que o paga. Grato pela ajuda de quem se dispuser.

[ ]'s

José Filho
Barra do Garças-MT


---
avast! Antivirus: Outbound message clean.
Virus Database (VPS): 0605-0, 29/01/2006
Tested on: 30/1/2006 11:10:02
avast! - copyright (c) 1988-2005 ALWIL Software.
http://www.avast.com


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa

-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.375 / Virus Database: 267.14.23/242 - Release Date: 26/1/2006
 

-- 
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.375 / Virus Database: 267.14.25/246 - Release Date: 30/1/2006
 


	

	
		
_______________________________________________________ 
Yahoo! doce lar. Faça do Yahoo! sua homepage. 
http://br.yahoo.com/homepageset.html 






Mais detalhes sobre a lista de discussão lista