Newsgroup: it.comp.appl.access
Titolo: Menù a caduta

Salve,
ho creato un Database con Access di Office 97.
Nella maschera ho inserito i menù a caduta, in modo da poter selezionare il
campo già esistente con un semplice "click", senza dover digitare sempre
tutto.
Non riesco però ad attivare quella funzione (riscontrata in alcuni database
gia pronti) dove con il doppio click si possono inserire nuovi dati.
So di non essere stato molto chiaro, ma se potete aiutarmi scrivetemi, e
cercherò di essere più chiaro.
Grazie
Andrea Conti

 wrote in message 38d0f...@news.dada.it...

Sei stato chiarissimo.
Quella simpatica funzione non e' preconfezionata nel controllo, ma
esplicitamente inserita (tramite codice VBA) nell'evento DoppioClick del
controllo.
D'altro canto, se devi solo inserire un nuovo valore nel campo e'
sufficiente impostare la proprieta' SoloInElenco del controllo a No.
Ciao, Sib
--
------------------------------------------------------
il sito comune di it.comp.database.access:
http://members.xoom.it/it_db_access
------------------------------------------------------
4000 anni fa', il saggio egizio Ptahhotep scrisse:
"... perche' non esistono saggi per nascita."
------------------------------------------------------
Saturiamo ECHELON:
bomba saddam attentato medio oriente

Ciao Andrea,
scusami se mi dilungo, ma il pb a cui accenni deriva dall'esistenza dei
cosiddetti "vincoli di integrita' referenziale". Quando costruisci una
base dati (tabelle e relazioni) dai una rappresentazione della realta' che
vuoi catturare e implicitamente assegni delle regole che impediscono ai
dati di essere tra loro inconsistenti. Se ad esempio costruisci due
tabelle:
CLIENTE(NOME, societa, ...)
ORDINE(CODICE, nomecliente, ...)
(in cui NOME e CODICE sono chiavi) e imponi che NOME.CLIENTE referenzi
(sia in relazione con) ORDINE.nomecliente, implicitamente descrivi una
realta' in cui TUTTI e SOLO quei clienti che sono noti alla tabella
CLIENTE possono emettere un ordine contenuto nella tabella ORDINE. (sto
implicitamente supponendo che la relazione creata sia ragionevolmente una
relazione 1 a molti ovvero UN cliente fa MOLTI ordini).
Questo ti dice che quando hai un ordine nuovo di un cliente nuovo, PRIMA
devi inserire il nome del cliente nella tabella CLIENTE e poi, una volta
che questo e' noto alla base dati, puoi inserire un suo ordine nella
tabella ORDINE.
Ipotizzando di avere una maschera frmOrdini e una frmClienti, quello che
hai gia' fatto e' inserire un controllo lista (menu a caduta) nella
frmClienti associandolo al campo NOME della tabella CLIENTE; in questo
modo quando premi sul controllo appare l'elenco di tutti e solo quei
clienti che sono contenuti nella tabella clienti.
Quando inserisci deliberatamente un nome che non e' contenuto nell'elenco
tenti di violare il vincolo di integrita' referenziale tra le due tabelle
e quando tenti di salvare il record Access ti ammonisce e si incazza. In
effetti ha ragione perche' tu (nella situazione ipotizzata) gli stai
dicendo che c'e' un ordine fatto da uno sconosciuto che Access non potra'
mai referenziare perche' il suo nome non e' nella tabella CLIENTE, e non
ci sono trucchi... lui pretende che il cliente sia gia' esistente!
D'altronde pensa a cosa accadrebbe se Access non controllasse tali
vincoli: tutti gli errori di battitura finirebbero per essere clienti
diversi.
A questo punto hai 2 soluzioni:
1) (facile facile) Se il data base lo usi solo tu basta ricordarsi di
inserire prima il cliente e poi il relativo ordine.
2) (professional) Che e' quella che richiedi: Innanzitutto assicurati che
nelle proprieta' del controllo lista (il tuo menu a caduta) sia impostata
a TRUE la proprieta': "consenti NON in lista" (non mi ricordo il nome
preciso in inglese ma non puoi sbagliare).
Poi (e qui' c'e' la parte piu' complicata) devi controllare l'evento
NOT_IN_LIST che questo controllo possiede... e qui' io posso aiutarti solo
in VBA perche' le macro non le ho mai volute usare! Dunque... come avrai
capito dallo sproloquio teorico-pratico (di cui mi scuso ancora) bisogna
inserire il cliente... allora l'evento NOT_IN_LIST si attiva guarda caso
quando cio' che viene inserito non e' presente nella lista... quindi se
nella maschera hai chiamato "listaClienti" il menu a caduta e
"nomeSocieta" il controllo in cui si inserisce il nome della societa',
quando l'evento NOT_IN_LIST si verifica avrai che "Me.listaClienti.Value"  
e "Me.nomeSocieta.Value" conterranno i valori che vorrai inserire nella
tabella clienti.
A questo punto se vuoi puoi fare dei controlli del tipo: "Vuoi veramente
inserire " & Me.listaClienti & "?" ed eventualmente cancellare l'azione
con Cancel=True
Sub frmClienti_NotInList(Cancel AS Boolean) (o qualcosa del genere)
If MsgBox("Vuoi...", vbYesNo)=vbNo Then
	Cancel = True
Else
	...va bene allora inseriamolo...
End If
End Sub
l'inserimento si ottiene eseguendo una opportuna query SQL quindi:
doCmd.RunSQL
   ("INSERT INTO CLIENTE(nome, societa) VALUES(' & a & ',' & b & ');"
Me.Requery
(occhio agli apici e alle &) dove al posto di *a* metti Me.nomeCliente e
al posto di *b* metti Me.nomeSocieta
Magicamente questo inserira' il nuovo cliente... l'utente non si e'
accorto di nulla e se quardi nella lista (grazie al Me.Requery) vedrai che
il nuovo nome compare per i futuri inserimenti... Ovviamente quando tenti
di salvare il record con l'apposito comando oppure cambiando record Access
non battera' ciglio... infatti tutti i vincoli sono rispettati.
Spero di esserti stato utile (oltre che noioso), ma se hai dei problemi
con il codice non esitare a contattarmi
Ciao
Giuseppe


Salve,
sto tentando di inserire dei menù a caduta su un Database creato con Access
97.
Purtroppo, nonostante l'aiuto di due volenterosi del NG non ci sono ancora
riuscito. C'è qualcuno che può vendermi un database (già fatto) con le
caratteristiche di cui ho bisogno?
Grazie
Andrea Conti


