Artikel zu FileMaker: siehe Projekte
Im Unterschied zu früheren Versionen können in FM 14/15 viele Einstellungen in den Optionen nicht mehr wie gewohnt vorgenommen werden. Früher war klar: Doppelklick auf einen Scriptbefehl öffnet ein Fenster, in dem sämtliche Einstellungen vornehmbar sind. Ab FM 14/15 gibt es eine Trennung zwischen Haupt- und Nebeneinstellungen. Die Haupteinstellungen (beim Scriptbefehl „Datensätze exportieren“ z.B. ist das die Exportreihenfolge) sind zugänglich, wenn man doppelklickt, die Nebeneinstellungen (bei „Datensätze exportieren“ ist das die Wahl zwischen „Mit Dialog:Ein“ und „Mit Dialog:Aus“) können nur verändert werden, wenn man genau den Teil der Option anklickt, den man verändern möchte, im Falle von „Mit Dialog:Ein“ wäre das das Wort „Ein“. Klickt man nicht genau auf dieses Wort, sondern z.B. auf „Mit Dialog“, passiert gar nichts - man hat den Eindruck, diese Option sei nicht zugänglich. Aus meiner Sicht ist das eine deutliche Verschlechterung des Komforts. Aber da der gesamte Scriptarbeitsbereich überarbeitet wurde, ergab sich wahrscheinlich die Notwendigkeit, zwischen Haupt- und Nebeneinstellungen unterscheiden zu müssen. Man wird sich daran gewöhnen können…
FM 12 und 13:
Syntax:
FM 7 bis 11:
Syntax:
Anlage einer Verknüpfung auf Desktop:
Seit FileMaker 7 (teilweise auch erst ab späteren Versionen) gibt es einige tolle Funktionen:
= ZeichenRechts(eMail; (Länge (eMail) - Position(eMail;"@";1;1)))
= SetzeVars ([ a = Position(eMail ; "@" ; 1 ; 1); b = Länge(eMail) - a]; ZeichenRechts(eMail ; b) )
Die Variablen werden hintereinander, durch Semikolon getrennt, deklariert; eingeschlossen werden sie gemeinsanm in eckigen Klammern; wiederum mit Semikolon von der Variablendeklaration getrennt kommt die eigentliche, das Endergebnis liefernde Kalkulation.
Wichtig zu wissen: mit „SetzeVars“ können alle drei Typen von Variablen deklariert werden: reine Kalkulationsvariablen ohne $ (wie im vorstehenden Beispiel), lokale Variablen mit einem $ und globale Variablen mit $$! (siehe auch unten: Variablen)
SetzeVars ([ a = Abs(Mod((wann) - Datum(6;21;2010); 7)); b = Abs(Mod((wann) - Datum(6;22;2010); 7)); c = Abs(Mod((wann) - Datum(6;23;2010); 7)); d = Abs(Mod((wann) - Datum(6;24;2010); 7)); e = Abs(Mod((wann) - Datum(6;25;2010); 7)); f = Abs(Mod((wann) - Datum(6;26;2010); 7)); g = Abs(Mod((wann) - Datum(6;27;2010); 7)) ]; Falls( a = 0; "Montag"; b = 0; "Dienstag"; c = 0; "Mittwoch"; d = 0; "Donnerstag"; e = 0; "Freitag"; f = 0; "Samstag"; g = 0; "Sonntag" ) )
Wichtig:
Die letzte Zeile der Falls-Funktion muss keine Bedingung enthalten, hier kann auch einfach ein Wert stehen; das ist so etwas wie „sonst gilt“:
SetzeVars ([ a = Abs(Mod((wann) - Datum(6;21;2010); 7)); b = Abs(Mod((wann) - Datum(6;22;2010); 7)); c = Abs(Mod((wann) - Datum(6;23;2010); 7)); d = Abs(Mod((wann) - Datum(6;24;2010); 7)); e = Abs(Mod((wann) - Datum(6;25;2010); 7)); f = Abs(Mod((wann) - Datum(6;26;2010); 7)); g = Abs(Mod((wann) - Datum(6;27;2010); 7)) ]; Falls( a = 0; "Montag"; b = 0; "Dienstag"; c = 0; "Mittwoch"; d = 0; "Donnerstag"; e = 0; "Freitag"; f = 0; "Samstag"; \\sonst: "Sonntag" ) )
Syntax: HoleNtenDatensatz (Feldname; Datensatznummer).
Das bedeutet: man kann tatsächlich wie in Excel vom aktuellen Datensatz aus auf die Feldinhalte eines weit entfernten Datensatzes zugreifen, ohne dass dazu ein Skript laufen muss! Sämtliche Prüfformeln, die in der Excel-QuIndex-Version eingebaut sind, lassen sich auf diese Weise nach FileMaker übertragen! Beispiel:
= HoleNtenDatensatz (HT; Hole (DatensatzPositionInErgebnismenge) - 1) gibt den Inhalt des Felds "HT" aus dem vorherigen Datensatz zurück.
Für eine Doppeltenmarkierung hieße die Funktion
SetzeVars ([ a = HT; b = HoleNtenDatensatz ( HT; Hole ( DatensatzPositionInErgebnismenge ) - 1 ); c = HoleNtenDatensatz ( HT; Hole ( DatensatzPositionInErgebnismenge ) + 1 ) ]; Falls ( a = b ODER a = c; "x"; "" ))
FileMaker 10 und neuer: Die Funktion passt wunderbar zu der neuen Eigenschaft, dass FileMaker jeden hinzukommenden Datensatz automatisch in eine sortierte Anordnung einpasst!
FileMaker 7 bis 9: Hier wird die Brauchbarkeit der Funktion durch die Tatsache getrübt, dass sie immer nur ein Ergebnis auf der Basis einer unsortierten Ergebnismenge liefert! Speziell in QuIndex heißt das: z.B. eine Doppeltenmarkierung über diese Funktion funktioniert nur direkt nach dem alphabetischen Import der Daten!
HoleNtenDatensatz (Feldname; Datensatznummer) gehört zu den Logikfunktionen (es handelt sich nicht um eine Statusfunktion!).
Achtung: <hi>Das Ganze funktioniert nur, wenn in der Felddefintion bei „Speicheroptionen“ das Häkchen bei „Ergebnisse nicht speichern – nur Bedarf neu berechnen“ gesetzt wird!</hi> (Siehe auch Cache leeren bzw. Hole-Funktionen)
Was ist der Unterschied zwischen Skripts und Funktionen?
Skripts
Funktionen
Das Verhältnis zwischen Skripts und Funktionen ist also nicht symmetrisch. Skripts können mehr als Funktionen.
Insbesondere fällt auf, dass zwar Funktionen innerhalb von Skripts, aber keine Skripts innerhalb der Formel einer Funktion aufgerufen werden können.
Was sind eigene Funktionen?
Eigene Funktionen heben diese Asymmetrie in gewisser Weise auf.
Auch eigene Funktionen wirken nur innerhalb des aktuellen Datensatzes, aber sie sind sozusagen der Ersatz für Skripts, die ebenfalls nur im aktuellen Datensatz wirken.
Interessant ist vor allem die Möglichkeit, einen Schleifen-Mechanismus in eigene Funktionen einbauen zu können, also etwas, das sonst nur in Skripts möglich ist. Bei eigenen Funktionen heißen die Schleifen Rekursionen, weil die Funktion sich praktisch immer wieder selbst aufruft, bis ein bestimmter Parameterwert erreicht ist.
Ansonsten sind eigene Funktionen im Grunde nichts weiter als eine Abkürzung für komplexe Berechnungen. Und zwar eine Abkürzung, die an beliebigen Stellen - in einem anderen Feld, in einem Skript, in einer anderen Datei - zur Verfügung steht. Das würde man sonst nur mit Copy and Paste kompletter Formeln, also recht mühsam, erreichen.
Als Abkürzung für eine komplexe Berechnung kann zwar auch eine globale Variable (also eine Doppeldollar-Variable, z.B. $$a) verwendet werden, aber gegenüber einer eigenen Funktion hat die globale Variable zwei Nachteile:
Eine eigene Funktion ist aus Anwendersicht betrachtet genauso aufgebaut wie eine inhärente FileMaker-Funktion: sie hat einen Namen und die Parameter stehen in runden Klammern, durch Semikolon voneinander getrennt.
Entwickelt wird eine eigene Funktion praktisch immer auf der Basis der beiden inhärenten FileMaker-Funktionen SetzeVars und Falls.
Beispiel: „Tannenbaum“-Funktion zur Verkürzung der Trefferliste in einem Ausschnittsfenster (aus FMM 5/2010, S.13-14); sie hat nur einen Parameter: _text
Tannenbaum (_text)
SetzeVars ([ _zchn = ZeichenLinks(_text;1); $wort = $wort & _zchn; $text = $text & _zchn ]; Falls( _zchn = ""; SetzeVars ([ _tannenBaum = $textBaum; $textBaum = ""; $text = ""; $wort = "" ]; _tannenBaum ); _zchn = " "; SetzeVars ([ $wort = "" ]; Tannenbaum (ZeichenMitte (_text; 2; 999999)) ); Position (¶ & $textBaum; ¶ & $wort & ¶; 1; 1) = 0; SetzeVars ([ $textBaum = $textBaum & $wort & ¶; $textBaum = $text & ¶ & $textBaum ]; Tannenbaum (ZeichenMitte (_text; 2; 999999)) ); //Sonst SetzeVars ([ $textBaum = $text & ¶ & $textBaum ]; Tannenbaum (ZeichenMitte (_text; 2; 999999)) ) ) )
Als Parameter „_text“ kann irgendein Feld genommen werden. In QuIndex dient z.B. das Feld „HT“ als Parameter; so wird ein Formelfeld xy mit der „Tanne“ von HT besetzt: xy = Tannenbaum (HT). Das Feld xy kann dann als Referenzfeld verwendet werden, z.B. in einer Beziehung „pruef_zk“, die auf der Gleichheit der Inhalte der beiden Felder „xy“ und „pruef_zeichenkette“ beruht, wobei „pruef_zeichenkette“ manuell befüllt wird. Im Ausschnittsfenster „pruef_zk“ werden dann die Datensätze angezeigt, die zur aktuellen Zeichenkette passen.
Rekursion heißt, dass die Funktion sich selbst aufruft, d.h., sie wird genauso eingebaut, wie wenn es eine andere Funktion wäre. Der (oder die ) Funktionsparameter kann (können) bei jedem Einbau (Aufruf) derselbe sein, aber der Clou ist, dass der Parameter sich automatisch mitverändert. Und zwar nimmt FileMaker immer den Wert aus dem letzten Durchlauf. Das ist also ganz analog zu Variablen, denn da kann es ja auch z. B. heißen:
Achtung: datensatzbezogene Trigger, also Trigger, die immer dann ablaufen, wenn
können schnell dazu führen, dass eine Endlosschleife entsteht oder dass andere Scripts nicht mehr korrekt laufen.
Mir ist bisher kein Fall begegnet, in dem ein datensatzbezogener Trigger Sinn gehabt hätte.
Eigentlich trivial, aber trotzdem erstaunlich:
Das Weglassen des Zielfeldes (vgl. vorstehenden Punkt) ist eine wesentliche Voraussetzung dafür, dass die Cursorposition innerhalb eines Feldes (nämlich des Feldes, in dem der Cursor blinkt) per Script gesteuert werden kann.
Diese Navigation wird u.a. benötigt, um ausgewählten Text per Skript zu formatieren oder mit Formatierungscodes zu versehen.
Formatierungen werden am besten mit Codes vorgenommen, weil sie dann mit anderen Programmen wie Word, InDesign oder auch Indexingprogrammen (wie Cindex oder Sky) ausgetauscht werden können (unter Nutzung von Regex in den jeweiligen Programmen).
Typische Formatierungen sind kursiv, fett, hoch und tief. Mögliche Formatierungscodes (für einen ausgewählten Text „xxx“):
Formatierung | RTF-Code | Cindex-Code |
---|---|---|
kursiv | {\i xxx} | \ixxx\I |
fett | {\b xxx} | \ixxx\B |
hoch | {\u xxx} | \ixxx\U |
tief | {\d xxx} | \ixxx\D |
Um ausgewählten Text mit Formatierungscodes zu versehen, müssen
festgehalten werden. Dazu gibt es die Feldfunktionen
Beide Werte werden in lokale Variablen geschrieben (z.B. $cursorstart und $cursorende).
Der Cursor lässt sich mit dem Skriptbefehl Auswahl festlegen positionieren, in dem eine Start- und Endposition angegeben werden kann.
Betrachten wir z.B. ein Feld „HT“, in dem ein ausgewählter Text für Cindex kursiv formatiert werden soll. Das Skript dazu könnte lauten:
Fenster fixieren Wenn [Hole (AktivesFeldName) = "HT"] Variable setzen [$cursorstart; Wert:Hole (AktiveTextAuswahlStart)] Variable setzen [$cursorende; Wert:Hole (AktiveTextAuswahlGröße)] Auswahl festlegen [HT; Startposition: $cursorstart; Endposition: 0] Text einfügen ["\i"] #Da nun 2 Buchstaben mehr im Feld sind, muss 2 addiert werden Auswahl festlegen [HT; Startposition: $cursorstart +2 +$cursorende; Endposition: 1] Text einfügen ["\I"] Sonst Ende (wenn)
Anmerkungen:
Der Inhalt eine Auswertefeldes kann in Formeln verwendet werden. M.a.W.: mit Auswertefeldern kann man (fast) ganz normal rechnen. Aber einige Dinge muss man dabei beachten, insbesondere, wenn es sich um „laufende“ Auswertungen handelt:
Also in einem Skript, in dem auf eine Formel mit Auswertefeld zurückgegriffen wird, immer
siehe Auswertefelder
Es kann vorkommen, dass eine Formel vollkommen korrekt ist, trotzdem aber das Ergebnis nicht angezeigt wird. Das Feld bleibt leer. Das liegt sehr wahrscheinlich daran, dass in der Formel auf ein Feld verweisen wird, dass leer ist. Standardmäßig berechnet FileMaker Formeln nicht, wenn dieser Zusammenhang gegeben ist. Im Formelfenster gibt es unten links eine Checkmarke „Nicht berechnen, wenn verwendete Felder leer sind“. Einfach das Häkchen wegnehmen, dann müsste es funktionieren.
Das Prinzip ist ganz einfach: Man nehme
Das wars im Grunde. Wird nun der Bereich des Buttons angeklickt oder in eines der Felder mit Trigger, so wird das Script ausgeführt und führt automatisch (da $$mark immer gleich rec_id sein muss!) zur farblichen Hervorhebung.
Wichtig: „Fenster aktualisieren“ bewirkt, dass die vorherige Hervorhebung gelöscht und die neue angezeigt wird. (siehe auch: Cache leeren)
Cache leeren geht auf zwei Weisen:
zu ungespeicherten Feldern siehe z.B. Ray Cologon „FileMaker Pro 10 Bible“, S. 483 ff. („Unstored Calculations“)!!!
Hole-Funktionen haben ihre Eigenarten. Ganz wichtig ist, dass man immer dann, wenn eine Hole-Funktion in einer Formel in einem Feld verwendet wird, dafür sorgen muss, dass der Cache geleert wird! Das geht bei Feldern nur, indem die automatische Speicherung der Feldinhalte ausgeschaltet wird (siehe oben Cache leeren). Nur dann wird bei jeder Änderuing der Datenbank (z.b. einer neuen Sortierung) ein einmal ermittelter Feldinhalt durch den neuen überschrieben!
Beispiel: Die Funktion Hole (DatensatzPositionInErgebnismenge) liefert nur bei ausgeschaltetem Speicher die gewünschten Ergebnisse!
In einem Skript liefern Hole-Funktionen immer den jeweils aktuellen Wert!
In einem Bezugsdiagramm kann jede Tabelle mehrmals auftreten, man spricht von „Tabellenauftreten“ oder „Tabellenauftritten“. Jeder Auftritt muss einen anderen Namen erhalten; der Name des Auftritts ist auch in Beziehungen, die man anlegt, zu sehen. Im Grunde werden Beziehungen nicht zwischen Tabellen selbst, sondern immer zwischen Tabellenauftritten definiert.
In einem Bezugsdiagramm kann es Tabellen bzw. Tabellenauftritte ohne Bezug geben. Dabei heißt es aufgepasst! Es lassen sich
Im FM-Magazin 06/2010 wird auf S. 27 ein Weg für eine dynamische Ausschnitts(Portal)sortierung beschrieben. Wichtig sind dabei zwei Dinge:
Da das Formelfeld eine Kalkulation mit einem globalen Feld vornimmt, wird es nicht gespeichert und somit nicht indiziert. Das hat aber auf die Sortierung keinerlei Einfluss (siehe auch Cologon FM 10, S. 342). Platziert werden muss das Formelfeld sowohl im Hauptlayout als auch im Ausschnitt.
Das globale Parameterfeld wird am besten per Script gefüllt (muss aber nicht sein).
Wo soll die Sortierung eingestellt werden: in der Relation oder direkt im Portal? Da im Portal immer nur eine Untermenge aller Datensätze dargestellt wird, empfiehlt es sich, die Sortierung hier einzustellen, nicht in der Relation, denn die Relation wirkt sich auf alle Datensätze aus mit der Konsequenz, dass gerade bei einem VPN-Zugriff auf die Datei die Anzeige sich nur sehr langsam aufbaut.
Beispiel QuIndex: Im Portal „ht_ht“ soll auf Knopfdruck nach dem Feld HT, UT, UUT, siehe oder S1 sortiert werden.
Das globale Feld sei „sort_ausschnitt_steuerung“, das Feld, nach dem sortiert wird, sei „sort_ausschnitt_text“ (es soll ausschließlich aufsteigend sortiert werden).
Dann lautet die Formel für „sort_ausschnitt_text“:
Falls( sort_ausschnitt_steuerung = "HT"; HT; sort_ausschnitt_steuerung = "UT"; Wenn(UT="";"(())";UT); sort_ausschnitt_steuerung = "UUT"; Wenn(UUT="";"(())";UUT); sort_ausschnitt_steuerung = "siehe"; Wenn(siehe_siehe_auch="";"(())";siehe_siehe_auch); sort_ausschnitt_steuerung = "S1"; Wenn(Länge(S1)=1;"0000"&S1; Wenn(Länge(S1)=2;"000"&S1;Wenn(Länge(S1)=3;"00"&S1;"00"))) )
Da die Portalsortierung nur noch auf dem Formelfeld „sort_ausschnitt_text“ basiert, dieses aber als Ergebnis Text liefert, müssen Zahlenfelder, nach denen man ebenfalls sortieren möchte, in alphanumerische Felder umgewandelt werden. Das geschieht in der Formel oben, indem führende Nullen per Textaddition („&“) der jeweiligen Zahl (S1) hinzugefügt werden.
Besetzt wird das Feld „sort_ausschnitt_steuerung“ per Script, und zwar werden so viele Scripts benötigt, wie es Felder gibt, also ein Script für HT (dadurch wird „sort_ausschnitt_steuerung“ mit „HT“ besetzt), eines für UT usw. Im jeweiligen Script steht im Grunde nur drin, dass der Feldwert von „sort_ausschnitt_steuerung“ gesetzt wird; außerdem scheint es gut zu sein, noch den Befehl „Fenster aktualisieren“ einzubauen, damit die Berechnung für das ungespeicherte Feld auf jeden Fall durchgeführt wird. Für jedes Script wird über dem Auschnittsfenster ein Button platziert (in der Nähe des jeweiligen Feldes). Das wars im Grunde!
Das Gute: Dieselben Scripts können für mehrere Ausschnittsfenster verwendet werden, die auf unterschiedlichen Relationen beruhen, aber dieselben Felder enthalten!
Achtung: Wenn die Sortierung gleichzeitig in der Relation und im Portal eingestellt ist, kann es zu Konflikten kommen! Immer kontrollieren, ob auch in der Relation eine Sortierung verlangt wird; falls ja: ausschalten.
Es kann passieren, dass eine Relation richtig definiert ist und trotzdem keine Daten im Ausschnitt auf der Basis dieser Relation angezeigt werden. Um herauszufinden, was der Grund ist, hilft ein Blick auf den Graph der Relation:
ht_sort_prüf = SetzeVars([a= ähnlichkeitsbreite02]; Falls (a = 3; HT_sort_3 ; a = 4; HT_sort_4; a = 5; HT_sort_5; a = 6; HT_sort_6; HT_sort_10) )
und die andere Formel:
prüf_einzelverweis_var = SetzeVars([a = ähnlichkeitsbreite02]; Falls( a = 3; prüf_einzelverweis_3; a = 4; prüf_einzelverweis_4; a = 5; prüf_einzelverweis_5; a = 6; prüf_einzelverweis_6; prüf_einzelverweis_10) )
Zwischen den beiden Feldern ht_sort_prüf und prüf_einzelverweis_var wird eine Beziehung definiert mit dem Ziel, dass sämtliche Vorkommnisse angezeigt werden, sobald im Feld prüf_einzelverweis etwas eingegeben wird. Die Felder prüf_einzelverweis_3, prüf_einzelverweis_4 usw. geben immer den linken Teil des Feldes prüf_einzelverweis wieder, und zwar mit einer Länge, die durch ähnlichkeitsbreite_02 vorgegeben ist. Doch Schreck: Im Portal wird nichts angezeigt!
Schaut man sich den Beziehungsgraphen an, so wird klar, was los ist: Die Beziehungslinie, die zwischen ht_sort_prüf und prüf_einzelverweis_var gezogen ist, hat auf beiden Seiten „stumpfe“ Enden, d.h., die Beziehung kann von FileMaker nicht ausgewertet werden. Und das liegt daran, dass beide Felder per Formel auf einem globalen Feld basieren (hier sogar auf demselben globalen Feld, was aber unerheblich ist). Globale Felder gehören allen Datensätzen, daher gibt es keinerlei spezielle Zuordnung zu bestimtmen Datensätzen, also kann keine Beziehung definiert werden.
Aber: wenn nur auf einer Seite einer Beziehung auf einem globalen Feld basiert, dann klappt es! In diesem Fall ist aber die Richtung der Beziehung entscheidend. (Vgl. Coffey/Prosser „FileMaker 9 Pro The Missing Manual“, S. 395)
Achtung: bin nicht ganz sicher, ob das wirklich so ist. Möglicherweise können sogar Bezugsdatensätze über mehrere Beziehungen angelegt werden (keine gute Datenintegrität!); der Grund für das oben beschriebene Problem scheint ein anderer zu sein!
WG 20.10.09:
Auch in FileMaker 10 tritt dieser Effekt auf! Es scheint sogar so zu sein, dass manche Skripts, die in FM 9 problemlos liefen, in FM 10 plötzlich auf andere Felder wirken, selbst wenn diese Felder im Skript gar nicht angesprochen werden! Aufgetreten ist der Effekt in QuIndex. Möglicherweise spielt die Anzahl der Felder in einer Tabelle eine Rolle. Angeblich gibt es diesbezüglich zwar kaum Grenzen (vgl. „FM 10 Pro in Depth“), aber FM läuft beileibe nicht fehlerfrei!
WG 21.9.08:
FileMaker scheint hin und wieder ein Problem mit manchen Feldern zu bekommen; in QuIndex wurden einige Skripts, die Änderungen am Feld „UE“ vornehmen sollten, nicht ausgeführt. Das Ganze war ein Effekt, der auf ein bestimmtes Layout beschränkt blieb. Einzige Lösung: Feld neu platzieren!
Der vorhergehende Punkt hängt u.U. damit zusammen, dass einige Layouts im Laufe der Zeit (wenn sie immer wieder umgestaltet wurden) korrupt werden können. Darauf gibt es zahlreiche Hinweise in FM-Foren.
Ich habe mir überlegt, dass es vielleicht am besten ist, Funktion und Form weitestgehend voneinander zu trennen. D.h. schön gestaltete Layouts sollten nicht dazu verwendet werden, viele Formelfelder zu tragen oder für den Ablauf von Skripts Zwischenergebnisse aufzunehmen usw. „Formlayouts“ sollten nur die Felder enthalten, die zur Eingabe und Darstellung der Daten nötig sind, alle anderen Felder sollten auf reinen „Funktionslayouts“ platziert werden. Deren Aussehen ist unwichtig, sollte nur einigermaßen übersichtlich sein. Die Gestaltung von Funktionslayouts sollte möglichst selten geändert werden und möglichst wenig Zusatzelemente enthalten (also kaum Buttons, Linien, Kästen, Reiter usw.). Alle Skripts sollten immer zu den Funktionslayouts umgeleitet werden, und am Ende steht der User wieder im Formlayout.
Für QuIndex heißt das, dass die Bearbeitungslayouts kräftig entfrachtet werden. Dann müsste alles stabil laufen.
Im FM-Forum des FM-Magazins ist immer wieder der Hinweis zu finden, dass manche Skriptaktionen für andere davon abhängige Aktionen zu schnell ablaufen, eventeull kommt auch das Betriebssystem nicht hinterher, weil der Cache noch belegt ist usw.
Lösung des Problems: einfach mal Skriptpausen einbauen!
Siehe auch: „Cache leeren“.
Schleife (Anfang) Eigenes Dialogfeld ["Anfangsdatum"; Feld: glob__feld1] Eigenes Dialogfeld ["Enddatum"; Feld: glob__feld2] Verlasse Schleife wenn [glob_feld1 > Systemdatum UND glob_feld2 > glob_feld1] Schleife (Ende)
Die beiden Felder glob_feld1 und glob_feld2 sind als Datumsfelder definiert und akzeptieren nur Datumswerte; daher muss nicht auf das Datumsformat an sich überprüft werden, sondern lediglich darauf, dass Anfangs- und Enddatum im richtigen Zeitbereich liegen.
WG 1.7.09:
Unbedingt zu beachten ist, dass Feldüberprüfungen immer nur auf Merkmale innerhalb des aktuellen Datensatzes hin durchgeführt werden! Das hat gewaltige Konsequenzen:
WG 28.12.07:
Jedes „Objekt“ in einem Layout - Feld, Portal, Reiter, … - kann mit einem Namen versehen werden. Der Name ist nicht von vornherein vorhanden, sondern muss bewusst zugewiesen werden. Das geschieht, indem man das Objekt anklickt und dann im „Objekt-Info-Fenster“ den Namen einträgt. Danach kann das Objekt mit dem Script-Befehl „Gehe zu Objekt“ angesprungen werden.
Ab FileMaker 5 (!) ist es möglich, Zugriffsrechte auf Datensatzebene zu erteilen, ab FM 7 klappt es so, wie man es sich wünscht (Auschnitt aus Mail an dirk am 18.7.07):
Man kann bei der Rechte-Erteilung einfach ein Kriterium angeben, das den Zugriff auf Datensatzebene gestattet oder nicht. Also Rechte-Erteilung ganz variabel und per Formel! Am einfachsten scheint es zu sein, ein ganz normales Feld in der Datenbank als „Zugriffsfeld“ zu definieren, das bei der Erzeugung eines jeden Datensatzes automatisch gefüllt wird - beispielsweise mit den ersten 4 Ziffern des Projektnummernkreises von Scitech Italia oder Scitech Deutschland (man könnte sich auch andere Inhalte überlegen). Dann könnten z.B. drei verschiedene Berechtigungen definiert werden: eine Admin-Berechtigung (alles sehen und bearbeiten), eine Berechtigung für Deutschland und eine für Italien, wobei letztere zwei auf dieses Zugriffsfeld zurückgreifen. Das tolle: Die Datensätze, auf die der Zugriff nicht erlaubt ist, werden wirklich nicht angezeigt, man kann nach ihnen auch nicht suchen - gar nichts. So soll es ja auch sein!
Kriterium in FM 5 und 6 mit „Musteranzahl (Feld, Text)“ (ohne weitere Operation dahinter!) abfragen, damit ein logisches Wahr oder Falsch herauskommt (Wenn-Abfrage geht nicht!), ab FM 7 ist die Wahr/Falsch-Logik gleich eingebaut und man braucht einfach nur das Feld anzugeben und welcher Bedingung der Inhalt genügen soll, also z.B. <zugriff> = 1.
Es gibt drei verschiedene Möglichkeiten, mit Variablen zu arbeiten:
Gut:
Eine mögliche Lösung wird ausführlich in R. Cologon „FM Pro 10 Bible“ (S. 400ff) beschrieben.
Erstaunlich: Voraussetzung für das Funktionieren sind sog. Platzhalter (englisch: Merge fields). Die gibt es mindestens schon seit FM 7!
Das Prinzip besteht darin, Platzhalter zu platzieren, die abhängig von einer gewählten Sprache mit dem jeweiligen Inhalt gefüllt werden. Der sprachabhängige Inhalt wird einfach in einer separaten Tabelle gepflegt.
Wichtige Erkenntnis: Es werden keine Felder benötigt; die gesamte Variabilität wird durch die Platzhalter übernommen.