Newsgroup: it.comp.appl.access
Titolo: record successivi non contigui

In una tabella desiderei poter trovare se dei valori sono presenti in record 
successivi non contigui.
La tabella ha
ID, campodata, campotesto, campo1, campo2, campo3, campo4, campo5
 1 01/01/06 aaa 1 2 3 4 10
2 01/01/06 bbb 1 2 3 4 5
....
12 03/01/06 aaa 10 4 7 1 2
13 03/01/06 ccc 7 8 9 3 4
....
16 05/01/06 aaa 4 3 10 2 6
....
26 07/01/06 aaa 2 8 7 6 9
1) in una casella di testo digito i numeri da cercare e cerco nella tabella 
se sono presenti
aaa numero 1 è presente nel record 1 12
2) data una coppia di numeri di record diversi ma con data successiva 
trovare se sono presenti in coppie di record successive
10 del record 1 e 7 del record 3 presente in 16 26
Il tutto sarebbe simile a:        fatto su un solo campo e record contigui.
Dim strSql As String
strSql = "SELECT * " & _
" FROM tblTabella AS A " & _
" WHERE 1=1"
If Not IsNull(Me!txtText70) And Not IsNull(Me!txtText90) Then
strSql = strSql & _
" AND Campo1=" & Me!txtText70 & _
" AND (SELECT Campo1 FROM tblTabella WHERE IDTabella=A.IDTabella+1 AND 
CampoTesto= [Forms]![StatisticheTabella]![cboCombo70])=" & Me!txtText90 & _
" OR Campo1=" & Me!txtText90 & _
" AND (SELECT Campo1 FROM tblTabella WHERE IDTabella=A.IDTabella-1 AND 
CampoTesto= [Forms]![StatisticheTabella]![cboCombo70])=" & Me!txtText70
End If
-------
If Not IsNull(Me!txtText70) And Not IsNull(Me!txtText90) Then
strSql = strSql & _
" AND Campo1 In(" & Me!txtText70 & "," & Me!txtText90 & ")" & _
" AND ((SELECT Campo1 FROM tblTabella WHERE IDTabella=A.IDTabella-1 AND 
CampoTesto= [Forms]![StatisticheTabella]![cboCombo70] )=Campo1" & _
    " OR (SELECT Campo1 FROM tblTabella WHERE IDTabella=A.IDTabella+1 AND 
CampoTesto= [Forms]![StatisticheTabella]![cboCombo70])=Campo1)"
End If
grazie

 trovare se sono presenti in coppie di record successive
Ri-azz.
Stavolta anche con ADO diventa una cosa complessa da gestire.
Ma che per caso vuoi arrivare ad utilizzare Access come se fosse un ipercubo? 
 :-)
--
PBsoft di Gabriele Bertolucci
www.pbsoft.it
skype: pbsoftsolution


ciao
PS conteneva un errore:
-------
If Not IsNull(Me!txtText90) Then
strSql = strSql & _
" AND Campo1 In(" & Me!txtText90 & ")" & _


 ha scritto nel messaggio 
news:451eda9d$0$25882$4faf...@reader1.news.tin.it...

Sicuramente Gabriele dice bene che con ADO (o anche con DAO) la cosa è risolvibilissima.....è che 
devi scrivere e collaudare parecchio VBA
Michele 

> Senza una traccia  difficile che possa proseguire.
Hai ragione. Scusami.
Puoi consultare il modello ad oggetti esposto da ADO all'indirizzo 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmscadoobjmod.asp
.
Puoi trovare una marea di codice VBA che sfrutta i recordset di ADO all'indirizzo 
http://groups.google.com/groups/search?hl=en&lr=&q=ado+recordset+vba
.


"PBsoft" <in...@REMOVEpbsoft.it> ha scritto nel messaggio 
news:875ea35543dad8...@news.tin.it...

Scusa Gabriele, una domanda: siccome vedo che sei un personagio molto attivo nel NG, nel senso che 
hai sempre un consiglio per tutti, questo fatto che consigli solo ADO è perchè personalmente hai 
deciso di abbandonare DAO in quanto ormai datato e lasciato al suo destino da Microsoft?
Michele 

 Microsoft?
Molto più semplicemente, io non ho mai utilizzato il modello ad oggetti DAO.
Diversi anni fa, insieme ad altre persone, ho creato un database di libreria 
con Access ed abbiamo scelto di adottare ADO piuttosto che DAO per le routine 
da sviluppare.
Questo alla luce soprattutto del fatto che la libreria in questione avrebbe 
dovuto funzionare anche con gli ADP, dove DAO non è utilizzabile.
Venendo poi alla tua affermazione sull'abbandono di DAO, posso comunque dirti 
che esso rimane, a mio parere, la libreria di accesso ai dati più performante 
per il motore Jet.
Certo, Microsoft ha scelto la via di ADO, ADOCE, 
ADO.NET
 e non credo proprio 
che torneranno sui loro passi.


 skype: pbsoftsolution
Io invece ho sviluppato tutto il mio db con DAO, che in effetti devo dire è molto performante.... 
quasi ogni limite di gestione dati fornito dagli oggetti di Access, in una maniera o nel'altra l'ho 
risolto con DAO. Inoltre ho preferito sviluppare con DAO anche le operazioni che potevano essere 
risolte con query....diciamo che ho preferito concentrare gli sforzi e l'apprendimento su questo 
strumento.
Siccome il manuale che ho studiato illustra sia DAO che ADO, alla lettura del concetto "se state 
costruendo da zero un db valutate attentamente l'utilizzo di ADO in quanto Microsoft sta spingendo 
in questa direzione", ho provato anche ad utilizzare ADO, con successo, fino al punto di dover 
aprire un recordset con query di selezione, dove la clausola WHERE conteneva un criterio abbastanza 
pesante, costrutito da vari AND OR e NOT.
Ho provato a scrivere la clausola in mille salse, utilizzando il teorema di De Morgan e tutto quello 
che mi veniva in mente.... Risultato? Non c'è stato verso di aprire il recordset. Siccome non 
conoscevo ancora il NG e MSDN library, da una ricerca in internet ho trovato uno stralcio di un NG 
straniero, dove un personaggio affermava che in effetti la digestione da parte di ADO di criteri 
complessi, generava errore, e niente si poteva fare. Adesso non ricordo che errore, ma fattostà che 
sono tornato a DAO e tuttora lavoro con DAO.
Il fatto di aprire un recordset con enunciato SQL con clausola WHERE, oppure di aprire il recordset 
e di applicare poi su di esso il filtro, portava allo stesso risultato.
Ti riporto l'help di msdn per adodb.recordset a proposito del filter, in effetti dei limiti ci sono:
------------------------------------------------------------------------------------------
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/his_2004main/htm/_sna_filter_property_oledb.asp
------------------------------------------------------------------------------------------
.......
An example of illegal Criteria is:
  a.. recordset.Filter = "(Title='Associate' OR Salary >30000) AND (Title='Administrator')"
......
-----------------------------------------------------------------------------
Tu cosa ne pensi a riguardo? E' una cosa che da Microsoft è stata risolta, oppure è tuttora una 
limitazione?
Michele

 Sempre che Giorgio non mi sgridi, credo che in Jet SQL questo non sia
possibile.
non saprei, manca un esempio dei risultati che si vuole ottenere, con la
sola spiegazione non ho capito il problema :(
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

 che torneranno sui loro passi.
sě che sono tornati sui loro passi, il nuovo Access2007 ha come libreria
predefinita il nuovo DAO ovvero ACEDAO
:-)


 limitazione?
facciamo un esempio con un filtro meno assurdo
----
(City='Milano' OR Salary >30000) AND (Title='Administrator')
----
se apri il recordset passando il filtro nella clausola Where della query
tutto funziona, ci mancherebbe altro :-)
----
Dim Rs As New ADODB.Recordset
Rs.Open "Select * From FindTest WHERE (City='Milano' OR Salary >30000) AND
(Title='Administrator')", CurrentProject.Connection
----
se applichi il filtro alla proprietà Filter del recordset allora da errore
----
Dim Rs As New ADODB.Recordset
Rs.Open "Select * From FindTest", CurrentProject.Connection
Rs.Filter = "(City='Milano' OR Salary >30000) AND (Title='Administrator')"
----
il perchè dell'errore non lo so, probabilmente è un bug che puoi risolvere
sviluppando la moltiplicazione (A+B)*C presente nel filtro ovvero A*C+B*C
ovvero
----
Dim Rs As New ADODB.Recordset
Rs.Open "Select * From FindTest", CurrentProject.Connection
Rs.Filter = "(City='Milano' AND Title='Administrator') OR (Salary>30000 AND
Title='Administrator')"
----
così funziona
Ciao


 > limitazione?
ho trovato una Kb che parla del problema
----
PRB: Mixing "And" and "Or" Criteria in the Same Filter Returns a 3001 Error
Message
http://support.microsoft.com/kb/280811/en-us
----
in fondo c'è scritto
----
STATUS
This behavior is by design.
----
questo fa supporre che il comportamento rimarrà tale e quale, infatti
l'ultima revisione dell'articolo è stata fatta il 23/08/2001, da allora sono
usciti diversi aggiornamenti e nuove versioni ma nulla è stato fatto in
proposito.
:-)



Che dire Giorgio, io quella volta, prima di abbandonare ADO per questo problema, avevo provato ad 
inserire il filtro nell'enunciato SQL e non mi funzionava. Ovviamente non si parla di criterio 
blando, bensì una cosa molto articolata con date, ID, clienti, ecc... Non sono riuscito ad uscirne 
lo stesso.
Avevo detto "Vabbè, il filter del recordset non funziona, prepariamo l'SQL con la clausola WHERE a 
mano, così almeno funzionerà..... "e invece niente e ho abbandonato ADO.
Sono contento che il 2007 riprende DAO, almeno i db di tutti avranno un futuro senza tanti problemi.
Una curiosità: ma con ACEDAO viene supportato il blocco a livello di record o come con DAO3.6 viene 
bloccato non solo il record in questione ma anche quelli vicini?
C'è un topic discusso da me e da Sandrobi a proposito di questo. Da una prova fatta da me, DAO 3.6 
non supporta il blocco a livello di record, mentre ADODB sì.
Michele 

 non supporta il blocco a livello di record, mentre ADODB sì.
non ho visto la vostra discussione, forse aprite il database da una sessione
esterna a quella di Access ?
Come puoi vedere nel capitolo Record-level locking di questa Kb, il blocco a
livello di record è valido anche per DAO purchè venga utilizzato dentro una
sessione di Access che abbia abilitata l'opzione.
----
Description of the new features that are included in Microsoft Jet 4.0
http://support.microsoft.com/kb/275561/en-us
----
stiamo andando troppo fuori tema, forse è meglio aprire un nuovo 3d. :-)
Ciao


 Ciao
ciao
