Newsgroup: it.comp.appl.access
Titolo: UPDATE CON SELECT: PROBLEMA

Buongiorno  a tutto NG!
Ho problemi con questa query di aggiornamento, mi dice che la sintassi
del select non è corretta:
UPDATE TBL_MP SET TBL_MP.mp_costo = cstmp_costo AND TBL_MP.mp_perc
WHERE (SELECT TBL_CSTMP.cstmp_vsid FROM  TBL_CSTMP INNER JOIN  ON
TBL_MP.mpid = TBL_CSTMP.cstmp_mpid
WHERE TBL_CSTMP.cstmp_vsid = [FORMS]![MSC_CSTMP]![VERSIONELISTINO]);
E' che non so come fare.
Dovrei copiare i valori costo e percentuale da una versione precista
del listino, che l'utente identifica nella maschera. la tabella CSTMP
e la tabella MP sono legate con cstmp_mpid = mp_id
------------------------
Questa query è quella di origine della maschera dove l'utente sta
lavorando:
SELECT TBL_CSTMP.cstmp_id, TBL_MP.mp_codi, TBL_MP.mp_desc,
TBL_UM.um_desc, TBL_CSTMP.cstmp_costo, TBL_CSTMP.cstmp_perc,
TBL_MP.mp_id, TBL_CSTMP.cstmp_vsid, TBL_VSCSTMP.vscstmp_id,
TBL_VSCSTMP.vscstmp_data, TBL_VSCSTMP.vscstmp_cliid
FROM TBL_UM INNER JOIN (TBL_VSCSTMP INNER JOIN (TBL_MP INNER JOIN
TBL_CSTMP ON TBL_MP.mp_id = TBL_CSTMP.cstmp_mpid) ON
TBL_VSCSTMP.vscstmp_id = TBL_CSTMP.cstmp_vsid) ON TBL_UM.um_id =
TBL_MP.mp_umid
WHERE (((TBL_VSCSTMP.vscstmp_data)=[forms]![MSC_CSTMP]![cbodata]) AND
((TBL_VSCSTMP.vscstmp_cliid)=[forms]![MSC_CSTMP]![cbocliente]))
ORDER BY TBL_MP.mp_desc;
Avendo già i valori filtrati, eventualmente posso fare direttamente
l'update?
Se si come?
Grazie a tutti x eventuali consigli,
Samantha

ciao,
scusa ma se non ho capito male devi aggiornare 2 campi della tabella
se si la sintassi corretta è update miatabella set campo1=xxxx, 
campo2=yyyyy e non devi usare l'AND
nicoletta
esseAemme ha scritto:


Samantha
Vincenzo Turturro
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
risorse Access:
http://www.accessgroup.it
---------------------------------------------
Il sito comune di it.comp.as400
http://www.faq400.com
---------------------------------------------

 Vincenzo Turturro
Grazie Vicenzo e grazie Nicoletta,
Vicenzo hai colpito nel segno, era proprio così che avrei voluto
scriverla.
Visto che ieri proprio non mi riusciva, ho lavorato da form in VBA, e
con i recordset ho ottenuto lo stesso risultato.
La domanda è, è + veloce un recordset da VBA oppure una query esterna?
es. docmd.runsql ("UPDATE...")
cmq il codice che ho fatto su click di un pulsante è questo:
    Dim msclone As Recordset, intl As Integer
    Dim fld As Field
    Dim dbagg As Database
    Dim rstagg As DAO.Recordset
    Dim qdagg As QueryDef
    Set dbagg = CurrentDb
    Set qdagg = dbagg.QueryDefs("Q_MSC_CSTMP")
    qdagg.Parameters("[forms]![MSC_CSTMP]![CBOCLIENTE]") = Me!
CBOCLIENTE
    qdagg.Parameters("[Forms]![MSC_CSTMP]![CBODATA]") = Me!CBODATA
    CurrentDb.QueryDefs.Refresh
    Me.Refresh
    Set rstagg = qdagg.OpenRecordset()
    Set msclone = Me.RecordsetClone
    If msclone.RecordCount = 0 And rstagg.RecordCount = 0 Then
     MsgBox "Non ci sono prodotti a listino"
     Exit Sub
     Else
      MsgBox "I record sono " & msclone.RecordCount & " e " &
rstagg.RecordCount
      Debug.Print msclone.RecordCount
      Debug.Print rstagg.RecordCount
      msclone.MoveLast
      msclone.MoveFirst
      rstagg.MoveLast
      rstagg.MoveFirst
      Do Until msclone.EOF And rstagg.EOF
      rstagg.Edit
      Me.Bookmark = msclone.Bookmark
      Debug.Print Me!costodilistino
      Debug.Print Me!percdilistino
      Debug.Print Me!matcosto
      Debug.Print Me!matperc
      rstagg.Fields("mp_costo") = Me!costodilistino
      rstagg.Fields("mp_perc") = Me!percdilistino
      Debug.Print Me!matcosto
      Debug.Print Me!matperc
      rstagg.Update
      rstagg.MoveNext
      msclone.MoveNext
      Loop
      msclone.CLOSE
      Set msclone = Nothing
      rstagg.CLOSE
      Set rstagg = Nothing
    End If

cmq il codice che ho fatto su click di un pulsante č questo:



 >cmq il codice che ho fatto su click di un pulsante è questo:

ok implemento la runsql.
Posso chiederti pero', aparte il debug.print che mi serviva x capire
se lavorava nel modo giusto (talvolta non ci credo che possa
funzionare) quali sono le cose superflue all'interno del VBA?
E' vero che ho ripetuto 2 volte il refresh dopo i parametri assegnati
alla query, ma cos'altro non va nel mio codice?
Grazie,
Samantha

Samantha


 wrote:

Grazie Vicenzo delle tue delucidazioni.
Cmq, il docmd.runsql non ne vuole proprio sapere di andare.
questo è:
Dim az As String
az = "UPDATE TBL_MP SET TBL_MP.mp_costo = " & Me!costodilistino & ", "
& "TBL_MP.mp_perc = " & Me!percdilistino & _
"WHERE TBL_MP.mp_id in (select TBL_CSTMP.cstmp_mpid FROM TBL_CSTMP
WHERE TBL_CSTMP.cstmp_vsid = [FORMS]![MSC_CSTMP]![VERSIONELISTINO])"
DoCmd.RunSQL az
nemmeno con az dichiarato come segue:
az = "UPDATE TBL_MP SET TBL_MP.mp_costo = cstmp_costo, TBL_MP.mp_perc
= cstmp_perc " & _
"WHERE TBL_MP.mp_id in (select TBL_CSTMP.cstmp_mpid FROM TBL_CSTMP
WHERE TBL_CSTMP.cstmp_vsid = [FORMS]![MSC_CSTMP]![VERSIONELISTINO])"
Perchè anche se va, mi copia lo stesso valore in tutte le celle, senza
ciclarlo, è come leggesse il primo valore e poi facesse un copia
incolla, mentre con VBA vedo che cicla.
Nella form dove devo inserire laquery di update ho due caselle
combinate che mi filtrano la versione di listino in base al cliente e
la data....
Grazie,
Samantha

la data....
Lascia perdere per un momento cosa hai nella form e cosa fa l'utente e tutte le questioni di tipo
funzionale/applicativo.
Rispondi(ti) a questa domanda:
qual è il campo il cui valore permette di associare una riga di TBL_CSTMP ad una ed una sola riga di TBL_MP ?
Ovvero: se tu dovessi aggiornare a mano (sì, proprio con carta e penna !) le righe di TBL_MP, di quale dato avresti
bisogno per potere individuare solo le righe da aggiornare ?
Non è che per caso ad una riga di TBL_MP possono corrispondere più righe di TBL_CSTMP e/o viceversa ?
Oppure che in realtà non ti basta un campo ma te ne servono due o più ?
Quando avrai risposto a questa domanda dovrebbe essere chiaro qual è il problema dell'istruzione SQL che può darsi sia
del tutto sballata.
Tieni conto che io ho preso per buona quella che avevi postato in origine, dando per scontato che il problema fosse solo
di sintassi, non di logica !


 ---------------------------------------------
Io prima facevo compilare una tabella TBL_MP, dove fittiziamente ho
inserito campo costo e percentuale. L'utente compilava la tabella, e
quando salvava io accodavo questi dati alla tabella costi. Perciò,
ogni volta che lui accodava da TBL_MP a TBL_CSTMP, lui accodava un
record con mp_id e la data di oggi, per default l'avevo impostata
così. Funzionava tutto alla grande.
Soprattutto xchè se oggi ore 12:00 fa il listino, e alle ore 13:
aggiunge una nuova materia prima, con l'accodamento gli faccio
inserire solo l'ultima materia prima.
Ora però ci sono tanti listini, non solo per data, ma per cliente. Per
questo ho voluto creare una campo versionelistino, che fa riferimento
ad una tabella esterna dove ad ogni campo contatore corrisponde la
data di sistema e il cliente. Perciò ho tanti listini quanti clienti x
data.
Il problema di questo metodo è che tutti i costi accodati avevano lo
stesso valore (100 clienti diversi, mp_id ha sempre lo stesso valore),
perdevo quindi le personalizzazioni cliente x cliente.
Quindi, c'erano 2 soluzioni a cui ho pensato:
1) creo una tabella temporanea dove accodo il listino del cliente abc
di ieri, e lo accodo alla tabella costi con la data di oggi.
2)copio (aggiorno) i valori del listino di abc di ieri = versione
listino nella tabella materie prime, e da li riaccodo.
TBL_MP
mp_id contatore
mp_codice  testo
mp_costo   numerico
mp_perc
TBL_CSTMP
cstmp_id contatore
cstmp_mpid   Chiave esterna di TBL_MP
cstmp_ costo
cstmp_perc
cstmp_vsid Chiave esterna di TBL_VSCSTMP
TBL_VSCSTMP
vscstmp_id  contatore
vscstmp_data   (è sempre =date()
vscstmp_cliid  Chiave esterna di TBL_CLIENTE
Quindi la tua query UPDATE, mi sembra che dovrebbe funzionare alla
grande
UPDATE TBL_MP SET
TBL_MP.mp_costo=TBL_CSTMP.cstmp_costo
TBL_MP.mp_perc = TBL_CSTMP.cstmp_perc
WHERE TBL_MP.mp_id  IN (
SELECT TBL_CSTMP.cstmp_mpid FROM TBL_CSTMP
WHERE TBL_CSTMP.cstmp_vsid
= forms!MSC_CSTMP!Versionelistino)
Ho pensato anche a creare una tabella temporanea, dove trasporto fuori
i valori del listino di ieri, e poi li riaccodo con la data di oggi,
ma le create table mi creano problemi, e speravo di farla funzionare
così.
Certo non so quanto mi costa in termini di tempo, ossia se è + veloce
la query create table (ammesso che riesca a farlo) o la query update,
oppure quel codice VBA di cui sopra, che ho messo in piedi.
Grazie infinite Vincenzo,
Samantha

I dati che mi servirebbero sono cstmp_mpid + cstmp_vsid
Eccolo il baco !
Quindi i record di TBL_CSTMP e di TBL_MP vengono associati per mezzo di due campi e non di uno solo.
Ovvero in TBL_MP hai i campi mpid e vsid che vengono usati come chiave esterna sulla tabella TBL_CSTMP rispetto ai campi
cstmp_mpid e cstmp_vsid.
Giusto ?
Se č cosě, ci credo che non funziona !
Prova in questo modo:
UPDATE TBL_MP LEFT JOIN TBL_CSTMP  ON (TBL_MP.mpid = TBL_CSTMP.cstmp_mpid) AND (TBL_MP.vsid = TBL_CSTMP.cstmp_vsid)
SET TBL_MP.mp_costo = tbl_cstmp.cstmp_costo, TBL_MP.mp_perc = tbl_cstmp.cstmp_perc
WHERE TBL_CSTMP.cstmp_vsid =[FORMS]![MSC_CSTMP]![VERSIONELISTINO])
Questa query "aggancia" tutte le righe di TBL_MP alle corrispondenti righe di TBL_CSTMP sulla base dei valori contenuti
nelle coppie di campi mpid/vsid e cstmp_mpid/cstmp_vsid, filtrando perň (e quindi "agganciando") le sole righe di cstmp
in cui vsid č quello impostato dall'utente nella form msc_cstmp.
Certo, potevi usare nomi piů umani per le tabelle ed i campi ! 


 Vincenzo Turturro
Ciao Vincenzo
... certo centrato in pieno il problema...
grazie Vincenzo
non ci sarei mai arrivata,
cmq sotto i nomi c'è una logica, probabilmente bacata,
es. TBL_CSTMP -> tabella CoSTi Materie Prime
TBL_MP -> Materie Prime
TBL_VSCSTMP -> VerSione CoSTiMateriePrime
:D
Ero interessata a CISA 2007 e ho letto che anche tu partecipi come
relatore, ma non ho è indicato quanto durano gli interventi,
gentilmente potresti darmi qualche ulteriore indicazione?
Grazie 1000000 anticipate,
Samantha

Samantha


Samantha


VT @ home ha scritto:
Ciao Vincenzo,
grazie per tutte le info che mi ha dato.
in definitiva ecco il codice che uso, e sembra andare (non dico che va
per scaramanzia, non si sa mai)
Dim strSQL As String
 strSQL = CurrentDb.QueryDefs("Q_AGG_fromCSTMPtoMP").SQL
  DoCmd.RunSQL strSQL
Questa è la query
UPDATE TBL_MP LEFT JOIN TBL_CSTMP ON TBL_MP.mp_id =
TBL_CSTMP.cstmp_mpid SET TBL_MP.mp_costo = tbl_cstmp.cstmp_costo,
TBL_MP.mp_perc = tbl_cstmp.cstmp_perc
WHERE TBL_CSTMP.cstmp_vsid =[FORMS]![MSC_CSTMP]![VERSIONELISTINO];
Grazie soprattutto x l'aiuto,
Samantha