Neuigkeiten:

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

Mobiles Hauptmenü

Datensätze über kombinierte Kriterien in mehreren Spalten filtern

Begonnen von Churian, Mai 26, 2015, 13:14:13

⏪ vorheriges - nächstes ⏩

Churian

Hallo werte Access-Profis,

vorab erstmal ich bin kein Informatiker und absoluter Access-Neuling. Ich habe leider in der Suche nichts brauchbares gefunden.
Ich habe ein Problem mit einem Suchformular. Ich zeige in einem Suchformular mehrere Elemente an die ich aus einer Tabelle bzw. einer Abfrage (ich brauche die Abfrage um aus den IDs die in der Tabelle gespeichert werden Begriffe zu machen) habe. In der Tabelle sind verschiedene Arbeitsgänge hinterlegt mit verschiedenen Technikern die die Arbeit durchführen, Maschinen, Seriennummern usw.

Ich möchte nun eine Suchmaske erstellen die es ermöglicht nach verschiedenen Kriterien zu Filtern. z.B. Ich möchte alle Einsätze des Technikers "Müller" an der Maschine "XY". Dann gebe ich beides in je ein Text-Feld ein und das Dokument wird entsprechend nach dem kombinierten Kriterium gefiltert. Jede Spalte bekommt so quasi ein Textfeld in das Suchbegriffe eingegeben werden. Am Ende drückt man einen Such-Button und die Daten werden entsprechend gefiltert.
Das hat auch geklappt mit folgendem Code:

Private Sub cmd_Button_Click()
    Dim sKrit As String
   
    sKrit = ""

    If Nz(Me![txt_SucheHN], "") <> "" Then
        sKrit = sKrit & " AND Herstellnummer = '" & Me![txt_SucheHN] & "'"
    End If
        If Nz(Me![txt_SucheBau], "") <> "" Then
        sKrit = sKrit & " AND Baureihe = '" & Me![txt_SucheBau] & "'"
    End If
       If Nz(Me![txt_SucheBez], "") <> "" Then
        sKrit = sKrit & " AND [Bezeichnung] = '" & Me![txt_SucheBez] & "'"
    End If
        If Nz(Me![txt_SucheEin], "") <> "" Then
        sKrit = sKrit & " AND Einsatztyp = '" & Me![txt_SucheEin] & "'"
    End If
        If Nz(Me![txt_SucheRV], "") <> "" Then
        sKrit = sKrit & " AND [RV_Nummer] = '" & Me![txt_SucheRV] & "'"
    End If
        If Nz(Me![txt_SucheDat], "") <> "" Then
        sKrit = sKrit & " AND [Datum] = '" & Me![txt_SucheDat] & "'"
    End If
       If Nz(Me![txt_SucheTech], "") <> "" Then
        sKrit = sKrit & " AND [Techniker_Name] = '" & Me![txt_SucheTech] & "'"
    End If
    If Nz(Me![txt_SucheAus], "") <> "" Then
        sKrit = sKrit & " AND tbl_Ausfall.Ausfall = '" & Me![txt_SucheAus] & "'"
    End If
        If Nz(Me![txt_SucheArt], "") <> "" Then
        sKrit = sKrit & " AND [Artikelnummer(1)] = '" & Me![txt_SucheArt] & "'"
    End If
    If sKrit <> "" Then sKrit = Mid(sKrit, 5)
    Me.Filter = sKrit
    Me.FilterOn = True
End Sub



Nun zu meinem Problem: Ich habe ein Textfeld das seine Suchbegriffe in mehreren Spalten der Tabelle suchen soll.
Hierbei geht es um Ersatzteile und dazugehörige Artikelnummern.


Ich kann bis zu 4 Ersatzteile eintragen die dann in den Spalten:
Artikelnummer(1), Artikelnummer(2), Artikelnummer(3), Artikelnummer(4)


hinterlegt werden. Kann ich meine Code so abändern das in allen 4 Spalten über ein Textfeld gesucht wird und das der Filter mit anderen Filtern aus anderen Textfeldern kombiniert wird.

z.B. Ich suche alle Arbeitsgänge wo Herr "Müller" Artikelnummer "0815" gewechselt hat.

also gibt man in das Techniker-Suchfeld "Müller" ein und in das Artikelnummerfeld "0815" und die Suche gibt die Entsprechenden Datensätze aus?


Vorab schonmal Danke für die Hilfe

Grüße

MaggieMay

Hi,

wenn ich das richtig verstanden habe, sollten die Artikelnummern mit einer ODER-Verknüpfung geprüft werden.
Das sähe dann so aus:
    If Nz(Me![txt_SucheArt], "") <> "" Then
        sKrit = sKrit & " AND ([Artikelnummer(1)] = '" & Me![txt_SucheArt] & "'"
        sKrit = sKrit & "  OR  [Artikelnummer(2)] = '" & Me![txt_SucheArt] & "'"
        sKrit = sKrit & "  OR  [Artikelnummer(3)] = '" & Me![txt_SucheArt] & "'"
        sKrit = sKrit & "  OR  [Artikelnummer(4)] = '" & Me![txt_SucheArt] & "')"
    End If


Davon abgesehen darf der Hinweis natürlich nicht fehlen, dass derartige "Aufzählungsfelder" in einer normalisierten Tabelle nichts verloren haben. ;-)
Freundliche Grüße
MaggieMay

Churian

Vielen Dank MaggieMay,

deine Lösung funktioniert. Ich habe das mit einer OR-Verknüpfung auch schon probiert habe dabei aber irgendeinen fehler gemacht.
Zu deinem Hinweis, wie würde man das denn richtig machen?
Ist vielleicht eine doofe Frage aber ich beschäftige mich erst seid kurzem mit Datenbanken

Grüße Churian

MzKlMu

Hallo,
Zitatwie würde man das denn richtig machen?
die Ersatzteile müssen in einer extra Tabelle erfasst werden mit einem Fremdschlüssel zur jetzigen Tabelle. Jedes Ersatzteil gibt einen Datensatz, 4 Ersatzteile = 4 DS, 20 Ersatzteile = 20 DS. In einem Feld.
Dann beschränkt sich auch die Suche auf ein Feld.

Kannst Du mal ein Bild des Beziehungsfensters hier zeigen ?
Und erkläre mal die Aufgabe der DB.
Gruß Klaus

Churian

Hi,

so Bild ist im Anhang. Ich habe ein paar Bezeichnungen geändert. In der Datenbank sollen Serviceeinsätze protokolliert und ausgewertet werden.
Um das so zu machen das die Ausfälle in einer separaten Tabelle den Einsätzen zugeordnet werden brauch ich also eine ID pro Einsatz die sich nie wiederholt oder?
Die Eingabe der Ausfälle würde dann über ein Unteformular laufen das auch in der Suche sichtbar ist oder?

Grüße



MzKlMu

Hallo,
das Datenmodell ist stark überarbeitungsbedürftig.

Die Ausfalltabellen sind in einer Tabelle zusammenzufassen mit einem Fremdschlüssel zur Kategorie. Dann wird eine weitere Tabelle benötigt mit einem Fremdschlüssel zum Serviceverzeichnis und einem Fremdschlüssel zum Ausfall. In dieser Tabelle gibt es je Ausfall einen Datensatz.
Die Felder Ausfall, Artikelnummer und Menge entfallen im Serviceverzeichnis ersatzlos.

Wahrscheinlich ist das aber noch nicht alles. Z.B. was machst Du, wenn es zu einem Ausfall mehrere Artikelnummern gibt ?
Gruß Klaus

Churian

hey MzKlMu

sowas in etwa? Wie geht denn die Eingabe der Werte und die Suche dann?

Grüße

MzKlMu

Hallo,
Zitatsowas in etwa?
nein, nicht ganz. Siehe Bild.
Die Kategorie ist in der Tabelle "tbl_Ausfälle" überflüssig, denn diese lässt sich ja bereits über den Ausfall ermitteln, da gibt es ja bereits eine Beziehung.
Das gleiche gilt sinngemäß auch für "Eigen oder Fremd". Du kannst im Regelfall davon ausgehen, wenn Beziehungslinien einen Kreis bilden ist eine Beziehung zu viel.

ZitatWie geht denn die Eingabe der Werte und die Suche dann?
Die Eingabe der Werte erfolgt mit einem Unterformular. Das dazu gehörende Hafo zeigt dann die Tabelle "tbl_Serviceverzeichnis", Hafo und Ufo werden über die Schlüsselfelder verknüpft .

Und was ist mit meiner Frage?
Zitatwas machst Du, wenn es zu einem Ausfall mehrere Artikelnummern gibt ?
Gibt es zu einem Ausfall wirklich nur einen Artikel?

Und noch weitere Hinweise:
Vermeide unbedingt Leer und Sonderzeichen in Feld und Objektnamen.
Und verwende keine Nachschlagefelder in den Tabellen direkt. Deine Namensgebung deutet darauf hin.
Das Beziehungsgeflecht Service-Baureihe-Maschinentyp-Bezeichnung halte ich zumindest für fragwürdig.
Besonders im Hinblick auf die Feldnamen ist das recht verwirrend und mMn falsch. In der Tabelle "tbl_Maschinentyp" gibt es zum PS nur den einen Fremdschlüssel, was soll das für einen Sinn ergeben ? Kannst Du das mal alles erläutern ?

Achtung, ich habe heute 27.05.2015 19:35 ein neues Bild hochgeladen.

Gruß Klaus

Churian

Guten Morgen,

vielen Dank. Ich habe die Beziehungen jetzt so gemacht wie in dem Bild und gestern versucht neue Einsätze über ein Hauptformular in die tbl_Serviceverzeichnis eimnzutragen. Die dazugehörigen Ausfälle über ein Unterformular. Das klappte auch. Danach habe ich versucht in einem Endlosformular zu suchen sodass die Dinge aus der tbl_Serviceverzeichnis angezeigt werden und die Ausfälle in einem UFo aber das geht ja leider nicht mit access.

Zu deiner Frage: Ja es kann zu einem Ausfall mehrere Artikelnummern geben.

Wieso sollte ich keine Nachschlagefelder direkt verwenden?
Bei der tbl_Maschinen_Typ habe ich die Spalte Typ vergessen reinzuschreiben. Ich hatte ein paar der Namen geändert.

Grüße

MzKlMu

Hallo,
ZitatJa es kann zu einem Ausfall mehrere Artikelnummern geben.
und wie willst Du das erfassen, im Moment kann es zu einem Ausfall nur einen Artikel geben, denn in ein Feld darf in einer Datenbank nur ein Wert eingetragen werden. Daher ist in diesem Fall das Datenmodell immer noch ungeeignet.

Und noch eine weitere Frage:
Gibt zu einem Serviceverzeichnis tatsächlich mehrere Ausfälle ?
Mir der Zusammenhang zwischen Service und Ausfall noch nicht klar.

ZitatWieso sollte ich keine Nachschlagefelder direkt verwenden?
weil diese den sauberen Aufbau einer Datenbank verhindern. Bitte unbedingt wieder entfernen. Diese sind nur in Formularen als Kombifelder sinnvoll.
Die Nachteile von Nachschlagefeldern

Dann solltest aus Gründen der leichten Erkennbarkeit und eindeutigen Zuordnung die Schlüsselfelder wie folgt benennen (am Beispiel der Kategorie):
Kategorie_ID > Kategorie_ID_F

Das noch zu überarbeitende Datenmodell ist aber aufwendig zu beschreiben. Daher wäre es sinnvoll die DB (nur die Tabellen mit den Beziehungen) mal hier hochzuladen. Aber ich benötige die DB in Access2003 (MDB) ich habe keine andere Möglichkeit. Mit einigen Beispieldatensätzen.

Und denke an die obigen weiteren Fragen. 

Zeige mal das neue Beziehungsbild.
Gruß Klaus

Churian

Hey,

ich habe keine Nachschlagefelder verwendet. Alles was ich über Kombifelder eingebe wird als ID gespeichert.
Zu den Artikelnummern: Ich habe mehrere Eingabefelder und die unterschiedlichen Nummern werden in unterschiedliche Spalten gespeichert.

zu der zweiten Frage: Es geht um Servicefälle z.B. Ein Kunde sagt das seine Maschine nicht läuft. Dann wird ein Techniker raus geschickt und nimmt die Ausfälle auf und wechselt evtl. die kaputten Teile. Es könnte ja Ausfälle sowohl in der Hydraulik als auch in der Elektrik vorliegen und beides muss aufgenommen werden.

Maßgeblich ist das ich am ende eine Suche habe die mir übersichtlich alle Einsätze anzeigt. Ich möchte sowohl nach einer Artikelnummer, Maschine, Techniker oder Ausfall suchen können als auch eine kombinierte Suche.

Bild und DB im Anhang.


Grüße

MzKlMu

Hallo,
ZitatIch habe mehrere Eingabefelder und die unterschiedlichen Nummern werden in unterschiedliche Spalten gespeichert.
das ist völlig unmöglich. In dem neuen Datenmodell hast Du ja nur ein Feld für die Artikelnummer, da gibt es keine unterschiedlichen Spalten, wie willst Du da unterschiedliche Artikel erfassen ?

Die Ausfallkategorie in der Tabelle "tbl_Ausfälle" ist überflüssig.

Gruß Klaus

Churian

Wie gesagt ich bin Anfänger. Ich dachte ich könnte die Artikel in die tbl_Ausfälle mit reinschreiben.
Die Ausfallkategorie steht deshalb mit in der Tabelle damit ich sie mit den anderen Ausfällen und den Artikeln zusammengehörig anzeigen kann.

MzKlMu

Hallo,
ZitatIch dachte ich könnte die Artikel in die tbl_Ausfälle mit reinschreiben.
und wie soll das gehen, Du hast ja nur ein Feld für den Artikel.
Gruß Klaus

Churian

#14
Wie würdest du das machen?
Zusätzlich hätte ich noch eine andere Frage. Und zwar habe ich ja ein Feld mit einer Datumssuche wenn ich dort ein Datum eingebe bekomme ich Laufzeitfehler 3464 Datentypenkonflikt. Ich weiß das das wohl mit der amerikanischen Datumsangabe zu tun hat. Ich habe jetzt versucht den Code-Schnippsel von Donkarl meiner Abfrage hinzuzufügen.

Dim strDatum As String
Dim strSQL As String

strDatum = Format(DeinDatumsfeld, "\#yyyy\-mm\-dd\#")

strSQL = "SELECT * FROM Tabelle WHERE Tabelle.Feld > " & strDatum


Was aber leider nicht hilft. Was mache ich falsch?