27 - 11 - 2021
Main Menu
Who's online

We have 229 guests and no members online

Latest articles
Visitors
09818927
Today
Yesterday
This Week
This Month
Last Month
All days
22099
26098
146691
580938
548748
9818927

Old stories

Om utviklingen

User Rating:  / 0

Jeg er nå godt i gang med å skrive SQL setninger i AgetoAge4 Database som vi kanskje vil kalle denne versjonen

Register to read more...

Holiday's End

User Rating:  / 0

Ja, da er ferien over og tid for å reflektere over sommeren som snart er på hell. Tiden går bare fortere og fortere, om det skyldes mere arbeid og mindre tid til å gjøre ingenting ettersom man blir eldre skal jeg la være å filosofere over og heller gå over til det jeg skulle snakke om, nemlig AgetoAge4 og MySQL.. La det først være sakt, AgetoAge4 har innebygget databasemotor som er den raskeste man kan tenke seg fordi datane blir ikke lagret til disk mens man jobber med ATA, men lagringen skjer når man velger "Save" fra File menyen. Alle data blir lest inn i RAM fra en fil når man åpner en fil og å finne dataene går utrolig raskt. Når man lager nye personer og familier blir disse bare lagret i RAM og man mister disse hvis man ikke lagrer til disk før man avslutter AgetoAge4. Å bruke en standardisert databasemotor betyr for AgetoAge4 at innhenting av data vil ta mere tid, men det er veldig interessant å jobbe mot f.eks MySQL og det åpner for mange andre ting som er tidkrevende å programmere. For eksempel er det ingen ting i veien for å kjøre en spørring mot flere databaser samtidig. Man kan f.eks opprette databasene, A, B, C og D (eller flere) og så importere data til disse fra GED filer eller ATA filer og så spørre etter f.eks hvilke personer som er felles i databasene (med wildcards for å kompensere mot forskjellige stavemåter for navnene). Det er også veldig raskt å skifte mellom databaser,  (man behøver ikke å lese inn data når man bytter base, men datane blir lest inn når man trenger dem).  Databasene i MySQL er er faktisk bare en katalog, (mappe) lager man databasen "MinBase" blir det fysisk laget en mappe "MinBase" der det opprettes filer for hver tabell man lager i basen. Man kan faktisk bare manuelt opprette en mappe som ligger under Data i MySQL mappen og MySQL vil tolke denne mappen for å være en database. I AgetoAge4 vil det være et vindu der man kan se alle databaser man bruker for AgetoAge4, listen over disse lages ved at ATA kjører en spørring "SHOW DATABASES" mot valgt Server (kan være lokalhost eller et domene som har MySQL). Resultatet fra spørringen vil så bli undersøkt for å finne alle databaser som har standardtabellene som vil bli brukt i ATA. Fra AgetoAge4 vil man således bare se de databaser som AgetoAge kan bruke. Fra dette vinduet kan man også opprette nye databaser, standardtabellene blir automatisk generert. At det genereres standardtabeller betyr ikke at man bare kan bruke disse tabellene, man kan lage sin egne private tabeller i tillegg til standardtabellene om man vil. Standardtabellene er de tabeller som må være i basen for at man kan lagre en person eller familie. For å kunne bruke denne versionen av AgetoAge4 må man enten logge inn på et domene som har MySQL Server eller installere MySQL Server på sin egen maskin. Jeg vil nå publisere denne versjonen av AgetoAge4 som kun bruker MySQL (AgetoAge4Database) men den er på ingen måte ferdig utviklet og er mest en testversjon for å finne ut hva som vil bli det beste grensesnittet mellom AgetoAge4 og MySQL. Denne versjonen jobber veldig tungvint mot MySQL, den kjører masse unødvendige spørringer (datane kunne blitt lagret internt i AgetoAge4 og brukt om igjen). For eksemplel så kjøres det 4-500 spørringer mot MySQL etter data for personer og familier når jeg går til GroupView og setter meg selv som subject,  (ca 8500 personer i databasen) Så det er fristende å bruke AgetoAge4 innebygde databasemotor som en cache. Så dette leder til at det nok blir som jeg tenkte først, å programmere en egen modul som "leser" inn data fra databasen og inn i AgetoAge4 interne databasesystem. Det som da blir det mest "nyttige" er at man kan opprette databaser av diverse GED og ATA filer og så bruke MySQL Query til å sammenligne data fra forskjellige baser.

Ready for testing

User Rating:  / 0

We are ready to test the new version of AgetoAge4 with MySQL server support. You can connect to local server (localhost) or external server. If you connect to an external server and want to try make a new database, make sure you have privilege to do this. 

Jeg har lastet opp ny versjon av AgetoAge4 der alt virker som før, men det er nå en meny "Database" hvor man kan koble på en local server eller en MySQL server på et domene. For å kunne koble på local server må man installere MySQL server på maskinen sin. Den kan lastes ned fritt fra

http://dev.mysql.com/downloads/mysql/5.0.html

Man trenger ikke Enterprise versjonen, men MySQL Community Server holder og den er gratis. Men har man et domene med MySQL server kan man koble til denne og man kan opprette en ny database fra AgetoAge4 (må ha lov til å opprette nye databaser).

Dette er en testversjon der man må følge visse regler hvis man ønsker å teste MySQL supporten.

  1. Koble til server.
  2. Velg en database og klikk "Use selected database". Er det ingen "Available databases" må man lage en ny base.
  3. På "Operations" arket, klikk "Transfer all data in database to AgetoAge4 intenal memory"
    Dette laster inn alle data til AgetoAge4, men det er ikke nødvendig å gjøre det motsatte etter man har lagt til nye personer og famiier.  Hver gang man endrer data (eller legger til en ny person)  vil dette oppdateres i databasen på serveren. Funksjonen "Transfer all data in AgetoAge4 internal memory to database" skal KUN brukes hvis man har en .GED fil eller .ATA fil man ønsker å legge i en database. Det finnes kanskje noen som bare har tilgang til èn database, men jeg kan legge til en funksjon senere som oppretter standardtabellene i denne slik at denne kan brukes. Jeg har med vilje laget det slik at bare databaser som har standardtabellene som AgetoAge4 bruker vil vises i "Available databases"  Men det er ingenting i veien for at man ikke kan opprette disse tabellene i en eksisterende base....funksjon for dette vil komme...

Når man avslutter AgetoAge4 etter å ha redigert data importert fra en MySQL server får man spørsmål etter om man vil lagre filen...dette svarer man bare NEI til hvis man ikke vil lagre til en vanlig .ATA fil eller .GED fil. Som nevnt under punkt 2 vil endringer av data bli lagret på serveren mens man redigerer.

Jeg er spent på hvordan dette vil fungere når flere redigerer samtidig. Hvis Edith, Torill og jeg legger til nye personer eller familier vet ikke AgetoAge4 hva den neste ID til den personen jeg vil legge til vil bli... Torill har kanskje nettopp lagt til en ny person og Edith har kanskje også lagt til en masse personer. Så AgetoAge4 må sende en forespørsel etter den neste ID som kan brukes, til serveren (som i vårt tilfelle befinner seg i Amsterdam) om å få neste ID, i det øyeblikk man klikker OK på personkortet blir en ny forespørsel sent....for mens man har redigert den nye personen har kankje noen andre allerede lagt til en ny person. og den ID man fikk er kanskje ikke ledig nå. Så den ID man ser på personkortet når man legger til en ny person vil kanksje ikke være den endelige ID personen får.. men kan være en midlertidig ID inntil man er ferdig med redigering og klikker OK. Jeg har ikke lagt inn sperringer som hindrer at to personer legger til hver sin person samtidig. Men hvis Torill og Edith klikker OK på samme tid slik at serveren får forespørsel etter neste person ID på samme tid....vel.....så det er vel lite trolig at dette kan skje i praksis, men hvis serveren er opptatt med å undersøke neste ledige ID for Torill når Edith sender førespørsel så vil AgetoAge4 tvinne tommeltotter til Torill har fått sin neste  ID og så vil serveren finne neste ledige ID til Edith.

 

En ting som jeg ønsker å finne ut av er om det er mulig å få MySQL serveren til å sende ut en info til alle andre klienter enn klienten som oppdaterer data om at den eller den personen er blitt oppdatert slik at AgetoAge4 kan oppdatere sin "hukommelse". All data blir jo lest inn fra serveren en gang for alle ved hver pålogging. Data som blir redigert blir lagret på serveren fortløpende men endringer som blir gjort av andre klienter blir ikke oppdatert i andre klienter (fordi dataene allerede er lest inn i AgetoAge4s' private hukommelse). Jeg kan i farten tenke meg en selvkontruert løsning på dette som følger: En egen tabell blir opprettet i hver database som kun blir brukt til å legge inn ID til alle oppdaterte data og når AgetoAge4 ikke har noe annet arbeid som venter kan da sjekking av denne tabellen for å se om det er nødvendig å oppdatere data bli gjort.

 

Et annet problem er hvis noen editerer samme person på samme tid. Jeg bruker denne løsningen: Hver tabell får et ekstra felt "RevisedByClient" av boolean type. Når en klient vil editere en person, vil AgetoAge4 sende forespørsel til serveren for denne personen for å  undersøke om RevisedByClient er TRUE eller FALSE. Hvis det er FALSE vil AgetoAge4 godkjenne editering...hvis det er TRUE vil man få en beskjed om at "Data for person X is beeing revised by other client" og man får ikke lov å endre data for denne. Hvis man får lov å endre data for denne personen vil AgetoAge4 sette RevisedByClient til FALSE (da vil andre kunne redigere denne personen) når man klikker OK.

Jeg vil legge til en funksjon som vil sette dette flagget til FALSE for alle personer da det kan være nødvendig hvis man f.eks mister internett forbindelsen mens man editerer en person....da vil flagget bli stående som TRUE.

Good luck! 

 

PS. Hvis noen som leser dette har kunnskap om server/klient problemstillinger eller andre relevante ting er det hyggelig å få kommentarer..

New version of AgetoAge4 uploaded

User Rating:  / 0

At http://dev.mysql.com/downloads/dotnet.html you can read this: 

MySQL Connector/Net is an open-source .NET data provider for MySQL. The driver is implemented entirely in managed C# code and has no dependency on unmanaged, external libraries. One managed-code, external library is required (SharpZipLib) for compression of the data stream between the driver and MySQL. (This used to be known as ByteFX.Data.)

 

There was also an example how to make a dataset and connect that to a datagrid control, it was extremely easy and worked at once... i am now implementing that in the database window in AgetoAge4.

Liste med dobbelt elementer

User Rating:  / 0

Det aller meste for å synkronisere AgetoAge4 innebygde datahåndtering med MySQL er allerede gjort og det som gjenstår er litt finpussing og grundigere testing. Jeg lagde det slik at marriages tabellen fikk to rader for hvert ekteskap (a - b og b - a), men ser nå ingen grunn til det og har allerede forandret det til èn rad per ekteskap. Jeg måtte lage en prosedyre som sletter alle slike dobbelt registreringer og det var mer innviklet enn jeg hadde trodd. La oss si vi har denne listen:

1 - 2

2 - 1

3 - 4

4 - 3

5 - 6

7 - 8

 

Her har vi 2 tilfeller der a og b har byttet plass og disse ønskes slettet via en prosedyre. Hvordan programmerer man det? Vel, jeg begynte ved midnattstider i går og etter ca 30 min fant jeg en løsning som følger:

Prosedyren går gjennom hvert element i listen (hvert element består av to tallverdier a og b) og sjekker om det motsatte elementet (b og a)  finnes i listen. I såfall vil den sjekke en annen liste der det legges inn det elementet som eventuelt blir slettet (hver gang et element blir slettet blir en kopi av det lagt inn i denne tabellen). Hvis elementet ikke finnes i denne listen da blir dette elementet slettet og en kopi blir lagt inn i test listen. Her er C# koden for det:

struct rec

{

   int pid1;

   int pid2;

}

rec r, rx;

for (int i = 0; i < lst.Count - 1; i++)

{

      r.pid1 = lst[i].pid2;

      r.pid2 = lst[i].pid1; 

     if (lst.IndexOf(r) > -1)

     { 

         if (tmp.IndexOf(r) == -1)

         {

              doc.cmd.CommandText = "delete from marriages where pid1 = '" + r.pid1 + "' and pid2 = '" + r.pid2 + "';";

 

              listBox4.Items.Add(doc.cmd.CommandText); 

              rec rx = new rec();

              rx.pid1 = r.pid2;

              rx.pid2 = r.pid1;

              tmp.Add(rx);

              doc.cmd.ExecuteNonQuery();

         }

    }

MessageBox.Show("Finnish");

 

 

Hvis noen har en enklere løsning vennligst gi meg et hint.