Tabellen dynamischj sotieren

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Mirco
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 143
Registriert: Di, 03. Feb 2009 15:47
Wohnort: Viersen
Kontaktdaten:

Tabellen dynamischj sotieren

Beitrag von Mirco »

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
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
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

Beitrag von Rolf Ramacher »

Hi Mirco,

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
die Function Sortiere sieht so aus:

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
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

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 ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

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.
em ... äh ... wie kann er denn Suchen / "Filter" ohne Index = Sortierung ?
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.
Index Dateien werden im Pflichten Heft definiert und man kann ja bis zu 255 TAG(s) haben.
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
Mirco hat geschrieben:Und guten Rutsch ;)
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.
gruss by OHR
Jimmy
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: Tabellen dynamischj sotieren

Beitrag von UliTs »

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 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 :idea:
Dies kann man sicher allgemeingültig programmieren, sofern gültige oder by-Ausdrücke je Spalte bekannt sind. :D
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
ramses
Der Entwickler von "Deep Thought"
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

Beitrag von ramses »

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
Valar Morghulis

Gruss Carlo
Antworten