Tabellen filteren in DriveWorks voor gevorderden
Met DriveWorks Design Automation automatiseer je repetitieve ontwerptaken. In deze blog leg ik uit hoe je de volgende functies in DriveWorks gebruikt:
- De functie Indirect()
- ‘Combo Box’-optie ‘Clear Selection Allowed’
- De ‘Text Box’-optie ‘Text (Override Rule)’
Deze blog is voor gevorderde DriveWorks gebruikers die ervaring hebben met kennisregels opstellen.
In de voorgaande blog over Tabellen gebruiken in DriveWorks Solo of Pro beschrijf ik een opzet waarmee je gebonden bent aan de keuze volgorde: Eerst Type, dan Materiaal, waarmee dan de prijs wordt gevonden.
De methode uit de vorige blog helpt je niet om bijvoorbeeld eerst de laagste prijs te kiezen. Maar in deze blog leg ik je uit hoe je meer geavanceerde functies gebruikt.
Ik ga verder met de voorbeeldtabel van de vorige blog:
Volgorde-afhankelijk
Wanneer niet afhankelijk van keuze bent en niet weet wat je eerste keuze is, moet je kunnen switchen tussen de functies ListAllDistinct en ListAllConditionalDistinct (besproken in eerdergenoemde blog)
De Item formulering van ‘Prijs’, die afhankelijk was van de voorgaande keuzes zag er ongeveer zo uit:
Formulering |
Uitleg formulering |
ListAllConditionalDistinct( DwLookupKeuzeCombinaties1, 3, 1, HandvattypeFilterReturn, 2, MateriaalFilterReturn ) |
Functienaam Tabelnaam, Nummer opzoekkolom Nummer Handvattype-kolom, Gekozen Handvattype Nummer Materiaal-kolom, Gekozen Materiaal |
Zou ik willen beginnen met de prijs te kiezen, dat zou de formulering er zo uit zien:
Formulering |
Uitleg formulering |
ListAllDistinct( DwLookupKeuzeCombinaties1, 3 ) |
Functienaam Tabelnaam, Nummer opzoekkolom |
Twee verschillen dus:
- De filter conditions vallen weg
- ListAllConditionalDistinct wordt ListAllDistinct
Hiervoor gebruik ik (mijn favoriete) functie: Indirect()!
Combo Box keuze leeg maken
We moeten de pull-down menu keuzes leeg kunnen laten (of maken). Dit kan door de Combo Box optie ‘Clear Selection Allowed’ op True’ te zetten. Hiermee start de ‘Combo Box’ als leeg en kun je de optiekeuze leeg maken door met je rechtermuis op de combobox ‘Clear Selection’ te kiezen
Indirect()
Indirect() voert een uit ‘text strings’ samengevoegd commando uit.
Onderstaande stappen laten zien hoe ik de formulering ‘omwerk’ naar de uiteindelijke formulering:
Normale Formulering |
ListAllConditionalDistinct( DwLookupKeuzeCombinaties1, 3 ,1, HandvattypeReturn ,2, MateriaalReturn ) |
In de Indirect hieronder zie je hoe ik het commando uitvoer opgebouwd losse “text strings”:
Indirect() formulering |
Indirect( "ListAll" & "Conditional" & "Distinct(“ & "DwLookupKeuzeCombinaties1, 3" & ",1, HandvattypeReturn" & ",2, MateriaalReturn" & ")" ) |
Nu de condities en het commando zijn opgesplitst kan ik er IF() condities aan toevoegen:
Indirect() met IF() |
Indirect( "ListAll" & If( And( HandvattypeReturn="" , Materiaal2Return="" ) , "", "Conditional" ) & "Distinct(“ & "DwLookupKeuzeCombinaties1, 3" & If( HandvattypeReturn="", "", ",1,HandvattypeReturn" ) & If( MateriaalReturn="", "", ",2,MateriaalReturn" ) & ")" ) |
Indirect() met IF() wanneer HandvattypeReturn ="" én Materiaal2Return ="" |
Indirect( "ListAll" & If( And( HandvattypeReturn="" , Materiaal2Return="" ) , "", "Conditional" ) & "Distinct(“ & ”DwLookupKeuzeCombinaties1, 3" & If( HandvattypeReturn="", "", ",1,HandvattypeReturn" ) & If( MateriaalReturn="", "", ",2,MateriaalReturn" ) & ")" ) |
De uitkomst als normale formulering: ListAllDistinct(DwLookupKeuzeCombinaties1, 3) |
Indirect() met IF() wanneer HandvattypeReturn ="" én Materiaal2Return < >"" |
Indirect( "ListAll" & If( And( HandvattypeReturn="" , Materiaal2Return="" ) , "", "Conditional" ) & "Distinct(“ & ”DwLookupKeuzeCombinaties1, 3" & If( HandvattypeReturn="", "", ",1,HandvattypeReturn" ) & If( MateriaalReturn="", "", ",2,MateriaalReturn" ) & ")" ) |
De uitkomst als normale formulering: ListAll Conditional Distinct(DwLookupKeuzeCombinaties1, 3, 2, MateriaalReturn) |
Hiermee wordt dus het volgende verwezenlijkt:
- filter condities verdwijnen wanneer de filterkeuzes leeg zijn
- Wanneer alle filterkeuzes leeg zijn, verandert ‘ListAllConditionalDistinct’ in ‘ListAllDistinct’
Voor meer gedetailleerde uitleg over Indirect(): https://docs.driveworkspro.com/Topic/Indirect
Uiteindelijke Item formulering HandvattypeFilter:
Uiteindelijke Item formulering MateriaalFilter:
Uiteindelijke Item formulering PrijsFilter:
Gefilterde Data
Zoals je hierboven ziet zijn de pull-down menu’s veranderd van naam:
Niet Handvattype, Materiaal en Prijs maar HandvattypeFilter, MateriaalFilter en PrijsFilter.
Dat is nodig omdat je filterkeuzes ook leeg kan laten. Daarom heb ik naast de filters een ‘Text Box’-en gemaakt: HandvattypeFilter, MateriaalFilter en PrijsFilter.
De ‘Text Boxes’ worden gevuld met de ‘Text Box’-optie ‘Text (Override Rule)’, waarin ik de waardes laat zien wanneer iets is gekozen wordt of wanneer er maar een keuze overblijft.
Zo worden de regels voor ‘Text (Override Rule)’ op de achtergrond ingesteld:
Het Resultaat: Formuliergedrag met volgorde-onafhankelijke filters
Starten met ‘Prijs’-filter (bij de laagste prijskeuze is maar een combinatie mogelijk):
Starten met ‘Materiaal’-filter (De goedkoopste variant van staal):
Starten met ‘Handvattype’-filter (De goedkoopste klink):
Conclusie
De standaard functie formulering laat het niet toe om een filtering uit te schakelen. De Indirect() functie biedt hiervoor een oplossing. En: Ja, de ‘rules’ of kennisregels worden wat complexer,
(vandaar de titeltoevoeging …voor gevorderden), maar het werkt uiteindelijk wel zoals gewenst:
Onafhankelijk van de volgorde van filteren.