Newsgroup: it.comp.appl.access
Titolo: origine dati di un controllo condizionata

Ciao a tutti,
in Access 2003 ho una maschera ordini con sottomaschera righe ordine.
Nella sottomaschera, quando da una casella combinata IDArticolo scelgo 
l'articolo, viene "pescato" il prezzo corrispondente dalla TblArticoli e 
visualizzato.
Quando salvo, il prezzo dell'articolo viene memorizzato nel campo PREZZORIG 
della TblRigheOrdini.
Nel tempo i prezzi degli articoli cambiano.
Vorrei poter aggiungere nuove righe di ordine ad un vecchio ordine, ed il 
programma dovrebbe propormi i nuovi prezzi degli articoli, ma le righe già 
inserite dovrebbero invece rimanere invariate, con il prezzo vecchio.
Si può impostare l'origine dei dati del controllo PRE della sottomaschera 
SubFrmOrd in modo che:
se la riga è nuova, allora proponi il campo prezzo della TblArticoli, se no 
mostra il campo PrezzoRig della TblOrdini
Se sì, come?
Grazie a tutti
Sergio

 ha scritto nel messaggio 
news:csZcl.748$dP4...@news.edisontel.com...

Utilizza l'evento dopo aggiornamento.
if me.newrecord then
    pre.recodsource = "SELECT tuoprezzo FROM tblarticoli"
else
    tuoprezzo = "SELECT tuoprezzo FROM tblordini"
end if
Se PRE è un campo della tabella ordini puoi mandare anche solo il valore.
Naturalmente la select la devi scrivere secondo le tue esigenze....e 
comunque in generale puoi riscrivere tutta la if, comunque con me.newrecord 
intercetti se stai inserendo un nuovo articolo o se lo stai modificando, 
puoi anche nel caso fare un controllo sul record anche con l'evento su 
modfica.
In generale comunque se devi mantenere il prezzo vecchio tieni slegate 
tblarticoli e tblordini in modo tale che quando fai un inserimento mandi nel 
prezzo della tabella ordini il prezzo della tabella articoli con il valore 
che ha attualmente.
Ciao
-- 
Roberto da Parma 

Ciao Roberto e grazie per la risposta,
tu dici di mettere l'if nell'evento "Dopo aggiornamento", ma non ho capito 
aggiornamento di che cosa.
Cerco di spiegarmi meglio:
quando apro un vecchio ordine, magari composto da 5 righe ordine, per 
ciascuna delle 5 righe (che corrispondono ad altrettanti record della 
TblRigheOrdine) si pone il problema di mostrare il prezzo già memorizzato 
nel campo Prezzorig della TblRigheOrdini (e qui mi sembra non ci sia nessun 
evento "aggiornamento"), mentre per la sesta riga, quella nuova che 
inserisco, devo mostrare il contenuto del campo Prezzo della TblArticoli (e 
qui il dopo aggiornamento lo capisco, nel momento in cui agisco sulla 
casella combinata IDArticolo).
A cosa aggancio il codice che mi hai suggerito, per le prime 5 righe?
Ciao e grazie.
Sergio

Sergio ha scritto:

Io personalmente agisco in questa maniera: ogni RIGA d'ordine è sempre memorizzata nella tabella con il prezzo. Se ne inserisco un'altra (a prescindere se è un ordine vecchio o nuovo) il prezzo lo pesco sempre dall'anagrafica articoli (=aggiornato). Le righe già memorizzate non vengono MAI toccate dall'operazione di inserimento (sarebbe un guaio!) quindi hai una sola procedura di inserimento che funziona in ogni caso. Se invece vuoi aggiungere una riga ad un vecchio ordine e nel caso ce ne fosse 1 uguale, riproporre lo stesso prezzo(=vecchio), la procedura cambia
-- 
Questo articolo e` stato inviato dal sito web 
http://www.nonsolonews.it

 ha scritto nel messaggio 
news:gl2ehm$2af$1...@news.nonsolonews.it...


 ha scritto nel messaggio 
news:GF4dl.766$dP4...@news.edisontel.com...

Sergio scrivi dopo il quoting...
Devi spiegare meglio com'è sta maschera/tabella perchè io penso ad una 
casella combinata dove andare a pescare i record articoli ma forse mi 
sbaglio....
Poi non comprendo neanche bene la struttura della tua maschera....
E' del tipo
Ordini
     ---------- Dettaglio ordini
????
Magari spiega meglio perchè a quanto pare in due non abbiam capito


Forse mi sbaglio ma ipotizzando che la tua maschera sia basata su 2 tabelle (testata ordini e righe legate assieme tipo master-details) non capisco dove stia il problema.....nella tab righe tu hai appunto delle righe con dei dati, tra cui il prezzo. Bene. E chi lo tocca + questo? Se richiami l'ordine(vecchio) e aggiungi una riga nuova il prezzo lo prendi dall'anagrafica, semplicemente facendo una INSERT con la tabella anagrafica (e la tab ordini la lasci stare dov'è). L'operazione di visualizzazione dell'ordine (sub form RIGHE) e l'inserimento si basano su due tabelle <> (tab righe_ordine e tab_articoli) quindi non puoi avere problemi...in visualizzazione usi tab_righe_ordine e in inserimento usi tab_articoli......


Niente da fare, ho provato e riprovato ma non ne esco.
Grazie comunque per i suggerimenti.
Spiego meglio la situazione, nel caso abbiate ancora voglia di aiutarmi.
La maschera di inserimento si chiama FrmOrdini ed è una classica maschera 
con sottomaschera: i campi della testata dell'ordine li prende dalla 
TblOrdini, le righe dell'ordine (che stanno nella sottomaschera, chiamata 
FrmRigheOrdine Sottomaschera) dalla TblRigheOrdine.
Nella sottomaschera c'è una casella combinata IDArticolo, che permette di 
selezionare l'articolo dalla TblProdotti.
Nella TblRigheOrdine il campo contenente il prezzo si chiama PrezzoRig, 
Valuta con 2 decimali.
Nella TblArticoli il campo contenente il prezzo si chiama Pre, Valuta con 
due decimali.
Nella sottomaschera il controllo per il prezzo si chiama Prezzo.
Una volta scelto l'articolo, nel controllo Prezzo della sottomaschera deve 
comparire il prezzo (Pre) preso dalla TblProdotti, se il record è nuovo, 
mentre deve comparire il prezzo già inserito nella TblRigheOrdine 
(PrezzoRig), se si tratta di un vecchio ordine.
Ho modificato la mia vecchia sottomaschera in base ai suggerimenti, ed 
attualmente, quando apro un vecchio ordine, compaiono correttamente i vari 
PrezzoRig (prima mi compariva sempre il prezzo preso dalla TblProdotti).
Rimane il problema del nuovo record:
Se scrivo, sull'evento Dopo aggiornamento di IDArticolo:
If Me.NewRecord Then
    Prezzo.RecordSource = "SELECT pre FROM tblprodotti"
Else
    Prezzo.RecordSource = "SELECT PrezzoRig FROM tblrigheordine"
End If
Mi dice: Impossibile trovare il metodo o il membro dei dati
Se scrivo, sull'evento Dopo aggiornamento di IDArticolo:
If Me.NewRecord Then
    Me!Prezzo.RecordSource = "SELECT pre FROM tblprodotti"
Else
    Me!Prezzo.RecordSource = "SELECT PrezzoRig FROM tblrigheordine"
End If
Mi dice: Proprietà o metodo non supportati dall'oggetto
Ho provato ad utilizzare direttamente il nome del campo:
If Me.NewRecord Then
    PrezzoRig = "SELECT pre FROM tblprodotti"
Else
    PrezzoRig = "SELECT PrezzoRig FROM tblrigheordine"
End If
Mi dice: E' stato immesso un valore non valido per il campo
A questo punto non so più cosa dirgli!
Grazie comunque.
Sergio

Sergio ha scritto:

[Risposta]
Intanto questa.....'tblprodotti'...non sarà mica 'TblArticoli'?
Provo.....il me.newrecord non va bene.....Chiedo se ho capito bene: tu hai form e subform (immagino numerate e legate tramite un ID). Allora: o richiami un vecchio ordine e allora vuoi che la NUOVA riga abbia lo stesso prezzo di quelle già inserite (se ce ne almeno UNA con lo stesso articolo), oppure aggiungi una riga ad un vecchio ordine ma l'articolo scelto NON è MAI stato ordinato in quell'ordine specifico, e allora vuoi il prezzo 'nuovo'. SE, e sottolineo se, le cose stanno così, una maniera potrebbe essere:
su evento DopoAggiornamento della combo
Dim Rst as recordset
Dim PzTMP as currency
set Rst=me.recordsetclone
rst.movefirst
rst.findfirst "[IdArticolo]=" & me.IdArticolo
if rst.noMatch then
        'devi usare un recordset...a me nn piace dlookup
        PzTMP = SELECT .......[PrezzoAnagrafico] 
else
        me.bookmark=rst.bookmark
        PzTMP = me.Prezzo.value
end if
A questo punto hai PzTMP che contiene il prezzo che cerchi a seconda che la riga sia già stata inserita o sia un nuovo articolo (newrecord si verifica sempre......in fondo E' una nuova riga in ogni caso!)
Se non ti piace con recordsetclone, puoi agire direttamente sulla base dati con un recordset (forse + pulito...nn devi gestire movimenti del cursore, riportarti nel record corrente, lasciare a metà l'inserimento....).
Fammi sapere!


Finalmente ho risolto!
Grazie a tutti per la pazienza.
Sergio