Blueyes ha scritto:
...pertanto volendo lasciare questo errore tecnico voluto come posso fare affinche il campo codici complessivi sia aggiornato mediante l'inserimento automatico del codice per ogni casella di controllo "flaggata"? si potrebbe far ricorso al codice VBA? GRAZIE!! anticipatamente
Osvaldo ti ha già invitato a riflettere sulla struttura del tuo db e tu, consapevolmente, hai deciso di lasciarlo inalterato. Questa premessa serviva per dire che la soluzione proposta è costruita ad hoc per questa situazione.
Potresti eseguire un ciclo su tutti i controlli della maschera, discriminando poi l'esecuzione del codice per la costruzione della stringa che contiene la serie di esami richiesti in base al tipo di controllo (casella di controllo) se non ci sono altre caselle di controllo "sì/no" nella maschera e/o in base al nome.
Una cosa del tipo
Dim ctl As Access.Control
Dim strEsami as String
For Each ctl in Me.Controls Then
If ctl.ControlType=Access.AcControlType.acCheckBox then
'codice costruzione stringa
End If
Next
Se invece vuoi discriminare in base al nome (che ovviamente dovrai aver impostato appositamente, esempio chkEsame001, chkEsame002 e via dicendo) la riga con l'If potrebbe diventare
If Left$(ctl.Name, 8)="chkEsame" then
Ora si passa al codice dentro l'If per costruire la stringa che contiene gli esami selezionati. Da qualche parte devi aver associato ad ogni controllo checkbox il codice esame. Potresti avero fatto nel nome, come dicevo prima: chkEsame001, chkEsame002, ... chkEsame999 ed in questo caso andrai a prendere gli ultimi tre caratteri del nome del controllo con la funzione Right$, oppure aver inseriri il solo codice esame, ad esempio, nella proprietà Tag del controllo ed in questo caso sarà sufficente prendere la proprietà Tag così com'è.
Questa è la parte del codice da inserire dentro la If
strEsami = strEsami & Right$(ctl.Name, 3) & "-"
oppure
strEsami = strEsami & ctl.Tag & "-"
alla fine del ciclo trovi una stringa su questo modello
"001-002-005-006-...-095-"
e devi togliere l'ultimo carattere, il segno di separazione di troppo.
strEsami = Left$(strEsami, Len(strEsami)-1)
Per prudenza sarebbe meglio imporre la verifica della lunghezza della stringa, per evitare di togliere l'ultimo carattere ad una stringa vuota (improbabile, significherebbe non aver selezionato alcun esame, cioè la richiesta di un NON esame)
If Len(strEsami) <> 0 Then
strEsami = Left$(strEsami, Len(strEsami)-1)
End If
Ricapitolando
Dim ctl As Access.Control
Dim strEsami as String
For Each ctl in Me.Controls Then
If ctl.ControlType=Access.AcControlType.acCheckBox then
strEsami = strEsami & Right$(ctl.Name, 3) & "-"
End If
Next
If Len(strEsami) <> 0 Then
strEsami = Left$(strEsami, Len(strEsami)-1)
End If
Me!txtEsami.Value = strEsami
L'evento nel quale inserire questo codice potrebbe essere BeforeUpdate della maschera. Su quest'ultimo aspetto non posso darti garanzie (in teoria nemmeno su quanto scritto prima, sono andato a "memoria" ma è abbastanza affidabile). Se non funziona devi inserirlo in AfterUpdate, ricordandoti di riportare il bookmark della recordset della maschera all'ultimo record Inserito/Modificato con
Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone
Me.Bookmark = rst.LastModified
avendo l'accortezza di abilitare la modifica del Recordset della maschera prima di assegnare il valore a txtEsami (tutto quello che segue sostituisce "Me!txtEsami.Value = strEsami")
Set rst = Me.Recordset
rst.Edit
rst!nomecampoesami.Value = strEsami
rst.Update
rst.Close
Set rst = Nothing
In questo thread trovi uno dei tanti esempi scritti da @Alex per le operazioni che usano il ciclo sui controlli di una maschera
**