Newsgroup: it.comp.appl.access
Titolo: numerare record a gruppi in una query

Ho una query che mi restituisce i seguenti record
ID     campo1
1      A
1      B
1      C
2      A
2      B
3      D
ecc.
Vorrei creare un ulteriore "campo 2" che conti, partendo da 1, i valori
del "campo 1" in base all' ID cioč cosě:
ID     campo1     campo2
1      A           1
1      B           2
1      C           3
2      A           1
2      B           2
3      D           1
Come posso fare ?
Grazie mille 
Antonio
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Come posso fare ?
Ti serve per forza in una query o poi devi fare un report?
Antonio

 ha scritto nel
messaggio news:c2ece80fd6a56913a9a...@mygate.mailgate.org...

Dipende a quale scopo devi destinare la query
Se mi spieghi a cosa ti serve troviamo la soluzione
Ciao

 ha scritto nel
messaggio news:c2ece80fd6a56913a9a...@mygate.mailgate.org...

Ciao Antonio
Basta contare in una subquery quanti record ci sono per lo stesso Id e per
Campo1<=Campo1
--------------------------
SELECT
    Id,
   Campo1 ,
   (Select
         COUNT(1)
    FROM
         Tabella AS T1
   WHERE
        T1.Id=Tabella.Id AND
        T1.Campo1<=Tabella.Campo1
   ) AS Campo2
FROM
    Tabella
ORDER BY
    Id,Campo1
-------------------------
Ciao Giorgio

 Ciao Giorgio
Non ci devo creare un report.
Il valore del conteggio sul "campo2" mi serve solo per creare una terza
chiave poichč devo poi
accodare i dati ad una tabella con 3 chiavi primarie.
Cioč devo ottenere:
ID   campo1    campo2
1      A         1
1      A         2
1      B         3
2      A         1
2      A         2
2      B         3
2      B         4
2      B         5
La soluzione di giorgio mi restituisce invece
ID   campo1    campo2
1      A         2
1      A         2
1      B         1
2      A         2
2      A         2
2      B         3
2      B         3
2      B         3
Spero di essere stato piů chiaro, grazie


 ha scritto nel
messaggio news:9cb2ae7e0e4f46ccf9b...@mygate.mailgate.org...

Ciao Antonio
Se provi la mia soluzione con i dati che hai postato in origine ti
accorgerai che funziona perfettamente.
Con i nuovo dati che hai postato non č possibile ottenere (con una query)
ciň che richiedi a meno di non avere un campo contatore per i record.
ID_Rec  ID   campo1    campo2
1             1      A         2
2             1      A         2
3             1      B         1
4             2      A         2
5             2      A         2
6             2      B         3
7             2      B         3
8             2      B         3
Ciao Giorgio.

 Ciao Giorgio.
Sě, forse avevo sbagliato il primo messaggio ! Il problema č che il
contatore non deve contare tutti
i record di seguito, ma raggruppandoli per ID, cioč quando cambia l'ID
deve iniziare nuovamente da 1.
Quindi non c'č soluzione ?
Grazie


 ha scritto nel
messaggio news:fa0168c35c769c7376a...@mygate.mailgate.org...

Vedo che i miei suggerimenti non vengono sempre accolti.
Se la query ti serve per un report la soluzione č piů semplice.
Se ti serve per una maschera č un'altra storia.
Se ti server per altre ragioni....
facci sapere altrimenti metti in moto complicazioni inutili
Ciao

 Ciao
Scusami ma l'avevo scritto nel messaggio precedente (scrivo dalle pagine
di mailgate e quindi devo fare dei cut sui messaggi altrimenti non me li
spedisce).
Come dicevo prima il tutto mi serve non in un report (che sarebbe la
cosa più semplice)
Mi serve in una query. Creare il famoso "campo2" mi permette infatti do
ottemere la chiave per accodare poi i dati in una tabella successiva Che
ha 3 chiavi primarie,
ID, Campo1 e campo2). logicamente se non creo il campo2 non posso
accodare i dati per violazione di chiave.
Ripeto che il campo2 dovrebbe contare i record per ogni ID e ripartire
da 1 ogni volta
cioè
ID   campo1    Canpo2
1     A          1
1     A          2
1     A          3
1     B          4
2     A          1
2     A          2
2     B          3


 Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG
Ciao Antonio
Vediamo di capirci ...
Tu hai una tabella o una query che rende il seguente recordset
-----------------
ID   campo1
 1      A
 1      A
 1      B
 2      A
 2      A
 2      B
 2      B
 2      B
 3     A
---------------
Vorresti ottenere questo risultato
-----------------
ID   campo1   Campo2
 1      A                1
 1      A                2
 1      B                3
 2      A                1
 2      A                2
 2      B                3
 2      B                4
 2      B                5
 3      A               1
---------------
Per risolvere la query è necessario avere un campo (tipo contatore vedi
struttura tabella) che identifica in modo univoco i record della tabella o
query di origine, se non hai questo campo tieni presente che basta
aggiungerlo alla tabella di origine.
Esempio di tabella o query di origine con campo ID_Record che identifica in
modo univoco un record. Normalmente in fase di progettazione del database si
utilizza sempre un campo di questo tipo.
-----------------
ID_Record    ID   campo1
 1250             1      A
 125               1      A
 256               1      B
 787               2      A
 989               2      A
1280              2      B
126                2      B
2541              2      B
367                3      A
---------------
A questo punto è possibile risolvere il tuo problema in altro caso devi
ricorrere a VBA .
Ciao Giorgio.

 ha scritto nel
messaggio news:5481c6514be50398e56...@mygate.mailgate.org...

Proviamo con i recordset (ADO)?
Private Sub Numerazione()
On Error Goto Err_Handler
Dim rst As ADODB.Recordset
Dim lngCount As long
    set rst = new ADODB.Recordset
    'la tabella tblMy deve avere il Campo2 impostato a long
    rst.Open _
        "tblMy", _
        CurrentProject.Connection, _
        adOpenKeyset, _
        adLockOptimistic, _
        adCmdTableDirect
    rst.Sort "ID Asc, Campo1 Asc"
    lngCount = 0
    lngPreviousID = -1 'impostato a un campo minore del più piccolo ID della
tabella
    with rst
       while not .EOF
            if lngPreviousID <> .Fields("ID") then lngCount = 0
            lngCount = lngCount + 1
            .Fields("Campo2") = lngCount
            .Update
            lngPreviousID = .Fields("ID)
            .MoveNext
        wend
    end with
Exit_Sub:
    On error Resume Next
    rst.Close
    set rst = Noting
    exit sub
Err_Handler:
    MsgBox "Sono cavoli amari:" & err.description
    resume Exit_Sub
Ok?
Ciao.
Daniele

 ricorrere a VBA .
Scusate per la confusione dei messaggi precedenti.
Ok, ora ci siamo! Il recordset era da query quindi ho creato una tabella
da questo recordset e ci ho aggiunto
un campo contatore come dicevi tu. Fin qi tutto ok. Come potrei poi
procedere ?


 
Ho risolto sommando IDREC+1000 poi con una query trovo il valore minimo
per ogni ID
creao un altro campo e calcolo la differenza tra il minimo + 1 e IDREC !
Ho dovuto creare
delle tabelle perchè con le query non mi riusciva l'aggiornamento ma
alla fine ce l'ho fatta!!!!!
Grazie a tutti 


 Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG
Hai pensato a cosa ti succederebbe se ID non č sequenziale senza soluzioni
di continuitą?
Daniele

 Antonio
Se la tabella che contiene i dati si chiama Tabella e contiene i campi ID e
campo1.
Nel modulo del tuo database registra quanto segue:
Option Compare Database
Option Explicit
Public rval As Integer
Public Pippo As String
Public Function Progressione(Valore As String) As Integer
If Valore = "Azzera" Or Pippo <> Valore Then
    rval = 0
Else
    rval = rval + 1
End If
Pippo = Valore
Progressione = rval
End Function
quindi creati una query che abbia il seguente codice SQL:
SELECT ID, campo1, Progressione((ID)) + 1 AS campo2
FROM Tabella
WHERE (((Progressione("Azzera"))=0))
ORDER BY ID, campo1;
Questa soluzione č una versione riveduta e corretta di ciň che trovi sul
Sito Comune (link qui sotto), nella Sezione General, nella FAQ di Stefano
Bettini intitolata "Come posso inserire nella mia query un campo
progressivo?"; per maggiori ragguagli sul funzionamento di quanto sopra, fai
riferimento a tale FAQ.
-- 
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------