Ich möchte aus einer Tabelle einer Oracledatenbank die Werte
MOTORWAY_ENTRANCE_ID , MOTORWAY_ENTRANCE_NO , NAME and DISTRICT_ID in einem multidimensionalen Array eintragen.
Meine Datenbankabfrage sieht wie folgt aus:
my query = "select MOTORWAY_ENTRANCE_ID,MOTORWAY_ENTRANCE_NO,NAME,DISTRICT_ID from MOTORWAY_ENTRANCE where DISTRICT_ID LIKE '09%' AND VERSION_NO = '0' AND Version_END IS NULL"
1. Wie definiere ich einen multidimensionalen Array und befülle Ihn dann mit
meinen Werten ?
Als nächsten Schritt möchte ich dann innerhalb des Array bestimmte Werte raussuchen und diese dann in eine Variable speichern.
Also ich hab zum Beispiel eine MOTORWAY_ENTRANCE_NO die 20 ist und eine
MOTORWAY_ENTRANCE_NO die 50 ist. Jeweils davor und danach sind noch diverse weitere Nummern vergeben.
Ich möchte jetzt alle Einträge, die zwischen der 20 und der 50 liegen in eine separate Variable speichern.
2. Wie kann ich diese Suche über den oben definierten multidimensionalen Array am besten umsetzen ?
prinzipiell kannst du mal nach "jagged array" oder "multidimensional array" googeln. Dazu noch die bevorzugte Sprache als Stichwort, dann bekommst du reichlich Treffer
abgesehen von der ebenso naheliegenden wie berechtigten Frage nach der Skriptsprache wäre es evtl. interessant für dich, per ADO mit einem lokalen Recordset zu arbeiten statt mit einem Array. Das hat den Charme, dass du dann mit Datenbankmethoden arbeiten kannst.
hab ich ganz vergessen zu sagen.
Ich möchte das in VBA umsetzten.
Gruß
vsassenj
–
Noch ein nachtrag:
Der Zugriff auf die dB funktioniert einwandfrei.
Hier mal mein Skript:
Code:
Sub Main()
Dim wstemp As Workspace
Dim dbtemp As Database
Dim rstemp As Recordset
Dim myquery As String
Dim howmany As Variant
Dim Zaehler As Variant
Dim combo1 As Variant
Dim Anschlussstellevon As String
Dim Anschlussstellebis As String
Dim Autobahn As String
Dim AbfrageAutobahnabfahrt As String
Dim AbfrageAutobahnabschnitt As String
Dim AnschlussstellenBayernID(1000) As String
Dim Anschlusstellennummer(1000) As String
Dim AnschlussstellenDistrict(1000) As String
Dim AnschlussstellenName(1000) As String
Dim Ergebnis(100) As String
Dim x As Integer
Dim ListeAutobahnabfahrt(1000) As Autobahnabfahrt
'myquery = "select MOTORWAY_ENTRANCE_ID,MOTORWAY_ENTRANCE_NO,NAME,DISTRICT_ID from MOTORWAY_ENTRANCE where DISTRICT_ID LIKE '09%' AND VERSION_NO = '0' AND Version_END IS NULL"
'MsgBox myquery
Set wstemp = DBEngine.Workspaces(0)
Set dbtemp = wstemp.OpenDatabase("", False, false, "ODBC;DSN=xxx;USR=xxx;PWD=xxx")
Set rstemp = dbtemp.OpenRecordset(myquery, dbOpenDynaset, dbSQLPassThrough)
howmany = 0
Do Until rstemp.EOF
'MsgBox rstemp(0)
AnschlussstellenBayernID(howmany) = rstemp(0)
rstemp.MoveNext
howmany = howmany + 1
Loop
Zaehler = 0
For Zaehler = 0 To howmany - 1
'MsgBox AnschlussstellenBayernID(Zaehler)
Next
Ich bin soweit, das ich einzelner Werte in einen array einschreiben kann.
Da ich ja aber die Werte vergleichen muß, muß ich jetzt einen Weg finden, mit dem ich die Werte vergleichen kann.
Gruß
Jan von Sassen
Geändert von jan von sassen (14.08.2008 um 11:57 Uhr).
Grund: –––– Doppelpost – Automerge –––
wie gesagt, ein eleganter Weg ist ein lokales Recordset.
Vielleicht ist es für dich aber auch noch einfacher, wenn du einfach nur die Werte aus der Datenbank ausliest, die dich interessieren. Je nachdem, was du dann mit den Daten vorhast, sparst du dir dann das Zwischenspeichern. Die Datenbank erledigt das Filtern in jedem Fall effizienter.
Set rstemp = dbtemp.OpenRecordset(myquery, dbOpenDynaset, dbSQLPassThrough)
Daher wäre auch mein Vorschlag, gleich entspr. Query's zu definieren.
Für dein obiges Beispiel z.B. in die WHERE-Klausel noch ein
MOTORWAY_ENTRANCE_NO Between 20 AND 50
Zum Thema Arrays:
Folgendes wäre z.B. denkbar
Mit einem DIM varMeinArr(1000,10) z.B. ein zweidimensionales Array definieren
Dann die erste Dimension z.B. für die Zeile und die zweite Dimension für das Feld.
Angenommen du nimmst in der 2.Dim. die 1 für das Feld ..ENTRANCE_NO und die 2 für NAME könnte eine Schleife so aussehen:
Code:
for i = 0 to varZeilen
if varMeinArr(i,1) >=20 and varMeinArr(i,1) <=50 then
' aus varMeinArr(i,2) nun den Namen auslesen...
end if
next
wie gesagt, ein eleganter Weg ist ein lokales Recordset.
Vielleicht ist es für dich aber auch noch einfacher, wenn du einfach nur die Werte aus der Datenbank ausliest, die dich interessieren. Je nachdem, was du dann mit den Daten vorhast, sparst du dir dann das Zwischenspeichern. Die Datenbank erledigt das Filtern in jedem Fall effizienter.
Gruß, Nils
die beschriebene Suche ist der erste Schritt. Im nächsten Schritt muss ich mit dem so rausgefunden District_ID's wieder in der Datenbank nach Einträgen suchen, die dem Distict_ID zugeordnet sind.
Gruß
Jan
–
Moin Cybquest,
vielen Dank für den Ansatz, werde das gleich mal ausprobieren.
Gruß
Jan
Zitat von Cybquest
Du benutzt ja bereit eh Recordsets
Daher wäre auch mein Vorschlag, gleich entspr. Query's zu definieren.
Für dein obiges Beispiel z.B. in die WHERE-Klausel noch ein
MOTORWAY_ENTRANCE_NO Between 20 AND 50
Zum Thema Arrays:
Folgendes wäre z.B. denkbar
Mit einem DIM varMeinArr(1000,10) z.B. ein zweidimensionales Array definieren
Dann die erste Dimension z.B. für die Zeile und die zweite Dimension für das Feld.
Angenommen du nimmst in der 2.Dim. die 1 für das Feld ..ENTRANCE_NO und die 2 für NAME könnte eine Schleife so aussehen:
Code:
for i = 0 to varZeilen
if varMeinArr(i,1) >=20 and varMeinArr(i,1) <=50 then
' aus varMeinArr(i,2) nun den Namen auslesen...
end if
next
Geändert von jan von sassen (15.08.2008 um 12:06 Uhr).
Grund: –––– Doppelpost – Automerge –––
die beschriebene Suche ist der erste Schritt. Im nächsten Schritt muss ich mit dem so rausgefunden District_ID's wieder in der Datenbank nach Einträgen suchen, die dem Distict_ID zugeordnet sind.
das hört sich für mich so an, als wärest du mit einer SQL-Query mit JOIN am besten bedient. Lass doch die Datenbank die Arbeit machen, dafür ist sie ja da.