Hallo Patric,
Ignis Pugnatur hat geschrieben:Ich werde aus den beiden Makros nicht wirklich schlau.
Das wird allerdings daran liegen, dass ich mich mit Makros und deren Programmstruktur nie wirklich beschäftigt habe.
IF-THENE-ELSE ist eines der wenigen die ich von der Funktion her verstehe.
Code: Alles auswählen
FUNCTION Date_2_SQLDate(d AS DATE) AS STRING
DIM stMonth AS STRING
DIM stDay AS STRING
IF Month(d) < 10 THEN
stMonth = "0" + Trim(Str(Month(d)))
ELSE
stMonth = Trim(Str(Month(d)))
END IF
IF Day(d) < 10 THEN
stDay = "0" + Trim(Str(Day(d)))
ELSE
stDay = Trim(Str(Day(d)))
END IF
Date_2_SQLDate = Trim(Str(Year(d))) +"-"+ stMonth +"-"+ stDay
END FUNCTION
Zuerst eine Kurzerklärung zu der Funktion: Funktionen haben einen Rückgabewert. Sie werden z.B. an anderer Stelle in einer Prozedur (SUB ...) aufgerufen und geben dort dann einen Wert wieder. ich habe so eine Funktion schreiben müssen, da das systeminterne Basic-Datum nicht dem Datum entspricht, das von der Datenbank erwartet wird. Das systeminterne Datum (eigentlich eine reine Zahl) muss zu einem Datum umgewandelt werden, das mit der vierstelligen Jahreszahl beginnt, danach ein en Bindestrich hat, dann die zweistelligen Monatszahl, wieder einen Bindestrich und die zweistellige Tageszahl. Du kannst so eine Funktion einfach als Blackbox nehmen. Ich packe ein Basic-Datum rein und bekomme eines in SQL-Schreibweise wieder heraus.
Code: Alles auswählen
SUB Datum_einfuegen
oDoc=thisComponent
oDrawpage=oDoc.Drawpage
REM Lage des Feldes in dem entsprechenden Formular aufsuchen
oForm=oDrawpage.Forms.getByName("Formular")
oFeld=oForm.getByName("Datum")
oFeldID=oForm.getByName("ID")
IF IsEmpty(oFeldID.getCurrentValue) THEN
stDatum = Date_2_SQLDate(CDate(Date()))
oFeld.BoundField.updateString(stDatum) 'updateDate funktioniert hier nicht, da die Datentypen nicht übereinstimmen. Es wird ein String übergeben.
END IF
END SUB
In dieser Prozedur wird auf die Felder in einem Formular zugegriffen. Der Start geht immer über "thisComponent". Das Formular wird mit Namen benannt, die beiden Felder (eins für das Datum, eines für den Primärschlüssel) sind ebenfalls mit Namen benannt. Das für den Primärschlüssel benötige ich, da ja nur bei der Neueingabe das Datum gesetzt werden soll. Dann ist das Primärschlüsselfeld leer. Das wird mit IF IsEmpty(...) überprüft.
Danach wird der Variablen stDatum das aktuelle Datum zugewiesen. Mit Date() erhalte ich das aktuelle Datum. Wenn Du einfach ein Makro "msgbox Date()" laufen lassen würdest, so würde diese Datum in einem Popup angezeigt. Dieses Datum wird als Zahl ausgegeben und über die GUI gegebenenfalls als Datum umformatiert. Mit CDate() erhalte ich daraus ein tatsächliches Datumsformat, aus dem ich dann Tage, Monate und Jahre extrahieren kann. Mit der vorherigen Funktion wird daraus das Datumsformat, das ich für den Eintrag in ein Feld einer Datenbank benötige.
Mit oFeld.BoundField spreche ich das Datenfeld zu dem Datumsfeld an. Ich ändere dort den Wert auf das SQL-Datum, das vorher erstellt wurde. Hier gebe ich einen String weiter, kein Datum - da die Typen untereinander eben nicht verträglich sind.
Nachteil dieser Version: Das Ganze sieht für Base wie eine Eingabe aus. Wird also sonst kein neuer Datensatz tatsächlich abgespeichert, so erfolgt die Nachfrage: "Sollen die Daten abgespeichert werden". Der Nutzer hat nur gar keine Daten eingegeben.
Ignis Pugnatur hat geschrieben:
Das mit dem Unterformular finde ich etwas zu umständlich, würde aber ggf. Sinn machen wenn man diese Funktion oft (also in mehreren Formularen/Berichten) benötigt.
Damit sollte ich mich mal befassen, denn auch diese Stuktur habe ich noch nicht ganz verstanden (das mit dem ID-Feld).
Konstruktionen mit Formularen und Unterformularen anzuwenden - das ist eigentlich die Basis, mit der in Base gearbeitet wird. Dadurch erfolgt eine Datensatzfilterung und eine erkennbare Struktur in den Daten. Ich würde z.B. bei einer Konstruktion mit voneinander hierarchisch abhängigen Listenfeldern über diese Konstruktion arbeiten: Inhalt der Hauptkategorie im obersten Formular, Inhalt der ersten Unterkategorie um ersten Unterformular, Inhalt der zweiten Unterkategorie im ersten UnterUnterformular usw.
Ignis Pugnatur hat geschrieben:
Ich hab das mal eingegeben
(ALTER TABLE "Tabellenname" ALTER COLUMN "Datumsfeldname" SET DEFAULT CURRENT_DATE)
- wüsste im Moment nicht mal wie ich das in SQL prüfen könnte ..... und ob ich das nun richtig eingesetzt habe.
Die Eingabe erfolgt ja in Extras → SQL. Wenn in dem zweiteiligen Eingabefeld unten erscheint "Befehl erfolgreich ausgeführt" (oder so ähnlich), dann hat das funktioniert. Du siehst das Ergebnis, wenn Du jetzt einen Datensatz eingibst und das Datumfeld leer lässt. Dies geht z.B. direkt in der Tabelle ganz schön. Bleibt das Datumsfeld leer, so steht dort nach dem Abspeichern (Wechsel des Datensatzes) das aktuelle Datum.
All diese Beschreibungen zum aktuellen Datum sind für den Normaluser leider viel zu kompliziert. Besser wäre es da sicherlich, wenn in den Eigenschaften des Datumsfeldes wirklich, wie in der Hilfestellung beschrieben, der aktuelle Datumswert als Standardwert vorgewählt werden kann. Vielleicht kommt das ja in einer der nächsten Office-Updates ...
Gruß
Robert