Newsgroup: it.comp.lang.visual-basic
Titolo: sql complicato...

allora, premessa.
ho diversi indici finanziari che variano indipendentemente tra loro
con una frequenza
non periodica.
nello schemino qui sotto (spero si legga, usate per favore un
carattere a spaziatura fissa)
ho tre di questi indici, le date di variazione sono indicate con -var,
l'asse dei tempi scorre dall'alto verso il basso:
Ind01   Ind02   Ind03    Variazioni
  10      9       11
  |       |       |          |
  |       |       |          |
  |       -var....|..........- var di Ind02 (A)
  |       8       |          |
  |       |       |          |
  -var....|.......|..........- var di Ind01 (B)
  11      |       |          |
  |       -var....|..........- var di Ind02 (C)
  |       12      |          |
  |       |       |          |
  -var....|.......|..........- var di Ind01 (D)
  10,5    |       |          |
  |       |       -var.......- var di Ind03 (E)
  |       |       12,5       |
  |       |       |          |
  ---------------------------- <-- DataControllo
  |       |       |          |
  |       |       -var.......- var di Ind03 (F)
  |       |       9          |
  -var....|.......|..........- var di Ind01 (G)
  13      |       |          |
  |       |       |          |
  |       |       |          |
 
come vedete tutte le date di variazione vengono raccolte in un'unica
tabella che qui 
chiamiamo Variazioni (che poi e' l'unica tabella di cui in realta'
dispongo), dove c'e' 
la data di variazione e il valore che l'indice ha assunto a quella
data. 
vedete anche che c'e' una cosiddetta DataControllo (che pero' *non*
sta nella
tabella Variazioni).
il mio problema e' che mi servirebbe *una* query sql con cui trovare,
in questo caso, (C), 
ovvero (reggetevi forte) la minore tra tutte le maggiori date di
variazione per ogni indice
che siano anteriori o uguali a DataControllo.
in sostanza, alla data di DataControllo, Ind01 valeva il valore che ha
assunto in data (D),
Ind02 valeva il valore che ha assunto in data (C), Ind03 valeva il
valore che ha assunto
alla data (E).
a me serve (C).  perche' mi serve (C)?  mi serve per beccare la data
di Variazioni 
da cui prendere le date di variazione "interlacciate" e vedere, da
DataControllo in poi, 
per ogni "variazione interlacciata" (ovvero per (F), (G), ecc.), qual
era l'indice di
valore piu' alto.
ad esempio, alla data DataControllo Ind01 valeva 10,5, Ind02 valeva
12, Ind03 valeva 12,5,
bene, prendero' Ind03=12,5 e lo applichero' come tasso di interesse
nel periodo che va
da DataControllo fino alla data di variazione successiva, in questo
esempio (F).  
in data (F) Ind03 cala a 9, il maggiore diventa Ind02 che vale 12,
bene, prendo Ind02 
per calcolare l'interesse fino alla data (G), data in cui Ind01 balza
a 13.  
allora prendo Ind01 come tasso di interesse, ecc. ecc.
se mi servissero le date a partire da (E) ovviamente scriverei:
  SELECT * 
    FROM Variazioni
   WHERE DataVar >= (SELECT MAX(DataVar)
                       FROM Variazioni
                      WHERE DataVar <= DataControllo)
ORDER BY DataVar
ovvero, 
1. prendo tutte le DataVar minori o uguali a DataControllo;
2. ne prendo la maggiore;
3. uso questa data "maggiore" come "punto di partenza"
   per la select "esterna"
pero' in questo caso come farei a sapere quanto valevano Ind01 e
Ind02?
altra complicazione: qui so che ho tre indici, ma potrei averne in
numero indefinito.
ad occhio quello che faro' sara' crearmi un recordset per ogni indice,
prendere la
maggiore delle minori ecc., vedere tra queste qual e' la minore, ma se
ci fosse un modo
per farlo con una unica query sarebbe meglio.
grazie e ovviamente se servono chiarimenti chiedete pure!
en passant, sono davvero l'unico che allinea a destra le clausole SQL?
per me il codice
risulta molto piu' leggibile...
======================================================
my opinions do not necessarily have to be true.
======================================================
per rispondermi rimuovere NOSPAM. dall'indirizzo email
to answer me remove NOSPAM. from email address
======================================================

Ciao, scusa se non riporto il tuo post.
Perche' vuoi scrivere la query in sql?
Se la scrivi utilizzando l'interfaccia grafica di access al limite te la
puoi sempre leggere cambiando visualizzazione.
Volevo chiederti questo:
Nell'indice controllo che hai detto ci sono tutti gli indici che vuoi
confrontare per trovare il minore?
Se si puoi farli apparire in 3 caselle di testo all'interno di una
maschera chamandole I1, I2 ed I3.
Crei una casella chiamata Valore e poi scrivi una piccola funzioncina VB
del tipo:
private function Minore(dim A, B, C as long)
 if (A<B)and(B<C) then Minore=A
 .....
end funcion
poi assegni con l'evento su attivato di Valore il Minore fra i 3 cosi:
Valore = me.Minore(I1, I2, I3)
Non sono sicuro della sintassi perche' non l'ho scritto con il VB di
access quindi ci saranno degli errori, davanti agli identificativi ci
vorra' me. e magari invece di private dovranno essere public pero'
dovrebbe andare.
Ciao

confrontare per trovare il minore?
no, e' un po' piu' complicato.  diciamo che io ti ho prestato dei
soldi, e ti applico un certo interesse man mano che il tempo passa.
diciamo che prendo prendo il tasso ufficiale di sconto, un indice
basato sull'andamento dei bot e uno basato su, dico per dire, il tasso
ufficiale di sconto in Norvegia.
ogni volta che uno qualsiasi degli indici varia vedo qual e' il
maggiore e fino alla prossima variazione di uno qualsiasi degli indici
ti applico quell'interesse.
tutto cio' si ricava in maniera facile, il problema era sulle date.
l'ho risolto come avevo anticipato, e cioe' creando un recordset con
le date di ogni indice e vedendo quale era la minore tra quelle dei
periodi che avrei applicato alla data di scadenza.
era una questione molto intorcinata...
avrei preferito non creare sti recordset vaganti perche' il
capoprogetto non si convince che poi si distruggono e magari crede che
continuano ad occupare memoria.  e' un bravo collega ma ha le sue
fissazioni, come quelle delle variabili globali... ma adesso che e' in
ferie gliele tolgo tutte, ah ah ah!...  :-)
