Seite 1 von 1

Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 12:10
von unicorn
Hey Leute,

stehe mal wieder mit dem vor dem Kopf in der Ecke...

Ich brauche einen kombinierten Index, der in der Lage ist, mir alle Datensätze einer Simulationsnr. nach Datum sortiert zu liefern. Wenn zwei Aufträge z.B. mit der Simulationsnr. 20060 getaggt sind und das Datum 13.11.2017 und 14.11.2017 sind, müsste der Index doch über den Befehl

Code: Alles auswählen

INDEX ON ltrim(rtrim(Str(T_SIMUL)))+ltrim(rtrim(DtoS(T_AUFTRAGS))) TO aSD ASCENDING
doch dann zu 2006020171113 werden oder? Leider macht er bei mir nur 200602017 draus und dann nix mehr (Inspektion von ntx-File ergab das). Deswegen liefert er mir auch keine Datensätze wenn ich den Index auswähle und dann mit

Code: Alles auswählen

SET SCOPE TO 200602071114, 2006020171113
den Scope auf den höchsten und tiefsten Wert lege.

Kann mir jemand sagen wo mein Fehler liegt?

Danke im Voraus,
Jannik

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 12:26
von georg
Hallo, Jannik -


RTrim(LTrim(Str(3))) => "3"
RTrim(LTrim(Str(33))) => "33"

Also eher StrTran(Str(nZahl, 10), " ", "0") - dadurch bekommst Du immer eine zehnstellige Nummer mit führenden Nullen. Dann kannst Du auch entsprechend suchen.

Wenn die numerischen Werte mehr als zehn Stellen annehmen können, solltest Du einen anderen Wert als 10 wählen. In meinen DBF/CDX Anwendungen habe ich numerische Werte immer mit Str(FELD, 10) in den Index aufgenommen. Dadurch weiss man immer, wie der Index aufgebaut ist (Gewohnheiten helfen beim Programmieren).

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 13:11
von brandelh
Indexbegriffe müssen IMMER gleich lang sein, daher nie mit TRIM() oder ähnlichen Befehlen behandeln.

Blanks sind auch schlecht, daher nimmt man für solche Zwecke
StrZero( <nValue>, [<nLength>], [<nDecimals>] ) --> cString
Wenn deine Simulationsnummer (hier nSimNr) max 99999 sein kann, dann geht eigentlich
StrZero(nSimNr,5,0)+Dtos(xDatum)
Da aber intern gerne mal eine Überschreitung stattfindet die in "****" mündet, wähle ich die Strings länger und schneide mit right() heraus was ich brauche:

right(StrZero(nSimNr,10,0),5)+Dtos(xDatum)

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 13:16
von brandelh
Falls du keine führende 0 willst, müsste man das so machen, wieder vorausgesetzt, dass die nID max 6 Stellen haben kann !

Code: Alles auswählen

nIndexLen := 6 + 8 // 6 für nID und 8 für DTOS() Datum 
left( alltrim(str(nID,10,0))+DtoS(xDatum)+space(nIndexLen), nIndexLen )

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 13:34
von unicorn
Hallo Hubert,

right(StrZero(nSimNr,10,0),5)+Dtos(xDatum)

das erstellt mir die Indexdatei richtig, danke schonmal! Warum du das mit dem Abschneiden machst verstehe ich ebenfalls, macht Sinn. Die Simulationsnr. wird auch nie größer werden als 99999, da das Programm dann einfach wieder bei 0 anfängt (die Simnr. hat keine weitere Bedeutung im Rechnungssystem des Kunden).

Im meinem Code wähle ich jetzt so den Index aus und setze den Scope:

Code: Alles auswählen

SET ORDER TO 13
scopemax := right(StrZero(rechnr,10,0), 5) + dtos(datum2)
scopemin := right(StrZero(rechnr,10,0), 5) + dtos(datum1)
SET SCOPE TO scopemax, scopemin
Trotzdem ist die Datenbank sofort bei Eof() wenn ich durchlaufe. datum2 entspricht hier dem 14.11., datum1 dem 13.11. und rechnr ist die aktuelle Simulationsnr. Mache ich hier auch was falsch? #-o

LG Jannik

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 13:47
von Tom
Mache ich hier auch was falsch?
Vertausch mal datum1 und datum2 in den Scopes.

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 13:52
von unicorn
Hallo Tom,

das habe ich schon probiert, bringt aber keine Verbesserung, würde außerdem dann nicht mehr den Vorgaben des Befehls entsprechen...

LG Jannik

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 13:52
von brandelh
vertausche mal die Werte von Max und Min beim Scope ... die Hilfe ist hier missverständlich ! :roll:

Code: Alles auswählen

SET SCOPE TO <xTop>, <xBottom>  // xTop ist der kleinere und xBottom der größere Wert 
Jeder (inkl. mir) denkt bei
Hilfe hat geschrieben: <xTop> ist der Wert für die obere Grenze des Scopes.
<xBottom> ist der Wert für die untere Grenze des Scopes.
obere Grenze muss wohl Groß sein ... aber gemeint ist wie bei GoTop(), der Anfang der Datei
untere Grenze des Scopes. => wie bei GoBottom() das Ende der Datei - bezogen auf Scope, der Treffermenge

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 13:59
von brandelh
doch, Tom hat Recht, wenn es bei dir nicht funktioniert, musst du mal hingehen und entweder ein Stringfeld in der DBF mit dem Wert aus dem Indexbegriff füllen,
oder als Datei ausgeben :
set alternate to test
set alternate on

dbeval( {|| qout( FunktionDesIndexbegriffes() ) })
? "Suche xTop", nScopeMin
? "Suche xBot", nScopeMax
wenn du es in einem eigenen Feld abspeicherst, dann kannst du dieses Feld indizieren und mit dem Testen (ist oft besser als so komplexe Indexbegriffe im Kopf zu berechnen, Speicherplatz kostet nix mehr)

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 15:37
von unicorn
Leute,

ich glaube ich verzweifel noch...
Hab jetzt einen Index auf ein zusätzliches Feld gemacht. Das Feld ist numerisch, hat genau 13 Zeichen und keine Dezimale.
Im Feld steht bei den entsprechenden Aufträgen Val("20060" + "20171113"). Im Index taucht es richtig auf, der Scope ist auch als Dezimal aufgebaut, Überprüfung per Msgbox() zeigt die richtigen Werte an, aber ich bin wieder in Eof()...

Das kann doch nicht sein :confused1: :confused1: :confused1:

Wenn ich den ursprünglichen Befehl nehme und den Index als String aufbaue, was er ja vorhin richtig in den Index geschrieben hat und ich dann den Scope setze, funktioniert es auch nicht...

Ich bin ein wenig verzweifelt gerade...

Re: Kombinierter Index auf Simulationsnr und Datum

Verfasst: Mo, 04. Dez 2017 15:55
von unicorn
Also, hat sich gerade erledigt =P~ =P~ =P~

Ich hab beim Befüllen des ComboFelds das falsche Datum genommen, dadurch hat er es nicht gesehen...
Er funktioniert jetzt also, danke an alle!!!