Newsgroup: it.comp.appl.access
Titolo: Condizioni su query

Provo a spiegarmi con un esempio
Ho una query1 del tipo:
data                    nome                condizione
01/01/2001        a                            vero
02/01/2001        a                            vero
03/01/2001        a                            vero
04/01/2001        a                            falso
05/01/2001        a                            vero
06/01/2001        a                            falso
01/01/2001        b                            vero
02/01/2001        b                            vero
03/01/2001        b                            falso
04/01/2001        b                            falso
05/01/2001        b                            vero
06/01/2001        b                            falso
vorrei ottenere una query2 del tipo:
data                    nome                condizione 
cambiamento
01/01/2001        a                            vero
02/01/2001        a                            vero
03/01/2001        a                            vero
04/01/2001        a                            falso 
cambio
05/01/2001        a                            vero 
cambio
06/01/2001        a                            falso 
cambio
01/01/2001        b                            vero
02/01/2001        b                            vero
03/01/2001        b                            falso 
cambio
04/01/2001        b                            falso
05/01/2001        b                            vero 
cambio
06/01/2001        b                            falso 
cambio
Ringrazio in anticipo chi vorrà aiutarmi.
Ps: Uso access 2000 , spero di essermi spiegato. 

 ha scritto nel messaggio 
news:45942f5a$0$19100$4faf...@reader4.news.tin.it...

Se quello che vuoi ottenere è la scritta "cambio" nel caso in cui il record 
precedente ha lo stesso nome ma una condizione diversa, se la tabella che 
contiene i dati si chiama Tabella1 ed ha la seguente struttura:
ID                        Contatore e chiave primaria
MiaData             Data/ora
MioNome           Testo
Condizione         Si/no
Inserisci in un modulo del tuo database la segunte funzione:
Function PrevRecVal(KeyName As String, KeyValue, FieldNameToGet As String, 
QryName As String)
   Dim RS As DAO.Recordset
   Dim db As DAO.Database
   On Error GoTo Err_PrevRecVal
   PrevRecVal = 0
   Set db = CurrentDb().
   Set RS = db.OpenRecordset(QryName, dbOpenDynaset)
   'Ricerca il record corrente.
   Select Case RS.Fields(KeyName).Type
      ' Cerca usando una chiave primaria di tipo Numerico?
      Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
           DB_DOUBLE, DB_BYTE
         RS.FindFirst "[" & KeyName & "] = " & KeyValue
      ' Cerca usando una chiave primaria di tipo Data/ora?
      Case DB_DATE
         RS.FindFirst "[" & KeyName & "] = #" & Format(KeyValue, 
"mm/dd/yyyy") & "#"
      ' Cerca usando una chiave primaria di tipo Testo?
      Case DB_TEXT
         RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
      Case Else
         MsgBox "ERRORE: Tipo dati della chiave primaria non valido!"
         Exit Function
   End Select
   ' Vai al record precedente.
   RS.MovePrevious
   ' Prepara il risultato.
   PrevRecVal = RS(FieldNameToGet)
   RS.Close
    Set RS = Nothing
Bye_PrevRecVal:
    Exit Function
Err_PrevRecVal:
    Resume Bye_PrevRecVal
End Function
Quindi crea una query chiamata Query1 e che abbia il seguente codice SQL:
SELECT Tabella1.ID, Tabella1.MiaData, Tabella1.MioNome, Tabella1.Condizione, 
IIf(PrevRecVal("ID", [ID], "MioNome", "Query1") = [MioNome], 
IIf(PrevRecVal("ID", [ID], "Condizione", "Query1") <> [Condizione], 
"cambio", Null), Null) AS Cambiamento
FROM Tabella1
ORDER BY Tabella1.MioNome, Tabella1.MiaData;
Naturalmente se la query non si chiama Query1 è necessario modificare il 
codice SQL di cui sopra relativamente al nome della query indicata nei due 
richiami della funzione PrevRecVal.
Fai attenzione: la funzione di cui sopra fa riferimento alla libreria 
Microsoft DAO quindi, se usi una versione di Access successiva ad Access 97, 
è necessario che tu aggiunga Microsoft DAO 3.6 Object Library ai riferimenti 
del tuo database.
-- 
Roberto
-----------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
-----------------------------------------------


[CUT]
Per evitare un errore causato da un brutale copia/incolla del codice VBA 
sostituisci le prime due righe della funzione con queste due righe di codice 
VBA:
Function PrevRecVal(KeyName As String, KeyValue, FieldNameToGet As String, _
QryName As String)
Alla fine della prima riga ho aggiunto un underscore per evidenziare che la 
riga di codice VBA continua in quella seguente.
[CUT]



Ti ringrazio dell'aiuto, ma ho un problema, i dati provengono da una query e 
non ha un ID contatore, i campi univoci della query sono DATA e NOME,
si può adattare la tua soluzione?
Grazie in anticipo se puoi aiutarmi.


 Ps: Uso access 2000 , spero di essermi spiegato.
Ciao matafra,
praticamente č la stessa query che hai chiesto nel 3d "calcolare % su Query"
----
SELECT a.Data, a.nome, a.Condizione,
Iif(a.Condizione<>
    Nz((SELECT TOP 1 Cint(b.Condizione)
        FROM Query1 AS b
        WHERE b.nome = a.nome And b.Data < a.Data
        ORDER BY b.Data DESC),A.Condizione
        ),"Cambio",""
      ) AS Variato
FROM Query1 AS a
ORDER BY a.Nome,A.Data
----
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

 Grazie
Prego


 Grazie in anticipo se puoi aiutarmi.
Prego


 ha scritto nel 
messaggio news:45962f25$0$7744$5fc...@news.tiscali.it...

Scusami ma anche questa soluzione, come quella proposta da Roberto, non mi 
funziona,in tutte e due i casi non da nessun messaggio di errore,ma si 
blocca "Access",devo resettare il tutto.Provo a postare la natura dei campi:
La query MediaMobile è così composta
Id campo contatore e chiave primaria proveniente da query1
Nome, campo testo  proveniente da query1
Data,   campo data   proveniente da quey1
Chiusura, campo numerico proveniente da query1
Mediamobile14  campo numerico proveniente da query1
Condizione è una espressione del tipo  condizione: 
IIf([mediamobile14]>[Query1].[chiusura];"giu";"su")
Sicuramente data la mia scarsa conoscensa di access sto sbagliando qualcosa.
Se gentilmente avete una soluzione ve ne sarei grato.
Grazie

 Grazie
Ciao matafra,
Access non si blocca, il fatto č l'elaborazione richiede molto tempo, i dati
derivano da query fatte su query che richiedono molte risorse di calcolo.
Quindi: Consolida il risultato ottenuto da Query1 in una tabella temporanea,
(ad esempio con una query di accodamento o di creazione tabella) e poi metti
la tabella appena salvato come origine record della query suggerita in
precedenza.
----
SELECT a.Data, a.nome, a.Condizione,
Iif(a.Condizione<>
    Nz((SELECT TOP 1 b.Condizione
        FROM TabellaTMPAS b
        WHERE b.nome = a.nome And b.Data < a.Data
        ORDER BY b.Data DESC),A.Condizione
        ),"Cambio",""
      ) AS Variato
FROM TabellaTMP AS a
ORDER BY a.Nome,A.Data
----
Ciao


 -- 
Ho fatto come mi hai consigliato,adesso funziona.
Grazie
Ciao