Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Concatenare stringhe in una Query

1,222 views
Skip to first unread message

Joker

unread,
Sep 2, 2002, 1:28:45 AM9/2/02
to
In una Query, anziché sommare i valori, è possibile con qualche trucco
concatenare le stringhe?
Grazie

Maurizio Borrelli

unread,
Sep 2, 2002, 3:10:58 AM9/2/02
to
> "Joker" [...]:

> In una Query, anziché sommare i valori, è possibile con qualche trucco
> 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
--------


Antonio Ganci

unread,
Sep 2, 2002, 3:12:20 AM9/2/02
to
> In una Query, anziché sommare i valori, è possibile con qualche trucco
> concatenare le stringhe?
> 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.


Carlo Costarella

unread,
Sep 2, 2002, 3:26:17 AM9/2/02
to

"Joker" <ab...@abcd.com> ha scritto nel messaggio
news:hGCc9.136522$lu5.3...@twister1.libero.it...

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

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


Ciao, Carlo

Joker

unread,
Sep 2, 2002, 7:47:47 AM9/2/02
to
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.


Carlo Costarella

unread,
Sep 2, 2002, 7:59:03 AM9/2/02
to

"Joker" <ab...@abcd.com> 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


Joker

unread,
Sep 2, 2002, 8:29:52 AM9/2/02
to
> Ciao, Carlo

Che rapidità!
Grazie, ciao


Maurizio Borrelli

unread,
Sep 2, 2002, 5:33:50 PM9/2/02
to
> "Joker" [...]:

> Mi scuso con tutti per l'assenza di chiarezza nella domanda.
> Soprattutto con Maurizio che ha più faticato a scrivere...

:-)

Non ti preoccupare... Con google non si butta via niente.

> 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")

Ok. Qui direi proprio che ci sta bene la parola 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."

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

0 new messages