Hallo Leute,
mal eine kurze Frage: Wir haben einen Browser (tbxBrowse). In 80 % der Fälle hängt eine DBF Tabelle dahinter (über die ACE Klasse von Tobax). In den restlichen 20 % eine SQL Tabelle.
Der Kunde kann nun auf eine Spalte klicken. Diese wird nun makiert und es lässt sich in ihr Suchen / Filtern. Nun möchten wir, dass bei einem Doppelklick auf die Spalte die Tabelle nach dieser Spalte / Feld sotiert wird.
Was seht ihr für Möglichkeiten, dass zu realisieren? Man könnte natürlich für jede Spalte einen Index anlegen (beim ersten Mal sotieren). Da diese Sotier-Funktion allerdings in viiielen Programmteilen benutzt werden sollen (in allen), würde sich da eine Menge Indexe anhäufen.
Bei SQL-Tabellen gibt es natürlich die ORDER BY Klausel, aber auch hier wäre es intersannt zu wissen, ob man die Tabelle vielleicht sotieren kann, ohne den SQL Befehl neu aufzurufen (da die Sotier-Funtkion ja allgemein in der Basisbrowser Klasse eingebaut werden soll).
Immer her mit den Ideen =)
Und guten Rutsch
Gruß
Mirco
Tabellen dynamischj sotieren
Moderator: Moderatoren
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1931
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Tabellen dynamischj sotieren
Hi Mirco,
ich mache dies mit xbpbrowse
die Function Sortiere sieht so aus:
ich mache dies mit xbpbrowse
Code: Alles auswählen
oBrowse := GuiBrowseDb( oDlg:drawingArea, {80,100}, {650,300} )
FOR i=1 TO FCount()
cField:=FieldName( i )
oBrowseCol:=oBrowse:addColumn(FieldBlock(cField),,aSpalt[i],,)
oBrowseCol:Heading:LbClick := &("{||Sortiere("+Ltrim(Str(i,5,0))+"),oBrowse:RefreshAll()}")
NEXT i
Code: Alles auswählen
#include "dmlb.ch"
Function Sortiere(nPos)
Local cName:=""
cName:=TmpVkProt->(FieldName(nPos))
Index on &cName tag 1 to (cHeimat+"\TmpVkProt.cdx")
oEingStatic:setCaption(cEingabeText+aSpalt[nPos])
* oSleSuche:Clear()
oSleSuche:dataLink := {|x| IIf( x==NIL, cArtnr, cArtnr := x ) }
oSleSuche:editable:=.t.
Do Case
Case nPos=1
oSleSuche:bufferlength:=8
Case nPos=2
oSleSuche:bufferlength:=2
Case nPos=3
oSleSuche:bufferlength:=4
Case nPos=5
oSleSuche:bufferlength:=9
Case nPos=6
oSleSuche:bufferlength:=3
Case nPos=14
oSleSuche:bufferlength:=1
Case nPos=15
oSleSuche:bufferlength:=4
Case nPos=18
oSleSuche:bufferlength:=6
Case nPos=19
oSleSuche:bufferlength:=2
Otherwise
oSleSuche:editable:=.f.
EndCase
oSleSuche:Configure()
oSleSuche:setdata()
SetAppFocus(oSleSuche)
Return Nil
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Tabellen dynamischj sotieren
Hi,
ich habe dafür die anzuzeigende Ergebnismenge in ein Array geladen und
einem XbpQuickBrowse() zugeordnet. Dieses Array kann man leicht mit
asort() sortieren und refreshAll() zeigt es dann an.
Das geht natürlich nur bei relativ kleinen Datenmengen (in dem Programm kommen nicht mehr als 100 Datensätze ins Array).
Bei einem Browser könntest du die zu sortierenden Teilstrings in ein Array laden, das auch die jeweilige Satznummer enthält.
Nun müsstest du dieses Array wie gewünscht sortieren und die SKIP Blöcke so umstellen, dass diese den nächsten Satz
nicht per dbSkip() sondern über das Array ermitteln und direkt ein dbgoto() machen.
Ich meine sowas schon mal gesehen zu haben ... hast du die Wissensbasis durchsucht ?
In meiner Prof. Sub. gibt es auch noch den Quellcode von XbpSortedQuickBrowse(), aber den fand ich "etwas verwirrend" und
habe lieber meinen eigenen geschrieben
ich habe dafür die anzuzeigende Ergebnismenge in ein Array geladen und
einem XbpQuickBrowse() zugeordnet. Dieses Array kann man leicht mit
asort() sortieren und refreshAll() zeigt es dann an.
Das geht natürlich nur bei relativ kleinen Datenmengen (in dem Programm kommen nicht mehr als 100 Datensätze ins Array).
Bei einem Browser könntest du die zu sortierenden Teilstrings in ein Array laden, das auch die jeweilige Satznummer enthält.
Nun müsstest du dieses Array wie gewünscht sortieren und die SKIP Blöcke so umstellen, dass diese den nächsten Satz
nicht per dbSkip() sondern über das Array ermitteln und direkt ein dbgoto() machen.
Ich meine sowas schon mal gesehen zu haben ... hast du die Wissensbasis durchsucht ?
In meiner Prof. Sub. gibt es auch noch den Quellcode von XbpSortedQuickBrowse(), aber den fand ich "etwas verwirrend" und
habe lieber meinen eigenen geschrieben
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12910
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Tabellen dynamischj sotieren
em ... äh ... wie kann er denn Suchen / "Filter" ohne Index = Sortierung ?Mirco hat geschrieben:Der Kunde kann nun auf eine Spalte klicken. Diese wird nun makiert und es lässt sich in ihr Suchen / Filtern.
Nun möchten wir, dass bei einem Doppelklick auf die Spalte die Tabelle nach dieser Spalte / Feld sotiert wird.
Index Dateien werden im Pflichten Heft definiert und man kann ja bis zu 255 TAG(s) haben.Mirco hat geschrieben:Was seht ihr für Möglichkeiten, dass zu realisieren? Man könnte natürlich für jede Spalte einen Index anlegen (beim ersten Mal sotieren). Da diese Sotier-Funktion allerdings in viiielen Programmteilen benutzt werden sollen (in allen), würde sich da eine Menge Indexe anhäufen.
mit FLock() kann nun zur Laufzeit ein SUBINDEX zum "aktiven" Index / "Filter" lokal erzeugt werden.
Teilmengen durch "Filter" (Scope) pflege ich, wie Hubert, in ein Array zu übernehmen
aber bitte nicht "wörtlich" nehmen ... hier in Hamburg ist z.Z. Tau-Wetter ( +3° ) aber um 24:00 soll es wieder unter 0° werden.Mirco hat geschrieben:Und guten Rutsch
gruss by OHR
Jimmy
Jimmy
-
- 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: Tabellen dynamischj sotieren
Hallo Mirco,
ich vermute, Ihr greift auf die Tabellen über den ADS-Server zu, richtig?
Ganz allgemein die Sortierung nach anzuklickenden Spalten (automatisch) durchzuführen, gibt bei Spalten, deren Wert mittels Funktionsaufrufen und/oder aus mehreren Feldern zusammengesetzten Spalten sicher Probleme.
Wenn Du eine halbwegs allgemeingültige Lösung haben solltest, wäre ich sehr daran interessiert.
-
Als Idee hätte ich nur:
Die RecNo der SQL-Tabelle kann man übrigens mit Hilfe der RowId bestimmen. Ist Dir das bekannt
Uli
ich vermute, Ihr greift auf die Tabellen über den ADS-Server zu, richtig?
Ganz allgemein die Sortierung nach anzuklickenden Spalten (automatisch) durchzuführen, gibt bei Spalten, deren Wert mittels Funktionsaufrufen und/oder aus mehreren Feldern zusammengesetzten Spalten sicher Probleme.
Wenn Du eine halbwegs allgemeingültige Lösung haben solltest, wäre ich sehr daran interessiert.
-
Als Idee hätte ich nur:
- die Tabelle als SQL-Statement in Zeichenform im Browser speichern
darüber zuzüglich "order by"-Klausel UND RecNo eine neue SQL-Tabelle erstellen
diese und die ursprüngliche Tabelle mit Hilfe eines oTable:OnDataChange CodeBlocks über die RecNo miteinander verknüpfen
Die RecNo der SQL-Tabelle kann man übrigens mit Hilfe der RowId bestimmen. Ist Dir das bekannt
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Tabellen dynamischj sotieren
Hallo Mirco
vielleicht solltest du noch erwähnen wieviele Datensätze in der DBF vorhanden sind. Je nach der Satzzahl musst du eine Unterschiedliche Strategie wählen, was bei 100 Sätzen noch geht ist bei 500'000 Sätzen unmöglich.....
Gruss Carlo
vielleicht solltest du noch erwähnen wieviele Datensätze in der DBF vorhanden sind. Je nach der Satzzahl musst du eine Unterschiedliche Strategie wählen, was bei 100 Sätzen noch geht ist bei 500'000 Sätzen unmöglich.....
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo