Newsgroup: it.comp.appl.access
Titolo: Criterio in query su campo dinamico cioè stabilito come risultato di una funzione

Tosto 'sto subject eh?
Allora...
io voglio preparare una query
questa query mi deve filtrare dei record mediante un criterio (in realt� 
alla fine saranno due ma se risolvo su uno risolvo pure per l'altro)
Il mio problema � che in realt� io a priori non so su quale campo devo fare 
filtro ma dipende dall'elaborazione di una certa funzione.
Pertanto, chiamati i campi per esempio campo1, campo2 e campo3, il filtro 
pu� andare sotto uno di questi tre campi, ma solo su uno di questi.
E' possibile mettere un unico campo con sotto il filtro, facendo si che il 
campo scelto di volta in volta sia risultato di una funzione?
Pertanto qualcosa tipo
Espr1: fun() dove fun mi restituir� campo1 o campo2 o campo3
sotto espr1 ci metto il filtro e sto a posto
mi viene da pensare a eval ma non sono sicuro
idee?
Antonio 

 Antonio
Io creerei una Query SQL così chiamandola [Q1]:
SELECT * FROM T1
WHERE [%CR%]
ORDER BY
Quindi le tue pippe per comporre il criterio...
strSQL=CurrentDb.QueryDefs("Q1").SQL
strSQL=REPLACE(strsql,"[%CR%]",CRITERIO)
CurrentDb.QueryDefs("Q1").SQL=strSQL
Che dici...?
@Alex


Sicuramente quello che andrò a suggerirti sarà probabilmente diverso
da quello che cerchi e probabilmente non sarà per te una cosa nuova;
comunque: nella query c'è già la possibilità del filtro su campi
variabili. Poniamo ad esempio che tu abbia tre campi: "Campo1" dove
hai i numeri di telefono di casa, "Campo2" dove hai i numeri di
telefono/fax degli uffici, "Campo3" dove hai i numeri di telefono dei
cellulari. Bene, come faresti in un sol colpo a pescare in tutti e tre
i campi? Basta inserire nel rigo "Criteri" sotto il Campo1 ad esempio
il seguente parametro [Inserire il numero di telefono], nel rigo
"Oppure" sotto il Campo2 lo stesso parametro [Inserire il numero di
telefono] e nel successivo rigo "Oppure" sotto il Campo3 sempre lo
stesso parametro [Inserire il numero di telefono].
Ciao Vladimiro.


Ciao Alex!
Ho avuto anche io occasione di picchiarmi con 'sta cosa (la sto usando
da parecchio, ormai), e se posso aggiungere my 2 cents suggerirei due
query, una di riferimento (Query_Base) che contenga la "SELECT ..
WHERE [%CR%] ..." ed un'altra (Query_Elaborazione) cui assegnare il
valore con i parametri sostituiti:
CurrentDb.QueryDefs("Query_Elaborazione").SQL=Replace$
(CurrentDb.QueryDefs("Query_Base").SQL, "[%CR%]",
FunzioneDeterminazioneParametri())
Popi


Si la tua considerazione giustissima quanto ovvia.
Al primo utilizzo del metodo, anzi al 2°, si capisce anche subito il
perchè della tua osservazione.... ;-)
Uno come Antonio tuttavia non ha bisogno di questi dettagli, applica
da anni l'autolesionismo facendo le prove in autonomia e leggendo la
guida...
;-)
@Alex


Appero'!!! Gli hai appena fatto un complimento!!!
Adesso Mr. B. dira' che devo aggiornare il mio db :D
Popi

 Popi
@Alex

 Popi
@Alex
Vi salvate solo perchè in questa zona della lucania saudita, con lo stesso 
clima di Caracas (31 gradi la mattina, alle 14.30 ci metti l'ora piove a 
dirotto), ma senza gli annessi culi venezuelani, da due giorni il ripetitore 
rai dove si appoggiano gli operatori di telefonia sta disfunzionando e 
quindi il collegamento mi cade ogni 45 secondi
partirà questo post? quando arriverà?
per la questione in oggetto, intanto vedo le risposte, poi vi spiego se 
fattibile
E' comunque una rielaborazione dell'esempio sul treeview per quanto riguarda 
il caricamento di una listbox con + - e >
Antonio 

 ha scritto nel messaggio 
news:6b269569-0219-42fc...@j25g2000vbr.googlegroups.com...


perch� della tua osservazione.... ;-)
Eh, sar� pure ovvia ma mi stavi mandando dritto nel dirupo
ma agli altri lurkoni lo vogliamo spiegare il perch� di tutto questo 
ambaradam?
Antonio 


Sicuramente quello che andr� a suggerirti sar� probabilmente diverso
da quello che cerchi e probabilmente non sar� per te una cosa nuova;
comunque: nella query c'� gi� la possibilit� del filtro su campi
variabili. Poniamo ad esempio che tu abbia tre campi: "Campo1" dove
hai i numeri di telefono di casa, "Campo2" dove hai i numeri di
telefono/fax degli uffici, "Campo3" dove hai i numeri di telefono dei
cellulari. Bene, come faresti in un sol colpo a pescare in tutti e tre
i campi? Basta inserire nel rigo "Criteri" sotto il Campo1 ad esempio
il seguente parametro [Inserire il numero di telefono], nel rigo
"Oppure" sotto il Campo2 lo stesso parametro [Inserire il numero di
telefono] e nel successivo rigo "Oppure" sotto il Campo3 sempre lo
stesso parametro [Inserire il numero di telefono].
Ciao Vladimiro.
Grazie per il tentativo, per� la tua soluzione filtra contemporaneamente sui 
3 campi
A me serve di filtrare su un campo solo e non sugli altri, una volta 
stabilito quale � il campo coinvolto
Antonio

 Antonio
@Alex

 ha scritto nel messaggio 
news:d2f65515-10a3-4ebb...@g16g2000yqg.googlegroups.com...



NOooooo.....
Comunque sto rielaborando la famosa query qElementi del database treeview 
emulato con listview in modo da adattarsi alla mia struttura dati
ho deciso di non usare la ricorsione e quindi una tabella a soli due campi 
padre figlio, ma un tabellone con n campi.
quando si arriva in fondo ad una foglia i campi successivi sono tutti -
i padri precedenti vengono ripetuti
A - - -
A B - -
A C - -
A C D -
e cosi via
quando devo andare a filtrare per capire a che livello sto e quindi 
restituire + - o > nella listview devo trovare il campo dove il valore 
scelto e passato è un padre cioè con quel valore nel campo e nel campo 
subito dopo un -
ecco perchè il campo da filtrare è dinamico
me sa che me so capito solo io...
Antonio 

 Antonio
Grazie da un lurkone che vi ansima dietro.
Già diedi un'occhiata agli esempi di treeview; quando mi sarà
richiesto (sicuramente, prima o poi) sarò meno sprovveduto.
Riccardo Baldinotti

 Antonio
No ho capito... ma è un sistema sempre rigido...(Field_Vincolato) che
non uso.
@Alex

 Antonio
No ho capito... ma � un sistema sempre rigido...(Field_Vincolato) che
non uso.
E' vero, ma parlando con chi decide, hanno preferito utilizzare una 
struttura statica, con numero di campi fissi e dimensionati sul caso pessimo 
in modo da gestire ogni progetto.
Sicuramente questa soluzione � per� pi� semplice da gestire.
La cosa che li preoccupava (e pensandoci anche a me) � quanto poteva 
rallentare una struttura ricorsiva
A database pieno abbiamo anche 30000 record gerarchizzati e magari il db 
viene pure messo in rete
non � che ogni volta che c'� il refresh della listbox il tutto si 
piantava???
Antonio 

 Antonio
Ma che usi come DB...? JET...?
Non è il massimo per queste cose, tuttavia va valutato solo il Livello
di Ricorsione più che il numero dei dati...!
Personalmente a quel punto, invece di usare MilleMila campi tornerei
al sistema Campo Unico Aggregato.
Con le funzioni Stringa puoi Filtrare, raggruppare ecc... e la
progressione definisce il numero dei Livelli e la gerarchia.
A
AA
AAA
AAB
AABA
AABB
AB
ABA
AC
B
BA
BAA
BB
Ecc... che poi mi pare fosse quello che facevi all'inizio...
Len(Campo)=1 Campo PADRE senza Figli..!
LIKE A* AND Len(Campo)=2 Secondo Livello
ecc....
Boh...
@Alex

 piantava???
Ho seguito con difficolta' il 3d e ci ho capito poco.
Ecco quello che ho capito
1) Hai un "foglio excel" (virgolettato,banalizzo)
2) Ogni riga definisce un percorso gerarchico
3) Sulle varie righe alcuni valori campo sono ripetuti (rispetto alla 
riga precedente, fino alla divaricazione della gerarchia, la gerarchia 
finisce a campo-orizzontale- nullo o valorizzato a default)
4) Hai un sacro terrore delle funzioni ricorsive soprattutto in funzione 
del "teribbile" spreco di tempo che queste possono procurare.
1) se e vero
2) se e' vero
3) se e' vero
4) e' si e' proprio "teribile" un "par de secondi" se tutto va male (me 
sto a allarga') e devi legge tutti e 30.000 i record,  il tempo di 
scorrere il recordset.
P.S. quanti campi sono in orizzontale?
--
ac
-- 
ac (x=y-1)

 Antonio
Ma che usi come DB...? JET...?
Non č il massimo per queste cose, tuttavia va valutato solo il Livello
di Ricorsione piů che il numero dei dati...!
Personalmente a quel punto, invece di usare MilleMila campi tornerei
al sistema Campo Unico Aggregato.
Con le funzioni Stringa puoi Filtrare, raggruppare ecc... e la
progressione definisce il numero dei Livelli e la gerarchia.
A
AA
AAA
AAB
AABA
Interessante trucchetto
mo ci penso, ma con una precisazione: la lunghezza dei valori č variabile, 
quindi magari devo usare cmq un separatore e contare i separatori per 
scoprire il livello
Antonio 

 Antonio
Si certo quindi con SPLIT della stringa e UBOUND dell'array trovi il
Livello...
;-)
@Alex


Ragazzi, ooohhh!!!
Vi posso leggere solo ora ma ... quella di cui si sta parlando e', in
pratica, la logica di funzionamento del LCN "Logistic Control Number"
che si usa molto in ambito militare per la definizione di un albero di
configurazione :) (ne so qualcosina perche' sono 15 anni che ci
gioco) ...
Hint: se e' possibile identificare una struttura ad albero in cui ogni
livello puo' essere descritto con 2 soli caratteri alfanumerici [1] e
si usa un campo CodiceDiStruttura di tipo testo lungo 254 per
conservare il codice di configurazione di ciascun elemento, il numero
totale di livelli che la struttura puo' raggiungere sara' 254/2=127.
Inoltre, il livello di appartenenza di un item sara' dato dalla
len(CodiceDiStruttura)/2,il padre di qualsiasi item sara'
left(CodiceDiStruttura,len(CodiceDiStruttura)-2), ed i suoi figli
saranno like (CodiceDiStruttura & "??").
Nota bene: quanto sopra e' una banalizzazione estrema di quanto
previsto dalle varie norme in materia, ma presumendo che si parli di
impianti industriali [3] non militari potrebbe essere una buona
strada.
Antonio, se pensi possa essere d'aiuto contattami tranquillamente in
mail :)
Popi
[1] il massimo numero di elementi componenti a *qualsiasi* livello
della struttura e' 1296 [2]
[2] (26 lettere + 10 cifre)^2
[3] ci puoi tracciare non solo ogni singola valvola, ma anche i
diversi tratti di condotta intermedi e le relative flange ;)


Con un momento di tempo ho riletto il thread e mi sono accorto della
precisazione sulla lunghezza variabile dei codici.
Per ovviare a questo problema puoi prevedere un ulteriore campo
LivelloDiStruttura (numerico, byte).
La necessita' di popolarlo correttamente porta il vantaggio di
identificare il padre di qualsiasi item con CodiceDiStruttura
parzialmente uguale e LivelloDiStruttura-1, mentre i figli saranno
LIKE (CodiceDiStruttura & "*") e LivelloDiStruttura+1.
HTH
Popi


Si ma è un sistema abbastanza poco fruibile... non Gerarchico
Ricorsivo ma Gerarchico Lineare(livello di NOME), e, usando dei SERVER
SQL seri... si ha un notevole vantaggio
usare la Gerarchia per ricorsione che questa in quanto sfrutta la
struttura RELAZIONALE tra tabelle e non quella PARLANTE della sigla
composta per aggregazione.
La tecnica Gerarchica Lineare è usata fino dagli anni 80 quando io
usavo il C64(6502) per fare i giochetti... ed anche allora avevo fatto
un Ricettario con Gerarchia Lineare...
Occorre poi tener presente la logica di Codifica delle parti... che
negli impianti industriali è assegnata con sistemi svariati, il più
frequente KKS ma non è detto...!
In questi casi tuttavia l'uso di Nomenclatura KKS o Simili, favorisce
l'idea della GERARCHIA LINEARE, ma personalmente non la condivido.
Facciamo poi attenzione alla differenza di sigle tra il componente
installato e quello a magazzino... che non supporterebbe invece la
gestione omologa....
In sostanza in impianto uno stesso componente può avere Molti nomi
diversi(assegnati dai Loop di Automazione/Regolazione) ci si trova
quindi che una Valvola(X) ha in impianto, a seconda di dove è
installata 100 nomi diversi...!
A magazzino invece la valvola ha una codifica Costruttore diversa ma
sempre uguale...!
;-)
@Alex


Yes, non a caso l'albero di configurazione contiene oltre al codice
(LCN o simili) anche il P/N e codice costruttore dell'item fisico
specifico che sono poi le chiavi di riferimento per
l'approvvigionamento.
Per la mia esperienza dipende solo dai casi specifici (leggi:
limitazioni imposte e/o desiderata del cliente) se implementare una
logica di questo tipo o alberi a padre/figlio ;)
Popi

 ha scritto nel messaggio 
news:4usKp.37592$GZ3....@tornado.fastwebnet.it...


hai capito bene tranne il fatto che non ho io paura del ricorsivo ma i 
signori capi
e cmq in effetti hanno una rete che gi� fa piet� e misericordia
comunque ci sono 16 livelli di gerarchia
secondo me non � cos� immediato dire che ci vogliono solo 2 3 secondi
Antonio 

 ha scritto nel messaggio 
news:0f551363-7120-41aa...@f21g2000vbr.googlegroups.com...


In sostanza in impianto uno stesso componente pu� avere Molti nomi
diversi(assegnati dai Loop di Automazione/Regolazione) ci si trova
quindi che una Valvola(X) ha in impianto, a seconda di dove �
installata 100 nomi diversi...!
A magazzino invece la valvola ha una codifica Costruttore diversa ma
sempre uguale...!
Beh, ma questo � comunque normale
In un impianto tu hai delle entit� che sono riportati nei disegni 
ingenieristici e che vengono codificati secondo delle specifiche ben precise 
per quanto riguarda l'anagrafica impianto.
Qui devi solo sapere che tipo di oggetto �, dove sta e cosa fa e questo 
porta in parte anche alla sua codifica
Cosa poi installi fisicamente per ogni codice (marca-modello-seriale) � un 
altra cosa che poi � eventualmente legata al discorso magazzino o spare 
parts.
Antonio 

 ha scritto nel messaggio 
news:a0318016-5935-4239...@25g2000yqn.googlegroups.com...

Comunque scusate eh?
ma alla fine la mail campione neanche � necessaria se uno l'SQL master lo 
scrive direttamente dentro al codice no?
Antonio 


Ce ne vogliono anche di meno se si ha cura di gestire un "additive 
behaviour". I.e, se non ho capito male dovresti fare un treeview che 
"apri" a richiesta. Bene al momento della apertura, immagino, la chiave 
radice la hai a disposizione ed a meno che, come mi e' capitato, se 
sotto quella radice non c'e' tutta la distinta base dell'ATR42 il tempo 
di lettura dei figli, limitando al primo livello successivo, dovrebbe 
essere inconsistente. Se la classe e' abbastanza "furba" da ricordare 
cosa ha gia' letto e cosa no leggi solo ed esclusivamente "on demand" e 
non rileggi cose gia' lette.
Sui due o tre secondi di una elaborazione "brutale" ovviamente non sono 
disposto a giocarmi i contrappesi ad al momento non ho' un file adatto 
allo scopo, in termini di volumi, per fare la prova (ed in piu' sono 
pressato da un test piuttosto complicato, roba che fa quello che stai 
chiedendo piu' qualche altro gadget aggiuntivo)
-- 
ac (x=y-1)

 ha scritto nel messaggio 
news:BG%Lp.39694$GZ3....@tornado.fastwebnet.it...


Ok, se mi personalizzi la tua soluzione sui miei dati, mi offro come tester 
gratuitamente
ok?
Antonio 

 ha scritto nel messaggionews:a0318016-5935-4239...@25g2000yqn.googlegroups.com...

Certo, Antonio, ma personalmente preferisco avere la mia bella query
base ben documentata e tracciata ;)
Si tratta sempre & solo (IMVVVHO) di scelte del tutto personali &
dipendenti dalla complessita' del progetto.
Popi


Tester "de che"? Per la "mia" o la "tua" soluzione. E poi io non 
"sfrutto" i lavoratori (o presunti tali ;-{) ) e sono disposto a cederla 
solo se @Alex ci mette una buona parola, ma deve essere mooooooolto buona.
Non serve personalizzarla sui tuoi dati e' "all inclusive" solo che si 
ferma per isNull di campo, ma devo finire di testarla e sta in un affare 
molto piu' "grosso".
Cmq su una join 33.000 * 38.0000, 6sec - profondita' 5, ma la 
profondita' e' quasi ininfluente-
-- 
ac (x=y-1)

 ac (x=y-1)
Bruciala....
;-)
@Alex


Ma mi prende fuoco anche il PC! e poi come farei a continuare a 
scrivere, puttanate, in questo NG.
Comunque, immagino leggerai, nascondo in questo post una cosa ignobile 
che mi e' successa, per mia ignoranza immagino, nell'uso di Set / Let e 
tra l'altro la cosa dimostra anche, come spesso sostengo, di non 
"correre" verso soluzioni affrettate.
Avevo questo turpe metodo:
Function Item(pKey)
     On Error Resume Next
     Item = dItems(pKey)
     If Err.Number <> 0 Then
         set Item = dItems(pKey)
     End If
End Function
che usavo da tempo e sembrava funzionare.
Al momento sto facendo girare roba VBScript (ASP) sotto Access (per 
avere un maggior controllo sul debug). In questa roba uso il 
"Dictionary" e ganzo ganzo loco loco provo a "nascondere" una 
connessione ADO ed un Recordset nell'oggetto.
Tutto perfetto. Un solo piccolo problema, quando tento di riutilizzarli 
invece dell'oggetto mi restituisce la StringConnection in un caso e 
l'insieme Fields nell'altro, tutto cio' senza colpo ferire ed ovviamente 
vado al manicomio perche' non c'e' verso di far eseguire query o fare 
movenext, la complicanza sta nel fatto che nidificando, invece, oggetti 
Dictionary tutto scorre (panta rei, per quelli che "anno" studiato).
Conclusione affrettata: "'sto oggetto diccionari e' una chiavica!"
A questo punto faccio un wrapper che usa le collection di cui 
modestamente "lo nacqui" (parafrasando Toto') e mi dico "adesso ti 
sodomizzo io" (in forma meno aulica ovviamente, quasi da politico di grido).
Bene son rimasto sodomizzato! Stesso maledetto comportamento.
Ovviamente a questo punto la soluzione era stesa (dopo sigaretta, 
caffe', peepee, sigaretta e una bottarella di debug) i.e.
Function Item(pKey)
     On Error Resume Next
     set Item = dItems(pKey)
     If Err.Number <> 0 Then
         Item = dItems(pKey)
     End If
End Function
Pero', dico io, porc#@ï¿½"^' ma allora cosa diavolo mi costringi a 
diversificare Set/Let quando poi fai come diavolo ti pare!
-- 
ac (x=y-1)


wrote:

Scusa Alessandro, sto *sicuramente* dicendo una bestialita' immane e
per questo GesuBambino piangera' ma ... non e' che la set ci va solo
se la function restituisce un valore?
Popi

 se la function restituisce un valore?
Che io sappia se la funzione restituisce un oggetto e':
set nomefunzione = oggetto
se la funzione restituisce uno scalare
(let, default) nomefunzione = variabilescalare
Tra l'altro se lo scalare e' un array che contiene oggetti
anche in questo caso e': nomefunzione = array (o matrice che dir si voglia)
Se non gli fai restituire nulla, a parte il fatto che e' meglio una sub, 
immagino restituisca "null" o "empty" se il tipo di restituzione non e' 
dichiarato e quindi -variant-, se e' dichiarato, immagino, dovrebbe 
restituire il default del tipo dichiarato (as boolean = false?)
P.S. Non taglio nulla cosi faccio imbufalire "Bisio".
-- 
ac (x=y-1)

 campo scelto di volta in volta sia risultato di una funzione?
Certo.
Se programmi in ambiente Access puoi scrivere query
di questo tipo :
select ( ... )  from tua_tabella where tua_funzione(c1,c2, ... cn)
dove c1, c2, cn e' un sottoinsieme (proprio o no) di tutti i campi
della tabella.
Oppure puoi usare ADO e creare una query - stringa che
si auto costruisce in funzione delle condizioni di filtro.