Newsgroup: it.comp.appl.access
Titolo: errore a run time '-2147217904(80040e10)

la seguente routine:
Public Sub Storicizza(strWhere As String)
Dim bolStop As Boolean
Dim strCognome As String
Dim strNome As String
 
Dim rstAdd As ADODB.Recordset
Dim rstDisp As ADODB.Recordset
Dim rstStor As ADODB.Recordset
 
  Set rstAdd = New ADODB.Recordset
  Set rstDisp = New ADODB.Recordset
  Set rstStor = New ADODB.Recordset
 
  'MsgBox "SELECT * FROM qrStoricoAssegnazioni_Rst WHERE
dataInizioServizio <= #" & dtData & "# AND AGS = " & lngAGS
    rstAdd.Open "tbAddetti", CurrentProject.Connection, adOpenStatic,
adLockPessimistic
    rstDisp.Open "SELECT * FROM qrStoricoAssegnazioni_Rst " &
strWhere, CurrentProject.Connection, adOpenStatic, adLockPessimistic
    rstStor.Open "tbStorico", CurrentProject.Connection, adOpenStatic,
adLockPessimistic
 
    rstAdd.MoveFirst
    Do Until rstAdd.EOF
        intSearch = rstAdd.Fields("idAddetto")
        strCognome = Nz(rstAdd.Fields("cognomeAddetto"))
        strNome = Nz(rstAdd.Fields("nomeAddetto"))
        rstDisp.MoveFirst
        'Do Until bolStop = True
        rstDisp.Find "idAddetto = " & intSearch
        If Not rstDisp.EOF Then
            rstStor.AddNew
            rstStor.Fields("idAddetto") = rstDisp.Fields("idAddetto")
            rstStor.Fields("ADDETTO") = strCognome & " " & strNome
            rstStor.Fields("SEDE") = rstDisp.Fields("SEDE")
            rstStor.Fields("turno") = rstDisp.Fields("turno")
            rstStor.Fields("AGS") = rstDisp.Fields("idAssistente")
            rstStor.Update
        End If
        'Loop
        rstAdd.MoveNext
    Loop
 
  rstAdd.Close
  rstDisp.Close
  rstStor.Close
 
  Set rstAdd = Nothing
  Set rstDisp = Nothing
  Set rstStor = Nothing
 
End Sub
 
chiamata da quest'altra:
 
Private Sub txtFiltroData_AfterUpdate()
Dim strWhere As String
 
    DoCmd.Echo False
    If Not IsNothing(Me!txtFiltroData) And Not
IsNothing(lngIdAssistente) Then
        strWhere = "WHERE dataInizioServizio <= #" & Me!txtFiltroData
& "# AND AGS = " & lngIdAssistente
        Call Storicizza(strWhere)
        Me.RecordSource = "tbStorico"
    Else
        MsgBox "Devi selezionare data e assistente"
    End If
    DoCmd.Echo True
End Sub
 
mi dà l'errore:
"errore a run time '-
2147217904
(80040e10) nessun valore specificato
per alcuni parametri necessari"
sono tre giorni che cerco di venirci a capo. Qualcuno mi può aiutare,
per favore?

 
il debug punta su questa riga:


....
Perchè usi ADO con Access...? Si tratta di ADP o è una scelta tua...?
Se devi aggiungere dei Records perchè invece di perdere tempo a
ciclare non fai una Query INSERT escludendo i Records già presenti...?
In tutti i modi se non metti una gestione ERRORI non troverai mai il
problema... fai un PASSO-PASSO inserendo una gestione errori seria
e vedrai che trovi l'inghippo.
@Alex

On 11 Set, 21:57, Francesca Chiarelli

Siccome costruisci la stringa esternamente, devi convertire in formato
Anglosassone altrimenti non otterrai nulla..
 
strWhere = "WHERE dataInizioServizio <= #" & Format(Me!
txtFiltroData,"mm/dd/yyyy") & "# AND AGS = " & lngIdAssistente
 
Rifletti su ADO...
 
@Alex


niente da fare, continua a darmi lo stesso errore sulla stessa riga.
ho letto alcuni tuoi post (DAO vs ADO). Ok, però oglio capire perché
non funziona, e poi passo a fare la stessa cosa con DAO..

 ha scritto nel 
messaggio 
news:48c3185e-20b9-40bf...@r21g2000yqr.googlegroups.com...

_______
 
forse l'errore sta nelle variabili/tipo di dati, sei sicura ad esempio che 
"AGS" è di tipo numerico? Altrimenti alla variabile "lngIdAssistente" 
mancano le ':
 
 strWhere = "WHERE dataInizioServizio <= #" & Format(Me!
 txtFiltroData,"mm/dd/yyyy") & "# AND AGS = '" & lngIdAssistente &"'"
 
 
-- 
Ciao
Geppo 
 

On 11 Set, 22:10, Francesca Chiarelli

Purtroppo solo tu puoi verificare che la sintassi della stringa sia
corretta...
Io di solito per testare se la Query è corretta COPIO un Debug.Print e
lo metto in una Query da QBE... mi tolgo ogni dubbio.
 
@Alex

 ...
 
Cosa succede se tenta di aprire il recordset senza strWHERE?
 
rstDisp.Open "SELECT * FROM qrStoricoAssegnazioni_Rst ", & _
 CurrentProject.Connection, adOpenStatic, adLockPessimistic
 
Se anche questo ti dà il messaggio, vuol dire che il problema
si trova già nella qrStoricoAssegnazioni_Rst.
 
In questo caso posta la sua stringa SQL e leggi
 
http://www.donkarl.com/it?FAQ6.4
 
 
Il problema è lo stesso con DAO e ADO.
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 
 
 

ok ok, sono passata a DAO. E' la prima volta che lo uso (sui manuali
si usa sempre ADO). Ho cambiato il codice come segue (senza successo
per i miei scopi):
Public Sub Storicizza2(strWhereData As String, strWhereAGS As String,
lngIdAssistente As Long)
'On Error GoTo errTrap
Dim db As Database
Dim qdfAddAZ As QueryDef
Dim rstAddAZ As Recordset
Dim rstUltimaAssegnazioneEntroData As Recordset
Dim qdfDispEntroData As QueryDef
Dim rstDispEntroData As Recordset
Dim rstDispSelezione As Recordset
Dim qdfDispAGS As QueryDef
Dim rstDispAGS As Recordset
Dim rstStor As Recordset
Dim strSqlAddAZ As String
Dim strSqlDatazioneDisp As String
Dim intSearch As Long
Dim strCognome As String
Dim strNome As String
Dim strOrdina As String
    Set db = CurrentDb
    ' Open table-type recordset
    strSqlAddAZ = "SELECT * FROM tbAddetti ORDER BY cognomeAddetto
ASC"
    Set qdfAddAZ = db.CreateQueryDef("Add", strSqlAddAZ)
    Set rstAddAZ = db.OpenRecordset("Add") 'recordset con gli addetti
in ordine alfabetico
    'strOrdina = "SELECT * FROM qrStoricoAssegnazioni_Rst " &
strWhereAGS '& " ORDER BY ADDETTO ASC"
    'Set qdfDispAGS = db.CreateQueryDef("DispAGS", strOrdina)
    'Set rstDispAGS = db.OpenRecordset("DispAGS")
    'Set rstDispSelezione = db.OpenRecordset("tbDisp")
    strOrdina = "SELECT * FROM qrStoricoAssegnazioni_Rst " &
strWhereData '& " ORDER BY ADDETTO ASC"
    Set qdfDispEntroData = db.CreateQueryDef("DispEntroData",
strOrdina)
    Set rstDispEntroData = db.OpenRecordset("DispEntroData")
    Set rstUltimaAssegnazioneEntroData =
db.OpenRecordset("UltimaAssegnazioneEntroData")
    Set rstStor = db.OpenRecordset("tbStorico")
    rstAddAZ.MoveFirst
    Do Until rstAddAZ.EOF
        intSearch = rstAddAZ!idAddetto
        rstDispEntroData.MoveFirst
        rstDispEntroData.FindFirst "idAddetto = " & intSearch
        If rstDispEntroData.NoMatch Then
            rstDispEntroData.MoveFirst
            rstAddAZ.MoveNext
        Else
            rstUltimaAssegnazioneEntroData.AddNew
            rstUltimaAssegnazioneEntroData!idAddetto =
rstDispEntroData!idAddetto
            rstUltimaAssegnazioneEntroData!addetto = rstDispEntroData!
addetto
            rstUltimaAssegnazioneEntroData!SEDE = rstDispEntroData!
SEDE
            rstUltimaAssegnazioneEntroData!turno = Nz(rstDispEntroData!
turno, vbNullString)
            rstUltimaAssegnazioneEntroData!IDSEDE =
Nz(rstDispEntroData!IDSEDE)
            rstUltimaAssegnazioneEntroData!idAssistente =
Nz(rstDispEntroData!idAssistente)
            rstUltimaAssegnazioneEntroData.Update
            rstDispEntroData.MoveFirst
            rstAddAZ.MoveNext
        End If
    Loop
    intSearch = 0
    rstAddAZ.MoveFirst
    Do Until rstAddAZ.EOF
        intSearch = rstAddAZ!idAddetto
        rstUltimaAssegnazioneEntroData.MoveFirst
        rstUltimaAssegnazioneEntroData.FindFirst "idAddetto = " &
intSearch
        If rstUltimaAssegnazioneEntroData.NoMatch Then
            rstUltimaAssegnazioneEntroData.MoveFirst
            rstAddAZ.MoveNext
        Else
            If rstUltimaAssegnazioneEntroData!idAssistente =
lngIdAssistente Then
                rstStor.AddNew
                rstStor!idAddetto = rstUltimaAssegnazioneEntroData!
idAddetto
                rstStor!addetto = rstUltimaAssegnazioneEntroData!
addetto
                rstStor!SEDE = rstUltimaAssegnazioneEntroData!SEDE
                rstStor!turno = rstUltimaAssegnazioneEntroData!turno
                rstStor!IDSEDE = rstUltimaAssegnazioneEntroData!IDSEDE
                rstStor!idAssistente = rstUltimaAssegnazioneEntroData!
isAssistente
                rstStor.Update
                rstUltimaAssegnazioneEntroData.MoveFirst
                rstAddAZ.MoveNext
            End If
        End If
    Loop
    ' Close all
    rstAddAZ.Close
    'db.QueryDefs.Delete "Add"
    rstDispEntroData.Close
    'db.QueryDefs.Delete "DispEntroData"
    'rstDispSelezione.Close
    'rstDispAGS.Close
    'db.QueryDefs.Delete "DispAGS"
    rstUltimaAssegnazioneEntroData.Close
    rstStor.Close
Exit Sub
errTrap:
    MsgBox err.Number & " " & err.Description
    rstAddAZ.Close
    'db.QueryDefs.Delete "Add"
    rstDispEntroData.Close
    'db.QueryDefs.Delete "DispEntroData"
    'rstDispSelezione.Close
    'rstDispAGS.Close
    'db.QueryDefs.Delete "DispAGS"
    rstUltimaAssegnazioneEntroData.Close
    rstStor.Close
End Sub
(ho messo gli apici perché non riusci ad individuare la riga
dell'errore)
la routine è chiamata dalla seguente:
Private Sub txtFiltroData_AfterUpdate()
Dim strWhereData As String
Dim strWhereAGS As String
'Dim strFiltroData As String
    DoCmd.Echo False
    If Not IsNothing(Me!txtFiltroData) And Not
IsNothing(lngIdAssistente) Then
        strWhereData = "WHERE dataInizioServizio <= #" & Format(Me!
txtFiltroData, "mm/dd/yyyy") & "#" ' AND idAssistente = " &
lngIdAssistente
        strWhereAGS = "WHERE idAssistente = " & lngIdAssistente
        Call Storicizza2(strWhereData, strWhereAGS, lngIdAssistente)
        'Me.RecordSource = "tbStorico"
    Else
        MsgBox "Devi selezionare data e assistente"
    End If
    DoCmd.Echo True
End Sub
mi dà errore di run time 3251 - operazione non supportata per questo
tipo di oggetto
il debug punta sulla riga:
rstUltimaAssegnazioneEntroData.FindFirst "idAddetto = " & intSearch
preciso che che le tabelle (che sopravvivono al crash) Add e
DispEntroData riportano i risultati attesi
Dov'è che sbaglio? :-(

 Dov'è che sbaglio? :-(
Usi ADO? Allora Findfirst *non* esiste (non c'e' metodo con questo nome, 
e' DAO) esiste, invece, *Find*
 
 
-- 
 
ac (x=y-1)

On 13 Set, 12:34, Francesca Chiarelli

anche la tabella UltimaAssegnazioneEntroData viene popolata con i
risultati attesi. TbStorico, invece, siccome il codice si interrompe
prima, rimane vuota. Mi pare di capire che rst.FindFirst non funga con
una tabella di quel tipo..

 ac (x=y-1)
 
no no, è proprio DAO

 no no, č proprio DAO
Non avevo visto la tua dichiarazione di inizio post. Ero rimasto fermo 
al tuo post iniziale ed ho guardato solo il riferimento all'errore.
Sei certa che intSearch e' valorizzato (anche se l'errore nondovrebbe 
essere quello), c'e' anche la questione del tipo di recordset (dynamic, 
snapshot, etc) non tutti i tipi supportano tutti i metodi (mi sembra 
:-{)). Se usi il debug ti e' facile verificare tutte e due le questioni.
 
-- 
 
ac (x=y-1)

 :-{)). Se usi il debug ti e' facile verificare tutte e due le questioni.
 
infatti credo che il problema si la tabella. Mentre le altre vengono
create dalla routine a partire da una querydef,
UltimaAssegnazioneEntroData e tbStorici risiedono permanentemente nel
db.  Che parametri dovrei aggiustare e come?
 


Mi sa  che usi il Debug in modo approssimativo.
Sul sito di Baraldi (@Alex) c'e' una spieegazione di come si usa.
Cmq:
1) Vai sul codice VBA cerca l'istruzione che ti va in errore posizionati 
e fai <F9> (mette un cosiddetto breakpoint)
2) manda in esecuzione e vedrai che il run si ferma sull'istruzione del 
brekpoint (prima di eseguirla)
3) Nel menu attiva la voce  visualizza--> Variabili Locali (e finestra 
immediata per buon peso)
4) Appariranno tutte le variabili visibili dalla routine ed anche il 
recordset imputato clicca sul + e ti si aprira' un mondo.
--
ac
 
 
-- 
 
ac (x=y-1)

Il 13/09/2011 19.22, Alessandro Cara ha scritto:
P.S. il sito di @Alex e' 
alessandrobaraldi.it
 
P.P.S Debug <F9> per ritogliere il breakpoint; <F8> per mandare un passo 
alla volta; <shift+F8> per non far eseguire il codice di subroutine (call)
-- 
 
ac (x=y-1)


wrote:

Comoda... da domani si PAGA...!
 
@Alex

alla fine ho trovato il codice che funziona:
 
Public Sub Storicizza2(strWhereData As String, lngAGS As Long)
On Error GoTo errTrap
 
Dim db As Database
Dim qdfAddAZ As QueryDef
Dim rstAddAZ As Recordset
Dim rstUltimaAssegnazioneEntroData As Recordset
Dim qdfDispEntroData As QueryDef
Dim rstDispEntroData As Recordset
Dim rstStor As Recordset
Dim strSqlAddAZ As String
Dim intSearch As Long
Dim strOrdina As String
 
    Set db = CurrentDb
    strSqlAddAZ = "SELECT * FROM tbAddetti ORDER BY cognomeAddetto
ASC"
    Set qdfAddAZ = db.CreateQueryDef("Add", strSqlAddAZ)
    Set rstAddAZ = db.OpenRecordset("Add") 'recordset con gli addetti
in ordine alfabetico
    strOrdina = "SELECT * FROM qrStoricoAssegnazioni_Rst " &
strWhereData '& " ORDER BY ADDETTO ASC"
    Set qdfDispEntroData = db.CreateQueryDef("DispEntroData",
strOrdina)
    Set rstDispEntroData = db.OpenRecordset("DispEntroData")
    Set rstUltimaAssegnazioneEntroData =
db.OpenRecordset("UltimaAssegnazioneEntroData", dbOpenDynaset)
    Set rstStor = db.OpenRecordset("tbStorico", dbOpenDynaset)

        rstUltimaAssegnazioneEntroData.FindFirst "idAddetto = " &
intSearch
        If rstUltimaAssegnazioneEntroData.NoMatch Then
            rstUltimaAssegnazioneEntroData.MoveFirst
            rstAddAZ.MoveNext
        Else
            If rstUltimaAssegnazioneEntroData!idAssistente = lngAGS
Then
                rstStor.AddNew
                rstStor!idAddetto = rstUltimaAssegnazioneEntroData!
idAddetto
                rstStor!addetto = rstUltimaAssegnazioneEntroData!
addetto
                rstStor!SEDE = rstUltimaAssegnazioneEntroData!SEDE
                rstStor!turno = rstUltimaAssegnazioneEntroData!turno
                rstStor!IDSEDE = rstUltimaAssegnazioneEntroData!IDSEDE
                rstStor!idAssistente = rstUltimaAssegnazioneEntroData!
idAssistente
                rstStor.Update
                rstUltimaAssegnazioneEntroData.MoveFirst
                rstAddAZ.MoveNext
            Else
                rstUltimaAssegnazioneEntroData.MoveFirst
                rstAddAZ.MoveNext
            End If
        End If
    Loop
 
 
    rstAddAZ.Close
    db.QueryDefs.Delete "Add"
    rstDispEntroData.Close
    db.QueryDefs.Delete "DispEntroData"
    rstUltimaAssegnazioneEntroData.Close
    rstStor.Close
Exit Sub
 
errTrap:
    MsgBox err.Number & " " & err.Description
    rstAddAZ.Close
    db.QueryDefs.Delete "Add"
    rstDispEntroData.Close
    db.QueryDefs.Delete "DispEntroData"
    rstUltimaAssegnazioneEntroData.Close
End Sub
 
certo che ADO sembrerebbe più comodo, e con meno da scrivere!


wrote:

ah ecco!


servizio a pagamento??

 certo che ADO sembrerebbe pi� comodo, e con meno da scrivere!
Non direi. E' praticamente la stessa cosa quando si opera su un 
recordset. Non a caso ho un paio di funzioni che possono usare ADO e DAO 
senza alcuna attenzione particolare all'uno o all'altro.
-- 
ac (x=y-1)

 servizio a pagamento??
@Alex celiava ma visti i tempi che corrono se tu sei in grado di aiutare 
economicamente due famiglie in difficolta' con, che ne so, 800.000 Euri, 
non ci si tira indietro
-- 
ac (x=y-1)


wrote:

ottimo a sapere