Recuperare gli articoli presenti in una sottocategoria anche se si cli...

martedì 20 novembre 2012 - 18.06
Tag Elenco Tags  VB.NET  |  .NET 3.5

zseven Profilo | Senior Member

Ciao ragazzi,
il titolo forse non è chiarissimo cerco di spiegarmi meglio.

Ho una tabella con le categorie con la classica situazione di padre figlio con un l'id del genitore tutto in questa tabella.

Poi c'è la tabella dei prodotti che contiene ovviamente l'id della categoria di appartenenza.

Adesso immaginiamo che ho una situazione di questo tipo:
Categoria A
--Categoria B
----Categoria C
Ed ho i prodotti inseriti sia all'interno di Categoria B che all'interno di CAtegoria C.

Come posso fare a far visualizzare tutti i prodotti di B e di C anche solo cliccando su A?

Grazie mille

ridaria Profilo | Expert


>Adesso immaginiamo che ho una situazione di questo tipo:
>Categoria A
>--Categoria B
>----Categoria C
>Ed ho i prodotti inseriti sia all'interno di Categoria B che
>all'interno di CAtegoria C.
>
>Come posso fare a far visualizzare tutti i prodotti di B e di
>C anche solo cliccando su A?

di B e di c che appartengono anche ad A? visto che clicchi su A giusto?



Riccardo D'Aria

zseven Profilo | Senior Member

sì sì esatto sono sottocategorie di A quindi rientrano anche in A oltre che in B e in C

ridaria Profilo | Expert

c'è qualcosa che non quadra,

se un articolo appartiene ad A,B e C,

se clicco su cat A vedro tutti gli articoli di A, allo stesso tempo quelli di A che appartengono anche a C e B li ho già presi perché appartengono ad A.

O sono io che non ho capito?


Ciao
Riccardo D'Aria

zseven Profilo | Senior Member

Faccio un esempio pratico così da spiegarmi meglio:

Frigoriferi
-- Frigoriferi a due ante
---- Frigoriferi classe A++
---- Frigoriferi classe A+++
-- Frigoriferi ad una anta

Come vedi sopra ho una Categoria principale (Frigoriferi) all'interno della quale ci sono due sottocategorie (Frigoriferi a due e Frigoriferi ad una anta), sotto a Frigoriferi a due ante ci sono altre due sottocategorie (classe A++ e classe A+++).

Adesso io ho articoli sia all'interno di classe A++ che all'interno di classe A+++, però vorrei che cliccando su FRIGORIFERI, quindi la sua categoria madre, vengano visualizzati tutti i prodotti presenti sia in classe A++ che in classe A+++.

Spero di esseremi spiegato meglio :D

ridaria Profilo | Expert

TI PRENDI TUTTE LE SUBCAT DI FRIGORIFERI
E PER OGNI UNA DI ESSE NE ESTRAI GLI ARTICOLI.


cAIO
Riccardo D'Aria

zseven Profilo | Senior Member

Ti ringrazio per l'aiuto, ma non credo proprio possa essere questa la soluzione.
Se dovessi ciclare tutte le possibili sottocategorie rallenterei troppo il caricamento.


Qualcuno sa dirmi se esiste una soluzione a livello di query SQL che è possibile utilizzare?

ridaria Profilo | Expert

>Qualcuno sa dirmi se esiste una soluzione a livello di query SQL che è possibile utilizzare?

a livello di query direttamente non credo, ma una vista è una buona soluzione

Devi crearti una vista sul DB che prenda per ogni categoria tutti gli articoli appartenenti alle sue sub categorie.

Join etc.....

Ciao
Riccardo D'Aria

zseven Profilo | Senior Member

Questo mi sembra più interessante.

Siccome non ho mai lavorato con le viste, sapresti indirizzarmi su come poter fare?
Non tanto sulla creazione in sè, ma proprio sul discorso di ciclare tutte le categorie e sottocategorie.

Grazie mille

ridaria Profilo | Expert

>Questo mi sembra più interessante.
>
>Siccome non ho mai lavorato con le viste, sapresti indirizzarmi
>su come poter fare?
>Non tanto sulla creazione in sè, ma proprio sul discorso di ciclare
>tutte le categorie e sottocategorie.


Non si tratta di eseguire un ciclo di elaborazione via codice.

Una vista è una tabella del database.
Essa non è altro che l'unione/intersezione di due o più tabelle secondo le relazioni che vi intercorrono.
Una volta creata sul db, è lui stesso che popola la tabella (vista) con tempi decisamente brezi se rapportati a quelli di una pura elaborazione via codice e stringhe SQL.

Potresti cominciare da qui:
http://www.html.it/pag/31835/le-viste1/

e poi a seconda del DB che usi affinare lo studio per arrivare alla creazione di una vista sul tuo DB.

CIAO fammi sapere





Riccardo D'Aria

zseven Profilo | Senior Member

sì sì questo è chiaro, mi riferivo proprio al codice della SQL.

Ritorno al problema iniziale:
come faccio a selezionare tutti i prodotti che appartengono ad una macrocategoria anche se all'interno di "n" sottocategorie?

Che sia vista o query normale il codice da scrivere è sempre quello, mi servirebbe sempre una mano per raggiungere questo risultato.

Grazie mille

ridaria Profilo | Expert


>Ritorno al problema iniziale:
>come faccio a selezionare tutti i prodotti che appartengono ad
>una macrocategoria anche se all'interno di "n" sottocategorie?



>Che sia vista o query normale il codice da scrivere è sempre
>quello, mi servirebbe sempre una mano per raggiungere questo
>risultato.

Il codice SQL per la creazione di una Vista non è sempre lo stesso.

In esso si specificano: le tabelle interessate, i campi che si vogliono vedere, i campi su cui si basa l'intersezione e/o unione fra le tabelle in base ad uno o più campi.

é una cosa che devi studiare e costruire tu.
Io che ne so quali sono le tabelle, le relazioni ed i nomi dei campi. Più che passarti dei link da dove avviare lo studio non potrei fare.

OK ;-)

Ciao
Riccardo D'Aria

zseven Profilo | Senior Member

Ok ti ringrazio, ma la mia necessità è proprio quella di ricevere un aiuto CONCRETO sulla creazione del codice.

La struttura delle tabelle è semplicissima:
tab_categorie
ID|PARENT|NOME

tab_articoli
ID|id_cat|NOME

Sapendo questo, come posso costruire una query SQL oppure una VISTA che mi consenta di visualizzare tutti i prodotti che appartengono alle categorie figlie anche se ho cliccato su di una categoria padre?

Grazie mille

ridaria Profilo | Expert

>Ok ti ringrazio, ma la mia necessità è proprio quella di ricevere
>un aiuto CONCRETO sulla creazione del codice.

Volentieri

>
>La struttura delle tabelle è semplicissima:
>tab_categorie
>ID|PARENT|NOME
>
>tab_articoli
>ID|id_cat|NOME

da come vedo hai la categoria e gli articoli, non vedo sub_categorie.

il campo PARENT cosa contiene?


>Grazie mille

prego

Riccardo D'Aria

zseven Profilo | Senior Member

il campo parent è la macrocategoria di appartenenza, ricordi l'esempio che ti ho fatto delle categorie e sottocategorie?
Sono tutte all'interno di un'unica tabella, per ogni record, se c'è, viene indicato il padre all'interno del campo PARENT.

ridaria Profilo | Expert

direi che seguire via post una cosa del genere è alquanto complicato e lungo.

Torno a dirti di leggere e studiare le viste o Join.

Ciao
Riccardo D'Aria

zseven Profilo | Senior Member

ok, grazie le studierò sicuramente.

C'è qualcun altro che è in grado di darmi una mano su questo problema?

Grazie

alx_81 Profilo | Guru

>C'è qualcun altro che è in grado di darmi una mano su questo
>problema?
ciao, io ho in produzione la stessa casistica:
calcio
- serie a
-- juve milan
-- parma inter
- premiership
-- manchester utd arsenal
-- chelsea tottenham
ecc..

e non ho usato la parent child come te, perchè è un modo per salvare semplicemente le informazioni gerarchiche ma è un metodo da non seguire se devi fare letture di profondità come quelle che servono a te. Perchè devi entrare nel merito della ricorsione, utilizzando, in SQL Server, le Common Table Expression.
Ci sono post sulla ricorsione con le CTE che ti allego alla fine, ma prima ti consiglio di utilizzare il pattern chiamato Materialized Path.
Con esso vai a segnare ogni elemento con un campo stringa che contiene la gerarchia (un po' come le cartelle di windows), trasformando la parent child in una cosa del genere:

calcio 001
- serie a 001.001
-- juve milan 001.001.001
-- parma inter 001.001.002
- premiership 001.002
-- manchester utd arsenal 001.002.001
-- chelsea tottenham 001.002.002

avendo quel campo, poi basterà fare:
SELECT
campi
FROM
TuaGerarchia
WHERE
MPath LIKE '001%'

ecco che avrai tutti i record (nel mio caso) di "calcio".
Puoi applicare il campo già ora, anche se hai una Parent Child, aggiungendolo con una update immediatamente successiva che usa l'id ed un progressivo per darti l'mpath desiderato. Oppure puoi anche esportare i dati in una ulteriore tabella speculare ma con l'mpath, per utilizzare solo quella nelle letture, vedi tu.

Per le CTE ricorsive, leggi qui: http://msdn.microsoft.com/it-it/library/ms186243(v=sql.105).aspx

>Grazie
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Ciao Alx,
perfetto era proprio l'aiuto che cercavo!

Sei stato chiarissimo sul concetto da andare ad applicare, l'unica cosa che non ho capito è come creare il path.
Mi spiego meglio:
quando il cliente utilizza il pannello di controllo per creare le categorie e le sottocategorie, contestualmente devo creare anche la procedura per inserire nell'apposito campo il valore del Mpath? Cioè lo gestisco tutto in maniera autonoma se ho capito bene, non bisogna appoggiarsi ad oggetti o librerie giuste?

Grazie mille!

alx_81 Profilo | Guru

>quando il cliente utilizza il pannello di controllo per creare
>le categorie e le sottocategorie, contestualmente devo creare
>anche la procedura per inserire nell'apposito campo il valore
>del Mpath? Cioè lo gestisco tutto in maniera autonoma se ho capito
>bene, non bisogna appoggiarsi ad oggetti o librerie giuste?
devi farlo tu, una semplice funzione di generazione di una stringa. Considera che non è male se lasci gap tra un valore e l'altro. Tipo una cat è 001 e quella dopo, per la funzione, potrebbe essere 005 ad esempio.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

ok chiarissimo!
Domani mi metterò al lavoro ti farò sicuramente sapere!

Grazie mille!
Ciao ciao
Guido

alx_81 Profilo | Guru

>ok chiarissimo!
>Domani mi metterò al lavoro ti farò sicuramente sapere!
mi raccomando, se ci fai sapere e se funziona, accetta la risposta così chiudiamo il post
ciao!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Anche se con un pò di ritardo ho potuto provare quello che mi hai consigliato, ed ha funzionato alla grande!
Grazie mille!

alx_81 Profilo | Guru

>Anche se con un pò di ritardo ho potuto provare quello che mi
>hai consigliato, ed ha funzionato alla grande!
ottimo
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5