PDA

Vollständige Version anzeigen : per Abfrage: Status ermitteln aus mehreren Datenfeldern


djhucki
20.08.2009, 09:11
Hallo ...

Folgende Problematik:

Ich möchte eine Abfrage erstellen, die auf eine Tabelle zugreift. In dieser Tabelle sind mehrere Felder mit jeweils einem Datum (Datum_Erstkontakt, Datum_Angebot, Datum_Auftrag, ... etc).

In der Abfrage soll nun automatisch ein Feld/Wert generiert werden, welcher den aktuellen Status ausgibt ("Kunde kontaktiert", "Angebot erstellt", "Auftrag eingegangen", ... etc.). Wichtig ist natürlich, dass die Abfrage erkennt, welcher der aktuellste Status ist. Als kleines Hinderniss sei noch gesagt, dass es vorkommen kann, dass ein vorangegangenes Feld nicht gefüllt ist (Beispiel: Datum_Erstkontakt ist leer, jedoch Datum_Angebot ist gefüllt)

Hat einer eine Idee, wie man das am elegantesten lösen kann?

Vielen Dank für Eure Hilfe :)

J_Eilers
20.08.2009, 09:17
Hi,

ja, in dem man das Datenmodell überarbeitet. In einer Kontakttabelle kommt die ID des Kunden als FremdID + das Datum + die Art (gerne auch als Kombi mit seperater Tabelle). Damit würde sich diese Frage auch nicht ergben ;) Ansonsten ist eine ewige Wenn(IstNull(Feld);Wenn(IstNull(Feld1);Wenn(...);Feld1);Feld) Spanne, die eigentlich nichts mit einer DB zu tun hat.

Atrus2711
20.08.2009, 09:20
Hi,
am elegantesten wäre ein sinnvolles Datenmodell. Datum_Erstkontakt, Datum_Angebot, Datum_Auftrag etc ist ziemlich unsinnig, wie du gerade merkst.

es kann doch wohl mehrere Angebote und Aufträge geben?!
Ein Status lässt sich jetzt nur noch anhand einer VBA-Funktion (oder einem verschachtelten IIF oder Switch) erstellen, der innerhalb eines Satzes die Felder vergleicht. Das ist ziemlich eklig und wird immer doller, je mehr Felder heute und künftig daran beteiligt sind.
Es scheint, als ob Erstkontakt, Angebot und Auftrag eine natürliche Reihenfolge bilden. Was, wenn diese Reihenfolge mal durchbrochen wird? z.B. ein Auftrag ohne Angebot?
Was, wenn alles am gleichen Tag passiert? Welchen Status vergibst du dann?

djhucki
20.08.2009, 10:02
Sicherlich ist das kein elegantes Datenmodell, aber leider steht diese nunmal und kann auch nicht überarbeitet werden :(
Ich hatte gehofft, dass es eine Lösung gibt, ohne eine Umstruckturierung vorzunehmen bzw. verschachtelte Funktionen zu benutzen.

Falls Euch doch noch was einfällt, bin ich für jeden Tipp dankbar.

Vielleicht kann man das Pferd ja von hinten aufziehen und beim letzten Arbeitsschritt anfangen, die Werte (Datum) abzufragen. Sobald er auf das erste ausgefüllte Datumfeld stößt, soll er mit einen Status ausgeben.

ebs17
20.08.2009, 10:15
Ich hatte gehofft, dass es eine Lösung gibt, ohne eine Umstruckturierung vorzunehmen bzw. verschachtelte Funktionen zu benutzen.
Wenn Du Dir eine eigendefinierte Funktion anlegst, die die in #2 gezeigte Wenn-Konstruktion enthält, dann hast Du in der Abfrage nur eine einfache Funktion.

Nebenbei: Ein ungünstiges Datenmodell macht sich öfters bemerkbar, und eine höhere Schmerzgrenze zieht nach ihrer Überschreitung einen deutlich höheren Aufwand zur Umstrukturierung nach sich.

Atrus2711
20.08.2009, 10:26
Das Beharren auf untauglichen Datenmodellen mit dem Argument "too big to change" ist sehr beliebt, aber falsch. :rolleyes: Stichwort totes Pferd...

http://www.wiwi-treff.de/home/index.php?mainkatid=1&ukatid=14&sid=62&artikelid=168&pagenr=0

Hier ein Versuch, das tote Pferd noch ein bisschen zu reiten. Es bleibt aber tot, und in Bälde riechts komisch.

djhucki
20.08.2009, 10:28
Wie meinst Du das mit einer "eigendefinerten Funktion"? Kann man in Access Funtionen vordefinieren und dann als "einfache" Funktion in Abfragen nutzen?

Kenn ich gar nicht! Oder stehe ich da jetzt auf einer langen Leitung ...?

Atrus2711
20.08.2009, 10:32
Ja. #6.

djhucki
20.08.2009, 11:22
Ich sehe Licht am Horizont!!!!

DANKE AN ALLE!!!! :)

Atrus2711
20.08.2009, 11:25
Es wird das Licht der Lava sein, in der die DB versinkt, wenn du die nicht normalisierst.... :)

J_Eilers
20.08.2009, 11:35
Das Licht am Ende des Tunnels kann auch oft eine Kneipe sein ;)

djhucki
20.08.2009, 11:57
... leider gibt es eine Fehlermeldung beim Ausführen der Abfrage.

Hab die Beispieldatenbank aus #6 in meine Datenbank implementiert und
Die Variablen entsprechend umgenannt.

Leider kommt folgende Fehlermeldung:

Compile error. in query expression 'ErpopleStatus([dtx_nr])'.

Zur Info: meine "ID" ist kein Autowert, sondern eine Zahl (Long Integer) als Primärschlüssel (indiziert ohne Dublikate) und nennt sich bei mir "dtx_nr"

Liegt es daran oder muss ich vorher noch irgendwas mit der "eigendefinerten Funktion" machen? Hab das Modul auch unbenannt in "Statusabfrage", daran kanns doch aber auch nicht liegen ... oder?

Atrus2711
20.08.2009, 12:18
Hi,

ob Autowert oder Long Integer ist egal, numerisch sind die gleichwertig.

Die Funktion ErpopleStatus muss in der Zieldatenbank in einem Modul liegen. Ist das so?

Sind die Tabellen- und Feldnamen in Abfrage und im Code (!) angepasst?

Zeig doch mal die jetzige SQL.

Kompiliert deine DB fehlerfrei?

Teste mal im Direktfenster (Strg+G), was rauskommt bei
? ErpopleStatus(4711)
wobei 4711 dann ein dtx_nr-Wert ist, den du zu Testzwecken mal ausgeben lässt.
Wenn das die erwünschten Ergebnisse liefert, dann hängts an deiner Abfrage.
Wenn nicht, liegts am Code.

Vermeide zudem Namensgleichheiten von DB, Modul, Funktionen etc, am besten durch Verwendung von Präfixen (tbl für Tabellen, qry für Queries, dbl für Double, dte für Date etc).