Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [Access2010] Creare un id univoco dalla Query

    Buondì,
    come da oggetto, sto cercando tramite query senza utilizzare funzioni in vba o tabelle di passaggio di creare un campo indice in modo da targare ogni record con un numero univoco.

    Qualcuno sa se esiste una funzione interna apposita o conoscete un trucchetto per avere il risultato?

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Se ho capito bene non ti servono le query

    ____________________________________________

    Vai nella struttura tabela
    Aggiungi un campo tipo dati "Numerazione Automatica"
    salva

    _______________________________________________
    _______________________________________________
    _______________________________________________


    Se invece lo vuoicreare da query allora spiegaci
    meglio quello che vuoi ottenere


    .

  3. #3
    si questo se uso una tabella.
    Sto invece cercando un modo di ottenere lo stesso effetto in una query.

    parto da una tabella con 1000 record filtrando i dati tramite query ne ricavo 300

    il risultato da ottenere sarebbe la numerazione automatica (nuova) di query 300 record

    Al momento lo faccio in vba ma è stralento, in alternativa ci sarebbe un trucco usando una tabella temporanea e una query di accoda ma per azzerare il conteggio in modo che riparta da zero ogni volta che scrivo nella tabella devo svuotarla e poi compattare il db.. è un po' scomodo..

    Se esistesse una funzione che faccia anche una semplice somma cumulata di un campo sarebbe il top

  4. #4
    Ho pensato a una soluzione per non compattare il db quando accodo nella tabella:

    Tabella:
    campo1(numerazione automatica) - campo2 - campo3 ecc (quelli usati nella query)

    - Scrivo sulla tabella i record della query

    - Con una seconda query leggo il primo record del campo1 dalla tabella, lo chiamo "PrimoID"
    (ottengo ad esempio 356 "dico 356 perchè se svuoto la tabella e riaccodo i dati l'id incrementa da dove era arrivato a meno che non si compatti il db)

    - Terza query riprendo la tabella e tiro dentro anche la seconda e dato che ho 1 campo con 1 solo valore calcolo l'indice così:

    Campo1 - PrimoID + 1

    quindi a numeri esce:
    record1: 356 - 356 + 1 = 1
    record2: 357 - 356 + 1 = 2 e così via..

    Da quello che so Access lavora SEMPRE a livello di record, probabilmente la funzione che chiedo non esiste..

  5. #5
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Nel primo post parlavi di
    "in modo da targare ogni record con un numero univoco"

    invece mi sa che ti occorre solo una numerazione progressiva di
    un insieme di record filtrato.

    Il numero che metti ti cambia chiaramente se cambia il filtro o i dati
    quindi non è una vera targa


    __________________________________________________ ______

    Comunque vedi se questa soluzione ti puo andare bene,
    Senza VBA, tabelle temporanee, compattazioni o altro.



    Creiamo una tabella chiamata "Citta" (senza accento)
    con questi campi:
    CiId ____________ Numerazione Automatica ___ Key
    CiNome ________ Testo
    CiAbitanti ________ Numerico

    __________________________________________________ ________


    Crea una vista chiamata "CitFilt"
    dove ci metti il tuo filtro
    ( per esempio sul numero degli abitanti )
    codice:
    SELECT 
        Citta.CiId, Citta.CiNome, Citta.CiAbitanti
    FROM 
        Citta
    WHERE 
        (((Citta.CiAbitanti)>[Con piu Abitanti di]))
    ;
    __________________________________________________ ______

    Sulla vista appena creata crei una successiva vista
    ( chiamala come vuoi ) che ti numera i record
    codice:
    SELECT 
        C1.CiId, C1.CiNome, C1.CiAbitanti, Count(C2.CiId) AS Cont
    FROM 
        CitFilt AS C1 
    INNER JOIN 
        CitFilt AS C2 
    ON 
        C1.CiId >= C2.CiId
    GROUP BY 
        C1.CiId, C1.CiNome, C1.CiAbitanti
    ;

    __________________________________________________ __________
    __________________________________________________ __________
    __________________________________________________ __________


    se invece preferisci una unica vista ( ma lo SCONSIGLIO )
    in quanto meno gestibile e forse anche piu lenta
    codice:
    SELECT 
        C1.CiId, C1.CiNome, C1.CiAbitanti, Count(C2.CiId) AS Cont
    FROM 
                (
                SELECT 
                    Citta.CiId, Citta.CiNome, Citta.CiAbitanti 
                FROM 
                    Citta 
                WHERE 
                    (((Citta.CiAbitanti)>[Con piu Abitanti di]))
                )  AS C1 
    INNER JOIN 
                (
                SELECT 
                    Citta.CiId, Citta.CiNome, Citta.CiAbitanti 
                FROM 
                    Citta 
                WHERE 
                    (((Citta.CiAbitanti)>[Con piu Abitanti di]))
                )  AS C2 
    ON 
        C1.CiId >= C2.CiId
    GROUP BY 
        C1.CiId, C1.CiNome, C1.CiAbitanti
    ;

    NB: se la vuoi rendere piu comprensibile
    dove ho messo "C1.CiId >= C2.CiId" sostituisci "C1.CiId = C2.CiId"


    Facci sapere



    .

  6. #6
    Ciao nman, grazie per il tempo e la proposta che hai pubblicato!
    Appena riesco la provo e riporto un fdbk..
    Nel frattempo posto un paio di soluzioni anche io.

    1 Tramite query, niente tabelle di passaggio niente vba
    2 Con VBA, una funzione semplicissima

    ****************************
    Campo1: Mettiamo il campo da indicizzare, ipotiziamo che si chiami C1 e deriva dalla Tab1

    Campo2 calcoliamo il ranking con la seguente formula:
    Ranking: (Select Count (*) from Tab1 Where [C1] < [emp_Tab1].[C1]+1;)

    emp_Tab1 è il nome della tabella che ho inserito nella query xò per poter fare questo tipo di espressione gli assegno un alias tramite le proprietà

    Il risultato sarà questo:

    Valori di C1:

    Prova
    pippo
    pippo
    Pluto
    Nonno

    Risultato:

    Prova 1
    pippo 2
    pippo 2
    pluto 3
    nonno 4

    Se volete una sequenza unica raggruppate il campo con una query precedente al ranking..

    Questo sistema però è lento! più del VBA perchè esegue una query per ogni record letto...
    Se leggete da una query che fa già diversi calcoli fate notte..

    Questa invece la funzione VBA per calcolare il ranking
    Applicate questo metodo solo se devete farlo su una base dati non superiore ai 32k di record perchè il VBA non va oltre.. :( va in overflow...

    codice:
    Option Compare Database
    
    Public Indicizza As Integer
    
    Function Conteggia(testo As String)
        Indicizza = Indicizza + 1
        Conteggia = Indicizza
    End Function

  7. #7
    Ho provato l'sql che hai pubblicato e funziona, è faxsimile al primo esempio che ho riportato nel topic sopra, il problema è che è più lento del vba (ho fatto un test su 100.000 record e dopo 30 min stava ancora rollando) purtroppo le query a campi incrociati sono lente

    Penso che alla fine la soluzione più rapida se si devono interrogare molte righe sia quella della tabella di passaggio.

    Se invece le righe son poche la tua soluzione è di certo la migliore.

    Grazie mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.