Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

VBA Abgleich Datenbank mit Werten aus Formular Textfeld

Begonnen von sedoran, Februar 19, 2019, 19:31:21

⏪ vorheriges - nächstes ⏩

sedoran

Hallo zusammen,

das ist wohl mein erster Post überhaupt um mit meinem Access Thema weiter zu kommen. Bis jetzt konnte mir Google oder dieses Forum immer mit den Suchergebnissen erfolgreich weiterhelfen. Nun bin ich aber leider an einem Punkt, an dem ich so nicht weiterkomme und eure Hilfe benötige.
Es geht um folgendes:

Ich bekomme regelmäßig von Kunden Teilenummern. Das sind Teilenummern welche in der Branche allgemein bekannt sind. Diese möchte der Kunden gerne mit unserem Produktportfolio abgeglichen haben, ob auch wir die Produkte in unserem Programm besitzen. In meiner Access Datenbank sind die Teilenummern i. d. R. vorhanden und daran geknüpft sind die restlichen Daten, welche aber hier nicht relevant sind.
Die Daten bekomme immer in dieser Form:

T/N_1
T/N_2
T/N_3
T/N_4
T/N_5
T/N_n

Das können bis zu 10.000 + T/N sein. Performance ist also auch nicht ganz unwichtig :)

Jetzt bräuchte ich einen VBA Code, welcher die Teilenummern der Kunden mit der Datenbank abgleicht und sie in einer sinnvollen Darstellungsart ausgibt. Nichts kompliziertes, einfachste Tabellenform. Wie wenn ich eine Abfrage aus zwei Tabellen erstelle und das matching über ein Feld durchgeführt wird.

Input für die T/N ist hierbei ein Textfeld. Wichtig ist auch das alle T/N angezeigt werden, auch diese, welche nicht gefunden wurden in der Datenbank. Dann gibt es halt einfach keine Daten welche angefügt werden können.

Ich hoffe das ich es verständlich rübergebracht habe, falls nicht schaue ich, das ich schnell auf Fragen antworte!

Schonmal besten Dank im Voraus!

Viele Grüße

MzKlMu

Hallo,
nimm beide Tabellen in eine Abfrage auf und verknüpfe über die Teilenummern.
ZitatWichtig ist auch das alle T/N angezeigt werden,
Dazu klickst Du die Verknüpfungslinie doppelt und änderst den Beziehungstyp auf 2 oder 3 (probieren).
Gruß Klaus

sedoran

Ganz so einfach ist es nicht. Ich bekomme die T/N per E-Mail und möchte diese in ein Textfeld nach dem oben geschriebenen Schema einfügen. Dann drücke ich einen Knopf "Abgleich" und die Geschichte fängt an sich abzugleichen.

MzKlMu

Hallo,
kannst du das mal genauer beschreiben, ich kann da kein Schema erkennen.
Sind die Nummern in der Mail in einem Feld ?
Gruß Klaus

sedoran

Klar gerne, sorry wenn es nicht verständlich ist. Das hatte ich ja geschrieben:

Die Daten bekomme immer in dieser Form:

T/N_1
T/N_2
T/N_3
T/N_4
T/N_5
T/N_n


Beispielnummern aus der e-Mail:
6541654514
6486240524
898383678
7867292171
26818727878
81637233823

So bekomme ich sie und möchte die auch genauso in das Textfeld einfügen. Die Nummern sollen dann mit den in der Datenbank abgeglichen werden.

ebs17

ZitatIch bekomme die T/N per E-Mail und möchte diese in ein Textfeld nach dem oben geschriebenen Schema einfügen.
Du möchtest 10.000-e Nummern in ein (Anzahl = 1?) Textfeld eintragen?
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

Hallo,
Kopiere die Teilenummer in eine Textdatei (Editor) und importieren diese Textdatei nach Access. Der Rest wie oben.
Gruß Klaus

sedoran

Zitat von: ebs17 am Februar 19, 2019, 20:01:16
ZitatIch bekomme die T/N per E-Mail und möchte diese in ein Textfeld nach dem oben geschriebenen Schema einfügen.
Du möchtest 10.000-e Nummern in ein (Anzahl = 1?) Textfeld eintragen?

Es kann mal vorkommen, das ich selber solch einen Riesen Abgleich machen muss und dann kann man doch ohne Problem das alles in ein Textfeld einfügen? Was wäre besser als ein Textfeld?

Zitat von: MzKlMu am Februar 19, 2019, 20:02:48
Hallo,
Kopiere die Teilenummer in eine Textdatei (Editor) und importieren diese Textdatei nach Access. Der Rest wie oben.

Das möchte ich nicht machen. Es muss total benutzerfreundlich sein, dass es andere ganz einfach verwenden können. Ich bin der einzige, welcher sich tiefgründig mit Access auskennt in der Firma.
Kann man nicht einfach das Textfeld auslesen und in ein Array schreiben oder eine temporäre Tabelle anlegen lassen und dann eine Abfrage drüber bügeln?

MzKlMu

Hallo,
Textfeld und Performance schließen sich aus.
ZitatIch bin der einzige, welche sich tiefgründig mit Access auskennt
Wenn Du Dich tiefgründig auskennst, sollte es kein Problem sein, die Daten aus der Email auszulesen und jede Nummer in einen Datensatz zu schreiben.
Das mit dem Array musst Du ja auch programmieren.

Gruß Klaus

sedoran

Ok, dann versuche ich es anders. Das sind nur meine groben Gedanken wie ich es lösen möchte.

Was könnte man verwenden um von mir aus 50 Teilenummern irgendwo einzufügen, damit diese irgendwie eingelesen und abgeglichen werden? Da wir im VBA Bereich sind, wäre ein VBA code sehr hilfreich. Falls ich komplett auf dem Holzpfad bin, nehme ich jeden Vorschlag gerne an.  :)

ebs17

ZitatKann man nicht einfach das Textfeld auslesen und in ein Array schreiben oder eine temporäre Tabelle anlegen lassen und dann eine Abfrage drüber bügeln?
Der Teil ab Tabelle klingt sehr sinnvoll.
Die Tabelle würde man aber direkt von der Mail ableiten und da auf Mitwirkung der unkundigen Benutzer bestmöglich verzichten.

Zitatirgendwo einzufügen, damit diese irgendwie eingelesen
Das klingt echt nach Plan.
Wasser kommt in die Flasche, Mehl in die Tüte. Verständlich?
Jetzt könnte man darüber nachsinnen, in welcher Form genau die Artikelnummern kommen.
Mit freundlichem Glück Auf!

Eberhard

sedoran

Der Rahmen ist ja schon komplett gesetzt. Ich habe eine funktionierende Datenbank in welcher diverse User täglich arbeiten. Jetzt geht es um die Weiterentwicklung und Funktionserweiterung. Mittlerweile bin ich soweit, dass ich folgendes machen möchte:

User kopiert Nummern aus der E-Mail. Ein einlesen aus der E-Mail ist nicht möglich, weil die Daten nicht so strukturiert kommen wie es evtl. hier aktuell rüberkommt. Oft auch in einer Excel Datei.
Dann drückt man in der Datenbank einen Button "Abgleich". Es öffnet sich eine CSV/TXT Datei. Kopierte Nummern werden eingefügt. Die CSV/TXT wird eingelesen und in die tblKundenanfragen geschrieben. Die neu geschriebenen Daten werden durch ein extra Feld gekennzeichnet, damit man nur exakt diese Datensätze herannimmt, um sie mit einer Abfrage mit der T/N Tabelle zu verbinden. Diese Abfrage sollte dann in eine Excel Datei exportiert werden, welche dann einfach an den Kunden zurückgesendet werden kann.

Bevor die T/N importiert werden in die Tabelle, gibt es einen Bereinigungsalgorithmus, damit die T/N auch standardisiert sind. Es gibt oft Leerzeichen, Bindestriche, etc. Sonst funktioniert natürlich der Abgleich in der Abfrage nicht.
Dann muss ich noch sicherstellen, das keine Daten doppelt importiert werden.
Die temporäre CSV/TXT muss nach getaner Arbeit gelöscht werden.

Für heute reicht es. Morgen geht es dann an die Umsetzung.

ebs17

Zitatweil die Daten nicht so strukturiert kommen
Wenn es am Kopf stinkt, muss man es auch so benennen.

Einfügen, auslesen, kopieren ... die Strukturfrage stellt sich aber nachfolgend immer noch. Was erzeugen die User durch ihre Tätigkeit gesichert(!) ? Ein Automatismus kann nur das verarbeiten, auf was er vorbereitet ist. Sind es einfache standardisierte Strukturen (Tabelle, datentypgleiche Spalten, keine Datenausreißer), ist die Verarbeitung entsprechend simpel, anderenfalls aufwändiger und fehleranfälliger und weniger schnell.

Hat man erst einmal gescheite Tabellen, dann wären Abfragen ein meist besseres Mittel als VBA-Maßnahmen.
Für aktives Vergleichen: Grundlagen - SQL ist leicht (4) - Aktualisierung einer Tabelle
Für komplexeres Datenbereinigen/-isolieren: Codebeispiel - "Intelligente" Textanalyse
Mit freundlichem Glück Auf!

Eberhard

sedoran

Ich habe es nun so gelöst, dass ich zuerst eine temporäre txt file erzeuge. Diese wird dann eingelesen und mit einer SQL Abfrage mit den Daten der Datenbank abgeglichen. Wenn das erledigt ist, wird die temporäre Abfrage in eine Excel Datei Zwischengespeichert. Es öffnet sich nun ein "Speichern unter" Dialog mit vorgegebenen Namen und Speicherort auf dem Desktop. Der User kann aber weiterhin entscheiden wo er es unter welchem Dateinamen abspeichern möchte. Die Excel Datei ist notwenig, damit der User flexibel damit weiterarbeiten kann. Der VBA Code dazu werde ich demnächst posten.


Public Sub btnAbgleich_Click()
   
    Dim fso, f As Object
    Dim strPathBackendStandard As String
    Dim strDateipfad As String
    Dim strTabellenname As String
    Dim strDesktopPath As String
    Dim strExcelFilePath As String
    'Dim c As Integer 'Counter
    Dim fncSaveFilePath As String
   
    strDesktopPath = Environ("USERPROFILE") & "\Desktop\" ' Desktop Pfad des Users in Variable Speichern
    strExcelFilePath = strDesktopPath & "Abgleich" & Format(Now, "_yyyy-mm-dd_hh-mm-ss") & ".xlsx"
   
    ' Der Variable den Wert aus der tblConfig zuweisen.
    strPathBackendStandard = DLookup("Wert", "tblConfig", "Variable =  'strPathBackendStandard'")
   
    strDateipfad = Environ("TEMP") & "\Abgleich.csv"
    strTabellenname = "tblAbgleich"
   
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.CreateTextFile(strDateipfad, True)
    f.Close
    Set f = fso.OpenTextFile(strDateipfad, 8) '
    f.write "Nummer" & vbNewLine 'Schreibe Spaltenüberschrift mit neuer leerer Zeile
    f.Close

    ' TODO: Über Access Formular und Textfeld lösen.
    Call Shell("notepad.exe " & strDateipfad, vbMaximizedFocus) 'Öffne CSV Datei damit User Nr. einfügen kann.

    If MsgBox("Weiter machen?", vbYesNo, "Abgleich Tool") = vbYes Then
   
        If TableExists("tblAbgleich") Then
            DoCmd.DeleteObject acTable, "tblAbgleich"
        End If
   
        Call CsvDateiInTabelleEinlesen(strTabellenname, strDateipfad, True)
       
        Sleep 3000
       
        ' TODO: Funktioniert nicht. True kommt nie an:
        ' notwendig weil der Code sonst weiter ausgeführt ist, obwohl die Tabelle noch nicht erstellt wurde.
'        c = 0
'        Do
'            c = c + 1
'            Debug.Print strTabellenname & " Tabelle exisitert noch nicht...[" & c & "]"
'        Loop Until TableExists("strTabellenname") = True

        If TableExists("tblAbgleichAusgefuehrt") Then
            DoCmd.DeleteObject acTable, "tblAbgleichAusgefuehrt"
        End If
       
        CurrentDb.Execute "SELECT tblAbgleich.Nummer, qryAbgleichDaten.Teile_Nr, qryAbgleichDaten.Status, qryAbgleichDaten.Kommentar, qryAbgleichDaten.ESN, qryAbgleichDaten.Kommentar, qryAbgleichDaten.Art, qryAbgleichDaten.Lagerfach, qryAbgleichDaten.AccountGroup INTO tblAbgleichAusgefuehrt " & vbCrLf & _
                            "FROM tblAbgleich LEFT JOIN qryAbgleichDaten ON tblAbgleich.Nummer = qryAbgleichDaten.ESN;"
       
        On Error GoTo ErrHandler
        fncSaveFilePath = fncSaveFile(2, strExcelFilePath)

        DoCmd.TransferSpreadsheet acExport, 10, "tblAbgleichAusgefuehrt", fncSaveFilePath, True 'Export nach Desktop in Excel Datei
        Sleep 3000 'Warten bis Excel Datei sicher erstellt worden ist.
        Shell "excel " & fncSaveFilePath  'Öffne XLSX Datei mit abgeglichenen und angefügten Daten"
    End If


ErrHandler:
    If Err.Number = 2522 Then ' File Dialog Button abbrechen gedrückt.
    End If

    ' Clean Routine
    If fso.FileExists(strDateipfad) Then
        fso.DeleteFile strDateipfad
    End If
   
    If TableExists("tblAbgleich") Then
        DoCmd.DeleteObject acTable, "tblAbgleich"
    End If
   
    If TableExists("tblAbgleichAusgefuehrt") Then
        DoCmd.DeleteObject acTable, "tblAbgleichAusgefuehrt"
    End If
   
End Sub