Ga naar inhoud
  • 0

Meervoudige zoekopdrachten op verschillende velden


TomB

Vraag

Geplaatst:

Ik heb een database met daarin een reeks radiobutton velden die bepaalde eigenschappen van het product aangeven.

 

Wat ik wil is een zoekfunctie die ook werkt met radiobuttons, maar waarin ik dan meerdere eigenschappen kan aanvinken, en die dan als meervoudige find requests worden behandeld.

 

Bvb. zoek alle producten met

- eigenschap 1 opties A, C en D

- eigenschap 2 opties B en D

- eigenschap 3 optie A

 

Ik heb al wel een ideetje over hoe ik dit kan scripten, maar het zou dan een tamelijk "lelijk" script worden met heel wat work-arounds voor probleemjes. Zo weet ik niet op voorhand hoeveel requests er zullen zijn, ieder veld heeft niet per se evenveel opties, niet elke eigenschap moet gebruikt worden in de zoekopdracht, e.d.

 

Maar bestaat er eventueel geen betere manier om zoiets te doen? Ik heb al wat zitten klooien met self-joins en relaties, maar zonder substantieel resultaat.

 

Alle hulp is welkom.

11 antwoorden op deze vraag

Aanbevolen berichten

  • 0
Geplaatst:

Mijn pogingen in deze opdracht zijn tot nader order vervloekt.

 

Wanneer ik dit script probeer te runnen

If[Players::SearchRegion[1] =/ ""]
 Copy [select;Players::SearchRegion]
 Go to Layout ["Player Specs"(Players)]
 Enter Find Mode []
 Paste [select; Players::Region]
 Perform Find[]
End If

 

crashed FM met een geheugenfout.

 

Dit is in FM8. FM7 voert het script zonder morren uit. De 8.5 heb ik helaas niet staan.

 

Bug in de 8? Iemand bekend mee?

  • 0
Geplaatst:

Je voorbeeld lijkt inderdaad niet de goede richting op te gaan.

 

Wat ik wil is een zoekfunctie die ook werkt met radiobuttons, maar waarin ik dan meerdere eigenschappen kan aanvinken, en die dan als meervoudige find requests worden behandeld.

 

Omschrijf je probleem eens wat helderder. Waarom is het bijvoorbeeld niet voldoende om meerdere find requests op te geven aan de hand van verschillende waarden van je radiobutton-velden? Dan heb je ook geen last van de beschreven problemen. Een voorbeeld van wat je wil zoeken werkt wat handiger dan zomaar een (stukje) script.

  • 0
Geplaatst:

Er vanuit gaande dat ik je code heb begrepen en het geval dat beide tabellen in hetzelfde bestand staan zou ik meer kiezen voor iets in de strekking van:

If[not IsEmpty(Players::SearchRegion[1])]
 Set Variabele [$$Zoek ; Players::SearchRegion]
 Go to Layout ["Player Specs"(Players)] 
 Enter Find Mode [] 
 Set Field [Players::Region ; $$Zoek] 
 Perform Find[] 
End If

 

Maar inderdaad mogelijk iets meer toelichting of een voobeeldbestandje posten helpt je wellicht wat verder.

  • 0
Geplaatst:
Je voorbeeld lijkt inderdaad niet de goede richting op te gaan.

Wat ik wil is een zoekfunctie die ook werkt met radiobuttons, maar waarin ik dan meerdere eigenschappen kan aanvinken, en die dan als meervoudige find requests worden behandeld.

Omschrijf je probleem eens wat helderder. Waarom is het bijvoorbeeld niet voldoende om meerdere find requests op te geven aan de hand van verschillende waarden van je radiobutton-velden? Dan heb je ook geen last van de beschreven problemen. Een voorbeeld van wat je wil zoeken werkt wat handiger dan zomaar een (stukje) script.

 

Okee, ik zal even proberen een voorbeeld te geven.

 

Tabel bevat volgende velden, ieder met een value list met radiobuttons (één optie per veld per record dus):

 

Kleur: geel / groen / blauw

Vorm: rond / vierkant / driehoekig

Materiaal: metaal / plastic / hout

 

Ik wil nu een subset van de record vinden met alle "geel" EN "rond" EN "metaal" records (simpel), EN alle "blauw" records (ongeacht "vorm" en "materiaal").

 

De gewenste layout heeft checkboxes die gebruik maken van de value lists "kleur", "vorm" en "materiaal". De bedoeling is dat de gebruiker de gewenste "opties" aanvinkt (iedere mogenlijke combinatie) en op een knop "vind" drukt om de gewenste subset weer te geven.

  • 0
Geplaatst:
Ik wil nu een subset van de record vinden met alle "geel" EN "rond" EN "metaal" records (simpel), EN alle "blauw" records (ongeacht "vorm" en "materiaal").

 

Dat is niet zo moeilijk. Technisch gezien voor je een find uit voor twee verschillende requests:

 

color="geel" AND vorm="rond" AND materiaal="metaal"

 

OR (nieuwe request)

 

color="blauw"

 

Wat je nu krijgt is alle gele ronde metalen producten, plus alle blauwe producten (ongeacht vorm of materiaal).

 

De crux zit 'm dus in het nieuwe request. Dat regel je - eventueel zelfs zonder script - door middel van een button met de functie new request. Als je verschillende requests ingevuld hebt mbv je formulier, druk je op een andere button: find.

  • 0
Geplaatst:

Inderdaad, de zoekopdracht is niet zo ingewikkeld, maar de uitvoering dmv checkboxes wel.

 

De bedoeling is dat er in één maal kan aangeduid worden wat gevonden moet worden, mét checkboxes dus.

  • 0
Geplaatst:

Dan script je dat:

 

Maak globals met een stuk of wat herhalingen:

 

gColor

gVorm

gMaterial

 

En laat je gebruiker deze mbv checkboxes aankruisen.

 

Script luidt alsvolgt:

 

set field(i;0)

enter find mode

do

set field(i;i+1)

set field(color;getRepetition(gColor;i)

set field(vorm;getRepetition(gVorm;i)

set field(material;getRepetition(gMaterial;i)

exit loop if [aantal repetities]=i

new request

loop

perform find

 

Maar volgens mij werkt het voorbeeld uit mijn vorige post net zo goed.

  • 0
Geplaatst:
Ik wil nu een subset van de record vinden met alle "geel" EN "rond" EN "metaal" records (simpel), EN alle "blauw" records (ongeacht "vorm" en "materiaal").

Om dit te doen heb je geen aankruisvakjes nodig: gebruik dezelfde layout met radio buttons en maak één request per gewenste combinatie. Voor bovenstaand voorbeeld worden dat er twee:

Geel/Rond/Metaal

Blauw

 

De gewenste layout heeft checkboxes die gebruik maken van de value lists "kleur", "vorm" en "materiaal".

Een leuk idee, maar in dat geval is vorige zoekopdracht niet mogelijk. Ik zou immers 'Geel' en 'Blauw' aanvinken en 'Metaal' maar dan is er geen relatie meer tussen 'Geel' en 'Metaal', snap je?

 

Ik heb beide mogelijkheden uitgewerkt. De eerste zit standaard in FileMaker en is dus eenvoudig. Voor de tweede werk ik omgekeerd: het script laat alles weg wat niet is aangevinkt. Daarvoor was een custom function nodig. Credits to Jonathan Stark:

Let ([
   list1 = list1 & Case ( Right ( list1 ; 1 ) ? ¶ ; ¶ );
   list2 = list2 & Case ( Right ( list2 ; 1 ) ? ¶ ; ¶ );
   list3 = Case( ValueCount ( list2 ) = 1 ; 
       Substitute ( ¶ & list1 ; ¶ & list2 ; ¶ )
   ;
       SubtractValues ( 
           Substitute ( ¶ & list1 ; ¶ & RightValues ( list2 ; 1 ) ; ¶ ) 
       ; 
           LeftValues ( list2 ; ValueCount ( list2 ) - 1 ) 
       ) 
   );
   result = list3
];
   result
)

Screenshot.jpg.2a3c6d0e9336d0641cfb96b35be6e803.jpg

Zoeken.fp7.zip

  • 0
Geplaatst:

Joris,

 

Ziet er erg leuk uit, maar het is nog niet wat ik hebben moet.

 

Eender welke optie overheerst de beperkingen van de anderen is wat ik moet hebben.

 

Dus wanneer ik in jouw tweede voorbeeld als kleur enkel rood kies en als materiaal hout krijg ik toch enkel maar de rode producten, maar ik moet dan feitelijk alle producten die van hout zijn mee in de gevonden set hebben.

 

Maar ik ben er zelf al zo goed als uit, en wonderwel is het nog een tamelijk "proper" script geworden :)

  • 0
Geplaatst:

En om het over een heel andere boeg te gooien ;-)

 

Waarom niet met filtervelden werken? Werkt over het algemeen veel sneller en gemakkelijker (daar je kan zien op wat je gefilterd hebt, terug alle records laten zien, enz...)

 

Zulke zaken los ik op door filtervelden te gebruiken en zo de zoekopdracht (script) te vervangen door relaties.

 

In bijlage een voorbeeldje...

filter.fp7.zip

  • 0
Geplaatst:

Ah ja vergeten te vermelden: in 1 filter kan je verschillende zaken selecteren door de shiftknop ingedrukt te houden ...

 

Indien je op verschillende zaken wil filteren in 1 filterveld!

 

Grtz

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...