|
|
#1 |
|
Entwickler
|
MySQL 5.1.x Plugin + ODBC
EDIT: Für diesen Thread gilt - die Informationen sind chronologisch nach Entwicklungsstand - somit ist am Ende jeweils die neueste Info zu lesen :-)
Um auf die .DF Datenbanken mithilfe eines Webservers zuzugreifen benötigt man abgesehen von der Extension nur wenige Zeilen Code. Grundsätzlich wäre es aber natürlich (so wie in unserem Fall) sinnvoll den Server möglichst am selben Standort zu betreiben. Die Extension erlaubt den Zugriff auch auf vom Dateisystem gesperrte Datenbanken während der Laufzeit da wir mit entsprechend hohen Rechten arbeiten. Sofern auf ihrem Server Gruppenrichtlinien eingerichtet sind benötigt die DLL resp. der entprechende Webserver zumnindest Backup Privilegien. Hier ein Beispiel wie wir es verwenden: Code:
//*==================== Neue Abfrage aus OA4 ==================*\
include("/www/oa4db.php.inc");
$myquery = new oa4_query ($oa4db, "DATUM, R, P, TEXT", "SERVICE", "KDNR", "$kdnr");
$myquery->AddConstraint ("RGNR", "$rgnr");
$myquery->AddConstraint ("DATUM", "$aktuell", '>');
$arr = $myquery->FetchResults();
$num = sizeof($arr);
if ($num > 0){
$myquery->Sort ($arr, "P");
}
$result = $arr[0];
$myquery->__destruct();
foreach ($arr as $result){
$datum = $result[0];
...usw
} |
|
|
|
|
|
#2 |
|
Entwickler
|
PHP Zugriff auf Open Access - Vorteile & Nutzen...
Oft werde ich gefragt wozu man diese Schnittstelle überhaupt brauchen kann. Wer Open Access kennt und selber schon programmiert hat wird mir zustimmen, dass es bisher nichts gibt was punkto Bedienung, Geschwindigkeit, Benutzerfreundlichkeit und Stabilität diesem tollen Programm nahe kommt. Natürlich gibt es unzählige Programme die unter Windows laufen und viele tolle Sachen können aber hier ist nun mal OA4 oft unschlagbar, weil man vielleicht so wie ich mit der Tastatur arbeiten will, keine bunten blinkenden Icons will oder nach einer Neuinstallation nicht stundenlang ohne Datenbank dastehen will. EINFACH und SCHNELL soll es sein.
Was kann man nun genau mit der PHP Geschichte machen. Ganz einfach - die Daten über genau diese Schnittstelle abfragen und zwar so schnell wie es OA4 auch kann. Das bringt natürlich nur jemandem etwas, der auch mit anderen Interpretern wie PHP umgehen kann und noch dazu vielleicht einen dedizierten Server besitzt der vielleicht auch noch gleich um die Ecke im Serverraum steht. Keine Frage, nicht jeder hat soetwas, aber selbst als Privatperson kann man um wenig Geld seinen eigenen Webserver zu Hause stehen haben. Das Ganze kann dann natürlich auch Lokal als Intranetanwendung laufen. Ein Beispiel aus der Praxis. Rainer hat eine Webseite für einen privaten Jugend Fussballverein. Die Daten der Spiele gibt er über eine OA4 Datenbank ein und benützt dabei gerade einmal die Standard Pflege. Irgendwann wollte sein Verein auch eine Homepage. Auf der sollen nun auch die aktuellen Spiele aufgelistet werden - natürlich könnte Rainer seine Daten täglich exportieren und vielleicht auch in eine andere Datenbank übertragen aber irgendwie läuft OA4 auch auf einem USB Stick und er kann es überall hin mitnehmen. Jetzt wäre es noch schön wenn er gerade nach dem Spiel die Datenbank einfach irgendwo hochlädt und schwupps sind die Daten aktuell im Netz. Was haben wir nun gemacht.... Rainer spielt seine Datenbank über ein Upload Formular einfach auf unseren Rechner und bindet das PHP Script welches wir extra dafür gescrieben haben auf seine Homepage ein. Nun wollen wir natürlich nicht eure Datenbanken hosten sondern eigentlich solltet ihr euch den Kopf zerbrechen wie ihr das ganze selber verwenden könnt. Und wenn ihr nun eine Firma seid so wie wir, die OA4 benützen und weiterhin benützen werden, dann werden euch plötzlich unzählige Möglichkeiten einfallen wie man OA4 nun wieder in das tägliche Geschäft einbinden kann ohne dass man dauernd über die Kompatibilität nachdenken muss (zb. kann OA4 den Drucker überhaupt verwenden, etc.) http://www.spvgg-gw.de/jugend/hauptseite/html/aktuelle_woche.html |
|
|
|
|
|
#3 |
|
Entwickler
|
|
|
|
|
|
|
#4 |
|
Entwickler
|
OA4 Plugin für MySQL 5.1.x + ODBC
Vorab: Man benötigt MYSQL ab Version 5.1.x !
Wichtig (kleiner Nachteil): Die über MySQL zu verwendeten open Access Datenbanken müssen jeweils in der aktuellen Open Access Struktur (also Feldanzahl und Reihenfolge) in MySQL angelegt sein. Bei einer Datenbankänderung in Open Access muss man daher die entsprechende MySQL Datenbank löschen und neu anlegen - es handelt sich hierbei jedoch nur um die Datenbankstruktur; im MySQL selber werden keine Daten gespeichert. Das Programm welches die Open Access Datenbankstruktur analysiert und gleich das passendende SQL Statement ausgibt (welches man zum Anlegen in MySQL braucht) wird ebenfalls gleich mit dazugeliefert. Seit MySQL Versionen 5 ist es möglich, seine eigene Storage-Engine zu implementieren. Das bedeutet, dass die komplette Ein/Ausgabe in Datenbankdateien selbst gesteuert werden kann. Für unseren OpenAccess-Treiber eröffnen sich daduch völlig neue Möglichkeiten. Einerseits steht mit MySQL ein kompletter SQL-Parser samt Optimizer zur Verfügung, andererseits verfügt MySQL über eine sehr gute Infrastrutkur zur Ansteuern aus anderen Datenbankprodukten heraus (Stichwort ODBC und APIs für alle möglichen Programmiersprachen). Wir sind nun dabei, unseren Treiber als Storage Engine für Open Access in MySQL zu integrieren, damit man dadurch auch komplexere Anfragen über das gewohnte MySQL-Interface aus vielen Standard-Umgebungen heraus durchführen kann. Derzeit ist der Treiber noch read-only, INSERT und UPDATE werden aber ebenfalls implementiert werden (allerdings unterliegt dies den bekannten Treiber-Einschränkungen - sprich der Binärbaum im .IF file wird nicht aktualisiert und das File somit ungültig. Für komplexere Abfragen stellt diese Entwicklung jedoch einen großen Fortschritt dar. Wir halten Euch auf dem Laufenden... |
|
|
|
|
|
#5 |
|
Moderator
|
Soda, nun funktionieren auch INSERT/UPDATE/DELETE.
Leider habe ich es noch nicht zusammengebracht, MySQL unter Windows zu kompilieren, daher läuft das Ganze vorerst nur unter Linux. Falls jemand Interesse an dieser Lösung hat und sie für MySQL für Windows benötigt, werde ich versuchen, ob ich MySQL auch unter Windows zum kompilieren bringe. Hier eine kurze Beschreibung, wie das Ganze realisiert wurde: Grundsätzlich wurde ein MySQL einfach eine neue Storage Engine hineinkompiliert, welche OA4DB heißt. Die Funktionen zum Anlegen von Tabellen (CREATE TABLE) wurden in der Storage Engine selbst nicht implementiert. Das hat den Hintergrund, dass es primär darum geht, bestehende Tabellen zu lesen. Nachdem MySQL die Tabellenstruktur selbst in einem internen Format ablegt und pflegt, muss man MySQL die Tabellenstruktur der OA4-Datenbank bei erstmaliger Vernwedung bzw. nach Strukturänderung mitteilen, was eben über CREATE TABLE funktioniert. Um die OA4-Typen auf die jeweiligen MySQL-Typen zu mappen, habe ich ein kleines C-Programm geschrieben, welches als Eingangsparameter eine entsprechende OA4-Tabelle nimmt und das jeweilige CREATE-Statement ausgibt (muss man eventuell noch händisch anpassen, wenn z.B. spezielle Zeichen oder SQL-Schlüsselwörter im Tabellennamen vorkommen). Derzeit wird folgendes Mapping verwendet (Der Einfachheit halber hier einfach der code-Auszug): Code:
switch (DBObject.pFieldTable[i].DataType){
case Text: printf ("VARCHAR(%d)", DBObject.pFieldTable[i].wFieldSize); break;
case Number:
case ScientificNotation: printf ("DOUBLE"); break;
case Bool: printf ("BOOL"); break;
case Untyped: printf ("VARCHAR(1)"); break; // Not supported
case Decimal: printf ("DECIMAL"); break;
case Date: printf ("DATE"); break;
case Time: printf ("TIME"); break;
case Memo: printf ("TEXT"); break;
}1) Datenbank anlegen. Sofern noch nicht getan, muss eine Datenbank angelegt werden, in die die OA4-Tabellen abgestellt werden, nennen wir sie z.B. OA4: CREATE DATABASE OA4; Das Anlegen der Datenbank bewirkt, dass in /var/lib/mysql/ ein entsprechendes Unterverzeichnis mit dem Datenbanknamen angelegt wird. In diesen kopiert man die Tabellen hinein oder setzt einfach einen Symlink. 2) Man lässt über die zu importierenden Tabellen das mitgelieferte Programm drüberlaufen, welches ein entsprechendes CREATE TABLE Statement erzeugt: Code:
./oa4sql /var/lib/mysql/oa4/mydb.DF | mysql -u myuser -p 3) Datenbank wie von MySQL gewohnt verwenden. Ich habe heute testweise über ODBC eine OA4-Datenbank in Excel importiert, das hat ansich funktioniert. |
|
|
|
|
|
#6 |
|
Entwickler
|
Hier die Installation & der Einsatz unter Windows:
1) Im my.ini muss der Plugin Pfad definiert werden: Code:
port = 3306 basedir = "c:/mysql/" datadir = "c:/mysql/Data/" [B][COLOR=Red]plugin_dir = "c:/mysql/plugins/" Das Verzeichnis c:\mysql\plugins\ enthält anschließend nur die Datei oa4db.dll ! Code:
MYSQL> install plugin oa4db soname 'oa4db.dll' Code:
MYSQL> show engines [/LEFT] |
|
|
|
|
|
#7 |
|
Entwickler
|
So nun ist die Engine einsatzbereit und man kann beginnen seine Datenbanken für Mysql vorzubereiten.
Im mysql Verzeichnis wird eine Datenbank angelegt namens OA4DBS. Die gewünschten OA4 Datenbanken in dieses Verzeichnis kopieren und OA4SQL.EXE <Datenbank> ausführen (zB: oa4sql bene). Damit erhält den Syntax zum Anlegen der FRM Datenbank unter mysql. Das Programm könnt ihr im Anhang downloaden. Ggf. müsst ihr aber Feldnamen die Sonderzeichen enthalten anpassen (also zb. FELD#1 müsst ihr zb. in MySQL FELD1 umtaufen). Code:
CREATE TABLE IF NOT EXISTS `bene` ( `ARTNR` varchar(14) NOT NULL, `TEXT` varchar(32) NOT NULL, `VK_PREIS` decimal(10,0) NOT NULL, KEY `ARTNR` (`ARTNR`), KEY `TEXT` (`TEXT`), KEY `VK_PREIS` (`VK_PREIS`) ) ENGINE=OA4DB DEFAULT CHARSET=latin1 Code:
Verzeichnis von C: \ mysql \ data \ oa4dbs
10.11.2007 10:51 <DIR> .
10.11.2007 10:51 <DIR> ..
16.04.1996 11:48 82.944 BENE.DF
10.11.2007 10:51 8.630 bene.frm
16.04.1996 11:48 116.736 BENE.IF
10.11.2007 09:49 65 db.opt
09.11.2007 19:39 73.728 oa4sql.exe
5 Datei(en), 282.103 Bytes |
|
|
|
|
|
#8 |
|
Entwickler
|
Nun hat man die Datenbank im Mysql und kann zB. mittels PHPMYADMIN auf die Daten zugreifen oder über den gewohnten Mysql Syntax eine Abfrage formulieren.
Man muss daher nicht erst auf die PHP Extension zurückgreifen sondern kann die Infrastruktur von MySQL verwenden die ja auf vielen Servern installiert ist. Der Zugriff auf die Daten erfolgt natürlich in Echtzeit - dh. es können Daten im OA4 geflegt werden während man eine Abfrage im MYSQL fomuliert - die Datenbanken werden natürlich im Datenbankpfad von MYSQL bearbeitet und nicht mehr in dem von OA4 verwendeten Pfad. Es sollten somit die Pfade in den Applikationen entsprechend geändert werden. Wenn ihr also vorher die Daten in c:\oa4\daten hattet müsst ihr natürlich nachher die Daten nach c:\mysql\data\oa4dbs verschieben oder ihr nutzt SYMLINK. (http://www.microsoft.com/technet/sys.../Junction.mspx) Die Druckmasken, Programme etc. bleiben natürlich wo sie sind lediglich der Pfad zu den Daten wird entsprechend in den Systemeinstellungen/Suchtabelle verändert. |
|
|
|
|
|
#9 |
|
Entwickler
|
Einige Bildschirmfotos wie das ganze Aussieht:
|
|
|
|
|
|
#10 |
|
Entwickler
|
Und hier mal gleich mit UPDATE Funktion - dabei ist nun zu berücksichtigen, dass hierbei NOCH NICHT das IF geupdated wird. Spielt aber solange keine Rolle solange im OA4 keine allzukomplexen Querys abgesetzt werden. Ansonsten müsste man das IF von Zeit zu Zeit reparieren.
Bei dem Bild sind die Daten wohlgemerkt Open Access 4 Daten die nun über die MYSQL Befehle gepflegt werden können und demnach auch in der Open Access 4 Tabelle so drinstehen. |
|
|
|
Antwort schreiben... |
| Themen-Optionen | Thema durchsuchen |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| MySQL Plugin Fragen und Antworten :-) | waldbauer.com | SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum | 0 | 09.02.2009 13:37 |
| Entwicklung eines ODBC Treibers für Open Access | waldbauer.com | SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum | 1 | 06.01.2008 16:49 |
| OA4 Export nach MySQL | waldbauer.com | SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum | 0 | 08.09.2004 08:37 |