Newsgroup: it.comp.appl.access
Titolo: query di aggiornamento in conflitto

ciao a tutti
ho due query di aggiornamento:
1-UPDATE DettaglioCarichi LEFT JOIN TbImpostazioni ON DettaglioCarichi.IdProdotto = TbImpostazioni.IdProdotto1 SET TbImpostazioni.IdProdotto1 = DettaglioCarichi.IdProdotto, TbImpostazioni.IdBancale = DettaglioCarichi.IdBancale, TbImpostazioni.IdConfezione = DettaglioCarichi.IdConfezione, TbImpostazioni.IdUnitàMisura = DettaglioCarichi.IdUnitàMisura
WHERE DettaglioCarichi.IdDettaglioCarichi=fctCriterio_Iddc() AND TbImpostazioni.IdCliente1=cliCriterio();
 
2-UPDATE DettaglioCarichi LEFT JOIN TbImpostazioni ON DettaglioCarichi.IdProdotto = TbImpostazioni.IdProdotto SET TbImpostazioni.IdProdotto = DettaglioCarichi.IdProdotto, TbImpostazioni.IdBancale = DettaglioCarichi.IdBancale, TbImpostazioni.IdConfezione = DettaglioCarichi.IdConfezione, TbImpostazioni.IdUnitàMisura = DettaglioCarichi.IdUnitàMisura
WHERE DettaglioCarichi.IdDettaglioCarichi=fctCriterio_Iddc();
 
entrambe vengono eseguite assieme.
Il problema è che la seconda aggiorna anche i record che devono essere
aggiornati solo dalla prima query.
Come devo fare, affinchè la seconda query non entri in conflitto con
la prima?
 
grazie.


Migliora le where. Se i vincoli sono uguali, non c'è nessun conflitto, ma solo l'esecuzione sullo stesso set di record


ciao Fair87 e grazie
ho provato in molti modi ma non riesco ad avere il giusto riusltato.
hai un suggerimento in proposito?
 


ho provato anche cosi, ma non cambia nulla
Where DettaglioCarichi.IdDettaglioCarichi=fctCriterio_Iddc() And (TbImpostazioni.IdCliente1) Is Null


 
non so se ho capito il problema...che mi sembra ovvioviste le where
se la prima ha come where
WHERE DettaglioCarichi.IdDettaglioCarichi=fctCriterio_Iddc() AND 
TbImpostazioni.IdCliente1=cliCriterio();
 
la seconda per non intaccare la prima deve avere
WHERE DettaglioCarichi.IdDettaglioCarichi=fctCriterio_Iddc() and  NOT 
TbImpostazioni.IdCliente1=cliCriterio()
 
ciao
BFS


Grazie BFS
ora ci provo


in questo modo non aggiorna nulla

 in questo modo non aggiorna nulla
 
Franco, la 1° Query UPDATE così come l'hai scritta è un SOTTOINSIEME della 2°...!
Risulta evidente che se esegui prima la 1° e poi la 2° il risultato è che la 2° copre la 1°...!
 
Hai pensato di INVERTIRE l'ordine di ESECUZIONE...?
 
@Alex


ciao Alex e grazie
l'idea è geniale
ma non risolve

 ma non risolve
 
NO.
Se quello che descrivi è quello che ti serve, la cosa DEVE RISOLVERE.
 
Se non risolve il problema è altrove... magari nella nostra comprensione o in altro che ti sfugge...!
 
@Alex


ciao Alex
in effetti come ragionamento hai ragione tu....
 
ma...
ho provato a scambiare l'ordine ed ho sempre 
il medesimo risulato:
 
il problema l'ho, quando aggiorno il prodotto relativo alle impostazioni "Personalizzate", in quanto lo stesso prodotto nelle impostazioni generali diventa un suo clone.
 
 

 
cut
 
ciao Alex ho fatto cosi;
DoCmd.SetWarnings False
If Opzione = 1 Then DoCmd.OpenQuery "Qry_Agg_TbImpostazioniProd"
If Opzione = 2 Then DoCmd.OpenQuery "Qry_Agg_TbImpostazioniProdxCli"
DoCmd.SetWarnings True
 
e questo è l'intero codice, non è bello, ma funziona:
 
  Dim rst As DAO.Recordset
  Dim strSql As String
  Dim Opzione As Integer
  Dim Risposta As Variant
  Dim X As String
 
  Opzione = 1
Punto1:
  strSql = vbNullString
  strSql = strSql & "SELECT TbImpostazioni.*, "
  strSql = strSql & "Bancale, Confezione, UnitàMisura "
  strSql = strSql & "From TbUnitàMisura "
  strSql = strSql & "INNER JOIN (TbConfezioni "
  strSql = strSql & "INNER JOIN (TbBancali "
  strSql = strSql & "INNER JOIN TbImpostazioni "
  strSql = strSql & "ON TbBancali.IdBancale = TbImpostazioni.IdBancale) "
  strSql = strSql & "ON TbConfezioni.IdConfezione = TbImpostazioni.IdConfezione) "
  strSql = strSql & "ON TbUnitàMisura.IdUnitàMisura = TbImpostazioni.IdUnitàMisura "
  Select Case Opzione
    Case Is = 1
    strSql = strSql & "WHERE IdProdotto1 = " & Frm!CboProdotto.Value
    strSql = strSql & "And IdCliente1 = " & cliCriterio()
    Case Is = 2
    strSql = strSql & "WHERE IdProdotto = " & Frm!CboProdotto.Value
 
  End Select
  Set rst = CurrentDb().OpenRecordset(strSql)
 
  Risposta = vbYes
 
  If rst.EOF And Opzione = 1 Then
    Opzione = 2
    GoTo Punto1
  Else
    Opzione = 1
 
  End If
 
  If Not rst.EOF Then
    If rst!IdBancale = Frm!CboBancale.Value And _
      rst!IdConfezione = Frm!CboConfezione.Value And _
      rst!IdUnitàMisura = Frm!CboUnitàMisura.Value Then
      MsgBox "Questo Prodotto è già inserito!", vbInformation, "Informazione!"
      GoTo Fine:
    Else
      X = "Msgbox('" & Replace(Frm!CboProdotto.Column(1), "'", "''") & _
      "@" & IIf(rst!IdBancale <> Frm!CboBancale.Value, rst!Bancale & _
      " > " & Frm!CboBancale.Column(1), rst!Bancale) & _
      "@" & IIf(rst!IdConfezione <> Frm!CboConfezione.Value, rst!Confezione & _
      " > " & Replace(Frm!CboConfezione.Column(1), "'", "''"), rst!Confezione) & _
      "  " & IIf(rst!IdUnitàMisura <> Frm!CboUnitàMisura.Value, rst!UnitàMisura & _
      " > " & Frm!CboUnitàMisura.Column(1), rst!UnitàMisura) & _
      vbLf & "vuoi aggiornarlo?',4,'Risposta ="
      If IsNull(rst!IdProdotto1) Then
        Opzione = 1
        Eval (X & "*** AGGIORNAMENTO ***')")
      Else
        Opzione = 2
        Eval (X & "*** AGGIORNAMENTO PRODOTTO PER CLIENTE ***')")
 
      End If
 
    End If
 
  End If
 
  If (Risposta = vbYes) Then
    Eval ("Msgbox('" & Replace(Frm!CboProdotto.Column(1), "'", "''") & _
    "@" & Frm!CboBancale.Column(1) & _
    "@" & Replace(Frm!CboConfezione.Column(1), "'", "''") & "  " & _
    Frm!CboUnitàMisura.Column(1) & "',0,'*** INSERITO ***')")
 
    DoCmd.SetWarnings False
    If Opzione = 1 Then DoCmd.OpenQuery "Qry_Agg_TbImpostazioniProd"
    If Opzione = 2 Then DoCmd.OpenQuery "Qry_Agg_TbImpostazioniProdxCli"
    DoCmd.SetWarnings True
 
    DoCmd.SetWarnings False
    DoCmd.OpenQuery "Qry_Del_ImpostazionixCli"
    DoCmd.SetWarnings True
 
  End If
 
Fine:
  Set rst = Nothing
 

cut
 
questo è come l'ho modificata
  Dim rst As DAO.Recordset
  Dim strSql As String
  Dim Opzione As Integer
  Dim Risposta As Variant
  Dim X As String
 
  Opzione = 1
 
  Do
  strSql = vbNullString
  strSql = strSql & "SELECT TbImpostazioni.*, "
  strSql = strSql & "Bancale, Confezione, UnitàMisura "
  strSql = strSql & "From TbUnitàMisura "
  strSql = strSql & "INNER JOIN (TbConfezioni "
  strSql = strSql & "INNER JOIN (TbBancali "
  strSql = strSql & "INNER JOIN TbImpostazioni "
  strSql = strSql & "ON TbBancali.IdBancale = TbImpostazioni.IdBancale) "
  strSql = strSql & "ON TbConfezioni.IdConfezione = TbImpostazioni.IdConfezione) "
  strSql = strSql & "ON TbUnitàMisura.IdUnitàMisura = TbImpostazioni.IdUnitàMisura "
  Select Case Opzione
    Case Is = 1
    strSql = strSql & "WHERE IdProdotto1 = " & Frm!CboProdotto.Value
    strSql = strSql & "And IdCliente1 = " & cliCriterio()
    Case Is = 2
    strSql = strSql & "WHERE IdProdotto = " & Frm!CboProdotto.Value
 
  End Select
  Set rst = CurrentDb().OpenRecordset(strSql)
 
  If rst.EOF And Opzione = 1 Then
    Opzione = 2
  Else
    X = "Stop"
    Opzione = 1
  End If
 
  Loop Until X = "Stop"
 
  If Not rst.EOF Then
    If rst!IdBancale = Frm!CboBancale.Value And _
      rst!IdConfezione = Frm!CboConfezione.Value And _
      rst!IdUnitàMisura = Frm!CboUnitàMisura.Value Then
      MsgBox "Questo Prodotto è già inserito!", vbInformation, "Informazione!"
      GoTo Fine:
    Else
      X = "Msgbox('" & Replace(Frm!CboProdotto.Column(1), "'", "''") & _
      "@" & IIf(rst!IdBancale <> Frm!CboBancale.Value, rst!Bancale & _
      " > " & Frm!CboBancale.Column(1), rst!Bancale) & _
      "@" & IIf(rst!IdConfezione <> Frm!CboConfezione.Value, rst!Confezione & _
      " > " & Replace(Frm!CboConfezione.Column(1), "'", "''"), rst!Confezione) & _
      "  " & IIf(rst!IdUnitàMisura <> Frm!CboUnitàMisura.Value, rst!UnitàMisura & _
      " > " & Frm!CboUnitàMisura.Column(1), rst!UnitàMisura) & _
      vbLf & "vuoi aggiornarlo?',4,'"
      If IsNull(rst!IdProdotto1) Then
        Risposta = Eval(X & "*** AGGIORNAMENTO ***')")
        Opzione = 1
      Else
        Risposta = Eval(X & "*** AGGIORNAMENTO PRODOTTO PER CLIENTE ***')")
        Opzione = 2
 
      End If
 
    End If
 
  End If
 
  Risposta = vbYes


Il giorno mercoledì 28 dicembre 2016 09:17:43 UTC+1, Franco dellavalle ha scritto:
cut
 
ciao a tutti
spiego la struttura della TbImpostazioni
 
IdImpostazioni Contatore, indicizzato Sì (Duplicati non ammessi)
IdCliente      Numerico, indicizzato Sì (Duplicati non ammessi)
IdCliente1     Numerico, indicizzato Sì (Duplicati ammessi)
IdProdotto     Numerico, indicizzato Sì (Duplicati non ammessi)
IdProdotto1    Numerico, indicizzato Sì (Duplicati ammessi)
IdBancale      Numerico, indicizzato Sì (Duplicati ammessi)
IdConfezione   Numerico, indicizzato Sì (Duplicati ammessi)
IdUnitaMisura  Numerico, indicizzato Sì (Duplicati ammessi)
 
per cercare di rendere univoca questa 
query di aggiornamento:
 
UPDATE DettaglioCarichi LEFT JOIN TbImpostazioni ON DettaglioCarichi.IdProdotto = TbImpostazioni.IdProdotto SET TbImpostazioni.IdProdotto = DettaglioCarichi.IdProdotto, TbImpostazioni.IdBancale = DettaglioCarichi.IdBancale, TbImpostazioni.IdConfezione = DettaglioCarichi.IdConfezione, TbImpostazioni.IdUnitàMisura = DettaglioCarichi.IdUnitàMisura
WHERE DettaglioCarichi.IdDettaglioCarichi=fctCriterio_Iddc(); 
 
da quest'altra:


cut ...
 
p.e. io dovrei aggiornare solo il primo record
 
TbImpostazioni:
Id, IdCliente1, IdProdotto, IdProdotto1, IdBancale, IdConfezione, IdUnitàMisura
38                     11                         3           37             1 <-da aggiornare
39         12                       11            2           26             1
 
 
mentre con questa query mi si aggiornano entrambi i records:
UPDATE DettaglioCarichi
LEFT JOIN TbImpostazioni
ON DettaglioCarichi.IdProdotto = TbImpostazioni.IdProdotto
SET TbImpostazioni.IdProdotto = DettaglioCarichi.IdProdotto,
TbImpostazioni.IdBancale = DettaglioCarichi.IdBancale,
TbImpostazioni.IdConfezione = DettaglioCarichi.IdConfezione,
TbImpostazioni.IdUnitàMisura = DettaglioCarichi.IdUnitàMisura
WHERE DettaglioCarichi.IdDettaglioCarichi=fctCriterio_Iddc()
 
come devo fare per aggiornare solo il primo  record?
 
Grazie