Ich versuche einen Browser zu erstellen, der es ermöglicht, eine DBF ohne Index zu sortieren, und in dem je nach ausgewählter Spalte gesucht werden kann.
Das Ganze funktioniert eigentlich ganz prima, doch leider sucht das Programm immer in der 1. Spalte.
Kann mir jemand weiterhelfen?
Gruß
Günter Früholz
Code: Alles auswählen
#include "dcdialog.ch"
#include "appevent.ch"
#INCLUDE "GRA.CH"
#INCLUDE "xbp.CH"
function Appsys()
return NIL
procedure main(cDatei)
Local aFelder := {}
Local nFelder, oScreen
local cSuche := space(20)
local oBrowse
local n := 1
Local bSort := {|a,n|_SortSpalte(aFelder,n)}
use (cDatei) new ALIAS DATEI
nFelder := DATEI->(FCount())
oScreen := DC_WaitOn("Lese Datei " + cDatei)
DATEI->(DbEval({||_Add2Array(aFelder, nFelder)}))
DC_Impl(oScreen)
@ 1,1 DCGET cSuche ;
GETEVAL {|oXbp|oXbp:keyboard := {|a,b,o|_XSample_44(a,b,o,oBrowse,n)} }
@ 2.5,1 DCBROWSE oBrowse DATA aFelder SIZE 60,20;
CURSORMODE XBPBRW_CURSOR_ROW; //Cursor zeigt komplette Zeile an
EVAL {|o|o:ItemSelected := {||aData := oBrowse:getData(),dc_qout(aData[1])}}
FOR i := 1 TO nFelder
DCBROWSECOL ELEMENT i HEADER FieldName(i) PARENT oBrowse;
SORT bSort
NEXT
DCREAD GUI FIT TITLE "Dbf2Array " + cDatei ADDBUTTONS
DATEI->(DbCloseArea())
return
Static Function _Add2Array(aArray, nFelder)
Local i, aRecord := {}
FOR i := 1 TO nFelder
aAdd(aRecord, FieldGet(i))
NEXT
aAdd(aArray, aRecord)
return (NIL)
Static Function _SortSpalte(aFelder, nSpalte)
ASort( aFelder,,,{|x,y|x[nSpalte] < y[nSpalte]} )
dc_qout("spalte")
dc_qout(nSpalte)
return (nSpalte)
STATIC FUNCTION _XSample_44( a, b, o, oBrowse,n )
LOCAL aArray := oBrowse:cargo[5], nElement
nElement := AScan(aArray,{|x|Upper(x[n])=Upper(Alltrim(o:editBuffer()))})
dc_qout(n)
dc_qout(nElement)
*dc_wait()
IF nElement > 0
IF IsMemberVar(oBrowse,'arrayElement') // eXPress++ 1.7 or later
oBrowse:arrayElement := nElement
ENDIF
oBrowse:cargo[4] := nElement
oBrowse:refreshAll()
ENDIF
RETURN nil