Newsgroup: it.comp.appl.access
Titolo: Concatenare stringhe in una Query

In una Query, anziché sommare i valori, è possibile con qualche trucco
concatenare le stringhe?
Grazie

 concatenare le stringhe?
    Cioe', invece che:
        1 + 1 = 2
vorresti:
        "1" & "1" = "11"
?
    Supponendo che i campi in questione si chiamino "Campo1" e "Campo2", che
siano di tipo numerico, che possano contenere valori nulli, e che i valori
nulli tu li voglia considerare uguali a zero:
     (1) converti in stringa il valore del campo numerico e, se questo vale
Null, ottieni una stringa nulla:
        "" & [Campo1]
     (2) ricavi il valore numerico dalla stringa (1) ottenendo zero se
stringa nulla:
        Val("" & [Campo1])
     (3) converti il valore numerico (2) in stringa:
        CStr(Val("" & [Campo1]))
     (4) ripeti (1), (2) e (3) per Campo2:
        CStr(Val("" & [Campo2]))
     (5) concateni (3) e (4) mediante l'operatore di concatenazione "&":
        CStr(Val("" & [Campo1])) & CStr(Val("" & [Campo2]))
    Nell'espressione di una query, invece della procedura su esposta, puoi
anche usare la:
        Function Nz(Value, [ValueIfNull])
            Membro di Access.Application
    Sicuramente i passaggi (1)-(5) la dicono lunga sull'utilita' di questa
funzione. :-) Che userai cosi':
     (A)    Nz([Campo1], 0) & Nz([Campo2], 0)
    E' anche possibile usare la forma:
     (B)    CStr(Nz([Campo1];0)) & CStr(Nz([Campo2];0))
che rende esplicite le conversioni effettuate. Le ulteriori due chiamate
della funzione CStr pero' invitano ad usare la forma (A). Questo a patto che
tu non ti faccia traviare dai moltissimi esempi, sparsi un po' dappertutto,
in cui l'operatore "piu'" viene usato come operatore di concatenazione.
    A proposito di trucchi: mi dispiace, non ne conosco. Conosco pero' delle
persone per le quali il segno piu' posto fra due numeri e' un trucco per
ottenerne la somma.
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

 Grazie
L'operatore di concatenamento delle stringhe e' & (e commerciale).
Es. se hai due campi A e B e vuoi concatenarli basta scrivere:
A & B se i due campi non sono stringhe verranno automaticamente convertiti.
Spero di aver capito la tua domanda non molto chiara.
Saluti, Antonio.


Certamente.
In un campo della query puoi scrivere:
Concatena: [Campo1] & [Campo2]
Ciao, Carlo

Mi scuso con tutti per l'assenza di chiarezza nella domanda.
Soprattutto con Maurizio che ha più faticato a scrivere...
Allora:
quando in una Query scelgo la Formula "Raggruppamento" ho a disposizione le
funzioni di aggregazione:
Somma,Media,Min,Max,Conteggio...
A me servirebbe la funzione di Concatenazione.(per questo ho scritto "un
trucco")
Se 
p.es
. nei DettOrdini di un cliente ci sono 3 record con "Mele" "Pere"
"Patate" io vorrei ottenere per quel cliente un campo con "Mele, Pere,
Patate"
Sono riuscito a ottenere i miei scopi scrivendo codice VB, ma mi chiedevo se
era possibile ottenere lo stesso risultato con le Query.
Nell'Help ho trovato:
"Calcoli predefiniti che utilizzano funzioni di aggregazione:
Per visualizzare i risultati di un calcolo in un campo, è possibile
utilizzare un calcolo predefinito fornito dal programma ** oppure calcoli
personalizzati **[(Come?)]. Utilizzare i calcoli predefiniti, denominati
funzioni di aggregazione o "totali", se si desidera eseguire le operazioni
seguenti per tutti i record o gruppi di record: somma, media, conteggio,
minimo, massimo, deviazione standard o varianza."
Grazie ancora.

 ha scritto nel messaggio
news:DdIc9.138719$n04.3...@twister2.libero.it...

Non possibile...aggregazione è completamente diverso da concatenazione.
In genere si aggrega per colonna e si concatena per riga.
Anche usando il codice se vuoi concatenare le colonne devi trasformarle in
righe.
Leggi i record di uno stesso campo e concateni il primo con il secondo, il
risultato con il terzo e così via
Usa il codice che vai alla grande.
Ciao, Carlo

> Ciao, Carlo
Che rapidità!
Grazie, ciao

 minimo, massimo, deviazione standard o varianza."
    Mi sa che con calcoli personalizzati si intendano le chiamate a
"funzioni
utente". Quindi piu' o meno quello che gia' stai facendo.
    Ti faccio comunque un esempio basato su Northwind.
        Query "Lista Prodotti di IDOrdine"
        PARAMETERS
            [IDOrdine?] Long
        ;
        TRANSFORM
            First(Prodotti.NomeProdotto) AS PrimoDiNomeProdotto
        SELECT
            [Dettagli ordini].IDOrdine
        FROM
            Prodotti
            INNER JOIN
            [Dettagli ordini]
            ON
                Prodotti.IDProdotto = [Dettagli ordini].IDProdotto
        WHERE
            [Dettagli ordini].IDOrdine=[IDOrdine?]
        GROUP BY
            [Dettagli ordini].IDOrdine
        ORDER BY
            Prodotti.NomeProdotto
        PIVOT
            Prodotti.NomeProdotto
        ;
        Query "Dettagli ordini Lista prodotti"
        SELECT
            [Dettagli ordini].IDOrdine _
          , RicavaStringaProdotti([Dettagli ordini].[IDOrdine])
            AS Prodotti
        FROM
            [Dettagli ordini]
        GROUP BY
            [Dettagli ordini].IDOrdine
        ORDER BY
            [Dettagli ordini].IDOrdine
        ;
Option Compare Database: Option Explicit
Public Function RicavaStringaProdotti( _
  ByVal IDOrdine As Long _
) As String
  On Error GoTo erh
  Dim oDaoRecordset As DAO.Recordset
  Dim a_vRows()     As Variant
  Dim lIndex        As Long
  With CurrentDb.QueryDefs![Lista Prodotti di IDOrdine]
    .Parameters![IDOrdine?] = IDOrdine
    Set oDaoRecordset _
      = .OpenRecordset( _
            DAO.dbOpenSnapshot, DAO.dbFailOnError)
    a_vRows = oDaoRecordset.GetRows(1)
  End With
  For lIndex = 1 To UBound(a_vRows, 1)
    RicavaStringaProdotti _
      = RicavaStringaProdotti & a_vRows(lIndex, 0) & ", "
  Next
  RicavaStringaProdotti _
    = Left$( _
          RicavaStringaProdotti _
        , Len(RicavaStringaProdotti) - 2) _
    & "."
ext:
  On Error Resume Next
  oDaoRecordset.Close: Set oDaoRecordset = Nothing
  Exit Function
erh:
  Resume ext
End Function
