Seite 1 von 2

Protokoll zu Anrufliste

Verfasst: Mo 29. Apr 2013, 13:55
von scientific
Hi!

Ich bin leider noch nicht so gut mit Base und Datenbanken allgemein.

Wie sollt ich das am Besten angehen:

Ich habe eine Liste an Unternehmen, die ich Kontaktieren möchte. Dazu hab ich eine Tabelle mit einer ID, Namen, Kontaktdaten, und einer Spalte "Abschlussgrund", welche ich über ein Formular mit "NE", "KI", "WB" und "TW" füttere (Optionsfelder im Formular).

Jetzt möchte ich in dem Formular ein Protokoll anzeigen, ob ich bei den letzten Kontaktversuchen niemanden erreicht "NE" habe, oder ob um eine erneute Kontaktaufnahme "WV" (= Wiedervorlage) erwünscht ist.

Ich gehe einmal davon aus, dass es dazu sinnvoll ist, eine zweite Tabelle "Protokoll" anzulegen mit folgendem Inhalt:

ID (Primärschlüssel)
Timestamp
ID_ORG (Die ID des Unternehmens aus der obigen Tabelle)
AG (ein Abschlussgrund wie oben)

Ich müsste dann im Formular, wenn der Datensatz des Unternehmens aufgerufen wird eine Tabelle mittels SQL-Abfrage mit der entsprechenden ID des Unternehmens füttern und dies gefiltert nach den zwei gewünschten Abschlussgründen.

Nur leider hab ich echt keine Ahnung, wie ich das am besten angehen soll...

Kann mir hier jemand helfen?

[edit]

Konkret hab ich das Hauptfeld so gelöst, dass ich mit einem Button das Formular schließe und wieder neu öffnen lasse, da sich bei jedem Aufruf die Datengrundlage der Abfrage geändert haben kann.
Das heißt konkret, ich frage bei jedem Aufruf der Datenbank eine Abfrage auf, welche mir aktuell als ersten Datensatz das nächste zu kontaktierende Unternehmen ausgibt.
Da der Aufruf zeitkritisch ist muss ich jedesmal die Abfrage neu machen, sobald ein Unternehmen erledigt ist. Es könnte ja z.B. ein Wiedervorlage-Termin mittlerweile eingetreten sein.

Soll ich hier ein Unterformular erstellen, welches mit die zweite Tabelle (Protokoll) zum jeweiligen Datensatz aufruft, oder muss ich den Kasten mit dem Protokoll über ein Makro, welches die konkreten Datensätze aus dem Protokoll rausfiltert, füttern, damit ich der SQL-Abfrage die richtige ID des Unternehmens als Filterkriterium übergeben kann???

[/edit]


lg scientific

PS: Die Tabelle mit den Unternehmen hab ich bereits. Es geht "nur" noch um das Protokoll...

Re: Protokoll zu Anrufliste

Verfasst: Mo 29. Apr 2013, 16:24
von RobertG
Hallo scientific,

ich würde ein Subformular bauen, indem die zweite Tabelle als Tabellenkontrollfeld steht. Im Hauptformular suchst Du die Firma aus, im Subformular hast Du alle Anrufe stehen.
Wie Du die Abschlussgründe filtern möchtest kannst Du ja über den Filter des Subformulars entscheiden. Vielleicht machst Du einfach zwei Subformulare, wobei beide je mit einem Filter für das erforderliche Feld in Deinem Sinne versehen sind?

Gruß

Robert

Re: Protokoll zu Anrufliste

Verfasst: Mo 29. Apr 2013, 16:29
von scientific
Ich hab mir jetzt ein neues Formular mit Subformular gebaut, da ich das nachträgliche Einfügen noch nicht beherrsche.
Mit einem Skript lese ich mir die Formularfelder des Hauptformulars aus und trage sie in die entsprechenden Felder des Subformulars ein. Das funktioniert auch schon wunderbar.
Das Subformular ist ein Tabellenkontrollfeld (Grid).

Jetzt ist nur noch die Frage bei mir offen, wie ich den neuen Datensatz im Subformular abspeichern kann, wenn ich das Hauptformular speichere... Ich vermute einmal, das wird irgendwas mit "commit" sein. Soviel hab ich schon herausgefunden. Aber wie ich das konkret anwende, ist mir noch ein Rätsel.

Das Makro für das Subformular schaut so aus:

Code: Alles auswählen

SUB PROTOKOLL 
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm AS OBJECT
	DIM oDatum AS OBJECT
	DIM oAnm AS STRING
	DIM oAbschl AS STRING
	DIM oOrg AS OBJECT
	DIM unoDateTime AS NEW com.sun.star.util.DateTime
	Dim daJetzt AS DATE
	daJetzt = Now()
	WITH unoDateTime
      .HundredthSeconds = 0
      .Seconds = Second(daJetzt)
      .Minutes = Minute(daJetzt)
      .Hours = Hour(daJetzt)
      .Day = Day(daJetzt)
      .Month = Month(daJetzt)
      .Year = Year(daJetzt)
    END WITH
	oDoc = thisComponent
	oDrawpage = oDoc.drawpage
	oForm = oDrawpage.forms.getByName("MainForm").getByName("SubForm") 
	oDatum=oForm.getByName("SubForm_Grid")
	oAnm = oDrawpage.forms.getByName("MainForm").getByName("txtAnmerkung").getCurrentValue
    oForm = oDrawpage.forms.getByName("MainForm")
    if oForm.getByName("Optionsfeld 1").State = 1 Then
      oAbschl = "NE"
    ElseIf oForm.getByName("Optionsfeld 2").State = 1 Then 
      oAbschl = "KI"
    ElseIf oForm.getByName("Optionsfeld 3").State = 1 Then 
      oAbschl = "SA"
    ElseIf oForm.getByName("Optionsfeld 4").State = 1 Then 
      oAbschl = "TW"
    ElseIf oForm.getByName("Optionsfeld 5").State = 1 Then 
      oAbschl = "WV"
    End If
'	oAbschl = oDrawpage.forms.getByName("MainForm").getByName("Optionsfeld1").getCurrentValue
'	oOrg=oForm.getByName("ORG")
    oDatum.getByIndex(3).BoundField.updateTimeStamp(unoDateTime)
    oDatum.getByIndex(4).BoundField.updateString(oAnm)
    oDatum.getByIndex(1).BoundField.updateString(oAbschl)
'    oForm.getByName("SubForm").commit
END SUB
die letzte Zeile mit dem "commit" gibt allerdings eine Fehlermeldung.

lg scientific

Re: Protokoll zu Anrufliste

Verfasst: Mo 29. Apr 2013, 16:43
von F3K Total
Hi,
das müsste alles ohne Makro machbar sein.
Lade am Besten eine verfremdete Beispieldatei hoch.
Gruß R

Re: Protokoll zu Anrufliste

Verfasst: Mo 29. Apr 2013, 17:09
von scientific
Hier die Kundendatenbank anonymisiert:

Der Button "Protokoll" dient derzeit nur Testzwecken. Ich möchte mit einem einzigen Klick auf "Nächster Datensatz" auch das Protokoll ergänzt haben.

Also, wenn ich einen Datensatz aufrufe, soll die gesamte Kontakthistorie im Unterformular in der Tabelle unten erscheinen und mit "Nächster Datensatz" soll dieses Protokoll um den Aktuellen Abschlussgrund ergänzt werden.

Im Prinzipt - so denk ich mir - müsste es ja auch funktionieren, wenn ich die Felder aus der Tabelle "PROTOKOLL" in der Tabelle "Kunden" gar nicht führe, sondern dort der jüngste Datensatz für jeden Kunden ausgegeben wird - für den Export und in der Anzeige im Formular.

lg scientific

Re: Protokoll zu Anrufliste

Verfasst: Mo 29. Apr 2013, 23:11
von F3K Total
Hi,
es war nicht einfach dein Unterfangen nachzuvollziehen, hier die Makro-freie Version.
Gruß R

Re: Protokoll zu Anrufliste

Verfasst: Di 30. Apr 2013, 10:03
von scientific
WOW!!!

Habs erst kurz vorm Schlafengehen entdeckt und mir deine Lösung grad angeschaut.
Das hätt ich so echt niemals hinbekommen!

Einen kleinen Schönheitsfehler hab ich gerade entdeckt. Ich muss extra "neues Protokoll" klicken, dann werden die neuen Protokolldaten übernommen und mit "aktualisieren" wird dann der Datensatz nicht mehr ausgegeben (sofern noch nicht Zeit dazu ist).

Gibts noch irgendeine Möglichkeit die Funktion der beiden Buttons zu vereinen? Sprich die Aktion des Buttons "Aktualisieren" und "Neuer Datensatz" zusammenzusfassen? Denn ich will bei jedem Aufruf einen Protokolldatensatz dazu generieren.

Ich hab irgendwo schon mal gelesen, dass man solche Aktions-Zuweisungen zu Buttons auch kombinieren kann... wenn mich mein trüber Geist nicht täuscht. :-)

Also der Vorgang läuft dann so ab:

Ich öffne die Kundendatenbank.
Es wird mir ein Kontakt vorgeschlagen.
Ich kontaktiere ihn, erreiche ihn nicht, der hat kein Interesse oder ich soll später noch einmal anrufen, weil in Besprechung o.ä.
Ich trag diesen Abschlussgrund mit den Optionsbuttons ein und ev. eine Wiedervorlagezeit.
Klicke auf "aktualisieren"
Der Abschlussgrund und die Anmerkung wird dem Protokoll hinzugefügt und die Abfrage erneut aufgerufen.
Es wird der nächste Kunde in der Liste als Datensatz 1 der Abfrage ausgegeben der
a) eine Wiedervorlage gesetzt hat, die jetzt oder früher ist ODER
b) der einen Nicht erreicht-Status hat und das letzte mal vor 120 Minuten kontaktiert wurde ODER
c) der noch nie kontaktiert wurde

In dieser Reihenfolge.

Ich hab im Protokoll-Tabellenkontrollfeld noch die Anmerkungen eingefügt, da die sehr wichtig sind. Jetzt muss ich nur noch schauen, wie ich die Sortierung absteigend hinbekomme, da ich zu oberst den jüngsten Protokolleintrag sehen will (damit ich nicht scrollen muss, wenn das Protokoll länger wird...)

Aber vielen Dank für deine Lösung. Da werd ich mal weitergooglen und -lesen um mit dieser Vorlage die SQL-Sprache besser zu verstehen.

lg scientific

Re: Protokoll zu Anrufliste

Verfasst: Di 30. Apr 2013, 10:35
von scientific
und noch was ist mir aufgefallen.
Hab jetzt mal neue Kunden hinzugefügt. Die haben natürlich noch keinen Protokolleintrag. Und die werden bei der Abfrage nicht aufgerufen.
Aber da ich den SQL-Befehl für die Abfrage noch nicht durchschaut habe, kann ich da noch nichts ändern.

[edit]

setze ich einen leeren Eintrag mit der ID (und dem automatischen Timestamp) in die Protokoll-Tabelle, dann wird der neue Datensatz aus "Kunden" auch in der Abfrage aufgeführt. Und ich komm nicht dahinter, wie der SQL-Befehl funktioniert...

[/edit]
lg scientific

Re: Protokoll zu Anrufliste

Verfasst: Di 30. Apr 2013, 19:07
von F3K Total
Hi,
dann versuche ich es mal zu erklären.
Die gesamte Abfrage lautet:

Code: Alles auswählen

SELECT "Kunden".* 
FROM "Kunden", 
     (SELECT "ORG" 
      FROM "Protokoll", ( SELECT "ORG", MAX( "Timestamp" ) AS "MTS" FROM "Protokoll" GROUP BY "ORG" ) AS "vTop"
            WHERE "Protokoll"."ORG" = "vTop"."ORG" 
            AND "Protokoll"."Timestamp" = "vTop"."MTS" 
            AND ( ( "Abschlussgrund" = 'WV' 
                    AND "Wiedervorlage" > NOW( ) ) 
                    OR ( "Abschlussgrund" = 'NE' 
                    AND DATEDIFF( 'mi', "Timestamp", CURRENT_TIMESTAMP ) > 120 ) 
                     OR "Abschlussgrund" IS NULL OR "Abschlussgrund" = '' ) ) 
AS "aktuelle_Kunden" 
WHERE "Kunden"."ID" = "aktuelle_Kunden"."ORG"
Wir haben drei verschachtele Abfragen, zunächst die innerste:

Code: Alles auswählen

SELECT "ORG", MAX( "Timestamp" ) AS "MTS" FROM "Protokoll" GROUP BY "ORG" 
Mit dieser Abfrage werden nur die ORG und der Timestamp der jeweils neuesten Datensätze aus der Tabelle Protokoll pro ORG ermittelt.
Nennen wir diese Abfrage "vTop" und setzen das mal ein, steht in der übergeordneten Abfrage:

Code: Alles auswählen

SELECT "ORG" FROM "Protokoll", "vTop"  WHERE "Protokoll"."ORG" = "vTop"."ORG" AND "Protokoll"."Timestamp" = "vTop"."MTS" ...
Mit dieser Abfrage werden jetzt nochmal alle Datensätze aus Protokoll gesucht, die den Timestamp (max) und die ORG aus der ersten Abfrage haben, fügt man dann die weiteren Kriterien

Code: Alles auswählen

... AND ( ( "Abschlussgrund" = 'WV' 
    AND "Wiedervorlage" > NOW( ) ) 
    OR ( "Abschlussgrund" = 'NE' 
   AND DATEDIFF( 'mi', "Timestamp", CURRENT_TIMESTAMP ) > 120 ) 
    OR "Abschlussgrund" IS NULL OR "Abschlussgrund" = '' ) 
an, werden die "Top-Datensätze" nach deinen Kriterien (aktuell) gefiltert.
Wir haben also, siehe Anfang der Abfrage

Code: Alles auswählen

SELECT "ORG" FROM "Protokoll", "vTop" ...
jetzt alle "ORG" aller Firmen die aktuell sind.
Nennen wir nun diese Abfrage "aktuelle_Kunden" und setzen sie in die äusserste Abfrage ein, steht dort:

Code: Alles auswählen

SELECT "Kunden".* FROM "Kunden", "aktuelle_Kunden" WHERE "Kunden"."ID" = "aktuelle_Kunden"."ORG"
Das sind dann also alle Kundendatensätze aus der Tabelle Kunden, die aktuelle Protokolle haben.
Die gesamte Abfrage ist Inhalt des Haupformulares. Es werden also nur aktuelle Kunden gezeigt.
Willst du zusätzlich alle Kunden, die noch kein Protokoll haben, anzeigen, geht fügst du den blauen Code hinzu:
SELECT distinct "Kunden".* FROM "Kunden", ( SELECT "ORG" FROM "Protokoll", ( SELECT "ORG", MAX( "Timestamp" ) AS "MTS" FROM "Protokoll" GROUP BY "ORG" ) AS "vTop" WHERE "Protokoll"."ORG" = "vTop"."ORG" AND "Protokoll"."Timestamp" = "vTop"."MTS" AND ( ( "Abschlussgrund" = 'WV' AND "Wiedervorlage" > NOW( ) ) OR ( "Abschlussgrund" = 'NE' AND DATEDIFF( 'mi', "Timestamp", CURRENT_TIMESTAMP ) > 120 ) OR "Abschlussgrund" IS NULL OR "Abschlussgrund" = '' ) ) AS "aktuelle_Kunden" WHERE "Kunden"."ID" = "aktuelle_Kunden"."ORG" or "Kunden"."ID" not in (Select distinct "ORG" from "Protokoll")
HTH, Gruß R

Re: Protokoll zu Anrufliste

Verfasst: Mi 1. Mai 2013, 21:28
von scientific
Vielen Dank für die Erklärung.

Ich hab ja schon vorher mit den Abfragen herumgespielt um sie zu verstehen und die drei verschachtelten Abfragen einzeln ausgeführt um die Ergebnisse zu sehen und zu verstehen. Und ich bin interessanterweise schon auf fast genau deine Lösung gestoßen. Allerdings hat mir das "distinct" in der äussersten Abfrage noch gefehlt.

Ich bin auch mit einer "JOIN"-Anweisung auf ein ähnliches Ergebnis gekommen, da ich auch diesen Befehl ausprobiert habe.

Jetzt hab ich noch ein Problem. Nämlich die Reihenfolge der Ergebnisse... Die ist nämlich auch noch essentiell.

Die Priorität der Reihenfolge ist:

1) Wiedervorlagen (sofern eine gerade aktuell ist): Wiedervorlage <= now()
2) Nicht erreichte mit einem Timestamp älter als 120 Minuten: Timestamp <= now()
3) Noch niemals kontaktierte

Da diese Daten ja im Protokoll sind, aber nicht im Ergebnis der Abfrage, kann ich demnach ja nicht danach sortieren...

Im Prinzip reicht ja eigentlich nur eine einzige Zeile auszugeben. Ich vermute einmal, ich muss da noch eine Abfrage runderhum bauen, welche aus den Ergebnissen dieser Abfrage noch einmal das Protokoll bemüht um diesen einen, momentan wirklich aktuellen Datensatz rauszufiltern. Mit einem "ORDER BY" wirds so noch nicht gehen.

lg scientific