Sortera poster baserad på self-join

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

Hej,

Har suttit länge med ett problem jag inte hittar lösningen på. Jag har en medlemsdatabas som består av både aktiva samt inaktiva medlemmar. Jag vill gärna skapa två vyer, en med samtliga medlemmar och en med bara aktiva medlemmar. Jag har skapat en field som heter status (radioknapp, text; aktiv/inaktiv) och en field xstatus (global; innehåller värdet "aktiv"). Jag har sedan gjort en self-join status=xstatus via tabellerna MEDLEMMAR och MEDLEMMAR_AKTIVA och hoppades att min vy baserad på MEDLEMMAR_AKTIVA skulle visa mig enbart medlemmar med status=aktiv. Oavsett hur jag gör klarar inte relationen att ta bort inaktiva medlemmar i min vy baserad på MEDLEMMAR_AKTIVVA (och därmed visas allt i båda vyerna). Är det inte möjligt det jag försöker göra? Jag ser gärna att detta kan lösas utan portal då jag vill bläddra via formulär (FORM).

Tack för svar.
Triplee23

Vyer, Join är termer från SQL-världen som har sina motsvarigheter i FileMaker, men inte exakta motsvarigheter. Så att använda dessa termer kan alltså förvirra en del, det är detaljerna som gör det nämligen.

När du gör en layout tex så jobbar du inte med en vy baserad på ett SQL-statement som man kanske får för sig är detsamma som en relation som man har laborerat med i relationsdiagremmet då man gjorde en tabellförekomst som alltså inte är en vy, även om den ser ut som en sådan osv. Ju fortare du kommer in i "The Filemaker way" så att säga, desto bättre är det.

Sedan har FileMaker en del egenheter också som man kanske inte inser finns där. Du kan tex bara använda variabelfält på vänster sida i en relation. Det är ett vanligt fel att stå på fel sida när man inte får relationer att fungera. När man ändrar vilken tabellförekomst en layout visar poster från, så "hjälper" FileMaker till och korrigerar alla fält man redan lagt in osv.

Filemaker är även petig med datatyper. Textfält relaterade till beräkningsfält vars beräkningsresultat är numeriskt är en annan klassiker bland felen man gör.

Det är här det blir lite svårförståeligt för de med SQL-bakgrund: En layout kan visa poster från vilken tabellförekomst i relationsdiagrammet som helst men det betyder inte att det är en bra ide att göra det. För att uttrycka det annorlunda så talar man om att man "står" i relationsdiagrammet och med det menar man: Den tabellförekomst som är knuten til layouten man jobbar ifrån. Den med dina fält i helt enkelt. Layoutens inställning placerar dig någonstans i relationsdiagrammet. Då skall man vanligen även ha alla de relaterade tabellerna på höger sida om den man står i. Det är alltså inte samma sak att "titta" via en relation åt höger som att stå på höger sida sida och titta åt vänster.

Ett annat fel du kanske gör är att du tror att en layout är en VIEW och när man gör en ändring i ett fält, så uppdateras det hela direkt och antalet hittade/visade poster ändras. Så är det alltså inte.

Hittade poster är de poster som är framsökta i en sökning. Antingen i en manuell sökning, en sökning utförd i ett script, eller att man fått ett script att hoppa till en layout och visa endast relaterade poster. Det är de tre sätt man kan påverka hittade poster på som visas i en layout.

Om du vill göra det du vill, dvs stå i en LAYOUT i FileMaker som visar poster från tabellen MEDLEMMAR så behöver du dessa fält.

Textfältet STATUS som får innehålla orden "Aktiv" eller ordet "Inaktiv" (utan fnuttar) på varje medlem.
Textfältet STATUS_AKTIV (ett beräkningsfält som innehåller beräkningen "Aktiv" med fnuttar).
Textfältet STATUS_INAKTIV (ett beräkningsfält som innehåller beräkningen "Inaktiv" med fnuttar).

Tips: Jag döper statiska fält (sådana som innehåller ord och siffror används i relationer med prefixet Status istället för som en del FileMaker utvecklare från förr gör med initialbokstav som c för beräkningar (caluculation), d för fält som visar något (display), v för variabler (även g som i global) och x för statiska relationer först i filnamnet osv. Såg att du hade med ett litet x i fältnamnet xstatus. Smaken är olika här.

Sedan gör du två relationer.
STATISK_AKTIV <<-->> STATUS som kan heta MedlemmarAktiva
STATISK_INAKTIV <<-->> STATUS som kan heta MedlemmarInaktiva

Tips: Vanligen döper jag relationer på formen tabell man står i _ tabell man "tittar mot" _ vilket fält man tittar med. Tex Medlemmar_Medlemmar_Statisk_Inaktiv skulle denna kunna heta då. Det händer något väldans fiffigt när man följer denna vana nämligen.

Avslutningsvis behöver du ett manus som innehåller två if-satser. I den första har du beräkningen Get(Manusparameter)="Aktiva", i den andra Get(Manusparameter)="Inaktiva". Det gör att bara delen i manuset mellan if och end if utförs när manusparametern från knappen är rätt.

Så här:

If [Get(Manusparameter)="Aktiva"]
Gå till relaterad post [MedlemmarAktiva, Visa endast relaterade poster].
Sortera (som du vill).
End if

Gissa vad du har i den andra ifsatsen nedanför denna?

Sedan har du två knappar, med varsin manusparameter "Aktiva", "Inaktiva".

Lägg dem i layouten.

Nu kan du med en knapptryckning visa valfri delmängd av medlemmar i just det som i FileMaker heter "Visa en post" som du kallade för Formulär? Dvs inte i en portal.

Att göra en portal kan dock ha sina fördelar, då kan man lättare söka.

Jo, om du verkligen verkligen vill ha ett variabelfält, med en värdelista på, som när du ändrar från aktiva till inaktiva visar just de posterna, så behöver du Filemaker 10 som har "triggers". Har du FileMaker 10?

Senast redigerat 2009-07-18 03:12

Tack för utomordentlig förklaring. Anledningen till att jag nog väljer ord som join och vyer är att jag sitter med engelsk version av FM och gissar ibland lite kring vad det eventuellt heter på svenska. Jag kommer i forsättningen använda de engelska termerna.

Jag har nu gjort enligt din förklaring med får det tyvärr inte att fungera. Jag undrar på om mitt script är korrekt.

Jag har nu två table occurances, MEDLEMMAR och MEDLEMMAR_AKTIVA (jag har inte gjort någon för inaktiva än). Dessa har en relation via fälten xstatus <<-->> status. xstatus är ett globlat beräkningsfält med värdet "Aktiv" och status är ett textfält där input via radioknapp (Aktiv/Inaktiv). I layouten finns en knapp med följande script:

If [GetField ( MEDLEMMAR_AKTIVA::xstatus ) = "Aktiv"]
Go to Related Record [Show only related records; From table: "MEDLEMMAR_AKTIVA"; Using layout: "Aktiva medlemmar" (MEDLEMMAR_AKTIVA)]
End If

Efter att ha tryckt på knappen visas forfaranda alla records i layouten (både status = aktiva och inaktiva). Jag har försökt ha xstatus på båda sidorna i relationen utan att det spelar någon roll.

Vore tacksam om jag kunde få ytterligare hjälp.

Senast redigerat 2009-07-18 17:17

Exakt hur tacksam?

Några punkter:

1. Man använder inte GetField, det är fel.

2. Du skriver: MEDLEMMAR_AKTIVA::xstatus men det är ju fältet som ses via relationen? Det är förmodligen fel. Vilken tabellförekomst visar din layout posterna ifrån? Det är alltså där du står i relationsdiagrammet. (Om du inte fattar detta, fråga!).

Du bör skriva xstatus istället för MEDLEMMAR_AKTIVA::xstatus. Sedan tror jag du har fel layout också, det verkar stå Medlemmar_Aktiva som tabellförekomst, det skall stå Medlemmar. Du har genom det valet placerat dig på fel ställe i relationsdiagrammet.

3. Du tänker inte rätt om relationer verkar det som om du tror att xstatus till xstatus kan fungera. Relationer fungerar så att du står i relationsdiagrammet någonstans, därifrån tittar du genom ett värde i ett fält i din tabell bort mot en annan tabell och ett fält i den tabellen. Du ser därmed de poster "därborta" som innehåller samma värde. Så om det globala fältet (här) innehåller "aktiv" och ett textfält därborta innehåller "aktiv", så ser du de posterna. Det skall vara lika här som där, då syns saker. Det är regeln.

4. Kolla att värdet du tror finns i fälten verkligen finns i fälten. Lägg in kopior av dina fält som har värdelistor i layouten, men utan värdelistor så att du ser vad det står i fältet. Notera att aktiva=AktIVA men aktiva≠aktiv.

5. Du svarade inte på frågan om du kollat datatypen, dvs att det är text i variabelfältet och text därborta.

6. Du svarade inte på frågan om vilken tabellförekomst som layouten visar poster från. (Det är ett klassiskt nybörjarmisstag).

7. Om du inte förstår vad jag ber dig kolla upp, så fråga då! Istället för att jag skall upprepa mina frågor.

8. Du har också aktivt valt att fortsätta på den inslagna vägen istället för att göra om och göra rätt som jag detaljerat beskrivit. Självklart förstår jag att du vill rätta till det lilla du tror är fel, men anledningen till att jag beskrivit det hela är att du skall testa det för att förstå hur saker hänger ihop. Därefter kan du återgå till hur du ville göra det hela istället.

9. Eftersom du kan på egen hand lätt också kan göra en väldans massa fel som jag inte kan se "genom" dina foruminlägg så tar det tid i onödan för att reda ut vad som är fel. Skärmdumpar kan hjälpa, av relationsdiagrammet, tillvalen för layouten, manuset mm.

Väldigt tacksam

Som svar på en fråga från ditt första svar. Jag har FM 10 så det borde gå med script triggers.

Lite info: Jag har två layouts, en MEDLEMMAR och en MEDLEMMAR_AKTIVA. I detta fall står jag i MEDLEMMAR_AKTIVA.

1. Jag har nu fått scriptet att fungera, jag hade tittat på fel tabellförekomst. Eftersom jag står i MEDLEMMAR_AKTIVA behövde jag hämta relaterade poster från MEDLEMMAR. Det ser ut så:

If [MEDLEMMAR_AKTIVA::xstatus="Aktiv"]
Go to Related Records [Show only related records; Match found set; From table: "MEDLEMMAR_AKTIVA"; Using layout: "Aktiva Medlemmar" (MEDLEMMAR_AKTIV)]
End If

2. Jag står i tabellförekomsten MEDLEMMAR_AKTIVA.

3. Jag vet inte var jag har skrivit att det finns en relation xstatus till xstatus. Jag har enbart en relation mellan xstatus och status.

4. Värdena är rätt, det kan ha slingat in ett stavfel i foruminlägget.

5. Datatypen är text i båda fälten, både xstatus och status.

6. MEDLEMMAR_AKTIVA

Jag kan absolut lägga in skärmdumpar, ska göra det nästa gång.

Sedan en fråga kring detta med relationer. Jag har lärt mig något viktig här och det är att relationen bygger på där jag står, alltså den tabellförekomst som layouten använder. Det jag dock inte förstår är värför jag behöver scriptet. Jag önskar ju här bygga en layout på MEDLEMMAR_AKTIVA, en tabellförekomst som väl redan har sorterat ut poster med status = aktiv. Har den inte det? jag trodde relationen i sig gjorde gallringen eftersom jag har lagt in ett urvalskriterie i relationen, nämligen den att xstatus = status (xstatus = aktiv). Borde inte detta gallra bort alla med status=inaktiva? Kan du förklara detta?

Du har byggt som man inte skall göra. Du har istället för att stå i tabellförekomsten medlemmar, så står du i aktiva medlemmar. Det är alltså fel. Layouten du står i skall alltid och vanligen vara så att säga tabellens egen layout.

Du verkar tro att tabellförekomster är det som hetr Joins i SQL-tabeller och att dessa faktiskt gör någon sorts urval. Men som jag försökt förklara: Så är det alltså inte. I varje tabellförekomst i Filemaker så har man alltid tillgång till alla poster i den layouten. (Tror du mig inte, gör två layouter med olika tabellförekomster, notera att antalet poster alltid är detsamma, dvs det antalet som finns i grundtabellen "Medlemmar").

FileMaker fungerar så att det är först när man frågar på rätt sätt så att säga om den kommer att göra ett urval och gå från alla poster, till relaterade poster. Som du har byggt det, då det inte är baserat på en portal som hade visat det direkt, så måste du instruera FileMaker genom ett manus att gå till relaterade poster och visa endast relaterade poster, för att ett urval skall göras. I SQL-databaser är en Join ett "levande" föremål så att säga. Om den finns så ser man bara en delmängd av posterna i den riktiga tabellen. Så är det inte i Filemaker. Fel ord att använda i FileMaker alltså.

Du har byggt tvärtom och bakvänt mot hur du skall bygga. (Du vet beprövad praxis, erfarenhet osv).

Ditt nästa problem kommer nämligen att visa att jag har rätt i detta. Det är när du skall göra motsvarande sak för endast aktiva medlemmar. Då måste du nämligen bygga en ny layout som visar poster från den. Är du med? Eller när du skall bygga något annat från medlemmar till något annat, tex betalningar, vilka arbetsgrupper de är med i, vilka prenumerationer de har, vilka anmälningar de har gjort till evenemang osv osv som alla bygger på relationer från medlemmar till någon annan tabell. Med ditt sätt måste du för var och en av dessa saker bygga en omvänd layout som bara kan visa just den saken. Med mitt sätt kan du visa alla dessa saker i samma layout i varsin flik i portaler tex.

Du borde istället basera det hela på tabellen Medlemmar, tabellförekomsten Medlemmar och med denna liggande till vänster i relationsdiagrammet så skall du ha tabellförekomsten för aktiva medlemmar (vilket är ett dumt namn för övrigt) till höger. Layouten skall visa poster från Medlemmar. Relationen skall vara xstatus <-> status som den redan är, men jag tror du har byggt den tvärtom.

Jeg betvivlar inte din kunskap om FM så jag kommer bygga om min relation enligt din rekommendation.

I mitt försök på att förstå detta försöker jag här beskriva det jag uppfattar att du säger, hoppas jag har uppfattat rätt:

1. Layouts bör alltid bygga på grundtabellen, aldrig tabellförekomster? När du skriver att det är skillnad mellan en relation beroende av om man tittar åt vänster eller åt höger. Kan du förklara detta igen, vet inte om jag förstår skillnaden?

2. Du säger att tabellförekomster (kopior på grundtabellen) alltid visar samma antal poster och att något urval aldrig sker. Det förstår jag nu, är det samma vid relationer mellan olika grundtabeller?

3. Även om det kanske kan framstå som det, jag har inte jobbat mycket med SQL. Ordet Selv-join kommer från VTC.com och deras omfattande Filemaker tutorial.

Jag skrev inledningsvis att jag inte önskade portals för just denna layout. Jag är inte i princip emot portals, jag tycker dock att de är lite begränande vad gäller grafiska möjligheter. Portals är i mitt tycke en tabell och begränsas av layoutens bredd. Jag önskade mer "formulärkänslan" där man fyller i saker på olika ställen på en sida för VARJE post i tabellen. Har jag rätt i min syn på begränsningarna i portals eller finns det andra sätt att använda portals tycker du?

Jag är nyfiken på det du skrev om script triggers. Kan man få script att köra automatisk vid musklick på en av FMs standardtabbar?

Senast redigerat 2009-07-18 23:46
1
Bevaka tråden