Supportnet / Forum / Datenbanken
Anfügeabfrage in Access2000
Frage
Wie kann man bei Nutzung einer Anfügeabfrage verhindern, daß identische Datensätze angefügt werden?
Ich grenze die Abfrage per Datumsbereich ein nach Jahr+ Monat. Wenn aber jemand aus versehen die Daten für den Januar 2004 nochmals anfügen will, sollte das wegen doppelter Datensätze nicht möglich sein.
Hat jemand eine Idee?
Danke
Eisbear
Antwort 1 von piano
Hallo
Wird wohl ohne VBA nicht automatisch gehen (melde dich, wenn Support diesbezüglich gewünscht):
Manuell ev. so: Wenn eine Auswahlabfrage mit den gleichen Auswahlkriterien keine Nullmenge (leeres Abfrageergebnis) ergibt, dann darfst du die Anfügeabfrage nicht durchführen.
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Wird wohl ohne VBA nicht automatisch gehen (melde dich, wenn Support diesbezüglich gewünscht):
Manuell ev. so: Wenn eine Auswahlabfrage mit den gleichen Auswahlkriterien keine Nullmenge (leeres Abfrageergebnis) ergibt, dann darfst du die Anfügeabfrage nicht durchführen.
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 2 von oliverV
Hallo Eisbear,
wenn deine Datensätze eindeutig sind (evtl. auch zusammengesetzt aus mehreren Feldern =[Datumsfeld]+[Feld1]+[Feld2]), kannst du auf das entsprechende Tabellenfeld einen Index (ohne Duplikat) legen, dann werden bei einer Anfügeabfrage keine doppelten Datensätze angefügt.
@piano: schön das du noch "aktiv" bist, oder heißt das schon "rüstig".
Gruß
Oliver
wenn deine Datensätze eindeutig sind (evtl. auch zusammengesetzt aus mehreren Feldern =[Datumsfeld]+[Feld1]+[Feld2]), kannst du auf das entsprechende Tabellenfeld einen Index (ohne Duplikat) legen, dann werden bei einer Anfügeabfrage keine doppelten Datensätze angefügt.
@piano: schön das du noch "aktiv" bist, oder heißt das schon "rüstig".
Gruß
Oliver
Antwort 3 von piano
Hallo
zu @oliver
An den Index habe ich auch gedacht, aber bei Kriterium Jahr/Monat ist kaum ein eindeutiger Schlüssel mit "ohne Duplikat" zu realisieren !
Gruss an beide,
piano
zu @oliver
An den Index habe ich auch gedacht, aber bei Kriterium Jahr/Monat ist kaum ein eindeutiger Schlüssel mit "ohne Duplikat" zu realisieren !
Gruss an beide,
piano
Antwort 4 von Eisbear
Zunächst mal vielen Dank für Eure Mühe!
die Sache mit dem Index wäre schon eine tolle Sache.
Ich frage per ODBC die Betriebs edv ab und erhalte hier aus 5 verschiedenen Bibliotheken jeweils die entsprechenden Datensätze. Die Eindeutigkeit ist hierbei nicht einfach über einen Index zu erstellen, sondern setzt sich jeweils für den Moment der Abfrage zusammen. Da der ODBC Treiber es nicht hergibt (augenscheinlich Problem wegen zu vieler handles) eine Abfrage wie zwischen 19010101 und 19021231(das ist das Datum 01.01.1901 und 31.12.1902 der Betriebs EDV) zu erstellen, habe ich diese beiden "Textfelder" aufgesplittet und bilde neben dem Tag jeweils auch einen JahrMonat Wert (190101). Diesen JahrMonats Wert übergebe ich als Parameter dann auch der Tabellenerstellungsabfrage um die Ergebnisse monatlich in die Tabelle zu schreiben. Damit aber nicht der gleiche Wert nochmals angefügt werden kann sollte, wenn 190101 schon vorhanden, die Abfrage keinen Datensatz mehr anfügen.
Ziemlich kompliziert denke ich. Ich hoffe man kann verstehen was geschieht.
Gruß
Eisbear
die Sache mit dem Index wäre schon eine tolle Sache.
Ich frage per ODBC die Betriebs edv ab und erhalte hier aus 5 verschiedenen Bibliotheken jeweils die entsprechenden Datensätze. Die Eindeutigkeit ist hierbei nicht einfach über einen Index zu erstellen, sondern setzt sich jeweils für den Moment der Abfrage zusammen. Da der ODBC Treiber es nicht hergibt (augenscheinlich Problem wegen zu vieler handles) eine Abfrage wie zwischen 19010101 und 19021231(das ist das Datum 01.01.1901 und 31.12.1902 der Betriebs EDV) zu erstellen, habe ich diese beiden "Textfelder" aufgesplittet und bilde neben dem Tag jeweils auch einen JahrMonat Wert (190101). Diesen JahrMonats Wert übergebe ich als Parameter dann auch der Tabellenerstellungsabfrage um die Ergebnisse monatlich in die Tabelle zu schreiben. Damit aber nicht der gleiche Wert nochmals angefügt werden kann sollte, wenn 190101 schon vorhanden, die Abfrage keinen Datensatz mehr anfügen.
Ziemlich kompliziert denke ich. Ich hoffe man kann verstehen was geschieht.
Gruß
Eisbear
Antwort 5 von firefox
Also auch nach 3mal durchlesen wird mir das nicht ganz klar.
Was meinst du mit "Bibliotheken"? Tabellen??
Vielleicht umreißt du mal kurz in welche Tabellen eingefügt werden soll. Quelle ist dabei eine Abfrage oder Werte aus einem Formular?
Was meinst du mit "Bibliotheken"? Tabellen??
Vielleicht umreißt du mal kurz in welche Tabellen eingefügt werden soll. Quelle ist dabei eine Abfrage oder Werte aus einem Formular?
Antwort 6 von Eisbear
Hallo Firefox,
mit Bibliotheken meine ich einen Satz zusammen- bereitgestellter Tabellen. Je nach Anwendung werden die von der Betriebs EDV jeweils bereitgestellt. Das ist auch garnicht wichtig, wichtig ist nur, daß hier kein eindeutiger Index geliefert wird.
Zur Lösung meiner Aufgabe war es nötig die Archivierungsdatei abzufragen. Hier werden alle Vorgänge in einer Historie mitgeschrieben.
Ich frage hier Zugangsbuchungen in unseren Wareneingang ab.
Zur Identifizierung habe ich unsere Bestellnummer und Bestellposition sowie das Buchungsdatum. Dieses Buchungsdatum liegt allerdings nur in oben beschriebener Textform vor.
Diese 3 Kriterien zusammen kennzeichnen für Access einen Datensatz eindeutig.
Zu dem entsprechend selektiertem Datensatz wird dann in Access eine Qualitätsbeurteilung angehängt.
Später frage ich einen halbjahreszeitraum ab um die Liefeeranten zu bewerten. (Welcher Lieferant hat wieviele Lieferungen getätigt, wieviele davon fehlerhaft usw..)
Um diese Abfrage realisieren zu können lasse ich monatlich die beanstandeten Lieferungen an eine Tabelle Anfügen. Jeder Datensatz erhält hierbei ein Kennzeichen in der Form JahrMonat (200502 für Februar 2005) die ich aber als Parameter händisch eingebe.
Verhindern will ich, daß man beim Anfügen der nächsten Monatsbetrachtung erneut die Datensätze für den Februar eingibt. Das würde hier bedeuten, daß nach eingabe der Parameter für die Abfrage eine Prüfung stattfindet ob dieser bereits in die Tabelle geschrieben wurde.
Ich hoffe es ist jetzt etwas durchsichtiger geworden?
mit Bibliotheken meine ich einen Satz zusammen- bereitgestellter Tabellen. Je nach Anwendung werden die von der Betriebs EDV jeweils bereitgestellt. Das ist auch garnicht wichtig, wichtig ist nur, daß hier kein eindeutiger Index geliefert wird.
Zur Lösung meiner Aufgabe war es nötig die Archivierungsdatei abzufragen. Hier werden alle Vorgänge in einer Historie mitgeschrieben.
Ich frage hier Zugangsbuchungen in unseren Wareneingang ab.
Zur Identifizierung habe ich unsere Bestellnummer und Bestellposition sowie das Buchungsdatum. Dieses Buchungsdatum liegt allerdings nur in oben beschriebener Textform vor.
Diese 3 Kriterien zusammen kennzeichnen für Access einen Datensatz eindeutig.
Zu dem entsprechend selektiertem Datensatz wird dann in Access eine Qualitätsbeurteilung angehängt.
Später frage ich einen halbjahreszeitraum ab um die Liefeeranten zu bewerten. (Welcher Lieferant hat wieviele Lieferungen getätigt, wieviele davon fehlerhaft usw..)
Um diese Abfrage realisieren zu können lasse ich monatlich die beanstandeten Lieferungen an eine Tabelle Anfügen. Jeder Datensatz erhält hierbei ein Kennzeichen in der Form JahrMonat (200502 für Februar 2005) die ich aber als Parameter händisch eingebe.
Verhindern will ich, daß man beim Anfügen der nächsten Monatsbetrachtung erneut die Datensätze für den Februar eingibt. Das würde hier bedeuten, daß nach eingabe der Parameter für die Abfrage eine Prüfung stattfindet ob dieser bereits in die Tabelle geschrieben wurde.
Ich hoffe es ist jetzt etwas durchsichtiger geworden?
Antwort 7 von firefox
Ich versuche mal zusammenzufassen:
Du hast eine Datenmenge X die in eine Historietabelle angefügt werden sollen.
Die Datensätze aus X sind über die Felder Bestellnummer, Bestellposition, Buchungsdatum eindeutig?!
Das Buchungsdatum übergibst du dabei per Parameter in der Form JJMMTT .
Mit den drei angesprochenen Feldern hast du doch eine Eindeutigkeit, welche du in der Historietabelle als Index bestimmen könntest, oder was übersehe ich hier?
Alternativ: hast du bei deinem Problem den Datumsvergleich schon mal mit DateDiff() versucht? Dieser Wert ist verlässlicher als der Textvergleich von Datumswerten mit implizierter Konvertierung.
Du hast eine Datenmenge X die in eine Historietabelle angefügt werden sollen.
Die Datensätze aus X sind über die Felder Bestellnummer, Bestellposition, Buchungsdatum eindeutig?!
Das Buchungsdatum übergibst du dabei per Parameter in der Form JJMMTT .
Mit den drei angesprochenen Feldern hast du doch eine Eindeutigkeit, welche du in der Historietabelle als Index bestimmen könntest, oder was übersehe ich hier?
Alternativ: hast du bei deinem Problem den Datumsvergleich schon mal mit DateDiff() versucht? Dieser Wert ist verlässlicher als der Textvergleich von Datumswerten mit implizierter Konvertierung.
Antwort 8 von piano
Hallo
Wie wärs mit einer Protokoll-Tabelle?!
Vorschlag
Tabelle " Protokoll" mit den Feldern ID (Autowert ) und EinlesePeriode (Text) erstellen.
Über einen Button auf einem Formular folgende VBA-Anweisung steuern:
Vor dem Einspielen der Daten wird geprüft ob der Monat schon einmal verarbeitet wurde ( MMJJ generiert aus dem Parameter). Wenn nicht wird ein entsprechender Eintrag in eine Protokoll-Tabelle erstellt.
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Wie wärs mit einer Protokoll-Tabelle?!
Vorschlag
Tabelle " Protokoll" mit den Feldern ID (Autowert ) und EinlesePeriode (Text) erstellen.
Über einen Button auf einem Formular folgende VBA-Anweisung steuern:
Private Sub Befehl0_Click()
Dim db As Database
Dim rs As Recordset
Dim InP As String, InPeriode As String
InP = InputBox("Datum (TTMMJJ) eingeben") ´bzw. als Parameter übergeben
InPeriode = Mid(InP, 3) ´Format MMJJ
Set db = CurrentDb
Set rs = db.OpenRecordset("Protokoll", dbOpenDynaset)
rs.FindFirst ("EinlesePeriode= ´" & InPeriode)
If rs.NoMatch Then
MsgBox "Jetzt kann angefügt werden"
Else
MsgBox "Diese Periode ist schon eingelesen!"
rs.Close
Exit Sub
End If
rs.AddNew
rs!EinlesePeriode = InPeriode
rs.Update
rs.Close
Set db = Nothing
´ und hier Einspielen der Daten
End Sub
Vor dem Einspielen der Daten wird geprüft ob der Monat schon einmal verarbeitet wurde ( MMJJ generiert aus dem Parameter). Wenn nicht wird ein entsprechender Eintrag in eine Protokoll-Tabelle erstellt.
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 9 von Eisbear
Hallo Firefox,
prinzipiell wäre das eindeutig, es gibt aber leider auch noch Teillieferungen, d.h. zur selben Bestellung und zur selben Position und am gleichen Tag unterschiedliche zubuchungsmengen.
Nebenbei tragen alle in der Tabelle bereits angefügte Datensätze (monatlich)das gleiche Kennzeichen.
Das Buchungsdatum übergebe ich als Text in der Form 200501 für Januar 2005.
Ich mußte ja von dem verqueren Datumsfeld der Betriebs EDV weg, welches der ODBC Treiber nur als Textfeld an Access liefert.(20050102 = 02.Januar 2005). Daher greift auch von dieser Seite datDiff nicht.
Ich werde mal den Vorschlag von piano einarbeiten, was allerdings etwas dauern kann (Ich habe noch mehr Baustellen).
Vielen Dank für Eure Bemühungen
prinzipiell wäre das eindeutig, es gibt aber leider auch noch Teillieferungen, d.h. zur selben Bestellung und zur selben Position und am gleichen Tag unterschiedliche zubuchungsmengen.
Nebenbei tragen alle in der Tabelle bereits angefügte Datensätze (monatlich)das gleiche Kennzeichen.
Das Buchungsdatum übergebe ich als Text in der Form 200501 für Januar 2005.
Ich mußte ja von dem verqueren Datumsfeld der Betriebs EDV weg, welches der ODBC Treiber nur als Textfeld an Access liefert.(20050102 = 02.Januar 2005). Daher greift auch von dieser Seite datDiff nicht.
Ich werde mal den Vorschlag von piano einarbeiten, was allerdings etwas dauern kann (Ich habe noch mehr Baustellen).
Vielen Dank für Eure Bemühungen

