BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Base - Makro - automatisches Ausfüllen von Datumsfeldern

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
bonpland
Beiträge: 3
Registriert: Mi 8. Feb 2023, 12:47

Base - Makro - automatisches Ausfüllen von Datumsfeldern

Beitrag von bonpland » Mi 8. Feb 2023, 13:09

Hallo.
In habe eine Kunden-Datenbank mit den Tabellen "Kontakte" und "Teilnahmen" für die Planung von Kursen. In "Teilnahmen" habe ich 16 Terminfelder. Sobald ich im Feld "Termin1" einen Wert eingetragen habe werden die folgenden 15 Terminfelder per Makro automatisch mit einem Datum versehen, und zwar "Termin1" + 7 Tage als "Termin2", dann "Termin2" + 7 Tage als "Termin3", "Temin3" + 7 Tage als "Termin4" ..., sodass der nächste Kurstermin jeweils als eine Woche später vorgegeben ist.
Nun möchte ich bei dem automatischen Ausfüllen bestimmte Termine von vornherein ausklammern, z.B. Feiertage, Urlaubstage, etc.
Wie kann ich das Makro anweisen, bestimmte Termine, die ich bspw. in einem Array definiere (ist Array hier überhaupt die richtige Herangehensweise?), nicht in der Terminfolge zu berücksichtigen, sondern stattdessen den nächsten, auf den ausgeklammerten Termin folgenden, geplanten Termin zu setzen?

Danke für Tipps und Hilfen
Roland

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Base - Makro - automatisches Ausfüllen von Datumsfeldern

Beitrag von RobertG » Mi 8. Feb 2023, 15:10

Hallo Roland,

Du müsstest überprüfen, ob das aktuell ermittelte Datum auf einen Feiertag zugreift. Ist das der Fall, dann wird eben 7 hinzugezählt. Da die Funktionen für ein Array in StarBasic aber nicht so dolle sind müsstest Du mit einer Schleife das ganze Array durchlaufen, um entsprechende Treffer zu finden.

Wie Du ein Array zu den Feiertagen hin bekommst habe ich bei den Beispieldatenbanken beschrieben: https://de.libreoffice.org/get-help/documentation/ im Ordner für Base direkt als *.zip mit den Beispielen oder https://wiki.documentfoundation.org/ima ... en_V74.pdf als Beschreibung, dort auf den Seiten 292 (Funktion zur Bestimmung des Ostersonntags in Abhängigkeit von einem Jahr) und 293 (Funktion zur Benennung der Feiertage zusammen mit einem entsprechenden Datum. Du brauchst da natürlich nur die Datumsangaben.

Du kannst es Dir auch einfacher machen, indem Du die Feiertage einfach über Calc ermittelst und von dort in eine Tabelle liest. Dann fragst Du eben beständig die Tabelle ab.

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

bonpland
Beiträge: 3
Registriert: Mi 8. Feb 2023, 12:47

Re: Base - Makro - automatisches Ausfüllen von Datumsfeldern

Beitrag von bonpland » Mi 8. Feb 2023, 16:07

Hallo Robert.

Vielen Dank für die Antwort.

Die Lösung mit der separaten Tabelle hatte ich auch schon ins Auge gefasst.
Hast du auch Anschauungsmaterial für mich, wie ich diese Abfrage ins Makro einbaue?

Gruß
Roland

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Base - Makro - automatisches Ausfüllen von Datumsfeldern

Beitrag von RobertG » Mi 8. Feb 2023, 19:28

Hallo Roland,

das Base-Handbuch kennst Du?
Du musst die interne Datumsvariable in ein SQL-fähiges Datum umwandeln. Das ist im Handbuch 7.5 auf S. 417: Date_to_SQLDate

Code: Alles auswählen

 oDatasource = ThisComponent.Parent.CurrentController
 If NOT (oDatasource.isConnected()) THEN
 oDatasource.connect()
 END IF
 oConnection = oDatasource.ActiveConnection()
 oSQL_Statement = oConnection.createStatement()
 daDatum = Date_to_SQLDate(DatumswertIntern)
 stSql = "SELECT ""Datum"" FROM ""Tabelle"" WHERE ""Datum"" = '"+daDatum+"'"
 oResult = oSQL_Statement.executeQuery(stSql)
 WHILE oResult.next
   stDatum = oResult.getString(1)
 WEND
 IF stDatum <> "" THEN
Nachdem Du nachgesehen hast, ob ein Datum in den Feiertagen vorkommt musst Du zu dem Ausgangsdatum 7 Tage hinzu addieren und das wieder in ein SQL-Datum umwandeln und mit der gleichen Abfrage überprüfen.

Vielleicht geht es auch noch einfacher (direkt mit Abfrage auch des Folgedatums durch den Selectbefehl, als Schleife usw. - nur habe ich jetzt nicht die Zeit das durch zu probieren.

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

bonpland
Beiträge: 3
Registriert: Mi 8. Feb 2023, 12:47

Re: Base - Makro - automatisches Ausfüllen von Datumsfeldern

Beitrag von bonpland » Mo 6. Mär 2023, 11:47

Hallo Robert,
vielen Dank für Deine Unterstützung.
Damit klappt das automatische Ausfüllen des nächsten Datumsfeldes (Termin2) in Abhängigkeit des Vorgabwertes (Termin1), sofern das Ergebnis aus der SQL-Abfrage nicht leer, also ' stDatum <> "" ' , ist.
So weit so gut.

Leider schaffe ich es aber nicht, eine else-Anweisung zu schreiben, die dafür sorgt, dass Termin2 zu Termin1+7 wird, sofern stDatum NICHT Termin1+7 entspricht, das Abfrageergebnis also leer ist.

Ich hoffe, ich kann halbwegs verständlich machen worum es mir geht.

Also:
Wenn Termin1 + 7 einem Datum aus der Liste der Urlaubstage-Tabelle entspricht, dann schreibe in Feld Termin2 das Ergebnis aus Termin1 + x Tage (je nach dem, wie viele mal Termin1 + 7 +7+ 7... in der Urlaubstage-Tabelle vorkommt).
Wenn aber Termin1 + 7 keinem Datum aus der Urlaubstage-Tabelle entspricht, dann schreibe einfach das Ergebnis aus Termin1+7 in Feld Termin2.

Aber bei WHILE-Schleifen scheint danach ein if/else nicht zu funktionieren, oder sehe ich das falsch?

Und kann ich ich das Ganze dann in eine übergeordnete Schleife packen, damit die Datumsermittlung 16 mal, also für jedes der 16 Terminfelder durchlaufen wird?

Vielen Dank schonmal.
Gruß Roland

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Base - Makro - automatisches Ausfüllen von Datumsfeldern

Beitrag von RobertG » Di 7. Mär 2023, 09:29

Hallo Roland,

da wäre vielleicht eine kleine Beispieldatenbank wünschenswert. Wenn Du nur Deine Originaldaten hast, dann solltest Du das hier natürlich nicht hoch laden. Du kannst mich auch per privater Mail anschreiben.

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

F3K Total
Beiträge: 2409
Registriert: So 10. Apr 2011, 10:10

Re: Base - Makro - automatisches Ausfüllen von Datumsfeldern

Beitrag von F3K Total » Do 9. Mär 2023, 17:33

Moin,
weil es mich interessierte, habe ich versucht, die Aufgabe ohne Makro, mit reinem SQL zu lösen. Geht!
Es gibt eine Tabelle T_AUSSCHLUSSDATEN, in diese werden mit dem Formular F_AUSSCHLUSSDATEN alle Termine, die gesperrt sind, z.B. durch Urlaub oder Feiertag eingetragen. Ausserdem gibt es eine Tabelle T_Z, die nur dazu dient innerhalb der SQL-Abfrage einen Kalender zu erzeugen. Im Formular F_TERMINE kann man oben eine Person wählen, und unten ein Startdatum zu dieser Person eingeben, also den ersten Termin. Dann noch die Anzahl der gewünschten Termine. Es werden nun rechts im grünen Feld genau so viele wöchentliche Termine angezeigt, wie gewünscht, ausgeschlossene Termine werden überspungen.
FT1.png
FT1.png (142.22 KiB) 690 mal betrachtet
Die Abfrage sieht wie folgt aus:

Code: Alles auswählen

SELECT 
    COUNT( * ), 
    "Datum" FROM 
        ( 
        SELECT DISTINCT 
            CAST( "Y"."Z"+YEAR(:qSTARTDATUM)-1    || '-' || CASEWHEN( "M"."Z" < 10, '0' || "M"."Z", '' || "M"."Z" ) || '-' || CASEWHEN( "D"."Z" < 10, '0' || "D"."Z", '' || "D"."Z" ) AS DATE ) AS "Datum"
        FROM
            "T_Z" "Y",
            "T_Z" "M",
            "T_Z" "D"
        WHERE
            "Y"."Z" <= 2 
            AND "M"."Z" <= 12 
            AND "D"."Z" <= 31 
            AND ( YEAR( "Datum" ) BETWEEN YEAR(:qSTARTDATUM) AND YEAR(:qSTARTDATUM)+1 )
            AND DAYOFWEEK( "Datum" ) = DAYOFWEEK( :qSTARTDATUM )
            AND "Datum" >= :qSTARTDATUM
            AND "Datum" NOT IN ( SELECT "AUSSCHLUSSDATUM" FROM "T_AUSSCHLUSSDATEN" ) )AS "X"
    LEFT JOIN 
        ( 
        SELECT DISTINCT 
            CAST( "Y"."Z"+YEAR(:qSTARTDATUM) -1    || '-' || CASEWHEN( "M"."Z" < 10, '0' || "M"."Z", '' || "M"."Z" ) || '-' || CASEWHEN( "D"."Z" < 10, '0' || "D"."Z", '' || "D"."Z" ) AS DATE ) AS "Datum"
        FROM
            "T_Z" "Y",
            "T_Z" "M",
            "T_Z" "D"
        WHERE
            "Y"."Z" <= 2 
            AND "M"."Z" <= 12 
            AND "D"."Z" <= 31 
            AND ( YEAR( "Datum" ) BETWEEN YEAR(:qSTARTDATUM) AND YEAR(:qSTARTDATUM)+1 )
            AND DAYOFWEEK( "Datum" ) = DAYOFWEEK( :qSTARTDATUM )
            AND "Datum" >= :qSTARTDATUM
            AND "Datum" NOT IN ( SELECT "AUSSCHLUSSDATUM" FROM "T_AUSSCHLUSSDATEN" ) )AS "Y"
    ON "X"."Datum" >= "Y"."Datum" GROUP BY "X"."Datum"
    HAVING COUNT( * ) <= :qANZAHL
Beispieldatei anbei.
Gruß R
Dateianhänge
Folgetemine.zip
nur entacken
(24.59 KiB) 40-mal heruntergeladen
Windows 10: AOO, LO Linux Mint: AOO, LO

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten