Problem beim öffnen einer Datenbank

  • Allgemein

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    Problem beim öffnen einer Datenbank

    Hi Leute,

    ich möchte diesen Code auf meine Access-Datenbank anwenden:

    VB.NET-Quellcode

    1. Public Sub makeLowerCase()
    2. Dim rsArchiv As DAO.Recordset
    3. Dim rsBasic As DAO.Recordset
    4. Dim i%
    5. rsArchiv = CurrDB.OpenRecordset("ArchiveBasicData")
    6. rsBasic = CurrDB.OpenRecordset("BasicData")
    7. rsArchiv.MoveFirst
    8. Do Until rsArchiv!EOF
    9. rsArchiv.Edit
    10. If InStr(1, rsArchiv!EMail, "@") > 0 Then
    11. 'rsArchiv!EMail = LCase(rsArchiv!EMail)
    12. 'rsArchiv.Update
    13. rsArchiv.MoveNext
    14. End If
    15. Loop
    16. rsBasic.MoveFirst
    17. Do Until rsBasic!EOF
    18. rsBasic.Edit
    19. If InStr(1, rsBasic!EMail, "@") > 0 Then
    20. 'rsBasic!EMail = LCase(rsBasic!EMail)
    21. 'rsBasic.Update
    22. rsBasic.MoveNext
    23. End If
    24. Loop
    25. End Sub


    Leider gibt mir einen Fehler aus: "Unzulässige verwendung einer Eigenschaft". Er markiert dabei: rsArchiv = CurrDB.OpenRecordset("ArchiveBasicData").

    Was ist da falsch?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „bandchef“ ()

    Oh, das hab ich wohl übersehen. Nun bekomme ich aber in einer nächsten Zeile einen Fehler. "Do Until rsArchiv!EOF" -> Element in dieser Auflistung nicht gefunden. Was heißt das nun?

    Ich hab nun meinen Code weiter verändert. Jetzt ist der oben genannte Fehler weg, aber das Programm dauert zu lang. Ich hab hier auch 20000 Datensätze. Wenn ich mir aber einen Zähler ausgeben lassen will (Debug.Print()), dann sehe ich im Direktfenster auch nichts...

    VB.NET-Quellcode

    1. Public Sub makeLowerCase()
    2. Dim rsArchiv As DAO.Recordset
    3. Dim rsBasic As DAO.Recordset
    4. Dim i As Long
    5. Dim j As Long
    6. Set rsArchiv = CurrDB.OpenRecordset("ArchiveBasicData")
    7. Set rsBasic = CurrDB.OpenRecordset("BasicData")
    8. rsArchiv.MoveFirst
    9. Do Until rsArchiv.EOF
    10. rsArchiv.Edit
    11. If InStr(1, rsArchiv!EMail, "@") > 0 Then
    12. 'rsArchiv!EMail = LCase(rsArchiv!EMail)
    13. 'rsArchiv.Update
    14. rsArchiv.MoveNext
    15. End If
    16. Loop
    17. rsBasic.MoveFirst
    18. Do Until rsBasic.EOF
    19. rsBasic.Edit
    20. If InStr(1, rsBasic!EMail, "@") > 0 Then
    21. 'rsBasic!EMail = LCase(rsBasic!EMail)
    22. 'rsBasic.Update
    23. rsBasic.MoveNext
    24. End If
    25. Loop
    26. End Sub




    Könnt ihr mir helfen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „bandchef“ ()

    Den würde ich nur einsetzen, wenn am Datensatz etwas verändert werden soll.




    Aber ich will ja am Datensatz was verändern! Nur nochmal zum verständnis: Ich hab eine relative große Datenbank mit über 20000 Datensätzen. In dieser Tabelle der Datenbank gibt es eine Spalte die E-Mail-Adressen beinhaltet. Leider wurden hier manchmal E-Mail-Adressen case-sensitive sowie nicht case-sensitive eingetragen. Ich möchte nun alle E-Mail-Adressen von case-sensitive in nicht-case-sensitive umschreiben lassen, wozu ich eben so einen ähnlichen, wie von mir vorgeschlagenen, (funktionierenden :) ) Code brauche.
    Vielleicht reden wir aber aucht etwas aneinander vorbei? Die auskommentierten Codezeilen sind nur deswegen auskommentiert, weil ich erst mal überprüfen wollte ob das so überhaupt funktionieren KANN und nicht gleich irgendwelche Datensätze auf Teufel komm raus veränden wollte!


    Aber gut, ich soll also .Edit nicht einsetzen und ich hab eine Endlosschleife gebastelt. Was muss ich dann machen? Ich bin sozusagen, dann mit meinem Latein am Ende.


    Könnt ihr mir helfen?



    Edit: Jetzt hab ich gesehen, was ich falsch gemacht hab. Das .MoveNext ist an der falschen Stelle; jetzt hab ich auch verstanden warum ich eine Endlosschleife gebastelt hab :)

    Was ich aber nach wie vor nicht verstehe, ist, was ich außer .Edit anwenden soll (das schneller ist!) wenn ich einen Datensatz ändern möchte, was hier nun wirklich der Fall ist...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „bandchef“ ()

    bandchef schrieb:

    Leider wurden hier manchmal E-Mail-Adressen case-sensitive sowie nicht case-sensitive eingetragen.

    Wobei man das vermutlich sinnvoller mit reinem SQL lösen würde.

    in etwas:
    UPDATE tabelle SET feld=UCASE(feld) WHERE feld<>UCASE(feld) and CONTAINS(feld, '@')
    (mag je nach SQL Dialekt anders aussehen, aber das System wird wohl klar)
    Zerpflücken wir mal das Ganze:

    SQL-Abfrage

    1. UPDATE tabelle SET feld=UCASE(feld) WHERE feld<>UCASE(feld) and CONTAINS(feld, '@')


    UPDATE --> wird wohl klar sein... du willst ja was Updaten/Ändern
    tabelle --> hier muss der Tabellenname in deiner Access-Datenbank stehen, in welchem die besagte zu ändernde Spalte/Feld ist
    SET --> hiernach wird angegeben was die Datenbank machen soll
    feld --> hier muss der Spaltenname rein, in dem die Email adressen stehen
    feld=UCASE(feld) --> Er soll in der Spalte mit dem Namen feld (diesen solltest du anpassen... in EMail?!) den Inhalt von selbiger Spalte (feld/EMail) in Großbuchstaben eintragen
    "UCASE: Lediglich Kleinbuchstaben werden in Großbuchstaben konvertiert. Alle Großbuchstaben und sonstigen Zeichen bleiben unverändert. msdn.microsoft.com/de-de/library/53e2ew8a(v=vs.80).aspx"
    WHERE --> Hiernach kommt die Bedingung wo dies gemacht werden soll
    feld<>UCASE(feld) --> Es soll nur dort gemacht werden wo nicht schon alles in Großbuchstaben steht
    AND --> hiernach kommt eine weitere Bedingung die EBENFALLS (nicht, oder) erfüllt werden muss
    CONTAINS(feld, '@') --> Es soll nur dort gemachtw erden wo in der Spalte feld ein @ vorkommt.

    Du könntest auch LCASE verwenden, welches alle Groß- in Kleinbuchstaben formatieren würde.

    SQL-Abfrage

    1. UPDATE BasicData SET EMail=LCASE(EMail) WHERE EMail<>LCASE(EMail) AND CONTAINS(EMail, '@')

    würde im Gegensatz zu Picoflops Post alles in Kleinbuchstaben wandeln.

    Zumal ich dir empfehlen würde, einfach mal ne Kopie der Access Datenbank zu machen...
    Und in dieser Kopie einfach mal ne "Aktualisierungsabfrage" zu erstellen.
    Da kannst du dir das nämlich einfach zusammenklickern... Wenn dich dann interessiert was der SQL Befehl dazu ist, kannst du über Ansicht von Entwurf auf SQL (und auch zurück^^) schalten... Und so lernst du langsam was die Befehle so verursachen. Zudem hat Access einen sehr guten Formelgenerator und eine excellente Hilfe, welche dir in maximal 1er Minute suchen, gezeigt hätten wie sowas geht ohne ein Programm zu schreiben.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    Ich hab dann mal meinen Code so gemacht:

    VB.NET-Quellcode

    1. Dim rs As DAO.Recordset
    2. Set rs = CurrDB.OpenRecordset("UPDATE BasicData SET EMail=LCASE(EMail) WHERE EMail<>LCASE(EMail) AND CONTAINS(EMail, '@')")


    Wenn ich das aber so ausführen lasse, bekomm ich eine Fehlermeldung, dass dies eine unzulässige Operation ist.
    Mal so ne doofe Frage...

    Du hast ne Access-Datenbank...
    Wieso öffnest du die nicht mit Access?! Erstellst da ne Aktualisierungsabfrage...
    Dafür schreibt man doch kein Programm oO

    PS: Ich denke ACCESS kennt kein CONTAINS.
    Was dir Access aber auch sagen wird ;)

    CONTAINS ist im SQL Standard enthalten, welchen Access aber leider nicht komplett unterstützt... Alternativ zu CONTAINS wäre ein LIKE.

    SQL-Abfrage

    1. UPDATE BasicData SET EMail = LCase(EMail) WHERE EMail<>LCase(EMail) AND EMail Like '*@*';
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ich hab eine Access-Datenbank und öffne diese auch in Access 2007. Ich hab bisher keine andere Möglichkeit gesehen, meine Problemstellung mit was anderem als VBA-Code zu erledigen.

    Kann mir jemand genau erklären, wie das mit dem Abfrageassistenten geht? Ich hab bisher rausgefunden, dass man anscheinend auf "Erstellen" -> "Abfrageassistent" klicken muss. Was muss aber weiter passieren? Was muss ich dann noch tun?

    Nochmal kurz zum Code:

    VB.NET-Quellcode

    1. Dim DB As Database
    2. Dim RS As DAO.Recordset
    3. Set DB = CurrentDb
    4. Set RS = CurrDB.OpenRecordset("UPDATE BasicData SET EMail = LCase(EMail) WHERE EMail<>LCase(EMail) AND EMail Like '*@*';")


    Leider funktioniert anscheinend auch das Like nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „bandchef“ ()

    Also, ein Beispiel anhand einer Access Datenbank von mir... Da heißen natürlich die Tabellen und Spalten anders, aber das wirst du hoffentlich trotzdem verstehen ;)
    Auch benutze ich Access 2010... Das heißt die Symbole könnten etwas anders aussehen, aber du wirst sie wohl finden und wiedererkennen.

    Als erstes erstlelen wir eine Abfrage...


    Nun werden wir gefragt welche Tabellen wir verwenden möchten... Dort wirst du zB. deine BasicData Tabelle auswählen (Doppelklick).


    Nun sagen wir ihm, dass es eine Aktualisierungsabfrage werden soll (Standard ist eine Auswahlabfrage... Mit der kann man sich Daten bequem aus mehreren Tabellen zusammenziehen und anschauen).


    Nun muss ihm nurnoch gesagt werden, was er tun soll. Hierfür haben wir mehrere Felder. In meinem Fall benutze ich das Feld Suchbefriff (in deinem fall wäre es EMail) aus der Tabelle S_ArtikelOxa (in deinem Fall BasicData).
    Ich trage in der Spalte Aktualisieren "Kleinbst([Suchbegriff])" ein... Bei dir wäre es dann "Kleinbst([EMail])". Die [] um den Spaltennamen sind da, damit Access weiß dass es ein Spaltenname und kein stupider Text ist, der dort eingetragen wird. Wenn du die [] weg lässt, schreibt er in jeden Datensatz einfach "Suchbegriff" oder in deinem Fall "EMail" hinein.
    Unter Kriterien kommen nun die zwei Bedingungen... 1. ungleich Kleinbst von Suchbegriff und mit enthaltenem @.
    für Access also "<>Kleinbst([Suchbegriff]) Und Wie "*@*".

    Anschließend muss der Ausführen Button gedrückt werden (Access sagt dir davor wieviele Daten geändert werden).

    Wenn du nun sehen willst, wass Access da für nen SQL Befehl generiert hat, kannst du neben dem Ausführen-Symbol die Ansicht auf SQL stellen.

    PS: Irgendwie will er die letzten zwei Bilder nicht korrekt einfügen.[/email]
    Bilder
    • 4.png

      3,63 kB, 314×128, 113 mal angesehen
    • 5.png

      16,36 kB, 118×129, 675 mal angesehen
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    Dann würde ich sagen, dass ihm irgendwas an deiner Bedingung nicht gefällt. Da ich aber nicht sehe was du da so gemacht hast, ist es etwas schwer zu sagen ob das so alles richtig ist :P
    Nen (lesbarer) Screenshot wäre sehr hilfreich. ^^
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Mach aus dem ALike mal ein Wie ;)
    Access hat die nervige angewohnheit im Entwurfsmodus alles einzudeutschen... -.-*
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ich MEINE mich erinnern zu können dass ALike und Wie (oder auch Like) den Unterschied haben, dass ALike statt dem * ein % verwendet.
    Warum auch immer er das tut... oO Ist die Access Datenbank alt? ^^

    Änder dann mal in der Bedinung das *@* ind %@% um ^^
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ob du die Datenbank alt ist, weiß ich nicht. Ich arbeite jetzt seit 7 Wochen damit und soll sie eben warten.

    Nach wie vor übrigens leider das gleiche Problem wie vorher... Stören ihn vielleicht die Anführungszeichen?

    Edit: Die Anführungszeichen waren's übrigens auch nicht.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „bandchef“ ()