Newsgroup: it.comp.appl.access
Titolo: Problemino

Salve.
Ho una tabella prodotti che possono essere venduti ognuno ad un solo
cliente.
Mettiamo caso che il prodotto A venga venduto e che si vada ad immettere i
dati del cliente che l'ha acquistato in un'altra tabella tramite una
maschera.
Come posso fare per imputare quel cliente (e solo quello) alla vettura che
ha acquistato?
Vorrei che fosse possibile fare questa imputazione dalla maschera di
immisione dei dati del cliente.
Grazie mille
Alessandro

 ha scritto nel messaggio
news:6HZH6.9509$_r2.1...@news2.tin.it...

Ipotizziamo che la tabella Prodotti abbia come chiave primaria un codice
prodotto (nel tuo caso potrebbe essere il numero di telaio
dell'autovettura).
Ipotizziamo che la tabella Prodotti contenga anche un campo IDCliente che
risulterà vuoto se l'auto non è stata ancora acquistata, oppure contiene il
codice del cliente che l'ha acquistata.
Nella maschera dove imputi i dati del cliente, inserisci una casella di
testo non associata (Chiamala Pippo) dove digiti il codice prodotto
acquistato.
A fronte dell'evento "Dopo aggiornamento" di Pippo genera un codice VBA che:
1) Tramite un funzione DLookup, che ha per dominio la tabella Prodotti (vedi
help), verifichi se il campo IDCliente è significativo.
2) Se è significativo (auto già venduta) dà un messaggio di errore
all'operatore e sposta il fuoco su Pippo per permettere la digintazione di
un nuovo codice prodotto.
3) Se invece il codice prodotto non è significativo (il prodotto non è stato
ancora venduto) apre un recordset sulla tabella Prodotti, ricerca il record
relativo al codice prodotto digitato in Pippo, copia nel campo IDCliente del
recordset il codice cliente prelevandolo dal relatico controllo della
maschera, aggiorna e chiude il recordset.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ha scritto nel messaggio
news:iVhJ6.27998$UW4.1...@news.infostrada.it...

Scusami Roberto,
potresti farmi un esempio del codice di cui ho bisogno,
considerando che ho impostato la relazione uno-a-uno tra la tabella clienti
e la tabella prodotti in base al numero di targa della vettura?
Non potrei semplicemente creare una maschera dove inserire i dati del
cliente, contenente una casella di combinata i cui valori sono dati dal
campo targa della tabella Porodotti?
Grazie
Alessandro

 e la tabella prodotti in base al numero di targa della vettura?
Scusate se mi intrometto, ma io non avrei impostato una relazione uno a uno
tra la tabella clienti e la tabella prodotti: sei proprio sicuro che quel
cliente non verrà mai + a comprare un'auto da te (insomma, li tratti così
male da scoraggiarli o lo fai apposta x non modificare la struttura del DB?
:-P)
--
Silvio
il sito comune di it.comp.appl.access:
http://www.sitocomune.com


Non credo che vada proprio bene una relazione uno-a-uno tra le due tabelle.
E se un cliente deve acquistare più autovetture (contemporaneamente o in
tempi diversi) cosa fai? Crei un altro record dull'anagrafica clienti? Penso
che non sia proprio il caso.
Per me la relazione giusta tra le due tabelle è uno-a-molti (un cliente più
autovetture). Quindi non il numero di targa nella tabella anagrafe, ma il
codice cliente nella tabella prodotti.
Se poi vuoi creare il link tra le due tabelle nella maschera in cui
inserisci o modifichi i dati del cliente, fai in modo che la casella
combinata sia non associata (preoccupati anche che ti faccia vedere solo le
vetture non vendute); quindi a fronte dell'evento "Dopo aggiornamento" della
casella combinata apriti un recordset sulla tabella prodotti, ricerca l'auto
scelta con la combo, e nel relativo record registraci il codice cliente del
record corrente della maschera di aggiornamento.
Insomma di due l'una: o, come dice Silvio, cacci via tutti i clienti che
vogliono acquistare più di un'autovettura, oppure modifichi la struttura del
database. ;-)



Ok ragazzi, ho creato la relazione un cliente a molte vetture.
Mettiamo il caso che venda una vettura.
Vado nella maschera contenente i controlli relativi al cliente e iunserisco
i suoi dati.
Come posso, da questa maschera, imputare la vettura al cliente?
Grazie ancora del vostro prezioso aiuto.
Alessandro


Della soluzione che ho abbozzato nel mio messaggio precedente, cosa non ti è
chiaro?


 ha scritto nel messaggio
news:dt9K6.8673$B87.5...@news.infostrada.it...

Scusami Roberto, ma non riesco a fare questo:


 > [CUT]
[CUT]

Non parlavo di questa soluzione, ma di quella che ti ho soggerito con il mio
messaggio di oggi ore 11:40, ovvero:
Se poi vuoi creare il link tra le due tabelle nella maschera in cui
inserisci o modifichi i dati del cliente, fai in modo che la casella
combinata sia non associata (preoccupati anche che ti faccia vedere solo le
vetture non vendute); quindi a fronte dell'evento "Dopo aggiornamento" della
casella combinata apriti un recordset sulla tabella prodotti, ricerca l'auto
scelta con la combo, e nel relativo record registraci il codice cliente del
record corrente della maschera di aggiornamento.
--


 ha scritto nel messaggio
news:J1aK6.8876$B87.5...@news.infostrada.it...

Ho creato una maschera dove inserire i dati del cliente che contiene una
casella combianta che presenta solo le targhe delle vetture non vendute.
Quello che non riesco a fare è aprire un recordset sulla tabella prodotti,
ricerca l'auto....
...
grazie
Alessandro


Ipotizziamo che la tabella che contiene le auto si chiami Prodotti e che
abbia una struttura simie a questa:
Targa            Testo  e chiave primaria
IdCliente        Numerico (valore predefinito 0)
ecc. ecc.
Ipotizziamo che il controllo della tua maschera che contiene il codice
cliente si chiami IDCliente.
Ipotizziamo che la tua casella combinata non associata dalla quale scegli la
targa dell'auto comprata si chiami MiaCombo.
Ipotizziamo che nella maschera hai anche inserito un pulsante di comando
pigiando il quale registri il codice cliente nella tabella Prodotti.
Ciò premesso, a fronte dell'evento "Su clic" del pulsante di comando genera
il seguente codice VBA:
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("Prodotti")
rst.MoveFirst
Do Until rst.EOF
    If rst!Targa = Me!MiaCombo Then
        rst.Edit
        rst!IDCliente = Me!IDCliente
        rst.Update
        Exit Do
    End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
Per maggior chiarezza ti suggerisco di inserire nella maschera anche una una
sottomaschera con visualizzazione a Maschere continue che abbia come origine
record la tabella Prodotti; nella sottomaschera ti compariranno le auto
acquistate da quel cliente. A questo punto, se il controllo sottomaschera
che contiene la sottomaschera si chiama Pippo, in fondo al codice VBA di cui
sopra aggiungi la seguente riga di codice:
Me!Pippo.Requery


 ha scritto nel messaggio
news:a5fK6.11650$B87.7...@news.infostrada.it...

Sto uscendo pazzo...
ho adeguato il codice che mi hai dato e mi da questo errore:
Impossibile trovare il metodo o il membro dei dati (errore 461)
Hai idea...
cmq grazie infinite

 ha scritto nel messaggio
news:MOfK6.6034$9C4.1...@news2.tin.it...

Nella mia tabella prodotti, che si chiama VO, la chiace primaria non è Targa
ma IDvo.
Ma non credo sia questo il problema perché o provato a cambiare la chiave ma
l'erroe lo da ancora
...

 ...
Non signifia nulla il fatto che Targa sia la chiave primaria.
Ma se pigi il pulsate Debug che riga di codice ti si evidenzia.
Prova anche a postare il tuo codice VBA, magari si riesce a capire dove hai
sbagliato, ma così al buio...


 ha scritto nel messaggio
news:r7gK6.12317$B87.8...@news.infostrada.it...

Ecco tutto il codice, considerando che la tabella rpodotti si chiama VO e
che la combinata si chiama TargaVOVenduto. La riga che viene evidenziata è
questa:
rst.Edit
Private Sub Comando28_Click()
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("VO")
rst.MoveFirst
Do Until rst.EOF
    If rst!Targa = Me!TargaVOVenduto Then
        rst.Edit
        rst!IDcliente = Me!IDcliente
        rst.Update
        Exit Do
    End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub


Il codice VBA che hai scritto č formalmente esatto se usi Access 97, quindi
le librerie DAO; ma ho il vago sentore di dubbio che tu invece usi Access
2000 e le sue librerie ADO che non riconoscono il metodo Edit.
Se effettivamente usi A2000, premesso che io non conosco A2000, prova ad
aggiungere ai Riferimenti del tuo database anche le librerie DAO, avendo
cura di inserirle, nella lista dei riferimenti, prima di quelle ADO.
Modifica anche il codice VBA in:
Private Sub Comando28_Click()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("VO")
rst.MoveFirst
Do Until rst.EOF
    If rst!Targa = Me!TargaVOVenduto Then
        rst.Edit
        rst!IDcliente = Me!IDcliente
        rst.Update
        Exit Do
    End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
db.Close
Set db = Nothing
End Sub
Se le cose non dovessero ancora funzionare, penso che sia necessario che tu
chieda aiuto a qualcuno che conosce A2000.


 ha scritto nel messaggio
news:a5fK6.11650$B87.7...@news.infostrada.it...

Salve ragazzi,
ho uno strano problema:
Mettiamo che abbia una tabella prodotti chiamata VO.
Una tabella clienti con relazione uno-a-molti sulla tabella VO con il campo
IDcliente (contatore nella tabella Clienti e Numerico(indicizzato con
duplicati non ammessi) nella tabella VO)
Creo una maschera clienti nella quale inserisco i vari dati del cliente.
In questa maschera ho una combinata (TargaVOVenduto) che mostra risultati di
una query (questa query cerca nella tabella VO i prodotti non venduti: tutti
quello che hanno uno stato ="V" (venduti) e un IDcliente Is Null (non
assegnati))
Inserisco nella maschera un pulsante che su clic presenta il seguente
codice:
Private Sub Comando28_Click()
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("VO")
rst.MoveFirst
Do Until rst.EOF
    If rst!Targa = Me!TargaVOVenduto Then
        rst.Edit
        rst!IDcliente = Me!IDcliente
        rst.Update
        Exit Do
    End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub
Il problema è che tutto funziona per il primo abbinamento e nella tabella VO
mi trovo l'IDcliente.
Dal secondo inserimento in poi, mi dice:
Errore di run-time '3201'
You can't add or change a record because a related record i required in
table'Clienti'.
Nel codice mi evidenzia la riga
rst.Update
Avete un'idea per darmi una mano?
Grazie mille
Alessandro


[CUT]

Caro Alessandro
abbiamo discusso per una vita che un cliente può acquistare più autovetture,
quindi nella tabella VO più record possono contenere nel campo IDCliente lo
stesso codice cliente.
Non mettere, pertanto, per il campo IDCliente della tabella VO la proprietà
Indicizzato a Si (duplicati non ammessi); o la setti a No o la setti a Si
(duplicati ammessi).


 ha scritto nel messaggio
news:MEsM6.5383$pa3.6...@news.infostrada.it...

Si Roberto,
ovviamente ho sbagliato a descrivere il campo della tabella.
Purtroppo l'errore rimane.
Quello che è strano è che qualche volta va tutto bene, ma la maggior parte
da l'errore che ti dicevo in alto.
Grazie
Alessandro

 ha scritto nel messaggio
news:6jLM6.2486$lk6....@news2.tin.it...

Forse perché nella relazione tra le due tabelle ho spuntato applica
integrità refereniale?
Alessandro

 ha scritto nel messaggio
news:6jLM6.2486$lk6....@news2.tin.it...

Pare che senza integrità referenziale va tutto ok.
Alessandro