Newsgroup: it.comp.appl.access
Titolo: recordset non aggiornabile

Ciao a tutti............
Vorrei capire perchè se popolo la sottomaschera da VBA con il seguente 
recordset, e provo a modificare un campo mi dice recordset non 
aggiornabile....
Se invece assegno come origine record la stessa query riesco a modificare i 
campi.....
 
 
 
Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient
rst.Open "SELECT ANAART1.*, Marchio.Marchio, ANAART1.IDMarchio FROM Marchio 
INNER JOIN ANAART1 ON Marchio.IDMarchio = ANAART1.IDMarchio ", 
CurrentProject.Connection, adOpenKeyset, adLockOptimistic
 
Set Forms!frmvargia!sfrmvargia.Form.Recordset = rst
 
Un saluto a tutti e un augurio di Buon Natale
 
 

 ...
 
Prima di tutto manca la tua versione di Access.
Se si tratta di 2000 il problema è "by design":
http://support.microsoft.com/kb/227053/EN-US
 
 
Solo nelle versioni dopo 2000 la maschera dovrebb'essere
aggiornabile.
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 
 
 

 ha scritto nel messaggio 
news:9ljqu5...@mid.individual.net...

La versione è 2002/2003
Ciao
 
 

 La versione è 2002/2003
 
Non uso mai recordset di ADO per popolare le maschere,
ma secondo una piccola prova direi che il problema è ADO.
Cioè è abbastanza normale per sistemi diversi di Access
che una query con campi da due tabelle non è aggiornabile
e ADO sembra di seguire questo uso.
 
Nella prova ho visto che sono aggiornabili:
 
SELECT Tab1.* FROM Tab1
 
SELECT Tab1.* FROM Tab1 INNER JOIN Tab2
    ON Tab1.Id = Tab2.Id
 
Però rst diventa non aggiornabile se include campi di Tab2:
 
SELECT Tab1.*, Tab2.Id FROM Tab1 INNER JOIN Tab2
    ON Tab1.Id = Tab2.Id
 
Perché usi ADO, che non era mai perfetto per Access e
che passo a passo diventa più abbandonato anche della
parte della MS?
 
La tecnica da preferire è impostare la stringa SQL come
RecordSource della sottomaschera:
 
Forms!frmvargia!sfrmvargia.Form.RecordSource = "SELECT..."
 
Se assolutamente vuoi usare un recordset (aggiornabile)
puoi usare DAO:
 
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT ...", dbOpenDynaset)
 
Set Forms!frmvargia!sfrmvargia.Form.Recordset = rst


 ha scritto nel messaggio 
news:9m3gh6...@mid.individual.net...

Uso ADO in parecchie maschere quando ho bisogno di fare delle ricerche 
complesse e logiche.
Pensavo di impostare la stringa SQL ma credevo fosse più dispensioso in 
tempo di esecuzione.
Adesso provo
Ciao
Massimo
 
 
 
 

 ha scritto nel messaggio 
news:jdi4ip$4dh$1...@speranza.aioe.org...

Ti posto il codice completo ma non ritorna nessun record, evidentemente 
strsql sarà sbagliato per DAO?
 
Dim strsql As String
Dim strSerie As String
 
If IsNull(Me.serie1) Then
Else
strSerie = "and anaart1.serie Like " & Chr(34) & Me.serie1 & "%" & Chr(34) & 
""
End If
 
 
If Me.marchio1 = 0 Then
strsql = "where anaart1.codart Like " & Chr(34) & Me.codart1 & "%" & Chr(34) 
& " And anaart1.Descrizione Like " & Chr(34) & Me.descrizione1 & "%" & 
Chr(34) & " " & strSerie & " "
Else
strsql = "where anaart1.codart Like " & Chr(34) & Me.codart1 & "%" & Chr(34) 
& " And anaart1.Descrizione Like " & Chr(34) & Me.descrizione1 & "%" & 
Chr(34) & " " & strSerie & "  and anaart1.idmarchio = " & 
Me.marchio1.Column(0) & ""
End If
 
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT anaart1.*, Marchio.Marchio, 
anaart1.IDMarchio FROM Marchio INNER JOIN anaart1 ON Marchio.IDMarchio = 
anaart1.IDMarchio " & strsql & " ORDER BY anaart1.CodArt", dbOpenDynaset)
 
If rst.EOF And rst.BOF Then
MsgBox "Non Ci sono record", vbOKOnly
Else
Set Forms!frmvargia!sfrmvargia.Form.Recordset = rst
 
 
DoCmd.GoToControl ("Sfrmvargia")
 
End If
Set rst = Nothing
 
Ciao
Massimo
 
 

 ...Set Forms!frmvargia!sfrmvargia.Form.Recordset = rst
 
Come già scritto il metodo da preferire è impostare direttamente
la stringa SQL come RecordSource della maschera perché
non c'è bisogno di usare cerimoniosamente una libreria come
DAO o ADO, di aprire nessun Recordset e di creare e rilassare
nessun variabile di oggetto.


 ha scritto nel messaggio 
news:9m3me8...@mid.individual.net...

Ti ringrazio per i suggerimenti, adesso provo e ti faccio sapere......
Ciao
Massimo
 
 

 ha scritto nel messaggio 
news:9m3me8...@mid.individual.net...

Ok tutto bene....
Approfitto della tua buona pazienza per capire come fare a riordinare la 
sottomaschera... devo rieseguire la stringa SQL o riordinare il set di 
record della sottomaschera? se così fosse come faccio? mi fai un esempio?
Grazie
Ciao
Massimo
 
 
 

 mi fai un esempio?
 
Per fortuna pronto da alcuni anni. ;-)
 
 Cambiare l'ordinamento di una maschera
 
http://www.donkarl.com/it?FAQ4.7
 


 ha scritto nel messaggio 
news:9m64qj...@mid.individual.net...

Ho appena finito di provare tutti gli esempi proposti compreso quello sotto 
elencato visto sul sito comune... devo solo decidere :)
 
'Per utilizzare l'ordinamento su maschere continue inserire pulsante di 
intestazione maschera ES: " pulsante1_intesta " e su evento clic 
=OrdinaFormContinue()
'Inoltre pe funzionare bisogna avere un recordset su orige dati della 
maschera altrimenti assegnare un recordsource
'Su Click Intestazione Colonna Form Continua, ordina in senso crescente o 
decrescente
 
Public Function OrdinaFormContinue()
  '
  Dim actform As Form, StrAName As String, StrPName As String
  Dim Intesta As Control, strIntesta As String
 
 
  Set actform = Screen.ActiveForm
 
  If actform.DefaultView = 0 Then  'Individua Oggetto SottoMaschera
          StrAName = actform.Name
          StrPName = Nz(
Screen.ActiveControl.Parent.Name
, StrAName)
          If StrPName <> StrAName Then Set actform = 
Screen.ActiveControl.Parent.Form
  End If
 
  Set Intesta = Screen.ActiveControl
  '<NomeCampo>_Intesta -----> <NomeCampo>
  strIntesta = Left(
Screen.ActiveControl.Name
, 
Len(
Screen.ActiveControl.Name
) - 8)
 
  actform.Controls(strIntesta).SetFocus
 
  'Nota: le costanti AcCmdSort operano sulla proprietà OrderBy della Form
  If InStr(1, Intesta.Caption, "»") = 0 And InStr(1, Intesta.Caption, "«") = 
0 Then
         DoCmd.RunCommand acCmdSortAscending
         Call ResetIntestaCmd(actform)
         Intesta.Caption = strIntesta & " »"
  ElseIf InStr(1, Intesta.Caption, "«") <> 0 Then
         DoCmd.RunCommand acCmdSortAscending
         Call ResetIntestaCmd(actform)
         Intesta.Caption = strIntesta & " »"
  Else
         DoCmd.RunCommand acCmdSortDescending
         Call ResetIntestaCmd(actform)
         Intesta.Caption = strIntesta & " «"
  End If
 
  Set Intesta = Nothing
  Set actform = Nothing
  Exit Function
 
End Function
 
 
'Elimina Flag d'ordinamento "»" o "«" dall'intestazione di una qualunque 
colonna
Public Sub ResetIntestaCmd(actform As Form)
  '
  Dim Ctr As Control
 
  For Each Ctr In actform.Controls
       If Ctr.ControlType = acCommandButton Then
            If InStr(1, Ctr.Caption, "»") <> 0 Or InStr(1, Ctr.Caption, "«") 
<> 0 Then
                 Ctr.Caption = Left(Ctr.Caption, Len(Ctr.Caption) - 2)
            End If
       End If
  Next Ctr
End Sub
 
Tanti auguri di Buon Anno
Ciao
Massimo