Maken van een Array

Status
Niet open voor verdere reacties.

weswillem

Gebruiker
Lid geworden
8 nov 2011
Berichten
310
Het volgende gedeclareerd:
21 staat voor aantal kolommen in de dataset (0 tot 20)
Code:
Dim sPersonen(iAantalRecords, 21) As String

Bij listview 2 personen geslecteerd, krijg dus 2 x iPersID terug bv ",17,1"
Bij het debuggen gaat de 1e keer goed, maar zodra x=1 wordt krijg ik de melding
dat de index buiten de matrix grenzen ligt.
Iemand die mij op het padje kan brengen, ben nu al 3 dagen bezig.

Code:
   Private Sub SelectieMaken(ByVal iPersID As String, ByVal iAantalPersID As Integer)
        Dim k As Integer
        Dim iPos As Integer
        For k = 1 To iAantalPersID  'aantal geselecteerde Persid's van Personen
            If WerkId = 1 Or WerkId = 2 Then 'hebben dezelfde aantal velden met waardes
                mySQL = ""
                If k = 1 Then
                    iPersID = iPersID.Remove(0, 1) 'iPersID = ",17,1"  dus eerst 1e komma weghalen
                    iPos = InStr(iPersID, ",") 'aantal  posities tot en met komma
                    PersID = Microsoft.VisualBasic.Left(iPersID, iPos - 1) 'hou dus 17 over
                Else
                    iPersID = iPersID.Remove(0, iPos) '2e iPersID
                    PersID = iPersID
                End If
                If Weeknr = 0 Then  'Alle weken van de gekozen persoon
                    mySQL = "SELECT u.*, g.Voorl,g.Voorv, g.Naam FROM UrenPersoneel as u INNER JOIN Gegevens AS g  ON g.PersID= u.PersId Where      
                                   g.PersID =" & PersID & " ORDER BY u.Weeknr DESC"
                Else 'bepaalde week van de gekozen persoon
                    mySQL = "SELECT * FROM UrenPersoneel  WHERE PersID=" & PersID & " And Weeknr =" & Weeknr 'met weeknummer
                End If
                If WerkId = 4 Then  'Clienten
                    mySQL = "SELECT * FROM UrenClienten  WHERE PersID=" & PersID
                End If
            End If

            Dim ds As DataSet = New DataSet
            da = New OleDb.OleDbDataAdapter(mySQL, Conn)
            da.Fill(ds, "Zorgboerderij")
            iAantalRecords = ds.Tables(0).Rows.Count 'Krijg x aantal records terug
            For x = 0 To iAantalRecords - 1 'aantal Records
                For i = 0 To 21  'aantal kolommen=20
                    If Not IsDate(ds.Tables(0).Rows(x).Item(i)) Then  'Veld 0 tot en met 3 is geen datum
                        sPersonen(x, i) = ds.Tables(0).Rows(x).Item(i) '[COLOR="#FF0000"]- Hier gaat het fout met de matrix grenzen als x 1 is-[/COLOR]
                        MsgBox(sPersonen(x, i))
                    Else
                        sPersonen(x, i) = Format(CDate(ds.Tables(0).Rows(x).Item(i)), "HH:mm") & "-" & Format(CDate(ds.Tables(0).Rows(x).Item(i + 1)), "HH:mm")
                        MsgBox(sPersonen(x, i))
                        i = i + 1
                    End If
                Next i
            Next x
        Next k
end sub
 
Is sPersonen out of bounds of de dataset?

Er staat ook nergens waar je sPersonen (her)declareerd
 
Dit betreft een dataset.
In het form heb ik de declaratie geplaatst.
Wat is de bedoeling van herdeclaren?

De totale bedoeling is dat ik een overzicht wil maken in Word.
Hier vul ik dan de bookmarks als volgt naar gelang het aantal records
als volgt:
Code:
oWord.ActiveDocument.Bookmarks("Jaar").Range.Text = sPersonen(i, 2)
 oWord.ActiveDocument.Bookmarks("Weeknr").Range.Text = sPersonen(i, 3)

Ik probeer het te doorgronden.
Wat ik exact wil is dat de dataset gevuld met records van verschillende PersID's, zodat ik in 1x
alle gegevens van die geselecteerde personen op het overzicht in Word krijg.
 
Het is meer de vraag of de statement links of rechts van de '=' het probleem vormt. Ik verwacht de sPersonen(x,i) omdat die niet gedeclareerd wordt met voldoende rijen
 
Rode tekst is toegevoegd, bij msgbox zie ik de waardes alsmede het aantal rijen.
Dus 3 records gevonden(iAantalRecords=3), gaat hij er ook 3 er doorheen, dat weer wel.

Maar als ik de boormarks wil vullen is alles sPersonen(x,i) NOTHING

Code:
For x = 0 To iAantalRecords - 1 'aantal Records
                For i = 0 To 21  'aantal kolommen=20
                    [COLOR="#FF0000"]Dim sPersonen(x, i) As String[/COLOR]
                    If Not IsDate(ds.Tables(0).Rows(x).Item(i)) Then  'Veld 0 tot en met 3 is geen datum
                        sPersonen(x, i) = ds.Tables(0).Rows(x).Item(i)
                        'MsgBox(sPersonen(x, i) & " rijnr:    " & x)
                    Else
                        sPersonen(x, i) = Format(CDate(ds.Tables(0).Rows(x).Item(i)), "HH:mm") & "-" & Format(CDate(ds.Tables(0).Rows(x).Item(i + 1)), "HH:mm")
                        ' MsgBox(sPersonen(x, i) & " rijnr:   " & x)
                        i = i + 1
                    End If
                Next i
Next x
 
Laatst bewerkt:
Dat komt door de scope. De rode lijn wordt nu telkens gedaan. Dwz hij wordt iedere keer opnieuw gemaakt. Als je eenmalig de juiste array aan wil maken doe dat dan buiten de LOOP (dus voor de for x)

Overigens kun je misschien beter helemaal geen static array gebruiken maar LIST of MAP. Het aantal kollomen op elke rij is namelijk constant, dus zou je makkelijker met een LIST van ARRAY-20 kunnen werken. Die kun je wel dynamisch toevoegen zoveel je wilt en los je de problemen meteen op.
 
Heb het voor de For x geplaatst.
Nu wordt de array wel gevuld.
Bedankt voor de info
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan