Duvida com relacionamento em Sql

28/08/2004

1

Tenho duas tabelas: Clientes e pedidos.
Clientes tem dentre outros, os campos: No_Pedido1, No_Pedido2, No_Pedido3, No_Pedido4.
Pedidos tem os campos: No_Pedido, Valor.
Obs.: No_Pedido é o número do pedido.

Eu preciso colocar em um QuickReport os números dos pedidos com seus respectivos valores.
Como é que eu faço para relacionar os dois em um Query (usando SQL), já que são quatro campos [u:2829ac7db4]ao mesmo tempo[/u:2829ac7db4] de uma tabela retornando o valor correspondente da outra tabela ?

Não sei como fazer isto. Se alguém puder me ajudar agradeço muito...


Responder

Posts

28/08/2004

Rômulo Barros

Em relação ao seu modelo, eu criaria assim:

Table_Clientes

* Codigo_Cliente(Pk)
* Nome_Cliente
 ...

Table Pedidos

* Codigo_Pedido(PK)
* Codigo_Cliente(PK - FK)
* Valor_Pedido
* Data_Pedido
...

Table ItemsDopedido

* Codigo_Item(PK) 
* Codigo_Pedido(PK_FK)
* Codigo_Produto(PK-FK)
* Qtd
* Valor_Produto



:wink: :wink:
:arrow: Sei que naum tem nada a ver com o seu POST, mas vale destacar


Responder

28/08/2004

Vinicius2k

Colega,

Devo admitir que esta foi a instrução mais ´estranha´, digamos assim, que eu já montei... mas funciona :D
select
  C.IDCLIENTE, C.NOMECLIENTE,
  C.NO_PEDIDO1, P1.VL_PEDIDO as VL_PEDIDO1,
  C.NO_PEDIDO2, P2.VL_PEDIDO as VL_PEDIDO2,
  C.NO_PEDIDO3, P3.VL_PEDIDO as VL_PEDIDO3,
  C.NO_PEDIDO4, P4.VL_PEDIDO as VL_PEDIDO4
from CLIENTES C
  left join PEDIDOS P1 on (C.NO_PEDIDO1 = P1.NO_PEDIDO)
  left join PEDIDOS P2 on (C.NO_PEDIDO2 = P2.NO_PEDIDO)
  left join PEDIDOS P3 on (C.NO_PEDIDO3 = P3.NO_PEDIDO)
  left join PEDIDOS P4 on (C.NO_PEDIDO4 = P4.NO_PEDIDO)


Eh isto que vc precisa?

Espero ter ajudado...
T+


Responder

30/08/2004

Adonis

Undeclared Identifier,

Agradeço a ajuda... O sistema já está pronto. É só um relatório a mais.

vinicius2K,

Agradeço a ajuda...

Fiz como voce orientou, porem o sistema trava ao processar a sql. Começa mais não termina.
Se não for incomodo lhe envio o fonte como ele ficou:
*******************************
Screen.Cursor := CrHourGlass;
Query1.Active := False;
Query1.Sql.Text := ´SELECT C.CLI_CODIGO, C.CLI_RAZSOC, ´+
´C.CLI_ENDERE, C.CLI_BAIRRO, ´+
´C.CLI_FONE1, C.CLI_CEP, C.CLI_CNPJ, C.CLI_IE, ´+
´C.CLI_CONTAT, ´+
´C.CLA_CODIGO, C.CLA_DESCRI, ´+
´C.ARE_CODIGO, C.ARE_DESCRI, ´+
´C.FOR_NOMEF1, C.PED_EMISS1, C.PED_NUMER1, ´+
´C.FOR_NOMEF2, C.PED_EMISS2, C.PED_NUMER2, ´+
´C.FOR_NOMEF3, C.PED_EMISS3, C.PED_NUMER3, ´+
´C.FOR_NOMEF4, C.PED_EMISS4, C.PED_NUMER4, ´+
´P1.PED_TT_BRU as VL_PEDIDO1, ´+
´P2.PED_TT_BRU as VL_PEDIDO2, ´+
´P3.PED_TT_BRU as VL_PEDIDO3, ´+
´P4.PED_TT_BRU as VL_PEDIDO4 ´+
´FROM CLIENTES C ´+
´LEFT JOIN Pedidos P1 ON (C.PED_NUMER1 = P1.PED_NUMERO) ´+
´LEFT JOIN Pedidos P2 ON (C.PED_NUMER2 = P2.PED_NUMERO) ´+
´LEFT JOIN Pedidos P3 ON (C.PED_NUMER3 = P3.PED_NUMERO) ´+
´LEFT JOIN Pedidos P4 ON (C.PED_NUMER4 = P4.PED_NUMERO) ´;

if TipoImp.ItemIndex = 0 then begin
Query1.Sql.Add(´ AND CLA_CODIGO = ´´ + Copy(BoxCla.Text,1,2) + ´´´);
end;
if CheckBox1.Checked then begin
Query1.Sql.Add(´ AND ARE_CODIGO = ´´ + Copy(BoxAre.Text,1,3) + ´´´);
end;
Query1.Sql.Add(´ORDER BY CLA_DESCRI ´);

Query1.Active := True;
Screen.Cursor := CrDefault;
FImpSeg.QRImpSeg.Preview;
****************************************
Estou errando alguma coisa acima?
Em Pedidos, o campo do número do pedido é: PED_NUMERO, o campo do valor é: PED_TT_BRU. (que é o total bruto).
Eu uso o Delphi 5. As tabelas sao DBF. Clientes tem 1542 registros. Pedidos tem 2340.
Vê se você me ajuda neste caso. Agradeço muito...


Responder

30/08/2004

Adonis

vinicius2K,

Depois que enveiei a mensagem foi que observei que os ´AND´ estavam vagos. É porque antes da sua dica eu tentava com um WHERE. Retireios porem ainda trava...

Agradeço alguma ajuda...


Responder

30/08/2004

Vinicius2k

adonis,

Temo que vc já tenha percebido onde está o problema... se a instrução, mesmo que não lhe retornasse a consulta como desejada, estivesse incorreta, vc teria uma mensagem de retorno do tipo ´token unknown´, mas se ela passa mas não termina é alguma limitação física ou de software...

Note que a BDE não é ´grande coisa´ com SQL e com DBF então a coisa piora... observe na raiz do seu álias q vc deve estar tendo um arquivo temporário bem grande, que eh o que a BDE está montando para lhe dar o resultado...

Infelizmente, não sei como mais poderia lhe ajudar pq nunca montei uma instrução deste tipo na BDE com base DBF... Aliás quase não usava queries quando trabalhava com bancos desktop, por causa disso...
Pode tbm ser uma limitação de memória da máquina, já que a BDE está usando esta memória para montar recordset de retorno...

Mas tudo não passam de suposições... se realizar mais algum teste ou tiver alguma informação nova, talvez eu possa lhe ajudar, mas devo admitir que a questão saiu da minha base de conhecimento...

T+


Responder

31/08/2004

Adonis

vinicius2K,

Realmente, observei na raiz do meu álias que tem um temporário bem grande...

O que voce me passou está correto. É problema de limitação de máquina mesmo, junto com BDE e DBase como voce falou.
Pois testei com apenas uma linha de relacionamento:
left join PEDIDOS P1 on (C.NO_PEDIDO1 = P1.NO_PEDIDO)) e deu certo.
Tentei com duas e tambem deu certo:
left join PEDIDOS P1 on (C.NO_PEDIDO1 = P1.NO_PEDIDO)
left join PEDIDOS P2 on (C.NO_PEDIDO2 = P2.NO_PEDIDO)
Ele trava quando coloco tres. Provando assim a sua teoria de limitação (de tudo).

Vou dizer ao cliente que como ele quer não vai dar. Foi bom que aprendi mais um pouco de SQL.

Agradeço a sua ajuda...


Responder

31/08/2004

Adonis

vinicius2K,

Aproveitando o ensejo: Eu não consegui de maneira nenhuma formatar um QRExpr do QReport (de 99/99/99 para 99/99/9999).
Pesquisei neste forum e não encontrei nada. Por isto acho que deva ser facil.
Tentei o mask do proprio QRExpr. Tentei o Display format (dd/mm/yyyy) no campo dentro do componente da Sql quando se dá dois clickes. Tentei tambem no campo da Sql o editMask (!99/99/9900;1;_) e nada.
Tentei o OnPrint do proprio QRExpr:
QRExpr14.Caption := FormatDateTime(´dd/mm/yyyy´,FPImpSeg.Query1.FieldByName(´PED_EMISS1´).AsDateTime) e nada.
Porem o OnPrint acima funciona em um QRLabel. Porque?
Tentei formatar o CNPJ tambem (99\.999\.999\/9999\-99;0;_) e não consegui.

Se você puder me ajudar agradeço muito...


Responder

31/08/2004

Vinicius2k

adonis,

Bem, sobre o problema da BDE, talvez exista alguma configuração que otimize o processo de queries e vc consiga ter o resultado... acho q vale a pena vc dar uma pesquisada... ou, até mesmo, tentar fazer um update da BDE, caso a sua versão não seja a 5.11 -- http://info.borland.com/devsupport/bde/

Sobre o QR, sinto muito, não posso lhe ajudar muito pq nunca trabalhei com ele...
Mas meu palpite eh que o problema da data esteja relacionado com as configurações regionais da máquina... verifique se a máquina está configurada para 4 digitos...

T+


Responder

01/09/2004

Adonis

vinicius2K,

O meu BDE é 5.01. Vou atualizar e ver o que acontece.

A minha máquina está configurada para 2 digitos. Mais se eu quiser com 4 o que farei?

Depois vou postar esta duvida aqui no forum.

Agradeco a ajuda...


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira