Kombinierter Index auf Simulationsnr und Datum

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

Moderator: Moderatoren

Antworten
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Kombinierter Index auf Simulationsnr und Datum

Beitrag 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
Gruß,
Jannik (das verträumte Einhorn, by Jan)
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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).
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen 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: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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)
Gruß
Hubert
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: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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 )
Gruß
Hubert
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Re: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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
Gruß,
Jannik (das verträumte Einhorn, by Jan)
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: Kombinierter Index auf Simulationsnr und Datum

Beitrag von Tom »

Mache ich hier auch was falsch?
Vertausch mal datum1 und datum2 in den Scopes.
Herzlich,
Tom
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Re: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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
Gruß,
Jannik (das verträumte Einhorn, by Jan)
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: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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
Gruß
Hubert
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: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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)
Gruß
Hubert
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Re: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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...
Gruß,
Jannik (das verträumte Einhorn, by Jan)
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Re: Kombinierter Index auf Simulationsnr und Datum

Beitrag 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!!!
Gruß,
Jannik (das verträumte Einhorn, by Jan)
Antworten