Newsgroup: it.comp.appl.access
Titolo: [CONTINUA] - Aggiungere voce a Casella combinata

Ciao, su suggerimento di Roberto ho letto la FAQ 3.39 nella sezione Forms
del Sito Comune, ed ho scritto il codice ivi riportato - ovviamente con i
nomi cambiati secondo quelli dei miei controlli - nella sezione notInList
del controllo ccTitoliStudio, ovvero la casella combinata che contiene
l'elenco dei titoli di studio.
Praticamente ho creato una maschera di prova frmPROVETECNICHE sulla quale
ho messo appunto la casella combinata ccTitoliStudio.
Poi ho creato una tabella a due campi tblElencoTitoliStudio, ed ho
impostato Origine Riga di ccTitoliStudio a tblElencoTitoliStudio. Infatti
la casella combinata mostra tutto l'elenco come si deve.
Posso selezionare tranquillamente il titolo di studio che mi interessa. Il
problema però è che il codice non funziona. Cioè...non fa niente. Anzi, mi
manda in errore l'applicazione e mi si apre il debugger di VB, quandoatti
scrivo qualche cosa nella casella combinata che non è in elenco.
Ma dove sbaglio? 
Io vorrei avere una inputbox nella quale scrivere il nuovo titolo di
studio e che vada ad aggiornare sia la tabella che la casella di
riepilogo, ma ancora non so come farlo!
Grazie.
-- 
Non lo capiscono, i grandi, che il mondo dei giovani è un mondo fragile.
E' come un paese in guerra permanente, in cui tutti vogliono avere
ragione. E nel quale veniamo spesso lasciati da soli.
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Grazie.
io per questo evento intercetto l'evento "su non in elenco" per  attivare 
una procedura che apra la maschera di immissione del dato (DITTA o ARTICOLO 
o qualsiasi mashera che vuoi tu), e gli passi già il testo immesso nella 
combo, mettendolo nel campo adeguato della maschera.
Una volta inserito il nuovo elemento, si salva il record, e si fa il requery 
della combo, che a questo punto conterrà il nuovo dato.
------ su non in elenco della combo
Private Sub cmbDitta_NotInList(NewData As String, Response As Integer)
   Response = aggiungiConMaschera(strMasPerAggiungere:="mDitte", _
                                     sControlliEdati:="Denominazione;" & 
NewData & "|", _
                                     strCosa:="Ditta")
End Sub
------ in un modulo di VB
Option Compare Database   'Usa l'ordine del database per valutare le 
stringhe
Option Explicit
Function aggiungiConMaschera(strMasPerAggiungere As String, _
                            sControlliEdati As String, _
                            strCosa As String) As Integer
   ' Aggiunge un nuovo record a una tabella richiamando una finestra,
   ' e poi fà il requery della finestra chiamante.
   ' Pensato per essere chiamato da una procedura di evento
   ' NotInList
   '
   '   strMasPerAggiungere - la maschera da aprire per aggiungere un record
   '   sControlliEdati - il controllo, sulla maschera che aggiunge, che
   '                      corrisponde a quanto immesso nella combo chiamante
   '   strNuovoDato - i NUOVI dati da inserire nel controllo
   '   strCosa - il nome del nuovo elemento da inserire
   '_______________________________________________________________________________
   'ESEMPIO DI CHIAMATA
    '>>>> da inserire in un evento NotInList (del controllo che chiama):
    '                        |> nome della maschera per aggiungere
    '                        |> il campo in aggiunta
  ' Response = aggiungiConMaschera(strMasPerAggiungere:="mas....", _
                                     sControlliEdati:="campo;dato|campo;dato|....", 
_
                                     strCosa:="DescrizioneElemento")
    '>>>> da inserire sull'evento SU CARICAMENTO (della maschera che 
contiene
    '                                              il controllo chiamato)
    ' =LeggiOpenArgs([Form])
   '_______________________________________________________________________________
   On Error GoTo aggiungiConMaschera_Err
   Dim varRet As Variant
    ' si assicura che l'utente voglia aggiungere un nuovo record
   varRet = MsgBox("Aggiungi : " & strCosa & " ?", vbQuestion + vbYesNo, _
    "Attenzione ! " & strCosa & " NON TROVATO")
   If varRet = vbNo Then
      aggiungiConMaschera = acDataErrContinue
      Exit Function
   End If
    'Apre la maschera per aggiungere in modo DIALOGO,
    'riempie i controlli richiesti con i dati adeguati
   DoCmd.OpenForm FormName:=strMasPerAggiungere, DataMode:=acAdd, _
    WindowMode:=acDialog, _
    OpenArgs:=sControlliEdati
    ' Prima che il controllo torni alla maschera chiamante
    ' gli diciamo che abbuamo aggiunto un valore
   aggiungiConMaschera = acDataErrAdded
aggiungiConMaschera_Exit:
   Exit Function
aggiungiConMaschera_Err:
   If Err.Number <> 2501 Then
   MsgBox "Error " & Err.Number & ": " & Err.Description, _
    vbExclamation, "aggiungiConMaschera"
    Else
   MsgBox "@purtroppo non puoi aggiungere " _
    & strCosa & " !@controlla bene tra quelle che hai, forse esiste già !", 
_
    vbExclamation, "aggiungiConMaschera"
    End If
   Resume aggiungiConMaschera_Exit
End Function
Function LeggiOpenArgs(frm As Form)
   ' pensata per essere chiamata per caricare una nuova finestra
   ' Checks the OpenArgs and if it finds a string of
   ' the form
   '   controlname;value
   ' loads that value into that control
   On Error GoTo LeggiOpenArgs_Err
    Dim strNomeControllo As String
    Dim strValControllo As String
    Dim iPuntoVirg As Integer
    Dim iLen As Integer
    Dim iSepara As Integer
    Dim sArgo As String
    Dim iProx As Integer
   If IsNull(frm.OpenArgs) Then
      Exit Function
   Else
        sArgo = frm.OpenArgs ' facilito la localizzazione del parametro
      iPuntoVirg = InStr(1, sArgo, ";")
      If iPuntoVirg = 0 Then
         Exit Function
      End If
      iLen = Len(sArgo)
      iSepara = InStr(1, sArgo, "|")
      iProx = 1
      If iSepara = 0 Then ' sono all'ultimo controllo e dato
        strNomeControllo = Mid$(sArgo, iProx, iPuntoVirg - 1)
        strValControllo = Mid$(sArgo, iPuntoVirg + 1)
        ' Possibly this OpenArgs belongs to someone else
        ' and just lookslike ours. Set the error handling
        ' to just ignore any errors on the next line
        On Error Resume Next
        frm.Form(strNomeControllo) = strValControllo
    Else ' ho passato più controlli e dati
        Do
        strNomeControllo = Mid$(sArgo, iProx, iPuntoVirg - iProx)
        strValControllo = Mid$(sArgo, iPuntoVirg + 1, iSepara - iPuntoVirg - 
1)
        On Error Resume Next
        frm.Form(strNomeControllo) = strValControllo
        If iSepara > 0 Then iProx = iSepara + 1
        If iProx >= iLen Then Exit Do
        iPuntoVirg = InStr(iProx, sArgo, ";")
        If iPuntoVirg = 0 Then Exit Do
        iSepara = InStr(iProx, sArgo, "|")
        'If iSepara = 0 Then
        '    iProx = iPuntoVirg + 1
        'Else
        '    iProx = iSepara + 1
        'End If
        Loop
    End If
   End If
LeggiOpenArgs_Exit:
   Exit Function
LeggiOpenArgs_Err:
   MsgBox "Error " & Err.Number & ": " & Err.Description, _
    vbExclamation, "LeggiOpenArgs()"
   Resume LeggiOpenArgs_Exit
End Function
---- nell'evento SU CARICAMENTO (Evento Load) della maschera che inserisce 
il dato
 =LeggiOpenArgs([Form])
___________
come vedi ho passato il testo tramite OpenArgs e ho scandito campi e 
contenuto tramite un artificio costruito da me.
spero ti serva
-- 
-- 
      /)/)               IVAN                (\/)
     (  '.')         NMCBRMC         ( '.' )
  o(_('')('')                               (")(")_)*
Non Microsoft Certified But Regular
             Microsoft Consumer

 Grazie.
Ciao Giulio
modifica i nomi ed inserisci su evento " non in elenco" della tua combo
in cui avrai settato: Solo in elenco = SI
Private Sub IDProdotto_NotInList(NewData As String, Response As Integer)
Dim ctl As Control
Set ctl = Me.IDProdotto
If MsgBox("Prodotto non in elenco. Vuoi aggiungere?", vbOKCancel) = vbOK 
Then
        Response = False
     DoCmd.OpenForm ("mProdottiNuovi"), , , , acFormAdd, acDialog
    Me.IDProdotto.Requery
    Else
    ' Se si sceglie Cancel, si elimina il messaggio di errore
    ' e si annullano le modifiche.
        Response = acDataErrContinue
        ctl.Undo
End If
End Sub
---
Daniele 

 Grazie.
-- 
Roberto
-----------------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
----------------------------------------------------

 digitato in una InputBox.
Ok, grazie vedrň di fare come dici :)
-- 
Non lo capiscono, i grandi, che il mondo dei giovani č un mondo fragile.


 spero ti serva
Ciao Ivan, grazie ora vedrò di capirci qualcosa di tutto questo codice.
Il problema è che devo fare tutto sul campo: lavorare, studiare, e devo
finire questa cosa in tempo e non so se ce la farò :(


 End Sub
Ciao, ma questa routine ha bisogno di qualcos'altro?
Cioč, il valore che inserisco io, da dove lo prende?
Se, 
ad.es
. voglio aggiungere la voce LAUREA IN FISICA all'elenco, questo
valore da dove lo prendo?
Grazie!
-- 
Non lo capiscono, i grandi, che il mondo dei giovani č un mondo fragile.


 Grazie!
---
Daniele

 cmq sei in buone mani Roberto saprà spiegarti meglio cosa fare.
No, si cioè... io vorrei dare all'utente una bella casella di testo, una
inputbox nella quale inserire la voce da aggiungere alla Combo. Da quello
che ho capito qui queste routine invece vanno scritte direttamente
nell'evento After_update della combo ma come_ce_lo_scrivo_il_valore_dentro?
Scusatemi ma sto ricominciando solo ora ad occuparmi di Access.
Percorso affascinante però abbastanza duro se non ha proprio tutto il
tempo che vuoi per studiare :)
Grazie mille!
P.S. Robertooooooooooo ti prego non mi abbandonare!!!!
-- 
Non lo capiscono, i grandi, che il mondo dei giovani è un mondo fragile.


 qualche strano errore?
Per aggiungere ai riferimenti del tuo database tale libreria, apri con VBE
(Visual Basic Editor) un qualsiasi modulo contenuto nel tuo database; dal
menu Strumenti esegui il comando Riferimenti...; nell'elenco contenuto nella
finestra di dialogo che si aprirà cerca e seleziona la libreria Microsoft
DAO 3.6 Object Library; attiva la casella di riepilogo posta a sinistra del
nome della libreria; sposta questo nuovo riferimento più in alto possibile
nella lista dei riferimenti; pigia il pulsante di comando OK.
[CUT]
