Visning av portaldata i fleranvändarsystem

Tråden skapades och har fått 8 svar. Det senaste inlägget skrevs .
1

Hej,
har vridit och vänt på ett problem ett tag nu, och tvekar om det finns en bra lösning på det.

Bakgrund
Vi använder Filemaker server för en artikelnummerdatabas med elektronikkomponenter när vi utvecklar elektronik. Nuvarande versionen är uppdelat i två fönster - ett fönster som visar information för en given artikel och ett fönster där användaren kan söka och välja i en lista med komponenter. Fördelen med att ha sökningen i ett eget fönster är att en användares sökresultat inte påverkar någon annans sökresultat.

Nackdelen med två-fönster lösningen är att det är "kladdigt" att hålla reda på två fönster samt att det innebär att värdefull skärmyta står oanvänd. Jag vill gärna byta till ett fönster och lägga söklistan i en portal till höger om artikelinformationen.

Hur göra?
För en enanvändarlösning är det enkelt att söka - ett sök-script går igenom varje artikelnumer i databasen och sätter ett lämpligt fält (till exempel RECORD:SHOW) till "1". Fältet RECORD:SHOW matchas mot ett nyckelfält (förslagsvis KEY:SEARCH RESULT) som är en global variabel med värdet "1" - denna relation används sedan för att visa information i sökportalen.

Men hur göra för ett fleranvändarsystem? Så fort jag ändrar värdet på RECORD:SHOW för en användare så slår det igenom till andra användare, med resultatet att alla användare får samma sökresultat. Såvitt jag vet är det bara globala fält samt variabler som är unika per användare - ett fält slårt igenom till alla användare så fort det uppdaterats.

Hade jag kunnat matcha en relation så att relationen visar alla poster vars nyckelfält innehåller ett visst värde så hade detta kunnat lösas genom att matcha användarens användarnamn mot en lista som visar en lista med användare som använder en viss post (denna lista uppdateras för varje sökning). Såvitt jag vet är detta inte möjligt.

Någon som har förslag på hur detta skulle kunna lösas?

mvh /Mikael

Hmmm... Jag har nog en lösning som fungerar, vet dock inte hur effektiv den är:
Skapa en tabell som enbart lagrar sökresultat - kalla den ARTICLE SEARCH RESULTS. Den innehåller följande fält:
ARTICLE NUMBER
USER NAME

Strategin är att skapa en uppsättning sökresultat för varje användare genom att söka i artikelnummer databasen, ta bort eventuella tidigare sökresultat för användaren i ARTICLE SEARCH RESULTS och sedan skapa en (ny) lista med artikelnummer för användaren. Sökresultatet presenteras sedan i portalen i huvudfönstret, som tidigare.

Metadata kopplad till artikelnumret visas via en relation mellan ARTICLE SEARCH RESULTS samt artikelnummerdatabasen.

Någon som har något annat förslag som kan vara elegantare och/eller snabbare?

mvh /Mikael

Har du någon skärmdump?

Vilken version av FM?

Vi kör FM9; jag kan inte ordna en dump just nu, men skall försöka ordna det imorgon - lösningen beskriven ovan fungerar, men är lite långsam när sökresultatet är uppåt 2000 poster.

/Mikael

Jag är svaret skyldig på en beskrivning av lösningen - skall försöka ordna detta imorgon.

mvh /Mikael

Vet du vad jag kommit på, du är nog på jakt efter en sk portal filter funktion med en sökruta ovanför portalen. Den skulle fungera så att du har en portal med alla dina artiklar i från början, tills dess du börjar skriva några tecken i en artikelnamn eller i ett artikelnummer och lämnar sök-fältet.

Skriver du tex "Ola A" i sökfältet ovanför en portal som visar poster från en tabell med massor med personer så skulle den då hitta ungefär följande, dvs alla namn som börjar med Ola A

Ola Admundsen
Ola Andersson
Ola Antosson
Ola Apelvik
Ola Assarsson

osv...

När du sedan har gjort ett sökning så att du hittat din artikel, är det ju en smal sak att bygga ett litet manus som ligger på en knapp i varje rad i portalen. Klickar man på den knappen så läggs artikeln till produktens specifikation eller vad det nu är du jobbar med.

Ett exempel på portal filter, som bygger på "fasta värden" och inte sökfält, finns i denna tråd:

http://www.99.se/filemaker/225485-s-ka-i-relaterat-register.html

(Den passar inte riktigt dina behov tror jag).

Istället måste du lära dig hur man bygger just en portal filter funktion, om det nu är lösningen du söker? Säg till i så fall.

Hej Taz,
du har nog rätt, detta skulle kunna fungera - ett delproblem är att jag har många sökfält (15-20 stycken) vilket skulle kunna vara lite kladdligt att hantera?

Ett försök att beskriva lösningen som den nu ser ut. Jag repeterar bakgrunden igen:

Huvudtabellen är "DB: Article numbers". Denna innehåller ett unikt artikelnummer tillsammans med massor med metadata (till exempel beskrivning av artikeln, typ av artikel etc.).

Tidigare låg layouten som visade information för varje artikel i ett fönster och listan i ett eget fönster (inte i en portal), vilket medförde att varje användare som gjorde en sökning i listan kunde skapa sin egen uppsättning sökta artiklar som inte påverkades av vad andra användare sökte på.

Av olika anledningar så vill jag nu kombinera dessa två fönster i ett fönster, där listan ligger i en portal. See layout.jpg.

En metod är att använda ett fält som för varje artikel markerar om den skall visas i listan eller inte. Med ett script så görs en sökning och sedan en uppmärkning. Dock fungerar detta dåligt i ett fleranvändarsystem - en sökning av användare 1 påverkas av en sökning som användare 2 gör eftersom visningen i portalen är knuten till samma fält - en ändring i ett fält hos en användare slår igenom direkt till den andra användaren.

Det jag gjorde var att skapa en till tabell "User search result" som har två fält, "Article number" och "User name". Varje gång en sökning görs så skapas en lista med artikelnummer för användaren, där användarnamnet är nyckeln. See relation.png, där söktabellen defineras längs ned.

Scriptet som gör detta finns i script.jpg.

Denna metod blir långsammare ju fler artiklar den skall gå igenom och markera för visning, men det är för ögonblicket den enda metoden jag kan komma på.

Hoppas detta gav något för alla inblandade!

/Mikael

jag vet inte riktigt var jag skall börja, det finns massor att berätta om "ämnet", att göra sökningar, visa resultat, låta användaren sammanställa ett antal sökningar till något nytt osv. Jag får intrycket att en del av nedanstående är okänt för dig och detta är saker du behöver veta för att kunna bygga det användargränssnitt du vill ha.

Angående variabelfält, relationer och nyckelfält
För det första så är variabelfält (eller som det också heter: fält med global indexering) i en fleranvändarmiljö unika för varje inloggad användare. Vad som lagras i ett sådant är alltså olika för varje användare. Alltså kan man använda variabelfält för att lagra saker per användare, utan att behöva blanda in username och liknande.

Man kan också använda variabelfält på vänstra sidan i relationen. Vilket betyder att man kan skapa väldans trevliga användargränssnitt där man kan "välja" en post ur en lista och då få fram all information om den. Det gör man genom att ha en relation mellan ett variabelfält (det valda produktid't) och produktid. Man tar helt enkelt via ett manus och läser av id't på den rad i portalen eller liknande som användaren klickade på och petar in det i variabelfältet och vips så kan all produktinfo visas.

Nyckelfält kan innehålla ett värde, men det kan också innehålla värden separerade med returtecken, vilket betyder att relationen kommer att se alla poster som har något av värdena.

Exempel: Säg att jag har en databas med nummer från 0-100, i ett fält vi kan kalla för ID. Vi kan kalla den tabellen för högra sidan i relationen. På vänstra sidan i relationen så har jag ett variabelfält som jag stoppar in 99 i. Det betyder att jag kan se EN post på högra sidan. Men här kommer det roliga, om jag stoppar in detta i variabelfältet på vänstra sidan:

90
91
92
93
94
95
96
97
98
99

Jag ser alltså via denna relation 10 poster på högra sidan.

Vad har då detta med saken att göra? Jo, du "märker" upp dina poster med ett värde så att de skall synas, men det finns en annan teknik att göra samma sak, som bygger på vad jag skrivit ovan och som är lite snabbare och löser en del av de problemen du har.

Ett sätt är att du låter "märkningen" vara ett globalt fält. De är ju olika för olika användare, alltså stör en märkning inte en annan användare.

Ett annat sätt är att du istället lagrar alla id'n på de poster du vill skall vara med i sökresultatet och lagrar alla dessa med radbrytningar emellan i ett variabelfält (det blir din vänstra sida i relationen). Då kan du skippa username-grejsimojset och den extra tabellen. Du kan även bygga vidare på det och låta listan med id lagras, så att en användare kan få en liten lista med sökningar som han kan upprepa om och om igen genom att bara trycka på en knapp. Säg att dina produkter vanligen innehåller fem grejer som är med nästa varje gång. I så fall kan du peta in (via ett manus) dessa fem saker i variabelfältet och vips syns de i portalen, klara att klickas in på produkten.

Portal filter - en sorts sökteknik
Det är viktigt att framhålla att portal filter-tekniken inte är en sökning som användarna är vana vid att göra i sökläge. Man kan tex inte göra och-sökningar eller eller-sökningar, man kan heller inte söka inuti ord, söka på flera ord osv. Man kan bara söka på de saker som utvecklaren har bestämt, om det nu är kompletta ord, delar av ord, kompletta artikelnummer eller delar av artikelnummer osv.

Portal filter bygger just på relationer, variabelfält och beräkningsfält.

Du behöver skapa två fält:

portal_filter_sökfält_g (g för global, dvs variabeläflt)

Detta är ditt sökfält som du lägger ut i layouten som användaren kan skriva i.

portal_filter_sökfält_c (c för calculation, dvs beräkningsfält)

Detta är ett beräkningsfält som klipper bort det som användaren skriver för mycket och som innehåller denna beräkning:

Left(portal_filter_sökfält_g; 12)

Vilket ger endast 12 tecken av det användaren skriver.

Sedan behöver du:

portal_filter_nyckelfält_c (c för calculation, dvs beräkningsfält)

Ditt nyckelfält innehåller en beräkning av det här slaget för att tex göra det möjligt att söka på delar av artikelnummer (med delar menar man början på artikelnummer) och delar av titeln på produkten.

Left(Artikelnummer;1) & "¶" &
Left(Artikelnummer;2) & "¶" &
Left(Artikelnummer;3) & "¶" &
Left(Artikelnummer;4) & "¶" &
Left(Artikelnummer;5) & "¶" &
Left(Artikelnummer;6) & "¶" &
Left(Artikelnummer;7) & "¶" &
Left(Artikelnummer;7) & "¶" &
Left(Artikelnummer;9) & "¶" &
Left(Artikelnummer;10) & "¶" &
Left(Artikelnummer;11) & "¶" &
Left(Artikelnummer;12) & "¶" &
Left(Titel;1) & "¶" &
Left(Titel;2) & "¶" &
Left(Titel;3) & "¶" &
Left(Titel;4) & "¶" &
Left(Titel;5) & "¶" &
Left(Titel;6) & "¶" &
Left(Titel;7) & "¶" &
Left(Titel;7) & "¶" &
Left(Titel;9) & "¶" &
Left(Titel;10) & "¶" &
Left(Titel;11) & "¶" &
Left(Titel;12) & "¶"

Fältet kommer för en produkt som har artikelnummer 12345678901234567890 och som har titeln ABCDEFGHIJKLMNOPQRSTUVX innehålla detta:

1
12
123
1234
12345
123456
1234567
12345678
123456789
1234567890
12345678901
123456789012
A
AB
ABC
ABCD
ABCDE
ABCDEF
ABCDEFG
ABCDEFGH
ABCDEFGHI
ABCDEFGHIJ
ABCDEFGHIJK
ABCDEFGHIJKL

Nu kan du relatera dessa fält till varandra:

portal_filter_sökfält_c och portal_filter_nyckelfält_c

(Notera att fältet med ett litet c i är det man skall använda i relationen, det fältet som skall ligga som sökfält tex ovanför portalen, som anvädaren kan söka i är det med ett litet g i.

Nu kan alltså användaren skriva 123 i sökfältet och lämnar fältet, så kommer Filemaker att göra en "relationsträff" på raden 123 i nyckelfältet och vips så ser du alla artikelnummer som börjar med 123 i portalen.

På samma sätt fungerar det med produkter som börjar med tex ABCDE.

Ett par brister, du kan inte söka på både 123 och ABCDE samtidigt, du kan inte söka på BCDE heller. Men för en del av bristerna kan det finnas workarounds, denna rad kanske ger dig en ide:

Left(Artikelnummr;3) & " " & Left(Titel;3) & "¶" &

(Du skulle alltså kunna söka på 123 ABC om du vet att de två sakerna står i fältet.)

Du kan även i det ovan komplettera med att ha menyer med värdelistor, tex dina produktkategorier. Säg att du har kategorin motstånd bland dina elektronikkomponenter och du behöver ett på 100 Ohm, då borde användaren kunna välja just motstånd och skriva 100 i sökfältet. För att det skall fungera måste du lägga till en sådan sektion både i nyckelfältet och i beräkningsfältet:

Artikeltyp & " " & Left(Titel;1) & "¶" &
Artikeltyp & " " & Left(Titel;2) & "¶" &
Artikeltyp & " " & Left(Titel;3) & "¶" &
Artikeltyp & " " & Left(Titel;4) & "¶" &
Artikeltyp & " " & Left(Titel;5) & "¶" &
Artikeltyp & " " & Left(Titel;6) & "¶" &
Artikeltyp & " " & Left(Titel;7) & "¶" &
Artikeltyp & " " & Left(Titel;8) & "¶" &
Artikeltyp & " " & Left(Titel;9) & "¶" &
Artikeltyp & " " & Left(Titel;10) & "¶" &
Artikeltyp & " " & Left(Titel;11) & "¶" &
Artikeltyp & " " & Left(Titel;12) & "¶"

och i sökfältets beräkning får du lägga till denna rad (låt den rad som redan står där stå kvar)

portal_filter_Artikeltyp_g & " " & Left(portal_filter_sökfält_g; 12) (portal_filter_artikeltyp_g är ett globalfält du får lägga till förstås med en värdelista på).

Tillbaka till det det stora perspektivet

Men för att åtetgå till överblicken så kanske du kan erbjuda dina användare flera av dessa olika sökmetoder:

* Ett snabbsök (eller kanske det skall heta matchningsfält för en del väldans trögtänkta användare som inte fattar skillnanden på sökning och sökning som jag har stött på) som bygger på portal filter. Denna sökmetod passar de användare som är vana och har kunskaper om vad saker och ting heter och är väldans snabb och smidig.

* Ett antal riktiga sökfält som kanske är variabelfält i vilket användaren kan fylla i flera sökfält, sedan tar ett manus och hoppar över till artikeldatabasen, fyller i alla sök-saker, märker upp de hittade posterna eller skapar en lista på alla produktid och limmar in den i ett variabelfält och vips syns rätt produkter i portalen.

* En riktig sökning, det borde vara lätt att hoppa till produktregistret, gå i sökläget, söka på vad som helst, bläddra igenom posterna och när man hittat rätt, klicka på EN knapp som lägger till produkten i listan.

Det vad jag hade att säga idag.

Lycka till!

/Ola

Hej Taz,
ledsen för sent svar, jul och allt runtomkring kom i vägen.

Tack för ditt långa och utförliga svar - jag är självlärd på FM sen länge, och det mesta i det du beskrev hur nyckelfält fungerar kan jag sen tidigare. Dock så var det en stor nyhet för mig (men också en stor aha-upplevelse kombinerat med en naturligtvis-upplevelse) att ett nyckelfält kan innehålla flera "nyckelord" separerade med mellanslag.

Den typen av nyckelfälttrixande du sedan beskriver är en listig följd av detta; dock tror jag inte (måste fundera vidare på det dock) att detta medger en tillräckligt flexibel sökning i mitt fall.

Tack för hjälpen - skall låta detta sätta sig lite grand inna jag går vidare med att revidera den nuvarande (långsamma) sökfunktionen.

mvh /Mikael Hegardt

1
Bevaka tråden