Raggruppare record

di il
10 risposte

Raggruppare record

Buongiorno. sono un autodidatta di access e, utilizzando solo le query, sono riuscito a creare cose simpatiche per il mio lavoro. Ora però mi hanno chiesto una cosa che richiede l'accorpamento di campi verticali. ho provato con query a campo incrociato, trasposizione in excell ecc… ma nulla.
sembra che la cosa sia risolvibile solo i moduli e similia.
spiego il problema: ho una tabella dove alla prima colonna ci sta la data, alla seconda il tipo di impiego e/o assenza; alla terza il nominativo, alla quarta il turno previsto.
mi servirebbe una soluzione che mi desse una colonna "data", una con il tipo di impiego e/o servizio, una con turno previsto, e la quarta non con 1 solo nominativo ma con tutti i nominativi che svolgono lo stesso turno, impiego e data.
sono crudo in programmazione.
grazie

10 Risposte

  • Re: Raggruppare record

    Ma la ChiavePrimaria...?
    Sei consapevole che un Database NON è come un foglio di Excel e che la gestione tabelle e campi ha regole specifiche...?
    Se questo ti sfugge... prima di procedere meglio tu riesca a colmare questi dubbi, anche se hai creato cose "simpatiche".
    Quello che chiedi si effettua solo con il codice ma se non lo conosci non sarà semplice.
    Quì trovi un esempio:
    http://allenbrowne.com/func-concat.htm
  • Re: Raggruppare record

    Ho già consultato la pagina ma non sono riuscito ad adattare la formula.
    es. da una tabella "data" "turno" "attività" "nominativo"
    05/09/2020 08/14 consulenza tizio
    05/09/2020 08/14 consulenza caio
    05/09/2020 08/14 consulenza sempronio
    mi dovrebbe uscire:
    "data" "turno" "attività" "nominativi"
    05/09/2020 08/14 consulenza tizio, caio, sempronio.

    spero di essere riuscito a spiegarmi.
    grazie
  • Re: Raggruppare record

    La soluzione che ti ha consigliato Alex soddisfa proprio il tuo requisito.
    Quindi indica come hai impiegato la funzione ConcatRelated di Allen Browne.
  • Re: Raggruppare record

    Ho provato scrivendo:
    =ConcatRelated("nominativo", "turni", ("turniID = " & [turni id])e ("turniturno = " & [turniturno]) su una casella di testo e

    SELECT turno, ConcatRelated("nominativo", "tblturni", ("turniID = " & [turni id])e ("turniturno = " & [turniturno])FROM tblturni;
    su una query.

    nulla di fatto
  • Re: Raggruppare record

    ConcatRelated è il nome della Public Function (nel link indicato sta alla fine) che devi creare in un Modulo e adattare ai tuoi nomi campi.
  • Re: Raggruppare record

    romolo70 ha scritto:


    Ho provato scrivendo:
    =ConcatRelated("nominativo", "turni", ("turniID = " & [turni id])e ("turniturno = " & [turniturno]) su una casella di testo e

    SELECT turno, ConcatRelated("nominativo", "tblturni", ("turniID = " & [turni id])e ("turniturno = " & [turniturno])FROM tblturni;
    su una query.

    nulla di fatto
    Questa cosa sarebbe
    
    ("turniID = " & [turni id])e ("turniturno = " & [turniturno])
    mi riferisco in particolare alla [e]... e le virgolette... mmm secondo me...

    Se non adoperi una struttura con Chiavi ed Indici ben pensata questa cosa che fai oltre ad essere lentissima, francamente è megliop farla in Excel.
  • Re: Raggruppare record

    In pratica in tutti i record dove Id e turno sono uguali mi deve raggruppare i nominativi.
  • Re: Raggruppare record

    Prova così (procedura per piccoli passi):
    1. Crea una nuova "query ricerca duplicati" dove trascini solo i campi id e turno e su di essi cerchi i duplicati (c'è la procedura guidata): Query1.
    2. Apri Query1 in visualizzazione struttura e noterai un campo dove c'è scritto >1. Cancella >1.
    3. Crea una nuova query dove importi Query1 e TuaTabella.
    4. Unisci con 2 linee di join i campi id e turno.
    5. Applica poi la funzione di Allen Browne sui restanti campi.
  • Re: Raggruppare record

    Credo che si possa risolvere scrivendo la seguente query
    
    SELECT turni.data, turni.turno, turni.attività, CreaElencoNominativi([data],[turno],[attività]) AS Nominativo
    FROM turni
    GROUP BY turni.data, turni.turno, turni.attività;
    
    e la seguente funzione pubblica CreaElencoNominativi
    
    Public Function CreaElencoNominativi(datData As Date, strTurno As String, strAttività As String) As String
    Dim rs As DAO.Recordset
    Dim strSql As String
        On Error GoTo Errore
        strSql = "SELECT turni.nominativo FROM turni WHERE turni.data = " & CLng(datData) & " AND turni.turno = """ & strTurno & """ AND turni.attività = """ & strAttività & """"
        Set rs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
        Do While Not rs.EOF
            CreaElencoNominativi = CreaElencoNominativi & ", " & rs!nominativo
            rs.MoveNext
        Loop
        CreaElencoNominativi = mid(CreaElencoNominativi,3)
    ExitErrore:
        Set rs = Nothing
        Exit Function
    
    Errore:
        MsgBox "Errore " & Err.Number & ": " & Err.Description, vbExclamation, "Concatenazione dati"
        Resume ExitErrore
    End Function
    
  • Re: Raggruppare record

    Stifone ha scritto:


    Credo che si possa risolvere scrivendo la seguente query
    
    SELECT turni.data, turni.turno, turni.attività, CreaElencoNominativi([data],[turno],[attività]) AS Nominativo
    FROM turni
    GROUP BY turni.data, turni.turno, turni.attività;
    
    e la seguente funzione pubblica CreaElencoNominativi
    
    Public Function CreaElencoNominativi(datData As Date, strTurno As String, strAttività As String) As String
    Dim rs As DAO.Recordset
    Dim strSql As String
        On Error GoTo Errore
        strSql = "SELECT turni.nominativo FROM turni WHERE turni.data = " & CLng(datData) & " AND turni.turno = """ & strTurno & """ AND turni.attività = """ & strAttività & """"
        Set rs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
        Do While Not rs.EOF
            CreaElencoNominativi = CreaElencoNominativi & ", " & rs!nominativo
            rs.MoveNext
        Loop
        CreaElencoNominativi = mid(CreaElencoNominativi,3)
    ExitErrore:
        Set rs = Nothing
        Exit Function
    
    Errore:
        MsgBox "Errore " & Err.Number & ": " & Err.Description, vbExclamation, "Concatenazione dati"
        Resume ExitErrore
    End Function
    
    funziona!!! grazie mille!!! ora devo solo trovare il modo di ordinarli per "ruolo" ma il risultato è grandioso già ora
Devi accedere o registrarti per scrivere nel forum
10 risposte