eXPress++ und DC_FindBrowse

Moderator: Moderatoren

Antworten
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

eXPress++ und DC_FindBrowse

Beitrag von Bertram Hansen »

Hallo,

ich möchte gerne mit der Funktion DC_FindBrowse von Roger Einträge in einer Spalte zu finden, auch wenn der bisher eingegebene Suchbegriff nicht komplett mit einem Eintrag übereinstimmt (Teilsuche in einer Zeichenkette).

Laut der Doku kann an der 7. Stelle eine Suchcodeblock hinterlegen.
Seek string code block. User input buffer is passed to this code block and return value of code block is used for the seek.
ex: {|c|Right(Space(7)+Alltrim(cString),7)}
Das Beispiel von Roger klappt nicht, weil er cString nicht kennt.

Code: Alles auswählen

//         element  Header   Width Index  Prompt     Prefix for AutoSeek   Seek string code block 
AADD(aData, {    1, "Nummer",    9,    1, "Nummer" , Nil                 , Nil                } )
AADD(aData, {    2, "Datum" ,   11,    2, "Datum"  , Nil                 , Nil                } )
AADD(aData, {    3, "Name"  ,   31,    3, "Name"   , Nil                 , {|c|Right(Space(30)+Alltrim(c),30)}  } )
Die eigentliche Funktion rufe ich so auf:

Code: Alles auswählen

   lOk := DC_FindBrowse( aData, nil, nil, nil, 120, 14, ;
          "Alle Aufträge eines Kunden" ,;
          .t., .t., .f., aArray, @nPointer, nil, nil, nil, nil, nil, nil, gcBrowseFont, .T. )
In aArray sind meine Daten aus der Tabelle.

Aber mit dem Codeblock klappt das nicht. Wenn der korrekte Suchbegriff eingegeben wurde, findet er den Eintrag.
Wie muss der Codeblock bei den Datentypen Nummer, Datum und Zeichenkette aussehen. In dem Array verwende ich ebenfalls die Datentypen Nummer, Datum und Zeichen.
Hat jemand einen Tipp für mich.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hallo Betram,

ich habe mir das gerade angesehen. Das ist ein Fehler in express, den ich Roger gleich melden werde (ich habe auch ein kleines Beispiel erstellt).

Zunächst dachte ich nur an einen Doku-Fehler, aber da steckt mehr dahinter. Wenn die Datenquelle eine DBF ist (kein Array), dann nimmt Roger das 8. Array-Element als Suchblock (bei einem Array als Datenquelle den 7. so wie dokumentiert). Aber er verwendat den 8. Parameter auch als PICTURE der Browser-Spalten, d. h. wenn Du Deinen Suchblock als 8. Parameter übergibst, kommt schon ein Absturz beim Aufbau des Browsers.

Ich habe auch noch weiter geschaut, die Logik beim Suchen mit einem übergebenen Suchblock ist ebenfalls falsch.

Also faktisch kann man nicht mit einem übergebenen (eigenen) Suchblock arbeiten.

Ich mache jetzt gleich einen Eintrag in Roger's Webboard...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hallo Betram,

noch eine Kleinigkeit: Willst Du wirklich eine Teilstring-Suche machen oder reicht Dir, dass das Browse automatisch richtig positioniert, wenn man den ANFANG eines Suchbegriffes eingibt? Das funktioniert bei mir nämlich auch ohne diesen Codeblock.

Das ist mein Testprogramm, mit deklariertem Suchblock stürzt es schon bei der Erzeugung des Browsers ab:

Code: Alles auswählen

#include "dcdialog.ch"
#include "appevent.ch"

/*
function Appsys()
return NIL
*/

procedure main()

// This work
local afields := { { {|| wg->wg}, "WG", 3, "WG", "WG"}  , ;
                   { {|| wg->BEZ}, "Bezeichnung", 20, , "Bezeichnung"} }


/*
// this not
local afields := { { {|| wg->wg}, "WG", 3, "WG", "WG", , , {|cSearch| substr(cSearch, 2) } }, ;
                   { {|| wg->BEZ}, "Bezeichnung", 20, , "Bezeichnung"} }
*/


  use wg new exclusive
  index on wg to wg

  DC_FindBrowse( aFields, nil, nil, nil, 85, 20, ;
                'Find Record by AutoSeek ', , , , "WG" )


RETURN
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Beitrag von Bertram Hansen »

Hallo Markus,

es reicht aus, wenn man den Anfang eines Suchbegriffes eingibt. Ich habe mir auch in der Zwischenzeit den Quellcode von Roger angesehen. Das mit der Suche habe ich hinbekommen, indem ich bei dem Ascan auch nach >= suche. Weil ich auch noch ein paar individuelle Änderungen haben wollte, habe ich mir den Quellcode von Roger geschnappt und in einer eigenen Funktion auf meine Wünsche angepaßt. Was ich z.B. auch vermisse, ist die Option FREEZELEFT bzw. FREEZERIGHT. Wenn Roger die Funktion anpaßt, dann könnte er das eventuell auch noch hinzufügen.
Danke für Deine Hilfe.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hi Bertram,

habe jetzt erst gesehen, dass Du in einem Array suchst...

Ich verwende dc_findbrowse nur mit DBFs. Da funktionierte auch die Teilsuche...

Ich habe in Roger's Forum gepostet, aber zunächst keine wirkliche Antwort erhalten. Offensichtlich hat er sich mein Beispiel nicht wirklich angeschaut... Ich warte jetzt mal ab, ob er die Bugs fixed, ansonsten werde ich mir die Funktion nachbauen...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Juergen
UDF-Programmierer
UDF-Programmierer
Beiträge: 92
Registriert: Di, 19. Dez 2006 19:37
Wohnort: Düsseldorf
Kontaktdaten:

dc_findbrowse

Beitrag von Juergen »

Hallo Bertram,

benutze doch DC_BrowseAutoSeek.

Gruß Jürgen.

Hier ein Beispiel mit Quickbrowse:

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "SetCurs.ch"
#include "Xbp.ch"
#include "dcmsg.ch"
#include "dcdialog.ch"

//inkrementelles Suchen mit "Quick-Browse": 16.07.04, 05.10.04 HJA

PROC appsys()
RETURN


PROC MAIN()
LOCAL GetList := {}, oBrowse, aFields, aHeaders
LOCAL cSeek := Space(20), oSeek, lOK:=.f., nRec:=0

DC_LangSet(DCLANG_GERMAN)
SET DEFA TO d:\shop\dbf
USE kas10 EXCLUSIVE ALIAS 'ARTI'
Set Index to 'kas10_02', 'kas10_05'
OrdSetFocus('KAS10_02')
SET DEFA TO

aFields := { 'ARTI->ar002', ;
'ARTI->ar003', ;
'ARTI->ar0031', ;
'ARTI->ar004', ;
'ARTI->ar013'}

aHeaders := { 'WG','Art-Nr.','Bezeichng.','Bez.','EK'}

@ 1,1 DCSAY 'Suche:' GET cSeek SAYRIGHT PICT '@!' GETOBJECT oSeek;
KEYBLOCK {|a,b,o|DC_BrowseAutoSeek(a,o,oBrowse,@cSeek,NIL,'001')} //,nRec:=arti->(Recno())
@ 1, 50 DCPUSHBUTTON CAPTION 'mit WG ' SIZE 8,1.5 ;
ACTION {|a,b,o|oBrowse:GoTop(),if(o:caption='mit WG ',;
EVAL({|o|o:SetCaption('ohne WG'),OrdSetFocus('Kas10_05')},o),;
EVAL({|o|o:SetCaption('mit WG '),OrdSetFocus('Kas10_02')},o)),;
oBrowse:RefreshAll(), cSeek := Space(20), oSeek:SetData(),SetAppFocus(oSeek)};
TOOLTIP "Sortierfolge ändern"


@ 3,1 DCQUICKBROWSE ALIAS 'ARTI' SIZE 66,20;
OBJECT oBrowse;
FIELDS aFields HEADERS aHeaders;
STYLE XBP_STYLE_3D;
COLOR GRA_CLR_BLUE, GRA_CLR_WHITE ;
DATALINK {|o|nRec:=o:getData(),DC_ReadGuiEvent(DCGUI_EXIT_OK,getlist)};
ITEMMARKED {||nRec:=oBrowse:getData()};
NOHSCROLL;
CURSORMODE XBPBRW_CURSOR_ROW

DCREAD GUI FIT ADDBUTTONS;
TITLE 'Quick-Browse: Suchen im Artikelstamm.' to lOK

IF lOK
arti->(DbGoto(nRec))
DC_MsgBox(,,{arti->ar002+arti->ar003+" "+arti->ar0031},"Ausgewählter Artikel:")
ENDIF

RETURN
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Beitrag von Bertram Hansen »

Hallo Jürgen,

bisher kannte ich die Funktion DC_BrowseAutoSeek() noch nicht. Es gibt auch kein Beispielprogramm in der Demo von Roger, aber er kann ja auch nicht zu allen Funktionen ein fertiges Beispielprogramm erstellen.
Leider fehlen mir bei dieser Funktion einige Eigenschaften, die bei der Funktion DC_FindBrowse() dabei sind (z.B. Sortieren einer Spalte).
Trotzdem vielen Dank für den Tipp.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Juergen
UDF-Programmierer
UDF-Programmierer
Beiträge: 92
Registriert: Di, 19. Dez 2006 19:37
Wohnort: Düsseldorf
Kontaktdaten:

DC_BrowseAutoSeek() (2)

Beitrag von Juergen »

Hallo Bertram,

hier ein Beispiel mit einem Array.

Gruß
Jürgen


......

@ 1,1 DCSAY 'Suche:' GET cSeek SAYRIGHT PICT '@!' ;
KEYBLOCK {|a,b,o|DC_BrowseAutoSeek(a,o,oBrowse,array,element)}

......
@02,02 DCBROWSE oBrowse DATA array SIZE 46,21 NOHSCROLL PRESENTATION aPres;
CURSORMODE XBPBRW_CURSOR_ROW ;
DATALINK {||DC_ReadGuiEvent(DCGUI_EXIT_OK,getlist)};
EVAL {||_Sort(array,1,.t.)};
SORTSCOLOR GRA_CLR_WHITE, GRA_CLR_RED;
SORTUCOLOR GRA_CLR_WHITE, GRA_CLR_DARKGRAY;
SORTUPBITMAP BITMAP_RD_UP_RED;
SORTDOWNBITMAP BITMAP_RD_DOWN_RED;
NODESCENDTOGGLE


......
DCBROWSECOL ELEMENT array[1] "Name " PARENT oBrowse WIDTH 10;
SORT {|a,n,o|_Sort(array,1,.t.),element:=1} LEFTBUTTON DEFAULT
DCBROWSECOL ELEMENT array[2] "Name2" PARENT oBrowse WIDTH 10;
SORT {|a,n,o|_Sort(array,2,.t.),element:=2} LEFTBUTTON

......


PROCEDURE _Sort ( aArray, nColumn, lDesc )

IF lDesc=NIL
lDesc:=.f.
ENDIF

IF lDesc
ASort( aArray,,,{|x,y|x[nColumn] > y[nColumn]} )
ELSE
ASort( aArray,,,{|x,y|x[nColumn] < y[nColumn]} )
ENDIF

RETURN
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Beitrag von Bertram Hansen »

Hallo Jürgen,

dein Beispiel sieht ganz gut aus. Ich werde mal versuchen das bei mir einzubauen. Danke!
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Antworten