# Recordset in Array



## Icem@n (6. Oktober 2003)

Hallo zusammen,

ich hab da ein Problem ich benutze (VB6(SP5) und Access 2000)

ich hab ein Projekt wo ich per VB über ODBC eine Verbindung zu einer Datenbank mithilfe eines ADODC herstelle.

nun möchte ich mir das komplette Recordset der jeweiligen Tabelle in ein Array einlesen und dann erst damit arbeiten um das Netzwerk nicht zu belasten.


```
Private Sub Form_Load()
Set conn = New ADODB.Connection
conn.ConnectionString = "Data Source = Fernwartung"
conn.Open
Set rs = New Recordset
Set rs.ActiveConnection = conn
rs.Source = "firma"
rs.Open
Set DataList1.RowSource = Adodc1
    DataList1.ListField = "Firma_name"
rs.Close
conn.Close
End Sub
```

der zugriff auf das  Recordset funktioniert ja und ich kann mir auch die eine Spalte
in einen datalist anzeigen. 

Ich komme aber einfach nicht darauf wie man das Recordset vorher in ein Array liest und danach mit dem Array arbeitet um das Datalist zu füllen

Ich bin noch am Anfang was VB angeht und die 4 Wochen in der Umschulung waren meine ersten Schritte in VB bloss da wurde sowas halt nicht angesprochen.

kann mir BITTE jemand weiterhelfen  

Mfg Icem@n


----------



## Zorck (6. Oktober 2003)

Also so viel Anhnung hab ich davon auch nicht. Wenn ich dich aber richtig verstanden habe, willst du die ganze Tabelle in ein Array einlesen.
Ich würde das über eine einfache Schleife realiesieren.


```
for i = 0 to rs.RecordCount
   array(i) = rs.fields("Firma_name")
   rs.MoveNext
next i
```

Wenn ich jetzt nicht irgendwo nen Tipp- oder nen groben Denkfehler habe, müsste das hinhauen.


----------



## Icem@n (6. Oktober 2003)

das funktioniert so nicht muss man array vorher deklarieren?
weil der zeigt mir nen Syntaxerror bei Array.

und ich muss die komplette Tabelle in das Array einlesen weil ich mit den anderen Werten später noch arbeiten muss, muss man die dann in einer Schleife
zeile für Zeile einlesen und dann die einzelnen Spalten mit Platzhalter(z.b. ein Komma) kennzeichnen?


----------



## Zorck (6. Oktober 2003)

Klar musst du das Array deklarieren. Das ist ja auch nur das Prinzip, wie ich es machen würde.

Wenn du die ganze Tabelle einlesen willst, kannst du entweder die ganze Zeile einlesen oder direkt die einzelnen Spalten. Ich persönlich würde dann direkt die Spalten einlesen und diese dann (je nach Typ) in ein Array oder einen selbstdefinierten Datentyp speichern.

Wenn du nur Text einlesen willst, tut es eine zweidimensionales Array auch.

Array(Spalte,Zeile)

Ich hab jetzt die Zeile an zweite Stelle gesetzt, weil ich davon ausgegangen bin, dass die Anzahl der Zeilen im vorraus nicht bekannt sind.

Ich weiß ja nicht, wie weit du jetzt damit klar kommst. Wenn du's nicht hinbekommst, meld dich einfach nochmal!


----------



## Icem@n (6. Oktober 2003)

also so richtig verstanden hab ich es noch nicht

Ich habe 2 Spalten in der Tabelle(firma_id, Firma_name) die ich mit in das Array einlesen will daher brauch ich ja auch nur ein zweidimensionales Array.
damit handelt das es sich um ein zweidimensionales Array 


```
i = Array(1, 2)
```

oder?

vielleicht könntest du mir ja ein kleines Beispiel aufzeigen wie ich das Recordset in ein Array einlese und dann halt alle z.b. Firma_name einträge an die Listbox übergeben, währe echt dankbar dafür weil ich da irgendwie nicht so richtig Hintersteige.:sad:


----------



## Zorck (6. Oktober 2003)

```
dim RecordSet(1 to 2,1)
for i = 0 to rs.RecordCount
   redim preserve RecordSet(1 to 2, i+1) 'Array neu dimensioniert
   RecordSet (1,i) = rs.fields("firma_id")
   RecordSet(2,i) = rs.fields("firma_name")
   rs.MoveNext
next i
```

Damit müsste die Tabelle im Array sein! (kanns aber nicht testen)
Jetzt kannst du das Array einfach auslesen.


----------



## Icem@n (6. Oktober 2003)

@Zorck danke erst mal für deine Geduld,



```
ReDim Preserve RecordSet(1 To 2, i + 1) 'Array neu dimensioniert
```

da wirft er beim Kompilieren den Fehler

*Fehler beim kompilieren: Array bereits Dimensioniert *

kannst du damit was anfangen?


----------



## Zorck (6. Oktober 2003)

Ups!
Wie gesagt - konnte nicht testen.
Hab sowas schon lange nicht mehr gemacht!

Nimm mal das  "dim RecordSet(1 to 2,1)" raus und ersetz es mit dim RecordSet().


----------



## Icem@n (7. Oktober 2003)

mit Hilfe von Zorck(dickes Dankeschön nochmal) bin ich jetzt gut weitergekommen.
Hab jetzt aber noch ein kleines Problem

hier ist erst mal der Code


```
Option Explicit
Dim rs As ADODB.RecordSet
Dim conn As ADODB.Connection
Dim i, k

Private Sub DataList1_DblClick()
MsgBox "Test"
End Sub

Private Sub Form_Load()

Set conn = New ADODB.Connection
conn.ConnectionString = "Data Source = Fernwartung"
conn.Open
Set rs = New RecordSet
Set rs.ActiveConnection = conn
rs.Source = "Select * from firma"
rs.Open
Dim RecordSet()
i = 0
Do While Not rs.EOF
    ReDim Preserve RecordSet(1 To 2, i)
    RecordSet(1, i) = rs.Fields("firma_id")
    RecordSet(2, i) = rs.Fields("firma_name")
    i = i + 1
    rs.MoveNext
Loop

For k = 0 To 2                                      ' Array in die Listbox schreiben 
   List1.AddItem (RecordSet(2, k))
Next k

rs.Close
conn.Close
```

mein Problem ist die zuweisung der Einträge aus dem Array in die Listbox
wenn ich anstatt 


```
For k = 0 To 2 
   List1.AddItem (RecordSet(2, k))
Next k
```

*ich weiß ja das da nur 3 einträge sind daher hab ich einfach mal 2 für 3 durchläufe genommen (0,1,2)* 

wenn ich das schreibe


```
For k = 0 To  i
   List1.AddItem (RecordSet(2, k))
Next k
```

dann zeigt mir der Kompiler einen Fehler das er außerhalb des index ist was mir ja auch klar ist weil er nicht weiß wieviel Einträge das array hat. Wie müsste die schleife aussehen damit ich vorher überprüfe wieviele Einträge das Array hat?


----------



## Zorck (7. Oktober 2003)

Der Zähler für i müsste doch immer um genau eins größer sein als die Anzahl der Arrayeinträge. Also einfach:

```
for k = 0 to i-1
   .....
next k
```


----------



## Icem@n (7. Oktober 2003)

hi Zorck,

na logisch so hat es geklappt, das ich da nicht selbst drauf gekommen bin
aber wie sagt man so schön, man sieht den Wald vor lauter bäumen nicht.

dank dir Zorck  

meld mich falls nochwas ist

Mfg Icem@n


----------



## Xmas (10. Oktober 2003)

*Hi ...*

öhm ... ich glaube ihr macht euch viel zu viel arbeit ...erstens ... ist es möglich ein recordset sofort nach einer abfrage "offline" zu betreiben sodas dann weitere bewegungen innerhalb des recordsets das netzwerk nicht belasten ... das macht man beim open aufruf ... da kann man als parameter angeben wie er die datenbank öffnen soll ... wenn das für dich interressant ist meld dich ...

mit deinem array .. würde ich dir empfehlen du machst ein 
Private Type RSType
    FNR as long
    Fname as string
End Type

das muss über dem ersten sub stehn

im auslese sub machst du dann einfach
dim RS() as RSType

redim rs(recordset.recordcount)
for i = 1 to recordset.recordcount
    rs(i).fnr = recordset!Firmennummer
    rs(i).FName=...
next i

Feddich


----------

