/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
SQL --> INNERJOIN --> Problem (VB5)
Fra : L. Hansen


Dato : 16-02-02 22:40

Hej

Følgende kode benyttes via ODBC til at udføre et træk fra en AS/400
Database.
Jeg bruger VB5 Enterprise og RDO.

<kode>
sSQL = "select * from FAKTH1 where F_STAT =" & 10 & " AND F_KODE =" & "'" &
"O" & "'" & " AND F_KAT =" & "'" & "V" & "'"
Set Rs_RDO = Db.OpenResultset(sSQL, rdOpenDynamic)
Do While Not Rs_RDO.EOF

Nu finder den fx. 150 records, der opfylder betingelserne.
Jeg indlæser 3 oplysninger, bl.a. FAKTNR som lægges i lngFAKNR, fra
headeren FAKTH1.
Herefter skal jeg så gennemløbe oprettede linier, hvis der ER oprettet
linier:

sSQL2 = "select * from FAKTLP1 where FAKTNR =" & lngFAKNR
Set Rs_RDO2 = Db.OpenResultset(sSQL2, rdOpenDynamic)
While Not Rs_RDO2.EOF
Her indlæses linie for linie og der sammentælles (sum)
Wend

Rs_RDO.MoveNext
Loop
<..kode>

Der findes ca. 25.000 records ialt, hvor der er ca. 150 records der matcher.
(sSQL)
Heraf har kun ca. 25 oprettet linier.(sSQL2)
Udkommenterer jeg SQL-trækket 'sSQL2' - så har den udført trækket på ca. 6
sek.
Medtager jeg trækket SQL-trækket 'sSQL2' - så er den 5 minutter om det.
....
Er der en i NG'en der kan gennemskue problemet ?
Jeg har tænkt på et 'kombineret' SQL-træk med JOIN (INNERJOIN), men er det
ikke problematisk,
når fundne record risikere ikke at have nogen linier oprettet ?

Håber på svar. På forhånd tak.

Mvh, L. Hansen
webmaster@dancar.dk





 
 
Tomas Christiansen (17-02-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 17-02-02 00:15

L. Hansen skrev:
> While Not Rs_RDO2.EOF
> Her indlæses linie for linie og der sammentælles (sum)
> Wend

Hvis det blot er en sammentællgin, som du har brug for, har du så
overvejet at lade SQL foretage sammentællingen i stedet - det plejer
at gå RET hurtigt!

Eksempel: SELECT SUM(BELOEB) FROM INDBETAL

-------
Tomas


L. Hansen (17-02-2002)
Kommentar
Fra : L. Hansen


Dato : 17-02-02 08:54

"Tomas Christiansen" <toc@blikroer.removethis.dk> skrev i en meddelelse
news:a4mp63$2398$1@news.cybercity.dk...
> Hvis det blot er en sammentællgin, som du har brug for, har du så
> overvejet at lade SQL foretage sammentællingen i stedet - det plejer
> at gå RET hurtigt!
>
> Eksempel: SELECT SUM(BELOEB) FROM INDBETAL
>
> -------
> Tomas
>

Hej

Desværre skal jeg også bruge oplysninger fra 3 andre felter.
Men har du nogen kommentarer til et forbedret SQL-træk ?

Mvh, Lennart
webmaster@dancar.dk






Tomas Christiansen (17-02-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 17-02-02 12:32

L. Hansen skrev:
> Desværre skal jeg også bruge oplysninger fra 3 andre felter.
> Men har du nogen kommentarer til et forbedret SQL-træk ?

Umiddelbart ikke andet end at ud fra mine erfaringer med Oracle 8i,
ADO og VB 6.0, går dine læsninger i database UMÅDELIG langsomt!

-------
Tomas


Rayman (17-02-2002)
Kommentar
Fra : Rayman


Dato : 17-02-02 16:59

Mit forslag er sådan:

SELECT * FROM [FAKTH1] INNER JOIN [FAKTLP1] ON [FAKTH1].[FAKTNO] =
[FAKTLP1].[FAKTNO] WHERE [FAKTH1].[F_STAT] = " .....

osv.

Her medtages jo selvfølgelig kun records, fra fakth1, hvor der er linier i
faktlp, men du kan jo ogaå vælge et RIGHT JOIN, og du får så bare NULL i de
felter som ikke eksisterer, hvis det er et problem, kan du måske bruge
IIf()...

Håber det hjælper lidt...
Mvh Rayman


"L. Hansen" <webmaster@dancar.dk> wrote in message
news:3c6ed192$0$89066$edfadb0f@dspool01.news.tele.dk...
> Hej
>
> Følgende kode benyttes via ODBC til at udføre et træk fra en AS/400
> Database.
> Jeg bruger VB5 Enterprise og RDO.
>
> <kode>
> sSQL = "select * from FAKTH1 where F_STAT =" & 10 & " AND F_KODE =" & "'"
&
> "O" & "'" & " AND F_KAT =" & "'" & "V" & "'"
> Set Rs_RDO = Db.OpenResultset(sSQL, rdOpenDynamic)
> Do While Not Rs_RDO.EOF
>
> Nu finder den fx. 150 records, der opfylder betingelserne.
> Jeg indlæser 3 oplysninger, bl.a. FAKTNR som lægges i lngFAKNR, fra
> headeren FAKTH1.
> Herefter skal jeg så gennemløbe oprettede linier, hvis der ER oprettet
> linier:
>
> sSQL2 = "select * from FAKTLP1 where FAKTNR =" & lngFAKNR
> Set Rs_RDO2 = Db.OpenResultset(sSQL2, rdOpenDynamic)
> While Not Rs_RDO2.EOF
> Her indlæses linie for linie og der sammentælles (sum)
> Wend
>
> Rs_RDO.MoveNext
> Loop
> <..kode>
>
> Der findes ca. 25.000 records ialt, hvor der er ca. 150 records der
matcher.
> (sSQL)
> Heraf har kun ca. 25 oprettet linier.(sSQL2)
> Udkommenterer jeg SQL-trækket 'sSQL2' - så har den udført trækket på ca. 6
> sek.
> Medtager jeg trækket SQL-trækket 'sSQL2' - så er den 5 minutter om det.
> ...
> Er der en i NG'en der kan gennemskue problemet ?
> Jeg har tænkt på et 'kombineret' SQL-træk med JOIN (INNERJOIN), men er det
> ikke problematisk,
> når fundne record risikere ikke at have nogen linier oprettet ?
>
> Håber på svar. På forhånd tak.
>
> Mvh, L. Hansen
> webmaster@dancar.dk
>
>





Tomas Christiansen (17-02-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 17-02-02 22:13

L. Hansen skrev:
> sSQL = "select * from FAKTH1 where F_STAT =" & 10 & " AND F_KODE ="
& "'" &
> "O" & "'" & " AND F_KAT =" & "'" & "V" & "'"
> Set Rs_RDO = Db.OpenResultset(sSQL, rdOpenDynamic)
....
> sSQL2 = "select * from FAKTLP1 where FAKTNR =" & lngFAKNR
> Set Rs_RDO2 = Db.OpenResultset(sSQL2, rdOpenDynamic)

Jeg kom til at tænke på, at du jo ret beset kan klare det hele i to
forespørgsler (altså to forskellige forspørgsler, som hver bliver
udført netop én gang hver).

Du kan hente dine primære oplysninger fra forespørgslen:

sSQL = "select * from FAKTH1 where F_STAT =" & 10 & " AND F_KODE =" &
"'" & _
"O" & "'" & " AND F_KAT =" & "'" & "V" & "'"

Jeg ville nu nok være at skrive den således (det er eddermandme svært
at læse med alle de ekstra-anførselstegn og unødvendige
streng-konkateneringer, som du foretager). Jeg har dog "knækket"
linien af hensyn til læsevenligheden i nyhedslæserprogrammet:

sSQL = "select * from FAKTH1 where F_STAT =10" & _
" and F_KODE ='O' and F_KAT ='V'"

Dine sekundære data vil du kunne hente fra denne forespørgsel:

sSQL2 = "select * from FAKTLP1 L where exists" & _
" (select * from FAKTH1 H where" & _
" H.F_STAT =10 and H.F_KODE ='O' and H.FAKNR=L.FAKNR)"

Du er nu nødt til at løbe resultatet af sSQL-forespørgslen igennem i
en løkke, og for hver post, skal du checke om FAKNR læst fra
sSQL-forespørgslen er det samme som FAKNR læst fra
sSQL2-forespørgslen.
Er dette tilfældet, er der altså linier til dette FAKNR - de læses nu
fra sSQL2-forespørgslen, indtil et nyt FAKNR dukker op.
Er det IKKE tilfældet, er der altså INGEN linier til dette FAKNR -
hvad du gør ved dette ved jeg jo ikke.
Nu læses igen en ny post fra sSQL-forespørgslen, og det hele gentager
sig, indtil alle poster i sSQL-forespørgslen er behandlet. Nu vil
(bør/skal/må) alle poster i sSQL2-forespørgslen dermed også være
behandlet.

Håber at det er forståeligt, ellers må du vende tilbage.

-------
Tomas




Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste