Newsgroup: it.comp.appl.access
Titolo: Select Case su array ...

Ciao a tutti sto cercando di far andare una funzione che mi valuti un
array ...
ma mi restituisce sempre il primo valore.
Qualcuno ha la pazienza di vedere che cavolo ha???
Public Function Severita(Probabilita As Integer, Impatto As Integer)
As String
Dim StrArray(2) As Variant
StrArray(0) = Probabilita
StrArray(1) = Impatto
Dim StrMinima As String, StrModerata As String, StrAlta As String, _
StrCritica As String
StrMinima = 32768
StrModerata = 65280
StrAlta = 1142766
StrCritica = 255
Select Case StrArray(2)
Case StrArray(0) = 1 And StrArray(1) = 1
Severita = StrMinima
Case StrArray(0) = 1 And StrArray(1) = 2
Severita = StrMinima
Case StrArray(0) = 1 And StrArray(1) = 3
Severita = StrModerata
Case StrArray(0) = 1 And StrArray(1) = 4
Severita = StrAlta
'' CASI probabilita=2
Case StrArray(0) = 2 And StrArray(1) = 1
Severita = StrMinima
Case StrArray(0) = 2 And StrArray(1) = 2
Severita = StrModerata
Case StrArray(0) = 2 And StrArray(1) = 3
Severita = StrAlta
Case StrArray(0) = 2 And StrArray(1) = 4
Severita = StrCritica
'' CASI probabilita=3
Case StrArray(1) = 3 And StrArray(1) = 1
Severita = StrMinima
Case StrArray(0) = 3 And StrArray(1) = 2
Severita = StrModerata
Case StrArray(0) = 3 And StrArray(1) = 3
Severita = StrAlta
Case StrArray(0) = 3 And StrArray(1) = 4
Severita = StrCritica
'' CASI probabilita =4
Case StrArray(1) = 4 And StrArray(1) = 1
Severita = StrModerata
Case StrArray(0) = 4 And StrArray(1) = 2
Severita = StrAlta
Case StrArray(0) = 4 And StrArray(1) = 3
Severita = StrCritica
Case StrArray(0) = 4 And StrArray(1) = 4
Severita = StrCritica
End Select
Debug.Print Severita
StrArray(0) = 0
StrArray(1) = 0
End Function

  Select Case StrArray(2)
Questo valuta un elemento dell'array che non č mai stato inizializzato.
Tu assegni un valore solo agli elementi (0) e (1).
A parte questo, anche se non ho provato non credo che si possa valutare
cosě un array, dovresti usare un altro sistema. Per esempio usare un byte
in cui usi due gruppi da due bit per ciascuno dei parametri.
Perň io userei un altro sistema. Decodificando la tua tabella si nota una
corrispondenza tra Impatto e Severita:
Severita(0) = StrMinima
Severita(1) = StrMinima
Severita(2) = StrModerata
Severita(3) = StrAlta
Severita(4) = StrCritica
Severita(5) = StrCritica
select case Probabilita
case 1
  indice=Impatto-1
case 2, 3
  indice=Impatto
case 4
  indice=Impatto+1
end select
risultato=severita(Indice)
oppure 
  risultato=severita(Indice+iif(Probabilita=1,-1,0)+iif(Probabilita=4,1,0))
se vuoi eliminare il select case.
Ciao.
-Marco-
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
ab...@newsland.it
Infatti ... sono riuscito con una serie di elseif al posto di select
case ...
molto strano.

 StrArray(1) = Impatto
Scusami Ciroteo
ma perchè te li porti in array e non fai i select con Probabilita e Impatto?
io fare una cosa del genere
Function fctNoArray(iPippo As Integer, iPluto As Integer)
 
    Dim i As Integer
    Select Case iPippo And iPluto
        Case 1 And 2
            i = 1
        Case 1 And 3
            i = 2
        Case 1 And 4
 
    End Select
 
    fctNoArray = Choose(1, 32768, 65280, 1142766, 255)
 
End Function

-- 
-- 
MAssimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access

 --



Prova questa variante
Function fctNoArray(iPippo As Integer, iPluto As Integer)
 
    Dim i As Integer
    Dim iSelect As Byte
 
    iSelect = iPippo * 10 + iPluto
 
    Select Case iSelect
        Case 11, 21, 34
            i = 1
        Case 12
            i = 2
        Case 13
 
    End Select
 
    fctNoArray = Choose(i, 32768, 65280, 1142766, 255)
 
End Function
-- 


 molto strano.
Niente di strano. Se sostituisci i parametri tenendo conto che StrArray(2)
è uguale a zero, essendo stata dichiarata ma non assegnata, e supponendo
di passare ad esempio i valori 2 e 3:
  Select Case StrArray(2)
  Case (StrArray(0) = 1 And StrArray(1) = 1)
    Severita = StrMinima
  Case (StrArray(0) = 1 And StrArray(1) = 2)
    Severita = StrMinima
diventa:
  Select Case 0
  Case (2 = 1 And 3 = 1)
    Severita = StrMinima
  Case (2 = 1 And 3 = 2)
    Severita = StrMinima
che diventa:
  Select Case 0
  Case (false And false)
    Severita = StrMinima
  Case (false And false)
    Severita = StrMinima
dato che (false And false) è uguale a False, e zero è uguale a False,
prende il primo Case.
Quindi eseguirà sempre il primo Case tranne quando passi i valori 1 e 1,
per i quali il primo Case si aspetta un True (true And true), nel qual
caso eseguirà il secondo Case che si aspetta un false (true And false).
Chiaro? Sennò te lo rispiego ;-)
Ciao.
-Marco-
-- 
questo articolo e` stato inviato via web dal servizio gratuito 


ciao marco!
la pallavolo, dopo l'infortunio al tendine, è solo un vecchio ricordo.
caspita mi hai fatto venire il mal di testa
ho capito il trucchetto del fatto di pigliare solo il primo case.
ci vuole una mente superiore!!!
provo a spiegarti cosa stiamo cercando  di fare:
dobbiamo stabilire il valore di un rischio.
il rischio è dato dalla probabilità per l'impatto.
però non basta moltiplicarli perchè
a seconda dell'impatto (che può essere anche molto alto)
occorre attuare misure correttive più intense.
per questo stabiliamo delle cd. severità/gravità del rischio.
impatto 4 probabilità 1 = me ne frego
impatto 1 probabilità 4 = miii che paura!
perchè l'incidenza delle probabilità è maggiore dobbiamo modulare il
tutto a seconda dei casi.
visto le combinazioni possibili sono solo 16 (scala di 4 livelli )
faccio gli elseif e poi con calma mi studio le vostre soluzioni.
m
On 6 Feb, 16:56, 
marco.pizzamig...@gmail.com
 (Marco Pizzamiglio)
wrote:



 
Il discorso dei doppio casi da vautare messi con i select è facilmente spiegabile
Mettendo tra parentesi le due condizioni con AND la risposta è Vero o falso al verificarsi di quelle condizioni
Quindisi tradurrebbe in 
SELECT Case ..
    case True
dove true sta per (impatto = 1 and probabilita=1)



Se vuoi rendere ancora più palese la cosa puoi fare
Enum Probabilita
Possibile = 1
Forse = 2
Puodarsi = 3
Sicuro = 4
end enum
Enum Impatto
TaccataEFuga = 1
FalloTecnico = 2
Simulazione = 3
Grande = 4
End Enum
Poi la funzione la rendi così
 Function fctNoArray(iPippo As Probabilita, iPluto As Impatto)


 m
Se posso suggerire un'ulteriore alternativa all'interminabile cascata di
elseif...
Perchè non una bella matrice bidimensionale indirizzabile direttamente con
i due parametri?
Dim x(4, 4) As quello_che_vuoi
x(1, 1) = quello_che_vuoi
x(1, 2) = quello_che_vuoi
.....
x(2, 1) = quello_che_vuoi
x(2, 2) = quant'altro_vuoi
.....
La dichiari public e non ti serve nemmeno la function. O la dichiari
static in una function.
E se fra due o tre anni devi fare modifiche non impazzisci a seguire la
logica degli elseif.
Ciao.
-Marco-
-- 
questo articolo e` stato inviato via web dal servizio gratuito 


 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
ab...@newsland.it
ecco è proprio questo che sbagliavo! davo una matrice ad una
dimensione.
cmq ho pensato anche a una cosa più semplice:
se ho sedici casi posso tranquillamente analizzare la stringa o il
numero che si genera
dalla semplice accoppiata:
1 e 1= 11
1 e 2=12
2 e 1= 21
e mi faccio il select case sui sedici numeri/stringhe ...
pensarci prima.
Il problema è se aumenta la scala, ma siccome ora è solo di 4 per
probabilità e 4 per impatto lascio cosi.
m