Skulle du vilja kunna göra ”flerval” i ett formulär i QGIS? Det är inte svårt, men det är en process som kräver flera steg för att fungera, så det kan upplevas som lite dolt.
För det första så behöver du en ”källa” där du hämtar dina valbara värden.
Här skapar jag en tabell utan geometri i ett GeoPackage. Här placerar jag alla värden jag vill skall vara valbara i mina andra lagers attribut. Som exempel skapar jag fälten frukt, transportmedel och kaffe. Tabellen fyller jag sedan med värden.
Det kan vara enklare att ha en tabell per värde, men det här kommer också att fungera, med lite filter för att få bort alla fält med ”NULL” värden.
I formulärinställningarna för det lager som skall redigeras så väljer man Value Relation som widget och pekar ut tabellen från tidigare med lämpliga nyckel- och värdefält. Här använder jag samma fält för båda, men om man vill så kan man i värdetabellen ha olika fält för dessa.
För att inte få med alla fält med ”NULL” i så läggs ett filter till som testar om värdet i fältet (exempelvis ”kaffe”) är skilt från ett tomt textfält (!= ”). Jag har testat med NOT NULL men det fungerar inte. Jag kan tänka mig att det beror på att det inte är fältvärdet som testas direkt, utan värdet från fältet som string. Då är det bara ”, eller en tom sträng som fungerar.
Om man använder flervalsalternativet så skapas en lista i attributtabellen med dessa val. Om man skall hantera dessa data vidare så får man vara medveten om detta.
Det går att göra mer med denna widget typ. Exempelvis kan ett val styra vilka val som går att göra i ett annat fält, men här blir det ännu lite mera komplicerat om man vill ha kvar endast en tabell.
I tabellen finns tillåtna kombinationer av byggnad, våning och rum. I Value Relation så pekar man som vanligt ut kolumner kopplat till det fält som skall redigeras.
Sedan lägger man till ett filter som baseras på vilka val som gjorts i tidigare fält med current_value(’fält’) där man testar om detta stämmer med det värde som finns i ”fält” från värdetabellen.
Men…
Filtret tar inte hänsyn till om det är en dubblett från tidigare. Den enkla vägen runt detta är att ha en tabell för byggnader, en för våningar och en för rum. Samtliga dessa måste även ha ett ”id” som kan användas i tabeller på ”lägre nivå”. Det går fortfarande att använda samma fält som värdet för detta, men det måste vara unikt.
I mitt fall behöver jag skapa två nya tabeller. En med byggnader och våningar, och en med enbart byggnader. Tricket är att det endast skall finnas en rad för varje värde man vill skall vara valbart. Nästa bekymmer blir att utforma ett filter som fungerar för alla variationer…
Detta är mindre problem om värden i nivån under en annan bara finns där, och inte som värde under en annan nivå. I mitt fall har jag en första våning i alla byggnader…
Jag kan delvis komma runt detta genom att skapa en extra kolumn med byggnadsnamn, där jag endast listar en uppsättning av varje. Vilket kan vara det enklaste sättet att komma runt problemet på den första nivån, men för valet av våningar fungerar det inte.
Jag lyckas inte heller lösa detta med filteruttryck, så det sätt jag använder för att komma runt problemet är att ha en tabell med möjliga våningsalternativ där det även finns ett attribut med en text som består av en lista med alla byggnader som kan ha detta alternativet.
Då kan jag använda string_to_array() samt array_contains() för att testa om byggnaden har den aktuella våningen som valbart alternativ.
Det blir som sagt betydligt enklare om man ”bara” har värden som är unika hela vägen ner i kedjan av attributvärden, men om man inte har det så går det att komma runt och ändå skapa ett dynamiskt formulär för användarna.
Allt detta hade gått att undvika med ett ”Make Unique” alternativ i inställningen för widgeten. Men något sådant alternativ är inte exponerat i inställningarna. Frågan är hur svårt det skulle vara att plocka fram detta i kommande versioner av QGIS?