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
--------
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
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.
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
Che rapidità!
Grazie, ciao
:-)
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