Newsgroup: it.comp.appl.access
Titolo: convertire query in string

Come si converte la seguente query in stringa ( che pongo nel codice di una 
maschera) e il risultato assegnarlo ad una sottomaschera?
SELECT TOP 50 *
FROM miaTabella
WHERE (((ID) In (SELECT ID FROM
(SELECT ID, "A" As WhichField, A As FieldValue FROM miaTabella
UNION
SELECT ID, "B" As WhichField, B As FieldValue FROM miaTabella
UNION
SELECT ID, "C" As WhichField, C As FieldValue FROM miaTabella
UNION
SELECT ID, "D" As WhichField, D As FieldValue FROM miaTabella
UNION
SELECT ID, "E" As WhichField, E As FieldValue FROM miaTabella
UNION
SELECT ID, "F" As WhichField, F As FieldValue FROM miaTabella
UNION
SELECT ID, "G" As WhichField, G As FieldValue FROM miaTabella
UNION SELECT ID, "H" As WhichField, H As FieldValue FROM miaTabella
) AS Subselect
WHERE FieldValue IN (1, 2, 3, 4, 5, 6, 7, 8)
GROUP BY ID
HAVING Count(*) >= 3)))
ORDER BY miaTabella.ID DESC;
grazie 

 maschera) e il risultato assegnarlo ad una sottomaschera?
Cos'e' questa.... questa COSA?
Estrae quelli che nei campi A,B,C...H hanno almeno tre valori pari a
1-8?
Ok, a naso funziona, ma perche' non dovresti prenderla così com'è e
incollarla dove ti serve? Sempre SQL è...
(altrimenti, scrivi una funzione che prende come argomento un array di
valori e ti risponde quanti sono valori compresi tra 1 e 8...)
cia'
Max

"'Roccia' Max"  wrote
Cos'e' questa.... questa COSA?
Estrae quelli che nei campi A,B,C...H hanno almeno tre valori pari a
1-8?
si
Ok, a naso funziona, ma perche' non dovresti prenderla cosě com'č e
incollarla dove ti serve? Sempre SQL č...
La mettonel codice di un pulsante di una  maschera e diventa tutto rosso , 
segno che qualcosa non č corretto
nel mosdo che ho provato mi da errore 3075
(altrimenti, scrivi una funzione che prende come argomento un array di
valori e ti risponde quanti sono valori compresi tra 1 e 8...)
sarebbe?  non so scrivere cose cosě complesse.
cia'
Max
ciao

 sarebbe?  non so scrivere cose così complesse.
Function ContaVal(ParamArray Valori()) As Integer
Dim O As Variant
For Each O In Valori
    If Val(O) > 0 And Val(O) <= 8 Then ContaVal = ContaVal + 1
    Next
End Function
Passi un elenco di valori a piacere a questa funzione, e lei ti
risponde quanti sono numeri compresi tra 1 e 8.
ContaVal(0,1,11,5,"pippo") = 2
Nel tuo caso,
ContaVal([A],[B],[C],[D] eccetera
cia'
Max

"'Roccia' Max"  wrote





End Function



In una tabella cerco tutti i record che nei campi A- H abbiano almeno tre 
(>=3)  valori della serie che imposto (es 1, 2, 3, 4, 5, 6, 7, 8)  e il 
risultato lo dovrei vedere in una sottomaschera.
cia'
Max
ciao

 risultato lo dovrei vedere in una sottomaschera.
Andiamo con ordine... la tua query, cosi' come l'hai scritta, estrae i
dati che ti servono?
Se si, salvala come query e usala come origine dati della tua
sottomaschera. E il pulsante, a cosa serve?
Poi: il tuo DB ha un errore di fondo, cioè dati omogenei tra loro
(A,B,C...H) gestiti come colonne distinte e non come record. Puoi
modificare pesantemente il DB per normalizzarlo o devi arrangiarti con
quello che hai?
cia'
Max


 Mi intereserebbe sapere se il tutto (1) si puň ottenere con una funzione, 
visto che in qualche modo la query funziona ma richiede moltissime risorse 
del pc e tempo.
grazie 

 del pc e tempo.
Potere si puo', ma in ogni caso sara' una roba pesante da far girare,
visto che per ogni record devi fare 8 confronti (uno per ogni campo),
e ciascun confronto devi ripeterlo per N valori.
Direi che quel mostro di query di unione probabilmente riesce a essere
piu' veloce, solo utilizza degli UNION ALL al posto degli UNION, cosi'
non perde tempo a assicurare l'univocità dei record.
Certo che se potessi modificare la tabella in modo da togliere le
colonne A-H e metterle in una tabella a parte del tipo ID/NomeCampo/
ValoreCampo ci guadagneresti molto... anche in flessibilità: se domani
ti dicono che devi aggiungere anche la colonna I hai idea del casino?
cia'
Max

Certo che se potessi modificare la tabella in modo da togliere le
colonne A-H e metterle in una tabella a parte del tipo ID/NomeCampo/
ValoreCampo ci guadagneresti molto... anche in flessibilità: se domani
ti dicono che devi aggiungere anche la colonna I hai idea del casino?
non capisco.
A-H sono nomi dei campi che contengono il valore.
la tabella è
id , data, A, B, C, D, E, F, G, H, euro..
1750 14/11/07 1 2 3 4 5 6 7 8 1.230
1751 14/11/07 2 4 6 8 10 12 14 16 1.450
1752 14/11/07  3 6 9 12 15 18 20 4 1.793
....
la colonna I sarebbe il campo I da inserire tra H e euro
cia'
Max
ciao

 la colonna I sarebbe il campo I da inserire tra H e euro
Si. Questo significa che devi rifare tutte le query perche' gestiscano
anche il campo I, tutte le form, tutti i report... se invece usi una
struttura relazionale, non fai altro che inserire i nuovi record con
la I, e tutto si adegua pressochè automaticamente... tutt'al più devi
ritoccare qualche report.
Idealmente, dico. So benissimo che probabilmente quel DB e' quello che
passa il convento, e quindi con quello ti devi arrangiare... ma se mai
ti capitasse di progettare un DB da zero...
cia'
Max

 non perde tempo a assicurare l'univocità dei record.
Ciao "Roccia".
Dovrebbe andare piu' veloce anche se spezza le query:
Q1 = select union degli ID con la where (sarebbe meglio una between) per 
ogni select
Q2 = select di Q1 Raggruppando e facendo order e top
Q3 = join di Tab e Q3 con Q3 a sx
A quanto ho capito "non" deve assicurare l'univocita' del record.
Uhmmmm..... non credo che la funzione sia cosi' pesante poiche' riesce a 
fare tutto con un passo solo e se ordina gli ID dovebbe fare il tutto 
limitatamente ai primi 50 ID. La quesione e' come assegnare poi quella 
struttura risultato ad una sottomaschera. Ovviamente potrebbe scrivere 
il tutto su una tab temporanea ma io non amo questo tipo di soluzione.
-- 
ac
y-1=x

 y-1=x
grazie 

 Non ho capito molto
uhhhmm.......
Q1:
SELECT ID, "A" As WhichField, A As FieldValue FROM miaTabella
where A between 1 and 8
UNION
SELECT ID, "B" As WhichField, B As FieldValue FROM miaTabella
where B between 1 and 8
UNION
SELECT ID, "C" As WhichField, C As FieldValue FROM miaTabella
where C between 1 and 8
UNION
SELECT ID, "D" As WhichField, D As FieldValue FROM miaTabella
where D between 1 and 8
UNION
SELECT ID, "E" As WhichField, E As FieldValue FROM miaTabella
where E between 1 and 8
UNION
SELECT ID, "F" As WhichField, F As FieldValue FROM miaTabella
where F between 1 and 8
UNION
SELECT ID, "G" As WhichField, G As FieldValue FROM miaTabella
where G between 1 and 8
UNION
SELECT ID, "H" As WhichField, H As FieldValue FROM miaTabella
where H between 1 and 8
Q2:
select id,count(*) from Q1
  group by id having count(*) > 3
QFinale
select top 50 miatabella.* from q2, MiaTabella
	where 
q2.id
 = 
miatabella.id
	ORDER BY miaTabella.ID DESC;
s. e. & o. dovrebbe essere la stessa cosa che hai scritto, questa 
dovrebbe essere piu' veloce, oltretto puoi controllare i risultati 
intermedi e vedere se e dove perde tempo. La IN sugli id e' "sconsiderata".
ovviamente non avendo un sistema di test non la ho provata.
I due campi whichfield e fieldvalue non dovrebbero servire
-- 
ac
y-1=x

 y-1=x
grazie, ciao 

 scusami sai.
invece di questo
where H between 1 and 8
rimetti la in
where H in (1,....,n)
ora, per come sono messe le cose, puoi diversificare la where per 
ciascun campo, laddove ti dovesse mai servire.
le IN genere sono piu' pesanti. Questa e' una lista corta
non dovresti trovare allungamenti di tempo eclatanti
-- 
ac
y-1=x

 y-1=x
grazie ciao 


potrebbe essere "claro". Non so cosa hai fatto esttamente ma l'ID 
potrebbe confondere il sistema visto che e' presente sia su Q2 che su 
miatabella in questo caso il controllo ID di form potrebbe derivare sia 
da 
Q2.ID
 che da MiaTabella.ID. Verifica nel cbx delle proprieta' per il 
"source control" quali campi hai a disposizione e seleziona l'ID che ti 
interessa.
#Nome significa che il source control non e' presente fra i campi 
sottesi al "recordsource"
-- 
ac
y-1=x

Alessandro Cara wrote:
sorry per come le avevo chiamate "QFinale"  e non "Q2" dovrebbe essere 
il tuo "recordSource"
"Riflessendo" ho visto che la lista delle IN la passi sulla Q1 
attraverso una variabile. Non ti dovrebbe funzionare come fai? Poiche' 
in questo caso l'affare si complica.
-- 
ac
y-1=x

 y-1=x
grazie ciao 

"Alessandro Cara"  wrote

Avevo creato le query come quelle da te indicate e verificato il 
funzionamento.
Poi ho provato a convertire in stringa solo la query finale sfruttando la q1 
e q2.
poi ho aggiunto alla stinga le altre 2 query (Q1, Q2) e per evitare di 
servmi di q1 e q2 vere le ho rinominate. ho compattato il db.
Il tutto funzionava tranne per id (#nome?)
La notte porta consiglio, nel mio caso solo una parte della notte, e ho 
creato una query dalle tre di partenza.
l'unica differenza tra la stringa e quello che acces aveva accettato era:
SELECT TOP 50 miatabella.*
WHERE [Q2].ID=miatabella.ID
nel fare la query totale non potevo usare "as Q2" perchè gia usato e l'ho 
cambiato in "as QZ" e tutto ora funziona perfettamente  almeno per la serie 
(1..8) che ho provato; nonostante la compattazione forse access cercava 
anche il q2 della query
Se le tue query non "dimenticano" dei risultati ci siamo, sia come risultati 
che velocità ; minuti contro secondi.
Alcuni post sopra ti riferivi all'unicità dei record cosa intendevi?
Forse se nella serie ci sono due o più numeri uguali?
Come sarebbe se ci fosse questa situazione?


Marco wrote:
[cut]
Ciao Marco.
Ti chiedo una cortesia. Puoi aprire un nuovo 3d con oggetto tipo 
"ottimizzazione tempi risposta query"  perche' cosi' facciamo il punto 
della situazione partendo dalla situazione corrente. Da quello che hai 
scritto ho dei grossi dubbi che il risultato ottenuto e' quello aspettatato.
-- 
ac
y-1=x

 y-1=x
saluti 


Ho visto. Io non ho altre migliorie da suggerirti.
Ho visto che hai tenuto tutto in una unica stringa sql. Ad occhio mi 
sembra ti restituisca i valori che ti servono.
Mi confermi che i tempi si sono abbassati cosi' drasticamente?
Per come esegui la query immaginavo tempi di risposta piu' lunghi.
-- 
ac
y-1=x

 y-1=x
grazie, saluti