Newsgroup: it.comp.appl.access
Titolo: S.O.S.

Premetto non sono di madre lingua Italiana.
Si supponga di avere un record con almeno 10 campi, e all'interno di essi vi
compaiono dei dati. Io ho la necessita di sapere quanti dati dello stesso
tipo vi sono all'interno ad esempio:
      |  C1 | C2 | C3| C4 | C5| C6 |C7 |
a1  |   a  |  c    | d   |  a   |  c  |  o   |  z   |
Qundi, il risultato da me desiderto dovrebbe essere che nel record
 a1 vi sono n.2a.; n.2c; n.1d;n.1o;n1z.
Come faccio.
Ringrazio anticipatamente.
Gigi.

 a1 vi sono n.2a.; n.2c; n.1d;n.1o;n1z.
come lo vuoi organizzato questo risultato?  nel senso, lo vuoi in
un'unica stringa, in n campi separati...
comunque ecco due soluzioni:
scorri il recordset, appoggia ogni campo in record di una tabella
temporanea con un solo campo, fai una query di raggruppamento
conteggiando i valori dei campi:
dim rst as recordset
dim rstTemp as recordset
dim arrNomiCampo(n) as string
' n è il numero dei campi -1
dim i as integer
dim ssql as string
set rst = currentdb.openrecordset("Tabella")
set rstTemp = currentdb.openrecordset("TabellaTemp")
arrNomiCampo(0)="C1"
arrNomiCampo(1)="C2"
' ecc.
arrNomiCampo(n)="Cn"
do until rst.eof
	docmd.runsql("DELETE * FROM TabellaTemp")
	for i = 0 to n
		rstTemp.addnew
		rstTemp!CampoTemp=rst(arrNomiCampo(i))
		rstTemp.update
	next i
	ssql = "SELECT CampoTemp, Count(CampoTemp) " & _
	          "   FROM TabellaTemp " & _
	          "GROUP BY CampoTemp"
	' a questo punto hai una query che ha il risultato che cerchi
	' per un record
	rst.movenext
loop	
----------
secondo sistema (un po' incasinato e non collaudato):
dim arrV(n,1)
dim arrNomiCampo(n) as string
' n è il numero dei campi -1
' arrV è fatto così:
'      0 |  1 |
' -----+---|
' 1 | x  |  x |
' --|--+---|
' 2 | x |  x |
'   ---+---|
' ...
' n | x |  x |
dim i as integer
dim j as integer
dim rst as recordset
arrNomiCampo(0)="C1"
arrNomiCampo(1)="C2"
' ecc.
arrNomiCampo(n)="Cn"
set rst = currentdb.openrecordset("NomeTabella")
do until rst.eof
	for i = Lbound(ArrV) to Ubound(ArrV)
		arrV(i,1)=0
	next i
	' azzeri i valori dell'array di appoggio 
	for i = Lbound(ArrNomiCampo) to Ubound(ArrNomiCampo)
	' scorri tutti i campi che ti interessano del record corrente
		for j = Lbound(ArrNomiCampo) to i-1
		' controlli che nei campi "precedenti" non ci sia già 
		' il valore del campo corrente
			if rst(arrNomiCampo(j))=rst(arrNomiCampo(i))
then
			' il valore c'era già
				arrVC(j,1)=arrVC(j,1)+1
				exit for
				' non serve che controlli oltre
			end if
		next j
		if j = i
		' cioè se sei arrivato fino alla fine del ciclo j,
		' e cioè se non hai trovato, negli altri campi 
		' del record, quel tale valore...
			arrVC(j,1)=arrVC(j,1)+1
			' lo metti in un elemento temporaneo
			' nuovo.
		end if
	next i
	' a questo punto hai un elenco di coppie in arrVC che ti dice
	' quante volte (arrVC(x,1)) l'elemento descritto in arrVC(x,0)
	' è presente nel record.
	' a te utilizzare in qualche modo questa informazione...
	rst.movenext
loop 
--
non studio non lavoro non guardo la tv
non vado al cinema non faccio sport
----------------------------------------
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access


Perchè molti utenti strutturano i dati "in orizzontale"?
SQL è potente per dati strutturati "in verticale"!
"Orizzontale"? "Verticale"?
Sono mie definizioni assolutamente informali per descrivere la struttura di
alcune tabelle:
esempio:
devo definire un listino prezzi in valuta, come predispongo il database per
accogliere queste informazioni?
Definisco una tabella tra i cui campi inserirò l'identificativo
dell'articolo, bene
Listino(IdArticolo,
e poi?
Quelli che "pensano" in orizzontale, metteranno
PrezzoValuta1, PrezzoValuta2, ...,PrezzoValutaN)
Ottenendo cosi
Listino (IdArticolo, PrezzoValuta1,PrezzoValuta2,...,PrezzoValutaN)
Dicendo "Tanto non avro mai + di N valute"
Generalmente questa struttura è la + semplice ma anche la meno flessibile
oltre che la meno elegante.
Chi pensa "in verticale" invece, definirà prima la tabella
Valute (IdValuta, Descrizione)
poi la tabella Listino con un IdArticolo e IdValuta (rappresentanti la
Primary Key) e poi un campo PrezzoInValuta, ottenendo così:
Listino (IdArticolo, IdValuta, PrezzoInValuta).
Con questa seconda soluzione, è un pò più difficile il data-entry (bisogna
gestire un master-detail oltre che una maschera per la gestione delle
valute, ecc) però l'estrazione dati è moooolto più semplice.
Fare la stampa di tutti i listini in tutte le valute, raggruppate per
Valuta, nel primo caso la soluzione non è proprio immediata, invece nel
secondo è un gioco da ragazzi.
Tu ti trovi in un caso analogo. Qual'è la soluzione?
(Data la semplicità concettuale del problema, tralascio la soluzione
ottenuta attraverso l'implementazione di un algoritmo in VBA.)
Come sfrutto l'SQL per ottenere il risultato?
"Girando" i dati, da "orizzontali" a "verticali":
Select C1 as CAMPO
from T
UNION ALL
Select C2
from T
...
UNION ALL
Select C10
from T
A questo punto con questa tabella logica
T_union (CAMPO)
è possibile ottenere il tanto desiderato risultato
Select CAMPO, count(CAMPO)
from T_union
group by CAMPO
questo è quanto!
Spero che la prossima volta che strutturerai delle tabelle, ti ricorderai di
organizzare i dati il più possibile in "verticale".
Alla prossima
Michele Amato
--
{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}
Un pò di pubblicità per il mio sito, su
http://utenti.worldonline.it/micheleamato
è possibile trovare una add-in per Access97-2000:
          Access Navigator 2.0
comincia a esserci anche un pò di documentazione...
ho pubblicato anche la prima parte di un TUTORIAL
sull'uso di questo strumento
{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}