Seite 1 von 1

Indexausdruck mit Upper() [Erledigt]

Verfasst: Di, 05. Jan 2016 14:38
von Jan
Hallo,

gerade stolpere ich über einen Punkt, der mich irritiert: Ich erstelle in dem Programm einen Index auf Upper(field). Wenn ich dann aber später darin suche, dann werden Begriffe, die unter FOXCDX gefunden wrden, nicht mehr gefunden. Ich habe mir den Index dann mal im ARC angesehen - und siehe da, das Upper() ist weg! Das ist natürlich eine Katastrophe, weil manche Sachen eben unterschiedlich geschrieben werden können.

Wie bekomme ich den ADS dazu, meine Upper()-Anweisung zu übernehmen?

Jan

Re: Indexausdruck mit Upper()

Verfasst: Di, 05. Jan 2016 14:45
von brandelh
upper() ist unter FOXCDX und DBFCDX automatisch aktiv (also immer bei CDX), braucht dort nicht angegeben werden.
Eventuell gibt es einen Schalter, der das bei der ADS auch so einschaltet (ist effizienter ;-))

Re: Indexausdruck mit Upper()

Verfasst: Di, 05. Jan 2016 14:51
von Jan
Hubert,

das Gerücht, das man unter FOXCDX kein Upper() braucht, habe ich auch schon gehört. Funktioniert aber nicht. Zumindest nicht bei mir.

Ich habe das eben mal kontrolliert. In anderen dbf ist der Index korrekt mit Upper() angelegt worden. Den betreffenden Index konnte ich nicht ändern. Ich hab den gelöscht und neu erstellt, direkt im ARC. Da hat es dann mit Upper() auch geklappt. Keine Ahnung warum nicht im Programm. Denn alle Indizee werden exakt gleich erstellt, ich habe mir dafür eine Funktion egschrieben an die ich nur die benötigten Indizee übergebe.

Jan

Re: Indexausdruck mit Upper()

Verfasst: Di, 05. Jan 2016 14:55
von Jan
OK, Fehler gefunden. Wenn man den zu erstellenden Index falsch übergibt, dann kann der ADS den natürlich auch nicht korrekt erstellen. Da stell ich mir doch die Frage, wie das all die Jahre vorher gut gehen konnte. Anscheinend wurde der Index neu neu erstellt. Oder der andere Entwickler hier bei meinem Kunden hat da irgendwann drin rumgetippt.

Jan

Re: Indexausdruck mit Upper()

Verfasst: Do, 07. Jan 2016 9:16
von brandelh
Jan hat geschrieben: das Gerücht, das man unter FOXCDX kein Upper() braucht, habe ich auch schon gehört.
Funktioniert aber nicht. Zumindest nicht bei mir.
Der CDX Index ist unabhängig von der Groß-/Kleinschreibung (ob das auch für Umlaute gilt hab ich nicht probiert)
Hier ein Beispielprogramm und die Ausgabe:

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Inkey.ch"
#include "DBFDBE.CH"
#include "NTXDBE.CH"
#include "FOXDBE.CH"
#include "CDXDBE.CH"

PROCEDURE dbeSys()
  SET COLLATION TO GERMAN
  SET DATE TO GERMAN
  SET EPOCH TO year(date())-80
  SET CHARSET TO OEM

  IF ! DbeLoad( "DBFDBE", .t.)
     Alert( "DBFDBE wurde nicht geladen" , {"OK"} )
  ENDIF

  IF ! DbeLoad( "NTXDBE", .t.)
     Alert( "NTXDBE wurde nicht geladen" , {"OK"} )
  ENDIF

  IF ! DbeBuild( "DBFNTX","DBFDBE","NTXDBE"  )
     Alert( "DBFNTX wurde nicht erstellt" , {"OK"} )
  ENDIF

  IF ! DbeLoad( "CDXDBE", .t.)
     Alert( "CDXDBE wurde nicht geladen" , {"OK"} )
  ENDIF

  IF ! DbeBuild( "DBFCDX","DBFDBE","CDXDBE"  )
     Alert( "DBFCDX wurde nicht erstellt" , {"OK"} )
  ENDIF

  DbeInfo( COMPONENT_ORDER, DBE_LOCKMODE         , LOCKING_EXTENDED )

RETURN

procedure main()

   delete file TEST.DBF
   delete file TEST.NTX
   delete file TEST.CDX

   set alternate to test.txt
   set alternate on

   dbcreate( "test.dbf", {{ "Name", "c", 100,0 }} )
   use test exclusive VIA DBFNTX
   dbappend()
   replace name with "Test ohne Umlaute"
   dbappend()
   replace name with "Hubert in Rec 2"
   dbappend()
   replace name with "ENDE in Rec 3"

   index on upper(name) to test

   ? "Hubert",dbseek("Hubert"),recno()
   ? "HUBERT",dbseek("HUBERT"),recno()

   close

   use test exclusive VIA DBFCDX

   index on name to test

   ? "Hubert",dbseek("Hubert"),recno()
   ? "HUBERT",dbseek("HUBERT"),recno()

   close

   inkey( 10 )

return
ergibt zur Laufzeit:

Code: Alles auswählen

Hubert N               4
HUBERT J               2
Hubert J               2
HUBERT J               2
da die CDXDBE dafür zuständig ist, müsste das auch für Foxpro zutreffen, aber die ADS ist natürlich was anderes.