Ewald hat geschrieben:Hallo Roland,
das Ende der Fahnenstange ist ja für mich erreicht. Leider mußte ich feststellen, dass ich mit crypt() und oem beim Einsatz des ADS am Ende bin. Ich würde deinen Ansatz tatsächlich gerne mal sehen. Wäre schön, wenn keine Zeichen oberhalb von chr(175) dabei rauskommen würden.
Gruß
Ewald
Hallo Leute, Roland, Ewald usw
Habe das gleiche Problem mit ANSI Zeichensatz und der Func Crypt
Habe eine etwas komplizierte Lösung
da Dbfdbe = SET CHARSET Zeichenwerte werden immer im OEM Zeichensatz gespeichert werden
und bei der FOXDBE -> SET CHARSET Zeichenwerte werden in dem Zeichensatz
gespeichert, der mit SET CHARSET eingestellt ist, wenn eine DBF Datei erzeugt wird
muß man wenn man Crypt()und Ansi benutzen will die Foxdbe benutzen.
Gruß Hans
#include "Common.ch"
#include "DBFDBE.CH"
#include "DMLB.CH"
#include "Xbp.ch"
PROCEDURE main()
LOCAL cfilename := "Hersteller.dbf" // "zubearbeitende.dbf"
LOCAL xdbe := "DBFCDX"
LOCAL Schuessel := "IrgendEinSchlüssel" //schüssel ändern
LOCAL astruct
astruct :=bearbeiteAltedbf( cfilename,"DBFCDX" ,Schuessel)
Erstellneu(cfilename,"FOXCDX",astruct,Schuessel)
RETURN
FUNCTION bearbeiteAltedbf(cfilename,xdbe ,cPass)
LOCAL aStructure :={}
LOCAL narea
LOCAL cfileDBT := StrTran (Lower(cfilename),".dbf", ".dbt") // "Hersteller.dbT"
FIELD BENUTZER ,PASSWORT // Alte zu ersetzende Felder
SET Charset TO oem
IF FileOpen(cFilename ,xDBE)
AltD()
narea := SELECT()
AltD()
IF (nArea)-> ( FieldPos( "CBENUTZER" )) == 0 //feld nicht vorhanden
aStructure := DbStruct() // Datei-Struktur einlesen
(narea)->(DbCloseArea()) // CLOSE
// Feld für BENUTZER CPASSWORT
AAdd( aStructure, {"CBENUTZER","C",25,0} ) // Felder ändern
AAdd( aStructure, {"CPASSWORT","C",25,0} )
DbCreate("TEMP", aStructure ) // Temporäre Datei mit neuer
// Struktur erzeugen
USE Temp // und öffnen
APPEND FROM (cFilename) // Datensätze von *.DBF
// übernehmen
CLOSE Temp
ERASE (cFilename) // Quell-Datei löschen
RENAME Temp.dbf TO (cFilename) // Temporäre Datei umbenennen
IF File( "TEMP.DBT" ) // Wenn Memo-Datei existiert
ERASE (cfileDBT ) // Alte Datei löschen
RENAME Temp.dbt TO (cfileDBT ) // Temporäre Datei umbenennen
ENDIF
ENDIF //neue Felder End
ENDIF //Fileopen End
IF ! Used()
FileOpen(cFilename ,xDBE)
nArea:= SELECT()
ENDIF
(nArea) ->(DbGoTop())
DO WHILE !(nArea) ->( Eof())
IF ! Empty ((nArea) -> Benutzer)
IF RLock()
REPLACE (nArea) ->CBENUTZER WITH crypt(Trim((nArea) ->BENUTZER),cpass)
REPLACE (nArea) ->CPASSWORT WITH crypt(Trim((nArea) ->PASSWORT),cpass)
DbUnlock()
ENDIF
ENDIF
(nArea) ->(DbSkip())
ENDDO
RETURN (aStructure)
/////////////////////////////////////////////////////////////////////
PROCEDURE Erstellneu ( cfilename,xDBE,astructure,cpass) //,"FOXCDX"
LOCAL nArea, i
LOCAL cfileDbT := StrTran (Lower(cfilename),".dbf",".dbt")
SET charset TO ansi
Default xDBE TO "DBFcdx"
DbeInfo( COMPONENT_DATA, DBFDBE_ANSI, .t. )
DbCreate( "Temp1.dbf",astructure, xDBE )
USE (cfilename) via "DBFCDX" new
USE ("Temp1.dbf") via (xDBE) new
nArea := SELECT()
APPEND FROM (cFilename) // leider mit Hersteller OEM Zeichensatz
(nArea) ->(DbGoTop())
DO WHILE !(nArea) ->( Eof())
IF ! Empty ((nArea) -> cBenutzer)
IF RLock()
REPLACE (nArea) ->BENUTZER WITH crypt(Trim((nArea) ->cBENUTZER),cpass)
REPLACE (nArea) ->PASSWORT WITH crypt(Trim((nArea) ->cPASSWORT),cpass)
DbUnlock()
ENDIF
ENDIF
(nArea) ->(DbSkip())
ENDDO
DbCloseAll()
//und Ersatzfeder löschen cBENUTZER,cPASSWORT
FOR i :=1 TO 2
ADel( astructure,Len(astructure) ) //Letztes // aArray ist: {"A","B","D","E", NIL }
ASize( astructure, Len(astructure)-1 ) // Größe anpassen
NEXT i
DbeInfo( COMPONENT_DATA, DBFDBE_ANSI, .t. )
DbCreate("Temp2.dbf" ,astructure, xDBE )
USE ("Temp1.dbf") via "FOXCDX"
AltD()
USE ("TEMP2.dbf") via "FOXCDX"
APPEND FROM Temp1 VIA "FOXCDX" // <cDbe> // NEU ///Hersteller
IF File (cFilename)
ERASE (cFilename)
ENDIF
IF File (cfileDbT)
ERASE (cfileDbT)
ENDIF
IF File ("Temp1.DBF")
ERASE Temp1.DBF // Alte Datei löschen
ENDIF
IF File ("Temp1.FPT")
ERASE Temp1.FPT // Quell-Datei löschen
ENDIF
AltD()
DbCloseAll()
RENAME ("Temp2.dbf") TO (Upper(cFilename)) // Temporäre Datei umbenennen
IF File( "TEMP2.FPT" ) // Wenn Memo-Datei existiert
cfileDbT := Upper( StrTran (Lower(cfilename),".dbf",".FPT")) //neuer Name
RENAME ("Temp2.FPT") TO (cfileDbT) // Temporäre Datei umbenennen
ENDIF
RETURN
/////////////////////////////////////////////////////////
// UFS
/////////////////////////////////////////////////////////
FUNCTION FileOpen(cFile,xDBE,cindexFile,nOrder)
LOCAL rc := FALSE
LOCAL nButton := 0
LOCAL nArea := IF (SELECT() =1,0,SELECT())
Default xDBE TO "DBFcdx"
DO WHILE TRUE
DbUseArea(TRUE,xDBE,cFile)
IF Neterr()
nButton := ConfirmBox( , ;
" Datei ist gesperrt!;Zugriff wiederholen?", ;
"Wiederholen ?", ;
XBPMB_YESNO , ;
XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE )
ENDIF
EXIT
ENDDO
IF Used() //.and. nArea < SELECT()
rc :=TRUE
// DbSetIndex (cIdxFile)
// ordsetfocus(norder)
ENDIF
RETURN (rc)
/////////////////////////////////////////////////////////////////////////////////////////
/*
* DbeSys() wird bei jedem Programmstart ausgeführt
*/
PROCEDURE dbeSys()
/*
* Anpassung der Sortierfolge
*/
SET COLLATION TO GERMAN
/*
* DBF und NTX Database-Engine werden "hidden" geladen
* und zu der neuen abstrakten DBFNTX Database-Engine verbunden.
*/
IF ! DbeLoad( "DBFDBE", .T.)
Alert( "Database-Engine DBFDBE nicht geladen" , {"OK"} )
ENDIF
IF ! DbeLoad( "NTXDBE", .T.)
Alert( "Database-Engine NTXDBE nicht geladen" , {"OK"} )
ENDIF
IF ! DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )
Alert( "DBFNTX Database-Engine;konnte nicht erzeugt werden" , {"OK"} )
ENDIF
// Das gleiche mit DBE und CDX Database-Engine durchführen
/*
IF ! DbeLoad( "DBFDBE", .T.) // Engine f³r DBF-Dateien laden //schon geladen
ALERT( "Database Engine DBFDBE nicht geladen" , {"OK"} )
ENDIF
*/
IF ! DbeLoad( "CDXDBE" , .T.) // Engine f³r CDX-Dateien laden
ALERT( "Database Engine NTXDBE nicht geladen" , {"OK"} )
ENDIF
// Engines f³r Datensatz- und
// Index-Management zusammenf³gen
IF ! DbeBuild( "DBFCDX", "DBFDBE", "CDXDBE" )
ALERT( "Database Engine DBFCDX nicht erzeugt" , {"OK"} )
ENDIF
IF ! DbeLoad( "SDFDBE", .T. ) // SDFDBE "hidden" laden
ALERT( "SDFDBE nicht geladen" , {"OK"} )
ENDIF
// Compound-DBE erzeugen
DbeBuild( "SDFNTX", "SDFDBE", "NTXDBE" )
/*
* Das gleiche mit FOX und CDX Database-Engine durchführen
*/
IF ! DbeLoad( "FOXDBE", .T.)
Alert( "Database-Engine FOXDBE nicht geladen" , {"OK"} )
ENDIF
IF ! DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )
Alert( "FOXCDX Database-Engine;konnte nicht erzeugt werden" , {"OK"} )
ENDIF
//- Einfügen der Zeile
DbeInfo(COMPONENT_ORDER,DBE_LOCKMODE,LOCKING_EXTENDED)
// in die Prozedur DBESYS().
DbeSetDefault( "DBFCDX" )
RETURN