# [Access/VBA] Dynamische Datenbankabfragen



## Thomas Darimont (18. Dezember 2002)

Hi Leute,
ich hab da ein kleines Problem und ich hoffe ihr könnt mir da weiterhelfen.

Habe in Access ein Formular auf dem ein weiteres "Dummy"_Formular (Unterformular)[ufrm_Dummy] aufgebracht ist. Dieses Dummy Formular ändert je nachdem was der Benutzer aus einem Kombinationsfeld ausgewählt hat seinen "SourceObject"-Zeiger auf ein konkretes Unterformular mit mehreren Textfeldern. Jetzt hab ich auf dem Hauptformular eine Schaltfläche "Übernehmen", der auf klick eine Prozedur hinterlegt ist,die die datenbank abhänig von den jeweils auf den einzelnen 
Unterformularen vorkommenden TextFeldern die Daten Bank in den Entsprechenden Feldern Updated...

meine das so...

in der Datenbanktabelle KFZ gibt es die Spalten

KFZID
KFZHERSTELLER
KFZNETTO_PREIS
.
.
.


die Unterformulare haben dann die Textfelder

cng_KFZID
cng_KFZHERSTELLER
.
.
.

----
Wenn ich jetzt in der KomboBox einen Link angeklickt habe und ein konkretes Unterformular erscheint würde ich gerne haben, das durch
klick des Übernehmen-Buttons eine Prozedur gestartet wird, welche automatisch ermittelt, welche Textfelder auf den einzelnen U-Forms zu sehen sind, die Spalten in der Datenbanktabelle entsprechen also

cng_KFZID --> KFZID

usw... (Alle Textfelder mit cng_vorne dran entsprechen einer DB-Tabspalte)

und diese dann Updated mit dem Wert der Jeweiligen Textfelder...

Code:

'strKfzID enthält die auswahl der KOmboBox...

dim rs as adodb.recordset
set rs = new adodb.recordset

With rs
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Open "SELECT * FROM tblKfz WHERE KfzID=" & strKFZID
End With



'alle Textfelder bekomme ich ja mit 

dim ctl as control

for ctl in me.ufrm_Dummy.controls
   'hier kann ich alle Controls durchlaufen und mit
   if InStr(1,ctl.name,"cng_") then
   'kann ich testen, ob das textfeld einer Tab-Spalte entspricht
   'ETN = Entsprechender Tabellen Name ist Textfeldname ohne "cng_"!
   'wie mach´ich das???
   'ctl.name => String "cng_textfeldname"
   rs.Update !ETN = ctl.value

   end if
next 

rs.close

set rs = nothing

mein Problem ist jetzt konkret, das ETN ein Literal ist und nicht mit !ETN als Bezeichner verwendet werden kann... hat jemand ne Idee wie ich das lösen könnte???

gibt es auch eine andere Möglichkeit ausser bei allen Textfeldern cng_vorne dran wegzulassen?(Ist Kriterium bei der Überprüfung, ob Textfeld mit DatenbankSpalte korespondiert..) naja ...a
mal sehen 

Thx im vorraus Gruss Tom


----------



## Dario Linsky (18. Dezember 2002)

Igitt, Unterformulare... aber naja, jedem das seine. 

Wenn ich das richtig verstanden hab, willst Du eigentlich nur die ersten vier Zeichen vom Namen des Textfeldes abschneiden. Richtig?


```
Dim c As Control
Dim s As String
For Each c In Me.ufrm_Dummy.Controls
    If Left(c.Name, 4) = "cng_" Then
        s = Right(c.Name, Len(c.Name) - 4)
        ' ...
    End If
Next c
```
Das sollte genau das sein, was Du haben wolltest - vorrausgesetzt, ich hab Dich richtig verstanden.

Aber was willst Du da genau mit dem Update machen?


----------



## Thomas Darimont (18. Dezember 2002)

nicht ganz... das mit dem "abschneiden" macht replace... und update schreibt einfach nur den wert des textfeldes in die Datenbank...

mein Problem ist jetzt aber das Replace(ctl.name,"cng_","") einen String zurückgibt... damit kann ich aber bei der update anweisung nix anfangen, da nachdem !-Zeichen ein Bezeichner Folgen muss und ein String ist nunmal ein Literal...

muss das leider mit unterformularen machen... wird so verlangt...


----------



## Thomas Darimont (18. Dezember 2002)

sorry!!!!!!!!!!!!!!! hab da glaub ich ein stück code nicht mitgepostet... 

hab's aber jetzt... zwar etwas umständlich, aber so gehts... hab jetzt jedem Formular ein modul hinterlegt mit einer function get_data().... die wird jetzt nur noch aufgerufen und kümmert sich dann um die individuellen feldinhalte .... so ein blödsinn, will endlich wieder Java machen...


----------



## Dario Linsky (18. Dezember 2002)

Replace ersetzt eigentlich nur eine bestimmte Zeichenfolge und gibt dann die neue Zeichenfolge zurück:

```
Dim s As String
s = "12345"
s = Replace(s, "123", "0")
```
Dann steht in s nachher nur noch "045". Eigentlich selbsterklärend. 

Mit dem Update willst Du doch eigentlich nur in der Tabelle das Feld ETN ändern und in dieses Feld dann den Namen des Controls schreiben, oder?
Dann kannst Du doch einfach direkt eine Abfrage ausführen:

```
DoCmd.RunSQL "UPDATE tabelle SET ETN = " & deinString
```

Oder Du schreibst eben erst in das Recordset und dann speicherst Du das Recordset in der Datenbank:

```
rs.Fields("ETN") = deinString
rs.UpdateBatch
```



> muss das leider mit unterformularen machen... wird so verlangt...


Wer verlangt denn sowas?! 

Naja, Java ist nicht so mein Fall. Plattformunabhängigkeit in allen Ehren, aber irgendwie ist Java zu langsam. Dann lieber C++.


----------

