Logo UGIdotNET

Discussione 'Aiuto nel mapping'

# Pubblicato il 22 lug 2009 23.46 - Rispondi
Nazareno Manco
Aiuto nel mapping
Vi chiedo aiuto per un problema che mi si sta presentando in questi giorni. Magari (sicuramente) mi sto perdendo in un bicchier d’acqua ma mi sto incasinando tra mapping (Nhibernate) e classi.

Questo è il problema:

1) Ho una classe Articolo con tutte le sue proprietà (lunghezza, larghezza, descrizione) più ID e VERSIONE (come NH comanda)

2) Quest’articolo viene prodotto utilizzando diversi articoli (basi) che entrano in produzione in diverse fasi. Ho già tutta la parte di classi per la gestione degli ordini di produzione con le relative fasi e basi. Al momento non c’è evidenza sul gestionale (AS400) in che fase viene utilizzata la base e in che ordine.

3) Ora ho la necessità di memorizzare sul DB e mappare nelle mie entità quando le basi vengono usate e come. Per cui ho pensato di creare un anagrafica che rappresenti il prodotto cartesiano tra le basi usate per la creazione di un prodotto e le fasi necessarie. Nell’”intersezione” delle due informazioni metto l’ordine di utilizzo (prima base, seconda base, ecc) se l’informazione manca vuol dire che quella base non viene usata il quella fase.

Qui mi sono incagliato. Ho pensato di legare all’articolo una lista di articoli “stessi” per identificare le basi necessarie. Poi di creare una classe solo per le fasi (molto stupida visto che sul gestionale la fase viene identificata da una stringa del tipo “0001”, “0002”, ecc.). Quindi creare una classe per incrociare le due informazioni. Il ragionamento mi sembra giusto ma non mi trovo come definizione di classi e come metterlo su DB.

Grazie per l’attenzione… scusate… ma a volte per uscire da una secca ci vuole una “spintarella” :-)
# Pubblicato il 23 lug 2009 9.11 - Rispondi
Gianluca Carucci
Re: Aiuto nel mapping
Ciao, sinceramente non ho chiaro cosa vuoi fare:P Puoi postare le tue entità e un blocchettino di codice con quello che vuoi fare? Non ho capito cosa sono le basi e le fasi e la correlazione con gli articoli e gli ordini.
Da quello che sembra vuoi registrare una specie di trace di quello che succede. Se fosse questa la tua intenzione, creati una semplice classe che tenga gli identificativi degli oggetti che stai tracciando, senza usare relazioni esplicite.
Gianluca
# Pubblicato il 23 lug 2009 10.16 - Rispondi
Michele Pisicoli
Re: Aiuto nel mapping
Se ho capito tu hai un anagrafica di prodotti base che utilizzati in diverse fasi di produzione dovrebbero poi comporre il prodotto finito memorizzato in un altra anagrafica.
Non posseggo la soluzione però potremmo provare ad arrivarci. Il modello relazionale (quindi non quello a oggetti) potrebbe essere rappresentato da 3 tabelle:
Anag_Basi (i prodotti base che compongono gli articoli)
Anag_Fasi (le fasi di lavorazione sulle basi )
Anag_Articoli (gli articoli finiti)

Tutte e tre collegate con relazione uno a molti a una tabella di collegamento la cui chiave primaria è la composizione dei tre id che provengono dalle tre tabelle.
Infatti:
-una fase puo essere composta da piu basie piu basi possono essere utilizzate in diverse fasi.
-Piu articoli complessi possono utilizzare piu fasi di lavorazione aventi a loro volta un coinvolgimento di piu basi.
Con gli opportuni where e join puoi tirare fuori tutte le necessarie informazioni.

Lato OR/M poi vedi tu, io non conosco bene la materia, anche se prima di iniziare a mappare una soluzione progettata su un db relazionale verificherei il funzionamento logico in un mondo relazionale (se creo delle query e ottengo il risultato che voglio allora ho fatto bene e passo a mappare).

spero di esserti stato utile perche sinceramente non sono un esperto.

ciao
# Pubblicato il 24 lug 2009 12.10 - Rispondi
Lorenzo Moretti
Re: Aiuto nel mapping
# Pubblicato il 24 lug 2009 12.11 - Rispondi
Lorenzo Moretti
Re: Aiuto nel mapping
Corro il rischio di aver stracapito ...
e mi scuso in anticipo se dico delle ca...

Mi sembra sia più semplice la cosa...
Non si tratta di usare una cosa tipo una Association Class con la relativa tabella di relazioni?
http://www.sparxsystems.com/uml_tool_guide/uml_dictionary/associationclass.html
http://etutorials.org/Programming/UML/Chapter+6.+Class+Diagrams+Advanced+Concepts/Association+Class/

Ci sarebbe una tabella relazioni molti a molti (come avete già detto) tipo

TABLE RELAZIONEARTICOLIBASI
idrelazione -> int (PK)
idarticolo -> int (FK)
idbase -> int (FK)
ordineFase -> int
quantità -> int

Ciao!
Lorenzo
# Pubblicato il 23 lug 2009 10.00 - Rispondi
Nazareno Manco
Re: Aiuto nel mapping
Ciao,

scusa... ieri non avevo a portata la macchina di sviluppo ma li stavo ancora scervellando per trovare la soluzione... ti le classi (ti metto le proprietà pubbliche per mantenere il codice corto):

1) La mia classe degli articoli:

Public Class Article
Inherits DomainObject

Public id As Integer
Public version As Integer = 0
Public code As String
Public description As String
Public Width As Double
Public Length As Integer
Public Thickness As Double
[...............]

End Class

2) La mia classe degli ordini di produzione:

Public Class ProductionOrder
Inherits DomainObject

Public id As Integer
Public version As Integer = 0
Public code As String
Public customer As Customer
Public StartDate As Date
Public EndDate As Date
Public Article As Article ' Articolo del prodotto finito
Public OrderedQuantity As Double
Public Steps As IList(Of ProductionOrderStep) ' Lista dei passi (fasi) di lavorazione
Public BaseMaterials As IList(Of ProductionOrderBaseMaterial) ' Lista delle materie prime necessarie
[..........]

End Class

3) La classe dei passi (fasi) dell'ordine di produzione:

Public Class ProductionOrderStep
Inherits DomainObject

Public Id As Integer
Public Version As Integer = 0
Public StepId As String ' questo è l'identificativo della fase sul gestionale AS del tipo "0001", "0002", ecc
Public ProductionTime As Integer
Public ProductionOrder As ProductionOrder ' serve a navigare verso l'ordine di produzione
[.............]

End Class

4) La lista delle materie prime necessarie

Public Class ProductionOrderBaseMaterial
Inherits DomainObject

Public Id As Integer
Public Version As Integer
Public ProductionOrder As ProductionOrder ' serve a navigare verso l'ordine di produzione
Public Article As Article ' Questo è l'articolo della materia prima (che è dello stesso tipo del prodotto finito)
Public Quantity As Double

End Class

Per cui la struttura è (la freccia indica le navigazioni possibili al momento):

Ordine di produzione (1)------>(1) Articolo (prodotto finito)
(1)<------>(*) Passi (fasi) di lavorazione (per esempio 3 passi: 0001, 0002, 0003)
(1)<------>(*) Materie Prime (basi) (1)------->(*) Articolo (materia prima) (per esempio 4 basi: B1, B2, B3, B4)

Io devo crearmi una anagrafica (che non c'è nel gestionale) che mi dice che dove i 4 articoli vengono utilizati nei vari passi e in che ordine.
In questo modo posso visualizzare correttamente all'operatore quali basi utilizzare per ogni fase di produzione (fino ad adesso vedevano sempre tutte le materie prime e l'informazione era cartacea).
Come dicevo ieri vedrei una martice del tipo:

Per produrre il prodotto finito F ho questa situazione:

Base B1 B2 B3 B4
Fase
0001 1 2
0002 1
0003 1 2

Che vuol dire che nella fase 0001 uso prima B1 e poi B2, nella fase 0002 uso solo la B3, nell'ultima la B2 e poi la B4.
Mi perdo su come mettere la info sul DB (pensavo di legare il tutto alla anagrafica articoli con qualcosa del tipo:

Articolo (prodotto finito) (1)<------->(*) Articoli (della base) <-----------> Abbinamento Articoli Fasi
(1)<------->(*) fasi possibili (id, versione e StepId???) <-----------> Abbinamento Articoli Fasi

Mi perdo nel pensare come strutturare questo sulle entità (o che entità creare) e come mapparlo sul DB.

Spero di essere stato chiaro.... ricomincio a pensare
Grazie!!!!

# Pubblicato il 23 lug 2009 11.16 - Rispondi
Gianluca Carucci
Re: Aiuto nel mapping
Ciao, ora è molto più chiaro grazie:)
Per capire meglio un paio di domande:
- L'articolo è il prodotto finito, risultato della produzione?
-Possono essere fatti più ordini sullo stesso articolo (l'articolo è unico ed esiste sempre un esemplare solo x articolo o invece è riproducibile?)
-Ogni Articolo ha sempre la stessa procedura di lavorazione (e le stesse quantità per Articolo di materie prime impiegate)?
Te lo chiedo perchè mi sembra strano che gli steps di produzione siano a livello di ordine invece che di articolo.
Poi mi sembra che alcune entità le crei per mappare le relazioni molti a molti che hai sul db. Prova a staccarti dal db e ragionare sulle entità e su come devono collaborare. Una volta che è chiaro questo, come le mappi sul db diventa un lavoro meccanico.
Gianluca
# Pubblicato il 23 lug 2009 20.57 - Rispondi
Michele Pisicoli
Re: Aiuto nel mapping
Ciao NAzareno, non so se hai gia risolto ma ti rispondo lo stesso.

Potresti provare a mettere la lista dei base_mats non nell'ordine ma nelle fasi di produzione (ogni fase ha una lista di basemats).Non è un problema il fatto che piu basemats saranno duplicate perche nel db poi non sarà cosi. L' entita sarà del tipo:

ordini -> Fasi -> Basi

invece che:

->Fasi
ordini
->Basi

Accedendo piu o meno in questo modo:

[in pseudolinguaggio]
ords.Fasi[0].Basi = base1, base2, base4;
ords.Fasi[1].Basi = base1, base3, base5;
ords.Fasi[2].Basi = base2, base4;

L'elenco delle sole basi te lo puoi ricavare come vuoi (non conosco nhibernate ma con linq farei una select distinct direttamente sugli oggetti magari da stampare poi in alto sulla comanda)
Puoi definire le varie fasi di lavorazione con i loro materiali di base in modo molto semplice senza il prodotto cartesiano.

Chiaramente con l'object model cosi mappare diventa piu complicato (ed è per questo che personalmente odio un po' Evans). Si tratta di implementare una relazione molti a molti tra basi e Fasi e relazionare poi con gli ordini (molti a uno). La tabella di collegamento molti a molti (basi-fasi) deve avere una chiave composta non solo con gli id di basi e di fasi ma anche con l'id del rispettivo ordine di produzione.

Di nuovo spero di esser stato utile.

Michele
# Pubblicato il 24 lug 2009 12.58 - Rispondi
Nazareno Manco
Re: Aiuto nel mapping
Ciao,

intanto grazie a tutti per l'interessamento. Rispondo in ordine:

x Gianluca:

D: L'articolo è il prodotto finito, risultato della produzione?
R: l'articolo per me è sia la base che il prodotto finito (con codici differenti di solito). Noi usiamo bobine di film per produrre altre bobine dopo opportune lavorazioni.. per cui non c'è differenza di "tipo prodotto" tra le basi e il prodotto finito.

D: Possono essere fatti più ordini sullo stesso articolo (l'articolo è unico ed esiste sempre un esemplare solo x articolo o invece è riproducibile?)

No tutto è (e meno male) riproducibile. Vedi risposta 1 per tipologia di produzione.

D: Ogni Articolo ha sempre la stessa procedura di lavorazione (e le stesse quantità per Articolo di materie prime impiegate)?

R: no, purtroppo. Ogni articolo ha una distinta base standard ma... quando necessario.. è possibile utilizzare basi alternative e/o cicli alternativi su altre macchine. Per cui devo tenere traccia di tutte le possibili alternative.

X Michele: sul gestionale non c'è la struttura da te suggerita che è la più corretta (Ordine --> Fasi --> Basi).
Sul mio DB (che per decisione aziendale è una fotografia della situazione sul AS/400 che arrichisco con informazioni aggiuntive per gestire la produzione) ho ripostato la stessa struttura... e fino a quato momento è andato bene.
Ora devo passare a qualcosa di simile a quello da te suggerito... ma per farlo durante l'importazione dei dati devo riuscire a capire in che fase fa a finire una determinata base... da cui il mio problema di creare una anagrafica (che sul AS non c'è) per aggiornare correttamente i dati.

x Lorenzo: grazie... mi sono guardato i tuoi link.

Sarei arrivato a questa soluzione inspirandomi a qualcuno dei vostri post:

1) Devo tirare fuori una anagrafica fasi (probabilmente solo il codice) e collegarlo alla fase dell'ordine di produzione.
In questo modo posso crearmi una tabella del tipo:
Id Prodotto Finito
Id Fase
Id Articolo Base
Ordine di Utilizzo

Questa potrebbe essere la base per creare qualcosa di simile all'"association class" di Lorenzo.

Grazie a tutti!!!!!
# Pubblicato il 24 lug 2009 12.18 - Rispondi
Lorenzo Moretti
Re: Aiuto nel mapping
con nhiberate - ad esempio - avresti un "bag" di relazioni nella classe articolo e delle propietà
many-to-one/one-to-many (mi confondo sempre...) che puntano ad Articolo e Base.

può essere una cosa simile? ....o l'ho cannata in pieno? ... nel caso sorry :)

Ciao!
Lorenzo
# Pubblicato il 24 lug 2009 15.49 - Rispondi
Gianluca Carucci
Re: Aiuto nel mapping
> Devo tirare fuori una anagrafica fasi (probabilmente solo il codice) e collegarlo alla fase dell'ordine di produzione.
>In questo modo posso crearmi una tabella del tipo:
>Id Prodotto Finito
>Id Fase
>Id Articolo Base
>Ordine di Utilizzo

>Questa potrebbe essere la base per creare qualcosa di simile all'"association class" di Lorenzo.

Secondo me la struttura che hai in mente è corretta: per il tracing tieni una classe "snella" (senza associazioni) e nel caso demani ad una logica opportuna (servizio?) la funnzionalità di esporti le entità referenziate dalla tua struttura di tracing.
Gianluca
# Pubblicato il 28 lug 2009 9.30 - Rispondi
Nazareno Manco
Re: Aiuto nel mapping
Grazie a tutti!

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185