Ee eller andet geni som kan afkode den, så rækken aflæses fra venstre mod højre. Resultatet skal opdateres i en ny tabel med følgende :
Postnr Rutenr Gade StartHusnr SlutHusnr
Postmr, Rutenr og Gade giver sig selv, men StartHusnr hhv. SlutHusnr skal genereres efter følgende kriterier.
Første gang værdien 1 forekommer, skal kolonneoverskriften returneres som værdi i StartHusnr ... sidste gang 1 forekommer i intervalserien, skal kolonneoverskriften returneres som værdi i SlutHusnr ... ny post
Næste gang værdien 1 forekommer, skal kolonneoverskriften returneres som værdi i StartHusnr ... sidste gang 1 forekommer i intervalserien, skal kolonneoverskriften returneres som værdi i SlutHusnr ... ny post o.s.v. ... indtil rækken er slut
Nu har jeg noget, der fungerer. Det eneste der mangler er, at koden fejler, hvor gaden f.eks. hedder "Christian X's gade" fordi der er en apostrof i gadenavnet. Jeg skal lige have fundet ud, hvordan man indsætter en apostrof via SQL. Men for alt andet virker det.
Function fixit()
Dim rs As dao.Recordset Dim db As dao.Database Dim StartHusNr As Long Dim SlutHusNr As Long Dim SQL As String Dim s As String Dim i As Long Dim arr() As String
SQL = "SELECT * FROM Ligehusnumre"
Set db = CurrentDb Set rs = db.OpenRecordset(SQL)
'laver array med feltnavne For i = 3 To rs.Fields.Count - 1 s = s & rs.Fields(i).Name If i <> (rs.Fields.Count - 1) Then s = s & ";" End If Next arr = Split(s, ";") s = vbNullString 'gennemløber Do While Not rs.EOF For i = 3 To rs.Fields.Count - 1 s = s & rs(i) Next 'Debug.Print "s:" & s StartHusNr = arr(InStr(1, s, "1") - 1) SlutHusNr = arr(InStrRev(s, "1") - 1) 'indsæt i ny tabel SQL = "INSERT INTO tblCoopOutput (postnr,rutenr,gade,starthusnr,sluthusnr) VALUES (" & rs!postnr & "," & rs!rute & " ,'" & rs!gade & "'," & StartHusNr & "," & SlutHusNr & ")" 'Debug.Print SQL db.Execute SQL, dbFailOnError rs.MoveNext s = vbNullString Loop
'oprydning Erase arr rs.Close Set rs = Nothing Set db = Nothing
Dim rs As dao.Recordset Dim db As dao.Database Dim StartHusNr As Long Dim SlutHusNr As Long Dim sql As String Dim s As String Dim i As Long Dim arr() As String ' 2 34 ' 18 ' 2 44 sql = "SELECT * FROM Ligehusnumre"
Set db = CurrentDb Set rs = db.OpenRecordset(sql)
'laver array med feltnavne For i = 3 To rs.Fields.Count - 1 s = s & rs.Fields(i).Name If i <> (rs.Fields.Count - 1) Then s = s & ";" End If Next arr = Split(s, ";") s = vbNullString 'gennemløber Do While Not rs.EOF For i = 3 To rs.Fields.Count - 1 s = s & rs(i) Next 'Debug.Print "s:" & s StartHusNr = arr(InStr(1, s, "1") - 1) SlutHusNr = arr(InStrRev(s, "1") - 1) 'indsæt i ny tabel sql = "INSERT INTO tblCoopOutput (postnr,rutenr,gade,starthusnr,sluthusnr) VALUES (" & rs!postnr & "," & rs!rute & " ,'" & Replace(rs!gade, "'", "''") & "'," & StartHusNr & "," & SlutHusNr & ")" Debug.Print sql db.Execute sql, dbFailOnError rs.MoveNext s = vbNullString Loop
'oprydning Erase arr rs.Close Set rs = Nothing Set db = Nothing
Gud ved om problemet ikke er, at der reelt ikke er "huller" i intervallerne, når man kigger isoleret på det eksempel jeg har vist 26/01-2006 13:42:55 ...
Hvis man isolere postnr og gade i krydstabellen, får du ingen 0 værdier på rute 113, og så er det returnerede jo korrekt ... forstår du ?
Jeg prøver ligt at oprette en tabel ud fra krydstabuleringen, og køre modulet derfra
Hmmm ... burde ikke forekomme ... hvis den ikke kan finde husnummer overhovedet, burde den vel ikke optræde i krydstabuleringen, ... men hvis der udelukkende er 0-er, skal der ikke indsættes en post i tabellen
Den her ser ud til at virke. Denne failer ikke på subscript out of range.
Jeg får bl.a.
post start slut 1654 2 26
Function FixCoop()
Dim rs As dao.Recordset Dim db As dao.Database Dim StartHusNr As Long Dim SlutHusNr As Long Dim sql As String Dim s As String Dim i As Long Dim arr() As String
'1 2-34 '2 24-150 Set db = CurrentDb Set rs = db.OpenRecordset(sql)
rs.MoveLast rs.MoveFirst
'ProgressBar 5, 2, "Laver array..." 'laver array med feltnavne For i = 3 To rs.Fields.Count - 1 s = s & rs.Fields(i).Name If i <> (rs.Fields.Count - 1) Then s = s & ";" End If Next arr = Split(s, ";") s = vbNullString 'gennemløber Do While Not rs.EOF 'ProgressBar rs.RecordCount, rs.AbsolutePosition - 1, "" For i = 3 To rs.Fields.Count - 1 s = s & rs(i) Next If InStr(1, s, "1") > 0 Then StartHusNr = arr(InStr(1, s, "1") - 1) SlutHusNr = arr(InStrRev(s, "1") - 1) Else StartHusNr = 0 SlutHusNr = 0 End If
'indsæt i ny tabel sql = "INSERT INTO tblCoopOutput (postnr,rutenr,gade,starthusnr,sluthusnr) VALUES (" & rs!postnr & "," & rs!rute & " ,'" & Replace(rs!gade, "'", "''") & "'," & StartHusNr & "," & SlutHusNr & ")" 'Debug.Print sql db.Execute sql, dbFailOnError rs.MoveNext 'Debug.Print s s = vbNullString Loop
'oprydning ProgressBar 1, 1, "" Erase arr rs.Close Set rs = Nothing Set db = Nothing
Jeg må sige ... jeg er målløs ... den foreløbige stikprøvetest siger at det ser ud til at virke ....
Som du måske har observeret, begrænser jeg mine krydstabuleringer til at medtage husnumre til og med 500 ... ( dette af hensyn til max-grænsen for kolonner ), men reelt er der i de 1.9 mio. rækker husnumre op til 1.000 .... har jeg andre muligheder end at isolere dem i 4 krydstabuleringer ???
Jeg ved det faktisk ikke ... det er vores eksterne kunde som har bedt om at få det adskilt på den måde .... jeg tror det har noget at gøre med, at omdeling foregår på hver side af vejen ( deraf Lige/Ulige ) ... derfor skal der også genereres en række med de lige hudnumre og een med de ulige ...
Det har vist også noget med at gøre, at der er ruter som kun omdeler på enten lige eller ulige husnumre ...
Er det hele så kørt nu? Så er der måske ingen grund jeg forsøger at lave det direkte på den store tabel. Det kunne nu godt lade sig gøre tror jeg. Jeg tror det tog 5 min. her på min maskine lokalt. A64 3500+.
Lyder fint alt sammen. Jeg har sendt dig en mail. Vi vender tilbage til det, hvis noget mangler.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.