Access Tabellenfelder automatisch füllen

Von: , 27.01.2011 08:15 Uhr

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

15 Antworten zu dieser Frage

  1. Antwort von nach 42 Minuten 1 hilfreich
    Re: Access Tabellenfelder automatisch füllen

    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

    • Antwort von nach einer Stunde 0 hilfreich
      Re^2: Access Tabellenfelder automatisch füllen

      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

      • Antwort von nach einer Stunde 0 hilfreich
        Re^3: Access Tabellenfelder automatisch füllen

        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

        • Antwort von nach einer Stunde 0 hilfreich
          Re^4: Access Tabellenfelder automatisch füllen

          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

          • Antwort von nach 3 Stunden 0 hilfreich
            Re^5: Access Tabellenfelder automatisch füllen

            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.

            • Antwort von nach 7 Stunden 0 hilfreich
              Re^6: Access Tabellenfelder automatisch füllen

              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

  2. Antwort von - abgemeldetes Mitglied - nach 50 Minuten 0 hilfreich
    Re: Access Tabellenfelder automatisch füllen

    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

    • Antwort von nach 7 Stunden 0 hilfreich
      Re^2: Access Tabellenfelder automatisch füllen

      Hallo Lars,

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

      Beste Grüße,
      Achim

  3. Antwort von nach einer Stunde 0 hilfreich
    Re: Access Tabellenfelder automatisch füllen

    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

    • Antwort von nach 7 Stunden 0 hilfreich
      Re^2: Access Tabellenfelder automatisch füllen

      Hallo Marco,

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

      Beste Grüße,
      Achim

  4. Antwort von nach 3 Stunden 0 hilfreich
    Re: Access Tabellenfelder automatisch füllen

    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!

    • Antwort von nach 7 Stunden 0 hilfreich
      Re^2: Access Tabellenfelder automatisch füllen

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

      Beste Grüße,
      Achim

  5. Antwort von nach 6 Stunden 1 hilfreich
    Re: Access Tabellenfelder automatisch füllen

    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

    • Antwort von nach 7 Stunden 0 hilfreich
      Re^2: Access Tabellenfelder automatisch füllen

      Hallo Uli!

      So klappt's!

      Vielen Dank+beste Grüße,
      Achim

    • Antwort von nach 10 Stunden 0 hilfreich
      Re: Access Tabellenfelder automatisch füllen

      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

      Jetzt auf diese Frage antworten.