Scope über 2 Felder [erledigt]

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Scope über 2 Felder [erledigt]

Beitrag von Werner_Bayern »

Servus,

stehe irgendwie auf dem Schlauch.
Ich habe die 2 Felder Ticket-id 12stellig und Status 2stellig numerisch (nur die Anzeige im Browse ist entsprechend).
Nun habe ich einen Index - zur Veranschaulichung ins Browse eingebaut - "ticket-id+gn(status, 2)".

Wie bekomme ich einen Scope hin, der z. B. Status 01 ausblendet?

Code: Alles auswählen

dbsetScope(SCOPE_BOTTOM, replicate(chr(255), 12) + gn(99, 2))
dbsetScope(SCOPE_TOP, replicate(chr(32), 12) + gn(2, 2))
funktioniert nicht...

gn() macht aus einer Zahl einen String mit führenden Nullen.
Dateianhänge
scope.PNG
scope.PNG (10.33 KiB) 8318 mal betrachtet
Zuletzt geändert von Werner_Bayern am Mi, 20. Mai 2015 15:55, insgesamt 1-mal geändert.
es grüßt

Werner

<when the music is over, turn off the lights!>
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: Scope über 2 Felder

Beitrag von Tom »

Wie bekomme ich einen Scope hin, der z. B. Status 01 ausblendet?
Indem Du den Status im Index nach vorne nimmst. Allerdings könntest Du dann nicht mehr nach speziellen Ticketnummern scopen. :wink:

Scopes kann man mit Filtern kombinieren, und das ist sogar recht flink, wenn die Menge, die der Scope zurückliefert, nicht sehr groß ist. Hilfreich ist an dieser Stelle "SET SMARTFILTER ON", weil das dazu führt, dass sich ein XbpBrowse solche Datensätze merkt, von denen es einmal evaluiert hat, ob die Filterbedingung zutrifft. Nicht vergessen, es anschließend wieder abzuschalten! Wenn sich die Filterbedingungen o.ä. ändern, muss ein DbRefresh() auf die Workarea ausgelöst werden.
Herzlich,
Tom
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: Scope über 2 Felder

Beitrag von Tom »

Vielleicht noch zur Erklärung:

NAME Status
Meier 01
Müller 01
Müller 02
Mytzek 01
Schulze 02

Das ist die Reihenfolge im Index, wenn dieser auf "NAME+Str(Status)" gesetzt wurde. Wenn Du den Scope so baust, dass alle Namen berücksichtigt werden, die mit "M" beginnen (SCOPE_BOTH,"M"), bekommst Du die ersten 4 Datensätze. "Müller 02" folgt zwar "Müller 01", aber "Mytzek 01" folgt wiederum "Müller 02". Die einzige Chance, im Scope auch den Status zu berücksichtigen, hast Du, wenn Du den kompletten Namen verwendest, weil erst dann die dem Namen folgenden zwei Zeichen relevant werden. Dadurch ließen sich zwar in Deinem die Stati für eine einzelne Ticketnummer berücksichtigen, aber niemals ein bestimmter Status für unterschiedliche Nummern.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Scope über 2 Felder

Beitrag von Werner_Bayern »

Tom hat geschrieben:Indem Du den Status im Index nach vorne nimmst. Allerdings könntest Du dann nicht mehr nach speziellen Ticketnummern scopen. :wink:
Dann stimmt aber auch die Reihenfolge der Ticket-id nicht mehr... Es sollen ja alle Datensätze angezeigt werden, also nicht ein spezielles Ticket, sondern alle, ausser die mit Status 01.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Scope über 2 Felder

Beitrag von Werner_Bayern »

Tom hat geschrieben:Dadurch ließen sich zwar in Deinem die Stati für eine einzelne Ticketnummer berücksichtigen, aber niemals ein bestimmter Status für unterschiedliche Nummern.
Das habe ich befürchtet. Bleibt doch nur ein Filter? Das muss doch noch anders gehen? Ein Filter wird mir irgendwann zu langsam. Hab auch schon an den Skip-Block des Browse gedacht, aber das wird wohl auch nicht viel schneller gehen, als ein gewöhnlicher Filter.

Danke!
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Scope über 2 Felder

Beitrag von Herbert »

Werner,
Warum ein Scope?
Erstell doch einen Array mit dem gefundenen Inhalt. Anschliessend hast du keine Probleme, ganz klassisch die 01-er auszublenden oder sogar nachträglich aus dem Array zu entfernen.
Grüsse Herbert
Immer in Bewegung...
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: Scope über 2 Felder

Beitrag von Tom »

Es sollen ja alle Datensätze angezeigt werden, also nicht ein spezielles Ticket, sondern alle, ausser die mit Status 01.
Das wäre aber mit dem umgekehrten Index (Zusatzindex?) leicht machbar - vorausgesetzt, "01" ist der erste Status, also es gibt kein "00" oder sogar weniger. In Deinem Beispiel gibt es allerdings den Status "00" als "undefiniert".

Das Einlesen der Daten in ein Array unter Prüfung der Bedingung "status # '01'" hätte in etwa die gleiche Wirkung wie "SET FILTER TO !STATUS == '01'" und SET SMARTFILTER ON.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Scope über 2 Felder

Beitrag von brandelh »

ich nutze auch gerne arrays zum Puffern, aber solange der scope viele Datensätze ausschließt, ist der filter auch nicht langsam.
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: Scope über 2 Felder

Beitrag von Jan »

Werner,

ich kann Deine Aversion gegen Filter gut verstehen. Aber warum greifst Du nicht den Vorschlag von Tom auf? Scope auf die Tickets, und auf diese sehr schnell ausgefilterte Liste setzt Du dann einen (langsamen) Filter auf die Statusnummer? Da die menge der zu filternden Sätze durch den Scope drastisch verringert wurde, ist der Filter garnicht mehr so langsam.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Scope über 2 Felder

Beitrag von Tom »

Es geht auch noch einfacher: Bedingter Index auf "Status" mit dem Kriterium (FOR) "STATUS # '01'", Index als führend wählen, feddisch.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Scope über 2 Felder

Beitrag von Werner_Bayern »

Servus Jan,

weil ich den Scope auf die Ticket-id nicht brauche, es sollten grundsätzlich ja alle Tickets angezeigt werden, nur die mit Status 01 nicht, weil die dann "geschlossen" sind.

Wie Tom schon schrieb, es gibt leider auch den Status 00, also noch "undefiniert", weil noch nicht bearbeitet.

Werde wohl einen Filter nehmen.

Das mit dem Array gefällt mir nicht, handelt sich ja - wie immer - um eine Netzwerkanwendung (später auch WEB), brauche eine konsistente Datenhaltung. Mit einem Array ist das etwas aufwändig, Stichpunkte neue Sätze, geänderte Sätze, gelöschte, eingefügte etc. So mache ich per Thread alle x Sekunden einen oBrowse:refreshAll() und fertig.
es grüßt

Werner

<when the music is over, turn off the lights!>
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: Scope über 2 Felder

Beitrag von Tom »

Hallo, Werner.

Hast Du mein letztes Posting gelesen? Ein (zusätzlicher) konditionaler Index würde Dein Problem lösen, und er würde es außerdem erlauben, Scopes auf Ticketnummern zu setzen, wobei automatisch der Status "01" ausgeblendet bliebe. Du musst nur darauf achten, einen anderen führenden Index zu wählen, wenn Du alle Daten sehen willst - und den konditionalen Index trotzdem geöffnet zu halten, wenn Daten aktualisiert werden.
Herzlich,
Tom
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: Scope über 2 Felder

Beitrag von Tom »

Ach so. Wenn Du mit FOXCDX arbeitest, sollte ein Index, der eine große Datenmenge repräsentiert, um eine halbwegs eindeutige Information (z.B. die Datensatznummer) ergänzt werden, sonst ist die Aktualisierung der Indexe möglicherweise sehr, sehr langsam. Also z.B. INDEX ON STATUS+Str(RecNo(),10,0) FOR STATUS # '01'. Das sollte man grundsätzlich machen, wenn man mit CDX arbeitet und viele gleiche Schlüsselwerte in großen Tabellen hat. Und natürlich dann bei der Suche reflektieren - was meistens unproblematisch ist.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Scope über 2 Felder

Beitrag von Werner_Bayern »

Tom hat geschrieben:Es geht auch noch einfacher: Bedingter Index auf "Status" mit dem Kriterium (FOR) "STATUS # '01'", Index als führend wählen, feddisch.
Dann wäre aber die Sortierung nach Ticket-id wieder nicht möglich. Und, wenn der Benutzer dann das Häkchen bei "geschlossene Tickets anzeigen" setzt, würden die dann angezeigt, wenn man ein dbsetorder(0) macht?

An bedingte Indexe hab ich überhaupt nicht gedacht... Danke für den Hinweis!n Dann mache ich 2 Indexe, einen bedingt den zweiten normal, muss ich gleich mal testen.
es grüßt

Werner

<when the music is over, turn off the lights!>
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: Scope über 2 Felder

Beitrag von Tom »

Du kannst auch einen Index auf Ticketnr. setzen und darin die Bedingung verwenden. Einfach mehrere Indexe verwalten. Plattenplatz sollte ja kein Problem sein. :wink:
Herzlich,
Tom
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: Scope über 2 Felder

Beitrag von Tom »

Und, wenn der Benutzer dann das Häkchen bei "geschlossene Tickets anzeigen" setzt, würden die dann angezeigt, wenn man ein dbsetorder(0) macht?
Jep.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Scope über 2 Felder

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:Das mit dem Array gefällt mir nicht, handelt sich ja - wie immer - um eine Netzwerkanwendung (später auch WEB), brauche eine konsistente Datenhaltung.
gerade für WEB ist eine "dauerhafte" Verbindung ja nicht garantiert ... vielmehr muss man jedes mal eine neue Anfrage starten wie auch bei SQL.

ein "Filter" ist nun nicht grundsätzlich ein Problem ... es kommt auf die Datenmenge an und ein "Browse" kann auf einer Bildschirmseite nur wenige Zeilen anzeigen ...

bei einem "Browse", was es ja nicht als Windows Control gibt, ist das Problem der "Skipper".
dieser muss bei einem "Filter" evtl. durch 1000sende von Datensätzen "skippen" ... was Unsinn ist.

bei einer SQL Abfrage würde der "Filter" ja ein Resultset liefern womit man "direkt" ein Control (z.b. Listview) zur Darstellung füttern kann.

wenn du das nun auf DBF / Browse überträgst würde 01 gar nicht in der Liste erscheinen. ein Index könnte dann so aussehen

Code: Alles auswählen

INDEX ON FIELD->ticket + "-" + FIELD->id + IF(FIELD->status = 1,"J","N") + gn(FIELD->status, 2)"

SET SCOPE TO cTicket+cID+"N"
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Scope über 2 Felder

Beitrag von Werner_Bayern »

Servus Jimmy,

wie bereits geschrieben, ich brauche keinen Scope auf das Ticket / Ticket-ID.

Es sollen alle Datensätze in der Reihenfolge Ticket-ID angezeigt werden, deren Status nicht 01 ist. Ein

Code: Alles auswählen

set filter to .not. field->Status==01
wäre die "Lösung".
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Scope über 2 Felder

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:wie bereits geschrieben, ich brauche keinen Scope auf das Ticket / Ticket-ID.
Es sollen alle Datensätze in der Reihenfolge Ticket-ID angezeigt werden, deren Status nicht 01 ist. Ein

Code: Alles auswählen

set filter to .not. field->Status==01
wäre die "Lösung".
sicherlich könnte man "Set Filter"*** benutzen ... aber wie schnell ist es ?
***beachte SET OPTIMIZE

Die Frage wäre wie viele "01" in der Datenbank sind ... ähnlich wie mit vielen Deleted() wo der "Skipper" viel arbeiten muss.

ein SCOPE ist doch praktisch eine "Optimierung" eines "Filter" unter Verwendung eines Index.
ein (richtiger) Index mit (richtigem) SCOPE vermeidet die unnötige Arbeiten des "Skipper" welche das ganze langsam machen ( siehe DBU ).
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Scope über 2 Felder

Beitrag von Werner_Bayern »

Servus Jimmy, servus Tom,

ich habe jetzt in alle Indexe für diese Tabelle die for-Klausel mit eingebaut, so funktioniert es wie gewollt. Ein dbsetOrder(0) lässt die "gefilterten" Sätze dann auch wieder erscheinen. Einziger Wermutstropfen: Ist halt nicht sehr flexibel, wenn im Indexausdruck diese for-Klausel ist, weil ändert sich mal die 01 bei einem anderen Kunden auf eine andere Zahl, muss der Indexausdruck angepasst (was nicht aufwändig wäre) und alle Indexe neu erstellt werden.

Danke an alle!
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Scope über 2 Felder

Beitrag von Werner_Bayern »

AUGE_OHR hat geschrieben:Die Frage wäre wie viele "01" in der Datenbank sind ... ähnlich wie mit vielen Deleted() wo der "Skipper" viel arbeiten muss.
Immer mehr, weil es dann um geschlossene (= erledigte) Tickets geht. Deshalb habe ich den Vorschlag von Tom übernommen, weil das auf Dauer performanter sein sollte.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten