Noen ganger kan et enkelt og ryddig design være greit. Som for eksempel her:
En ny relasjonskalkulator har blitt programmert i løpet av de siste 3 dager. Den gamle er fremdeles tilgjengelig da denne nye kun gir positivt resultat hvis det er en ekte relasjon. Denne nye baserer seg på å
- Finne en eller to felles ancestorer. Finner den kun èn er det da snakk om en "halv" relasjon (men en ekte relasjon).
- Finne avstand i generasjoner mellom A og felles ancestor og mellom B og felles ancestor.
- Finne hvem A stammer fra og hvem B stammer fra. (dette gir svar på om A og B har de samme felles ancestor par)
Metoden er hurtig og vil kun bla seg tilbake i ancestorene til A og B for å finne relasjonen.
Oppdateringen er lastet opp.
Bm.
Jeg har ikke lagt inn testing om A og B kan være ste-relatert men jeg har kommet frem til en select setning som raskt kan finne ut av det.
Select Count(*) from ata_families where maleid in (select fatherid from ata_persons where pid = P1 and femaleid not in (select motherid from ata_persons where pid = P1)) and femaleid in (select motherid from ata_persons where pid = P2 and maleid not in (select fatherid from ata_persons where pid = P2))
Hvis dette returnerer en verdi som er større enn 0 er P1 og P2 ste-relatert. Setningen er fortsatt under testing og utvikling så jeg har valgt å vente litt til med å inkludere denne testen.
Vi vil nå lage en meny for å finne alle ekteskap i personlisten og vi går da bare til personlisten og klikker "..." knappen helt til høyre for SQL boksen. (må ha siste versjon av AgetoAgeSqlite) Vi skriver f.eks "Alle Ekteskap" som Name som Category kan vi f.eks skrive "Familie" og som CMD eller SQL spørrring skriver vi:
select pid, fid, firstname || ' ' || lastname as Name, CASE WHEN pid = maleid THEN femalename ELSE malename END as Married, marriagedate, marriageplace from ata_persons join ata_families where maleid = pid or femaleid = pid order by pid
Så velger vi File/Save as new... og vips så har vi fått en ny meny User menu/Familie/Alle ekteskap som vi bare velger og klikker GO.
Problemet er vel å skrive SQL spørringer men det er slett ikke så vanskelig og man finner masse stoff om dette på nettet og øvelse gjør mester. Det er vel ikke alle som har erfaring med SQL spørringer (AgetoAgeSqlite bruker SQLite database system så spørringene må være kompatible med SQLite) men mange har sikkert noen som kan hjelpe. Man har oversikt over alle tabellene som kan brukes i vinduet "SQL Command Builder" i AgetoAgeSqlite, jeg har enda ikke fått tid til å publisere noen oversikt over hvordan feltene hører sammen (hvilke felt som er primærnøkler, f.eks) men det er bare å sende meg en mail hvis noen skulle ha behov for hjelp. Og det er slett ikke risikabelt å eksprimentere, SQLite hånderer feil i spørringene og man risikerer ikke å ødelegge noen tabeller pga eventuelle feil i spørringene man skriver så lenge man kun bruker rene SELECT setninger som er meningen her, det er mulig å skrive en SQL spørring som oppdaterer tabellene men det er ikke så lurt å prøve på hvis man ikke har litt peiling, men begynner man med SELECT og holder seg unna UPDATE spørringer er det ingen fare.
Jeg har lastet opp en ny versjon med forbedret Advanced SQL vindu og der man nå kan angi hva som skal skje når man dobbelklikker et felt i den listen som blir generert ved kjøring av spørringene. Dette betyr at i eksemplet nedenfor er det nå mulig å dobbelklikke f.eks "Finsåsen, Grane" og så spretter Skjemaet for steder opp med stedet "Finsåsen, Grane" valgt. En liten demo på hvordan man gjør dette:
Lag en spørring som f.eks
Select PID, Firstname, Lastname, Birthdate, Birthplace from ata_persons where Firstname like '%' order by PID
Dette er "Standard" spørringen som allerede eksisterer for Advanced SQL så man kan godt bruke denne som den er.
Klikk så "..." knappen til høyre for "Go" knappen og klikk "Set actions"
Så kommer man til vinduet nedenfor som har en nedtrekksliste der man velger hvilket skjema som skal komme opp... Person, Familie, Location....osv.... Column N må settes til den kolonneindexen som inneholder elementet som kan åpnes.
Siden vi har PID som første kolonne (som blir indeksert som 0 så velger vi Person fra nedtrekkslisten og setter Column til 0 og klikker "Add"
Så har vi birthplace som 5 kolonne i spørringen vår og indexen blir 4 (0,1,2,3,4) og vi velger Location fra nedtrekkslisten og setter Column til 4 og klikke "Add". Så kan vi bare lukke vinduene og tilbake i Advanced SQL kan vi nå dobbelklikke på f.eks en birthplace og få Stedskjemaet opp med dette stedet valgt.