• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Mein GCVote-Filter Makro

baby hübner

Geomaster
Moin,

ich bin erst seit zwei Wochen registrierte Nutzer von GSAK, dies aber mit zunehmender Begeisterung. Da den Makros aus dem Netz immer irgendeine Funktionalität gefehlt hat, hab ich angefangen, mir meine eigenen bescheidenen Makros zusammenzustümpern. Eine von den Funktionalitäten, die mir bis jetzt gefehlt habe, war die Möglichkeit, eine Datenbank einfach und flexibel nach Bewertungen und Anzahl der Bewertungen zu filtern. Die entsprechenden Daten hatte ich mir zuvor mittels GCVoteGrabber von GCVote gezogen und in die UserData-Spalten geschrieben.
Da ich bis jetzt ansonsten nur Workarounds gefunden habe, stelle ich hier mal mein Makro allen Interessierten zur Verfügung und zur Diskussion. Bitte bedenkt: Ich bin noch Anfänger.

GUI:


Anmerkungen für Nutzer:
-die Werte müssen mittels GCVoteGrabber in die Userdata-Spalten geschrieben werden und zwar...
-... die Durchschnittsbewertung (oder der Median) in Userdata1
-... die Anzahl der Wertungen in Userdata2
-MinCount: Mindestanzahl der Bewertungen
-MinVote: Mindestwertung, Dezimaltrennzeichen: Punkt! (z.B. 3.7)
-Filter wird auch auf zuvor durch Standardfilter erzielte Ergebnisse angewandt (gilt nicht für Ergebnisse durch Makrofilter)
-hinterher nochmal nachfiltern geht nicht. Natürlich kann man für die Anzeige UserFlags setzen und diese dann für weiteres Filtern benutzen

Anmerkungen für Makroprogrammierer:
Die Schwierigkeit war, dass die UserData-Spalten strings sind. Ein sinnvolles Filtern nach Wert erfordert aber Zahlen. Mein Vorgehen war also
1. Sortieren nach Count
2. Jeden Count-Wert einzeln aufsteigend mit Val() in eine Zahl umwandeln
3. Sobald MinCount erfüllt ist für den Rest Macroflag setzen
4. Alle macrogeflaggten Caches anzeigen
5. Sortieren nach Vote
6. Jeden Vote-Wert einzeln aufsteigend mit Val() in eine Zahl umwandeln
7. Alle Macroflaggs löschen, die nicht mindestens MinVote sind
8. Alle macrogeflaggten Caches anzeigen
Nicht sehr elegant, oder? Ich habs schon mit "MFILTER where=... " versucht. Da könnte man dann die Bedingungen via AND verknüpfen. Letztlich bin ich aber an der Umwandlung String->Zahl gescheitert.
Irgendwelche Vorschläge?

Desweiteren würde ich gerne die "Select a saved Filter"-ComboBox reinbringen. Der User könnte dann einfach den GCVote-Filter mit abgespeicherten Filtern kombinieren. Gibt es eine Möglichkeit an die Einträge (z.B. als Array) zu gelangen und damit eine eigen ComboBox initialisieren?

bh

p.s. geht es wirklich nicht, dass ich dass Makro hier direkt uploade? wollte es hier erst verbessern, bevor ich es ins GSAK-Forum stelle.

edit: Ok. Geht doch. Aber nur gezipt.
 

Anhänge

  • GCVoteCountFilter.zip
    845 Bytes · Aufrufe: 20

Biggi_H

Geomaster
Hi,

habe Dein Makro nicht ausprobiert, aber mit dem GC-Vote grabber kann man sich die Werte auch in User-Sort speichern lassen. (ohne Komma-Angabe)
Dann kann ich in GSAG einfach filtern: User-Sort größer 33 etc.
Fürchte also, Dein Makro ist relativ überflüssig ...

Gruß Biggi
 
OP
baby hübner

baby hübner

Geomaster
Ja, mit der Usersort Option vom Grabber habe ich anfangs auch rumgespielt. Richtig zufrieden war ich allerdings nicht.
Was mir daran fehlt:
1.
Es ist nicht schnell möglich die Mindestzahl der gevoteten Caches im Filter zu ändern. Dazu muss man (wenn ich mich nicht irre) den Grabber erst nochmal komplett durchlaufen lassen. Mal ganz davon abgesehen, dass dies eine unnötige Last für den GCVote Server darstellt, ist diese Vorgehensweise bei größeren Datenbanken nicht gerade flott.
2.
Der Trick mit den mit zehn multiplizierten Votes um das Komma wegzubekommen ist wie ich finde eine Notlösung, halt dass was ich einen Workaround bezeichne. Das eigentliche Problem wird nicht angegengen. Ich schreibe mir zB mit einem anderen selbstgeschriebenen Makrochen die GCVote-Infos in die Short Description. Auf meinem Oregon steht dann ganz oben beim ersten Aufruf von nem Cache: "GCVote: 3.7 (25) ...". Wenn da "...37 (25) steht siehts irgendwie doof aus (mMn).

Aber gut. Vielleicht hab ich das Rad ja wirklich neu erfunden. Darum habe ich ich es ja auch nicht in den gepinnten GSAK-Makro-Thred gestellt.
Ich möchte vielmehr nochn bisschen über die Makrosprache lernen und mein Makro dafür als Diskussionsgrundlage nehmen. Wenn was für die reinen Makrouser dabei abfällt, um so besser.

In diesem Sinne:
1. Hat jemand eine Idee, wie man sinniger (d.h. mit mit SQL) die DB filtern kann?
2. Komme ich irgendwie an die Namen der gespeicherten Filter ran, um damit eine eigene ComboBox zu initialisieren.

Noch was: Ich bin ja neu hier im Geoclub. Daher: Sollte dies das falsche Forum sein (vielleicht weil es mehr für Makrouser und nicht so sehr für Makroprogrammierer ist), sagt bescheid. Dann geh ich euch nicht mehr auf den Wecker.

Gruß,
bh
 
OP
baby hübner

baby hübner

Geomaster
:^^: Ok, Frage 2 konnte ich mir inzwischen selbst beantworten.
Man kommt an die Filternamen ran mit dem Command sysinfo() und dem Parameter Filters. Zurückgegeben wird eine durch Semicola separierte Liste:

Code:
$FilterListe=sysinfo("Filters")
...
# Ab hier die Def. der GUI:
<Data> VarName=$form
...
Name = Combobox1
  ...
  Values = $FilterListe
...
<enddata>

In der ersten Zeile schreibe ich die aktuelle Filterliste in die Variable "$FilterListe".
In der achten Zeile wird diese Liste über das Attribut "Values" in die Combobox geschrieben.
:hallo: bh
 

London Rain

Geowizard
Dein Vorgehen klingt kompliziert. Ich hab deinen Code jetzt nicht angesehen, aber bei mir schaut das so aus:

Code:
MFILTER expression=val(alltrim($d_User2))>=val($votes) and val(alltrim($d_UserData))>=val($average)
 

London Rain

Geowizard
Hab mal das ganze Makro angehängt zum Anschauen. Das operiert immer auf einem schon gesetzen Filter, wenn es denn einen gibt.

Die Userfelder in den MFILTER-Statements sind natürlich auf die eigenen anzupassen. Man gann die aber sogar mit MACSETTINGS (glaub so hieß das) auch aus der GcVoteGrabber-Settingsdatei auslesen. Das wird dann aber ein bisschen komplizierter.
 

Anhänge

  • GcVoteFilter.zip
    1,1 KB · Aufrufe: 20
OP
baby hübner

baby hübner

Geomaster
Kompliziert? Das war von hinten durch die Brust ins Auge mit einem Umweg durch den gesamten Magen-Darmtrakt...

Aber die Betonung liegt auf "war". Dank Dir ist es schön elegant, läuft es jetzt wesentlich schneller und der Code sieht nicht mehr halb so monströs aus.

Zu meiner Ehrenrettung kann ich höchstens anführen, dass das expression-Statement in der Hilfe als "deprecated" eigestuft ist (s. GSAK-Hilfe). Ich hatte fast genau Deinen Mfilter benutzt, nur mit "Where=...". Im where-Statement kann man aber anscheinend nicht val() benutzen.

Ich räum jetzt noch ein wenig den Code auf und dokumentier brav, dann stell ich mein fertiges Werk ins Forum.

Ach ja: Apropos von hinten durch die usw.
Warum benutzt Du nicht SQLSort zum sortieren? Bei mir sieht es so aus:
Code:
SQLSort OrderBy=Userdata Asc, User2 Asc
Aber vielleicht habe ich Deine Sort-Funktion noch nicht gerallert.

Noch mal vielen Dank!
:hallo: bh
 

London Rain

Geowizard
Wie? Echt nicht? Läuft das echt nicht mehr wenn man Expression durch Where ersetzt? Kann ich ja fast nicht glauben. Da stand einfach nur Expression drin weil der Filterausdruck noch aus ner Zeit kam wo es Where nicht gab, glaub ich. Ich hatte da jedenfalls keine weiteren Hintergedanken bei.
 

London Rain

Geowizard
Nachtrag: Die Sortierfunktion sortiert als erstes Kriterium nach der Anzahl an 5-Sternebewertungen, dann nach 4-Sternebewertungen, usw. Glaube das geht nicht einfach mit SQLSort weil man ja erstmal die 1-2-3-4-5 Bewertungsübersichten auseinandernehmen muss.
 
OP
baby hübner

baby hübner

Geomaster
Ok. Jetzt habe ich es kapiert.
Bringt es Deiner Meinung nach einen deutlichen Mehrwert an Information?
Oder ist es eher ein kleine Zusatzspielerei? Dahingehend ist es auf jeden Fall schick.
 

London Rain

Geowizard
Ich find dass da tendentiell eher die Qualitätsreihenfolge stimmt als wenn ich primär nach Durchschnitt und sekundär nach Anzahl sortiere. Ein 4,9er kommt bei dem anderen System immer viele, viele Stellen hinter einem 5,0er auch wenn nur ein Voting fehlen würde um es zur 5,0 zur runden. Das ist bei meinem Sortieren nicht so. Perfekt ist keines der beiden würd ich sagen. :)
 
London Rain schrieb:
Ich find dass da tendentiell eher die Qualitätsreihenfolge stimmt als wenn ich primär nach Durchschnitt und sekundär nach Anzahl sortiere. Ein 4,9er kommt bei dem anderen System immer viele, viele Stellen hinter einem 5,0er auch wenn nur ein Voting fehlen würde um es zur 5,0 zur runden. Das ist bei meinem Sortieren nicht so. Perfekt ist keines der beiden würd ich sagen. :)
Ich würde Anzahl und Bewertung eher falten wollen. Das beide Zahlen werden gewichtet miteinander zu einem Wert verknüpft. So wäre ein 5er mit wenigen Bewertungen schlechter als ein 4 mit vielen.
 
OP
baby hübner

baby hübner

Geomaster
Es gäbe da bestimmt noch andere Systeme. So könnte man auch explizit nach Caches suchen die stark polarisieren. Irgendwas müssen die ja haben...

Aber letztendlich sind das nur (Statistik-)Spielerein. GCVote kann nur einen ersten Anhaltspunkt bieten, welche Caches man näher unter die Lupe nehmen sollte. Wer sich zu sehr an ein Bewertungssystem klammert - und sei es noch so ausgefuchst - , spielt den Waldorfcachen nur Argumente in die Hände.

Ich mag mein System, weil schnell ist. Zur Not lass ichs mehrmals Durchlaufen und pass die Parameter nach und nach an. Aber danach heißt es "Makromodus aus" und "Gehirnmodus an".

:hallo:
bh

Anhang: Aktuelle Version
 

Anhänge

  • MyGCVoteFilter0_02.zip
    1,4 KB · Aufrufe: 17

London Rain

Geowizard
Ich hab ja auch nicht gesagt dass das für jeden am besten ist und jeder das jetzt für toll befinden und nutzen muss. :)
 
OP
baby hübner

baby hübner

Geomaster
Sollte meinerseits auch keine Kritik sein.
Ich wollte nur zeigen, dass wir GCVote-Nutzer Caches nicht nach Bewertungen "vermessen".

Dein Makro ist toll. Ich hab viel daran gelernt. Noch mal Danke!

Ich wollte mit diesem Thread einen direkten Austausch über das Programmieren von Makros anwerfen. Du warst der erste der richtig mitgemacht hat.

Ob eine Lösung nun was Sinnvolles, eine Fingerübung oder andere Sichtweise darstellt, ist mir erstmal nicht so wichtig. Hauptsache es ist lehrreich (...und da nenn ich andere Waldorfschüler ;D )

:hallo:
bh
 

olfi

Geocacher
baby hübner schrieb:
1.
Es ist nicht schnell möglich die Mindestzahl der gevoteten Caches im Filter zu ändern. Dazu muss man (wenn ich mich nicht irre) den Grabber erst nochmal komplett durchlaufen lassen. Mal ganz davon abgesehen, dass dies eine unnötige Last für den GCVote Server darstellt, ist diese Vorgehensweise bei größeren Datenbanken nicht gerade flott.
Du kannst das Feld UserSort auch ohne Abfrage von GCVote aktualisieren, wenn du auf den Knopf Update 'UserSort' drückst.

baby hübner schrieb:
2.
Der Trick mit den mit zehn multiplizierten Votes um das Komma wegzubekommen ist wie ich finde eine Notlösung, halt dass was ich einen Workaround bezeichne. Das eigentliche Problem wird nicht angegengen. Ich schreibe mir zB mit einem anderen selbstgeschriebenen Makrochen die GCVote-Infos in die Short Description. Auf meinem Oregon steht dann ganz oben beim ersten Aufruf von nem Cache: "GCVote: 3.7 (25) ...". Wenn da "...37 (25) steht siehts irgendwie doof aus (mMn).
Das Feld UserSort ist leider das einzige UserFeld, das einen numerischen Wert (nach dem man sortieren/filtern kann) aufnimmt und dann auch nur Ganzzahlen.

Ciao, Olfi
 
Oben