Newsgroup: it.comp.appl.access
Titolo: sottrazione parziale

Se interessasse, su quest'argomento, ci sono novità.
(Roberto, avevi proprio ragione).
Infatti, ho scritto ad altri NG, e ho avuto le seguenti risposte che
trasmetto a tutti.
Per esser chiari, riassumo fin dal principio col mio primo messaggio:
"Il mio problema:
- Sono autodidatta e alle primissime armi.
- Ho Access 2000 e Visual Basic 6.0 (Enterprise).
- In Access2000, ho una tabella costituita da alcuni campi contenenti solo
numeri. (Non c'è il contatore).
- Con una query di selezione ho ricavato un campo costituito da numeri
progressivi.
- Esempio a casaccio:
  12
  19
  41
  70
  93
A questo punto, vorrei sottrarre l'ultimo meno il penultimo, il penultimo
meno il terzultimo e così via fino al primo, per ottenere, in un nuovo
campo:
    7
  22
  29
  23
Ora:
Non ho trovato (e mi ci sono consumato gli occhi), un solo manuale - nè di
VB 6.0 e nè di Access2000 - (e non ne ho consultati pochi!), in cui compaia
il benchè minimo esempio, accenno o rimando, a: "somme o sottrazioni
parziali".
Sembra, infatti, che l'argomento sia sconosciuto o, (visto che nemmeno lo si
accenna), che questa possibilità, in questi programmi "estremamente
potenti", semplicemente, non esista.
Quindi, domande:
- Esiste questa possibilità?
- Se esistesse, quali sono i capitoli o i paragrafi o gli argomenti, che mi
dovrei studiare?
Grazie fin da ora.
rudi"
Ecco ora una prima risposta:
Infatti non esiste.
Si deve fare a mano. Con un pò di inventiva si riesce, penso che basti un
ciclo for.
Ora, ecco il seguito:
Penso che una soluzione simile a quella che trovi qui sotto possa andare
bene:
Private Sub Form_Load()
Dim Connessione As ADODB.Connection
Dim Record As ADODB.Recordset
Set Connessione = New ADODB.Connection
Set Record = New ADODB.Recordset
Dim DataSource As String
Dim I, X, Y, Z As Integer
' Nel progetto, come esempio sono state dichiarate due listbox (List1,List2)
' Nella prima vengono elencati gli elementi del recordset (ordinati in
maniera crescente
' Nella seconda listbox viene svolta l'operazione di detrarre dall'ultimo il
penultimo....
' Si suppone che il database abbia una tabella di nome <Dati> e un campo di
nome <Valore>
' Locazione del file sorgente
DataSource = "C:\Stampe\Prova.mdb"
' Impostazione della connessione.
Connessione.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51; Data
Source = " & DataSource
Connessione.CursorLocation = adUseServer
Connessione.Open
'Query di ricerca
SQL = "SELECT * FROM Dati ORDER BY Valore"
'Apertura del recordset
Record.CursorLocation = adUseServer
Record.Open SQL, Connessione, adOpenKeyset, adLockOptimistic
' Se il recordset non è vuoto...
If Record.RecordCount > 0 Then
    ' Stampa tutti gli elementi del Recordset nella prima lista
    Record.MoveFirst
    For I = 1 To Record.RecordCount
        List1.AddItem Record!Valore
        Record.MoveNext
    Next I
    'Mi posiziono alla fine
    Record.MoveLast
    'Inizio il ciclo di calcolo...
    For I = Record.RecordCount To 2 Step -1
        ' questa parte è stata fatta nel modo più lungo per far ben vedere i
passaggi
        ' di richiesta / calcolo, chiaramente si possono usare meno
variabili....
        X = Record!Valore
        Record.MovePrevious
        Y = Record!Valore
        Z = X - Y
        List2.AddItem Z
    Next I
End If
Record.Close
Connessione.Close
End Sub
Ed ecco, ancora, un altra risposta:
Non si può fare, senza un campo progressivo sequenziale, per un semplice
motivo: chi decide quale record è l'ultimo, il penultimo, ecc.., se non hai
un campo in base al quale ordinare???
Access, infatti, come la stragrande maggioranza dei DB moderni, non è
posizionale, ossia non garantisce che un determinato record sia memorizzato
in una determinata posizione. Facendo la query oggi, ti trovi i record in un
certo ordine. Facendo la stessa query domani, se non specifichi
espressamente un Order by, i record potrebbero benissimo arrivare in
tutt'altro ordine (potrebbero, anche se spesso l'ordine è lo stesso perchè
l'ottimizzatore di accesso ai dati lavora sempre nello stesso modo).
Risolvendo questo punto, ossia inserendo un campo contatore progressivo, la
cosa è molto semplice:
Select Valore=T1.Campo_Numerico - ISNULL((Select Top 1 Campo_Numerico From
Tabella as T2 where T2.Campo_Sequenziale<T1.Campo_Sequenziale Order by
T2.Campo_Sequenziale DESC),0.0) From Tabella as T1 Order by
T1.Campo_Sequenziale ASC

 potenti", semplicemente, non esista.
non e' che l'argomento sia sconosciuto. E' risolvibile, via codice, con
una decina di istruzioni e' una semplice questione di logica non credo
che
valga la pena di titolargli un argomento.
Non mi sono letto completamente tutto
quello che hai scritto ma mi sembra decisamente troppo.
Solo una cosa questa:
SQL = "SELECT * FROM Dati ORDER BY Valore"
gia' se si fa cosi'
SQL = "SELECT * FROM Dati ORDER BY Valore desc"
e' meglio o male che vada si legge il recordset risultante
al contrario (se usi la prima oltre al movenext esiste anche il
moveprevious)
--
a.cara