Access XP Sprachenabhängige ADO-Abfrage
Access XP
ADO 2.1
DAO 3.6
Mahlzeit,
ich hätte da eine Frage zu Access XP und den dazugehörigen ADO-Abfragen und zwar möchte ich gerne eine dynamische Abfrage nach Sprache haben.
Ich habe eine Tabelle mit 7 Spalten. Eine Spalte entspricht immer eine Sprache, bsp
Spalte1 Spalte2 Spalte3 [...] Spalte7
Spaltentitel DE GB FR ES IT
1. Tupel Montag Monday .... .... ....
Sinn und Zweck dieser Funktion ist es, dass ich Spalten in einer erstellten Excel-Tabelle je nach der Sprache unterschiedlich mit einer Überschrift versehe und diese unterschiedlichen Sprache soll er sich aus den verschiedenen Spalten in der Access-Tabelle holen.
Mir geht es jetzt darum, dass Access bei der Zeile 19 (str_Text(i) = Eval("ado_RS!" & lang)) meckert, dass es diesen Namen nicht gefunden hat. Wie spreche ich denn dynamisch jeweils immer die richtige Spalte / Sprache an? Also es soll bspw. herauskommen (str_Text(i) = ado_RS!DE o.Ä.)
Ich hoffe ich habe es nicht zu kompliziert erklärt.
Gruß
Axel
ADO 2.1
DAO 3.6
Mahlzeit,
ich hätte da eine Frage zu Access XP und den dazugehörigen ADO-Abfragen und zwar möchte ich gerne eine dynamische Abfrage nach Sprache haben.
Ich habe eine Tabelle mit 7 Spalten. Eine Spalte entspricht immer eine Sprache, bsp
Spalte1 Spalte2 Spalte3 [...] Spalte7
Spaltentitel DE GB FR ES IT
1. Tupel Montag Monday .... .... ....
Public Function fct_Sprache(lang As String, tabelle As String)
' lang = language
Dim i As Integer
Dim ado_RS As ADODB.Recordset
Set ado_RS = New ADODB.Recordset
Dim str_query As String
str_query = "SELECT " & lang & " FROM " & tabelle
ado_RS.Open str_query, CurrentProject.Connection, adOpenStatic, adLockReadOnly
ado_RS.MoveLast
ado_RS.MoveFirst
For i = 1 To UBound(str_Text) ' Von 1 bis maximale Größe der Variable
str_Text(i) = Eval("ado_RS!" & lang)
ado_RS.MoveNext
Next
ado_RS.Close
Set ado_RS = Nothing
End Function
Sinn und Zweck dieser Funktion ist es, dass ich Spalten in einer erstellten Excel-Tabelle je nach der Sprache unterschiedlich mit einer Überschrift versehe und diese unterschiedlichen Sprache soll er sich aus den verschiedenen Spalten in der Access-Tabelle holen.
Mir geht es jetzt darum, dass Access bei der Zeile 19 (str_Text(i) = Eval("ado_RS!" & lang)) meckert, dass es diesen Namen nicht gefunden hat. Wie spreche ich denn dynamisch jeweils immer die richtige Spalte / Sprache an? Also es soll bspw. herauskommen (str_Text(i) = ado_RS!DE o.Ä.)
Ich hoffe ich habe es nicht zu kompliziert erklärt.
Gruß
Axel
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 164866
Url: https://administrator.de/contentid/164866
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
5 Kommentare
Neuester Kommentar
Moin,
m.E. ist deine Datenstruktur ungeeignet. Was machst Du z.b. wenn eine Sprache hinzukommt? Die Definition von x Tabellen ändern? Naja
wie wär's mit einer Tabelle ala
Primary Key wäre ID+LANG
An die Funktion übergibst du dann nur noch ID und LANG und bekommst mittels
das Ergebniss zurück.
lg,
Slainte
/EDIT: Und im übrigen ist die Variable str_Text in deiner Funktion nicht definiert. Evtrl. kommt die Fehlermeldung daher.
m.E. ist deine Datenstruktur ungeeignet. Was machst Du z.b. wenn eine Sprache hinzukommt? Die Definition von x Tabellen ändern? Naja
wie wär's mit einer Tabelle ala
ID | LANG | TEXT
MON | DE | Montag
MON | EN | Monday
DIE | DE | Dienstag
DIE | EN | Tuesday
Primary Key wäre ID+LANG
An die Funktion übergibst du dann nur noch ID und LANG und bekommst mittels
"SELECT TEXT FROM tabelle WHERE ID=<id> AND LANG=<lang>"
lg,
Slainte
/EDIT: Und im übrigen ist die Variable str_Text in deiner Funktion nicht definiert. Evtrl. kommt die Fehlermeldung daher.
Die Variable str_Text ist ein Public Array, dass ausserhalb deklariert ist.
NIcht gerade die sauberste Programmier-Methode Warum gibts du das Array nicht als Ergebnis der Function zurück?Wie würde ich denn bei Deiner Idee anstatt in die Zeile mit (..MoveNext) in die nächste Spalte springen?
Wenn alles in ein Array soll, kannst Du das so machen:str_qery="SELECT TEXT FROM tabelle WHERE ID='" & id & "'"
ado_RS.Open str_query, CurrentProject.Connection, adOpenStatic, adLockReadOnly
do while not ado_RS.EOF
str_Text(i)=ado_RS!TEXT
i=i+1
ado_RS.MoveNext
done
ado_RS.Close
Allerdings erschliest sich mir nicht, warum alle Sprachen eines Begriffs (ohne die Sprache als INdex) in einem Array stehen sollen - Du wirst schon wissen was du damit tust
/EDIT: Typo
ich denke manchmal etwas quer. Warum ist das nicht die sauberste Programmiermethode??? Das erschließt sich mir nicht.
Welchen Wert hat str_Text() wenn ein fehler in der Funtion auftritt? oder wenn das SELECT nichts zurueck gibt? oder wenn die Function 2mal aufgerufen wird?Habe ich was falsch verstanden?? Das Ergebnis der Funktion wird doch in das Array zurück gegeben??!!??
Nicht ganz das gleiche. So wär's sauber:public function fct_Sprache(...) as Array
dim str_Temp() as String
ado_RS.Open ....
do while ...
str_Temp(i)=ado_RS!....
i=i+1
done
fct_Sprache = str_Temp
end function
in einer Array-Variable stehen habe und in einem Sub, wo ich die Excel-Tabelle erstelle, greift er auf dieses Array in einer For-i
Schleife zurück und schreibt die einzelnen Texte als Spaltenbegriffe. Klappt auch wunderbar genau so wie ich mir das
vorstelle.
Meiner Erfahrung nach rächen sich solche Konstrukte fürher oder später und dann hinterher den Code und die DB umzubiegen ist... häßlich Ich bin eher ein Freund hiervonSchleife zurück und schreibt die einzelnen Texte als Spaltenbegriffe. Klappt auch wunderbar genau so wie ich mir das
vorstelle.