Newsgroup: it.comp.lang.visual-basic
Titolo: Ha senso una Enum di 200 elementi?

Ciao a tutti,
una domanda secca.
Ho una stringa di max 200 caratteri, dove ogni posizione per me significa
una cosa.
Nella funzione che mi leggerà il carattere che mi interessa sarà tipo.
Dim iRetVal as integer
dim iPos as integer
iPos=95
iRetVal = LeggiCar(ipos)
Avevo idea di fare una enum che mi identificasse il mio significato di cosa
è il 95
Enum Posizioni
  ...
  psClienti=94
  psFornitor=95
  ...
end enum
Dim iRetVal as integer
iRetVal= LeggiCar(psClienti)
Ha senso crearsi una enum di così tanti valori, o è meglio usare l'indice
di posizione?
Grazie
-- 
DBMS Firebird
VB6 + Ado

 di posizione?
Per te qual è il più leggibile?
Ciao 

 Per te qual è il più leggibile?
Diciamo che con la Enum ho la possibilità di utilizzare sia la enum che il
numero intero (anche se verrà usata la enum). Inoltre per come è scritta è
suddivisa per categorie es:
psClientiGestione
psClientiStampa
In questo modo se sto facendo la stampa clienti so già di scrivere
psclient... e poi me la scelgo fra le 3/4 disponibili.
Per ora ho optato per la enum, e mi sembra ben usabile, ma sto facendo solo
delle prove.
Tnx


Andrea [Work] ha scritto:

Non sono entrato completamente nell'ottica di quanto dici, ma cerco di
capire il livello
di Flessibilità che può avere...!
Se devi aggiungere qualcosa come fai ricompili il progetto dopo la
modifica...?
Personalmente per queste impostazioni delego tutto ad un DB, magari
locale come Access
nel quale metto Descrizione ed Indice, carico il mio RS ed in quello ho
l'elenco...!
E' pur probabile che non abbia compreso il senso della tua richiesta,
anzi è molto facile.
@Alex

 modifica...?
Bhe si, la modifica dell'enum è una conseguenza della modifica.
Cioè in una stringa ho una sequenza di numeri che per me sono le
abilitazioni degli utenti nel programma.
Il carattere 95 per es. per me è l'abilitazione ad una stampa, se mi viene
richiesta una nuova abilitazione per una parte di programma, prima faccio
la modifica e aggiorno l'enum con un nuovo campo (es.
posNuovaAbilitazione=96).
Il funzionamento a monte deve essere quello (la stringa con sequenza),
quindi devo vedere come gestirmelo al meglio.


Andrea [Work] ha scritto:

Personalmente non la vedo la strada migliore.
Usando un DB, o registri o File INI, tutto questo non accadrebbe....
All'apertura ti leggi la tua origine di formattazione e salvi in Array
o GlobalVar i settings.
Cambi i Settings,..... alla riapertura rileggi...!
@Alex

 Cambi i Settings,..... alla riapertura rileggi...!
Sì, ma in questo caso è un lavoro inutile in quanto il "settaggio" è 
conseguenza di una modifica e poi resta graniticamente lì.
E' inutile fare un DB per una configurazione che in realtà non cambia mai.
Ciao 

 Ciao
Allora non ho capito la base come avevo premesso...!
@Alex

 news:1160069969.4...@b28g2000cwb.googlegroups.com...
zac
IMHO
La cosa migliore è avere un file esterno dalla alpha fino alla
versione definitiva (INI XML TESTO quello che vuoi)
Dalla versione definitiva in poi
metti tutto in una tabella "ImpostaMiaApp"....
caso mai avessi voglia di far sparire la stampa dei report se dopo un
anno l'utonto non rinnova la licenza....
Oppure far introdurre solo 3 nominativi finchè non passa dalla demo ad
una versione commerciale...
basta impostare un "qualcosa"(flag int char...quello che vuoi) con una
istruzione SQL ed è fatto!

 Allora non ho capito la base come avevo premesso...!
Io ho il mio gestionale suddiviso in diverse parti.
Es. Gestione CLienti, Fornitori, Articoli, Stampa Clienti, Fornitori,
Articoli, Ordini, Bolle, Fatture ecc.
Enum QualificationPos
	psClientiGest =1
	psClientiSt =2
	psFornitoriGest=3
	psFornitoriSt=4
	psArticoliGest=5
	psArticoliSt=6
	...'altre abilitazioni fino circa 80
end Enum
Poi ho una Enum con i valori possibili delle abilitazioni:
Public Enum QualificationType
    'Full>Insert/Update>Read
    'fra Insert e Update, non c'è gerarchia
    'se sto facendo update il controllo sarà o (abFull OR abUpdate)
    'se sto facendo insert il controllo sarà o (abFull OR abInsert)
  abFull = 0
  abInsert = 1
  abUpdate = 2
  abRead = 3
  abBlocked = 9
End Enum
E' stato definito un tracciato su un file esterno (non chiedetemi perchè),
che legato all'utente mi da la sua stringa di abilitazioni:
Utente Pippo: 000099	'si occupa dei clienti/fornitori
Utente Pluto: 303000	'si occupa degli articoli
Pippo mi potrà entrare e fare tutto nei clienti e fornitori ma non entra
negli articoli.
Pluto nei clienti/fornitori va in sola lettura, anche nelle stampe (qui 0 o
3 sarebbe uguale). E Ha il controllo completo sugli articoli.
Io dalla gestione articoli (tramite una funzione booleana) chiedo
if bOkPermesso(psClientiGest,abBlocked)=True 'mi controlla che nella
stringa abilitazioni nella mid$(stringa, psclientigest,1) non sia
Blocked(9)
Oppure quando arrivo a fare l'insert
bOkPermesso(psClientiGest,abInsert)=True: in questo caso controllo che
abbia permesso abFull OR abInsert
Senza usare la enum sarebbe
bOkPermesso(1,abInsert)
Ora se avete capito c'è una piccola anomalia nella funzione.
Cioè normalmente richiedo il Livello (abFull, abInsert, abRead) necessario
per fare l'operazione, in caso di abBlocked andrò a controllare che il
livello NON sia quello.
La BokPermesso funge cos':
ePosValue= 'va a prendere il valore di abilitazione nella stringa utente
'richiesto permesso LETTURA (Full + Update + Insert + Read)
    Case abRead             
      Select Case ePosValue
        Case abFull, abUpdate, abInsert, abRead
          bOkPermesso = True
        Case Else
          bOkPermesso = False
      End Select
 
'richiesto permesso Bloccato al contrario degli altri in cui si richiede il
permesso
    Case abBlocked          
      Select Case ePosValue 
        Case abBlocked
          bOkPermesso = False
        Case Else
          bOkPermesso = True
      End Select
 
  End Select
Ho riportato solo la read, ma le altre funzionano allo stesso modo. Vedrete
che a logica la blocked funziona al contrario, ma mi può andar bene....
La parte a monte (il file ecc.) va preso per fisso (nel senso che deve
andare così), io devo integrarlo nel programma.


Andrea [Work] ha scritto:
zac
Lo leggo ora!
Mamma mia.......
sei capitato anche tu tra le grinfie di un laureato in ingegneria
informatica?
Mi fece fare una cosa del genere un mio ex datore di lavoro....
mi scrissi una classe chiamata "Sentinella" che aveva proprio codesta
funzione....leggeva da un file di testo una sequenza di
111010101010101001010010101001010101111101011 e la interpretava (il
tipo non aveva neanche l'accortezza come hai fatto tu di farti scrivere
stringhe ma...ebbro di Solaris che spippolava quotidianamente cercando
di sembrare un ISP serio...voleva che ogni funzione avesse 4 bit 1111
(leggere scrivere cancellare
 e boh..mi sembra stampare)
Macellissimo in vb6...eccessivamente prolisso (addirittura alle
funzioni di maschera...ai tasti mi fece applicare questa roba....avevo
un foglio di excel enorme che mi rappresentava ogni menu sottomenu
funzione sottofunzione....mi capitava di "trattare" roba davvero come
hai visto sopra
(111100101000101010100101101110011001000011001010101010)....scomodissimo
se in fase beta dovevi aggiungere qualche funzione!
e per che applicazione? Gestione scalo merci? Gestione centrale
nucleare? Gestione ospedali riuniti fatebenefratelli???
....no.....gestione salone da coiffer!(....un parrucchiere!)
Metti tutto in una tabella di access(che è un ottimo file di
configurazione per queste cose...ti consiglierei per la fase beta...ma
anche oltre...di lasciare un config.mdb...anche se sviluppi sotto
SQLserv o Oracle...usa access come sistema di config!)
Una tabella che descrive la funzione (caso mai con le impostazioni di
default)...ed una correlata con "CHI" può far "COSA"....camperai più
tranquillo....non ci saranno problemi ad espandere le funzioni
controllate...sarà veloce far tutto!
Anche perchè questi ingegneri non capiscono una cosa.....
se io spipolo questo file di testo....accedo a tutto....
dove cazzo sta la sicurezza?
Tanto vale non mettere nulla!
p.s.
Un mio amico ...spippolando in rete...ed essendio un ragioniere
informatico...molto badante al "quattrino" e poco alla "bella
programmazione"...ossia un tipo "pratico" e pragmatico...
aveva sviluppato (copiato adattato) una serie di routine che
estremizzavano il tutto!
In pratica come record di access aveva messo (in config.mdb) anche la
descrizione della maschera...i collegamenti ai datacontrol...e i vari
testi personalizzati...
Di fatto ai vari clienti vendeva sempre la "SOLITA" applicazione che
personalizzava in 2 3 giorni spippolando i record di access e
aggiungendo qualche stampa particolare tanto per beccarsi i soldi della
"personalizzazione".....il bello è che tutto funzionava!...e non
peggio dei gestionali zucchetti!


 peggio dei gestionali zucchetti!
Vedo che conosci la zucchetti sei toscano? (oddio non so se è a livello
italiano)
Comunque va tutto bene fino a quando non ci sono problemi in quel modo.
Noi per gestioni e stampe personalizzate abbiamo exe aggiuntivi, o al
limite report.
La peggio è che c'è qualche IF nei programmi
es.
If cliente=Pippo then 
	QTA=QTA*1.5
else
	QTA=QTA
end if
Ma vabbè....
****************
Public Function bAllow(ePosIndex As QualificationPos, eTipoAccesso As
QualificationType) As Boolean
      'funzione che mi dice se posso fare (true) o no (false) un'operazione
      'Entra la posizione da cercare nel file delle abilitazioni (tramite
una enum)
      '1) Entra il tipo di accesso necessario x dare Ok
bAllow(ePosIndex,[Enum]TipoPermesso)
      '2) Per verificare il permesso di entrare in una procedura
bAllow(ePosIndex,abBlocked)
      'Full>Insert/Update>Read
 
      'Tipi permesso Enum: abFull, abUpdate, abInsert, abRead, abBlocked
 
  Dim ePosValue As QualificationType
 
  ePosValue = LoadQualValue(ePosIndex)  'carico il valore una mid$ in
pratica
 
  'a seconda del tipo di richiesta verifico se ho i requisiti
  Select Case eTipoAccesso
    Case abFull             'richiesto permesso COMPLETO (Full)
      Select Case ePosValue
        Case abFull
          bAllow = True
        Case Else
          bAllow = False
      End Select
 
    Case abInsert           'richiesto permesso INSERT (Full + Insert)
      Select Case ePosValue
        Case abFull, abInsert
          bAllow = True
        Case Else
          bAllow = False
      End Select
 
    Case abUpdate           'richiesto permesso UPDATE (Full + Update)
      Select Case ePosValue
        Case abFull, abUpdate
          bAllow = True
        Case Else
          bAllow = False
      End Select
 
    Case abRead             'richiesto permesso LETTURA (Full + Update +
Insert + Read)
      Select Case ePosValue
        Case abFull, abUpdate, abInsert, abRead
          bAllow = True
        Case Else
          bAllow = False
      End Select
 
    Case abBlocked          'richiesto permesso Bloccato al contrario degli
altri in cui si richiede il permesso
      Select Case ePosValue 'per dare True, qui si chiede il permesso che
non va bene
        Case abBlocked
          bAllow = False
        Case Else
          bAllow = True
      End Select
 
  End Select
End Function
**************************


Andrea [Work] ha scritto:
zac
Si si Andrea tutto bello e funzionante!
resto però sempre dell'idea che
If ChiediPermesso("UTonto49","Stampa fatture") then
    esegui quello che vuoi
end if
o la variante
If ChiediPermesso("PCAMMINISTRAZIONE01","Stampa fatture") then
    esegui quello che vuoi
end if
Sia enormemente più pulito
ChiediPermesso è una funzione
che cosa fa?
 Apre connessione su mdb
   Interroga con un po di SQL
     Risponde SI o NO
Chiude connessione
il sistema si presta a molte cose "utili"
ad es.
-)impostazioni di default
-)(con una data) controllo licenze (dopo un po gli seghi le stampe o
gliele fa venire sporcate con un bel DEMO stampato in diagonale)
-)Localizzazione multilingua
etc etc
svantaggi...butti via un po di potenza (al pari comunque delle tue
routines)
devi farti una conn in più e ricordarti di distribuire e manutenere un
file in più (config.mdb)
Comunque alla fine basta che funzioni!
Il come ci si incasina è sempre soggettivo!(io mi incasino con le
classi...odio OOP)
p.s.
Si son toscano...di Prato
Tu?


 Tu?
Zona valdarno... C'è una ditta Zucchetti dalle mie parti.
-- 


Andrea [Work] ha scritto:
zac
beh mica tutto si esaurisce li!
Quello era il controllo abilitazione
TestoMessaggi(me.form, "ITALIANO")
come ti suona?
SetVarPubbliche("UtenteAnonimo","Variante1")
come ti pare?
Il bello di access è che è UN file...lo scorri come un database
(forse perchè lo è!)...se vuoi un minimo di privacy...niente PW..che
cmq metti come misura minima...ma memorizzi roba criptata con un tuo
algoritmo sega (o con uno serio)
se hai bisogno di cambiare dei set al volo...io fino alla
vers.definitiva (ma anche dopo sotto pw) metto una textbox agganciata
ad un Command per aggieggiarmi via sql le info (a parte che mi porto
office e l'esigenza di tenere roba criptata ce l'ho solo per pochisismi
dati di pochissime tabelle...)
Access è il diavolo??? Beh si e no...per queste cose lo trovo di un
comodo totale!
Lo trovo comodo rispetto ad un file perchè mi piace la soluzione
tabella principale->corrrelata
Perchè non so te...ma a me gli utonti chiedono in continuazione
opzioni incredibili!!!
Uno volav i tasti di scelta in basso...uno in alto...uno con dei colori
alla braccobaldo show....da urlo la fantasia schizoide degli utonti!


 alla braccobaldo show....da urlo la fantasia schizoide degli utonti!
A me pretendono di mettere lettere in campi decimal, premere 2 volte e
mezzo il mouse invece di 3 ecc :)


 parte sviluppatore ne parte cliente?
zac
per interfacciarsi ad ADO....non importa la licenza ...nel senso che le
dll di ado son rilasciate come parte del SO...devi avere windows non
tarocco e stop...
poi...
per usarle da vb6...devi avere la licenza di vb6
come se le vuoi usare da Delphi ...devi avere la licenza di delphi....
ma non tanto per ususfruire di ADO...ma per costruirli intorno il
programma!
Il problema ti sorge a monte....come lo costruisco un file mdb?
In queste cose è ovvio che ACCESS è comodissimo...e mi pare difficile
non trovare una swhouse che non abbia almeno un OFFICE premium ...anche
vecchio (un 2000) per costruirsi il file mdb! ...
Comunque la soluzione c'è
http://www.comunecampagnano.it/gnu/accessless/
OPENOFFICE

 OPENOFFICE
Logicamente la mia confusione mentale ha raggiunto livelli
altissimi....parziale scusante ho 38 di febbre!
C'è il VisData dell'ide di VB6 per farsi i file ANCHE mdb!!!
Sorry della grave dimenticanza!!!
E poi mi sembra anche il progetto del carlo Lupo "Espodama" sul SC mi
sembra!

 vecchio (un 2000) per costruirsi il file mdb! ...
Guarda non ho sottomano la licenza Office, comunque Access non ce l'ho
installato, probabilmente è una versione con solo word/excel, oppure non è
stato installato all'inizio (usando firebird).
Comunque con
Dim catNewDB As ADOX.Catalog
e SQL si farebbe in ogni caso :)), comunque poi guardo il VisData :)
Intanto il file di testo è praticamente funzionante, adesso un mio collega
sta studiando una chiave Hw da integrare nei sw, boh imho era più comodo
farlo da sw con chiave inviata secondo HDD,MAC, CPU_ID ecc.
Anche se con la chiave hw sarà più sicuro...
Tnx
