Impostare una Classe ArticoloMagazzino

sabato 29 settembre 2007 - 10.50

Ghitano Profilo | Newbie

Dovrei creare una classe nel mio gestionale per gestire gli articoli del magazzino.
all'interno di ciascun elemento vi è un rapporto di uno > molti
es:
a) Articolo (con le sue proprietà, ID, Descrizione, etc..)
- CodBarre single e confezione
- Prezzi Vendita > Listini
- Prezzi Acquisto > Fornitori
etc...
Venendo dal Visual Basic 6 ho difficoltà di tipo concettuali sull'utilizzo delle classi:
vengo al dunque:
Classe CodBar

'per inizializzare la classe
public sub new (IDArticolo as integer )
PROBLEMA : se l'articolo è nuovo e dunque non ho un IDArticolo? Creo un ulteriore sub new senza argomenti?

'proprietò della classe:
IDArt (ID dell'articolo di origine)
Codice (codice a barre)

metodi:
Add (Codbar as string)
Save (per salvare tutti i codici creati nel database)

PROBLEMA
come faccio a creare una matrice di codici a barre da associare all'articolo?
qual'è il modo migliore per creare la classe e gestirla poi nel programma?

quando utilizzo il metodo Add dovrebbe aggiungere il codice a una matrice per poter poi utilizzare ciascun codice in questo modo:

dim Cbar as new Codbar (Articolo.ID)
for x = 1 to Cbar.count
ComboBox1.add (Cbar.Item(x))
next


la classe CodBar dovrebbe contenere al suo interno un type (ex visual basic 6)
o una sottoclasse CodBarSingoloCodice?







Ghitano BitBoys

freeteo Profilo | Guru

ciao

>'per inizializzare la classe
>public sub new (IDArticolo as integer )
>PROBLEMA : se l'articolo è nuovo e dunque non ho un IDArticolo?
>Creo un ulteriore sub new senza argomenti?
si chiaro, tanto internamente hai cmq una variabile, che nel caso non gli passi il valore nel costruttore sara' 0, o meglio ancora -1, cosi' sai che non è stato impostato da nessuno (dato che zero potrebbe anche essere un valore ammesso)



>'proprietò della classe:
>IDArt (ID dell'articolo di origine)
>Codice (codice a barre)
>
>metodi:
>Add (Codbar as string)
>Save (per salvare tutti i codici creati nel database)
qui non sono molto d'accordo.
il punto è che non ti conviene avere entita' cosi' intelligenti da fare anche query su db etc...perche' metti caso che un domani devi cambiare database? o metti caso che devi dividere il lavoro o avere comportamenti diversi per il database in futuro, o meglio ancora devi fare una parte web/palmare dello stesso programma, avere legato l'accesso al database all'entita' che ti serve anche per altri scopi è sbagliato...ovvero ti troverai a dover rifare (quindi con possibilita' di errore e perdita di tempo)
Conviene separare la struttura con qualcosa a livelli, dove le entita' sono comuni a tutti i livelli ma sono oggetti abbastanza semplici da portarsi dietro informazioni e comportamenti strettamente neccessari.
Un parte di gestione, e poi uno strato dati separati si preoccupano di fare il resto, nel caso di strato dati si preoccupera' di fare la query al db e tornarti 1o piu' oggetti di tipo "Articolo", rimepiti e gestiti con le logiche sue.



>PROBLEMA
>come faccio a creare una matrice di codici a barre da associare
>all'articolo?
>qual'è il modo migliore per creare la classe e gestirla poi nel
>programma?
mettiti una proprieta' "Codici" di tipo "List(Of string)" che è l'insieme di tutti i tuoi codici a barre



>quando utilizzo il metodo Add dovrebbe aggiungere il codice a
>una matrice per poter poi utilizzare ciascun codice in questo
>modo:
>
>dim Cbar as new Codbar (Articolo.ID)
>for x = 1 to Cbar.count
>ComboBox1.add (Cbar.Item(x))
>next
>
usando una proprieta' come lista di stringhe (codici a barre) avresti questa sintassi:
Combobox1.DataSource = cBar.Codici


>
>la classe CodBar dovrebbe contenere al suo interno un type (ex
>visual basic 6)
>o una sottoclasse CodBarSingoloCodice?
qui è lo stesso, se i dati sono pure stringhe di barcode allora va bene come ti ho detto io la proprieta' lista, altrimenti la lista sara' di una classe "CodiceABarre" che ha diverse proprieta' (non saprei quali ma magari tu sai meglio)


cmq la cosa è da approfondire di piu' di quello che ti ho detto io ovviamente, ed è importante che tu lo faccia nel passaggio da vb6 a object-oriented in .net.Percio' ti lascio qualche link come inizio:
http://www.microsoft.com/downloads/details.aspx?familyid=a8381e9c-884d-4cb2-9dbe-255c2790634b&displaylang=en
http://msdn2.microsoft.com/en-us/library/ms978496.aspx
e poi questo download complessivo di "buone norme" di programmazione (Microsoft patterns and practices April 2007 DVD.msi
):
http://www.microsoft.com/downloads/details.aspx?familyid=6724e09b-ca2e-425a-8d71-8febad3ba203&displaylang=en#filelist

e poi qualche bel webcast per architetti tipo:
http://www.microsoft.com/italy/msdn/risorsemsdn/eventi/webcast/architetti/passati/default.mspx
in particolare pagina 2:
- "Domain Driven Design: Overview (Livello 300)"
- "Architecting Layered Applications (Livello 300) "
- "Architettura del software: patterns by example"
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Ghitano Profilo | Newbie

Credo di aver risolto:
ho creato all'interno della classe CodBar
una sottoclasse _CBarSingle
con le proprietà
- IDArt as integer
- Codice as string
- Confezione as boolean

Ho creato una variabile nella classe CodBar
Private _CodBar() As _CBarSingle
ho creato il tipo
Public Enum TypeCod
Singolo
Confezione
End Enum

la parte più rognosa della classe Codbar è il metodo Add:

Public Sub Add(ByVal Codbar As String, ByVal confezione As TypeCod)
Dim Cb() As _CBarSingle
Dim ValConf As Boolean

Dim Item As New _CBarSingle
With Item
.CodiceBarre = Codbar
If confezione = TypeCod.Confezione Then ValConf = True Else ValConf = False
.Confezione = ValConf
.IDArticolo = _IDArt
End With

a questo punto utilizzo la variabile _CodBar () come un insieme di Codici
mettiamo che _Codbar() abbia ad esempio due codici
pongo Redim Cb(_CodBar.Lenght) ' quindi più 1 record

for x = 0 to _CodBar.Lenght - 1
Cb(x) = _CodBar(x)
next

e per ultimo:
Cb (_Cb.Lenght - 1) = Item

per chiudere
_CodBar = Cb

sono stato bravo?

per utilizzarlo nel form faccio:

dim Cbar as new Codbar (IDArticolo)

Cbar.Add("87248715", CodBar.TypeCod.Singolo)

per recuperare un codice

for x = 0 to Cbar.Count
Cbar.Item(0)...... (si apre menu popup con tutte le proprietà: Codice, IDArt, etc...)
next

________________________________________________

Sono daccordo con te sulla opportunità di non utilizzare il metodo Save dentro la classe
è un buon suggerimento!



freeteo Profilo | Guru

ok,
quello che hai fatto ti ha risolto il problema e ti permette di fare quello che ti serve.
Il mio era un discorso di architettura "generale" di applicazione, di come si puo' progettare un'applicazione inizialmente, per andare meglio poi a mantenerla, ingrandirla, e migliorarla...
Percio' rimango dell'idea che anche se per adesso ti va bene quello che hai fatto, leggiti qualche articolo e guardati qualche webcast su questi argomenti, che sicuramente ti tornano utili...

Ti dico questo perche' spesso il fatto di passare da ambienti come vb6 non object-oriented ad ambienti .net,fa andare in cerca di come si fa a "fare quello che facevi prima", invece di pensare come puoi lo "fare meglio"...un po' come dire: "migro da vb6 a .net, usando il wizard di visual studio" hhhhhhaaaaahahaha non c'e' di piu' sbagliato...se vuoi usare .net è anche per avere un approccio diverso alle applicazioni altrimenti è molto meglio usare ancora vb6 !

Non è certo un'accusa, è solo un consiglio mio...visto che anch'io ho lavorato per anno in vb6 e sinceramente adesso .net ho cambiato approccio, e ovviaemente, non tornerei indietro...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5