+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Concatenazione nei risultati di una query

  1. #1
    paoloet non è in linea Novello
    Post
    42

    Concatenazione nei risultati di una query

    Ciao a tutti

    premetto di aver cercato un po in giro ma ho un sacco di confusione
    provo a spiegare

    ho un db con una query che mi restituisce una sola colonna con tutti i record filtrati
    es.

    Paolo
    Antonio
    Mario


    Vorrei visualizzare il risultato in una casella di testo come in cui ogni record è separato da virgola

    es:
    Paolo, Antonio, Mario

    Mi date qualche dritta!!!??
    Che funzione stringa posso usare? è meglio usare un array? posso usare il "CONCAT"

    Grazie
    Ultima modifica di AntonioG; 16-04-2019 07:28 

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    15,997
    Per fare quello che hai chiesto serve scrivere codice, nessuna scorciatoia fantasiosa o inventata.
    Apri il recordset sulla query e lo cicli creando una stringa per concatenazione all'interno del ciclo.
    Quando esci la stringa finale contiene quello che cerchi.
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

  3. #3
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Post
    681

  4. #4
    paoloet non è in linea Novello
    Post
    42
    Ciao ragazzi,

    vi ringrazio per la disponibilità

    sono riuscito a risolvere il problema sfruttando la dritta di alex

    di seguito il codice

    magari potete darmi ancora qualche dritta


    codice:
    'eseguo la query
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("myquery")
    
    'imposto le variabili per elaborare la stringa
    Dim lunghezzaelenco As Integer
    Dim elenco As String
    Dim substring As String
    
    'eseguo il ciclo e creo una stringa
    
    Do Until rs.EOF
    elenco = elenco & ", " & rs.Fields("xyz")
    rs.MoveNext
    Loop
    
    'elaboro la stringa per togliere la prima virgola iniziale
    lunghezzaelenco = Len(elenco)
    substring = Right(elenco, lunghezzaelenco - 1) & "."
    
    'chiudo il recordset
    rs.Close
    Set db = Nothing
    Ultima modifica di paoloet; 16-04-2019 09:24 

  5. #5
    paoloet non è in linea Novello
    Post
    42
    chiedo scusa per la ridondanza dei messaggi ma ho avuto qualche problemino con i tag

    magari i moderatori possono eliminare gli ultimi due messaggi perchè sto avendo qualche problemino anche con l'eliminazione

    grazie

  6. #6
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    265
    Una domanda: ma con la riga
    codice:
    substring = Right(elenco, lunghezzaelenco - 1) & "."
    non ti resta lo spazio iniziale? La versione corretta non dovrebbe essere
    codice:
    substring = Right(elenco, lunghezzaelenco - 2) & "."
    così togli anche lo spazio oltre alla virgola?

  7. #7
    paoloet non è in linea Novello
    Post
    42
    Grazie Sgrubak

    effettivamente c'era l'errore che hai evidenziato tu.

    Il secondo codice che hai postato va bene!!!

  8. #8
    L'avatar di nman
    nman non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,652
    Quote Originariamente inviato da paoloet Visualizza il messaggio
    ....... magari potete darmi ancora qualche dritta .........
    Sostanzialmente direi che va bene, ti dò solo qualche piccola dritta
    codice:
    'eseguo la query
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb   ' io farei Set db = DBEngine(0)(0)
    Set rs = db.OpenRecordset("myquery")  ' io aggiungerei  il dbReadOnly
    
    'imposto le variabili per elaborare la stringa
    Dim lunghezzaelenco As Integer    ' Integer arriva fino a 32.000 mi sembra abbondante, ma valuta te
    Dim elenco As String
    Dim substring As String
    
    'eseguo il ciclo e creo una stringa
    
    Do Until rs.EOF
    elenco = elenco & ", " & rs.Fields("xyz").Value  
    rs.MoveNext
    Loop
    
    'elaboro la stringa per togliere la prima virgola iniziale
    lunghezzaelenco = Len(elenco)
    substring = Right(elenco, lunghezzaelenco - 1) & "."
    
    ' ma io eviterei le 2 variabili lunghezzaelenco e substring  facendo solo:
    elenco = Mid(elenco, 3) & "."
    
    'chiudo il recordset
    rs.Close
    db.Close
    Set rs = Nothing
    Set db = Nothing

    Poi devi pensare obbligatoriamente a chiudere gli oggetti in caso di blocco del codice
    Leggi questo [VBA] Gestione degli errori

    uno schema molto molto molto semplificato potrebbe essere:
    codice:
    ..............
    On Error GoTo ChiusuraOggetti  ' su errore va direttamente a chiudere
    
    .............................
    ' poi fai tutte le tue cose
    ............................
    
    'chiudo il recordset
    ChiusuraOggetti:
    On Error Resume Next
    
    rs.Close
    db.Close
    Set rs = Nothing
    Set db = Nothing 
    On Error GoTo 0
    .
    Ultima modifica di nman; 16-04-2019 22:55 

  9. #9
    paoloet non è in linea Novello
    Post
    42
    Ciao nman

    ti ringrazio per i suggerimenti

    ho voluto postare il codice proprio perché essendo un autodidatta ho bisogno di confrontarmi con qualcuno che ha più esperienza di me

    provvedo subito ad implementare il mio codice con le tue dritte anche se devo studiare meglio la parte degli errori!

  10. #10
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    15,997
    Alcune note:
    1) Dichiarazione Oggetti e Variabili tutte all'inizio
    2) Dichiarazione errori che identifichi la Sub ed il Parent, quando il codice inizia ad essere molto serve capire chi genera l'errore
    3) Si usano variabili ed oggetti SOLO SE SERVONO
    4) Si controlla SEMPRE se un Recorset è vuoto
    5) Si distruggono gli Oggetti anche in caso di Errore e si deve prevedere il LOOP di errore su errore
    6) Attenzione che le Query SELECT non si eseguono, solo le Action si eseguono, ma si usano per accedere ai Dati.

    Riproporrei una cosa di questo tipo:
    codice:
    Function NomeFunction()
        On Error GoTo Err_Handler
        Const mcProcName        As String = "NomeFunction"
        Const mcProcParent      As String = "NomeForm/Modulo/Classe"
        'imposto le variabili per elaborare la stringa
        Dim lunghezzaelenco     As Integer    ' Integer arriva fino a 32.000 mi sembra abbondante, ma valuta te
        Dim elenco              As String
    
        'eseguo la query
        Dim rs                 As DAO.Recordset
        Set rs = DBEngine(0)(0).OpenRecordset("myquery")  ' io aggiungerei  il dbReadOnly
        
        If Not rs.EOF Then
            'eseguo il ciclo e creo una stringa
            
            Do Until rs.EOF
               elenco = elenco & rs.Fields("xyz").value & ", "
               rs.MoveNext
            Loop
            
            If Len(elenco) > 0 Then elenco = Mid$(elenco, 1, Len(elenco) - 2) & "."
        End If
    
    Exit_Here:
        On Error Resume Next
        If Not rs Is Nothing Then rs.Close
        Set rs = Nothing
    
        Exit Function
    
    Err_Handler:
        Select Case Err.Number
            Case Else
                MsgBox Err.Number & " in " & mcProcParent & vbNewLine & Err.Description, vbCritical, mcProcName
        End Select
        Resume Exit_Here
    
    End Function
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi