Dbsetfilter() und DbEval()

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Dbsetfilter() und DbEval()

Beitrag von Manfred »

wenn man einen Dbsetfilter() macht, dann ist ein DbGotop() danach sehr angebracht, damit der Filter auch greift. Gilt das eigentlich auch für ein DbEval()? Das fängt doch immer automatscih am Anfang an und müßte doch dann ein internes DbGoTop() machen und ein zusätzliche DbGoTop() vorher überflüssig machen, oder?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Dbsetfilter() und DbEval()

Beitrag von Tom »

DbEval() wird immer für alle Datensätze der Workarea ausgeführt, berücksichtigt aber Filter und Scopes.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Dbsetfilter() und DbEval()

Beitrag von Manfred »

das heißt, man muß kein Dbgotop() vorher setzen, wenn ein Filter vorher gesetzt wurde, weil DbEval das automatisch macht?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Dbsetfilter() und DbEval()

Beitrag von Tom »

So isses.
Und in der Zeit, in der Du diese Fragen stellst und auf ihre Antworten wartest, hättest Du das mit vier Zeilen Code ein Dutzend mal ausprobieren können. :wink: (Zudem steht es m.E. in der Doku, aber ich habe gerade keine griffbereit.)
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Dbsetfilter() und DbEval()

Beitrag von Manfred »

Das hätte ich Tom, aber ich hätte auch meine Frage anders stellen können. Ich hatte mir das schon gedacht, aber ich wollte eigentlich wissen, ob jemand evtl. seine Erfahrung damit gesammelt hat und der meinung ist, das es nicht 100%ig klappt.
Aber mal so nebenbei gefragt, welcher Teufel reitet Dich eigentlich in letzter Zeit? Seit wann wird hier im Forum darauf geachtet, ob dumme Fragen gestellt werden? Das war bisher nie der Fall....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Dbsetfilter() und DbEval()

Beitrag von Tom »

Teufel? Nein. Wirke ich so unentspannt? Wenn ja - falscher Eindruck. Das Gegenteil ist der Fall.

Ich wollte nur mal darauf hinweisen, dass es manchmal einfacher und schneller ist, etwas auszuprobieren.

BTW: Beim Einsatz der ADS habe ich die Erfahrung gemacht, das ein DbGoto() bei aktivem Filter zuweilen fehlschlägt, wenn nicht vorher ein DbGoTop() stattgefunden hat. Dies nur am Rande.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Dbsetfilter() und DbEval()

Beitrag von Manfred »

alles klar.
Mein Problem ist nämlich derzeit, das in diesem Zusammenhang ein Programm etwas komische Ergebnisse liefert und ich war mir nicht wirklich sicher, ob das nicht evtl. damit zusammenhängt. Deshalb meine etwas ungelenke Frage hier.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Dbsetfilter() und DbEval()

Beitrag von Werner_Bayern »

Tom hat geschrieben: Do, 03. Mai 2018 13:25 DbEval() wird immer für alle Datensätze der Workarea ausgeführt, berücksichtigt aber Filter und Scopes.
Jein:
DbEval( <bBlock>, ;
[<bForCondition>], ;
[<bWhileCondition>], ;
[<nCount>], ;
[<xRecordID>], ;
[<lRest>]
) --> NIL

Parameters
<bBlock>
<bBlock> contains a code block which is executed for each data record.

<bForCondition>
<bForCondition> is an optional code block containing a condition as a logical expression. <bBlock> is only executed for the data records where <bForCondition> returns the value .T. (true).

<bWhileCondition>
<bWhileCondition> is an optional code block containing a condition as a logical expression. DbEval() terminates as soon as <bWhileCondition> returns the value .F. (false).

<nCount>
The optional argument <nCount> specifies the number of records for which <bBlock> is evaluated beginning with the current data record.

<xRecordID>
The optional argument <xRecordID> specifies a record ID (for DBF files it is the record number). If <xRecordID> is specified, the evaluation of <bBlock> begins with the specified record.

<lRest>
The logical value <lRest> optionally specifies whether <bBlock> is evaluated for all records of a work area (<lRest>==.F.), or only for the records from the current to the last record (<lRest>==.T.). The default value is .F. (false), indicating that <bBlock> is evaluated for all data records.
Siehe Parameter in fetter Schrift.
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: Dbsetfilter() und DbEval()

Beitrag von AUGE_OHR »

Manfred hat geschrieben: Do, 03. Mai 2018 13:56 Mein Problem ist nämlich derzeit, das in diesem Zusammenhang ein Programm etwas komische Ergebnisse liefert und ich war mir nicht wirklich sicher, ob das nicht evtl. damit zusammenhängt.
die "komischen" Ergebnisse könnten auch was mit der "Optimierung" zu tun haben ...
gruss by OHR
Jimmy
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: Dbsetfilter() und DbEval()

Beitrag von Tom »

@Jimmy: Du immer mit Deinen Legenden. Das hat mit Sicherheit nichts mit dem Problem zu tun.

@Werner: Jein? Die Ausgabe dieses Testcodes erzeugt zweimal - wie von mir erwartet - die gleichen Ergebnisse. DbEval() kann an Filter und Scope der Workarea nicht vorbei. Du kannst nur noch weiter einschränken.

Code: Alles auswählen

FUNCTION Main()
LOCAL aStru := {{'NUMBER','N',5,0},{'LOGIC','L',1,0},{'TEST','C',30,0}}, nCtr
SET EXCLUSIVE ON
DbCreate('test',aStru)

USE test NEW
INDEX ON number TO test
FOR nCtr := 1 to 100
  APPEND BLANK
  REPLACE number WITH RecNo()
NEXT

DbSetScope(SCOPE_TOP,20)
DbSetFilter({||Int(number/2)==number/2})
DbEval({||FieldPut(2,.T.)})
DbGoTop()
CLEAR
DO WHILE !Eof()
  ?? Str(number,5,0)
  DbSkip(1)
ENDDO
? Replicate('-',80)
DbClearFilter()
DbClearScope()
DbGoTop()
DO WHILE !Eof()
  IF logic
    ?? Str(number,5,0)
  ENDIF
  DbSkip(1)
ENDDO

CLOSE DATA
RETURN NIL
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: Dbsetfilter() und DbEval()

Beitrag von AUGE_OHR »

Tom hat geschrieben: Fr, 04. Mai 2018 10:37 @Jimmy: Du immer mit Deinen Legenden. Das hat mit Sicherheit nichts mit dem Problem zu tun.
Ich rede von KEINEM Mythos sonst würde es nicht so viele PDRs geben !

immer wenn ich FILTER höre muss ich zunächst an die Xbase++ "Optimierung" denken.
besonders auffällig bei DBFNTX wenn Zeichen > 128 z.b München oder Nürnberg ... #-o

nur weil Problem bei einem User nicht auftreten heisst es noch lange nicht das es bei einem anderen User, sogar auf dem selben PC, dann auftreten können :!:
gruss by OHR
Jimmy
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: Dbsetfilter() und DbEval()

Beitrag von Tom »

Hi, Jimmy.

Ist schon richtig, aber dann würde es nicht nur an dieser Stelle Probleme geben. Manfred hat schon ziemlich komplexes Zeug am Start, und wenn er Optimize und Rushmore und all das aktiv hätte und (versehentlich) in riskanter Weise nutzen würde (also von den noch übrigen Fehlern betroffen wäre), würden wir über andere Probleme reden. Und größere und häufigere.

Bei dieser Gelegenheit abermals. Smartfilter funktioniert gut. 8)
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: Dbsetfilter() und DbEval()

Beitrag von Werner_Bayern »

Tom hat geschrieben: Fr, 04. Mai 2018 10:37 @Werner: Jein? Die Ausgabe dieses Testcodes erzeugt zweimal - wie von mir erwartet - die gleichen Ergebnisse. DbEval() kann an Filter und Scope der Workarea nicht vorbei. Du kannst nur noch weiter einschränken.
Alles gut. Mein Hinweis bezog sich auf die Möglichkeit der Einschränkung der zu verarbeitenden Datensätze. Das war ja auch die hauptsächliche Frage von Manfred. Deshalb auch mein Hinweis:
Siehe Parameter in fetter Schrift.
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: Dbsetfilter() und DbEval()

Beitrag von AUGE_OHR »

Tom hat geschrieben: Fr, 04. Mai 2018 11:59 Bei dieser Gelegenheit abermals. Smartfilter funktioniert gut. 8)
ok, da sind die 3 PDR geschlossen.

bei OPTIMIZE stehen aber noch einige als offen da
PDR_OPTIMIZE.jpg
PDR_OPTIMIZE.jpg (187.52 KiB) 8017 mal betrachtet
gruss by OHR
Jimmy
Antworten