chrislm
Goto Top

Doppler automatisch Markieren

Hallo.
Ich habe folgendes Problem. Aus statistischen Gründen kann ich keinen Doppler aus einer Access - Datenbank einfach löschen sondern muss diese markieren. Wir haben dafür extra eine Spalte Doppler mit Wahr oder Falsch um diese zu markieren... Aber wie kann ich dies Automatisieren ohne die ganzen Doppler von Hand zu markieren..?

Weiter habe ich eine 2. Tabelle dessen IDs mit der 1. Tabelle abgeglichen werden müssen. Alle mit diesen IDs müssen ebenfalls einen Wert in der Tabelle auf Wahr setzen...

Content-Key: 188174

Url: https://administrator.de/contentid/188174

Printed on: April 20, 2024 at 04:04 o'clock

Member: NetWolf
NetWolf Jul 17, 2012 at 13:51:41 (UTC)
Goto Top
Moin Moin,

Ich habe folgendes Problem. Aus statistischen Gründen kann ich keinen Doppler aus einer Access - Datenbank einfach
löschen sondern muss diese markieren.
ok, das sollte kein Problem darstellen

Wir haben dafür extra eine Spalte Doppler mit Wahr oder Falsch um diese zu markieren...
das ist schon mal sehr gut vorbereitet

Aber wie kann ich dies Automatisieren ohne die ganzen Doppler von Hand zu markieren..?
dazu nimmst du VBA, schreibst eine kleine Schleife, die deine Tabelle durchläuft und dem zweiten Datensatz je nach Kriterium ein Häkchen verpasst.

Weiter habe ich eine 2. Tabelle dessen IDs mit der 1. Tabelle abgeglichen werden müssen. Alle mit diesen IDs müssen
ebenfalls einen Wert in der Tabelle auf Wahr setzen...
aber hoffentlich nicht im gleichen Feld?

Erstelle eine Abfrage um beide Tabellen gegenüber zu stellen.
Dann eine etwas abgewandelte VBA Prozedur (wie oben) um diese Häkchen machen zu lassen.

btw über welche Access Version reden wir?

Wie viele Tage arbeitest du jetzt mit Access?

Grüße aus Rostock
Wolfgang
(Netwolf)
Member: chrislm
chrislm Jul 17, 2012 updated at 15:11:44 (UTC)
Goto Top
Ich arbeite erst seit einpaar Wochen mit Access und kann leider kein VBA- Script so ohne weiteres erstellen. Wenn ich eines habe, kann ich es auf meine Bedürfnisse anpassen. Für mehr fehlen mir die Programierkenntnisse.

Bei der 2 Tabelle werden die Daten von einem externen Dienstleister überprüft und dann bei uns wieder eingespielt bzw, das ergebnis von Hand korrigiert. Die ID ist bei Ex und Import gleich deshalb währe es leicht die Daten damit abzugleichen...

Eine Datenbank läuft unter Access2000 und die andere auf 2010...
Member: NetWolf
NetWolf Jul 17, 2012 at 16:25:33 (UTC)
Goto Top
Moin Moin,

Ich arbeite erst seit einpaar Wochen mit Access
ok, du bist Anfänger mit Access Kurs oder ohne? Ein paar Informationen mehr wären hilfreich um dir entsprechend helfen zu können. Abfragen erstellen kannst du? Einen Button auf einem Formular kannst du auch erstellen um die Prozedur aufzurufen? Den VBA-Editor kannst du aufrufen entnehme ich deiner Antwort!?

Bei der 2 Tabelle werden die Daten von einem externen Dienstleister überprüft
wie? was? wird wo "überprüft"? Bitte ausführlicher! So kann das alles mögliche bedeuten.

und dann bei uns wieder eingespielt bzw, das ergebnis von Hand korrigiert.
wie? was? wird wo "eingespielt"? Bitte ausführlicher! So kann das alles mögliche bedeuten.

Die ID ist bei Ex und Import gleich
wie? wo? warum? was passiert bei Ex- und Import?
Wer bekommt Daten von wem? In welchem Format?
Bitte ausführlicher! So kann das alles mögliche bedeuten.

deshalb währe es leicht die Daten damit abzugleichen...
Bitte ausführlicher! So kann das alles mögliche bedeuten.

Eine Datenbank läuft unter Access2000 und die andere auf 2010...
und wir sollen jetzt raten, welche du und welche der Dienstleister nutzt?

Bitte tue uns einen großen Gefallen. Wir sind hier blind und haben keine Lust/Zeit zu raten. Wir können nicht sehen was du da hast. Beschreibe bitte in einem Forum dein Problem, dein Programm, deine Umgebung etc. immer so, dass nicht hundert Nachfragen nötig sind. Das nerved beide Seiten, wenn schon die grundlegenden Informationen nicht klar sind, wird es mit der Hilfe sehr schwer.

Ich habe zwischenzeitlich deine anderen Beiträge gelesen und festgestellt, dass wir ja schon häufiger Kontakt hatten.

Falls es immer noch um diese Geschichte geht, wäre ein Link und/oder Hinweis bestimmt hilfreich gewesen.

Grüße aus Rostock
Wolfgang
(Netwolf)
Member: chrislm
chrislm Jul 18, 2012 updated at 09:48:28 (UTC)
Goto Top
Dies hier ist ein ganz neues Problem welches ich versuche zu optimieren...

Problem ist folgendes:
Adressen werden manuell erfasst, ganz normal die Anschrift mit Tel usw... Das läuft über eine Sharepointlösung in Access 2010. Die Daten werden ein Tag später exportiert, mit der Nobodys duplettesuche überprüft, Doppler ausgedruckt und manuell in Access wieder als doppler markiert. Dafür gibts extra ein Feld in dem Erfassungsformular. Diesen vorgang würde ich gerne schon einmal über Access vereinfachen.

Alle Daten die dann übrig bleiben werden dann nochmal überprüft, ob sie schon als Kunde registriert sind. Das Geschiet extern. Daraufhin bekommen wir eine Datei zurück, in der die Bestandskunden hinterlegt sind. diese werden ebenfalls Ausgedruckt und Manuell als Bestandskunde in einem Feld abgeklickt.

Der Export erfolgt mit der kompletten Anschrift und mit der von Access vergebenen ID. Wenn wir die Datei zurück bekommen, ist unsere ID ebenfalls mit dabei und wir suchen Manuell in Access die ID und klicken diesen dann als Bestand ab.
Diese Daten in eine neue Tabelle zu importieren, ist kein problem. Aber das script zu bauen, welches in der einen Tabelle nachschaut und dann automatisch die Bestandskunden abklickt ist das problem. nach dem Anklicken kann ich über eine Löschabfrage die Importtabelle wieder löschen...


Ich hoffe das somit mein Problem soweit beschrieben ist und das mir jemand weiterhelfen kann...

Hier hat jemand ein ähnliches problem:
http://www.office-loesung.de/ftopic98043_0_0_asc.php

leider bekomme ich es so nicht zum da mit die qryKundenAnsprechDuplikate_JA_storno fehlt. Oder ich bin zu dumm es für mich umzubauen...
Member: NetWolf
NetWolf Jul 18, 2012 updated at 11:27:19 (UTC)
Goto Top
ok, fangen wir mal mit der Basis an:

Im Ribbon klickst du auf:
Reiter = Erstellen
dort dann auf: Abfrage-Assistent
wähle dann aus der Liste: Abfrage-Assistent zur Duplikatsuche
Wähle die relevanten Felder und lasse die Abfrage erstellen.

Diese Abfrage wird als Basis für die weiteren Aktionen benötigt, benenne diese also z.B. BASIS_Duplikate.

Werden alle Duplikate richtig erkannt?
gut, dann kann folgender Code helfen

Public Function Kill_Duplikate()
   Dim dbs As Database
   Dim rst As Recordset

   Set dbs = CurrentDb
   Set rst = dbs.OpenRecordset("BASIS_duplikate", dbOpenDynaset)  

   With rst
        If .RecordCount > 0 Then
            .MoveLast
            .MoveFirst
            
            Do While Not .EOF
               merken1 = !deinfeld
               .MoveNext
               If merken1 = !deinfeld Then 

                '.Delete 'gleich löschen  
                'oder  
                !Doppelt = true  'Datensatz markieren  
                .MoveNext
 
           Wend
        
        End If
        
   End With

   rst.Close

End Function


Grüße aus Rostock
Wolfgang
(Netwolf)
Member: chrislm
chrislm Jul 18, 2012 updated at 11:19:08 (UTC)
Goto Top
Ok, habe es so gemacht, habe eine Tabelle erhalten und dann diese umbenannt...
Ganz rechts habe ich eine Spalte mit AnzahlvonDuplikaten
Member: NetWolf
NetWolf Jul 18, 2012 at 11:30:08 (UTC)
Goto Top
ich habe den VBA Code oben ergänzt.

Du solltest in der Abfrage noch weitere Felder anzeigen lassen, um eine bessere Übersicht zu bekommen.
Außerdem solltest du noch das Feld Doppler überprüfen ob es FALSE ist, da ja der Datensatz schon als Duplikat markiert ist.

Grüße aus Rostock
Wolfgang
(Netwolf)
Member: chrislm
chrislm Jul 18, 2012 at 12:15:15 (UTC)
Goto Top
Ich habe noche eine Frage,
Wie oder wo baue ich den Code ein, unter macros?
Member: NetWolf
NetWolf Jul 18, 2012 at 12:34:21 (UTC)
Goto Top
Damit wäre meine Frage "Den VBA-Editor kannst du aufrufen?" dann auch beantwortet.
VBA hat nichts mit Makros zu tun. Vermeide Makros wo du VBA nutzen kannst!!

Nutze die in der Access-Hilfe angegebene Tastenkombination ALT + F11 um den VBA - Editor aufzurufen.
Das funktioniert übrigens in allen Office-Programmen.

Grüße aus Rostock
Wolfgang
(Netwolf)
Member: chrislm
chrislm Jul 18, 2012 updated at 14:53:43 (UTC)
Goto Top
Den hab ich auf, ich erstelle ein neues Modul und füge es so ein.
Wenn ich auf den grünen Pfeil klicke, kommt eine Fehlermeldung:
Fehler bei Kombilieren: benutzerdefinierter Typ nicht definiert
und Public Function Kill_Duplicate()ist Gelb. Und dbs As Database ist Markiert....

Ich hab herausgefunden das noch ein Haken bei DAO componennts gefehlt hat.
nun bekomme ich eine andere Fehlermeldung, wend ohne while...
Member: NetWolf
NetWolf Jul 18, 2012 at 15:18:41 (UTC)
Goto Top
Habe ich es nicht geahnt? Wie ich schon sagte: Access Grundlagenkurs im Forum bringt nichts!

Der grüne Pfeil ist nicht auf eine public Funktion anzuwenden.
In deinem Hauptformular sollst du einen Button für diese Funktion erstellen, damit sie damit gestartet werden kann.

Wenn ich den Code kompilieren lasse, erhalte ich keine Fehlermeldung.

Zeig hier mal den von dir geänderten Code.

Grüße aus Rostock
Wolfgang
(Netwolf)
Member: chrislm
chrislm Jul 19, 2012 updated at 07:14:09 (UTC)
Goto Top
hier noch einmal wie meine Datei aussieht:
Gehe ich hin und klicke im Layoutmudus -> Formularentwurfstools -> Button steht dort Befehl23 Drinn. Den namen kann ich ändern, beispiel auf doppler. Danach gehe ich auf Ereignis, Beim Klick auf Ereignisprozedur... kommt danach:
Private Sub Befehl23_Click()
Public Function Kill_Duplikate()
    Dim dbs As Database
    Dim rst As Recordset
    
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("BASIS_duplikate", dbOpenDynaset)  

    With rst
        If .RecordCount > 0 Then
                .MoveLast
            .MoveFirst
            Do While Not .EOF
            merken1 = !Doppler
            .MoveNext
            If merken1 = !Doppler Then
        '.Delete 'gleich löschen  
        !Doppelt = Wahr  'Datensatz markieren  
        .MoveNext

        Wend
   
    End If

  End With
 
  rst.Close

End Function

End Sub


Leider meldet er mir nun End Sub erwartet..

[Edit Biber] Codeformatierung as is der Function innerhalb der Procedure *kopfschüttel* [/Edit]
Member: chrislm
chrislm Jul 19, 2012 at 08:13:58 (UTC)
Goto Top
ich bin nun soweit das ich ein Modul angelegt habe, einen Button erstellt, beim klick folgendes eingetragen habe:
=Kill_Duplikate()

Wenn ich nun darauf klicke, bekomme ich die Fehlermeldunf Wend ohne While..
Member: bastla
bastla Jul 19, 2012 updated at 11:17:53 (UTC)
Goto Top
Hallo chrislm!

Zu einem "Do" gehört am Ende nicht "Wend", sondern "Loop", und zu jedem mehrzeiligen "If" das entsprechende "End If" (wenn Du vernünftige Einrückungen verwendest, ist auch ziemlich gut zu erkennen, ob die Blöcke abgeschlossen sind) ...

Grüße
bastla
Member: NetWolf
NetWolf Jul 19, 2012 at 11:12:13 (UTC)
Goto Top
Wenn ich nun darauf klicke, bekomme ich die Fehlermeldunf Wend ohne While..
sorry, entferne das DO vor dem WHILE, dann funktioniert es.

Grüße aus Rostock
Wolfgang
(Netwolf)
Member: chrislm
chrislm Jul 19, 2012 updated at 11:36:14 (UTC)
Goto Top
Auch das DO wegzunehmen brauchte keinen Erfog, ich hab etwas gespielt mit dem code und habe nun einen Laufzeitfehler 13 / Typen unverträglich
Public Function Kill_Duplikate()
    Dim dbs As Database
    Dim rst As Recordset
    
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("BASIS_Duplikate", dbOpenDynaset)  

    With rst
        If .RecordCount > 0 Then
                .MoveLast
            .MoveFirst
            While Not .EOF
            merken1 = !Doppler
            .MoveNext
            If merken1 = !Doppler Then
        '.Delete 'gleich löschen  
        !Doppelt = Wahr  'Datensatz markieren  
        .MoveNext
             End If
  rst.Close
Wend
End If
End With
End Function

Da scheint irgendwas nicht zu stimmen...
Set rst = dbs.OpenRecordset("BASIS_Duplikate", dbOpenDynaset)
Member: bastla
bastla Jul 19, 2012 at 11:38:48 (UTC)
Goto Top
Hallo chrislm!

Die Position von "rst.Close" ist suboptimal ...

... abgesehen davon solltest Du bei Fehlermeldungen auch die zugehörige Zeile angeben.

Grüße
bastla
Member: chrislm
chrislm Jul 19, 2012 at 11:47:44 (UTC)
Goto Top
Die Zeile
Set rst = dbs.OpenRecordset("BASIS_Duplikate", dbOpenDynaset  
) wird bemängelt, jedenfalls ist sie Markiert
Member: NetWolf
NetWolf Jul 19, 2012 at 12:12:10 (UTC)
Goto Top
Ich kommentiere den Code, da ich die Befürchtung habe, du verstehst nicht was da wo passiert.
Back to the Roots = mein ursprünglicher Code:

Public Function Kill_Duplikate()
   'Dimensionierung/Definition von Variablen  
   Dim dbs As Database
   Dim rst As Recordset
   Dim merken1

   'den Variablen Werte zuweisen  
   Set dbs = CurrentDb  'aktuell geöffnete Datenbank verwenden  
   Set rst = dbs.OpenRecordset("BASIS_duplikate", dbOpenDynaset) 'die Abfrage als Recordset verwenden  

   With rst     'der der Abfrage "Basis_duplikate" folgendes machen:  
        If .RecordCount > 0 Then   'prüfen ob überhaupt Duplikate vorhanden sind, wenn JA geht es weiter  

            'sicherstellen, dass alle Datensätze genutzt werden   
            .MoveLast    'zum letzten Datensatz springen   
            .MoveFirst   'zum ersten Datensatz springen   

            'die WHILE Schleife so lange durchlaufen, bis das Ende erreicht wird  
            While Not .EOF

               'in der Variable "merken1" der Feldinhalt des zu prüfenden Feldes eintragen = merken   
               merken1 = !deinfeld  'hier den Feldnamen eintragen der auf Dubletten verglichen werden soll  

               .MoveNext   'zum nächsten Datensatz wechseln  

               If merken1 = !deinfeld Then ' wenn der gemerkte Wert dem neuen Wert des Feldes entspricht, mache...  

                  '.Delete   'gleich löschen (nicht aktiviert) oder  

                  !Doppelt = Wahr  'Datensatz markieren (Feld muss an deine Gegebenheiten angepasst werden)  
                  'das Feld muss vom Typ Ja/Nein sein    
               
               End If  'Ende von IF merken1 = !deinfeld   

               .MoveNext 'zum nächsten Datensatz wechseln  

            Wend 'wieder nach oben, die While Schleife weiter ausführen   
        
        End If 'Ende von IF .RecordCount > 0  
        
   End With 'Ende der Verwendung von RST  

   rst.Close  'RST = Basis Abfrage schließen  

End Function


Wenn du also die Feldbezeichnungen entsprechend deinen vorhandenen Feldbezeichnungen anpasst, sollte es bei richtigen Feldtypen funktionieren.

Falls nicht, poste bitte hier die Struktur deiner Tabelle und den SQL-String deiner Abfrage.

Grüße aus Rostock
Wolfgang
(Netwolf)
Member: NetWolf
NetWolf Jul 20, 2012 at 16:05:38 (UTC)
Goto Top
Nachdem ich nun die DB gesehen habe, wurden folgende Änderungen vorgenommen:

- Datenbankformat vom Access 2000 in Access 2010 geändert
Set rst = dbs.OpenRecordset("BASIS_Duplikate", dbOpenDynaset) erzeugt nun keinen TYP-Fehler mehr

- Basisdaten der Testtabelle erneuert. Zum Testen genutzte Daten waren den falschen Feldern zugeordnet.
(in PLZ stand z.B. die Straße etc.)

- Abfrage mit Abfrage-Assistent neu erstellt um eine Duplikatsabfrage zu erhalten.
nun stehen die Datensätze richtig zur weiteren Bearbeitung zur Verfügung, die zuvor nur gruppierte Abfrage war nicht nutzbar.

- im Code folgendes geändert und ergänzt:

.Edit 'hinzugefügt
!Doppelt = True 'WAHR geändert in TRUE
.update 'hinzugefügt

So nun läuft die Funktion zufriedenstellend.

Grüße aus Rostock
Wolfgang
(Netwolf)