Access Tabellenfelder automatisch füllen

Hallo,
ich erstelle gerade eine Datenbank in Access 2010, in der ich „auf Knopfdruck“ ein bestimmtes Feld mit Inhalten füllen möchte, die abhängig vom Inhalt eines anderen Feldes sind.
Genau gesagt: im Feld Standort der Tabelle TBL_Standorte steht eine Bezeichnung (z.B. ve201 oder on003-A), und daraus soll ein Wert für das Feld Ortsamt der gleichen Tabelle generiert werden. Allerdings nicht während der Eingabe, sondern später, wenn schon viele Werte eingeben wurden. Über die ersten 2 Zeichen der Bezeichnung (also im Beispiel ve bzw. on) kann der Wert für das Ortsamt ermittelt werden (hier Vegesack bzw. Oberneuland. Das klappt auch schon.
Jetzt scheitere ich aber daran, die ermittelten Werte in das Feld „Ortsamt“ zu schreiben. Hier mein (abgekürztes) Modul so weit:

Sub TabelleAuslesen()
Dim intz As Integer
Dim IntMax As Integer
Dim rst As ADODB.Recordset
Dim strStandort As String
Dim strOrtsamt As String

Set rst = CurrentProject.Connection.Execute(„Select Standort FROM TBL_Standorte“, , adCmdText)
IntMax = DCount(„Standort“, „TBL_Standorte“)

For intz = 1 To IntMax
strStandort = Mid(rst.Fields(„Standort“), 1, 2)
Select Case strStandort

Case „ve“
strOrtsamt = „Vegesack“

Case Else
strOrtsamt = „andere“

End Select

rst.MoveNext
Next intz

rst.Close

End Sub

Kann mir jemand helfen?
Beste Grüße, achimovic

Hallo,
in der Case-Anweisung sollte eine Update-Anweisung für das zu aktualisierende Feld eingefügt werden.

Beispielsweise:
snip…
Case „ve“
rst!MyField =„Vegesack“
rst.Update

Case else
rst!MyField =„andere“
rst.Update

…snap

hallo,

so ganz tief bewandert bin ich mit dem code nicht und auch leider nicht in access 2010.
aber vielleicht hilft es als denkanstoss.
naja, in deinem code liest du die möglichen werte ja aus der datenbank aus und ordnest sie nur der variablen ‚strOrtsamt‘ zu. nun musst du die variable noch in das feld schreiben. ich gehe mal davon aus, dass das feld in einem formular ist. demnach muss du den weg dahin ansprechen, also zum beispiel:
formularname.feldname.value = strOrtsamt
(formularname und feldname entsprechend deiner benennung im formular ändern)
bzw. wenn du die felder in einer tabelle füllen willst, dann benötigst du letztendlich ein ähnliches recordset, wie das, was du zum auslesen benutzt, nur eben zu schreiben (SET name=wert FROM tabelle WHERE zeiger oder id - leider weiss ich nicht genau, wie das in 2010 genau aussieht, den sql-string sollte man aber in der hilfe finden). ich würde für die eindeutige zuordnung des neuen wertes evtl. vorher noch das id-feld auslesen und dieses für die where-bedingung nutzen. dann schreibst du nach jeder zeile des ‚lesen‘-recordset-durchlaufs den neuen wert wieder zurück in die tabelle. feiner aber etwas komplizierter wäre eine lösung mittels array-variable, dann kannst du erst alle zeilen auslesen, die zugehörigen orte in das array schreiben und danach den schreibvorgang auf die datenbank auslösen. hier brauchst du die mitgeführte id, damit nicht jemand in der zwischenzeit einen neuen datensatz anlegt und die zuordnung mittels zeilenzeiger nicht mehr passt. sql-anweisung zum schreiben ist letztlich hier die gleich.
wenn du die daten in einem formular darstellst, musst du nach allem das formular aktualisieren (formular.refresh), sonst siehst du die änderungen erst nach dem schliessen und wieder öffnen.

viele grüße,
ls

Hallo,

was machst du denn mit der Variablen strOrtsamt ?
Das einzige was in deinem Modul passiert ist das sich beim Schleifendurchlauf jedes Mal die Variable ändert,
aber du schreibst den Inhalt der Variablen nirgendwo hin…

Verbesserungsvorschlag :
Sub TabelleAuslesen()
Dim intz As Integer
Dim rst As ADODB.Recordset
Dim strStandort As String
Dim strOrtsamt As String

Set rst = CurrentProject.Connection.Execute(„Select Standort FROM TBL_Standorte“, , adCmdText)

rst.MoveFirst

Do While Not (rs.EOF)
strStandort = Mid(rst.Fields(„Standort“), 1, 2)

Select Case strStandort

Case „ve“
strOrtsamt = „Vegesack“

Case Else
strOrtsamt = „andere“

End Select

rst.Edit
rst!DeinTabellenFeld = strOrtsamt
rst.Update
rst.MoveNext
Loop

rst.Close
Set rst = Nothing
End Sub

Gruss
Marco

Hallo Josef,
vielen Dank, das klingt schon mal vielversprechend. Aber leider kriege ich (als blutiger Anfänger) die Syntax nicht hin! Wie genau muss diese Zeile:

rst!MyField =„Vegesack“

lauten, wenn das zu füllende Feld die Bezeichnung „Ortsamt“ hat und aus der Tabelle „TBL_Standorte“ kommt?

Beste Grüße,
Achim

Case „ve“

rst!MyField =„Vegesack“

rst.Update

Case else

rst!MyField =„andere“

rst.Update

…snap

Hallo Achim,

du hast als Recordset nur das Feld Standort eingebunden

Set rst = CurrentProject.Connection.Execute(„Select Standort FROM TBL_Standorte“, , adCmdText)

Damit kannst du in deinem Recordset auch nur dieses Feld behandeln…

Ergänze das Recordset um das von dir benötigte Feld oder binde gleich die ganze Tabelle als Recordset ein:

Set rst = CurrentProject.Connection.Execute(„Select TBL_Standorte.* FROM TBL_Standorte“, , adCmdText)

So nun solltest du im Recordset auch auf das Feld Ortsamt zugreifen können = rst!Ortsamt.

der Eintrag zum Aktualisieren in der Case-Anweisung müsste dann so ausschauen:

snip…

Case „ve“
rst!Ortsamt =„Vegesack“
rst.Update
Case else
rst!Ortsamt=„andere“
rst.Update
…snap

Beste Grüße
Josef

Hallo Josef,
vielen Dank für die schnelle Antwort.
Habe alles so eingegeben, aber jetzt krieg ich den Laufzeitfehler ‚3251‘ gemeldet:
„Das aktuelle Recordset unterstützt keine Aktualisierung. Hierbei handelt es sich möglicherweise um eine Einschränkung seitens des Providers oder des gewählten LockTypes.“
Muss ich noch irgendwas an den Tabellen-/ oder Feldeigenschaften ändern?

Beste Grüße,
Achim

Hallo achimovic,
Hier ein Vorschlag von mir.

Sub TabelleAuslesen
On Error Resume TabelleAuslesen_Error
Dim DB as Dao.Database
Dim RSt1 as Dao.Recordset
Dim RSt2 as Dao.Recordset
Dim strStandort as String
Dim strSQL as String
Set DB = Me.RecordsetClone
Set RSt1 = DB.OpenRecordset(„Select Standort FROM TBL_Standorte“)
Do While Not RSt1.EOF
strStandort = RSt1!Standort
strStandort = Left(strStandort,2)
strSQL = "SELECT Ortsamt, Ortsamtsname FROM TBL_Ortsaemter WHERE Ortsamt = " & strStandort
Set RSt2 = DB.OpenRecordset StrSQL
If not rst2.eof then
RSt1.Edit

'An dieser Stelle weiss ich nicht was wo hin muss!

RSt1.Update
end if
RSt1.MoveNext
loop
TabelleAuslesen_Ende:
Set RSt1 = Nothing
Set RSt2 = Nothing
Set DB = Nothing
exit Sub
TabelleAuslesen_Error:
MsgBox Err.Description
Goto TabelleAuslesen_Ende
end sub

So oder so Ähnlich würde ich das machen.

M.f.G.
Frank
P.S. Wer einen Fehler findet darf ihn behalten!

Hallo Achim,
an den Tabelleneigenschaften musst du wahrscheinlich nichts ändern. Ich denke eher, dass es daran liegt, wie du die Tabelle ansprichst (ich arbeite nicht mit Access2010).

Versuch mal folgende Änderungen:

anstatt:
Dim rst As ADODB.Recordset
nimmst du:
Dim rst As DAO.Recordset

Set rst=CurrentDb.OpenRecordset(„TBL_Standorte“,dbOpenDynaset)

Die Fehlermeldung 3251 kann aber auch ein Hinweis sein, dass der Syntax rst!Feldname auf rst.Feldname zu ändern ist. Hier verhält sich Access unterschiedlich.

Hallo achimovic!

Ich kann Dir leider nicht weiterhelfen, da ich mich in Access leider nicht auskenne. Ich bin nur in Excel eingetragen.

MfG

Torsten Allard

Hallo achimovic,

erstens arbeite ich noch mit Acc2003 und zweitens habe ich noch nichts mit ADO gemacht…
Ich habe Dir Deinen Code mal umgebaut (DAO statt ADO)
Was Du vergessen hattest, war das Öffnen der Datensätze zum Editieren (rs.edit). Nachdem die Daten geschrieben sind, musst Du den Datensatz noch aktualisieren (rs.update). Die Variable „strOrtsamt“ hast Du nirgends definiert - ich habe das Feld direkt angesprochen (rs!Ortsamt, soll heissen Recordset!Ortsamt).

Hier nun der umgebaute Code:

Sub TabelleAuslesen()
Dim intz As Integer
Dim IntMax As Integer
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strStandort As String
Dim strOrtsamt As String

Set db = Application.CurrentDb
Set rs = db.OpenRecordset(„TBL_Standorte“)

IntMax = DCount(„Standort“, „TBL_Standorte“)

For intz = 1 To IntMax
strStandort = Mid(rs.Fields(„Standort“), 1, 2)

rs.Edit

Select Case strStandort

Case „ve“
rs!Ortsamt = „Vegesack“

Case Else
rs!Ortsamt = „andere“

End Select

rs.Update

rs.MoveNext
Next intz

rs.Close

End Sub

Ich hoffe, ich konnte Dir helfen? Bitte kurze Rückmeldung.

Gruß
Uli

Hallo Uli!

So klappt’s!

Vielen Dank+beste Grüße,
Achim

Hallo Josef,

musste noch ein rst.Edit ergänzen und unter Verweise einen Haken setzen und dann hat es geklappt!

Vielen Dank für die Hilfe!

Beste Grüße,
Achim

Hallo Frank,
vielen Dank für die Antwort… habe das Problem aber mit Hilfe anderer Antworten jetzt anders gelöst!

Beste Grüße,
Achim

Hallo Marco,

vielen Dank für die Antwort… habe das Problem aber inzwischen mit Hilfe anderer Antworten bereits gelöst.

Beste Grüße,
Achim

Hallo Lars,

vielen Dank für die Antwort… habe das Problem aber inzwischen mit Hilfe anderer Antworten bereits gelöst.

Beste Grüße,
Achim

Hallo Achimovic,

die mit der .execute(… Methode abgerufenen Daten kannst Du nicht bearbeiten.
Um Sie bearbeiten zu können, musst Du Sie z.B. mit openrecordset(…, adOpenDynamic) öffnen.
Dann kannst Du mit .edit Werte ändern und mit .update speichern.

Ich arbeite mit DAO und bin mit ADO nicht so bewandert.
Es gibt aber für ADO wenn Du danach googelst auch viele Anleitungen.

Sorry, dass ich Dir nicht besser helfen kann.

Gruß
Andreas

Hallo achimovic,

statt eines SELECT-Statements kannst Du ein UPDATE-Statement verwenden und die WHERE-Klausel entsprechend mit der Sring-Auswertung zurechtbasteln. Das gibt dann für jeden deiner Select-Case-Zweige ein eigenes Statement. Diese rufst Du dann einfach alle nacheinander auf.

Vielleicht gibt es auch eine geschicktere Lösung, aber diese fiel mir gerade ein.

Viel Erfolg!
Jochen