PHP und DBASE IV
Aktualisierung funktioniert nicht
Hallo Forum,
ich möchte mir eine Möglichkeit schaffen, eingehende Faxe übers Internet abzufragen.
Faxsoftware: FritzFax
Fritzfax speichert die eingehenden Faxe in SFF-Dateien und die dazugehörigen Informationen in
einer DBASE Datei.
Mein Gedanke ist nun, mit PHP die DBASE Datei auszulesen und die gewonnenen Daten in eine
MySQL DB zu schreiben. Diese Aktion soll über den Zeitplandienst von Windows durchgeführt werden.
Das vom Windows Zeitplandienst ausgeführte Skript soll allerdings nur die neuen Datensätze
hinzufügen. Dafür ist es notwendig, dass beim Hinzufügen der Status "Neu eingegangen" auf "Gelesen"
gesetzt wird.
Genau hier liegt mein Problem:
Das auslesen der DBASE Datei funktioniert einwandfrei, das Ändern des Datensatzes schlägt aber fehl.
Hier der Codeschnipsel:
<?PHP
$dbf = @dbase_open("FRIEMPFJ.DBF",0);
$array = dbase_get_record($dbf, ($i));
$array[10] = 'b';
dbase_replace_record($dbf, $array, ($i));
dbase_close($dbf);
?>
$i definiert den Datensatz, ist eine Variable weil die Datei in einer Schleife durchlaufen wird
Element 10 im Array ist das zu ändernde Element, alle Felder sind Textfelder.
Lt Meldung stimmt die Anzahl der felder nicht. Wie kann dies sein, wenn der Datensatz doch genauso wie
ausgelesen wieder zurückgeschrieben wird ?
Kann mir hier vielleicht jemand einen Tipp geben ?
Danke und Gruß
ITIL-Harry
Hallo Forum,
ich möchte mir eine Möglichkeit schaffen, eingehende Faxe übers Internet abzufragen.
Faxsoftware: FritzFax
Fritzfax speichert die eingehenden Faxe in SFF-Dateien und die dazugehörigen Informationen in
einer DBASE Datei.
Mein Gedanke ist nun, mit PHP die DBASE Datei auszulesen und die gewonnenen Daten in eine
MySQL DB zu schreiben. Diese Aktion soll über den Zeitplandienst von Windows durchgeführt werden.
Das vom Windows Zeitplandienst ausgeführte Skript soll allerdings nur die neuen Datensätze
hinzufügen. Dafür ist es notwendig, dass beim Hinzufügen der Status "Neu eingegangen" auf "Gelesen"
gesetzt wird.
Genau hier liegt mein Problem:
Das auslesen der DBASE Datei funktioniert einwandfrei, das Ändern des Datensatzes schlägt aber fehl.
Hier der Codeschnipsel:
<?PHP
$dbf = @dbase_open("FRIEMPFJ.DBF",0);
$array = dbase_get_record($dbf, ($i));
$array[10] = 'b';
dbase_replace_record($dbf, $array, ($i));
dbase_close($dbf);
?>
$i definiert den Datensatz, ist eine Variable weil die Datei in einer Schleife durchlaufen wird
Element 10 im Array ist das zu ändernde Element, alle Felder sind Textfelder.
Lt Meldung stimmt die Anzahl der felder nicht. Wie kann dies sein, wenn der Datensatz doch genauso wie
ausgelesen wieder zurückgeschrieben wird ?
Kann mir hier vielleicht jemand einen Tipp geben ?
Danke und Gruß
ITIL-Harry
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 109810
Url: https://administrator.de/contentid/109810
Ausgedruckt am: 25.11.2024 um 06:11 Uhr
10 Kommentare
Neuester Kommentar
Hm, ich lass mir die Faxe immer per Email pollen, und gut...
Lonesome Walker
Lonesome Walker
Die Faxe werden trotz Weiterleitung auf dem Server belassen...
Das Weiterleiten ist lediglich für den Inhalt...
Ich löse sowas bei kleinen Firmen so, daß ich Fritz die Faxe in ein IMAP-Postfach laufen lasse, auf das jeder Zugriff hat...
Lonesome Walker
Das Weiterleiten ist lediglich für den Inhalt...
Ich löse sowas bei kleinen Firmen so, daß ich Fritz die Faxe in ein IMAP-Postfach laufen lasse, auf das jeder Zugriff hat...
Lonesome Walker
Hm, wenn Du die aber über Internet abrufen willst, wirst Du sowieso nicht um Mails rumkommen, denn Fritz pollt Dir die Faxe im proprietären Format; nur wenn Du die Option Mail verwendest, kannst Du die Faxe als JPEG angeben lassen...
Egal...
Wie weiter oben schon gesagt: mach's richtig
Lonesome Walker
Egal...
Wie weiter oben schon gesagt: mach's richtig
Lonesome Walker
Moin ITIL-Harry,
für so einen kleinen Codeschnipsel ist aber ganz schön viel.... na ja, wir bekommen das schon hin.
Das Konzeptionelle ist ja schon angesprochen worden. Sag ich nix mehr dazu.
Als dBase noch State-of-the-Art war, sind auch die Beatles noch zu fünft aufgetreten, glaub ich.
Und das lässt sich verkaufen? Wo issn das?
Also, früher hat oft das Schreiben in Dateien funktioniert, wenn man/frau einfach die Datei zum Lesen UND Schreiben geöffnet hat.
Also statt "$dbf = @dbase_open("FRIEMPFJ.DBF",0);" doch eventuell "$dbf = @dbase_open("FRIEMPFJ.DBF",2);", hmm?
BTW, wenn statt "0" und "2" dort "OpenForReading" und "OpenForWriting" stehen würde, würde so etwas nicht passieren.
Zu Deinem "$array[10] "....
Das 10te Feld in einem RowSet als "Element 10" anzusprechen ist so... suboptimal, dass mir die Worte fehlen.
Die Felder haben doch Namen auch schon unter Dbase II und III gehabt, oder nicht? Und sogar als dbase noch "Vulcan" hieß...
Die nicht übereinstimmende Anzahl Elemente im Array rührt von dem DELETEDFLAG, welches in jedem Record mitgeschleppt wird.
Und das wird (richtigerweise) als eigenes Arrayelement mit übergeben/übernommen, da es ja eigentlich nur ein normales Attributfeld ist.
Ein Dbase-Satz mit DELETEDFLAG="*" ist ja nicht gelöscht, sondert nur logisch als gelöscht markiert bis zum nächsten PACK.
Dieses Feld musst Du wegschmeissen....
denn einen Satz via Feldänderung des Attributs "DELETEDFLAG" löschen darfst Du nicht.
(Info muss im dBase-Header aktualisiert werden und evtl. in Indexdateien.... --> kurz: darfste nich'. )
Das Array-Element des DELETEDFLAGS heißt [immer] "$array['deleted'])".
Also nicht immer "$array", aber immer 'deleted'.
Also
Grüße
Biber
für so einen kleinen Codeschnipsel ist aber ganz schön viel.... na ja, wir bekommen das schon hin.
Das Konzeptionelle ist ja schon angesprochen worden. Sag ich nix mehr dazu.
Als dBase noch State-of-the-Art war, sind auch die Beatles noch zu fünft aufgetreten, glaub ich.
Und das lässt sich verkaufen? Wo issn das?
Also, früher hat oft das Schreiben in Dateien funktioniert, wenn man/frau einfach die Datei zum Lesen UND Schreiben geöffnet hat.
Also statt "$dbf = @dbase_open("FRIEMPFJ.DBF",0);" doch eventuell "$dbf = @dbase_open("FRIEMPFJ.DBF",2);", hmm?
BTW, wenn statt "0" und "2" dort "OpenForReading" und "OpenForWriting" stehen würde, würde so etwas nicht passieren.
Zu Deinem "$array[10] "....
Das 10te Feld in einem RowSet als "Element 10" anzusprechen ist so... suboptimal, dass mir die Worte fehlen.
Die Felder haben doch Namen auch schon unter Dbase II und III gehabt, oder nicht? Und sogar als dbase noch "Vulcan" hieß...
Die nicht übereinstimmende Anzahl Elemente im Array rührt von dem DELETEDFLAG, welches in jedem Record mitgeschleppt wird.
Und das wird (richtigerweise) als eigenes Arrayelement mit übergeben/übernommen, da es ja eigentlich nur ein normales Attributfeld ist.
Ein Dbase-Satz mit DELETEDFLAG="*" ist ja nicht gelöscht, sondert nur logisch als gelöscht markiert bis zum nächsten PACK.
Dieses Feld musst Du wegschmeissen....
denn einen Satz via Feldänderung des Attributs "DELETEDFLAG" löschen darfst Du nicht.
(Info muss im dBase-Header aktualisiert werden und evtl. in Indexdateien.... --> kurz: darfste nich'. )
Das Array-Element des DELETEDFLAGS heißt [immer] "$array['deleted'])".
Also nicht immer "$array", aber immer 'deleted'.
Also
<?PHP
$dbf = @dbase_open("FRIEMPFJ.DBF", 2);
$array = dbase_get_record($dbf, ($i));
$array[10] = 'b';
unset($array['deleted']);
dbase_replace_record($dbf, $array, ($i));
dbase_close($dbf);
?>
Grüße
Biber
Moin ITIL-Harry,
was die Beatles betrifft hast Du natürlich Recht.... mein Alzheimer....
Nichtsdestotrotz - also trotz "Never change a running system" etc. würde ich den Codeschnipsel aus Les- und Wartbarkeitsgründen sinngemäß so ändern.
[wobei natürlich statt "neuEingang" Dein DBF-Feldname eingesetzt werden sollte.]
Ich würde Code lesbar halten, auch oder erst Recht wenn es "nur" Privatvergnügen ist.
Grüße
Biber
was die Beatles betrifft hast Du natürlich Recht.... mein Alzheimer....
Nichtsdestotrotz - also trotz "Never change a running system" etc. würde ich den Codeschnipsel aus Les- und Wartbarkeitsgründen sinngemäß so ändern.
<?PHP
define("OPEN4READ", 0);
define("OPEN4WRITE", 2);
$dbf = @dbase_open("FRIEMPFJ.DBF", OPEN4WRITE);
....
$dbfrec = dbase_get_record($dbf, ($i));
$dbfrec['neuEingang'] = 'b';
unset($dbfrec['deleted']);
dbase_replace_record($dbf, $dbfrec, ($i));
dbase_close($dbf);
?>
Ich würde Code lesbar halten, auch oder erst Recht wenn es "nur" Privatvergnügen ist.
Grüße
Biber