Jump to content
  • 0

Meervoudige zoekopdrachten op verschillende velden


TomB

Question

Posted

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 answers to this question

Recommended Posts

  • 0
Posted

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
Posted

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
Posted

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

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
Posted

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

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
Posted

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
Posted

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...