itil-harry
Goto Top

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

Content-Key: 109810

Url: https://administrator.de/contentid/109810

Printed on: April 20, 2024 at 05:04 o'clock

Mitglied: 16568
16568 Feb 24, 2009 at 00:09:19 (UTC)
Goto Top
Hm, ich lass mir die Faxe immer per Email pollen, und gut...


Lonesome Walker
Member: godlie
godlie Feb 24, 2009 at 09:53:59 (UTC)
Goto Top
Mal so ne doofe Frage warum überhaupt replace?
hol die Daten raus schreibs in ne richtige datenbank face-smile und dann lösch den rest.
Member: ITIL-Harry
ITIL-Harry Feb 24, 2009 at 10:08:17 (UTC)
Goto Top
Hi Lonesome Walker,

Die Möglichkeit besteht tatsächlich. Ich möchte aber zusätzlich die Möglichkeit haben, die Faxe am Server
über die FritzFax Software ansehen können.

Stutzig macht mich übrigens noch, dass ich die Daten mit Access problemlos bearbeiten kann.

Gruß
ITIL-Harry
Mitglied: 16568
16568 Feb 24, 2009 at 11:34:47 (UTC)
Goto Top
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
Member: ITIL-Harry
ITIL-Harry Feb 24, 2009 at 11:45:33 (UTC)
Goto Top
Ist keine Alternative, weil ich Anwender habe, die nicht die Disziplin haben, täglich einmal da reinzusehen
und die Faxe sollen auch übers Internet abgerufen werden können.

Gruß
Mitglied: 16568
16568 Feb 24, 2009 at 12:01:05 (UTC)
Goto Top
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 face-smile


Lonesome Walker
Member: ITIL-Harry
ITIL-Harry Feb 24, 2009 at 13:15:04 (UTC)
Goto Top
OK - ich hab nicht alles geschrieben:

gepl. Ablauf
Zeitplandinst führt PHP-Skript aus, dieses prüft, ob neues Fax da ist und schickt Mail an Anwender
gleichzeitig werden die Daten des Eintrags in eine MySQL-DB geschrieben.

Diese MySQL-DB liefert die Daten für ein Web-Frontend, auf dem die SFF-Dateien verlinkt sind.
Am lokalen PC habe ich einen SFF-Viewer installiert, der mit dann das Fax anzeigt.

Alles funktioniert soweit, nur die Aktualisierung der DBASE Datei geht nicht. Das ist meine
Anforderung und alles Andere ist für uns in unserer Umgebung nicht praktikabel.

Gruß
ITIL-Harry
Member: Biber
Biber Feb 24, 2009 at 17:55:26 (UTC)
Goto Top
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
<?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
Member: ITIL-Harry
ITIL-Harry Feb 24, 2009 at 19:01:24 (UTC)
Goto Top
Hi Biber,

Jap - das wars - funktioniert !!!

meines Wissens sind die Beatles aber nie zu fünft aufgetreten - es wurde lediglich der Drummer Pete Best durch Ringo Starr ersetzt face-smile

Du verdienst ne Erklärung:
Ich will das net verkaufen - brauch das für mich selbst. Ich hab nunmal Fritz als Faxeingang und hab mich halt nach ner Lösung
umgesehen. Stiess dann bei Selfphp.de drauf, dass man PHP auch DBASE Files bearbeiten kann. das mit dem DELETED Flag ist dort auch beschrieben, es hat aber halt nicht funktioniert weil die Datei nur zum Lesen geöffnet war und ich (Sorry) vielleicht die Parameterliste und deren Erklärung nicht genau genug gelesen hatte.

Nochmals vielen Dank
Gruß
ITIL-Harry
Member: Biber
Biber Feb 25, 2009 at 07:00:36 (UTC)
Goto Top
Moin ITIL-Harry,

was die Beatles betrifft hast Du natürlich Recht.... mein Alzheimer....face-wink

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);
?>
[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