23 - 10 - 2017
Main Menu
Development
Old stories

Ny funksjon for etterkommere

User Rating:  / 1
PoorBest 

Jeg prøver stadig å finne nye teknikker og metoder for å effektivisere kjøringene i AgetoAgeMySql og i går fant jeg en svært enkel og grei metode for å finne alle etterkommere av en person uten å bruke rekursiv teknikken. Jeg viser denne nedenfor og har kalt funksjonen TravDescProc. Den tar et argument "id" som er ID til personen man vil finne etterkommere av. Den returnerer en liste av elementer av typen "Rec" som er en type jeg definerte som følger:

public struct Rec
        {
            public int ID;
            public string Name;
            public int Sex;
            public int Level;
            public string Path;
            public Rec(int id, string name, int sex, int level, string path)
            {
                ID = id;
                Name = name;
                Sex = sex;
                Level = level;
                Path = path;
            }
        }

Her kommer så selve funksjonen som går ned gjennom alle etterkommere i tur og orden. For å lage en "sti" (2.1.2.3) som viser veien fra valgt person til en etterkommer av denne bruker jeg en variabel "Path" i Rec strukturen.

public List<Rec> TravDescProc(int id)
        {
            List<Rec> table = new List(Rec);
            System.Collections.Queue children = new System.Collections.Queue();
            int pn = 0;
            string ph = "";
        loop:           
            dbDoc.cmd.CommandText = "select PID2 from marriages where PID1 = '" + id + "';";
            MySql.Data.MySqlClient.MySqlDataReader reader = dbDoc.cmd.ExecuteReader();
            List lst = new List();
            while (reader.Read())
            {
                lst.Add(reader.GetInt32(0));
            }
            reader.Close();
            pn = 0;
            foreach (int n in lst)
            {
                dbDoc.cmd.CommandText = "select pid, firstname, lastname from persons where fatherID = '" + id + "' and motherID = '" + n + "' or fatherID = '" + n + "' and motherID = '" + id + "';";
                reader = dbDoc.cmd.ExecuteReader();               
                while (reader.Read())
                {                   
                    children.Enqueue(new Rec(reader.GetInt32(0), reader.GetString(1) + " " + reader.GetString(2), 0, 0, ph + (++pn).ToString()));
                }
                reader.Close();
            }
            while (children.Count > 0)
            {
                Rec r = (Rec)children.Dequeue();
                table.Add(r);
                ph = r.Path + ".";
                id = r.ID;
                goto loop;
            }
            return table;
        }

 

Add comment


Security code
Refresh