#include "Directry.ch" #include "Xbp.ch" #include "DelDbe.ch" #include "Common.ch" #include "Fileio.ch" PROCEDURE INEUx( cFunk ) /* cFunk ist fr spezielle Funktionen, wie z.B. L”schen von Dateien */ * index neu vergeben LOCAL aDry, nHandle, oDlg LOCAL aPosT := {}, aSizeT := {}, aPosF := {}, aSizeF := {}, nZeiF := 1, nZeiT := 1 LOCAL lVisible, aCfA, nCfA, cText, CRLF := Chr(13)+Chr(10) DEFAULT cFunk TO "" //+25.08.2009 19:35 testet, ob irgendwo im Netz das Programm l„uft: nHandle := FOpen( cDatver + "HilfeTip.dbf", FO_EXCLUSIVE ) IF nHandle = -1 .AND. AppKeyState(65552)!=1 //+02.04.2013 11:33 Shift nicht gedrckt //+ eine ScrapX-Version l„uft irgendwo im Netz: Prflauf abbrechen FClose(nHandle) RETURN ELSE FClose(nHandle) ENDIF IIf( IsMemVar("oBest") .AND. ValType(oBest)=="O",,oBest := oApp ) IIf( !IsMemVar("cDatver"), cDatver := CurDrive()+":\"+CurDir()+"\", ) //+09.03.2010 11:12 Test: ++++++++++++++++++++++++++++++++++++++++++++++ IF IsMemVar("oBest") .AND. ValType(oBest)=="O" ELSE cFunk := "" DbUseArea(,"DBFNTX",cDatver + "PARAM",,.F.) oDlg := AKDialog():new( AppDesktop(), SetAppWindow(), {100,100}, {AppDesktop():currentSize()[1]-200,AppDesktop():currentSize()[2]-200}, , .F.) oDlg:title := "Programm-Start mit Prflauf -> NICHT unterbrechen !" oDlg:CREATE() oDlg:show() oBest := DialogFF():new( oDlg:drawingArea, oDlg, , ,,, , "s_best", -99, -99, 1 ) AAdd( oBest:BEArea, oDlg:drawingArea ) oBest:BENr := Len( oBest:BEArea ) oBest:CREATE( oDlg:drawingArea, oDlg, , ,,, , "s_best", -99, -99, 1 ) ENDIF //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // aCfA := { ; // {'','T',20,-751,1,0,0,0,20,.F.,'','(DbAppend()) tl->FIELD := "Start" DbCloseArea() DbeSetDefault( "DBFNTX" ) ELSEIF cFunk = "L" // zum L”schen der Transaktionseintr„ge DbUseArea(,"DELDBE",cDatver + "TransLog",,.F.) ZAP DbCloseArea() ENDIF /* Erzeugen der Stammdaten-Datei, wenn sie noch nicht existiert: */ /* muss noch definiert werden ! ersteinmal nur kopiert aus der Parameter-Datei !!! */ IF !FILE( cDatver+"STAMM.DBF" ) IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , "(Eof()) plz->(DbAppend()) plz->plz := sd->plz_plz plz->str_such := sd->str_names plz->str_46 := sd->str_name46 plz->str_22 := sd->str_name22 plz->hnr_von := sd->str_hnrvon plz->hnr_bis := sd->str_hnrbis plz->hnr_typ := sd->plz_hnrtyp sd->(DbSkip()) ENDDO sd->(DbCloseArea()) SELECT &nOldArea FErase( cDatver+"PlzStr.cdx" ) // damit der Index nicht nur berschrieben wird OrdCreate( cDatver + "PlzStr", "ps", "PLZ+STR_SUCH" ) // PLZ + Straáe in Suchform (Upper + ohne Sonder-Zeichen) OrdCreate( cDatver + "PlzStr", "ss", "STR_SUCH+PLZ" ) // Straáe in Suchform (Upper + ohne Sonder-Zeichen) DbCloseArea() ENDIF /* die gesamtdeutsche PLZ-Datei (ohne Straáen) */ IF !FILE( cDatver+"PlzOrt.dbf" ) IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , "plz_ort := po->plz+" "+po->ort } ) FErase( cDatver+"PlzOrt.cdx" ) // damit der Index nicht nur berschrieben wird OrdCreate( cDatver + "PlzOrt", "p", "PLZ" ) // PLZ OrdCreate( cDatver + "PlzOrt", "o", "Upper(ORT)" ) // Ort ohne PLZ // OrdListAdd( "PlzOrt" ) OrdSetFocus( "p" ) nOldArea := SELECT() DbUseArea( .T., "FOXCDX", cDatver + "PlzStr", "plz" ) OrdListAdd( "PlzStr" ) OrdSetFocus( "ps" ) SELECT &nOldArea DbGotop() DO WHILE !Eof() IF plz->(DbSeek(po->plz,.F.)) po->plz_str := "2" ELSE po->plz_str := "1" ENDIF DbSkip() ENDDO plz->(DbCloseArea()) DbCloseArea() ENDIF /* Datei zum Bildschirmaufbau: S_.SDF + S_.TAK mssen vorher erstellt worden sein S_.SDF enth„lt dabei die Struktur: [INFO] file=s_.tak fieldcount=17 recsize=327 reccount=2475 [FIELDS] FNAME=C,8,0 FIELD_NAME=C,10,0 FIELD_TYPE=C,1,0 FIELD_LEN=N,5,0 FIELD_DEC=N,4,0 FIELD_POS=N,3,0 SPAF=N,4,0 ZEIF=N,4,0 BRF=N,3,0 HOF=N,3,0 TAB_STOP=L,1,0 ZAHL_FORM=C,15,0 TEXT=C,250,0 SPAT=N,4,0 ZEIT=N,4,0 BRT=N,3,0 HOT=N,3,0 [END] S_.TAK muss gem„á dieser Struktur aufgebaut sein. */ IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , " 0 // gibt es eine neue Programmversion auf dem Server? : IF AppKeyState(65552)=1 .OR. Len(aDbfFiles)==0 .OR. aTakFiles[ 1, F_WRITE_DATE ] > aDbfFiles[ 1, F_WRITE_DATE ] TXT_zu_DBF("s") // in DbDruSysS, macht kleine DBFs aus der groáen TAK ENDIF ENDIF //^^////////////////////////////////////////////////////////////////////////////////////////////// /* Datei zum Aufbau der Drucke BL_.SDF + BL_.TAK mssen vorher erstellt worden sein BL_.SDF enth„lt dabei die Struktur: [INFO] file=bl_.tak fieldcount=11 recsize=248 reccount=4115 [FIELDS] FNAME=C,8,0 SEITE=C,1,0 NA=C,1,0 PROMPT=C,20,0 TEXT=C,100,0 TFONT=N,1,0 BEREICH=C,2,0 FELD=C,100,0 FFONT=N,1,0 ZEILE=N,6,1 SPALTE=N,6,1 [END] BL_.TAK muss gem„á dieser Struktur aufgebaut sein. */ IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , " 0 // gibt es eine neue Programmversion auf dem Server? : IF AppKeyState(65552)=1 .OR. Len(aDbfFiles)==0 .OR. aTakFiles[ 1, F_WRITE_DATE ] > aDbfFiles[ 1, F_WRITE_DATE ] TXT_zu_DBF("b") // in DbDruSysS, macht kleine DBFs aus der groáen TAK ENDIF ENDIF //^^////////////////////////////////////////////////////////////////////////////////////////////// /* Datei fr die Hilfezeilen */ IF !FILE( cDatver+"HILFETIP.DBF" ) aStruktur := { ; { "LANG_ID" , "N", 4, 0 }, ; { "HELP_ID" , "N", 4, 0 }, ; { "HINT" , "C",250, 0 }, ; { "DESCRIPT" , "C",250, 0 } ; } DbCreate( cDatver + "HILFETIP", aStruktur, "DBFNTX" ) ENDIF IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , "anummer := "000000" // damit NEU funktioniert DbAppend() /* leeren Datensatz erzeugen */ FIELD->anummer := "999999" // damit bei Eof() nicht eine neue Hist angelegt wird ENDIF DbCloseArea() ENDIF IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , "anummer := "000000" // damit NEU funktioniert DbAppend() /* leeren Datensatz erzeugen */ FIELD->anummer := "999999" // damit bei Eof() nicht eine neue Hist angelegt wird ENDIF DbCloseArea() ENDIF IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , "anummer := "000000" 1->abrechnr:= "000100" 1->adresse := "MUSTER" DbImport( cStickver + "Abrech_X",,,,,,,"FOXCDX" ) //+15.03.2010 20:43 DbCloseArea() ENDIF IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , "abrechnr := "000100" 1->zeile := StrX(i,2) NEXT DbCloseArea() ENDIF IIf(cFunk="T",,oBest:TextFenster( , , , , , , nBz/2, , , , , "abrechnr) >= 100000 //+ wenn kein Entwurf oder Muster abrT->(DbSeek(abr->abrechnr,.F.)) //+abrechT synchronisieren mit abrech.dbf IF !abrT->(Eof()) //+ wenn es wirklich eine Rechnungstabelle gibt abr_T->(DbAppend()) //+ abr_T.dbf FOR i := 1 TO abr->(FCount()) abr_T->(FieldPut(i,abr->(FieldGet(i)))) NEXT //+04.01.2010 14:17 TBDatenSummen() //+04.01.2010 14:21 steht in BRegieRmSt, ganz hinten //++// ENDIF ENDIF //++//+ Ende der zuknftigen Funktion abr->(DbSkip()) //+ abrech.dbf ENDDO abrT->(DbCloseArea()) abr->(DbCloseArea()) //+04.01.2010 10:57 SELECT("abr_T") //+04.01.2010 10:57 ENDIF DbCloseArea() ENDIF DbUseArea( , "FOXCDX", cDatver+ "Abr_TB" ) PACK // Erweiterung(cDatver+"Abrech", {{"R_BEMERK","M",4,0}}, "FOXCDX" ) //+15.06.2009 18:21 DbUseArea( , "FOXCDX", cDatver + "Abr_TB" ) FErase( cDatver+"Abr_TB.cdx" ) // damit der Index nicht nur berschrieben wird OrdCreate( cDatver + "Abr_TB", "an", "ANUMMER+ABRECHNR" ) OrdCreate( cDatver + "Abr_TB", "ab", "ABRECHNR" ) DbCloseArea() IF !FExists(cDatver+"Auskunft","D") RunShell( "/C MD "+cDatver + "Auskunft",, .T. ) ENDIF //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IIf(cFunk="T",,{oBest:Textfenster(), ; IIf( ValType(oDlg) =="O", {oDlg:hide(),oDlg:destroy()},)}) //+23.03.2010 09:11 SET EXCLUSIVE off RETURN //23.03.2008 12:44 aus PROC -> FUNCTION FUNCTION Erweiterung( cDatei, aErweiterung, cDBE ) // 15.08.2005 LOCAL aStruktur := DbStruct(), i, nFeld := 0, lGleich := .T. IF Len(aStruktur) <= Len(aErweiterung) //+08.03.2010 18:05 IF ACompare( aStruktur, aErweiterung ) RETURN !lGleich //+ wenn die Struktur schon stimmt ELSE aStruktur := AClone(aErweiterung) //+ z.B. neue Ordnung in der Struktur lGleich := .F. ENDIF ELSE FOR i := 1 TO Len(aErweiterung) nFeld := aScan( aStruktur, {|a| a[1] == aErweiterung[i,1] } ) IF nFeld > 0 // in aErweiterung ist ein ge„ndertes Feld IF !ACompare( aStruktur[nFeld], aErweiterung[i] ) lGleich := .F. aStruktur[nFeld] := aErweiterung[i] ENDIF ELSE // in aErweiterung ist ein neues Feld AAdd( aStruktur, aErweiterung[i] ) lGleich := .F. ENDIF NEXT ENDIF IF lGleich // .T. nur dann, wenn ACompare immer Gleichheit meldet RETURN !lGleich //23.03.2008 12:38 ENDIF DbCreate( cDatei+StrZero(nFeld,3,0), aStruktur, cDBE ) DbUseArea( ,cDBE,cDatei+StrZero(nFeld,3,0),,.F.) DbImport( cDatei,,,,,,,cDBE ) IF FRename( cDatei+".DBF", cDatei+"_.DBF" ) == -1 // alte Datei kann nur einmal umbenannt werden ELSEIF File( cDatei+".DBT" ) .AND. ; FRename( cDatei+".DBT", cDatei+"_.DBT" ) == -1 ENDIF DbExport( cDatei,,,,,,,cDBE ) RETURN !lGleich //23.03.2008 12:38 PROCEDURE MemoPack(cFile,cDBE) LOCAL lDeleted := Set( _SET_DELETED, .T. ) // Deleted-Flag setzen/sichern DbUseArea(.T.,cDBE, cFile) // DBF- und DBT-Datei ”ffnen. DbGoTop() // Ersten, nicht gel”schten // Datensatz ausw„hlen. DbExport( "Temp",,,,,,,cDBE ) // Datens„tze exportieren. DbCloseArea() // Sicherungskopien erzeugen COPY FILE (cFile+".DBF") to (cFile+"MP.DBF") IF File( cFile+".FPT" ) COPY FILE (cFile+".FPT") to (cFile+"MP.FPT") ELSEIF File( cFile+".DBT" ) COPY FILE (cFile+".DBT") to (cFile+"MP.DBT") ENDIF // tempor„re Dateien umbenennen COPY FILE ("Temp.DBF") to (cFile+".DBF") IF File( "Temp.FPT" ) COPY FILE ("Temp.FPT") TO (cFile+".FPT") ELSEIF File( "Temp.DBT" ) COPY FILE ("Temp.DBT") TO (cFile+".DBT") ENDIF Set( _SET_DELETED, lDeleted ) RETURN //////////////////////////////////////////////////////////////////////// //Hannes Ziegler: //I would go with "brute force" to reduce the memo file size once in a while. //1) Write "N" into the DBF file header for all Memo fields using FOpen/FWrite. // This changes the FIELD type from Memo to Numeric. //2) Open the DBF file regularly with DbUseArea()/USE //3) Iterate the DBF file and read the numeric values of former Memo fields. // They represent the file offset as number of memo blocks into the FPT file // (default memo block size varies between 64 and 512). // Then read the contents of the FPT file. // Note: the first 4 bytes of an FPT memo indicate the length of the memo entry // (convert with Bin2U()) //4) Write the FPT contents to a new FPT file and store its new pointer value in the DBF //5) Write "M" back to the DBF file header when done. //Sounds complicated, but isn't, when you know the Memo file format ... //+16.03.2010 15:27 PROCEDURE MemoPack2(cFile) //+ vorerst nur fr FOX-Dateien! (4bit-Memos) LOCAL nHandle, nHandle2, cBuffer, nBuffer LOCAL aM := {}, nM := 12 LOCAL aStruktur, aData, i DEFAULT cFile TO cStickver+"abrech" //+22.03.2010 09:14 //+ aus jedem 'M' in der Struktur der .dbf wird ein "N" nHandle := FOpen( cFile+".dbf", FO_READWRITE ) cBuffer := Space(32) ; nBuffer := 32 FSeek( nHandle, nM ) nBuffer := FRead( nHandle, @cBuffer, nBuffer ) DO WHILE nBuffer == 32 nM += nBuffer IF Right(cBuffer,1) == "M" AAdd(aM,nM-1) //+ merkt sich die Position des "M"s FSeek( nHandle, -1, FS_RELATIVE ) FWrite( nHandle, "C", 1 ) ELSEIF !Right(cBuffer,1)$"NCDM" EXIT ENDIF nBuffer := FRead( nHandle, @cBuffer, nBuffer ) ENDDO FClose( nHandle ) //+ *.dbf ”ffnen und mit der Struktur eine *Neu.dbf erzeugen: DbUseArea( , "FOXCDX", cFile, "dat" ) aStruktur := DbStruct() DbCreate( cFile + "Neu", aStruktur, "FOXCDX" ) DbUseArea( .T., "FOXCDX", cFile + "Neu", "neu" ) SELECT("dat") //+ *.fpt mit FOpen ”ffnen und eine *Neu.fpt mit FCreate erzeugen: nHandle := FOpen( cFile+".fpt", FO_READ ) //+ alte, originale Datei nHandle2 := FCreate( cFile+"Neu.fpt" ) //+ neue, korrigierte Datei cBuffer := Space(512) ; nBuffer := 512 IF FRead(nHandle,@cBuffer,nBuffer) == nBuffer IF FWrite(nHandle2,cBuffer,nBuffer) != nBuffer msgbox("Schreiben von *Neu.fpt klappt nicht",cFile) ENDIF ELSE msgbox("Lesen von *.fpt klappt nicht",cFile) ENDIF //+ "dat" in Schleife abarbeiten und damit *Neu.dbf/fpt fllen: aData := Array( FCount() ) DO WHILE !Eof() FOR i := 1 TO FCount() aData[i] := FieldGet(i) //+ *.dbf lesen NEXT SELECT("neu") DbAppend() FOR i := 1 TO FCount() FieldPut( i, aData[i] ) //+ *Neu.dbf schreiben NEXT SELECT("dat") //+ Adressenfeld kopieren nBuffer := Bin2U(dat->adresse) //+ Lage des Textes in .FPT (in 64bit Bl”cken) IF nBuffer > 0 //+ wenn Text existiert FSeek( nHandle, nBuffer*64 ) //+ positionieren auf den Text in alter .FPT //+ Text aus alter .FPT in neue .FPT kopieren: //+ dazu muss zuerst die L„nge des Textes festgestellt werden: cBuffer := Space(8) ; nBuffer := 8 //+ in den ersten 8 Bytes steht die L„nge IF FRead( nHandle, @cBuffer, nBuffer ) == nBuffer //+ erste 8 Byte lesen IF Left(cBuffer,4) == Chr(0)+Chr(0)+Chr(0)+Chr(1) nBuffer += Asc(cBuffer[8])+Asc(cBuffer[7])*256 //+ 8 plus L„nge des Textes IF nBuffer > 1024 //+ Fehler entdeclen... msgbox( "Bufferl„nge fr Adresse: "+Str(nBuffer) ) //+ ...anzeigen... nBuffer := 1000 //+ ...und korrigieren ENDIF nBuffer := (Int(nBuffer/64)+1)*64 //+ ganze 64Byte-Bl”cke cBuffer := Space(nBuffer) //+ Buffer einrichten FSeek( nHandle, -8, FS_RELATIVE ) //+ an den Anfang zurckgehen IF FRead( nHandle, @cBuffer, nBuffer ) == nBuffer //+ Text lesen IF FWrite( nHandle2, cBuffer, nBuffer ) != nBuffer //+ Text in neue Datei schreiben msgbox("Schreiben von *Neu.fpt klappt nicht") ELSE //+ Textposition in neuer .FPT feststellen + in neue .DBF schreiben: neu->adresse := U2Bin(Int(FSeek( nHandle2, 0, FS_RELATIVE )-nBuffer)/64) ENDIF ENDIF ELSE msgbox("Mll im Adressfeld - wird ersetzt",dat->anummer+"/"+dat->abrechnr) cBuffer := Chr(0)+Chr(0)+Chr(0)+Chr(1)+Chr(0)+Chr(0)+Chr(0)+Chr(56)+ ; "Zerst”rter Text wurde am " + ; DtoC(DATE()) + "-" + Time() + "ersetzt."+Chr(0)+Chr(0)+Chr(0)+Chr(0) nBuffer := 64 IF FWrite( nHandle2, cBuffer, nBuffer ) != nBuffer //+ Text in neue Datei schreiben msgbox("Schreiben von *Neu.fpt klappt nicht") ELSE //+ Textposition in neuer .FPT feststellen + in neue .DBF schreiben: neu->adresse := U2Bin(Int(FSeek( nHandle2, 0, FS_RELATIVE )-nBuffer)/64) ENDIF ENDIF ENDIF ENDIF //+ Notizfeld kopieren nBuffer := Bin2U(dat->r_notiz) IF nBuffer > 0 FSeek( nHandle, nBuffer*64 ) cBuffer := Space(8) ; nBuffer := 8 IF FRead( nHandle, @cBuffer, nBuffer ) == nBuffer //+ erste 8 Byte lesen IF Left(cBuffer,4) == Chr(0)+Chr(0)+Chr(0)+Chr(1) nBuffer += Asc(cBuffer[8])+Asc(cBuffer[7])*256 //+ 8 plus L„nge des Textes IF nBuffer > 1024 //+ Fehler entdeclen... msgbox( "Bufferl„nge fr Notiz: "+Str(nBuffer) ) //+ ...anzeigen... nBuffer := 1000 //+ ...und korrigieren ENDIF nBuffer := (Int(nBuffer/64)+1)*64 //+ ganze 64Byte-Bl”cke cBuffer := Space(nBuffer) //+ Buffer einrichten FSeek( nHandle, -8, FS_RELATIVE ) //+ an den Anfang zurckgehen IF FRead( nHandle, @cBuffer, nBuffer ) == nBuffer //+ Text lesen IF FWrite( nHandle2, cBuffer, nBuffer ) != nBuffer //+ Text in neue Datei schreiben msgbox("Schreiben von *Neu.fpt klappt nicht") ELSE //+ Textposition in neuer .FPT feststellen + in neue .DBF schreiben: neu->r_notiz := U2Bin(Int(FSeek( nHandle2, 0, FS_RELATIVE )-nBuffer)/64) ENDIF ENDIF ELSE msgbox("Mll im Notizfeld - wird ersetzt",dat->anummer+"/"+dat->abrechnr) cBuffer := Chr(0)+Chr(0)+Chr(0)+Chr(1)+Chr(0)+Chr(0)+Chr(0)+Chr(56)+ ; "Zerst”rter Text wurde am " + ; DtoC(DATE()) + "-" + Time() + "ersetzt."+Chr(0)+Chr(0)+Chr(0)+Chr(0) nBuffer := 64 IF FWrite( nHandle2, cBuffer, nBuffer ) != nBuffer //+ Text in neue Datei schreiben msgbox("Schreiben von *Neu.fpt klappt nicht") ELSE //+ Textposition in neuer .FPT feststellen + in neue .DBF schreiben: neu->r_notiz := U2Bin(Int(FSeek( nHandle2, 0, FS_RELATIVE )-nBuffer)/64) ENDIF ENDIF ENDIF ENDIF //+ Bemerkungsfeld kopieren nBuffer := Bin2U(dat->r_bemerk) IF nBuffer > 0 FSeek( nHandle, nBuffer*64 ) cBuffer := Space(8) ; nBuffer := 8 IF FRead( nHandle, @cBuffer, nBuffer ) == nBuffer //+ erste 8 Byte lesen IF Left(cBuffer,4) == Chr(0)+Chr(0)+Chr(0)+Chr(1) nBuffer += Asc(cBuffer[8])+Asc(cBuffer[7])*256 //+ 8 plus L„nge des Textes IF nBuffer > 1024 //+ Fehler entdeclen... msgbox( "Bufferl„nge fr Bemerkung: "+Str(nBuffer) ) //+ ...anzeigen... nBuffer := 1000 //+ ...und korrigieren ENDIF nBuffer := (Int(nBuffer/64)+1)*64 //+ ganze 64Byte-Bl”cke cBuffer := Space(nBuffer) //+ Buffer einrichten FSeek( nHandle, -8, FS_RELATIVE ) //+ an den Anfang zurckgehen IF FRead( nHandle, @cBuffer, nBuffer ) == nBuffer //+ Text lesen IF FWrite( nHandle2, cBuffer, nBuffer ) != nBuffer //+ Text in neue Datei schreiben msgbox("Schreiben von *Neu.fpt klappt nicht") ELSE //+ Textposition in neuer .FPT feststellen + in neue .DBF schreiben: neu->r_bemerk := U2Bin(Int(FSeek( nHandle2, 0, FS_RELATIVE )-nBuffer)/64) ENDIF ENDIF ELSE msgbox("Mll im Bemerkungsfeld - wird ersetzt",dat->anummer+"/"+dat->abrechnr) cBuffer := Chr(0)+Chr(0)+Chr(0)+Chr(1)+Chr(0)+Chr(0)+Chr(0)+Chr(56)+ ; "Zerst”rter Text wurde am " + ; DtoC(DATE()) + "-" + Time() + "ersetzt."+Chr(0)+Chr(0)+Chr(0)+Chr(0) nBuffer := 64 IF FWrite( nHandle2, cBuffer, nBuffer ) != nBuffer //+ Text in neue Datei schreiben msgbox("Schreiben von *Neu.fpt klappt nicht") ELSE //+ Textposition in neuer .FPT feststellen + in neue .DBF schreiben: neu->r_bemerk := U2Bin(Int(FSeek( nHandle2, 0, FS_RELATIVE )-nBuffer)/64) ENDIF ENDIF ENDIF ENDIF // SELECT("dat") DbSkip() ENDDO neu->(DbCloseArea()) dat->(DbCloseArea()) FClose( nHandle ) FClose( nHandle2 ) //+ M-Felder wieder dazu machen (sie waren zwischendurch N-Felder) nHandle := FOpen( cFile+"Neu.dbf", FO_READWRITE ) cBuffer := Space(32) ; nBuffer := 32 FOR i := 1 TO Len(aM) FSeek( nHandle, aM[i] ) FWrite( nHandle, "M", 1 ) NEXT FClose( nHandle ) //+ M-Felder wieder dazu machen (sie waren zwischendurch N-Felder) nHandle := FOpen( cFile+".dbf", FO_READWRITE ) cBuffer := Space(32) ; nBuffer := 32 FOR i := 1 TO Len(aM) FSeek( nHandle, aM[i] ) FWrite( nHandle, "M", 1 ) NEXT FClose( nHandle ) RETURN