Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

query ricorsiva

37 views
Skip to first unread message

Smalville

unread,
Oct 24, 2013, 11:21:55 AM10/24/13
to
Ciao,

ho una tabella su Access con diversi campi.
In particolare ho un campo "Padre" e un campo "Figlio".
"Padre" è univoco, ovviamente più record possono avere lo stesso valore nel campo "Figlio".


Ho necessità di estrarre tutti i record che dipendono da un certo "Padre", ovviamente anche per una relazione transitiva.
Ovvero se "X" è figlio di "Y", e "Y" è figlio di "Z" allora "Z" è anche figlio di "X".

I livelli di nidificazione non sono noti a priori, come posso implementarlo senza massacrare il db ?
Posso senza problemi preparami anche una struttura ad hoc da tenere sincronizzata per agevolare e velocizzare il lavoro.

Grazie mille dei consigli!

Kan

unread,
Oct 25, 2013, 7:04:33 AM10/25/13
to
Ciao,
quando ho dovuto fare una cosa del genere, quando non è stato possibile
creare una stored procedure (e su Access non mi pare sia possibile), di
solito ho caricato in memoria tutti i record invece di fare query ricorsive.
Normalmente questo metodo è molto più veloce, soprattutto quando hai a
che fare con database che hanno prestazioni scarse (es. AS400).

Esempio:

// classe item
private class Item
{
public readonly string name = null;
public readonly System.Collections.Generic.List<ItemAssoc> children
= new System.Collections.Generic.List<ItemAssoc>();

public Item(string name)
{
this.name = name;
}
}

// classe che rappresenta i dati di associazione padre/figlio
private class ItemAssoc
{
public readonly Item item = null;
public decimal quantity = 0;

public ItemAssoc(Item item)
{
this.item = item;
}
}

// elenco items
var items = new System.Collections.Generic.Dictionary<string, Item>();

// carica i dati dal database
foreach (var record in records)
{
string parent_name = "padre";
string child_name = "figlio";
decimal quantity = 0;

Item parent = null;
items.TryGetValue(parent_name, out parent);
if (parent == null)
{
// nuovo item
parent = new Item(parent_name);
items.Add(parent_name, parent);
}

Item child = null;
items.TryGetValue(child_name, out child);
if (child == null)
{
// nuovo item
child = new Item(child_name);
items.Add(child_name, child);
}

// nuova associazione padre/figlio con quantità associata
var assoc = new ItemAssoc(child);
assoc.quantity = quantity;
parent.children.Add(assoc);
}


Alla fine hai l'elenco di tutti gli item e per ogni item hai anche tutti
i figli con i relativi dati di associazione.
La proprità "children" la puoi trasformare eventualmente in Dictionary
se ti serve cercare velocemente un'associazione padre/figlio, così come
puoi aggiungere anche una proprietà "parents" per memorizzare anche
quali sono tutti i padri di un item.

0 new messages