Newsgroup: it.comp.lang.visual-basic
Titolo: Datareport e DataEnvironment

Ho un recordset gerarchico definito in DataEnvironment mediante il quale
creo una stampa. Il primo command si riferisce alla tabella clienti e il
command secondario agli ordini. Se voglio filtrare i clienti faccio cosi:
 DataEnvironment1.rsClienti.Filter = "ID_Cliente = 1"
 DataReport1.Show
e quindi ottengo solo gli ordini del cliente 1
ma se voglio ottenere solo gli ordini del cliente 1 in data 01/01/01 come
faccio?
DataEnvironment1.rsClienti("Ordini").Filter = "01/01/01" non si puo' fare
allora come faccio?
Grazie.

 wrote in message
news:9gkmb8$59t$1...@nreadA.inwind.it...

Ti consiglio di dare un'occhiata al post del 14/06 subject
DataEnvironement....
Io ho implementato una cosa simile via codice (come spiegato nel post in
questione), tenendo conto che, nel caso di comandi gerarchici, la sintassi
associata al Command primario e' la seguente:
"SHAPE {SELECT Field1, Field2, .., Fieldn FROM Tabella/e WHERE Condition1
AND/OR.. Conditionn} AS cmdCommand APPEND ({SELECT Field1, Field2, ..,
Fieldn FROM Tabella/e WHERE Condition1 AND/OR.. Conditionn}  AS
cmdSecondaryCommand RELATE 'Field1' TO 'Field2') AS cmdSecondaryCommand"
Ovviamente, Field1 e Field2 nella clausola RELATE sono i campi dei due
comandi che li mettono in relazione fra loro. Spero che cio' possa esserti
utile.
A tua disposizione per eventuali altri chiarimenti
Ciao!
--
Massimo Fauro

Caro Massimo, prima di tutto grazie per la risposta. A me pero' interessa
sapere come filtrare a runtime i records dell'oggetto command secondario.
Cioe' come fare a ottenere solo gli ordini del "01/01/01" ?
La struttura gerarchica e' questa:
    CLIENTI
        ID_Cliente
        Nome
          ORDINI
                ID_Cliente
                Data
                ID_Prodotto
                Qta
Dovrei tirar fuori solo gli ordini del cliente 1 in data "01/01/01".
Spero di essermi spiegato bene.
Grazie.

 wrote in message
news:9gkpc1$ohs$1...@nreadB.inwind.it...
...
Mmmm, a meno che non si tratti di un errore di sintassi nella scrittura
della data assegnata al filtro, non saprei cosa dirti. La soluzione via
codice che dicevo io ti permette di bypassare le varie proprieta' degli
oggetti command e recordset, con un grado di difficolta' un pochino maggiore
in quanto dovresti costruire la stringa di query nel codice. Almeno, io ho
fatto cosi', ma non e' assolutamente detto che sia la soluzione ottimale...
Curiosita': come mai non puoi fare
DataEnvironment1.rsClienti("Ordini").Filter = "01/01/01" ? Ti da' qualche
errore particolare oppure il filtro si rifiuta di ... filtrare?
--
Massimo Fauro

 errore particolare oppure il filtro si rifiuta di ... filtrare?
mi dice che non esiste "il metodo o il membro dei dati", il che è giusto
perchè VB si aspetta che rsClienti("Ordini") sia un riferimento a un campo e
non a un recordset.
Quindi secondo te non mi rimane altro che modificare la proprietà .Source
del recordset rsClienti ?

Giusto, hai ragione, Filter si applica ai recordset. Leggendo un po' di
documentazione, mi sembra che si possa fare un tentativo.
Ad esempio. Tu fai
DataEnvironment1.rsClienti.Filter = "ID_Cliente = 1"
DataReport1.Show
Perche' prima di DataReport1.Show non provi a impostare anche il filtro per
rsOrdini? Cioe':
DataEnvironment1.rsOrdini.Filter = "Data= #01/01/01#" '(occhio alla sintassi
delle date, non mi ricordo se questa e' esatta...)
DataEnvironment1.rsClienti.Filter = "ID_Cliente = 1"
DataReport1.Show
Se non dovesse funzionare, potrebbe essere necessario invertire l'ordine
dell'assegnazione dei filtri (puo' darsi che tu abbia accesso al recordset
Ordini solo dopo aver filtrato quello Clienti, cosi' come potrebbe darsi che
tu non abbia per niente accesso al recordset Ordini, dal momento che si
tratta di recordset gerarchici). Fai questa prova e fammi sapere (anche
direttamente sulla mia mail, poi postiamo solo il risultato definitivo e
funzionante ad uso degli altri del NG)...
--
Massimo Fauro

Mi sa di aver detto una bischerata: non credo che tu possa avere accesso al
recordset Ordini da codice. Se cosi' fosse, prova a implemetare in un
progettino di prova il seguente codice per recuperare l'indice del command
Clienti nell'insieme Command:
Dim nInteger as Integer
            nInteger = -1
            For i = 1 To DE.Commands.Count
                If DataEnvironment1.Commands.Item(i).Name = "Clienti" Then
                    nInteger = i
                End If
            Next i
Dopo di che prova a vedere se puoi accedere al comando Ordini attraverso
DataEnvironment1.Commands.Item(nInteger).qualcheproprieta_o_metodo
Altrimenti, la via piu' sicura e' che tu faccia tutto da codice, come nei
precedenti posts cui ho fatto cenno all'inizio...
Ciao!
--
Massimo Fauro

Caro Massimo, HO RISOLTO.
La soluzione che ho trovato e' questa:
Nella finestra di progettazione DataEnvironment ho creato due parametri
'DataIniziale' e 'DataFinale' da passare a rsClienti; poi ho definito il
recordset secondario con la seguente stringa sql 'Select * from Ordini Where
DataOrdine >= DataInizio and DataOrdine <= DataFine' e quindi si sono creati
in automatico altri due parametri per questo recordset secondario; fra le
relazioni ho quindi inserito oltre a ID_Cliente anche 'DataIniziale TO
DataInizio' e 'DataFinale TO DataFine'.
A questo punto e' tutto pronto. Per aprire il report faccio così:
DataEnvironment1.Clienti "01/01/01" "02/01/01"         'passo i due
parametri al recordset primario
DataEnvironment1.rsClienti.Filter = "ID_Cliente = 1"   'filtro solo i
clienti che mi servono
DataReport1.Show
e funziona tutto a meraviglia!
Adesso che mi trovo inserisco anche un parametro per il codice cliente e
faccio tutto con una sola istruzione.
Spero che la nostra discussione sia di aiuto a molti.
Ciao Massimo e grazie.

 wrote in message
news:9gl3ta$cjm$1...@nreadA.inwind.it...
....
Bella mossa, Luciano! E' un'ottima alternativa allo scivere la stringa di
query da codice... Ho gia' in mente qualche modifica al mio precedente
progettino...
Grazie a te!
--
Massimo Fauro