[SQL] Records samenvoegen

Pagina: 1
Acties:
  • 449 views sinds 30-01-2008
  • Reageer

  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
Heb al stevig gezocht op Google.com en GOT, maar kom er niet uit dus hierbij een poging

Een query levert het volgende resultaat op:
string 1
string 2
string 3
string n

n is ongeveer 760.000.
Om de gegevens op de juiste wijze te kunnen aanleveren, moet ik de strings in pakketjes van 32 stuks achter elkaar plakken. Je zou dan de volgende tabel krijgen:

string 1 & string 2 & string 3 & string ... & string 32
string 33 & string 34 & string 35 & string ... & string 64
etcetera

Ik ben al aan de klus geweest met bijvoorbeeld joins en unions, maar kom er niet uit. Kan iemand me een duwtje in de goede richting geven? :)

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Waarom wil je dit in SQL oplossen?

Who is John Galt?


  • sariel
  • Registratie: Mei 2004
  • Laatst online: 24-03 12:54
Is dit niet veel en veel makkelijker te doen met een php/asp/perl/c script?
dan kan je gewoon stukjes aan elkaar catten, in plaats van zitten klooien met sql...

Copy.com


  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
sariel schreef op vrijdag 06 januari 2006 @ 15:01:
Is dit niet veel en veel makkelijker te doen met een php/asp/perl/c script?
dan kan je gewoon stukjes aan elkaar catten, in plaats van zitten klooien met sql...
Goede vraag. Ik ken het adagium "gebruik de juiste code voor het juiste doel en leer de code als je hem niet kent", maar dat is wel even het antwoord.

In MS Access wordt deze query uitgespuugd en ik moet hem vervolgens naar een .txt exporteren. Ik wil het best doen met iets anders, maar het hoe en waarmee wordt dan even lastig voor me :'(

  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 18-03 09:04

jAnO!

lalalavanillevla

Je krijgt bij acces toch VBA?
Moet niet al te moeilijk zijn om daarin een functie te maken die de recordset geformatteerd uitpoept naar een ascii bestand.

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
jAnO! schreef op vrijdag 06 januari 2006 @ 15:49:
Je krijgt bij acces toch VBA?
Moet niet al te moeilijk zijn om daarin een functie te maken die de recordset geformatteerd uitpoept naar een ascii bestand.
Allen: het is gelukt met bovenstaand probleem (zie code). Ik krijg echter bij het uitvoeren van de code een hele vreemde foutmelding. De foutmelding komt namelijk pas op het scherm als het loopje al 640 keer succesvol is uitgevoerd. Eerst even de code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Compare Database

Private Sub Draai_query_Click()

    MsgBox ("De dump start, dit kan even duren...")
    
    Dim RCS As DAO.Recordset
    Dim RCS2 As DAO.Recordset
    Dim DBS As DAO.Database
    Dim Teller As Long
    Dim Tekst As String
    Dim fso, MyFile
    
    Set DBS = CurrentDb()
    Set RCS = DBS.OpenRecordset("Samenvoeg_2_deel1")
    Set RCS2 = DBS.OpenRecordset("Optellen PB1")
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set MyFile = fso.CreateTextFile("C:\test.txt", True)
    
    Teller = 1
    Tekst = ""
    'MsgBox (Tekst)
    
    'Loop door de recordset
    MyFile.Writeline ("C101")
    Do While Not (RCS.EOF Or Teller > 99968)
        Tekst = Tekst + RCS![TotaalString]
        
        If ((Teller Mod 32) = 0) Then
        
            MyFile.Writeline (Tekst)
            Tekst = ""
        
        End If
        
        RCS.MoveNext
        Teller = Teller + 1
   
    Loop
    
    MyFile.Writeline ("Z99968000000000" & RCS2![totaal1] & "                  ")
    MyFile.Writeline ("X")
    
    RCS.Close
    RCS2.Close
    
    MsgBox ("Klaar!")



End Sub


Bij de 641-ste keer krijg ik ineens de foutmelding: "Run time error 3464: data type mismatch in criteria expresssion". Het vreemde is echter dat in de recordset waar de data ("Tekst") vandaan getrokken wordt, niets bijzonders gebeurd. Het is een string van dezelfde lengte (64 posities) als alle andere 640 voorgaande records.

Ik zit er al behoorlijk lang naar te staren en naar te zoeken. Misschien dat jullie zien wat ik fout doe? :)

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Wilde gok:
De regel Tekst = Tekst + RCS![TotaalString] gaat fout omdat het veld TotaalString een NULL waarde bevat op record 641. Mijn advies is om eens goed te kijken naar dat record.

Een snelle oplossing: verander Tekst = Tekst + RCS![TotaalString] in het volgende:
Visual Basic:
1
Tekst = Tekst & RCS![TotaalString] & ""

Strings aan elkaar plakken doe je in VB trouwens met de &. Cijfers optellen doet je met de +. Het blijft een wilde gok dus wat meer informatie is gewenst.

It’s nice to be important but it’s more important to be nice


  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
pjonk schreef op vrijdag 13 januari 2006 @ 20:11:
Wilde gok:
De regel Tekst = Tekst + RCS![TotaalString] gaat fout omdat het veld TotaalString een NULL waarde bevat op record 641. Mijn advies is om eens goed te kijken naar dat record.

Een snelle oplossing: verander Tekst = Tekst + RCS![TotaalString] in het volgende:
Visual Basic:
1
Tekst = Tekst & RCS![TotaalString] & ""

Strings aan elkaar plakken doe je in VB trouwens met de &. Cijfers optellen doet je met de +. Het blijft een wilde gok dus wat meer informatie is gewenst.
Dank voor je snelle reply. Ik heb eerst de "+" in een "&" vervangen (stom |:( ): zelfde probleem. Toen vervolgens de dubbel quotes toegevoegd: zelfde probleem. Het bewuste record bevat de volgende informatie:
code:
1
"0016623  0000000HIER EEN TEKST         102247406       "

Hope this helps, want ik weet het niet meer :)

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Ja zal toch zelf moeten gaan debuggen. Nog een advies. Zet de optie "Break on all errors" aan dan zal VBA op de regel stoppen waar het fout gaat. Je vindt deze optie in de Visual basic editor onder Tools | Options.
Afbeeldingslocatie: http://home.quicknet.nl/qn/prive/jonkie.xl/gotimg/vb6.png

It’s nice to be important but it’s more important to be nice


  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
pjonk schreef op vrijdag 13 januari 2006 @ 21:34:
Ja zal toch zelf moeten gaan debuggen. Nog een advies. Zet de optie "Break on all errors" aan dan zal VBA op de regel stoppen waar het fout gaat. Je vindt deze optie in de Visual basic editor onder Tools | Options.
debuggen heeft plaatsgevonden en het wordt, zoals voorspeld ;) , veroorzaakt door een #Error waarde in de die recordset wordt aangroepen. Ik dacht het te kunnen omzeilen door iets te proberen in de trant van:
code:
1
2
3
4
5
6
7
8
9
IF ISERROR(RCS![TotaalString]) then

  RCS.Movenext
  Teller = Teller + 1
  Loop

Else

  doorgaan met de reguliere code

Dit blijkt helaas niet te werken :'( Weet iemand hoe je iets dergelijks wel kunt inrichten?
Dank! :)

[ Voor 3% gewijzigd door huistra op 19-01-2006 16:01 ]


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22:00
huistra schreef op vrijdag 13 januari 2006 @ 20:48:
code:
1
"0016623  0000000HIER EEN TEKST         102247406       "

Hope this helps, want ik weet het niet meer :)
Weet je zeker dat dat de inhoud is van het betreffende record?
Je geeft geen opdracht om te sorteren of zoiets, en dan is in SQL-land de volgorde van de records officieel ongedefinieerd tenzij je een geclusterde index hebt aangemaakt.

En wat doe je met RCS2? Daarvan zie ik alleen dat deze geopend wordt en weer gesloten? Waarom?

[ Voor 11% gewijzigd door jvdmeer op 19-01-2006 21:39 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
huistra schreef op donderdag 19 januari 2006 @ 15:59:
Dit blijkt helaas niet te werken :'( Weet iemand hoe je iets dergelijks wel kunt inrichten?
Dank! :)
Een andere debug optie:
code:
1
2
3
4
if teller = 641 then
  RCS.Movenext
  Teller = Teller + 1
end if

Dit is uiteraard geen oplossing, maar dan kom je er wel achter of je script na een tijd bij elk willekeurig record onderuit gaat, of kan je meer 'probleemgevallen' vinden en misschien een overeenkomst tussen deze probleemgevallen vinden. :)

{signature}


  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
jvdmeer schreef op donderdag 19 januari 2006 @ 21:38:
[...]


Weet je zeker dat dat de inhoud is van het betreffende record?
Je geeft geen opdracht om te sorteren of zoiets, en dan is in SQL-land de volgorde van de records officieel ongedefinieerd tenzij je een geclusterde index hebt aangemaakt.

En wat doe je met RCS2? Daarvan zie ik alleen dat deze geopend wordt en weer gesloten? Waarom?
Sorry, foutje van mij: hij loopt niet vast op het genoemde record, maar op een ander record waarin "#Error" staat. Blijkbaar kan hij daar niet mee omgaan.

RCS2 wordt wel degelijk gebruikt, kijk maar es goed ;)
Dank voor het meedenken!

  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
Voutloos schreef op donderdag 19 januari 2006 @ 22:29:
[...]

Een andere debug optie:
code:
1
2
3
4
if teller = 641 then
  RCS.Movenext
  Teller = Teller + 1
end if

Dit is uiteraard geen oplossing, maar dan kom je er wel achter of je script na een tijd bij elk willekeurig record onderuit gaat, of kan je meer 'probleemgevallen' vinden en misschien een overeenkomst tussen deze probleemgevallen vinden. :)
Ik ben dus niet meer op zoek naar een debug optie, maar meer op een manier op het volgende tegen VB te zeggen:

"Wanneer je in de recordset een record tegenkomt met #Error of een andere waarde waar je op vastlooopt, ga dan naar het volgende record"

:)

  • PopiPipo
  • Registratie: December 2000
  • Laatst online: 07-04 19:48
Misschien met : On Error Resume Next :?

Het is trouwens zowiezo wel handig om errors op een of andere manier af te vangen :X

[ Voor 53% gewijzigd door PopiPipo op 20-01-2006 09:24 ]


  • Boss
  • Registratie: September 1999
  • Laatst online: 20:50

Boss

+1 Overgewaardeerd

Je kan beter de query aanpassen die als basis wordt gebruikt voor deze bewerkingen. Als er ergens een #Fout of #Error als antwoord komt, is de formule van die kolom gewoon niet goed. Lijkt me een betere oplossing dan er omheen werken....

offtopic:
Even uit nieuwschierigheid: heeft dit programma iets te maken met het doorgeven van telefoonnummer mutaties aan KPN? Heb zelf een keer iets vergelijkbaars gemaakt wat hier erg veel overeenkomsten mee heeft (ook qua inhoud van de data).

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
Boss schreef op vrijdag 20 januari 2006 @ 09:31:
Je kan beter de query aanpassen die als basis wordt gebruikt voor deze bewerkingen. Als er ergens een #Fout of #Error als antwoord komt, is de formule van die kolom gewoon niet goed. Lijkt me een betere oplossing dan er omheen werken....

offtopic:
Even uit nieuwschierigheid: heeft dit programma iets te maken met het doorgeven van telefoonnummer mutaties aan KPN? Heb zelf een keer iets vergelijkbaars gemaakt wat hier erg veel overeenkomsten mee heeft (ook qua inhoud van de data).
Eens met je stelling dat je beter het probleem bij de bron kunt oplossen :)

Het gaat fout in de volgende query:
code:
1
2
3
SELECT Samenvoeg_1.PB_nummer & Samenvoeg_1.Naam_2 & Samenvoeg_1.Zakenpartner & Right("                                                                ",64-(Len(Samenvoeg_1.PB_nummer)+Len(Samenvoeg_1.Naam_2))+Len(Samenvoeg_1.Zakenpartner)) AS TotaalString
FROM Samenvoeg_1
WHERE (((Samenvoeg_1.volgnummer)>=1 And (Samenvoeg_1.volgnummer)<=99968));

In de gevallen waar 'ie over struikelt is Samenvoeg_1.Naam_2 leeg. Vermoedelijk (?) levert Len(Samenvoeg_1.Naam_2) dan een error op?

Of zou de fout ergens anders worden veroorzaakt? :)

offtopic:
Nee, gaat het niet over telefoonnummer mutaties maar over rekeningnummers en de Postbank. Zij hebben nogal strikte eisen ten aanzien van de bestandsopmaak... :)

[ Voor 9% gewijzigd door huistra op 20-01-2006 11:41 ]


  • Boss
  • Registratie: September 1999
  • Laatst online: 20:50

Boss

+1 Overgewaardeerd

Probeer eens
code:
1
len(nz(samenvoeg_1.naam_2))

En misschien handig om ook meteen nz() om de andere velden heen te zetten waar eventueel het resultaat leeg kan zijn.

De functie Nz maakt van een null-string (of zoals in jouw geval een leeg veld) een veld zonder inhoud, waardoor je er wel de functie Len op kan loslaten.

[ Voor 7% gewijzigd door Boss op 20-01-2006 12:00 ]

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • huistra
  • Registratie: April 2001
  • Laatst online: 08-05-2024
Boss schreef op vrijdag 20 januari 2006 @ 12:00:
Probeer eens
code:
1
len(nz(samenvoeg_1.naam_2))

En misschien handig om ook meteen nz() om de andere velden heen te zetten waar eventueel het resultaat leeg kan zijn.

De functie Nz maakt van een null-string (of zoals in jouw geval een leeg veld) een veld zonder inhoud, waardoor je er wel de functie Len op kan loslaten.
That gets the job done! Thanx, ik kende die nz() functie niet... :)
Pagina: 1