🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Protokoll zu Anrufliste

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Protokoll zu Anrufliste

Beitrag von scientific » Mo 29. Apr 2013, 13:55

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...

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Protokoll zu Anrufliste

Beitrag von RobertG » Mo 29. Apr 2013, 16:24

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
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Protokoll zu Anrufliste

Beitrag von scientific » Mo 29. Apr 2013, 16:29

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

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Protokoll zu Anrufliste

Beitrag von F3K Total » Mo 29. Apr 2013, 16:43

Hi,
das müsste alles ohne Makro machbar sein.
Lade am Besten eine verfremdete Beispieldatei hoch.
Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Protokoll zu Anrufliste

Beitrag von scientific » Mo 29. Apr 2013, 17:09

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
Dateianhänge
Kundendatenbank.odb.gz
(108.39 KiB) 219-mal heruntergeladen

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Protokoll zu Anrufliste

Beitrag von F3K Total » Mo 29. Apr 2013, 23:11

Hi,
es war nicht einfach dein Unterfangen nachzuvollziehen, hier die Makro-freie Version.
Gruß R
Dateianhänge
KundendatenbankNeu.zip
(16.03 KiB) 221-mal heruntergeladen
Windows 11: AOO, LO Linux Mint: AOO, LO

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Protokoll zu Anrufliste

Beitrag von scientific » Di 30. Apr 2013, 10:03

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

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Protokoll zu Anrufliste

Beitrag von scientific » Di 30. Apr 2013, 10:35

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

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Protokoll zu Anrufliste

Beitrag von F3K Total » Di 30. Apr 2013, 19:07

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
Windows 11: AOO, LO Linux Mint: AOO, LO

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Protokoll zu Anrufliste

Beitrag von scientific » Mi 1. Mai 2013, 21:28

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


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten