SELECT FROM TABELA1, TABELA2 WHERE ..ORDER BY

FILIPA 09/10/2012 12:29:53
#411639
preciso de ajuda...

eu tenho isto:
BD.RecOpen recDocs, [Ô]SELECT * FROM Fct, FctLn WHERE (Fct.FctData) >=#[Ô] & Format(DataIni.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# And (Fct.FctData) <=#[Ô] & Format(DataFim.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# Or (FctLn.FctLnData) >=#[Ô] & Format(DataIni.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# And (FctLn.FctLnData) <=#[Ô] & Format(DataFim.Value, [Ô]m/d/yyyy[Ô]) & [Ô]# ORDER By Fct.FctNr [Ô]
fct é tabela1 e fctln é a tabela 2...


o meu problema é que supondo que tenho 2 linhas na tabela1 e 3 linhas na tabela2, ele esta-me a imprimir 3 vezes cada linha.

o código é este:

ContFct = 0
ContFct = ContFct + 1


[ô] isto é o cabeçalho que se imprime no ficheiro txt,
[ô]r1
Print #f, [Ô]R1[Ô] & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]yyyy[Ô]) & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]mm[Ô]) & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]dd[Ô]) _
& [Ô]0010[Ô] & [Ô]F-[Ô] & Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctNr[Ô])), [Ô]000000[Ô]) & [Ô]00[Ô] _
& Format(BD.GetFieldValue(recDocs, [Ô]FctEntCd[Ô]), [Ô]000000[Ô]) & [Ô]0000[Ô] & [Ô]0000[Ô] & [Ô]0000[Ô] & [Ô]0010[Ô] _
& [Ô]EUR[Ô] & [Ô]0000[Ô] & [Ô]G-000000[Ô] & [Ô]00000000[Ô] & Space(106) & [Ô]N[Ô]

[ô] R2
[ô] este é o r2 que é o [Ô]meio [Ô] todas as linhas de artigos são representadas aki
Print #f, [Ô]R2[Ô] & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]yyyy[Ô]) & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]mm[Ô]) & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]dd[Ô]) _
& [Ô]0010[Ô] & [Ô]F-[Ô] & Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctNr[Ô])), [Ô]000000[Ô]) _
& Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctLnCD[Ô])), [Ô]000000000000000[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô]00000000[Ô] & [Ô]00000000[Ô] & [Ô]00000000[Ô] & [Ô]UN[Ô] & [Ô]0001[Ô] _
& Format(BD.GetFieldValue(recDocs, [Ô]FctLnTxIva[Ô]), [Ô]00[Ô]) & [Ô]00[Ô] & Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctLnQtd[Ô])), [Ô]00000000.000[Ô]), [Ô],[Ô], [Ô][Ô]) _
& [Ô] [Ô] & Format(BD.GetFieldValue(recDocs, [Ô]FctLnTxDesc[Ô]), [Ô]00[Ô]) & [Ô]00[Ô] & [Ô]0000[Ô] & [Ô]0000[Ô] & [Ô]U[Ô] & Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctLnVlrDef[Ô])), [Ô]00000000.000[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] _
& Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctLnDesc[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] & [Ô]0000000000[Ô] & [Ô] [Ô] _
& Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctLnVlr[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] & Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctLnValorCIva[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] _
& Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctLnIva[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] & Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctLnValorCIva[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] & [Ô]N[Ô] & [Ô]N[Ô]



[ô] R3
[ô]r3 é os totais da fatura
Print #f, [Ô]R3[Ô] & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]yyyy[Ô]) & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]mm[Ô]) & Format(BD.GetFieldValue(recDocs, [Ô]FctData[Ô]), [Ô]dd[Ô]) _
& [Ô]0010[Ô] & [Ô]F-[Ô] & Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctNr[Ô])), [Ô]000000[Ô]) _
& Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctTotalDesc[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] & [Ô]0000000000[Ô] & [Ô] [Ô] _
& Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctTotalSIVA[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] & Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctTotal[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] _
& Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctTotalIVA[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] & [Ô]0000000000[Ô] & [Ô] [Ô] & Replace(Format(CStr(BD.GetFieldValue(recDocs, [Ô]FctTotal[Ô])), [Ô]00000000.00[Ô]), [Ô],[Ô], [Ô][Ô]) & [Ô] [Ô] & Space(76) & [Ô]N[Ô]


recDocs.MoveNext
Sal:
PROXIMO:
Loop

BD.RecClose recDocs, True

FILIPA 09/10/2012 12:31:15
#411640
preciso de ajuda urgente!!!
alguém me ajude
LUIZCOMINO 09/10/2012 12:52:29
#411642
tente agrupar


BD.RecOpen recDocs, [Ô]SELECT DISTINCT * FROM Fct, FctLn WHERE (Fct.FctData) >=#[Ô] & Format(DataIni.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# And (Fct.FctData) <=#[Ô] & Format(DataFim.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# Or (FctLn.FctLnData) >=#[Ô] & Format(DataIni.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# And (FctLn.FctLnData) <=#[Ô] & Format(DataFim.Value, [Ô]m/d/yyyy[Ô]) & [Ô]# ORDER By Fct.FctNr [Ô]
FILIPA 09/10/2012 12:58:06
#411644
alô Luizcomino

tentei mas sem sucesso.
FILIPA 09/10/2012 13:03:30
#411646
aquilo que eu vi foi, se colocar select * from tabela 1 where .......


ele imprime so 1 linha de cada vez da tabela 1

se colocar no select * from Tabela 1, tabela 2 where ....
ele imprime o nº das linhas da tabela 2 pelo nº de linhas da tabela1
ALVAROVB2009 09/10/2012 14:10:33
#411655
FILIPA se as linhas estiverem com dados igual use o DISTINCT, só que com ele vc não pode colocar o *, terá que relacionar todas os campos, ficaria algo assim

Select distinct(campo1),campo2,campo3,campo4,campo5 from sua tabela

Testa ai qqer coisa posta novamente ok
MARCELO.TREZE 09/10/2012 14:25:11
#411658
Resposta escolhida
Tentou usar o GROUP BY

BD.RecOpen recDocs, [Ô]SELECT * FROM Fct, FctLn WHERE (Fct.FctData) >=#[Ô] & Format(DataIni.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# And (Fct.FctData) <=#[Ô] & Format(DataFim.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# Or (FctLn.FctLnData) >=#[Ô] & Format(DataIni.Value, [Ô]m/d/yyyy[Ô]) & _
[Ô]# And (FctLn.FctLnData) <=#[Ô] & Format(DataFim.Value, [Ô]m/d/yyyy[Ô]) & [Ô]# GRoUP BY Fct.FctNr ORDER By Fct.FctNr [Ô]


outra coisa, reparei que dentro do laço tem

ContFct = 0
ContFct = ContFct + 1


isso dentro do laço vai ser sempre 1 então se deseja manter sempre 1 ficaria mais fácil assim

ContFct = 1


agora se deseja criar uma numeração dentro do laço coloque [ContFct = 0] antes do [do until]


FILMAN 09/10/2012 14:31:08
#411659
Tente usar o Group By

Mais você pode melhorar o seu SQL colocando BETWEEN e parenteses para separar a lógica do OR coloque assim:
SQL = [Ô]SELECT * FROM Fct, FctLn WHERE ((Fct.FctData BETWEEN #[Ô] & Format(DataIni.Value, [Ô]m/d/yyyy[Ô]) & [Ô]# AND #[Ô] & Format(DataFim.Value, [Ô]m/d/yyyy[Ô]) & [Ô]#) [Ô]
SQL = SQL & [Ô]Or (FctLn.FctLnData BETWEEN #[Ô] & Format(DataIni.Value, [Ô]m/d/yyyy[Ô]) & [Ô]# AND #[Ô] & Format(DataFim.Value, [Ô]m/d/yyyy[Ô]) & [Ô]#)) ORDER By Fct.FctNr[Ô]

BD.RecOpen recDocs, SQL


Descreva a estrutura das tabelas para nós! assim podemos saber o que realmente precisa para que seja sanada sua duvida
FILIPA 10/10/2012 05:12:51
#411679
Caras
estou agradecida, mas nao resolveu

FILIPA 10/10/2012 06:27:18
#411681
a minha duvida e que ele esta me a imprimir o nº de linhas da 2tabela (fctln) por cada linha da tabela 1(fct)

supondo: tenho 2 linhas na tabela 1 (fct)
1ª linha - fatura 0001
2ª linha - fatura 0002

onde a fatura 0001 tem 2 produtos (2 linhas na base dados tabela 2)
e a fatura 0001 tem apenas 1 produto (1 linha)

eu usando o select * from FCT, FCTLN ....
imprime assim:
fatura 0001
fatura 0001
fatura 0001
fatura 0002
fatura 0002
fatura 0002

e eu queria apenas
fatura 0001
fatura 0002

mas no meu codigo tenho r1, r2 e r3.
isto é r1 para o cabeçalho da fatura
r2 para os produtos/artigos da fatura
r3 para o total de todos os produtos da fatura.


queria ainda que me ajudassm, enquanto houver varios produtos numa mesma fatura que imprima assim
r1 fatura 0001
r2 produto 1 1qtd .... 5€
r2 produto 2 25qtd... 1€
r3 fatura 0001 .... 30€

neste momento ao erro de cima ainda tenho este. que me imprime assim:
r1 fatura 0001
r2 produto 1 1qtd .... 5€
r3 fatura 0001 .... 30€
r1 fatura 0001
r2 produto 2 25qtd... 1€
r3 fatura 0001 .... 30€
FILIPA 10/10/2012 11:41:15
#411706
já resolvi ;)


agora tenho um problema.

fatura 000001 tem o artigo 1
fatura 000002 tem 2 linhas de artigo 2 e o artigo 3


neste momento imprime, fatura 000001 com o artigo 3
Tópico encerrado , respostas não são mais permitidas