Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

FileMaker - Zugriff auf Daten per Feldname

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Stefan Rusterholz
•->
•->


Anmeldedatum: 15.07.2002
Beiträge: 7
Wohnort: Schweiz

BeitragVerfasst am: 16.07.2002 - 11:54    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 16.07.2002 - 12:49    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Stefan Rusterholz
•->
•->


Anmeldedatum: 15.07.2002
Beiträge: 7
Wohnort: Schweiz

BeitragVerfasst am: 16.07.2002 - 13:08    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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" Smile - danke für den hinweis
_________________
Gr¸sse
Stefan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 16.07.2002 - 13:59    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 16.07.2002 - 14:15    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 16.07.2002 - 14:46    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
Stefan Rusterholz
•->
•->


Anmeldedatum: 15.07.2002
Beiträge: 7
Wohnort: Schweiz

BeitragVerfasst am: 16.07.2002 - 14:46    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 16.07.2002 - 14:59    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 16.07.2002 - 15:05    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Stefan Rusterholz
•->
•->


Anmeldedatum: 15.07.2002
Beiträge: 7
Wohnort: Schweiz

BeitragVerfasst am: 16.07.2002 - 15:08    Titel: FileMaker - Zugriff auf Daten per Feldname Antworten mit Zitat

Smile
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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
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


AppleScript für absolute Starter