Newsgroup: it.comp.appl.access
Titolo: Modifica dati in automatico da codice

Buongiorno a tutti,
 
vi presento il mio ennesimo problema:
 
Ho una tabella Materiali con i campi: Materiale, Fornitore, UM, Costo
Ho una form Bef con una subform SubBef.
Uso questa form Bolle Emesse da Fornitore (Bef) per inerire tutti i
prodotti che ricevo dai fornitori proprio come se facessi una bolla in
uscita.
Nella subform ho i seguenti campi: Quantita, Descrizione. UM,
PrezzoUnitario, Totale
Descrizione è una combo che prende i dati dalla tabella Materiali:
 
SELECT Materiali.Materiale, Fornitori.Fornitore, Materiali.UM,
Materiali.Costo FROM Materiali INNER JOIN Fornitori ON
Materiali.IdFornitore = Fornitori.IdFornitore ORDER BY
Materiali.Materiale;
 
che mi permette di caricare i prodotti prendendoli dalla tabella
Materiali e mi aggiorna i campi così:
 
Private Sub CmbDescrizione_AfterUpdate()
Me.UnitaMisura = Me.CmbDescrizione.Column(2)
Me.PrezzoUnitario = Me.CmbDescrizione.Column(3)
End Sub
 
Ora, il problema nasce quando il prezzo di acquisto è variato rispetto
a quello precedentemente inserito in tabella Materiali.
Mi piacerebbe quindi riuscire a modificare la tabella Materiali
automaticamente e ho provato così, scopiazzando a destra e a manca, ma
non funziona (errore runtime operatore mancante):
 
Private Sub PrezzoUnitario_Change()
 
Dim rst
Set rst = CurrentDb.OpenRecordset("SELECT Materiali.Materiale,
Fornitori.Fornitore, Materiali.UM, Materiali.Costo FROM Materiali
INNER JOIN Fornitori ON Materiali.IdFornitore = Fornitori.IdFornitore
where Materiali.Materiale =  " & Me.CmbDescrizione & " and
Fornitori.Fornitore = " & Forms!Bef!CmbFornitore & " ")
 
With rst
.MoveFirst
If .EOF Then
.Change
.Fields("Costo") = Form("PrezzoUnitario")
.Update
MsgBox ("Aggiornato prezzo in tabella prodotti"), vbOKOnly
End If
.Close
End With
 
End Sub
 
Qualcuno ha tempo di dirmi dove sto sbagliando?
 
Grazie mille

 Fornitori.Fornitore = " & Forms!Bef!CmbFornitore & " ")
 
Ciao!
 
Non è che devi mettere descrizione e fornitore fra apici così?
 
where Materiali.Materiale =  '" & Me.CmbDescrizione & "' and
Fornitori.Fornitore = '" & Forms!Bef!CmbFornitore & "' ")
 
HTH
Popi

 Grazie mille
Prego (uno solo)
 
 
-- 
 
ac (x=y-1)

 End Sub
 
L'evento Change non serve per questo che vuoi fare.
Invece usa "Dopo aggiornamento" (AfterUpdate) del controllo
e prova così:
 
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
 
strSQL = "SELECT Materiali.Costo" & _
        " FROM Materiali INNER JOIN Fornitori" & _
        " ON Materiali.IdFornitore = Fornitori.IdFornitore" & _
        " WHERE Materiali.Materiale =  " & Me!CmbDescrizione & _
        " And Fornitori.Fornitore = " & Forms!Bef!CmbFornitore
 
'Questa sintassi è giusta se i campi Materiale e Fornitore hanno
'un tipo di dato numerico. Altrimenti devi usare degli apici come
'già scritto dagli altri.
 
Set db = Currentdb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
 
With rs
    If Not .BOF Then
        .Edit
            !Costo = Me!PrezzoUnitario
        .Update
        MsgBox ("Aggiornato prezzo in tabella prodotti"), vbOKOnly
    End If
 
    .Close
End With
 
Se tutto questo codice funziona puoi sostituirlo complettamente ;-)
con:
 
Currentdb.Execute "UPDATE Materiali" & _
        " SET Materiale.Costo=" & str(Me!PrezzoUnitario) & _
        " FROM Materiali INNER JOIN Fornitori" & _
        " ON Materiali.IdFornitore = Fornitori.IdFornitore" & _
        " WHERE Materiali.Materiale =  " & Me!CmbDescrizione & _
        " And Fornitori.Fornitore = " & Forms!Bef!CmbFornitore _
        , dbFailOnError
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 
 

 - Mostra testo citato -
 
Ciao,
 
grazie mille per i suggerimenti ma non funziona.
Cosa devo mettere se i campi non sono numerici? mi sto perdendo nel
codice...
Grazie

 - Mostra testo citato -
 
Niente da fare, provo, modifico ma non funziona mi da errore di
runtime 3075 operatore mancante nell'espressione della query 150 from
Materiali
 
150 ho scoperto essere il prezzo che provo ad aggiornare...

 Cosa devo mettere se i campi non sono numerici?
 
Currentdb.Execute "UPDATE Materiali" & _
        " SET Materiale.Costo=" & str(Me!PrezzoUnitario) & _
        " FROM Materiali INNER JOIN Fornitori" & _
        " ON Materiali.IdFornitore = Fornitori.IdFornitore" & _
        " WHERE Materiali.Materiale =  '" & Me!CmbDescrizione & _
        "' And Fornitori.Fornitore = '" & Forms!Bef!CmbFornitore & "'"_


 - Mostra testo citato -
 
Ciao
ho provato a modificare come segue:
 
CurrentDb.Execute "UPDATE Materiali" & _
        " SET Materiale.Costo=" & Str(Me!PrezzoUnitario) & _
        " FROM Materiali INNER JOIN Fornitori" & _
        " ON Materiali.IdFornitore = Fornitori.IdFornitore" & _
        " WHERE Materiali.Materiale =  '" & Me!CmbDescrizione & _
        "' And Materiali.IdFornitore = '" & Forms!Bef!IdFornitore &
"'", dbFailOnError
 
ma non funziona lo stesso.
In questo modo IdFornitore sia in tabella che in form sono numerici,
mentre Materiale e CmbDescrizioni sono testo.
Continua a darmi errore di runtime 3075 errore di sintassi (operatore
mancante) nell'espressione della query '150 FROM materiali INNER JOIN
Fornitori on Materiali.IdFornitori = Fornitori.IdFornitore
 
se vado in debag del codice e passo sopra a Me!CmbDescrizione e Forms!
Bef!IdFornitore vedo il prodotto giusto con il fornitore giusto.
Qualche altro suggerimento?


 
Il prezzo ha virgole al posto del punto?

 - Mostra testo citato -
 
il prezzo ha formato valuta Euro.
Nella form lo vedo con la virgola e pure nella tabella materiali.
 
Hai un suggerimento?
Grazie a tutti.
Lo

 ...
 
Al posto del Execute esegua questo codice:
 
Debug.Print "UPDATE Materiali" & _
        " SET Materiale.Costo=" & Str(Me!PrezzoUnitario) & _
        " FROM Materiali INNER JOIN Fornitori" & _
        " ON Materiali.IdFornitore = Fornitori.IdFornitore" & _
        " WHERE Materiali.Materiale =  '" & Me!CmbDescrizione & _
        "' And Materiali.IdFornitore = '" & Forms!Bef!IdFornitore & "'"
 
Apri la finestra debug e copia/incolla il testo nel tuo prox messaggio.
 
Puoi anche copiare il testo nella vis. SQL di una nuova query.
Spesso l'errore che viene da Access è più chiaro.



Se il prezzo è con la virgola è sbagliato. Devi fare una replace
(TuoPrezzo,',','.'). Ovviamente l'SQL interpreta la virgola come un
altro campo (che non esiste). da qui l'errore (forse.....)

 - Mostra testo citato -
 
Ciao,
scusa ma non ho capito. Da dove devo aprire la finestra di debug?
Non capisco la tua frase "Apri la finestra debug e copia/incolla il
testo nel tuo prox messaggio."
Quale mio prox messaggio? scusa la mia tontaggine ma non l'ho mai
fatto... porta pazienza!
Ho provato a creare una nuova query da sql copiando quello che mi hai
scritto tu ma mi dice che devo mettere almeno un select o ecc.....

 - Mostra testo citato -
 
Scusa quindi questo codice come lo scriveresti?
 
CurrentDb.Execute "UPDATE Materiali" & _
        " SET Materiale.Costo=" & Str(Me!PrezzoUnitario) & _
        " FROM Materiali INNER JOIN Fornitori" & _
        " ON Materiali.IdFornitore = Fornitori.IdFornitore" & _
        " WHERE Materiali.Materiale =  '" & Me!CmbDescrizione & _
        "' And Materiali.IdFornitore = '" & Forms!Bef!IdFornitore &
"'", dbFailOnError
Ho provato Str(Me!PrezzoUnitario,',','.') ma mi da errore di sintassi.
Dove ho sbagliato?


Replace non Str!!!!

 scritto tu ma mi dice che devo mettere almeno un select o ecc.....
 
- vai al tuo codice e inserisci un apice prima del CurrentDb.Execute
per disattivarlo, cioè:
 
' CurrentDb.Execute "UPDATE Materiali" & _
 
- una riga sopra di questo codice inserisci il codice di prova
che ti ho scritto
 
Debug.Print "UPDATE Materiali" & _
ecc.
 
- esegui il codice come prima, cioè fai un aggiornamento
del controllo PrezzoUnitario
 
- premi <Strg>+<G> per aprire la finestra immediata,
in alternativa puoi anche aprire l'editore di VBA e scegliere
la voce di menù Visualizza - Finestra Immediata
 
- nella finestra Immediata trovi il risultato del Debug.Print...,
cioè il tuo testo SQL, ma pronto per l'esecuzione con i valori
dei variabili ecc.
 
- questo codice puoi incollare sia nella vis. SQL di una
nuova query sia nel tuo prossimo messaggio in questo
newsgroup per mostrarlo alla gente qui


 - Mostra testo citato -
 
Ecco cosa mi appare nella finestra immediata:
 
UPDATE Materiali SET Materiale.Costo= 100 FROM Materiali INNER JOIN
Fornitori ON Materiali.IdFornitore = Fornitori.IdFornitore WHERE
Materiali.Materiale =  '000895 BOMBOLA 1450 (600ML)' And
Materiali.IdFornitore = '120'
UPDATE Materiali SET Materiale.Costo= 100 FROM Materiali INNER JOIN
Fornitori ON Materiali.IdFornitore = Fornitori.IdFornitore WHERE
Materiali.Materiale =  '000895 BOMBOLA 1450 (600ML)' And
Materiali.IdFornitore = '120'
UPDATE Materiali SET Materiale.Costo= 100 FROM Materiali INNER JOIN
Fornitori ON Materiali.IdFornitore = Fornitori.IdFornitore WHERE
Materiali.Materiale =  '000895 BOMBOLA 1450 (600ML)' And
Materiali.IdFornitore = '120'
UPDATE Materiali SET Materiale.Costo= 100 FROM Materiali INNER JOIN
Fornitori ON Materiali.IdFornitore = Fornitori.IdFornitore WHERE
Materiali.Materiale =  '000895 BOMBOLA 1450 (600ML)' And
Materiali.IdFornitore = '120'
 
La descrizione del materiale e l'IdFornitore sono giusti. Il prezzo
che io volevo modificare è 100,00 € e nella finestra viene indicato
solo 100.
Cosa suggerisci?
Grazie ciao

 - Mostra testo citato -
 
Da errore di sintassi anche con replace...

 Cosa suggerisci?
 
Prima controlla perché ti dà il testo 4 volte.
Quale evento usi? "Dopo aggiornamento" del controllo
come suggerito?
 
Poi cambia il codice a:
 
Currentdb.Execute "UPDATE Materiali INNER JOIN Fornitori" & _
        " ON Materiali.IdFornitore = Fornitori.IdFornitore" & _
        " SET Materiale.Costo=" & str(Me!PrezzoUnitario) & _
        " WHERE Materiali.Materiale =  '" & Me!CmbDescrizione & _
        "' And Fornitori.Fornitore = '" & Forms!Bef!CmbFornitore & "'"_
        , dbFailOnError
 
 


 Da errore di sintassi anche con replace...
 
Sì, il problema dev'essere diverso. Ti ho già suggerito
Str() solamente per gestire il separatore decimale.
Vedi anche:
 
Passare un numero decimale ad una stringa SQL
http://www.donkarl.com/it?FAQ6.21
 



Leggendo con attenzione la finestra immediata mi accorgo che
scrive ... Costo= 100. Inizialmente 100 era il prezzo che provavo a
modificare, adesso però scrive sempre 100 anche se modifico con un
prezzo diverso che io scriva 250 o 200,00 ecc.
Ho chiuso e riaperto il db per evitare che tenesse in memoria in
qualche modo 100 ma non serve a nulla... sempre 100 rimane!


Ciao Ho provato a sostituire con il nuovo codice. Adesso cambia
l'errore. Errore runtime 3061. Parametri insufficienti. Previsto 1.
Il tutto è stato messo dopoaggiornamento

 qualche modo 100 ma non serve a nulla... sempre 100 rimane!
 
Prova di leggere con attenzione cosa ti ho scritto e chiesto. ;-)
Se usi ancora l'evento falso (Change) non mi meraviglia che
ti dà il vecchio valore.



Grazie per l'aiuto, dunque abbiamo fatto passi in avanti: nella
finestra immediata appare una sola volta però cambia l'errore adesso
mi da:
errore runtime 3061 Parametri insufficenti. Previsto 1
Nella finestra invece:
 
UPDATE Materiali SET Materiale.Costo= 100 FROM Materiali INNER JOIN
Fornitori ON Materiali.IdFornitore = Fornitori.IdFornitore WHERE
Materiali.Materiale =  '000895 BOMBOLA 1450 (600ML)' And
Materiali.IdFornitore = '120'
 
Idee?

 - Mostra testo citato -
 
Ora la finestra mi scrive:
 
UPDATE Materiali SET Materiali.Costo= 3.28 FROM Materiali INNER JOIN
Fornitori ON Materiali.IdFornitore = Fornitori.IdFornitore WHERE
Materiali.Materiale =  'C73141 CART SEGN INTERR GENERALE' And
Materiali.IdFornitore = '120'              128
 
Cosa vuol dire?
Grazie ciao

 Idee?
 
Questo è la versione vecchia non la nuova che ti scritto.
Certo devi anche cambiare il testo che segue Debug.Print.
 
Poi se ti dà ancora l'errore, procedi come già descritto:
Incolla il testo (aggiornato!) dalla finestra immediata alla
vis. SQL di una nuova query e prova di eseguirla.
Forse così trovi l'errore.



Ciao Scusa ma sono disperata. Non riesco a venirne a capo dopo due
giorni di prove...
Ho fatto modifiche sulla base del tuo ultimo suggerimento. Mi sono
accorta di un errore Materiali.Costo e non Materiale.Costo come
scrivevamo prima.
Ho fatto delle simulazione con debug.print sia in dopoaggiornamento
Prezzo unitario sia nella SubBef dopoaggiornamento.
I risultati sono questi:
 
UPDATE Materiali INNER JOIN Fornitori ON Materiali.IdFornitore =
Fornitori.IdFornitore SET Materiali.Costo= 3.28 WHERE
Materiali.Materiale =  'C73141 CART SEGN INTERR GENERALE' And
Fornitori.IdFornitore = '120'               128
UPDATE Materiali INNER JOIN Fornitori ON Materiali.IdFornitore =
Fornitori.IdFornitore SET Materiali.Costo= 3.28 WHERE
Materiali.Materiale =  'C73141 CART SEGN INTERR GENERALE' And
Fornitori.IdFornitore = '120'               128
UPDATE Materiali INNER JOIN Fornitori ON Materiali.IdFornitore =
Fornitori.IdFornitore SET Materiali.Costo= 3.28 WHERE
Materiali.Materiale =  'C73141 CART SEGN INTERR GENERALE' And
Materiali.IdFornitore = '120'               128
UPDATE Materiali INNER JOIN Fornitori ON Materiali.IdFornitore =
Fornitori.IdFornitore SET Materiali.Costo= 250 WHERE
Materiali.Materiale =  '000895 BOMBOLA 1450 (600ML)' And
Materiali.IdFornitore = '120'       128
 
Considera che il materiale che sto cercando di modificare è 000895
BOMBOLA... e non C73141 CART...
In più la cosa strana è che nelle prime tre prove il costo 3.28 è
effettivamente il costo di origine del materiale dello stesso rigo,
mentre 250 è il prezzo che io cerco di modificare nel materiale
000895...
Cosa sta succedendo?
Ne verrò mai a capo?
Grazie per l'immensa pazienza che hai con me!

 ...
 
Non conosco i tuoi svolgimenti e il tuo programma.
Puoi solo sapere tu quando e dove hai i dati giusti per questo
che vuoi fare.
 
Puoi ancora provare se funziona meglio per te di usare
l'altro codice più lungo con il DAO recordset, ma in principio
non cambia niente alla successione degli eventi e dati.
 
-- 
Ciao
Karl
*********
Access FAQ: 
www.donkarl.com/it
 
 
 
 


Ciao Karl,
sono senza speranza ma non voglio mollare.
Ho fatto alcune prove: ho creato una query
SELECT Materiali.Materiale, Materiali.Costo, Materiali.IdFornitore
FROM Fornitori INNER JOIN Materiali ON Fornitori.IdFornitore =
Materiali.IdFornitore
WHERE (((Materiali.Materiale)=[Forms]![Bef]![SubBeniBef]!
[CmbDescrizione]) AND ((Materiali.IdFornitore)=[Forms]![Bef]!
[IdFornitore]));
che mi funziona
PERO' solo se la form SubBeniBef è impostata a Maschera singola, se
impostata come maschera continua non mi funziona.
Torno quindi a fare le prove nel codice dopoaggiornamento del campo
PrezzoUnitario della SubBeniBef e continua a darmi errore di sintassi
sia che imposto la maschera a maschera continua o sia che la imposto a
maschera singola.
Come posso fare?