Newsgroup: it.comp.appl.access
Titolo: Recodset Ado non associati, OrderBy non funziona?

Access2013 32bit, Windows 8 pro
Sto provando un nuovo giocattolo, i recordset non associati
Ed usando il seguente codice sul Load di una form:
 
-----------------------------------------------------
     Dim Cartella As String          'Cartella files
     Dim NomeFile As String          'Nome file
     Dim Rs As New ADODB.Recordset
 
     Dim fso As FileSystemObject
     Dim f As file
     Dim s As String
 
     Set fso = New FileSystemObject
 
     'Creo il campo Nomefile nel recordset
     Rs.Fields.Append "nome_file", adVarChar, 250
     Rs.Fields.Append "data_creazione", adDate
     Rs.Fields.Append "data_ultima_modifica", adDate
     Rs.Fields.Append "data_ultimo_accesso", adDate
 
     'Apro il recordset
     Rs.Open , , adOpenDynamic, adLockOptimistic
 
     'Imposto il percorso dei files da cercare
     Cartella = Application.CurrentProject.Path & "\"
 
     'Popolo il recordset
     NomeFile = Dir(Cartella)
 
     Do While NomeFile <> ""
         Set f = fso.GetFile(Application.CurrentProject.Path & "\" & 
NomeFile)
         Rs.AddNew Array("nome_file", "data_creazione", 
"data_ultima_modifica", "data_ultimo_accesso"), Array(NomeFile, 
f.DateCreated & vbCrLf, f.DateLastModified & vbCrLf, f.DateLastAccessed 
& vbCrLf)
         NomeFile = Dir
         Loop
 
     Set Me.Recordset = Rs
 
     Rs.Close
     Set Rs = Nothing
 
     Me.OrderBy = "nome_file asc"
     Me.OrderByOn = True
-----------------------------------------------------
 
quando arriva alla  Me.OrderByOn=True  mi spara fuori un error 2766 la 
cui descrizione e' : "L'oggetto non contiene l'oggetto di automazione 
'ID_LINEENUMERAZIONI'"
Premesso che il campo ID_LINEENUMERAZIONI non esiste in questa form, la 
domanda e':  come mai non riesco ad ordinare i record usando le 
proprieta' della form OrderBy ed OrderByOn ?
 


Perchè non usi: 
 
Rs.Sort ="nome_file asc"
Set Me.Recordset = Rs
 
Ciao
@Alex


Dopo il caricamento iniziale, Rs viene distrutto (Rs.close + set Rs = 
nothing)
Dovrei riaprirne uno, ricaricare i record, ordinarlo, riassegnarlo alla 
form, si potrei farlo
Ma vorrei anche capire come mai l'OrderBy non funziona
Sbaglio io sintassi o non e' proprio possibile modificare l'ordinamento 
usando le propriteta' OrderBy della form?
 

 usando le propriteta' OrderBy della form?
 
Non è possibile in quanto il Provider dati che si aspetta ADO avendo associato un RS ADO, mentre OrderBy di Form agirebbe su DAO... 
 
Il problema però non è un problema...!
 
Se vuoi cambiare l'ordinamento riprendi al momento che serve un RS ADO
 
    Dim rs1  As ADODB.Recordset
    Set rs1 = Me.Recordset
    rs1.Sort = "NomeCampo DESC"    
    Set Me.Recordset = rs1
    rs1.Close
    Set rs1=nothing
 
@Alex


Ah non bisogna ricreare tutto ogni volta
Allora e' proprio semplicissimissimo


Routine per ordinare, su evento Click della label messa come titolo 
colonna 'nome file' della griglia con tutti i record
Quando tento di assegnare alla proprieta' Recordset della form il 
recordset Ado (Set Me.Recordset = rs2)  mi caccia fuori un errore 7965
"L'oggetto immesso non è una proprietà Recordset valida"
Eppure, stesso codice, nel form Load passa e funziona correttamente
Tipo recordset, su proprieta' form = Dynaset
Qualche idea?
 
--------------------------------
     Dim Rs2  As New ADODB.Recordset
 
     nome_campo = "nome_file"
     Set Rs2 = Me.Recordset
     Rs2.Sort = nome_campo & " ASC"
     Set Me.Recordset = Rs2
 
     Rs2.Close
     Set Rs2 = Nothing
------------------------------------
 

Secondo te serve il New...?
 
@Alex

 
 
Secondo me si, perche' bisogna creare una new istanza dell'oggetto Rs2
Ho pensato ti fossi dimenticato il new
Sballio?
Comunque, anche tolto quello, sempre il 7965 mi spara fuori
Qua' o c'e' un errore oppure c'e' uno sbaglio
 

Roberto ma cosa dici...
Quando assegni un rs Dao lo dichiari come New...?
Non devi creare un NUOVO OGGETTO ma assegnare ad una variabile oggetto un riferimento...
Questi dubbi meglio tu li chiarisca bene.
 
Da me funziona.
 
@Alex


Mi manderesti il file col frammento di codice che da te funziona?
 

Quello che ti ho postato è esattamente quello che ho fatto su click.
 
Per sicurezza faccio una verifica in più... poi ti aggiorno.
 
@Alex

Scusa ma avevo postato un Codice di Test errato...
 
Come dicevo, Funziona ma il RS iniziale va lasciato Aperto.
 
Chiramente non pensare che siano aperti 2 RECORDSET, la Form si basa sul PUNTATORE all'Oggetto Recordset.
 
Ecco il Codice giusto:
 
Option Compare Database
Option Explicit
 
Private rs                      As New ADODB.Recordset
 
Private Sub Comando6_Click()
    rs.Sort = "Nome DESC"
    Set Me.Recordset = rs
End Sub
 
Private Sub Form_Open(Cancel As Integer)
    On Error GoTo ERR_HANDLER
 
    rs.Fields.Append "Nome", adVarChar, 100
    'Apro il recordset
    rs.Open , , adOpenDynamic, adLockOptimistic
 
    ' Aggiungo Records
    rs.AddNew
    rs!Nome.Value = "Alessadro"
    rs.Update
    rs.AddNew
    rs!Nome.Value = "Carlo"
    rs.Update
    rs.AddNew
    rs!Nome.Value = "Roberto"
    rs.Update
    Set Me.Recordset = rs
 
EXIT_HERE:
    On Error Resume Next
'    If Not rs Is Nothing Then rs.Close: Set rs = Nothing
    Err.Clear
    Exit Sub
 
ERR_HANDLER:
    Select Case Err.Number
        Case Else:      MsgBox Err.Number & " " & Err.Description, vbInformation, "ERROR"
    End Select
    Resume EXIT_HERE
End Sub
 
@Alex


Scusa de che? Mi hai aiutato a far andare l'esempio, grazie molte
Ora funziona come atteso, ed e' possibile quindi creare, filtrare, 
ordinare, un recordset in memoria, che poi puo' essere visualizzato 
assegnandolo ai controlli di una form, credo sia una funzionalita' molto 
utile per chi lavora con Access
Quindi assegnare ad una variabile adodb.recordset il valore del 
recordset della form non si puo'
Il contrario si puo'
E' un po' strana la faccenda