Was kann man bei solch einen einfachen Indexausdruck falsch

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Was kann man bei solch einen einfachen Indexausdruck falsch

Beitrag von Magic »

Hi,

was kann man bei solch einen einfachen Indexausdruck falsch machen?

Ich bekomme ständig falsche Ergebnisse, wenn ich einen Index wie folgt aufbaue:

Code: Alles auswählen

DTOS(DATUM)+STR(PERS,6)
Der Scope wird dann z.B. so gesetzt:

Code: Alles auswählen

Top   : „20140101    33“
Bottom: „20140331    33“.
Wenn ich direkt im ARC den Index auswähle, dann kann ich feststellen, dass der erste Teilausdruck (das Datum) noch richtig ausgewertet werden, der Rest nicht. Warum?
Sehe ich etwas nicht oder stimmt da etwas nicht?
Gruß,
Magic
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: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von brandelh »

wenn das Feld von STR() keine Dezimalstellen hat, müsste es so gehen, aber sicherer und klarer ist es das gleich so zu schreiben:

DTOS(DATUM)+STR(PERS,6,0)

ansonsten ADS, halt ich mich raus ;-)
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von Magic »

Hallo,

ne. keine Dezimalstellen. Habe trotzdem den Indexausdruck ergänzt. Keine Besserung.
Gibt es doch nicht!
Gruß,
Magic
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von Wolfgang Ciriack »

Probiers doch mal mit DTOS(DATUM)+STRZERO(PERS,6)
Viele Grüße
Wolfgang
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von Magic »

Wolfgang Ciriack hat geschrieben:Probiers doch mal mit DTOS(DATUM)+STRZERO(PERS,6)
Ebenso falsche Ergebnisse. Sehr merkwürdig. Dabei ist im Index nichts kompliziertes drin. Auch die Datei hat gerade mal 43.000 Datensätze.
Habe auch gerade alle Indizies gelöscht und neu erstellt. Keine Besserung.
Gruß,
Magic
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von Magic »

Verstehe es nicht!

Warum passt es wenn ich einen Indexausdruck umdrehe:

Code: Alles auswählen

STR(PERS,6)+S(DATUM)
Den Scope entsprechend geändert:

Code: Alles auswählen

Top   : „    3320140101“
Bottom: „    3320140331“
So bekomme ich die richtigen Ergebnisse. Aber warum :?: :?: :?:
Gruß,
Magic
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: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von brandelh »

Also der Indexausdruck ist definitiv richtig, aber ADS ... hat nightcrawler nicht geschrieben,
dass FILTER auf dem SERVER ausgeführt werden und SCOPES auf dem Client ?

Versuche doch mal das ganze als Filter zu schreiben und prüfe
1. die Ergebnisse
2. die Zeit.

Wenn der SERVER den Filter über einen SQL Select erstellt, sollte man diesen nutzen.
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von Magic »

Ich hab's erst mal durch einen neuen Index lösen können.
Kann im laufendem Betrieb immer sehr wenig testen, zumal es heute schnell gehen musste.
Zudem sind Filter nicht so beliebt bei mir :wink:

Aber wenn es ein generelles Problem wäre, dann müsste es doch auch wo anders auftauchen?
Bei der Anzahl an Tabellen und Indizies die wir haben ...
Gruß,
Magic
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: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von brandelh »

Magic hat geschrieben:Zudem sind Filter nicht so beliebt bei mir :wink:
bei mir mit DBF / NTX / CDX auch nicht, aber wenn du ADS nutzt UND die Annahme stimmt, dass der Filter vom Server aufgelöst wird ... 8)

Wenn man das Beste will, kommt es eben doch darauf an, was man wie macht.
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von ramses »

Hast du daran gedacht dass du in ADS Filterausdrücken keine Mem-Variablen verwenden darfst, diese sind auf dem Server ja nicht sichtbar

Cu Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von Tom »

Äh. Memvars in Indexausdrücken sind auch ohne ADS - vorsichtig gesagt - ziemlich hirnrissig, denn Memvars existieren nur zur Laufzeit und nur im ausführenden Programm. Bei Verwendung der ADS sollte man tunlichst auf UDFs in Indexausdrücken verzichten, darüber hinaus gibt es Beschränkungen hinsichtlich der sonstigen Funktionen, von denen nur ein Teil unterstützt wird. Diese findet man in der Hilfe zur ADSDBE unter "Limitations of the Advantage Database Server". Die verwendeten Funktionen Descend() und StrZero() sind allerdings darunter.
Herzlich,
Tom
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von UliTs »

Hallo Admins: verschiebt das Thema bitte in das ADS-Unterverzeichnis :-) . Dann hat Joachim auch die Chance, es entsprechend zu entdecken :D .
Wenn Du den ursprünglichen Index benutzt und mit dem ARC (Data Architekten) die Tabelle öffnest und dort den Scope setzt, funktioniert es dann korrekt? Wenn ja, vermute ich einen Fehler im Alaska-Treiber für den ADS.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von UliTs »

Magic hat geschrieben:...
Zudem sind Filter nicht so beliebt bei mir :wink:
...
Ein Filter ist viel flexibler als ein Scope. :D
Wenn es einen passenden Index gibt, ist beim ADS der Filter viiiiel schneller als der Scope, da -wie schon oft erwähnt- der Scope nur Lokal ausgewertet wird ...

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von Magic »

Hi,

ich muss gestehen, dass ich bisher immer davon ausgegangen bin, dass Filter langsamer sind als Scopes. Wenn es (in bestimmten Fällen) nicht so ist, dann habe ich mal wieder etwas gelernt.

Aber wie kommt ihr auf MEMVARS im Zusammenhang mit Index?
ramses hat geschrieben:Hast du daran gedacht dass du in ADS Filterausdrücken keine Mem-Variablen verwenden darfst
Tom hat geschrieben:Memvars in Indexausdrücken sind auch ohne ADS - vorsichtig gesagt - ziemlich hirnrissig
Davon war nie die Rede.
Gruß,
Magic
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: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von Jan »

Magic hat geschrieben:Verstehe es nicht!

Warum passt es wenn ich einen Indexausdruck umdrehe:

Code: Alles auswählen

STR(PERS,6)+S(DATUM)
Den Scope entsprechend geändert:

Code: Alles auswählen

Top   : „    3320140101“
Bottom: „    3320140331“
So bekomme ich die richtigen Ergebnisse. Aber warum :?: :?: :?:
Moin,

das habe ich auch schon erlebt (ohne ADS). Und ist auch nachvollziehbar. Denn der logische Ausdruck ist andersherum falsch. Der eindeutige Teil muß vorne stehen, der variable hinten.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Was kann man bei solch einen einfachen Indexausdruck fal

Beitrag von UliTs »

Magic hat geschrieben:ich muss gestehen, dass ich bisher immer davon ausgegangen bin, dass Filter langsamer sind als Scopes. Wenn es (in bestimmten Fällen) nicht so ist, dann habe ich mal wieder etwas gelernt.
Aber wie kommt ihr auf MEMVARS im Zusammenhang mit Index?
ramses hat geschrieben:Hast du daran gedacht dass du in ADS Filterausdrücken keine Mem-Variablen verwenden darfst
...
Beim ADS werden -soweit ich weiß- Scopes nicht auf dem Server ausgewertet sondern nur durch den lokalen Treiber.
Wenn allerdings Filter durch den Server ausgewertet werden können, erfolgt dies auch auf dem Server! Wenn innerhalb eines Filters Mem-Variablen oder Locals verwendet werden, kann der Filter nicht auf dem Server ausgewertet werden, da der Server ja den jeweils aktuellen Wert der Variable nicht kennt!
Deswegen sollte man statt

Code: Alles auswählen

set Filter to PersNr=nPersNr
den Filter wie folgt setzen:

Code: Alles auswählen

cFilter := "PersNr="+AllTrim(nPersNr)
cbFilter := "{||"+cFilter+"}"
bFilter  := &cbFilter
DbSetFilter( bFilter,cFilter )
Ich habe mir deswegen die folgende Funktion geschrieben:

Code: Alles auswählen

FUNCTION UTsDbSetFilter( cFilter ) // Im Gegensatz zu DbSetFilter() wird Filterbedingung nur als String
LOCAL cOldFilter:=DbFilter()       // übergeben, "" akzeptiert und der alte Filter zurückgegeben.
LOCAL cbFilter,bFilter
  IF valType(cFilter)=="C"
    IF empty( cFilter )
      DbClearFilter()
    ELSE
      cbFilter := "{||"+cFilter+"}"
      bFilter  := &cbFilter
      DbSetFilter( bFilter,cFilter )
    ENDIF
  ENDIF
RETURN( cOldFilter )
Damit kann der Filter wie folgt gesetzt werden:

Code: Alles auswählen

UTsDbSetFilter( "PersNr"=AllTrim(str(nPersNr)) )
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten