FileMaker Konferenz2010 Mit SQL-Kommandos FileMaker Daten lesen - und schreiben Integriertes SQL in FileMaker 12 SQL mit Plugins nutzen Nicolaus Busch, N. Busch GmbH SQL-Kommandos 1 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Struktur 1. Was ist SQL? 2. Konzeptionelle Unterschiede SQL-FM 3. Neu in FileMaker 12: SQL-Select 1. Aufbau einer SQL-Abfrage 2. Was geht, was geht nicht? 3. Caveat: Das macht Probleme 4. Was kann man damit anstellen? Anwendung an Beispielen 1. Vorhandensein eines Datensatzes prüfen (SELECT BY ID) 2. Einschub: Das macht Probleme 3. Einschub: Dynamische vs. statische Argumente 4. Werte aus einem Datensatz holen ohne Beziehung oder Suche (SELECT fieldnames) 5. Liste verschiedener Werte innerhalb Suchbereich holen (SELECT DISTINCT) 6. Array gruppierter Summen holen (SELECT COUNT GROUP BY) 7. Join oder: One Night Stand statt Beziehung Nicolaus Busch, N. Busch GmbH SQL-Kommandos 2 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Struktur 4. Mit Plugins SQL ausschöpfen 1. Plugins im Markt 2. Vorsicht bitte! 3. Erweiterte Möglichkeiten durch CREATE, UPDATE & DELETE 1. Datensatz in beliebige Tabelle einfügen (INSERT INTO) 2. Datensatz in beliebiger Tabelle aktualisieren (UPDATE … WHERE …) 3. Datensätze löschen aufgrund Bedingung (DELETE FROM … WHERE) 4. Exkurs: Erweiterte Möglichkeiten durch PHP-Programmierung (oder andere Sprache) 5. Auch hier: Umbenennungs-Probleme 5. Funktionsbibliotheken am Beispiel Smartpill 4. Den Function-Maker nutzen 5. Funktionen zur Laufzeit laden 6. Update vie URL Nicolaus Busch, N. Busch GmbH SQL-Kommandos 3 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Was ist SQL? • • • • SQL ist keine Datenbank SQL ist eine Sprache (Structured English Query Language) Entwickelt Anfang der 1970er Jahre bei IBM Wenige Sprachelemente zur Abfrage und Manipulation von Daten und Datenbankstruktur • Von zahlreichen DBMS unterstützt (MySQL, MS SQL Server, Oracle, DB/2, FileMaker,…) • Sprache im Wesentlichen unabhängig von verwendeter Engine Nicolaus Busch, N. Busch GmbH SQL-Kommandos 4 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Konzeptionelle Unterschiede SQL-FM • FileMaker: Suche selektiert Datensätze für weitere Bearbeitung • Befehle beziehen sich auf die Fundmenge • SQL: Jedes Statement steht für sich • Suche und Datenausgabe/Manipulation im selben Befehl • Erstellen, Editieren, Löschen mit Bedingungsangabe Nicolaus Busch, N. Busch GmbH SQL-Kommandos 5 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Neu in FileMaker 12: SQL-Select • SQL-Statements an FileMaker schicken • Allgemeine Form: SQLQueryAusführen( "SELECT field(s) FROM table [WHERE Bedingung ]") • Einfachstes Beispiel SQLQueryAusführen( "SELECT * FROM Adressen" ; "";"") 156231,Müller,DE,Walter,Helmut Kohl Allee 12,55116,Mainz 2312,Meier,AT,Irene,Erzherzog-Johann-Strasse 5,1172,Wien 12156,Ganter,CH,Hansueli,Bankenplatz 1,8000,Zürich 15612,Zehnder,,Rudolf,Paradeplatz 12,1100,Wien Unsortierte Liste, Feldreihenfolge wie erstellt Nicolaus Busch, N. Busch GmbH SQL-Kommandos 6 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Datensatz prüfen • Gibt es dich schon? IstLeer( SQLQueryAusführen( " SELECT id FROM Adressen WHERE Nachname = 'Sarasin' AND Vorname = 'Philipp' "; "" ; "" )) •Ergebnis: Leer oder ID-Liste • Weichere Abfrage: SQLQueryAusführen( " SELECT id FROM Adressen WHERE LOWER( Nachname ) = 'sarasin' AND LOWER( Vorname ) = 'philipp' "; "" ; "" ) Nicolaus Busch, N. Busch GmbH SQL-Kommandos 7 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Das macht Probleme • Was geht: alle Arten von Abfragen mit SELECT Was geht nicht: alle Arten von Manipulation der Daten oder der Struktur • Unterstützung durch FileMaker bei Fehlern: keine • gross- und KLEINschreiBunG von Argumenten • Umbenennungs-Probleme • _Sonderzeichen in Feldname ⇒ \" benutzen • Keine SQL-Abfragen in gespeicherten Berechnungen! • Kein SQL-Abfragen im Data Viewer stehen lassen! Nicolaus Busch, N. Busch GmbH SQL-Kommandos 8 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Dynamische vs. statische Argumente SQLQueryAusführen( "SELECT id FROM Adressen WHERE Nachname = 'Sarasin' AND Vorname = 'Philipp' "; "" ; "" ) SQLQueryAusführen( "SELECT id FROM Adressen WHERE Nachname = '" & Adressen::Nachname & "' AND Vorname = '" & Adressen::Vorname & "' "; "" ; "" ) SQLQueryAusführen( "SELECT id FROM Adressen WHERE Nachname = ? AND Vorname = ? "; "" ; "" ; Adressen::Nachname ; Adressen::Vorname ) Nicolaus Busch, N. Busch GmbH SQL-Kommandos 9 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Werte aus einem Datensatz holen SQLQueryAusführen( "SELECT plz, ort, land, strasse FROM Adressen WHERE NOT land = ? "; "" ; "" ; "AT" ) //end SQLQuery 55116,Mainz,DE, Helmut Kohl Allee 12 8000,Zürich,CH,Bankenplatz 1 1100,Wien,, Paradeplatz 12 Nicolaus Busch, N. Busch GmbH SQL-Kommandos 10 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Einsatz im FileMaker-Script Beispiel: Neue Person anlegen Script ausführen[ fn.TroiDL_Input["Title =" & "Neue Person" & ¶ & "Labels =Name#Vorname " & ¶ &)" Aus Datei:“LL4_Toolbox”; (…) Variable setzen [ $Selection; Wert:HoleWert( Hole( ScriptErgebnis ) ; 1) ] Wenn [ $Selection = 1 ] Variable setzen [ $Nachname; Wert:HoleWert( Hole( ScriptErgebnis ) ; 2) ] Variable setzen [ $Vorname; Wert:HoleWert( Hole( ScriptErgebnis ) ; 3) ] Variable setzen [ $Matches; Wert:SQLQueryAusführen( "SELECT \"_pk_GUID\", \"d_Nachname_t\", \"d_Vorname_t\", \"d_Geburtsort_t\", \"d_Geburtsjahr_n\" FROM DAutor WHERE LOWER( d_Nachname_t ) = ?" & Falls( NICHT IstLeer( $Vorname) ; " AND LOWER( d_Vorname_t )= ?") & " ORDER BY d_Nachname_t, d_Vorname_t"; ", " ; "" ; Kleinbuchstaben( $Nachname ); Kleinbuchstaben( $Vorname )) ] Wenn [ NICHT IstLeer( $Matches ) ] Script ausführen[ "fn.TroiDL_SelectFromList["Text =" & _::AuswahlDatensatzOderNeu ; & "¶" & "B1 =OK ¶B2 =Neu ¶B3 =NeueSuche ¶B4 =Abbruch ¶" Aus Datei: “LL4_Toolbox”; (…) (…) Nicolaus Busch, N. Busch GmbH SQL-Kommandos 11 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Liste verschiedener Werte holen SQLQueryAusführen("SELECT d_AutorNachname_t , d_AutorVorname_t FROM DTitel WHERE LOWER( d_ort_t ) = ?" ; ", ";"dublin") Connolly, James Connolly, James Mitchell, Arthur Martin, F.X. Martin, F.X. Nowlan, Kevin B. O'Broin, Leon O'Broin, Leon Nevin, Donal Cronin, James Cronin, James Lalor, Fintan Nowlan, Kieran Nicolaus Busch, N. Busch GmbH SQL-Kommandos 12 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Liste verschiedener Werte holen II SQLQueryAusführen("SELECT DISTINCT d_AutorNachname_t, d_AutorVorname_t FROM DTitel WHERE LOWER(d_ort_t) = ? ORDER BY d_AutorNachname_t, d_AutorVorname_t" ; ", " ; "dublin") Connolly, James Cronin, James Lalor, Fintan Martin, F.X. Mitchell, Arthur Nevin, Donal Nowlan, Kevin B. Nowlan, Kieran O'Broin, Leon Nicolaus Busch, N. Busch GmbH SQL-Kommandos 13 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Array gruppierter Summen holen SQLQueryAusführen( "SELECT d_Ort_t, COUNT(d_Titel_t) FROM DTitel GROUP BY d_Ort_t"; "" ; "") ,24 Dublin,1 Frankfurt,1 Frankfurt a.M,1 Frankfurt am Main,2 Hamburg,2 Stuttgart,1 Zürich,2 Nicolaus Busch, N. Busch GmbH SQL-Kommandos 14 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Array im Script einsetzen Beispiel: Show count of distinct Values Variable setzen [$Feldname; Wert: Get( ActiveFieldName)] Variable setzen [$Tabelle; Wert: Get( LayoutTableName)] Variable setzen [$Query; Wert: "echo fm_sql_select(\"Select COUNT( DISTINCT " & $Feldname & ") FROM " & $Tabelle & "\");"] Variable setzen [$Result; Wert:PHP_Execute ($Query)] Eigenes Dialogfeld anzeigen ["Unique values of " & $Feldname; $Result] Nicolaus Busch, N. Busch GmbH SQL-Kommandos 15 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Join oder: One Night Stand statt Beziehung ExecuteSQL ("SELECT Ti.d_Titel_t , Ti.d_Ort_t , Ti.d_Datierung_t, Au.d_Nachname_t , Au.d_Vorname_t , Au.d_Geburtsort_t , Au.d_Geburtsjahr_n FROM DTitel Ti JOIN DAutor Au ON Ti.\"_fk_Autor\" = Au.\"_pk_GUID\" WHERE Ti.d_Ort_t = ? ORDER BY Au.d_Nachname_t ASC";"";""; "Dublin") ExecuteSQL ("SELECT Ti.d_Titel_t , Ti.d_Ort_t , Ti.d_Datierung_t, Au.d_Nachname_t , Au.d_Vorname_t , Au.d_Geburtsort_t , Au.d_Geburtsjahr_n FROM DTitel Ti, DAutor Au WHERE Ti.d_Ort_t = ? AND Ti.\"_fk_Autor\"=Au.\"_pk_GUID\" ORDER BY Au.d_Nachname_t ASC";"";""; "Dublin") Nicolaus Busch, N. Busch GmbH SQL-Kommandos 16 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Script mit Join #Ruft die Titel auf, bei denen Publikationsort gleich Geburtsort des Autors ist Variable setzen [ $Result ; Wert:SQLQueryAusführen ( " SELECT Ti.\"_pk_GUID\" FROM DTitel Ti JOIN DAutor Au ON Ti.\"_fk_Autor\" = Au.\"_pk_GUID\" AND Ti.\"d_Ort_t\" = Au.\"d_Geburtsort_t\" ORDER BY Au.\"d_Nachname_t\" ASC"; "";"") ] Wenn [ NICHT IstLeer( $Result ) ] Feldwert setzen [ DGlobals::v_TitelID_tg ; $Result ] Fenster fixieren Gehe zu Layout [ “DGlobals” (DGlobals) ] Gehe zu Bezugsdatensatz[ Aus Tabelle: “DGlobals.Titel” ; Mit Layout: “lst.Titel” (DTitel) , Nur Bezugsdatensätze zeigen ] Ende (wenn) Nicolaus Busch, N. Busch GmbH SQL-Kommandos 17 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Mit Plugins SQL ausschöpfen • Erweiterte Möglichkeiten durch INSERT, UPDATE & DELETE • Erweiterte Möglichkeiten durch PHP-Programmierung Nicolaus Busch, N. Busch GmbH SQL-Kommandos 18 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Plugins im Markt • 2empower FM SQL Runner www.dracoventions.com Reines SQL-Plugin, kostenlos, FM-Daten lesen in Versionen pre-12 • myFMButler DoSQL http://www.myfmbutler.com/ Lesen und schreiben in FM via SQL, unterstützt neben SELECT, INSERT, UPDATE und DELETE auch CREATE, ALTER und DROP • Monkeybread MBS SQL Connection http://www.monkeybreadsoftware.de Unterstützt SELECT, INSERT, UPDATE und DELETE Umfangreicher Befehlssatz • Scodigo Smartpill www.scodigo.com Unterstützt SELECT, INSERT, UPDATE und DELETE Stellt Umgebung für PHP zur Verfügung • 360Works ScriptMaster4 www.360works.com Unterstützt SELECT, INSERT, UPDATE und DELETE Stellt Umgebung für Groovy(Java) zur Verfügung Nicolaus Busch, N. Busch GmbH SQL-Kommandos 19 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com CAVEAT! Ab hier geht es Ihren Daten an den Kragen! Testen, testen und nochmal testen Varianten erproben Save often, save early fm_sql_Execute(" INSERT INTO Autor (Nachname, Vorname) VALUES ('Sarasin','Philipp')"); ") fm_sql_Execute(" UPDATE Autor SET \"ID\"='99ab23'; ") Nicolaus Busch, N. Busch GmbH SQL-Kommandos 20 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Datensatz einfügen (INSERT INTO) Allgemeine Form: fm_sql_Execute( \"INSERT INTO " & $Database & " (" & $Names & ") " & " VALUES (" & $Values & ")\");" Beispiel: echo fm_sql_Execute( "INSERT INTO DTitel ( _fk_Autor, _pk_GUID, d_AusgabeSeite_t, d_AutorNachname_t, d_AutorVorname_t, d_CoAutoren_t, d_Datentyp_t, d_Datentyp2_t, d_Datierung_t, d_Kurztitel_t, d_Reihe_t, d_Titel_t, s_AenderungName_t, s_AenderungZeit_ts, s_ErstellungName_t, s_ErstellungZeit_ts ) VALUES ( 'A_WFMDAABX8JWWKLAKJ.MN.120210.112303', 'HPYWWJVG5FP92U5VC.MN.120210.115013', '8-14', 'Dyk', 'Silke', 'Stephan Lessenich', 't', 'Aufsatz', '2010', 'Potentiale des Alters', 'Mittelweg 36, 19. Jg.', 'Die Potentiale des Alters und die Soziologie', 'nb', '19.02.2012 13:45:05', 'ps', '10.02.2012 11:50:13' ) "); Nicolaus Busch, N. Busch GmbH SQL-Kommandos 21 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Datensatz aktualisieren (UPDATE) Allgemeine Form: fm_sql_Execute( \"UPDATE " & $Database & " SET " & $NamesValues & " WHERE ID = '" & $ID & "'\");" Beispiel:: echo fm_sql_Execute( " UPDATE Titel SET \"_fk_Autor\"='A_WFMDAABX8JWWKLAKJ.MN.120210.112303', \"_fk_Bibliothek\"='25634', \"d_Titel_t\"=' Diskursanalyse meets Gouvernementalitätsforschung : Perspektiven auf das Verhältnis von Subjekt, Sprache, Macht und Wissen', (…) \"s_ZoteroKey_t\"='17F2YA89', WHERE _pk_GUID = 'HPYWWJVG5FP92U5VC.MN.120210.115013' "); Nicolaus Busch, N. Busch GmbH SQL-Kommandos 22 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com INSERT & UPDATE fm_sql_Execute(" INSERT INTO Autor (ID) VALUES ('99ab23')"); ") fm_sql_Execute(" UPDATE Autor SET \"Nachname\"='Sarasin', \"Vorname\"='Philipp' WHERE \"ID\" = '99ab23'; ") Nicolaus Busch, N. Busch GmbH SQL-Kommandos 23 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Datensatz löschen (DELETE) Let( $Command = "echo fm_sql_execute( \" DELETE FROM " & table & " WHERE \\\"_pk_GUID\\\"='" & id & "' \");"; PHP_Execute ($Command) ) LETZTE WARNUNG: NICHT SO Let( $Command = "echo fm_sql_execute( \" DELETE FROM " & table \");"; PHP_Execute ($Command) ) Nicolaus Busch, N. Busch GmbH SQL-Kommandos 24 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Exkurs: Erweiterte Möglichkeiten durch PHP- Programmierung Beispiel: Daten verschlüsseln Variable setzen [$PW; Wert:"IchBinGeheim"] Variable setzen [$Text; Wert:Get ( ActiveFieldContents )] Variable setzen [$Query; Wert:"$cipher = MCRYPT_RIJNDAEL_128;$key = hash('md5', '" & $PW & "');$iv_size = mcrypt_get_iv_size($cipher, MCRYPT_MODE_ECB);$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);$crypt_text = mcrypt_encrypt($cipher, $key, '" & $Text & "', MCRYPT_MODE_ECB, $iv);$Result = base64_encode($crypt_text);echo $Result;"] Variable setzen [$Result; Wert:PHP_Execute ( $Query )] Variable setzen [$Error; Wert:PHP_GetLastError] Feldwert setzen [; $Result] Gehe zu Feld [] Nicolaus Busch, N. Busch GmbH SQL-Kommandos 25 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Exkurs: Erweiterte Möglichkeiten durch PHP- Programmierung Beispiel: Anzahl Werte ausgeben Variable setzen [$Feldname; Wert:Get( ActiveFieldName)] Variable setzen [$Tabelle; Wert:Get( LayoutTableName)] Variable setzen [$Query; Wert:"echo fm_sql_select(\"Select COUNT( DISTINCT " & $Feldname & ") FROM " & $Tabelle & "\");"] Variable setzen [$Result; Wert:PHP_Execute ( $Query )] Variable setzen [$Error; Wert:PHP_GetLastError] Eigenes Dialogfeld anzeigen ["Unique values of " & $Feldname; $Number] Nicolaus Busch, N. Busch GmbH SQL-Kommandos 26 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Funktionsbibliotheken am Beispiel Smartpill Den Function-Maker nutzen Tests definieren Sets erstellen Nicolaus Busch, N. Busch GmbH SQL-Kommandos 27 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Funktionen zur Laufzeit laden Laden aus lokalen Dateien SetzeVar[ $Result ; Value:PHP_LoadFunctions ] Laden via URL SetzeVar[ $result; Value:PHP_LoadFunctionsFromURL ( "http://www.beispiel.ch/xml/PHPx_Functions.xml" ) ] Nicolaus Busch, N. Busch GmbH SQL-Kommandos 28 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com Further reading • http://www.w3schools.com/sql/ • filemakerhacks.com: FM 12 ExecuteSQL: Robust Coding, part 1 • Wikibooks: Einführung in SQL Nicolaus Busch, N. Busch GmbH SQL-Kommandos 29 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com FileMaker Konferenz2010 Vielen Dank unseren Sponsoren Danke für das Bewerten dieses Vortrages Nicolaus Busch, N. Busch GmbH SQL-Kommandos 30 FileMaker Konferenz 2012 Salzburg www.filemaker-konferenz.com