| 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” :-) |
| 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 |
| 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 |
| Lorenzo Moretti |
Re: Aiuto nel mapping
|
| 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 |
| 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!!!! |
| 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 |
| 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 |
| 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!!!!! |
| 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 |
| 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 |
| Nazareno Manco |
Re: Aiuto nel mapping
Grazie a tutti!
|