Ciao, piccola premessa:
prima di fornirti una soluzione mi permetto di darti un consiglio spassionato; una delle buone pratiche nella programmazione (tra le varie) è quella di utilizzare dei nomi il più possibile autoesplicativi per definire le variabili, scegliendoli secondo il loro contesto di utilizzo. Questo serve a rendere il codice più chiaro e comprensibile, sia allo sviluppatore stesso (soprattutto in previsione di rimetterci mano a distanza di tempo) sia a chiunque altro voglia/possa manutenerlo.
Personalmente faccio fatica a mettere assieme le cose con tutti quei v1, v20, v123
Nell'impostazione logica di quella condizione. Per gli ultimi tre valori c'è bisogno di utilizzare && (AND logico) anziché || (OR logico). Può essere utile anche usare delle parentesi per raggruppare le varie parti dell'espressione, in modo che sia umanamente più comprensibile (benché in questo caso possa funzionare anche senza).
Sarebbe meglio ridefinire anche le specifiche che hai indicato così da avere le idee più chiare su cosa vuoi ottenere ed evitare possibili equivoci. Siccome, per la prima parte della condizione, hai indicato di rendere readonly, mentre nella seconda hai indicato di rendere selezionabili (che tecnicamente è il contrario di readonly), questo può generare confusione per la corretta elaborazione di tale espressione. Io direi di parlare solo di rendere readonly, quindi "disattivare".
A tal proposito possiamo riformulare le specifiche in questo modo:
CB13 e CB14 devono essere disattivati quando?
se v20==200
oppure (cioè se v20!=200) se NON si presenta la seguente condizione
v23>2 e uno tra v24, v25, v26 sia selezionato
Se tali specifiche sono corrette allora possiamo scrivere l'espressione in questo modo:
codice:
v20==200 || !(v23>2 && (v24=="Yes" || v25=="Yes" || v26=="Yes"))
Se vuoi scomporre il gruppo NOT (quello tra parentesi) dovrai usare, per ciascun operatore, il proprio duale, e per ciascun valore, il proprio valore negato... sono ignorante in teoria ma dovrebbe riferirsi al principio di dualità dell'algebra booleana.
Perciò possiamo ottenere questa espressione che produce lo stesso risultato di quella precedente:
codice:
v20==200 || v23<=2 || (v24!="Yes" && v25!="Yes" && v26!="Yes")
Funziona ugualmente anche senza parentesi (che qui su ho specificato per comprendere meglio le parti in gioco, come ho indicato sopra):
codice:
v20==200 || v23<=2 || v24!="Yes" && v25!="Yes" && v26!="Yes"
Quest'ultima forma è simile a quanto stavi cercando di impostare tu ma (come detto, per il principio di dualità) era necessario utilizzare l'operatore && per quel gruppo di valori.
Tra parentesi, quella condizione potrebbe essere definita una sola volta, magari in una variabile, così da evitare codice ridondante nonché facilitare la manutenzione, ecc. ecc.
Il tuo script può essere impostato in questo modo:
codice:
var disabilitaCB = v20==200 || v23<=2 || v24!="Yes" && v25!="Yes" && v26!="Yes";
v21.readonly = disabilitaCB;
v22.readonly = disabilitaCB;
if (disabilitaCB) {
v21.value = "Off";
v22.value = "Off";
}
.
Volendo essere più sintetici:
codice:
var disabilitaCB = v20==200 || v23<=2 || v24!="Yes" && v25!="Yes" && v26!="Yes";
v21.readonly = v22.readonly = disabilitaCB;
if (disabilitaCB) v21.value = v22.value = "Off";
.
Volendo essere maggiormente stringati:
codice:
if (v21.readonly = v22.readonly = v20==200 || v23<=2 || v24!="Yes" && v25!="Yes" && v26!="Yes") v21.value = v22.value = "Off";
Prova e fai sapere
grazie in anticipo per i tuoi consigli.
Prego, buon proseguimento