FMK2012: Datenaustausch zwischen FileMaker und MySQL von Nico Busch
1. FileMaker Konferenz2010
Datenaustausch zwischen FileMaker
und MySQL
Lesen, Vergleichen, Schreiben
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
2. Struktur
1. Szenario: FileMaker-Runtime und MySQL-Server
1. Beispiel MVB3
2. Beispiel Litlink
3. Lizenz beachten!
2. Was brauchen wir?
1. FileMaker Advanced
2. PHP-Plugins
3. MySQL
3. Arbeiten mit FileMaker PHP am Beispiel Smartpill
1. Verschiedene Arten, PHP-Code zu integrieren – Script, Feldwert,
Custom Function, externe Funktion
2. Den Function-Maker nutzen
3. Funktionen erstellen
4. Update zur Laufzeit via URL
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
3. Struktur
4. Aufbau der SQL-Datenbank
5. Den Datenabgleich organisieren
1. Warum ein Transfermodul?
2. Was sind neue Daten?
3. Protokoll einrichten
4. Datenstrukturen vergleichen
5. Daten zum SQL-Server schicken
6. Daten vom SQL-Server holen
7. Konflikte lösen
8. Daten schreiben
9. Protokoll abschliessen
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
4. Szenario
MVB3: Teamsoftware für die Mütter- und Väterberatung
• FileMaker Runtime
• Gleichzeitige Erfassung und Bearbeitung von Daten auf diversen
Rechnern
• Datennutzung soweit separat, dass in der Praxis keine Konflikte zu
erwarten sind
• Datenabgleich mit MySQL-Server
Litlink: Wissensmanagement für Geisteswissenschaftler mit Web-
Anwendung
• FileMaker Runtime oder Vollversion
• Erfassung alternierend auf verschiedenen Rechnern des gleichen Users
oder in der Weboberfläche
• Projektfreigabe für andere User
• Datenabgleich mit MySQL-Server
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
5. Lizenz beachten
Keine Netzwerk-Funktion für Runtime nachbauen
"All use of the Runtime and Runtime Solutions must be on a standalone
basis only. You are prohibited from using the Runtime with any
middleware, application server, CGI, or other software or technology that
allows more than a single client to access the Runtime."
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
6. Was brauchen wir?
• FileMaker natürlich
• FileMaker Advanced dringend empfohlen (Data Viewer!)
• Ein PHP-Plugin
• MySQL (>> XAMP)
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
7. PHP-Plugins
• Monkeybread MBS SQL Connection
http://www.monkeybreadsoftware.de
Umfangreicher Befehlssatz
• Scodigo Smartpill
www.scodigo.com
Stellt Umgebung für PHP zur Verfügung
• 360works ScriptMaster
www.360works.com
Groovy (Java) statt PHP
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
8. MySQL Testumgebung einrichten
Virtuelle Maschine, Website, Server
Xampp verwenden: http://www.apachefriends.org/de/xampp.html
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
9. PHP-Code: Arbeitsvarianten
• Code direkt im Script
• Custom Functions nutzen
• Mit dem Smartpill Function Maker arbeiten
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
10. Code direkt im Script
Variable setzen [$table; Wert:GetValue( Get( ScriptParameter ) ; 1 )]
Variable setzen [$ID; Wert:GetValue( Get( ScriptParameter ) ; 2 )]
Variable setzen [$Command;
Wert:"echo fm_sql_select("SELECT count(1) FROM "" & $table & ""
WHERE "_pk_GUID" = '" & $ID & "'") ;" ]
Variable setzen [$$SQL_Result; Wert:PHP_Execute ( $Command)]
Aktuelles Script verlassen [$$SQL_Result]
Probleme mit Anführungszeichen
Feldname und Tabellennamen in Anführung "Feldname"
" im Text " "Feldname"
" im Text " "Feldname"
Feldwert in Hochkomma ID = '34523'
Berechneter Wert "_pk_GUID" = '" & $ID & "'
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
12. Function Maker
Code ohne umständliche Anführungszeichen
Package variables – Sauberer Code
Kontrollierte Übergabe von Parametern
Fehlerbehandlung
Testumgebung
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
13. Funktionsbibliotheken erstellen
• Den Function-Maker nutzen
• Tests definieren
• Sets erstellen
• Version-Funktion nutzen
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
14. Update 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 FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
15. Den Datenabgleich organisieren
FileMaker- Transfermodul
SQL
Datenbank (FM)
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
16. Aufbau der SQL-Datenbank
In allen FM-Tabellen:
s_ChanceLocal_n - Wert "1" wenn lokal geändert
FileMaker- In Global-Tabelle:
Datenbank d_LLwebLastsyncNo_ng
d_LLwebNextsyncNo_ng
– Nummer des letzten abgeschlossenen Synchs
– Nummer des laufenden Synchs
d_LLwebLastDate_tg - Zeitstempel letzter Abgleich
Tabellen enthalten immer alle Feldnamen, die in der
Geschichte des Projekts existierten Import funktioniert
immer mit Option "Gleiche Feldnamen"
Transfermodul
(FM)
• Gleiche Tabellen- und Feldnamen wie in
FileMaker verwenden
• Zusätzliche Tabellen für Metadaten:
web_global, web_synchlog
SQL • Synchnummer: Sitzungsnummer des
Datenabgleich-Vorgangs in jedem Datensatz
• Webänderung: Timestamp von Upload oder
Bearbeitung im Web
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
17. Warum ein Transfermodul?
• Sicherheit
• Update-Erwägungen: Aktualisierung unabhängig von Kundendaten
• Anpassungen der Daten vor dem Import & Export
• Flexibilität – Import aus verschiedenen Fremdsystemen
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
18. Ablauf des Abgleichs
• Transfermodul leeren
• Neue Daten lokal identifizieren
• Datenset in das Transfermodul laden
• Daten zum SQL-Server schicken
• Transfermodul leeren
• Neue Daten auf Server identifizieren
• Daten vom Server holen
• Daten im Transfermodul aufbereiten
• Daten nach Litlink schreiben
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
19. Was sind neue Daten
• Upload:
Zeitstempel letzte lokale Änderung > Letzter Abgleich UND
s_ChangeLocal_n = 1
• Download:
Synchnummer SQL-Datensatz > Synchnummer letzter Abgleich
ODER
( Zeitstempel Webänderung > Zeitstempel letzter Abgleich
UND
Synchnummer SQL-Datensatz <> Synchnummer letzter Abgleich)
"Pingpong" verhindern:
Upload nur Elemente, die auf diesem Rechner bearbeitet wurden
Gleichzeitiger Upload mehrerer Clients ist möglich
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
20. Rechte des Users prüfen
PHPx_SQL_CheckUserAccount:
$user = fm_get_parameter('user');
$pwd = fm_get_parameter('pwd');
(…)
$SQL_connect= mysql_connect($server,$account,$password);
if( $SQL_connect===false) {
errorHandler(SQL_ERR_COULD_NOT_CONNECT, 'Database: ' . $db);
return ;
}
mysql_select_db($db) or die("Selection of database ".$db." failed".mysql_error());
$user = mysql_real_escape_string( $user);
$pwd = mysql_real_escape_string( $pwd);
$query = "SELECT count(1) as Counter FROM Adressen WHERE d_Email_t='".$user."' and
d_Passwort_t='".$pwd."' and d_active_i='1'";
$res = mysql_query($query);
if(!empty($res)){
$row = mysql_fetch_assoc($res);
echo $row['Counter'];
}
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
21. Letzte Sitzungsnummer holen…
PHPx_SQL_GetSynchNo:
mysql_select_db($db) or die("Selection of database ".$db." failed".mysql_error());
$query = "SELECT * FROM Adressen WHERE d_Email_t='".$user."' and
d_Passwort_t='".$pwd."' and d_active_i='1'";
$res = mysql_query($query);
$iad = 0;
while($row = mysql_fetch_assoc($res)){
$litdat_ID = $row['_pk_guid'];
$litdat_lastsynch = $row['d_SynchId_n'];
$iad++;
echo $litdat_ID."<br>";
echo $litdat_lastsynch;
}
if( $iad!=1) {
echo 'Error';
return ;
}
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
22. …und neue Sitzungsnummer schreiben
PHPx_SQL_SetServerSynchNo:
$sid = fm_get_parameter('sid');
mysql_select_db($db) or die("Selection of database ".$db." failed".mysql_error());
$user = mysql_real_escape_string( $user);
$pwd = mysql_real_escape_string( $pwd);
$query = "UPDATE Adressen SET d_SynchId_n='".$sid."',d_LastUploadId_n='".$sid."'
,d_LastUpload_t=now()
WHERE d_Email_t='".$user."' AND d_Passwort_t='".$pwd."'";
$res = mysql_query($query);
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
27. cf.SqlInsertCommand
//Use like: SetField(Field; cf.SQLUpdateCommand ( T1; T2; ValueCount(T1) ))
//Params: pT1, pSearch, NpT1
SetzeVars(
[line = HoleWert(pT1; NpT1);
content = Berechne( line )
];
Falls( NpT1 > 1; cf.SQLInsertCommand(pT1; pSearch; NpT1-1)) &
Falls( ZeichenLinks(line; Länge( pSearch )) <> psearch UND NICHT IstLeer( content );
line & ",¶")
)
"Ort¶PLZ¶Land¶Region" "Ort,¶PLZ,¶Land,¶Region,¶"
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
28. cf.SqlInsertCommandValues
//Use like: SetField(Field; cf.SQLInsertCommandValues ( T1; T2; ValueCount(T1) ))
//Params: pT1, pSearch, NpT1
//cf.SQLInsertCommandValues=
SetzeVars(
[line=HoleWert(pT1; NpT1);
Str1 = Falls( ZeichenLinks( line ;1 ) = "_" ODER ZeichenRechts(line;2) <> "_t" ODER
ZeichenLinks(line; 10)="d_datentyp" ODER $$UTFSupport <> 1 ; Berechne( line ) ;
cf.CSStoFMText ( LiesAlsCSS( Berechne( line ))));
Str2 = Austauschen( Str1 ; "" ; "");
Content = "'" & Austauschen( Str2 ; ["'" ; "''"];[""" ; """];["“" ; "“"];["”" ; "”"];["‟" ; "‟"];["„" ;
"„"];["„";"„"]) & "'"
];
Falls( NpT1 > 1; cf.SQLInsertCommandValues(pT1; pSearch; NpT1-1)) &
Falls( ZeichenLinks(line; Länge( pSearch )) <> psearch UND NICHT IstLeer( Str1 );
content & ",¶")
)
D_Titel_t¶d_Ort_t¶d_Schlagworte_t (Städte mit schwierigen Namen¶北京¶N'Djamena)
'Städte mit schwierigen Namen',¶'北京',¶'N''Djamena',
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
29. SQL_WriteRecordInSQL_DB
$id ='_pk_GUID';
$noempty=false; // print out only non empty fields
if(isset($dbtable) && !empty($dbtable)){
$commonfields .=",x_fk_User, s_webAenderung_t, x_web_synchid";
$content .=",'".$litdat_ID."', now(),'".$websynchid."'";
$where =" WHERE _pk_GUID='". $idsel."'";
$checkres = mysql_query("select * from ".$dbtable." ".$where );
$resdel = True;
if(mysql_fetch_assoc($checkres)){ // record already exists
$resdel = mysql_query( "delete from ".$dbtable."".$where);
if($resdel===False) echo "Failed delete: ".$idsel."<br>";
}
$update = "insert into ".$dbtable." (".$commonfields.") VALUES (".$content.") ";
if($resdel){
$updres = mysql_query($update);
if( $updres === False ) {
echo "Failed insert: ".$idsel." ";
echo mysql_error();
}
}
}
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
30. Daten vom SQL-Server holen
1. Die Selection definieren
…
$sel = "WHERE x_fk_User='".$litdat_ID."'";
if(!empty( $lastid)) $sel.=" AND x_web_synchid > '".$lastid."'";
if(!empty($nextid)) $sel.=" AND x_web_synchid != '".$nextid."'";
if(!empty($litdat_datesince)){
date_default_timezone_set('Europe/Berlin');
$sel .= " AND s_webAenderung_t >'".$litdat_datesince."'";
}
$query ="SELECT ".$commonfields." FROM ".$dbtable." ".$sel;
$res = mysql_query($query);
…
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
31. Daten vom SQL-Server holen
2. Werte lesen und in FM-Tabelle schreiben
while($dbrow = mysql_fetch_assoc($res)){ // loop over all records
$fields = ""; $content=""; $if=0;
foreach($dbrow as $fieldname => $value){
$value = str_replace("'","''",$value);
if(!empty($fields)){ $fields .=","; $content .=",";}
$fields .= """.$fieldname.""";
$content .="'".$value."'";
}
$ID = $dbrow['_pk_GUID'];
$ir++;
$fields .=",x_IDzuAktualisieren";
$content .=",'".$ID."'";
$insert = "insert into "TD_".$dbtable."" (".$fields.") VALUES (".$content.") ";
$resins = fm_sql_execute($insert);
if($resins===False) {echo "Failed: ".$ID." ";
echo fm_get_last_error();
echo "<br>";}
}
echo "export ".$dbtable.": ".$ir." records<br>";
$pb = fm_close_progress_bar('web2local');
}
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
32. Konflikte lösen
• ID bekannt Vorhandenen Datensatz aktualisieren
• ID unbekannt, aber Match über Namen: User fragen:
Zuordnen zu vorhandenem Datensatz, Relationen anpassen
Neuer Datensatz
Verwerfen
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
33. Daten schreiben
Daten aus dem Transfermodul nach Filemaker zurückschreiben
Codierungen zurückrechnen
Datensatz erzeugen wenn neu
Datensatz updaten
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com
34. FileMaker Konferenz2010
Vielen Dank unseren Sponsoren
Danke für das Bewerten dieses Vortrages
Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL www.filemaker-konferenz.com