Count To

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Count To

Beitrag von Jan »

Gerade hab ich etwas gefunden, von dem ich nicht weiß: Ist das Dämlichkeit von mir, ist das ein Denkfehler, oder ist das ein Bug? Es geht um folgende Zeile:

Code: Alles auswählen

Count To nAnzahl For Feldname == nWert
Wenn ich das so codiere, dann rechnet die Zeile korrekt. Es wird gezählt, wie viele Datensätze es gibt, in denen im Feld "Feldname" der Wert "nWert" steht. Aber wenn ich statt "Feldname" schreibe: "cAlias->Feldname", dann wird praktisch ein LastRec() ausgeführt.

Wo liegt da der Fehler? Oder ist es heute Abend einfach nur schon zu spät?

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
soweit ich weiß, unterstützen diese "alten" Befehle keine Alias-Angabe!
Dies müßte dann mit cAlias->(DbEval(.... gelöst werden.
Gleiches gilt auch für Delete, SUM, AVERAGE, TOTAL, pack, zap, .... - da gibt es dann auch entsprechende Pendants.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Martin,

wenn das wirklich so ist, dann wäre meiner Meinung nach ein enstprechender Eintrag in der Dokumentation fällig. Wenn ich nicht genau gewusst hätte, was da hätte rauskommen müssen, woher hätte ich dann merken sollen, daß das Ergebnis falsch ist?

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
so war das doch - glaube ich - schon unter Clipper, oder?
Da gab es nämlich diese Form der Adressierung nicht in dem jetzigen Umfang - nur für die Felder...
Dafür gibt es unter Xbase++ ja sowohl Datenbankbefehle als auch Datenbankfunktionen - erstere müssen nach einem Select der entsprechenden Workarea ausgeführt werden und letztere können die Workarea vorangestellt bekommen...

Viele Grüße,
Martin
Zuletzt geändert von Martin Altmann am Mo, 10. Sep 2007 21:50, insgesamt 1-mal geändert.
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Martin,

wie das unter Clipper war weiß ich nicht mehr. Da habe ich aber, soweit ich mich erinnere, auch nicht so streng mit Aliasen gearbeitet. Also war mir das damals wohl noch ziemlich egal.

Dennoch denke ich, es sollte einen entsprechenden Eintrag in die Doku geben. Denn es gibt weder einen Compilier- noch einen Laufzeitfehler. Einfach nur ein falsches Ergebnis.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

auch unter Clipper konnte man das Feld mit dem Alias ansprechen, aber genau überlegen was passiert:

use MyDBF alias DB1 NEW
use XYDBF alias DB2 NEW

* selectiert ist DB2 ...

count to ... for DB1->Name="TEst"

geskipt wird durch DB2 (= selectiert) aber verglichen mit Feld aus DB1.
Wehe wenn die Feldnamen gleich sind und keine Fehlermeldung erscheint.

Bei deinem Beispiel hattest du noch cAlias->Feld, das müsste (cAlias)->Feld lauten.
Gruß
Hubert
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,

ich hatte vor kurzem mit dem Befehlt SUM ein ähnliches Problem. Hier kommt die Lösung.

http://www.xbaseforum.de/viewtopic.php?t=1639

Auszug aus der Doku zu SUM:
Beschreibung:
Der Befehl SUM berechnet die Summe eines oder mehrerer numerischer Ausdrücke aus den Werten der Datensätze in der aktuellen Workarea. Durch Angabe einer Bedingung oder der Anzahl von Datensätzen kann der Bereich für die Summierung eingeschränkt werden. Die Summe jedes numerischen Ausdrucks in <nExpression,...> wird einer Variablen in der Liste <VarName,...> zugewiesen.

Auszug aus der Doku zu COUNT:
Beschreibung:
Der Befehl COUNT zählt die Anzahl der Datensätze in der aktuellen Workarea, welche mit den angegebenen Bedingungen übereinstimmen. Der Zählbereich kann durch die Optionen NEXT oder REST eingeschränkt werden. Das Ergebnis wird der Variablen <VarName> zugewiesen.
: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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

genau das wollte ich sagen, er arbeitet immer in der aktuellen, auch wenn man in der FOR Bedingung auf eine andere verweißt. Somit wird für die Bedingungsprüfung eine andere Workarea verwendet, die Ergebnisse mehr oder minder vom Zufall bestimmt.

Die Befehle sind halt etwas unflexibel, daher gibt es ja oft DB... Funktionen (SKIP -> DBSKIP() ) und die Funktion zum ersetzen der Datenbankbefehle ist DBEVAL()
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Bertram,

ja, das habe ich auch gelesen.

Das Problem ist nur: Wenn man COUNT einsetzt MIT Alias, dann rechnet der Kommentarlos falsch. Das war ja mein Problem. Ich bin im korrekten Workarea, gebe aber dennoch den Alias an, und schon ist das Ergebnis falsch. Ohne irgendeine Rückmeldung, z. B. seitens des Compilers oder des Laufzeitsystems.

Jan
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 »

Jan,

ich bin mit SUM auch fast verzweifelt. Habe ich SUM mit Alias auf einem Datensatz ausgeführt der meiner FOR Bedingung entsprach, bekam ich ein Ergebnis. Dann habe ich nur die FOR Bedingung erweitert (der Datensatz auf dem ich SUM ausgeführt habe entsprach somit nicht mehr der FOR Bedigung) und als Ergebnis bekam ich den Wert 0.
Jetzt steht vor dem SUM ein dbselectarea("alias") und die Berechnung stimmt. ](*,)
Ich wünsche mir Funktionen wie alias->(dbsum()) oder alias->(dbcount()).
: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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Bertram,
Bertram Hansen hat geschrieben:Ich wünsche mir Funktionen wie alias->(dbsum()) oder alias->(dbcount()).
gibt es doch schon - im Prinzip :D
Schau Dir mal DbEval() an, damit kann man das umsetzen...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Hey Martin,

dann können wir doch gleich die Hälfte (mindestens) aller XBParts rausschmeißen. Die sind ohnehin mit Xbase++ geschrieben. Kann also auch jeder gerne selber entwickeln. :razz:

Aber ich kann Bertram schon verstehen: Wenn möglich greife ich auch gerne auf die Funktionen zurück. Bei den meisten Befehlen geht das ja auch, insbesondere die ganzen Db...()-Geschichten. Nicht, weil ich gerne die neue, modernen Sachen nutze (eher ganz im Gegenteil). Aber es hat meist einen ganz praktischen Grund. Die ersetzenden Funktionen sind meist flexibler, und sie sind im Aufruf meist auch stringenter. Bei den Befehlen beschlich mich manchmal einfach das Gefühl, hier wird diese Reihenfolge genommen, dort eine andere.

Jan
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: Count To

Beitrag von dtmackenzie »

Ist zwar ein ganz altes Thread, aber...
Es gibt anscheinend eine Funktion dbcount(), sie erwartet mindestens einen Parameter, es ist aber nicht klar, was für einen Typ er haben soll.
Zwar würde ich Martin im Normalfall Recht geben, dbeval() ist im Code ausreichend, aber im Debugger (Ausdruck-Inspektor) wäre dbcount() sehr hilfreich...
Viele Grüße,
David
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Count To

Beitrag von brandelh »

In der 2.0 Hilfe kann ich die nicht finden, eventuell im SYS ordner eine versteckte Funktion ?

Ich denke dass ein Suchbegriff sinnvoll wäre z.B. ein codeblock der die Suchbedingung festlegt, unter der die Funktion die Sätze zählt.
Oder war das nicht ein Beispiel für eine Anwendung zu dbeval() ?
Gruß
Hubert
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: Count To

Beitrag von dtmackenzie »

brandelh hat geschrieben: Mi, 06. Mai 2020 10:33 Oder war das nicht ein Beispiel für eine Anwendung zu dbeval() ?
Eben, man kann im Debugger keine Variable definieren wo das Codeblock das Ergebnis sammeln kann...
Viele Grüße,
David
Benutzeravatar
BJelinek
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 218
Registriert: Sa, 02. Jun 2012 20:57
Wohnort: 73257 Köngen
Hat sich bedankt: 9 Mal
Danksagung erhalten: 3 Mal

Re: Count To

Beitrag von BJelinek »

In der Hilfe von 2.0 unter DbRelease()
wird im Beispiel die FUNC DBCOUNT
erstellt mit dbeval()
Grüße
Bernd

Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Count To

Beitrag von brandelh »

bei komplexeren Sachen lege ich die in eine Funktion und die Funktion in den Codeblock, dann geht nicht nur der Debugger im Codeblock, sondern die Test sind auch einfacher zu machen (direkter Aufruf aus Testprogramm)
Gruß
Hubert
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: Count To

Beitrag von dtmackenzie »

Klar könnte ich in jede Anwendung eine triviale Funktion wie unten einfügen - dafür bedarf es nicht mal ein Codeblock.
Es geht mir aber darum, z.B. spontan im Debugger nachschauen zu können, wieviele Datensätze in einem Workarea vorhanden sind (wenn irgendwo weit entfernt im Code vielleicht Filter, Scope, Indexbedingungen u.s.w. gesetzt wurden).
Alles nur "wäre schön wenn"...
Alaska könnte theoretisch so viel machen um den Debugger in dieser Hinsicht leistungsfähiger zu machen (von dynamisch deklarierten Variablen bis hin zu einem "Workarea Explorer"), aber ich sehe schon ein, dass sie andere Prioritäten setzten.

Code: Alles auswählen

FUNC myDBCCOUNT()   // For use in debugger
LOCAL nSum
COUNT TO nSum
RETURN nSum
Viele Grüße,
David
Antworten