Newsgroup: it.comp.appl.access
Titolo: Sincronizzazione caselle combinate

Salve a tutti,
spero che ci sia qualcuno da queste parti che possa essermi di aiuto a
risolvere questo problema che mi sta facendo dannare inspiegabilmente
da alcuni giorni.
Ho già affrontato diverse volte il problema e non mi era parso di aver
mai riscontrato le problematiche attuali, ma evidentemente questa volta
mi sfugge qualcosa.
Il problema è di sincronizzazione di due caselle combinate in una
maschera.
Ho creato 4 tabelle:
--- Offerte ---
IDOfferta - Contatore 
NumeroOfferta - Numero
DataOfferta - Data/Ora
Chiave Primaria(IDOfferta)
--- LineaProdotti ---
IDLineaProdotti - Contatore
LineaProdotti - Testo
--- Prodotti ---
IDProdotto - Contatore
IDLineaProdotto - Ricerca Guidata su tabella LineeProdotti
Prodotto - Testo
Chiave Primaria (IDLineaProdotto, Prodotto)
Ogni offerta può riguardare più prodotti, una relazione molti a molti,
che ho provato a realizzare utilizzando 2 versioni della tabella:
ProdottiNellaOfferta
PRIMA VERSIONE
--- ProdottiNellaOfferta ---
IDOfferta - Ricerca Guidata su tabella Offerte
IDProdotto - Ricerca Guidata su tabella Prodotti
Chiave Primaria(IDOfferta, IDProdotto)
Quello che vorrei realizzare è questo:
Una semplice maschera con una sottomaschera per inserire i Prodotti
nella Offerta, i Prodotti però sono scelti dopo aver definito la
LineaProdotto di appartenenza.
Utilizzo la creazione guidata per creare una maschera e la relativa
sottomaschera.
Nella creazione utilizzo i campi della tabella Offerte e aggiungo il
campo IDProdotto proveniente dalla tabella ProdottiNellaOfferta.
Alla sottomaschera aggiungo una Casella Combinata dal nome
cmbIDLineaProdotto collegata alla tabella LineaProdotti il cui valore
non viene però inserito in nessun campo. Tale Casella Combinata mi
permette di di selezionare l'IDLineaProdotto da utilizzare nella query
che riempe la Casella Combinata IDProdotto:
SELECT Prodotti.IDProdotto, Prodotti.Prodotto
FROM Prodotti
WHERE (
        ((Prodotti.IDLineaProdotto)=[cmbIDLineaProdotto])
      )
ORDER BY Prodotti.Prodotto; 
Nella casella combinata cmbIDLineaProdotto inserisco nell'evento dopo
aggiornamento inserisco il codice:
Me.IDProdotto.Requery
Il meccanismo di limitare la selezione dei prodotti solo all'ambito di
quelli appartenenti alla LineaProdotti scelta funziona, ma inserito il
primo prodotto nella sottomaschera, quando si inserisce il secondo
appena si imposta la nuova LineaProdotto anche la precedente si
modifica.
SECONDA VERSIONE 
--- ProdottiNellaOfferta ---
IDOfferta - Ricerca Guidata su tabella Offerte
IDLineaProdotto - Ricerca Guidata su tabella LineaProdotti
IDProdotto - Ricerca Guidata su tabella Prodotti
Chiave Primaria(IDOfferta, LineaProdotti, IDProdotto)
In questa seconda versione ho inserito nella tabella di relazione anche
il campo IDLineaProdotto, concettualmente mi piace meno, il prodotto
porta infatti già con sé l'informazione della LineaProdotto a cui
appartiene, un inserimento senza maschera potrebbe infatti dare origine
concettualmente ad associazioni LineaProdotto - Prodotto errate.
Il meccanismo in questo caso è il medesimo di quello utilizzato in
precedenza con la differenza che la Casella Combinata dal nome
cmbIDLineaProdotto collegata alla tabella LineaProdotti memorizza in
questo caso il valore nel campo IDLineaProdotto della tabella di
relazione.
La query è la medesima di quella precedente e l'evento pure, in questo
caso però anche se il meccanismo di limitare la selezione dei prodotti
solo all'ambito di quelli appartenenti alla LineaProdotti scelta
funziona, quando si inserisce il secondo scompare il primo.
Quando dico scompare intendo che in tabella i valori inseriti sono
presenti, ma nella sottomaschera non viene più visualizzato.
Se chiudo la maschera e la riapro, al contrario viene visualizzato solo
il primo.
TERZA VERSIONE
--- ProdottiNellaOfferta ---
IDOfferta - Ricerca Guidata su tabella Offerte
IDProdotto - Ricerca Guidata su tabella Prodotti
Chiave Primaria(IDOfferta, IDProdotto)
Rispetto alla prima l'unica differenza è che aggiungo una Casella
Combinata dal nome cmbIDLineaProdotto collegata sempre alla tabella
Prodotti in cui però viene visualizzato IDLineaProdotto ma il valore
ottenuto viene memorizzato nel nel campo IDProdotto della tabella
di relazione.
Non riesco però a limitare la lista delle LineeProdotti provenienti
dalla tabella Prodotti a solo quelle diverse, in modo da avere valori
univoci.
In questo caso impostato la LineaProdotti ottenendo l'IDProdotto
associato utilizzo una sottoquery per determinare quale sia la
LineaProdotto associata e seleziono i prodotti solo appartenenti ad
essa.
L'evento di aggiornamento è sempre il medesimo.
Spero di essere stato sufficientemente chiaro.
A presto
Buon Natale
gallus

 wrote in message 
news:20081226213512.4d3a58a4@asterix...
Salve a tutti,
spero che ci sia qualcuno da queste parti che possa essermi di aiuto a
risolvere questo problema che mi sta facendo dannare inspiegabilmente
da alcuni giorni.
[...]
Io sono uno sfaticato e nemmeno mi è passato per l'anticamera
del cervello di leggere tutto il tuo lungo messaggio.
Ti auguro di trovare qualcuno più disponibile di me.
Se così non fosse... prova ad usare maggior concisione.
Contraccambio gli auguri.
Bruno

 ha scritto nel messaggio 
news:20081226213512.4d3a58a4@asterix...
Salve a tutti,
spero che ci sia qualcuno da queste parti che possa essermi di aiuto a
risolvere questo problema che mi sta facendo dannare inspiegabilmente
da alcuni giorni.
Ho già affrontato diverse volte il problema e non mi era parso di aver
mai riscontrato le problematiche attuali, ma evidentemente questa volta
mi sfugge qualcosa.
Il problema è di sincronizzazione di due caselle combinate in una
maschera.
....
cut
Effettivamente il post è un po' lungo, ma forse era indispensabile.
Mie considerazioni:
La prima cosa che balza all'occhio è che manca una una tabella 
DettagliOfferte.
Infatti, e se ho ben capito, la maschera principale dovrebbe contenere 
l'offerta e la sottomaschera i dettagli di questa offerta con lineaprodotto 
e prodotto.
Se è così dovrebbero bastare questi cambiamenti:
togliere la doppia chiave su Prodotti e lasciarla solo su IDProdotto; creare 
una relazione uno a molti (aggiorna campi ed elimina record correlati) tra 
IDLineaProdotti di LineaProdotti e IDLineaProdotto (che francamente 
chiamerei Linea - numerico) di Prodotti.
Aggiungere una Tabella "DettagliOfferte" con IDDettagli (numerico o 
contatore) chiave primaria; Offerta - numerico, Linea - numerico e 
Prodotto - numerico;
la relazione sarà uno a molti tra IDOfferta di Offerte e Offerta di 
DettagliOfferta (aggiorna campi ed elimina record correlati).
A questo punto usando anche il wizard puoi crearti le tue combo di ricerca:
Ricerca su Linea di DettagliOfferta:
SELECT LineaProdotti.IDLineaProdotti, LineaProdotti.LineaProdotti FROM 
LineaProdotti;
colonna associata = 1
numero colonne: 2
larghezza colonne= 0 cm;7 cm
righe in elenco= 15
larghezza elenco = 7
solo in elenco = Sì
Lo stesso farai su Prodotto di DettagliOfferta...prendendo i valori dalla 
tabella Prodotti.
Siccome a te interessa che nei dettagli della maschera Offerte i prodotti 
scelti siano quelli di una certa linea, e considerando che puoi scegliere la 
linea a causa della ricerca appena fatta, non dovrebbe essere difficile 
collegare le due combo affinchè all'aggiornamento della prima (Linea) si 
aggiorni anche la seconda (Prodotto) in base al valore della prima.
Da quello che ho capito non ti serve una tabella intermedia per creare una 
relazione molti a molti in quanto tutto ruota sull'offerta che avrà o che 
potrebbe avere o una sola linea e molti prodotti di quella linea o molte 
linee e molti prodotti di linee diverse...
Un'ultima considerazione: eviterei se non indispensabile il campo di tipo 
contatore; due righe di codice saranno in grado di generare un numero 
progressivo molto più gestibile rispetto al contatore.
Ciao, Carlo 

 
Grazie mille, spero di aver chiarito alcuni punti.
gallus

 
Grazie per l'interessamento comunque
spero di essere stato più sintetico.
gallus

 numero progressivo molto più gestibile rispetto al contatore.
Tipo quali righe di codice? Il contatore mi era parso quello più
intuitivo e rapido, ma sono aperto a qualsiasi suggerimento.
-----------------------------
Il contatore va bene se non hai problemi con la numerazione nel senso che se 
cancelli un valore, il contatore non ti permette di avere più il numero 
cancellato: lo perdi.
Inoltre il contatore a volte si comporta in modo bizzarro dando dei numeri 
(è il caso di dirlo) stratosferici.
Un esempio di codice per creare un numero progressivo è questo, che metterai 
su selezionato di un controllo (in questo caso un ID):
If isnull(me.ID) or me ID = 0 then
Me.ID = nz(DMax("ID","TuaTabella"),0) + 1
end if
Grazie mille, spero di aver chiarito alcuni punti.
gallus
-----------------------------
Ciao, Carlo

Come prima cosa ringrazio chi ha cercato di darmi una mano a risolvere
il problema che ho postato, ma alla fine credo di aver compreso che il
problema che ho sollevato non abbia soluzione.
Dando un sguardo alle FAQ relative alle forms ho trovato questa:
3.77 Sincronizzare in una maschera due o più caselle combinate
ASSOCIATE tra loro in gerarchia
In questa FAQ si evidenzia nella descrizione esattamente il problema da
me riscontrato e la soluzione proposta, come viene riportato nella FAQ
stessa, permette non di risolverlo ma di limitarlo:
<< il "blackout" di descrizione della casella combinata
associata avverrà solo nel breve lasso di tempo che intercorre tra la
selezione fatta nella casella combinata di livello superiore e la
selezione fatta nella casella combinata associata >>
Al momento questa è la soluzione migliore, ma sto cercando di capire se
ci sia un sistema per migliorarla ulteriormente, attingendo da:
http://support.microsoft.com/kb/289670/it
sviluppando in Access 2003 ho visto che anche solo l'aggiunta del
codice Me.Products = Me.Products.ItemData(0) sull'evento aggioramente
rende più gradevole l'operazione.
A presto
gallus

 ha scritto nel messaggio 
news:20081227203234.3c0b407f@asterix...
Come prima cosa ringrazio chi ha cercato di darmi una mano a risolvere
il problema che ho postato, ma alla fine credo di aver compreso che il
problema che ho sollevato non abbia soluzione.
Dando un sguardo alle FAQ relative alle forms ho trovato questa:
3.77 Sincronizzare in una maschera due o più caselle combinate
ASSOCIATE tra loro in gerarchia
--------------------------------------------
A gallus...o sono io che non ho capito nulla, oppure qui c'è qualcosa che 
non mi quadra.
Seguendo questo link:
http://www.gestionefrantoio.eu/prod.zip
puoi scaricare un db di esempio in formato Access XP, la maschera 
interessata è MOfferte e nella sottomaschera puoi scegliere prima una linea 
e poi fare click sul campo con i puntini e scegliere il prodotto.
Fammi sapere.
Ciao, Carlo 

 
Ciao Carlo,
prima di tutto grazie ancora per il tuo interessamento, ho scaricato il
file con la simulazione che hai realizzato, ma il meccanismo realizzato
dalla maschera MOfferte che mi mostri non è corretto.
Uso i nomi usati nel tuo file.
- Il "ProdottoVero" dovrebbe essere scelto tra un insieme limitato dopo
aver impostato "Linea".
- Nella sottomaschera "MDettagliOfferta" contenuta nella maschera
"MOfferta" si crea un grave errore di abbinamento ad una "Linea" puoi
associare qualsiasi prodotto anche uno non appartenente a quella
"Linea", le associazioni "Linea"-"Prodotto" dovrebbero essere quelle
che hai realizzato nella tabella "Prodotti".
Spero di essere stato più chiaro, se hai piacere però appena ho
completato questo esercizio, ti mando via mail il file.
A presto
gallus

 ha scritto
cut
Ciao Carlo,
prima di tutto grazie ancora per il tuo interessamento, ho scaricato il
file con la simulazione che hai realizzato, ma il meccanismo realizzato
dalla maschera MOfferte che mi mostri non è corretto.
Uso i nomi usati nel tuo file.
- Il "ProdottoVero" dovrebbe essere scelto tra un insieme limitato dopo
aver impostato "Linea".
--------------------------------------------
Così è ... dopo aver scelto la linea il controllo con i puntini mostra solo 
i prodotti per quella linea e, scegliendo il prodotto da qui, il controllo 
"ProdottoVero" si valorizza con quel prodotto scelto.
E' però vero che necessita di altri aggiustamenti come svuotare 
completamente la combo dei prodotti dopo la scelta...o duplicare il 
controllo Linea come già fatto con ProdottoVero, ecc. ...ma io volevo solo 
darti un imput non fare il programma.
--------------------------------------------
- Nella sottomaschera "MDettagliOfferta" contenuta nella maschera
"MOfferta" si crea un grave errore di abbinamento ad una "Linea" puoi
associare qualsiasi prodotto anche uno non appartenente a quella
"Linea", le associazioni "Linea"-"Prodotto" dovrebbero essere quelle
che hai realizzato nella tabella "Prodotti".
--------------------------------
Si ma, ripeto, non è stato fatto il debug completo...
Spero di essere stato più chiaro, se hai piacere però appena ho
completato questo esercizio, ti mando via mail il file.
-----------------------------------
Manda pure.
A presto
gallus
Ciao, Carlo

Ciao Carlo,
i puntini non li avevo notati, comunque ora che l'ho fatto presenta il
problema segnalato da me all'inizio nel mio post anche quello
evidenziato nella FAQ.
gallus