Wie bekomme ich die ID des neu eingefügten Datensatzes mit Excel VBA?

7

Scheint ein häufig genug auftretendes Problem, aber die meisten Lösungen beziehen sich auf die Verkettung mehrerer SQL-Befehle, etwas, das ich glaube, kann nicht mit ADO / VBA durchgeführt werden (Ich bin froh, in dieser Hinsicht jedoch falsch dargestellt zu werden) / p>

Ich füge derzeit meinen neuen Datensatz ein und führe dann eine Auswahlabfrage mit (hoffentlich) genügend Feldern aus, um zu garantieren, dass nur der neu eingefügte Datensatz zurückgegeben werden kann. Auf meine Datenbanken wird selten von mehr als einer Person gleichzeitig zugegriffen (vernachlässigbares Risiko, dass ein anderes Einfügen zwischen Abfragen stattfindet) und aufgrund der Struktur der Tabellen ist die Identifizierung des neuen Datensatzes normalerweise recht einfach.

Ich versuche jetzt, eine Tabelle zu aktualisieren, die nicht viel Spielraum für Eindeutigkeit bietet, außer im künstlichen Primärschlüssel. Dies bedeutet, dass das Risiko besteht, dass der neue Datensatz nicht eindeutig ist, und ich hasse es, ein Feld hinzuzufügen, um die Eindeutigkeit zu erzwingen.

Was ist der beste Weg, einen Datensatz in eine Access-Tabelle einzufügen und dann in dieser Situation den neuen Primärschlüssel aus Excel abzufragen?

Danke für die Antworten. Ich habe versucht, @@IDENTITY funktioniert zu bekommen, aber dies liefert immer 0 mit dem folgenden Code.

%Vor%

Irgendetwas fällt auf, verantwortlich zu sein?

Angesichts der von Renaud (unten) hilfreich zur Verfügung gestellten Vorbehalte scheint jedoch bei der Verwendung von @@IDENTITY fast genauso viel Risiko zu bestehen wie bei jeder anderen Methode. Daher habe ich vorläufig auf SELECT MAX zurückgegriffen. Für zukünftige Referenz würde mich jedoch interessieren, was mit meinem Versuch oben falsch ist.

    
Lunatik 27.02.2009, 15:07
quelle

6 Antworten

12

Über Ihre Frage:

  

Ich versuche jetzt, eine Tabelle zu aktualisieren   hat nicht viel Spielraum für   Einzigartigkeit, anders als in der   künstlicher Primärschlüssel. Das heisst   Es besteht ein Risiko, dass der neue Rekord   vielleicht nicht einzigartig, und ich verabscheue es   füge ein Feld hinzu, um die Eindeutigkeit zu erzwingen.

Wenn Sie ein AutoIncrement für Ihren Primärschlüssel verwenden, haben Sie eine Eindeutigkeit und Sie könnten SELECT @@Identity; verwenden, um den Wert der letzten automatisch generierten ID abzurufen (siehe unten stehende Einschränkungen).

Wenn Sie nicht Autoincrement verwenden und die Datensätze aus Access einfügen, aber die letzte aus Excel abrufen möchten:

  • Stellen Sie sicher, dass Ihr Primärschlüssel sortierbar ist, sodass Sie den letzten mit einer Abfrage wie der folgenden erhalten können:

    %Vor%
  • oder, würde die Sortierung Ihres primären Felds Ihnen nicht die letzte geben, müssten Sie ein DateTime-Feld hinzufügen (zB InsertedDate ) und das aktuelle Datum und die Uhrzeit jedes Mal speichern, wenn Sie einen neuen Datensatz in dieser Tabelle erstellen also könntest du den letzten so bekommen:

    %Vor%

In beiden Fällen denke ich, dass das Hinzufügen eines AutoIncrement-Primärschlüssels wesentlich einfacher ist:

  • Es wird dich nicht viel kosten

  • Es garantiert Ihnen die Einzigartigkeit Ihrer Unterlagen, ohne darüber nachdenken zu müssen

  • Es wird Ihnen die Auswahl des letzten Datensatzes erleichtern, entweder mit @@Identity oder durch Sortierung nach dem Primärschlüssel oder nach dem Max() .

Aus Excel

Um die Daten in Excel zu erhalten, haben Sie mehrere Möglichkeiten:

  • Erstellen Sie eine Datenverbindung mithilfe einer Abfrage, sodass Sie das Ergebnis direkt in einer Zelle oder einem Bereich verwenden können.

  • Abfrage von VBA:

    %Vor%

Hinweis zu @@Identity

Sie müssen vorsichtig mit den Vorbehalten umgehen, wenn Sie @@Identity verwenden. in Standard-Access-Datenbanken (*):

  • Es funktioniert nur mit AutoIncrement Identity-Feldern.

  • Sie ist nur verfügbar, wenn Sie ADO verwenden und SELECT @@IDENTITY;

  • ausführen
  • Es gibt den zuletzt verwendeten Zähler zurück, aber das gilt für alle Tabellen Sie können es nicht verwenden, um den Zähler für eine bestimmte Tabelle in MS Access zurückzugeben (soweit ich weiß, wenn Sie eine Tabelle mit FROM mytable angeben, wird es einfach ignoriert).
    Kurz gesagt, der zurückgegebene Wert ist möglicherweise nicht der Wert, den Sie erwarten.

  • Sie müssen es direkt nach einem INSERT abfragen, um das Risiko einer falschen Antwort zu minimieren.
    Das bedeutet, wenn Sie Ihre Daten auf einmal eingeben und die letzte ID zu einem anderen Zeitpunkt (oder an einem anderen Ort) abrufen müssen, funktioniert sie nicht.

  • Last but not least wird die Variable nur gesetzt, wenn Datensätze über den Programmcode eingefügt werden.
    Dies bedeutet, dass der Datensatz über die Benutzeroberfläche hinzugefügt wurde, @@IDENTITY wird nicht festgelegt.

(*): Um klar zu sein, verhält sich @@IDENTITY anders und vorhersagender, wenn Sie den ANSI-92 SQL-Modus für Ihre Datenbank verwenden.
Das Problem ist jedoch, dass ANSI 92 eine etwas andere Syntax hat als Der von Access unterstützte ANSI 89-Flavor soll die Kompatibilität mit SQL Server erhöhen, wenn Access als Frontend verwendet wird.

    
Renaud Bompuis 28.02.2009, 03:16
quelle
7

Wenn der künstliche Schlüssel eine automatische Nummer ist, können Sie @@ identity verwenden.

Beachten Sie, dass die Transaktion bei diesen beiden Beispielen von anderen Ereignissen isoliert ist, so dass die zurückgegebene Identität diejenige ist, die gerade eingefügt wurde. Sie können dies testen, indem Sie den Code bei Debug.Print db.RecordsAffected oder Debug.Print LngRecs anhalten und einen Datensatz manuell in Tabelle1 einfügen, den Code fortsetzen und beachten, dass die zurückgegebene Identität nicht die des manuell, sondern des vorherigen Datensatzes ist Datensatz eingefügt durch Code.

DAO-Beispiel

%Vor%

ADO-Beispiel

%Vor%     
Fionnuala 27.02.2009 15:42
quelle
3

Re: "Ich habe versucht, @@ IDENTITY funktionsfähig zu machen, aber dies liefert immer 0 unter Verwendung des folgenden Codes."

Ihr Code sendet SQL und SQL2 über verschiedene Verbindungsobjekte. Ich glaube nicht, dass @@identity etwas anderes als Null zurückgibt, es sei denn, Sie fragen von der gleichen Verbindung aus, in der Sie Ihre INSERT -Anweisung ausgeführt haben.

Versuchen Sie, dies zu ändern:

%Vor%

zu:

%Vor%     
HansUp 12.03.2009 17:16
quelle
0

Hier ist meine Lösung, die nicht @@ index oder MAX verwendet.

%Vor%

Viel Spaß!

    
Eric 27.01.2012 23:27
quelle
0

Versuchen Sie, folgenden Makrocode zu befolgen: Fügen Sie zunächst eine Befehlsschaltfläche zum Schaltplan aus dem Steuerungsfeld hinzu und fügen Sie die folgenden Codes in das Codefenster ein

%Vor%     
Chris Bode 01.03.2009 06:29
quelle
0
___ answer639595 ___

Re: "Ich habe versucht, @@ IDENTITY funktionsfähig zu machen, aber dies liefert immer 0 unter Verwendung des folgenden Codes."

Ihr Code sendet %code% und %code% über verschiedene Verbindungsobjekte. Ich glaube nicht, dass %code% etwas anderes als Null zurückgibt, es sei denn, Sie fragen von der gleichen Verbindung aus, in der Sie Ihre %code% -Anweisung ausgeführt haben.

Versuchen Sie, dies zu ändern:

%Vor%

zu:

%Vor%     
___ qstntxt ___

Scheint ein häufig genug auftretendes Problem, aber die meisten Lösungen beziehen sich auf die Verkettung mehrerer SQL-Befehle, etwas, das ich glaube, kann nicht mit ADO / VBA durchgeführt werden (Ich bin froh, in dieser Hinsicht jedoch falsch dargestellt zu werden) / p>

Ich füge derzeit meinen neuen Datensatz ein und führe dann eine Auswahlabfrage mit (hoffentlich) genügend Feldern aus, um zu garantieren, dass nur der neu eingefügte Datensatz zurückgegeben werden kann. Auf meine Datenbanken wird selten von mehr als einer Person gleichzeitig zugegriffen (vernachlässigbares Risiko, dass ein anderes Einfügen zwischen Abfragen stattfindet) und aufgrund der Struktur der Tabellen ist die Identifizierung des neuen Datensatzes normalerweise recht einfach.

Ich versuche jetzt, eine Tabelle zu aktualisieren, die nicht viel Spielraum für Eindeutigkeit bietet, außer im künstlichen Primärschlüssel. Dies bedeutet, dass das Risiko besteht, dass der neue Datensatz nicht eindeutig ist, und ich hasse es, ein Feld hinzuzufügen, um die Eindeutigkeit zu erzwingen.

Was ist der beste Weg, einen Datensatz in eine Access-Tabelle einzufügen und dann in dieser Situation den neuen Primärschlüssel aus Excel abzufragen?

Danke für die Antworten. Ich habe versucht, %code% funktioniert zu bekommen, aber dies liefert immer 0 mit dem folgenden Code.

%Vor%

Irgendetwas fällt auf, verantwortlich zu sein?

Angesichts der von Renaud (unten) hilfreich zur Verfügung gestellten Vorbehalte scheint jedoch bei der Verwendung von %code% fast genauso viel Risiko zu bestehen wie bei jeder anderen Methode. Daher habe ich vorläufig auf %code% zurückgegriffen. Für zukünftige Referenz würde mich jedoch interessieren, was mit meinem Versuch oben falsch ist.

    
___ qstnhdr ___ Wie bekomme ich die ID des neu eingefügten Datensatzes mit Excel VBA? ___ answer597434 ___

Über Ihre Frage:

  

Ich versuche jetzt, eine Tabelle zu aktualisieren   hat nicht viel Spielraum für   Einzigartigkeit, anders als in der   künstlicher Primärschlüssel. Das heisst   Es besteht ein Risiko, dass der neue Rekord   vielleicht nicht einzigartig, und ich verabscheue es   füge ein Feld hinzu, um die Eindeutigkeit zu erzwingen.

Wenn Sie ein AutoIncrement für Ihren Primärschlüssel verwenden, haben Sie eine Eindeutigkeit und Sie könnten %code% verwenden, um den Wert der letzten automatisch generierten ID abzurufen (siehe unten stehende Einschränkungen).

Wenn Sie nicht Autoincrement verwenden und die Datensätze aus Access einfügen, aber die letzte aus Excel abrufen möchten:

  • Stellen Sie sicher, dass Ihr Primärschlüssel sortierbar ist, sodass Sie den letzten mit einer Abfrage wie der folgenden erhalten können:

    %Vor%
  • oder, würde die Sortierung Ihres primären Felds Ihnen nicht die letzte geben, müssten Sie ein DateTime-Feld hinzufügen (zB %code% ) und das aktuelle Datum und die Uhrzeit jedes Mal speichern, wenn Sie einen neuen Datensatz in dieser Tabelle erstellen also könntest du den letzten so bekommen:

    %Vor%

In beiden Fällen denke ich, dass das Hinzufügen eines AutoIncrement-Primärschlüssels wesentlich einfacher ist:

  • Es wird dich nicht viel kosten

  • Es garantiert Ihnen die Einzigartigkeit Ihrer Unterlagen, ohne darüber nachdenken zu müssen

  • Es wird Ihnen die Auswahl des letzten Datensatzes erleichtern, entweder mit %code% oder durch Sortierung nach dem Primärschlüssel oder nach dem %code% .

Aus Excel

Um die Daten in Excel zu erhalten, haben Sie mehrere Möglichkeiten:

  • Erstellen Sie eine Datenverbindung mithilfe einer Abfrage, sodass Sie das Ergebnis direkt in einer Zelle oder einem Bereich verwenden können.

  • Abfrage von VBA:

    %Vor%

Hinweis zu %code%

Sie müssen vorsichtig mit den Vorbehalten umgehen, wenn Sie %code% verwenden. in Standard-Access-Datenbanken (*):

  • Es funktioniert nur mit AutoIncrement Identity-Feldern.

  • Sie ist nur verfügbar, wenn Sie ADO verwenden und %code%

  • ausführen
  • Es gibt den zuletzt verwendeten Zähler zurück, aber das gilt für alle Tabellen Sie können es nicht verwenden, um den Zähler für eine bestimmte Tabelle in MS Access zurückzugeben (soweit ich weiß, wenn Sie eine Tabelle mit %code% angeben, wird es einfach ignoriert).
    Kurz gesagt, der zurückgegebene Wert ist möglicherweise nicht der Wert, den Sie erwarten.

  • Sie müssen es direkt nach einem %code% abfragen, um das Risiko einer falschen Antwort zu minimieren.
    Das bedeutet, wenn Sie Ihre Daten auf einmal eingeben und die letzte ID zu einem anderen Zeitpunkt (oder an einem anderen Ort) abrufen müssen, funktioniert sie nicht.

  • Last but not least wird die Variable nur gesetzt, wenn Datensätze über den Programmcode eingefügt werden.
    Dies bedeutet, dass der Datensatz über die Benutzeroberfläche hinzugefügt wurde, %code% wird nicht festgelegt.

(*): Um klar zu sein, verhält sich %code% anders und vorhersagender, wenn Sie den ANSI-92 SQL-Modus für Ihre Datenbank verwenden.
Das Problem ist jedoch, dass ANSI 92 eine etwas andere Syntax hat als Der von Access unterstützte ANSI 89-Flavor soll die Kompatibilität mit SQL Server erhöhen, wenn Access als Frontend verwendet wird.

    
___ answer595271 ___

Wenn der künstliche Schlüssel eine automatische Nummer ist, können Sie @@ identity verwenden.

Beachten Sie, dass die Transaktion bei diesen beiden Beispielen von anderen Ereignissen isoliert ist, so dass die zurückgegebene Identität diejenige ist, die gerade eingefügt wurde. Sie können dies testen, indem Sie den Code bei Debug.Print db.RecordsAffected oder Debug.Print LngRecs anhalten und einen Datensatz manuell in Tabelle1 einfügen, den Code fortsetzen und beachten, dass die zurückgegebene Identität nicht die des manuell, sondern des vorherigen Datensatzes ist Datensatz eingefügt durch Code.

DAO-Beispiel

%Vor%

ADO-Beispiel

%Vor%     
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ answer599380 ___

Versuchen Sie, folgenden Makrocode zu befolgen: Fügen Sie zunächst eine Befehlsschaltfläche zum Schaltplan aus dem Steuerungsfeld hinzu und fügen Sie die folgenden Codes in das Codefenster ein

%Vor%     
___ tag123excel ___ Nur für Fragen zur Programmierung von Excel-Objekten oder -Dateien oder zur Entwicklung komplexer Formeln. Sie können das Excel-Tag mit VBA, VSTO, C #, VB.NET, PowerShell, OLE-Automatisierung und anderen programmierbezogenen Tags und Fragen kombinieren, falls zutreffend. Allgemeine Hilfe zu MS Excel für einzelne Arbeitsblattfunktionen ist bei Super User verfügbar. ___ antwort43880350 ___

8 Jahre zu spät zur Party ... Das Problem, das Sie haben, ist, dass Sie dbConnectionString verwenden, um eine neue Verbindung zu erstellen. @@ identity ist spezifisch für die Verbindung, die Sie verwenden.

Schließen Sie nicht zuerst die ursprüngliche Verbindung

%Vor%

ersetzen

%Vor%

mit der Verbindung, die Sie zuvor für die Einfügung verwendet haben

%Vor%

und du wärst fertig. Tatsächlich müssen Sie nicht einmal die Tabelle angeben:

%Vor%     
___ answer9041435 ___

Hier ist meine Lösung, die nicht @@ index oder MAX verwendet.

%Vor%

Viel Spaß!

    
___ tag123msaccess ___ Microsoft Access, auch als Microsoft Office Access bezeichnet, ist ein Datenbankverwaltungssystem von Microsoft, das häufig die relationale Microsoft Jet / ACE-Datenbank-Engine mit einer grafischen Benutzeroberfläche und Softwareentwicklungstools kombiniert. Eine Reihe von anderen Datenbank-Engines wie SQL Server kann auch als Back-End verwendet werden. ___ tag123vba ___ Visual Basic für Applikationen (VBA) ist eine ereignisgesteuerte, objektorientierte Programmiersprache zum Schreiben von Makros, die für die gesamte Office-Suite und andere Anwendungen verwendet wird. VBA entspricht nicht VB.NET oder VBS; Wenn Sie in Visual Studio arbeiten, verwenden Sie [vb.net]. Wenn sich Ihre Frage speziell auf die Programmierung einer MS Office-Anwendung bezieht, verwenden Sie auch das entsprechende Tag: [Excel-VBA], [Zugriff-VBA], [Word-VBA], [Outlook-VBA] oder [Microsoft-Project-VBA] . ___ tag123jet ___ Jet ist das von Microsoft Windows verwendete SQL-Datenbankmodul. Es wird auch von Microsoft Access verwendet. Für Java Emitter Templates siehe 'java-emitter-templates' und 'eclipse-jet' ___
David Pedack 09.05.2017 21:43
quelle

Tags und Links