Indexausdruck mit Upper() [Erledigt]

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Indexausdruck mit Upper() [Erledigt]

Beitrag 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
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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Indexausdruck mit Upper()

Beitrag 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 ;-))
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Indexausdruck mit Upper()

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Indexausdruck mit Upper()

Beitrag 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
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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Indexausdruck mit Upper()

Beitrag 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.
Dateianhänge
NTX_CDX_UPPER.zip
(1.23 KiB) 187-mal heruntergeladen
Gruß
Hubert
Antworten