DBcreateindex FEHLER !

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

DBcreateindex FEHLER !

Beitrag von xbaseklaus »

Guten Morgen

In letzter Zeit bekomme ich bei einem Programm vermehrt den DBcreateIndex Fehler !

Xbase 1.82
Betriebssystem: Windows 7
SMB Patch installiert -> wobei ich diesen für das Programm wahrscheinlich nicht bräuchte , da:

kein Netzwerkzugriff, alle Datenbanken werden exclusive geöffnet !!!

sollte ich da die DBESYS.prg anpassen ?

Code: Alles auswählen

//////////////////////////////////////////////////////////////////////
//
//  DBESYS.PRG
//
//  Copyright:
//      Alaska Software, (c) 1998-2003. All rights reserved.         
//  
//  Contents:
//      Xbase++ DatabaseEngine startup/preloader
//   
//  Syntax:
//      DbeSys() is called automatically at program start before the 
//      function MAIN.
//   
//////////////////////////////////////////////////////////////////////


#define MSG_DBE_NOT_LOADED   " database engine not loaded"
#define MSG_DBE_NOT_CREATED  " database engine could not be created"

*******************************************************************************
* DbeSys() is always executed at program startup
*******************************************************************************
PROCEDURE dbeSys()
/* 
 *   The lHidden parameter is set to .T. for all database engines 
 *   which will be combined to a new abstract database engine.
 */
LOCAL aDbes := { { "DBFDBE", .T.},;
                 { "NTXDBE", .T.},;
                 { "DELDBE", .F.},;
                 { "SDFDBE", .F.} }
LOCAL aBuild :={ { "DBFNTX", 1, 2 } } 
LOCAL i

  /*
   *   Set the sorting order and the date format
   */
  SET COLLATION TO AMERICAN
  SET DATE TO AMERICAN

  /* 
   *   load all database engines 
   */
  FOR i:= 1 TO len(aDbes)
      IF ! DbeLoad( aDbes[i][1], aDbes[i][2])
         Alert( aDbes[i][1] + MSG_DBE_NOT_LOADED , {"OK"} )
      ENDIF
  NEXT i

  /* 
   *   create database engines 
   */
  FOR i:= 1 TO len(aBuild)
      IF ! DbeBuild( aBuild[i][1], aDbes[aBuild[i][2]][1], aDbes[aBuild[i][3]][1])
         Alert( aBuild[i][1] + MSG_DBE_NOT_CREATED , {"OK"} )
      ENDIF
  NEXT i
                 
RETURN

//
// EOF
wenn ich bei dem Fehler auf WIEDERHOLEN gehe geht's irgendwann weiter !?!
Dateianhänge
Ashampoo_Snap_2015.10.14_11h22m57s_001_.png
Ashampoo_Snap_2015.10.14_11h22m57s_001_.png (19.66 KiB) 9224 mal betrachtet
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von brandelh »

kein Netzwerkzugriff, alle Datenbanken werden exclusive geöffnet !!!
wenn die Dateien LOCAL geöffnet werden, hast du dahingehend Recht.

Ich tippe auf den Virenscanner !
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von Tom »

Ist ein Virenscanner installiert? Wenn ja - ist das Datenverzeichnis als Ausnahme für den Laufzeitscan definiert?

"Unzulässige Funktion" verweist allerdings eher auf einen inhaltlichen Fehler. Das kann z.B. passieren, wenn man versucht, Indexausdrücke mit unterschiedlichen Längen zu definieren, etwa auf "Upper(Trim(kunden_name))". Indexausdrücke müssen über die gesamte Tabelle hinweg die gleiche Länge haben. Es kann auch an der Korruption eines bestehenden, aber mitgeöffneten Indexes liegen. Oder an einem Fehler in der Tabelle selbst.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von Jan »

Ich hatte diese Fehlermeldung stapelweise, als wir sehr hohe Latenzen im Netzwerk hatten. Was hier ja nun einmal nicht zutrifft. Ich würde daher ebenfalls auf Virenscanner tippen. Und testweise mal das entsprechende Verzeichnis aus dem Scanbereich rausnehmen. Nur um das einzugrenzen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: DBcreateindex FEHLER !

Beitrag von xbaseklaus »

@ BrandelH , hatte ein neues Verzeichnis für das Programm angelegt und es im Virenscanner nicht ausgeschlossen - Trend Micro !

scheint der Fehler gewesen zu sein - DANKE

@ Tom -- die Anmerkung für UPPER könnte ein Problem in einem anderen Programm lösen , welches ab und zu auftritt - DANKE

wenn ich schon dabei bin

Wie sollte denn die DBESYS.prg aussehen falls ich ein Programm habe was im Netzwerk läuft ?

da ich an der DBESYS.prg noch nie was geändert habe - siehe POST am Anfang !

Mfg. Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von brandelh »

Eigentlich braucht man dort nix ändern, wenn man NTX als Standard nutzt.
Wer CDX als Standardwill setzt es am besten dort.

Allerdings ist das für ein deutsches Programm ungünstig (Umlaute etc.)

Code: Alles auswählen

  /*
   *   Set the sorting order and the date format
   */
  SET COLLATION TO AMERICAN
  SET DATE TO AMERICAN
normalerweise sollte dort GERMAN stehen, oder SYSTEM ... ich habe deshalb aber immer eine Funktion die in Sortierungen die Umlaute entfernt ( ü und Ü nach ue etc.)
Diese Funktion muss man gleich einsetzen in Suche und Erstellung - und sie darf die Stringlänge nicht ändern !

Einige ändern die Latenzzeiten bzw. cache werte (hauptsächlich in CDX), das wird z.b. auch nötig, wenn das Programm lokal läuft aber als Server (WEB SERVER / Citrix) dient.
Hier können die Zugriffe so schnell hintereinander kommen, dass der cache ausgeschaltet werden muss. Die werte findet man in der Hilfe zu CDX ...
Gruß
Hubert
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: DBcreateindex FEHLER !

Beitrag von xbaseklaus »

brandelh hat geschrieben:Eigentlich braucht man dort nix ändern, wenn man NTX als Standard nutzt...
Ich verwende nur NTX !

Ich frage deshalb weil im Forum öfters die Äußerungen zu lesen sind:
p.s. bei Threads und DBF sollte man in der DBESYS die Konstanten DBFDBE_LIFETIME bzw. FOXDBE_LIFETIME auf 0 setzten
Mfg. Klaus
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von Jan »

Klaus,

das gilt nur für Mehrfachzugriffe. Also dbf offen in mehrern Threads oder im Netzwerk. Da Du aber einen exklusiven Zugriff hast, ist das unnötig.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von brandelh »

Aus dem Geächtnis steht bei den Cachewerten z.B. 50 ... dann wird 50/1000 Sekunden (50 Millisekunden) die Werte nicht vom OS abgefragt sondern aus internem cache.
Das ist normalerweise kein Problem, da eine Anwendung in der kurzen Zeit kaum die Daten doppelt schreiben will, solange es ein normales Dialogprogramm ist.

Wenn aber 2 threads gleichzeitig in die DBF schreiben, oder aus dem Internet auf eine EXE zugegriffen wird, kann es doch passieren,
dass diese Zeitspanne zu Fehlern führt. Daher bei solchen speziellen Anwendungen UND geshartem Zugriff diese Empfehlungen.

Wie Jan ausführt spielt das bei exclusivem Zugriff keine Rolle, hierbei wird sehr viel gecached, (weshalb das gut 10 mal schneller ist als geshared) aber eben exclusiv !
Gruß
Hubert
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: DBcreateindex FEHLER !

Beitrag von xbaseklaus »

Jan hat geschrieben:Klaus,

das gilt nur für Mehrfachzugriffe. Also dbf offen in mehrern Threads oder im Netzwerk. Da Du aber einen exklusiven Zugriff hast, ist das unnötig.

Jan
Bei diesem Problem hier ist das schon klar !

Das war jetzt nur allgemein gefragt , falls ein Programm im Netzwerk läuft (SHARED) , was sollte da in der DBESYS noch zusätzlich rein im Vergleich zu der oben geposteten ... verwende nur DBF und NTX ?

Mfg. Klaus
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von Jan »

Klaus,

im Netz würde ich dringend raten, auf FOXCDX umzusteigen. Klar geht DBFNTX auch, das hab ich jahrelang bei Kunden laufen gehabt. Aber FOXCDX ist stabiler und schneller, gerade im Netz. Und braucht auch weniger Filehandles.

Der Umstieg ist übrigens nicht schwierig. Das ist schnell gemacht, und am Code brauchst Du bis auf die dbfsys nichts zu ändern.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: DBcreateindex FEHLER !

Beitrag von xbaseklaus »

Jan hat geschrieben:Klaus,

im Netz würde ich dringend raten, auf FOXCDX umzusteigen. Klar geht DBFNTX auch, das hab ich jahrelang bei Kunden laufen gehabt. Aber FOXCDX ist stabiler und schneller, gerade im Netz. Und braucht auch weniger Filehandles.

Der Umstieg ist übrigens nicht schwierig. Das ist schnell gemacht, und am Code brauchst Du bis auf die dbfsys nichts zu ändern.

Jan
D.H. die DBF Dateien bleiben nur der INDEX wird umgestellt !?

kannst du bitte mal eine so geänderte DBESYS für Netzwerkbetrieb posten ?

die DBESYS.prg kommt dann in die *.XPJ oder ?

Mfg. Klaus
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21198
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBcreateindex FEHLER !

Beitrag von Manfred »

NEIN,

wenn Du die Treiber austauscht, würde ich immer die DBF auch konvertieren.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von Tom »

Das ist schnell gemacht
Na ja. Man muss alle Tabellen konvertieren (OEM -> ANSI, DBT -> FPT) und sollte Indexe zusammenfassen, wodurch sich in der Anwendung erhebliche Änderungen ergeben können, vor allem, wenn man dort fallweise nicht mit allen Indexen arbeitet, weil man beispielsweise nur nach Namen sucht und die Tabelle nicht manipuliert. SET ORDER muss an jeder Stelle überarbeitet werden. Undsoweiter. Das meiste kann man mit Search & Replace bewerkstelligen, aber längst nicht alles. Und, wie gesagt - man muss konvertieren. Möglichst auch die gesamte App, wenn sie noch auf OEM steht.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von Jan »

Stimmt. Die FOX-dbf kann mehr als die Clipper-dbf. FOXCDX passt da einfach besser als DBFNTX.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von brandelh »

Vor allem kann man mit FOXCDX auf ANSI Speicherung umstellen, was das dauernde OEM / ANSI Konvertieren unnötig macht und somit Fehler vermeidet.

ABER man muss auch bedenken, dass z.B. CDX grundsätzlich unabhängig von Groß/Kleinschreibung sucht.
Man kann also nicht per Index kleine Buchstaben suchen ;-)

Ich hab bei mir auf die Schnelle nur die CDX verwendet und alle Indexe in eine Datei gepackt. DBF aber behalten.
Das ging schnell und ohne Probleme und die DBF ist immer noch kompatibel (inkl. der schlechten Memodatei).

Gerade bei Memodateien, aber auch bei BINÄR Daten in den Tabellen ist FOXCDX aber deutlich leistungsfähiger.
Gruß
Hubert
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: DBcreateindex FEHLER !

Beitrag von xbaseklaus »

Tom hat geschrieben:
Das ist schnell gemacht
Na ja. Man muss alle Tabellen konvertieren (OEM -> ANSI, DBT -> FPT) und sollte Indexe zusammenfassen, wodurch sich in der Anwendung erhebliche Änderungen ergeben können, vor allem, wenn man dort fallweise nicht mit allen Indexen arbeitet, weil man beispielsweise nur nach Namen sucht und die Tabelle nicht manipuliert. SET ORDER muss an jeder Stelle überarbeitet werden. Undsoweiter. Das meiste kann man mit Search & Replace bewerkstelligen, aber längst nicht alles. Und, wie gesagt - man muss konvertieren. Möglichst auch die gesamte App, wenn sie noch auf OEM steht.
Ok. Ich würde das gerne mal Probieren !

1. Soll ich das dan gleich mit xbase 1.9.331 machen ?
2. Die APP steht noch auf OEM ! Was ist zu beachten ?
3. Gibt es FREEWARE um die Datenbank zu exportieren ? inkl. MEMO (sehr wichtig)
4. Wo ist der Unterschied bei SET ORDER bzw . ALLGEMEIN ?
5. Wie sieht die DBESYS aus bei FOX Datenbank und im Netzwerk ?

Mfg. Klaus
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von Jan »

Klaus,

1) Ja natürlich
2) Auf ANSI setzen
3) Das kannst Du direkt mit Xabse++ machen. Einfach in der dbesys beide DBE laden, als Standard DBFNTX setzen, und dann VIA FOXCDX rüberkopieren
4) Ich mach das immer mit OrdSetFocus(). Ich selber bin ein Fan davon, Indizee zu benennen und nicht die Nummern davon zu verwenden.
5) Ja klar. Optionen gibt es in der Hilfe, oder ich schick Dir mal meine.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von brandelh »

Normale Anwendungen braucht man nicht zu ändern, die Datenerfassung braucht viel länger als die cache Zeiten.

DBF => FOXCDX ?

Dafür muss man im MAIN nur das umstellen:

DbeSetDefault( "FOXCDX" )

DBF => ANSI FOXCDX ?

hier reicht

DbeSetDefault( "FOXCDX" )
SET CHARSET TO ansi

da dies aber global läuft kann man es auch in die DBESYS() setzen ...

Hier ist meine als Beispiel, chache ändere ich gar nicht.

Code: Alles auswählen

PROCEDURE dbeSys()

  SET COLLATION TO GERMAN
  SET DATE TO GERMAN
  SET EPOCH TO year(date())-80
  SET CHARSET TO ANSI

  IF ! DbeLoad( "FOXDBE", .t.)
     Alert( "FOXDBE" + MSG_DBE_NOT_LOADED , {"OK"} )
  ENDIF

  IF ! DbeLoad( "CDXDBE", .t.)
     Alert( "CDXDBE" + MSG_DBE_NOT_LOADED , {"OK"} )
  ENDIF

  IF ! DbeBuild( "FOXCDX","FOXDBE","CDXDBE"  )
     Alert( "FOXCDX" + MSG_DBE_NOT_CREATED , {"OK"} )
  ENDIF

*  DbeInfo( COMPONENT_DATA,  FOXDBE_MEMOBLOCKSIZE , 80 ) // optimierte Zeichenlänge wenn man die Standartlänge kennt
  DbeInfo( COMPONENT_ORDER, DBE_LOCKMODE         , LOCKING_EXTENDED ) // schneller lesezugriff
  DbeSetDefault("FOXCDX")

RETURN
Konvertierung mit COPY TO

Code: Alles auswählen

use (cDBFALT) VIA DBFCDX
copy all to (cDBFNEW) 
sollte reichen, die neue wird als Standard (FOXCDX in ANSI) angelegt. Es ist allerdings schon eine Weile her ;-)
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DBcreateindex FEHLER !

Beitrag von Tom »

Auf ANSI setzen
Vorsicht.

a) Der Quellcode sollte/muss dann auch in ANSI sein. Es gibt aber auch Compilerschalter dafür.
b) Wenn es Kommunikation mit Fremd-DLLs oder Exportroutinen gibt, die ConvToAnsiCP() oder ConvToOemCP() verwenden, muss das alles weitgehend rausfliegen.
Herzlich,
Tom
Antworten