Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Stefan Rusterholz •->
Anmeldedatum: 15.07.2002 Beiträge: 7 Wohnort: Schweiz
|
Verfasst am: 16.07.2002 - 11:54 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
Hallo
Dank eurer gestrigen Antworten habe ich untenstehende Funktion geschrieben, welche in der Tat deutlich schneller arbeitet als wenn man die DS einzeln durchgeht und die benötigten Zellen jeweils zusammensetzt.
Leider stellt sich mir hier ein neues Problem: wie greife ich danach im Array (hm, ich glaub in AppleScript nennt sich das "Liste", oder?) per Feldname auf die im jeweiligen Feld enthaltenen Daten zu?
Meine Idee wäre gewesen, per
Code: |
tell application "FileMaker Pro" to set fieldNames to the name of every field of database fm_db
|
Eine Liste mit den Feldnamen zu bekommen und über diese dann jeweils den Index herauszufinden - leider komm ich genau an diesem Punkt nicht weiter (es sei denn, ich würde jedesmal wenn ich per Feldname auf ein Feld zugreifen will erneut die Liste durchsuchen - wovon ich nicht glaube, dass es sonderlich effizient wäre :-/ )
Code: |
on getFMrecords(fm_db, match_record_names, match_last_mdate)
set match_mdate to date match_last_mdate
tell application "FileMaker Pro"
-- alles vorbereiten
activate
set field "Match" of document fm_db to ""
set matchList to field "match" of document fm_db
set last_mdate to field "Last MDate" of document fm_db
set record_name to field "Record Name" of document fm_db
repeat with i from 1 to (count of record_name)
if match_record_names contains item i of record_name then
tell me to set item_mdate to date (item i of last_mdate)
if match_mdate < (item_mdate) then
set item i of matchList to "match"
end if
end if
end repeat
set field "match" of document fm_db to matchList
set the_data to (every record of database fm_db whose cell "match" = "Match")
show (every record of database fm_db whose cell "match" = "Match")
return the_data
end tell
end getFMrecords
|
Grüsse
Stefan
PS: entschuldigt die Smileys im Code. Ich hab sie eigentlich deaktiviert - aber sie sind trotzdem da :-( _________________ Gr¸sse
Stefan |
|
Nach oben |
|
|
Folker •---->
Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 16.07.2002 - 12:49 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
Hallo Stefan,
ich brüte gerade über das Code-Beispiel. Ist nicht so einfach nachzuvollziehen was eigentlich erreicht werden soll. Vielleicht kannst Du ein paar Angaben machen (kannst mir auch direkt eine Mail senden?)
Soviel fällt mir schon auf: Meine FMP-Dateien enthalten i.d.R. 2/3 Felder, welche nur zur Steuerung, Anzeigen(Formeln) o.ä, verwendet werden, wirkliche Daten (Fakten) sind meist nur 1/3 - warum arbeitest Du mit den gesamten DS-Inhalten?
set the_data to (every record of database fm_db whose cell "match" = "Match")
show (every record of database fm_db whose cell "match" = "Match")
return the_data
Warum lässt Du Dir am Ende die DS anzeigen und was ist wohl los, wenn die gefundenen DS in die Zigtausende gehen - das kann leicht den Rahmen des As zugewiesenen RAM sprengen (und macht es auf jeden Fall nicht schneller)
Wenn ich nicht eine Liste mit benötigten Feld-Namen (z.B. als Property) im Script hinterlegen möchte, so kann ich mir diese z.B. auf einem speziell vorbereiteten Layout in FMP abholen
tell application "FileMaker Pro"
tell database "Test.fp5"
tell layout "Benutzte Felder"
set temp to name of every field
end tell
end tell
end tell
Der Index richtet sich in dem Fall (benanntes Layout!) nach der Erstellungsreihenfolge in dem Layout!! Durch löschen und neu auf dem Layout platzieren lässt sich die Reihenfolge verändern.
Aber in dem Fall kannst Du natürlich gleich die Daten von dem Layout abholen:
tell application "FileMaker Pro"
tell database "Test.fp5"
tell layout "Die Daten"
set temp to every cell of current record
return temp
end tell
end tell
end tell
Ich rate immer dazu, erst die Liste der record ID's gesuchter DS zu holen und dann die gew. DS einzeln abzurufen und zu Verarbeiten. Nur wenn mit überschaubaren Datenmengen gearbeitet wird, kann es Sinn machen ganze fields abzurufen.
Auch ist es immer eine gute Idee FMP's eigene Skriptfähigkeiten hinsichtlich Suchen und Sortieren mit einzuspannen. Auch Suchabfragen lassen sich mit AS in FMP generieren Ö
Achso, was mir noch auffiel: Vorsicht mit document! Wenn Dir einer die Datei mit 0 angezeigten DS hinterlassen hat ist es Essig mit:
set last_mdate to field "Last MDate" of document fm_db
Ok, ich werde bis zum Mittagessen noch mal ein bißchen weiterbrüten - vielleicht komme ich ja dem Zweck noch auf die Spur ;)
Gruß,
Folker _________________ Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign |
|
Nach oben |
|
|
Stefan Rusterholz •->
Anmeldedatum: 15.07.2002 Beiträge: 7 Wohnort: Schweiz
|
Verfasst am: 16.07.2002 - 13:08 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
Hi Folker
Also, in dieser DB sind tatsächlich alle Felder Daten die gebraucht werden.
Wegen des Arbeitsspeichers mache ich mir kaum sorgen, da a) die Felder sehr wenige Daten (meist nur einige Zeichen) enthalten - das wird kaum in den MB-Bereich gehen, was zugunsten von mehr Geschwindigkeit gern eingegangen wird.
Tatsächlich _hole_ ich mir nur die Daten, die gebraucht werden:
Code: |
-- zur Auswahl der benötigten DS notwendige Felder in Listen kopieren
set matchList to field "match" of document fm_db
set last_mdate to field "Last MDate" of document fm_db
set record_name to field "Record Name" of document fm_db
-- Innerhalb von AS die Daten (nur die 2 zur Auswahl relevanten Felder) durchgehen und prüfen
repeat with i from 1 to (count of record_name)
if match_record_names contains item i of record_name then
tell me to set item_mdate to date (item i of last_mdate)
if match_mdate < (item_mdate) then
set item i of matchList to "match"
end if
end if
end repeat
-- bei jedem datensatz, der geholt werden muss wird nun in das feld "match" der text "match" eingetragen
set field "match" of document fm_db to matchList
|
Über das Match-Feld wird nachher eine Liste von DS erzeugt, wobei jeder DS wiederum eine Liste der Felder ist.
Soweit ich das hier nachtesten kann ist das so ziemlich die schnellste möglichkeit an die Daten zu gelangen.
Leider muss ich die Daten nachher aufbereiten (so hat es z.B. einige Felder, die nur entweder ein "X" enthalten oder gar nichts, das soll nachher in einen String geformt werden in dem die namen der Felder mit "X" drinn mit Komma getrennt stehen), wodurch sich mir die Frage nach der sichersten Zugriffsart stellt.
"Sicher" insofern, als dass ich im Moment auf die Daten nur über den Index des Feldes zugreifen kann, welcher sich ja ändert, sobald ein Feld "verschoben" (gelöscht und neu angelegt) wird, etc.
IMHO am sichersten wäre es, über den Feldnamen zuzugreifen.
Die Frage ist also, wie ich folgendes am effizientesten erreiche:
aus folgenden zwei listen
feldnamen = {"recordname","grösse","gewicht","farbe"}
daten_liste = {"mein ds","15m","10kg","rot"}
per funktion (alternativen sind auch willkomen)
getField("gewicht", daten_liste)
=> das resultat sollte "10kg" sein
so in etwa stelle ich mir das vor.
natürlich kann ich jedesmal die namen der felder durchlaufen und so den index des entsprechenden Feldes feststellen - aber das stelle ich mir reichlich ineffizient vor.
Vielleicht beherrscht AS hier ja eine ähnliche Technik wie z.B. Perl, wo es "assoziative Arrays" gibt:
set gewicht to assoziatives_array["gewicht"]
gewicht enthält nun "10kg"
hmm, ich hoffe, ich konnte mich einigermassen verständlich ausdrücken :)
Grüsse und vielen Dank für die Hilfe!
Stefan
PS: bezüglich document: in dem fall halt noch "show every record of database fm_db" - danke für den hinweis _________________ Gr¸sse
Stefan |
|
Nach oben |
|
|
Snow Administrator
Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 16.07.2002 - 13:59 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
Hey Stefan,
du führst die Suche nach den benötigten Datensätzen innerhalb des AppleScripts aus. Ich würde das FileMaker machen lassen, das ist wesentlich schneller. Was die Geschwindigkeit betrifft, solltest du auch immer prüfen, ob FileMaker im Vordergrund sein muss. Das kann bis zu 10 mal länger dauern.
Hier mal ein Beispiel für eine simple Suchabfrage:
tell application "FileMaker Pro"
set db to "Stammposter AppleScript-Forum"
--activate
show (every record of database db whose cell "Name" is "" )
get cell "Vorname" of every record
end tell _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com
Zuletzt bearbeitet von Snow am 22.02.2003 - 16:09, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Folker •---->
Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 16.07.2002 - 14:15 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
Aber Vorsicht bei Abfragen via whose bzw. where! Problem ist, dass so nur eine Standard-Suchabfrage ohne Operator stattfindet! Suchen mit Operatoren z.B. = oder == (vergl. FMP) sind so nicht möglich. Das kann zu Problemen führen. Ich weise nochmals auf die Möglichkeit hin, entweder via request und find als AppleScript oder aber mittels do script FileMaker Script "Name" die kombinierte Methode zu verwenden. Es können ja FMP-Variablenfelder aus AS belegt werden und dann ein FMPSkript welches eine äußerst ausgefeilte Suchabfrage erstellen und durchführen kann, angestoßen werden.
Gruß,
Folker _________________ Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign |
|
Nach oben |
|
|
Snow Administrator
Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 16.07.2002 - 14:46 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
OK, dann halt noch ein Beispiel mit request und find:
global theData
set theData to ""
tell application "FileMaker Pro"
set db to "Stammposter AppleScript-Forum"
delete every request
create request
set cell "Vorname" of request 1 to "Hans-Peter"
find
set theID to ID of every record
repeat with oneID in theID
my getData(oneID)
end repeat
end tell
theData
on getData(oneID)
tell application "FileMaker Pro"
set temp to cell "Vorname" of record ID oneID & tab & ¨
cell "eMail" of record ID oneID & return
set theData to theData & temp
end tell
end getData
Taugt das? _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com
Zuletzt bearbeitet von Snow am 22.02.2003 - 16:09, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Stefan Rusterholz •->
Anmeldedatum: 15.07.2002 Beiträge: 7 Wohnort: Schweiz
|
Verfasst am: 16.07.2002 - 14:46 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
Hi Folker
Problem 1: Es sollte wenn irgend möglich alles im AppleScript liegen. D.h. kein FMP-Skript zum suchen anstossen. (Abgesehen davon ist AS in der Beziehung schnell genug - auf einem G3/500 braucht das Skript bei 150 DS gerade mal 7s - was ausreichend und deutlich schneller ist als das alte Skript mit ca. 4min.)
Problem 2:
Konvertierung 2er Listen in einen record (ich denke, dass das dem assoziativen Array wohl entspricht)
wenn ich das recht verstehe ist ein record ziemlich genau wie ein assoziatives array aufgebaut:
{ schlüssel1:"Wert1",schlüssel2:"Wert2"}
Wie kann ich nun 2 Listen (wobei Liste A die Schlüssel und Liste B die Werte für den Record enthält) zu einem record konvertieren? Geht das in AS überhaupt?
Grüsse
Stefan _________________ Gr¸sse
Stefan |
|
Nach oben |
|
|
Folker •---->
Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 16.07.2002 - 14:59 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
Also Stefan, je länger ich das Posting lese, je größer wird meine Konfusion. Ich steig nicht ganz durch, kann allerdings auch kein Perl. Wenn ich das Gewicht eines best. DS haben will
tell app "FileMaker Pro"
tell database "MyDB"
tell layout 0
tell record ID recID
return cell "Gewicht"
end tell
Ö
Das geht natürlich auch mit div. cells:
return {cell "Gewicht", cell "Name", Ö}
Anstelle von Strings kann ich natürlich auch Variablen übergeben - welche Felder ich brauche, muss ich ja vorher wissen?
Was die Performance angeht - es kann sehr schnell sein mittels repeat loop zu arbeiten - wenn es allerdings auf 1/10 Sekunden ankommt, ok dann ist es was anderes, aber ich glaube kaum, dass es einen großen Unterschied macht eine ganze Spalte in eine Variable zu hieven und im Loop zu behandeln oder im Cache des FMP abzufragen.
Es grüßt ein immer noch etwas ratloser
Folker _________________ Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign |
|
Nach oben |
|
|
Folker •---->
Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 16.07.2002 - 15:05 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
Oops, da habe ich länger geschrieben und die letzte Antwort von Dir noch nicht gelesen. Was Du meinst ist ein record!
tell application "FileMaker Pro"
tell document "Test.fp5"
tell current layout
set temp to {data1:cell "ORT", data2:cell "TELEFON"}
end tell
end tell
end tell
data1 of temp _________________ Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign |
|
Nach oben |
|
|
Stefan Rusterholz •->
Anmeldedatum: 15.07.2002 Beiträge: 7 Wohnort: Schweiz
|
Verfasst am: 16.07.2002 - 15:08 Titel: FileMaker - Zugriff auf Daten per Feldname |
|
|
tut mir leid, wenn ich dich mit meinen Erklärungen nur noch mehr verwirrt habe...
Ich begebe mich jetzt so langsam nach Hause (werd wohl ca. um 1700 zu Hause sein) von wo aus ich etwas gemütlicher eine komplette Beschreibung mailen kann - bzw. falls du ICQ hast, könnte man sich auch dort (oder einem anderen chat) treffen...
Liebe Grüsse und nochmal herzlichen Dank für die Mühe!
Stefan _________________ Gr¸sse
Stefan |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2002 phpBB Group Deutsche Übersetzung von phpBB.de
|
|
|