Ga naar inhoud
  • 0

snel naar een letter springen in een lijst


Bachje

Vraag

Vele programma's hebben de functie als je op een van de letters op je toetsenbord drukt dat er in een lijst gesprongen wordt naar het record, de regel die begint bij die lijst (total commander - waar ik veel mee werk - kan dat bijvoorbeeld)

in filemaker heb ik die functie in de lijst overzichten nooit gevonden.

Ik heb dat in een database (ooit nog met versie 5 ofzo) met veel adres gegevens eens geprobeerd door knoppen te maken van a t/m z en dan aan elke knop een script te hangen dat een selectie maakt op de eerste letter van de achternaam, en vervolgens de zaak sorteert. Dan heb je echter een selectie en zijn alle records die met andere letters beginnen niet meer zichtbaar.

Mogelijk heeft iemand anders dat al eens op briljante wijze opgelost maar mijn script kennis is iets te beperkt om er een fatsoenlijke oplossing voor te maken.

Wie heeft er suggesties?

 

Franc

Link naar reactie

13 antwoorden op deze vraag

Aanbevolen berichten

  • 0

Het is niet volledig wat je bedoelt, maar misschien is het toch nuttig.

Je kunt in de recente versies bij de veldopties "Automatisch aanvullen met eerder ingevoerde waarden" aanvinken. Als je dan een zoekopdracht ingeeft krijg je ongeveer het effect waarover je het hebt.

Link naar reactie
  • 0
script

zoekopdracht:eerste lettervan de naam

records sorteren op naam

ga naar eerste record

alle records tonen

records sorteren

Beste Harry

 

Iets dergelijks heb ik gedaan in mijn oude versie. Het nadeel is dat hij dan niet goed sorteert. Ik heb er bijvoorbeeld getrouwde vrouwen in zitten met een herhalend veld voor de tweede achternaam (daar moet op gezocht kunnen worden)

als je dan sorteert neemt hij dat mee. (ik weet het je kunt het uitzetten en allen op de eerste herhaling sorteren maar jammer genoeg werkt dat niet perfect)

 

dit is wat ik gedaan heb

 

Zoekopdracht uitvoeren [ Opgegeven zoekopdrachten: Records zoeken; Criteria: Themadagen::ACHTERNAAM: “a”]

[ Herstellen ]

Records sorteren [ Opgegeven sorteervolgorde: Themadagen::ACHTERNAAM; oplopend

Themadagen::VOORNAAM; oplopend ]

[ Herstellen; Geen dialoogvenster ]

Ga naar record/verzoek/pagina

[ Eerste ]

Alle records tonen

Records sorteren [ Opgegeven sorteervolgorde: Themadagen::ACHTERNAAM; oplopend

Themadagen::VOORNAAM; oplopend]

 

De dubbele sortering was nodig om te zorgen dat "cursor"op de eerste kaart van de letter (a in dit geval) na de sortering bovenaan stond

Het nadeel is tevens dat hiervoor dus 26 scriptjes moet maken voor elke letter van het alfabet één.

Ik was op zoek naar een snellere manier, iets met een variabele? en het zou handig zijn als dat kon via de letter op het toetsen bord.

Link naar reactie
  • 0
Harry: nadeel is dat je dan je current foundset kwijt bent...

 

Ik heb iets geprobeerd, op zich werkt het, maar het is ongeloofelijk traag ( en ik bedoel echt traag -> niet te gebruiken ), maar het is mss wel een mogelijke denkpiste indien iemand een manier vindt om dit sneller te doen gaan.

 

Voorbeeldje heeft wel FM10 nodig !

 

Beste Andries

 

heb nog geen FM10 :oops:

 

Franc

Link naar reactie
  • 0

Andries,

 

bedankt. Het gaat inderdaad in de richting van wat ik zocht.

 

Kun je uitleggen wat je doet?

Met name het stuk achter ga naar record/ verzoek enzovoort kan ik niet helemaal volgen

De loop snap ik maar ik begrijp niet goed waarom je dat doet. Dat zal wel met de vorige script stap te maken hebben neem ik aan?

 

Franc

Link naar reactie
  • 0

Eerst gok ik waar die letter zich zou bevinden. Hiervoor heb ik een zeer basis algoritme gemaakt. Bijvoorbeeld:

 

Als je 2600 records hebt en de letter is a ga dan naar de eerste record als de letter is b ga dan naar de 100ste record, enz.

 

 

Maar dit is enkel een gok, dit kan je nooit weten. Dus moet je checken waar je bent uitgekomen. En daarvoor dient de if en de loop ( dit kan allemaal veel beter, maar heb nu niet de tijd om dit te optimaliseren). De loop checkt waar we zijn uitgekomen.

 

Bijvoorbeeld, als we dus naar letter "B" willen gaan, zal het script je naar record 100 sturen als eerste gok en checken of dit gelijk of hoger is dan de letter B. Als we bijvoorbeeld op letter "C" al zijn uitgekomen, zal het script terugloopen tot we op de laatste record aankomen van letter "A".

 

Het vervolg van het script is een simpele "find/replace" op een veld die enkel de eerste letter van lastName neemt. Deze script stap zal ons naar de eerte record brengen waarvoor hij een match vindt.

 

Het eerste deel en de loop dient enkel en alleen om het allemaal wat sneller te doen lopen. Als je op de eerste record bent, en je doet enkel de "find/replace" script stap, en je zoekt naar "z", dan duurt het even eer hij aan het eind van de record lijst is.

Link naar reactie
  • 0

Andries en anderen,

 

De door jou voorgestelde optie was inderdaad erg langzaam (database met 5000 records)

Gezocht naar een andere oplossing.

ik heb nu dit

Alle records tonen
Variabele instellen [ $letter; Waarde:"k" ]
If [ IsEmpty ( $letter ) ]
Script afsluiten [ ]
End If
#
Ga naar veld [ Patienten::NAAM ]
Ga naar Zoeken [ ]
Veld instellen [ Patienten::NAAM; $letter ]
Zoekopdracht uitvoeren [ ]
Records sorteren [ Opgegeven sorteervolgorde: Patienten::NAAM; oplopend Patienten::VOORNAAM; oplopend ]
[ Herstellen; Geen dialoogvenster ]
Ga naar record/verzoek/pagina [ Eerste ]
Records/verzoeken vastleggen [ Bevestiging van gegevensinvoer overslaan; Geen dialoogvenster ]
Alle records tonen
Records sorteren [ Opgegeven sorteervolgorde: Patienten::NAAM; oplopend Patienten::VOORNAAM; oplopend ]
[ Herstellen; Geen dialoogvenster ]

 

Dit werkt snel en goed. Hij blijft keurig op de eerste record van de letter van het alfabet staan terwijl wel alle kaarten zichtbaar blijven.

Wat ik nu wil is dat in dit script niet de letter van het alfabet hard gecodeerd is maar word opgehaald als ik een knop indruk op de layout of een toetscombinatie indruk op het toetsenbord. Bijvoorbeeld ctrl "k" o.i.d.

Ik wil dus de regel: Variabele instellen [ $letter; Waarde:"k" ] veranderd hebben in iets dat om het even welke letter van het alfabet aan het script doorgeeft.

Ik heb geprobeerd dat met een verborgen veld en veld instellen te doen, met een extra script parameter onder de knop maar dat lukt niet, ook niet met een global.

Iemand suggesties?

 

ik heb overigens in mijn layout een rij knopjes met het alfabet waar ik het script aan wil koppelen

 

Franc

Link naar reactie
  • 0
Ik wil dus de regel: Variabele instellen [ $letter; Waarde:"k" ] veranderd hebben in iets dat om het even welke letter van het alfabet aan het script doorgeeft.

Je kunt hiervoor Get ( ScriptParameter ) gebruiken. Ieder knopje verwijst naar eenzelfde script alleen de script parameter veranderd.

Als je met toescombinaties wilt werken moet je de menustructuur aanpassen. Daar moet ik wel bij aantekenen dat combinaties met control of cmd (apple) al veel door filemaker zelf gebruikt worden. Als je niet wilt dat die vedwijnen moet je een andere combinatie kiezen (bijv. control shift + letter). Knoppen op de layout lijken mij al best voldoende trouwens.

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...