Newsgroup: it.comp.appl.access
Titolo: Recuperare un certo numero di record

E' possibile recuperare tramite query solamente un certo numero di record?
Ad esempio se avessi una tebella con 100 record e volessi fare una query che
mi da solo i  record dall'undicesimo al ventesimo e un'altra che mi recupera
solo quelli dal 21 al 30 e cosi via...
Grazie
Maurizio

, 
coffi...@secoges.com
 says...

sii piu' specifico....
e' possibile farlo, ma la tabella e' ordinata sempre allo stesso modo ?
In base a che campo esattamente devi fare la selezione ?

 In base a che campo esattamente devi fare la selezione ?
Per quel che riguarda l'ordinamento non c'è problema perchè sarà sempre lo
stesso ma il problema è che la selezione non deve dipendere da un certo
valore di campo ma proprio dal numero di riga. Inoltre questo lavoro lo stò
svolgendo in Visual Basic e stò creando una DLL che restituisca solo i
record che stanno in una certa posizione (es. dal 10 al 20) in base ad una
query di selezione passata quindi non posso sapere il nome del campo su cui
fare la selezione.
Ad esempio:
Passo alla DLL 3 parametri:
1) "SELECT * FROM Anagrafiche ORDER BY Cognome"
2) 11
3) 20
Questo indica alla DLL di restituire un recordset contenente i record dal 11
al 20 in base alla SELECT passata.
se poi passo questi nuovo parametri
1) "SELECT * FROM Articoli ORDER BY Descrizione"
2) 51
3) 60
Questo indicherà alla DLL di restituire un recordset contenente i record dal
51 al 60 in base alla SELECT passata.
Il lavoro che fa la DLL non è altro che eseguire la query e restituire i
record nel range indicato.
Io vorrei (se possibile) fare in modo che la DLL esegua una query che
restituisca automaticamente il numero di record richiesti.
Grazie mille
Maurizio

Maurizio Coffinardi ha scritto nel messaggio ...

Premetto che non conosco VB abbastanza ed in particolare non so se con ADO
queste cose siano realizzabili in modo più semplice.
Ho riflettuto un po' sulla tua problematica ed ho tirato giù  questo codice
Access con DAO.
Function rstIntervallo(strSql, nMin, nMax, bFinale As String) As Recordset
Dim i
Set rstIntervallo = DBEngine(0)(0).OpenRecordset(strSql)
If Not rstIntervallo.EOF Then
    rstIntervallo.MoveLast
    rstIntervallo.AbsolutePosition = nMax
    bFinale = rstIntervallo.Bookmark
    rstIntervallo.AbsolutePosition = nMin
End If
End Function
Sub prova()
Dim rst As Recordset, b As String, b1 As String
Set rst = rstIntervallo("Select * from TABELLA1", 10, 20, b)
Do While Not rst.EOF
        b1 = rst.Bookmark
        If b = b1 Then MsgBox "trovato"
        Debug.Print rst(0)
        rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub
E' chiaro che non risponde alla tua esigenza in modo completo perchè
pressupone di controllare nel codice chiamante il bookmark...
Resta il fatto che un oggetto recordset  rappresenta i record di una tabella
base o i record che risultano dall'esecuzione di una query (almeno così
recita l'help di Access).
IMHO le soluzioni alternative (che non ho sperimentato) sono :
- costruire nella dll una tabella tmp e popolarla dai record che ti servono
(semplice)
- costruire una nuova classe stile Recordset per il quale ridefinire la
proprietà EOF  (questo non so se sia possibile farlo comunque ti  riporto un
vecchio mex di Michele Amato che mi sembra faccia una cosa del genere in
Access)
----------
Inizio mex Michele Amato
Io faccio in questo modo:
definisco una classe per il recordset:
nuovo modulo di classe: (esempio clsRetribuzione)
'Inizio Classe clsRetribuzione
Option Compare Database
Option Explicit
Dim mvDbs As Database
Public Function OpenRecordSet(Optional rsWhere As String = vbNullString) As
RecordSet
Dim lsSql As String
On Local Error Resume Next
  lsSql = "SELECT * from RETRIBUZ"
  If rsWhere <> vbNullString Then
    lsSql = lsSql & " where " & rsWhere
  End If
  Set OpenRecordSet = mvDbs.OpenRecordSet(lsSql)
  If Err.Number <> 0 Then
    On Error GoTo 0
    If Errors.Count > 0 Then
      Err.Raise 12321, "clsRetribuzione.OpenRecordSet", "Errore DAO: " &
Errors(0).Number & vbNewLine & "Descrizione: " & Errors(0).Description &
vbNewLine & "SQL: " & lsSql
    Else
      Err.Raise 12321, "clsRetribuzione.OpenRecordSet", "Errore DAO: " &
Err.Number & vbNewLine & "Descrizione: " & Err.Description & vbNewLine &
"SQL: " & lsSql
    End If
  End If
End Function
Private Sub Class_Initialize()
  Set mvDbs = CurrentDb
End Sub
Private Sub Class_Terminate()
  mvDbs.Close
  Set mvDbs = Nothing
End Sub
'Fine Classe clsRetribuzione
Poi nel modulo di classe associato al report definisco una variabile di
modulo di tipo clsRetribuzione
Dim moRetribuzione As New clsRetribuzione
(a livello modulo)
e nella routine evento Report_Open...
Private Sub Report_Open(Cancel As Integer)
  Me.RecordSource = 
moRetribuzione.OpenRecordSet.Name
End Sub
Fine mex Michele Amato
---------------------------------
Non so se l'ho fatta più complicata del necessario... :-)
Ciao Nicola
email: metti inwind al posto  di NOSPAM
Le richieste che arrivano
in privato  vengono cestinate.
Sito Comune
http://www.sitocomune.com
----------------------------------