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
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
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
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
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
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
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
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
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
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
Code in Custom Functions

           • Beispiel 1: Temporären Pfad ermitteln
             cf.GetUserTmpFolder:
              PHP_Execute( "echo FM_TEMPORARY_PATH;" )

           • Beispiel 2: Verschlüsselung
             Cf.Encode_Base64:

               Parameter( Text, PW)
               PHP_Execute ( "
                  $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);
                  echo base64_encode($crypt_text);
               ")


Nicolaus Busch, N. Busch GmbH                                         FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL                                                     www.filemaker-konferenz.com
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
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
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
Den Datenabgleich organisieren




                FileMaker-      Transfermodul
                                                 SQL
                Datenbank           (FM)




Nicolaus Busch, N. Busch GmbH                   FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL                               www.filemaker-konferenz.com
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
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
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
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
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
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
…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
Die ganze Übung im FM-Script
          Variable setzen [$SQL_call; Wert:PHPx_SQL_GetSynchNo ( _DGlobal::d_LLwebuser_tg;
            _DGlobal::d_LLwebpassword_tg; sys_Globals::s_SQLDB ; sys_Globals::s_SQLServer ;
            sys_Globals::s_SQLAccount ; sys_Globals::s_SQLPassword )]
          Wenn [$SQL_Call = "Error"]
            Aktuelles Script verlassen ["Error: Konnte Synch-Nr. nicht lesen"]
          Sonst
            Variable setzen [$Result; Wert:Substitute( $SQL_call ; "<br>" ; ¶)]
            Variable setzen [$$SQLUserID; Wert:GetValue( $Result ; 1)]
            Variable setzen [$$SQLLastSynchID; Wert:GetValue( $Result ; 2)]
            Feldwert setzen [_DGlobal::d_LLwebnextsyncno_ng[]; $$SQLLastSynchID+1]
            Schreibe Änderung Datens./Abfrage [Ohne Dialogfeld]
          Ende-Wenn

          Variable setzen [$SQL_call; PHPx_SQL_SetServerSynchNo ( _DGlobal::d_LLwebuser_tg;
            _DGlobal::d_LLwebpassword_tg; sys_Globals::s_SQLDB ; sys_Globals::s_SQLServer ;
            sys_Globals::s_SQLAccount ; sys_Globals::s_SQLPassword ;
            _DGlobal::d_LLwebnextsyncno_ng)]
          Wenn [$SQL_Call = "Error"]
            Aktuelles Script verlassen ["Error: Konnte Synch-Nr. nicht schreiben"]
          Sonst
            Aktuelles Script verlassen ["OK"]
          Ende-Wenn


Nicolaus Busch, N. Busch GmbH                                                FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL                                                            www.filemaker-konferenz.com
Datenstrukturen vergleichen

           Statt hart codiertem Datenaustausch Datenbanken analysieren

           1. Tabellenlisten auslesen & vergleichen
               o FM: Variable Setzen[ $TablesInFM ; "Autoren" & ¶ & "Periodikum" & ¶ & "Titel" …]

               o SQL: $TablesInSQL
                  mysql_select_db($db) or die("Selection of database ".$db." failed".mysql_error());
                  $query = mysql_query("SHOW TABLES");
                  while($row = mysql_fetch_assoc($query)) {
                    echo $row['Tables_in_'.$db]."<br>" ;
                  }

               o Schnittmenge: [$TableList = TrText_SortLines( "-unused" ; TrText_ANDText( "-
                 unused" ; $TablesInSQL ; $$TablesInFM )




Nicolaus Busch, N. Busch GmbH                                                         FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL                                                                     www.filemaker-konferenz.com
Datenstrukturen vergleichen

2. Feldlisten auslesen & vergleichen

     o Script ausführen ["fn.Smartpill: Get Fieldlist from MYSQL(List)"]
     o Variable setzen [$Table_sql; Wert:Get(ScriptResult)]
     o Script ausführen [" fn.Get Fieldlist from Transfer(List)"]
     o Variable setzen [$Table_fm; Wert:Get(ScriptResult)]
     o Wenn [$Table_sql = "Error" or $Table_fm = "Error"]
     o   Aktuelles Script verlassen ["Error"]
     o Sonst
        $Result = Let( [
         $list     = TrText_SortLines( "-unused" ; TrText_ANDText( "-unused" ; $table_sql ; $table_fm ));
         $list2 = cf.LinesNotStartingWith( $list ; "x";ValueCount( $list );"¶");
         $length = Length($list2) -1];
         Left( $list2 ; $length))
     o Aktuelles Script verlassen [$Result]
     o Ende (wenn)




Nicolaus Busch, N. Busch GmbH                                                       FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL                                                                   www.filemaker-konferenz.com
Daten zum SQL-Server schicken
           Variable setzen [$Source; Wert:Get(LayoutTableName)]
           Schleife (Anfang)
             Variable setzen [$ID; Wert:Evaluate($Source & "::_pk_guid")]

               Variable setzen [$Commonfields;
                 Wert:Let( $Fields = cf.SQLInsertCommand ( $Datafields ; "x" ; ValueCount($Datafields)
               );Left( $Fields; Length( $Fields )-2))]

               Variable setzen [$Values;
                Wert:Let($Prevalues = cf.SQLInsertCommandValues ( $Datafields ; "x" ;
               ValueCount($Datafields)) ;"¶" & Left( $Prevalues ; Length( $Prevalues )-2))]

               Variable setzen [$Result;
               Wert:PHPx_SQL_WriteRecordInSQL_DB ( _DGlobal::d_LLwebuser_tg;
               _DGlobal::d_LLwebpassword_tg; sys_Globals::s_SQLDB ; sys_Globals::s_SQLServer ;
               sys_Globals::s_SQLAccount ; sys_Globals::s_SQLPassword ; $$Kontext ; $ID ;
               $Commonfields ; $Values ; _DGlobal::d_LLwebnextsyncno_ng)]

             Variable setzen [$$SQL_error; Wert:PHP_GetLastError]
             Gehe zu Datens./Abfrage/Seite [Nächste(r); Nach letztem beenden]
           Schleife (Ende)




Nicolaus Busch, N. Busch GmbH                                                          FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL                                                                      www.filemaker-konferenz.com
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
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&auml;dte mit schwierigen Namen',¶'&#21271;&#20140;',¶'N''Djamena',



Nicolaus Busch, N. Busch GmbH                                                                                FileMaker Konferenz 2012 Salzburg
Datenaustausch mit SQL                                                                                            www.filemaker-konferenz.com
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
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
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
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
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
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

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 imScript 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
  • 11.
    Code in CustomFunctions • Beispiel 1: Temporären Pfad ermitteln cf.GetUserTmpFolder: PHP_Execute( "echo FM_TEMPORARY_PATH;" ) • Beispiel 2: Verschlüsselung Cf.Encode_Base64: Parameter( Text, PW) PHP_Execute ( " $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); echo base64_encode($crypt_text); ") 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 Laufzeitladen • 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 neueDaten • 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 Usersprü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 Sitzungsnummerschreiben 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
  • 23.
    Die ganze Übungim FM-Script Variable setzen [$SQL_call; Wert:PHPx_SQL_GetSynchNo ( _DGlobal::d_LLwebuser_tg; _DGlobal::d_LLwebpassword_tg; sys_Globals::s_SQLDB ; sys_Globals::s_SQLServer ; sys_Globals::s_SQLAccount ; sys_Globals::s_SQLPassword )] Wenn [$SQL_Call = "Error"] Aktuelles Script verlassen ["Error: Konnte Synch-Nr. nicht lesen"] Sonst Variable setzen [$Result; Wert:Substitute( $SQL_call ; "<br>" ; ¶)] Variable setzen [$$SQLUserID; Wert:GetValue( $Result ; 1)] Variable setzen [$$SQLLastSynchID; Wert:GetValue( $Result ; 2)] Feldwert setzen [_DGlobal::d_LLwebnextsyncno_ng[]; $$SQLLastSynchID+1] Schreibe Änderung Datens./Abfrage [Ohne Dialogfeld] Ende-Wenn Variable setzen [$SQL_call; PHPx_SQL_SetServerSynchNo ( _DGlobal::d_LLwebuser_tg; _DGlobal::d_LLwebpassword_tg; sys_Globals::s_SQLDB ; sys_Globals::s_SQLServer ; sys_Globals::s_SQLAccount ; sys_Globals::s_SQLPassword ; _DGlobal::d_LLwebnextsyncno_ng)] Wenn [$SQL_Call = "Error"] Aktuelles Script verlassen ["Error: Konnte Synch-Nr. nicht schreiben"] Sonst Aktuelles Script verlassen ["OK"] Ende-Wenn Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg Datenaustausch mit SQL www.filemaker-konferenz.com
  • 24.
    Datenstrukturen vergleichen Statt hart codiertem Datenaustausch Datenbanken analysieren 1. Tabellenlisten auslesen & vergleichen o FM: Variable Setzen[ $TablesInFM ; "Autoren" & ¶ & "Periodikum" & ¶ & "Titel" …] o SQL: $TablesInSQL mysql_select_db($db) or die("Selection of database ".$db." failed".mysql_error()); $query = mysql_query("SHOW TABLES"); while($row = mysql_fetch_assoc($query)) { echo $row['Tables_in_'.$db]."<br>" ; } o Schnittmenge: [$TableList = TrText_SortLines( "-unused" ; TrText_ANDText( "- unused" ; $TablesInSQL ; $$TablesInFM ) Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg Datenaustausch mit SQL www.filemaker-konferenz.com
  • 25.
    Datenstrukturen vergleichen 2. Feldlistenauslesen & vergleichen o Script ausführen ["fn.Smartpill: Get Fieldlist from MYSQL(List)"] o Variable setzen [$Table_sql; Wert:Get(ScriptResult)] o Script ausführen [" fn.Get Fieldlist from Transfer(List)"] o Variable setzen [$Table_fm; Wert:Get(ScriptResult)] o Wenn [$Table_sql = "Error" or $Table_fm = "Error"] o Aktuelles Script verlassen ["Error"] o Sonst $Result = Let( [ $list = TrText_SortLines( "-unused" ; TrText_ANDText( "-unused" ; $table_sql ; $table_fm )); $list2 = cf.LinesNotStartingWith( $list ; "x";ValueCount( $list );"¶"); $length = Length($list2) -1]; Left( $list2 ; $length)) o Aktuelles Script verlassen [$Result] o Ende (wenn) Nicolaus Busch, N. Busch GmbH FileMaker Konferenz 2012 Salzburg Datenaustausch mit SQL www.filemaker-konferenz.com
  • 26.
    Daten zum SQL-Serverschicken Variable setzen [$Source; Wert:Get(LayoutTableName)] Schleife (Anfang) Variable setzen [$ID; Wert:Evaluate($Source & "::_pk_guid")] Variable setzen [$Commonfields; Wert:Let( $Fields = cf.SQLInsertCommand ( $Datafields ; "x" ; ValueCount($Datafields) );Left( $Fields; Length( $Fields )-2))] Variable setzen [$Values; Wert:Let($Prevalues = cf.SQLInsertCommandValues ( $Datafields ; "x" ; ValueCount($Datafields)) ;"¶" & Left( $Prevalues ; Length( $Prevalues )-2))] Variable setzen [$Result; Wert:PHPx_SQL_WriteRecordInSQL_DB ( _DGlobal::d_LLwebuser_tg; _DGlobal::d_LLwebpassword_tg; sys_Globals::s_SQLDB ; sys_Globals::s_SQLServer ; sys_Globals::s_SQLAccount ; sys_Globals::s_SQLPassword ; $$Kontext ; $ID ; $Commonfields ; $Values ; _DGlobal::d_LLwebnextsyncno_ng)] Variable setzen [$$SQL_error; Wert:PHP_GetLastError] Gehe zu Datens./Abfrage/Seite [Nächste(r); Nach letztem beenden] Schleife (Ende) 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&auml;dte mit schwierigen Namen',¶'&#21271;&#20140;',¶'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-Serverholen 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-Serverholen 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