Newsgroup: it.comp.lang.visual-basic
Titolo: [ReportMan] Passare parametro a query

Ciao,
sto ancora lottando con Report Man per stampare dei report utilizzando 
VB2008 Express e un db access tramite una connessione via odbc.
Vorrei creare un report facendo una query del tipo
select * from tabella where id= N
dove N è un parametro che vorrei passargli a runtime.
Ho letto il thread di Andrea [Work] e ho provato a passare il parametro 
in questi modi:
select * from tabella where id=:id
select * from tabella where id=@id
select * from tabella where id=?id
ma non mi funziona nessuno dei tre.
Questo è il codice completo che sto usando:
Dim conn As New OdbcConnection("dsn=SMTEST")
conn.Open()
rp.AsyncExecution = False
rp.LoadFromFile("C:\report.rep")
rp.DatabaseInfo(0).Connection = conn
rp.Params("ID_REV_CICLO").Value = 12
Dim prw As New PrintOutWinForms
prw.Preview = True
prw.SystemPreview = False
prw.ShowPrintDialog = False
prw.Print(rp.MetaFile)
Dove nel report ho definito un parametro di tipo intero che si chiama 
id_rev_ciclo.
Sempre nel report ho settato una connessione utilizzando MicrosoftDAO e 
come stringa di connessione uso dsn=SMTEST
Cosa sto sbagliando?
Ho visto che nel post di Andrea lui utilizza anche una
rp.DataInfo("HEADER").SQL
ma di questo non ho trovato traccia nella documentazione, nè ho capito 
come va usata.
Qualcuno mi può aiutare a trovare maggiori dettagli su come si usa 
l'oggetto rp ?
grazie per ogni aiuto, ciao
Mauro

 l'oggetto rp ?
Io semplicemente ho i report creati con un provider di report vecchio che
ha il : come segnaposto, per cui se apro il report, nei datasource devo
usare i : per disegnare il report.
Quando lo uso da .NET gli passo una connessione con provider 
ADO.NET
 per
cui userà gli standard di quel linguaggio per i segnaposto dei parametri.
Per cui se da report ho
- SELECT * FROM TABELLA WHERE ID=:ID
Mi funziona da report, ma se la lancio da .NET con il firebird 
ADO.NET
provider, devo farla diventare
- SELECT * FROM TABELLA WHERE ID=@ID
Per questo ho una routine generica da cui tutti i miei report passano prima
di essre lanciati:
        For Each di As Reportman.Reporting.DataInfo In rp.DataInfo
            di.SQL = di.SQL.Replace(":"c, "@"c)
        Next
Se io disegnassi i report con reportman 2.9, usando come sorgente di dati
già Firebird 
ADO.NET
, sarei obbligato a scrivere subito la @ per far
funzionare il report.
A quel punto passare un parametro è come farlo per una query interna:
rp.Params("IDSEZ").Value = 10
Quindi
1) da report che segnaposto usi?
2) da .net per fare una query cosa usi come segnaposto?
Io una cosa del genere:
    Public Function CancellaRichiesta() As Boolean
        Dim cmd As String
        cmd = "update TAB SET UTENTECANC=@UTENTECANC WHERE ID=@ID"
        Using Cn As FbConnection = GetConnection()
            Dim cmd As New FbCommand(cmd, Cn)
            cmd.Parameters.Add("ID", FbDbType.BigInt)
            cmd.Parameters.Add("UTENTECANC", FbDbType.VarChar)
            cmd.Parameters("ID").Value = 10
            cmd.Parameters("UTENTECANC").Value = "Demo"
            Cn.Open()
            cmd.ExecuteScalar()
            Return True
        End Using
    End Function

 2) da .net per fare una query cosa usi come segnaposto?
nessun segnaposto, mi creo la stringa sql intera a mano.
Faccio un banalissimo (semplifico)
dim sql as string
sql = "select * from cdl where id=" & txtId.text.value
Dim cmd As New OdbcCommand(sql, conn)
reader = cmd.ExecuteReader()
(in realtà il id lo leggo da un menu a tendina che contiene solo gli id 
validi)
grazie, ciao
Mauro

ciao,
aggiungo alcune info.
Ho fatto molto debug e ho visto che il parametro viene correttamente 
passato all'oggetto report, ma non viene sostituito nella query.
Mi spiego meglio.
Se io faccio
MsgBox("Param:" & rp.Params(0).Value.ToString())
MsgBox("Sql: " & rp.DataInfo(0).SQL.ToString)
rp.Params("ID_REV_CICLO").Value = 12
MsgBox("Param:" & rp.Params(0).Value.ToString())
MsgBox("Sql: " & rp.DataInfo(0).SQL.ToString)
Ottengo
Param: 64 (che è il valore di default impostato nel report)
Sql: select * from cdl where id_rev_ciclo=@ID_REV_CICLO
e poi
Param: 12
Sql: select * from cdl where id_rev_ciclo=@ID_REV_CICLO
è come se il parametro non venisse sostituito nella query, non è che 
devo settare qualcosa quando creo il report per dire che il parametro va 
sostituito con il suo valore?
Nella maschera di creazione del parametro da Report Designer ho settato 
"assegna ai dataset" indicando il dataseti giusto ... ma non cambia niente.
C'e forse qualche altro parametro che sto dimenticando?
ciao
Mauro

 validi)
Beh se è così per forza non sai come fare.
Prova con i parametri a fare una query che ti ho detto, vedi se serve @ o ?
o altro.
Prima vedi di capire come dovresti fare da .NET senza report nel mezzo, poi
da quello provi ad applicare lo stesso concetto alla stringa sul report.

 C'e forse qualche altro parametro che sto dimenticando?
Al limite se non riesci, e si tratta di parametri fissi, puoi ributtargli
tutta la query "compilata".
Cioč che tu faccia
SELECT * FROM TABELLA WHERE ID=@ID
Param("ID").Value=5
Oppure:
rp.DataInfo(x).SQL= "SELECT * FROM TABELLA WHERE ID=5"
Alla fine cambia ben poco per il report.

 da quello provi ad applicare lo stesso concetto alla stringa sul report.
OK, grazie mille, ce l'ho fatta.
Posto la soluzione se dovesse servire ad altri.
Se si utilizza come connessione al db il provider ODBC i parametri vanno 
indicati con il ? *senza alcun nome dopo*
Quindi nella definizione del dataset del report si scrive
select * from tabella where id=?
Poi sempre nel dataset vanno aggiunti tanti parametri quanti ne servono 
e vanno definiti nell'ordine in cui compaiono nella query altrimenti non 
funziona niente.
Questo perchč in odbc i parametri sono identificati dalla loro posizione 
e non da un nome ( bleah :-( )
Infine per passargli il valore da codice si usa come sempre la
rp.Params("NOME_PARAM").Value = "xyz"
l'ordine in cui si valorizzano i parametri nel codice non č importante, 
lo č solo quello in cui sono stati definiti nel report.
grazie infinite ad Andrea per l'aiuto !!!
ciao
Mauro

 rp.DataInfo(x).SQL= "SELECT * FROM TABELLA WHERE ID=5"
Infatti, avevo fatto anche una prova in questo modo e funzionava, ma in 
certi casi non volevo riscrivere tutta la query e volevo capire come gli 
si passano i parametri.
Grazie al tuo aiuto ci sono riuscito come vedi nell'altro post :-)
ciao
Mauro

 select * from tabella where id=?
Infatti mi pareva ci fosse qualcosa del genere su access (diciamo odbc).
Ma non è possibile usare access col provider normale 
ADO.NET
?

 Ma non è possibile usare access col provider normale 
ADO.NET
?
Credo di si, ma non ne sono sicuro, io ho fatto le prove solo con odbc.