Hitta tidigare record i en tabell

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

Behöver hjälp med att hitta värdet i en tidigare record i en tabell. Jag har en tabell där jag registrerar medlemmars enegiförbrukning (mätarställning). Tabellen ser ut så här:

_kp_reading_id
_kf_member_id
reading_value
previous_reading_value
consumption = reading_value - previous_reading_value

I previous_reading behöver man altså hitta en tidigare record i samma tabell för just detta medlem. Anledningen till detta är att jag behöver veta differansen för att se förbrukningen sedan senaste avläsning. Går detta att göra via en calculation? Jag måste bara precisera, om detta inte redan framgår, att värdet som jag vill lägga in i previous_reading kan ligga var som helst i tabellen. Jag kanske behöver lägga till ytterligare en tabell som ständigt har senaste avläsning?

  • Medlem
  • 2008-02-13 23:37

Borde gå att lösa m.h.a. Relationer(*), under förutsättning att du har någon sorts sekvensnumrering på medlemmarnas avläsningar.

Om vi antar att _kp_reading_id är ett nummer som du räknar upp för varje registreringspost i tabellen (som jag härmed döper till registreringar), skulle man kunna skapa en relation till samma tabell där:

registreringar <--> äldre_registeringar
--------------------------------
_kf_member_id = _kf_member_id
_kp_reading_id > _kp_reading_id

Sortera de relaterade posterna (äldre_registreringar) fallande efter _kp_reading_id (då hamnar registreringen med det högsta sekvensnumret först), och sen kan du enkelt räkna ut förbrukningen medberäkningsfältet

consumption = reading_value - äldre_registreringar::reading_value

(*) Förutsätter förstås att du kör FileMaker 7 eller senare...

Senast redigerat 2008-02-13 23:52

Jag är rätt ny i FM så detta var bra hjälp. Förstår jag dig rätt, rent generellt i att:

Om jag sorterar en tabell utifrån vissa kriterier så vill en relation alltid returnera den överersta recorden (raden) i tabellen?

Kopplat till ditt exempel så vill:

consumption = reading_value - äldre_registreringar::reading_value

returnera den övre raden i [äldre_registreringar] eftersom vi inte specifserar en specifik record.

Har jag förstått rätt?

Vilken funktionen har andra relationen du föreslår:

_kp_reading_id > _kp_reading_id

Kan du förklara syftet med den. Relationen mot [äldre_registreringar är ju enbart intressant vi inmatning av en ny registrering eftersom jag då vill räkna ut en differens. Då vill _kp_reading_value alltid vara större än samtliga äldre_registreringar::_kp_reading_id så jag kan inte se att denna har något syfte. Är det något jag inte förstår?

Info: jag kör FM 8.5 Adv

  • Medlem
  • 2008-02-15 02:01
Ursprungligen av Triplee23:

Jag är rätt ny i FM så detta var bra hjälp. Förstår jag dig rätt, rent generellt i att:

Om jag sorterar en tabell utifrån vissa kriterier så vill en relation alltid returnera den överersta recorden (raden) i tabellen?

Kopplat till ditt exempel så vill:

consumption = reading_value - äldre_registreringar::reading_value

returnera den övre raden i [äldre_registreringar] eftersom vi inte specifserar en specifik record.

Har jag förstått rätt?

Kanske, jag vet inte...
Relationen returnerar alla poster som matchar kriterierna i relationen, i detta fall att _kf_member_id ska vara samma som i den aktuella posten och (som jag föreslog) att _kp_reading_id ska vara mindre än den aktuella postens värde.
Denna relation kommer alltså att returnera alla tidigare registreringar för den aktuella medlemmen.

Sen fungerar FileMakers beräkningsält lite olika beroende på vad det är du försöker räkna med. I detta fall försöker vi att ta värdet i ett fält i en post, och dra ifrån värden i ett fält i en uppsättning poster. Då kommer FileMaker att plocka värdet från den första posten i den uppsättningen, vilken post det nu råkar vara. Genom att sortera posterna i relationen ser vi till att den senaste registreringen hamnar först.

Ursprungligen av Triplee23:

Vilken funktionen har andra relationen du föreslår:

_kp_reading_id > _kp_reading_id

Kan du förklara syftet med den.

Syftet med detta kriterium (inte denna "relation", om man nu ska klyva hår ) är som jag sa ovan att få relationen att bara returnera tidigare registreringar för den aktuella medlemmen (under förutsättning att värdet av _kp_reading_id är någon slags sekvensnummer.)

Ursprungligen av Triplee23:

Relationen mot [äldre_registreringar är ju enbart intressant vi inmatning av en ny registrering eftersom jag då vill räkna ut en differens. Då vill _kp_reading_value alltid vara större än samtliga äldre_registreringar::_kp_reading_id så jag kan inte se att denna har något syfte. Är det något jag inte förstår?

Jag vet inte om jag riktigt hänger med här (skyller på klockan...)
I beräkningsfältet consumption kommer aldrig det beräknade värdet att lagras, utan det kommer att beräknas varje gång man tittar på (eller behöver) värdet. Om du förlitar dej på att den aktuella postens _kp_reading_value alltid är störst (och alltid drar ifrån det näst högsta värdet som finns) så funkar det bra så länge du inte tittar på äldre registreringar... Eller?

Sen vet jag inte vad som skulle kunna hända om det registrerade värdet "slår runt" (från 9999 -> 0000), men sånt kanske aldrig inträffar hos er.

Så, syftet med hela relationsövningen är att hitta den föregående registreringen. Först sorterar vi ut alla tidigare registreringar för medlemmen med de båda kriterierna i relationen, sen ser vi till att de relaterade posterna är sorterade så att den senaste kommer först, och sen utnyttjar vi FileMakers sätt att utföra en beräkning med relaterade poster för att få FileMaker att dra ifrån den senaste registreringen. Och istället för att spara förbrukningsvärdena i databasen beräknas de hela tiden utifrån den förra registreringen (jag inbillar mej att det blir lättare att korrigera fel i registreringar då...)

1
Bevaka tråden