879 messaggi dal 09 luglio 2002
www.i-studio.it
Ciao,
nella tua pagina ASP non ti serve aprire una connessione ed eseguire la query, perche' quello e' il sistema che usi nelle pagine ASP per accedere al DB e prendere i dati che ti servono. Invece, nel tuo caso, tu devi aprire una connessione con il report e dire al report di eseguire una determinata query al posto di quella "standard" che hai "scolpito" all'interno quando l'hai creato.
Guardando un codice che ho fatto un po' di tempo fa, ho visto che c'e' una parte che nella tua pagina manca:
For inttable = 1 To session("oRpt").Database.Tables.Count
Set CryTable = session("oRpt").Database.Tables.Item(CInt(inttable))
CryTable.SetLogOnInfo nome_server ," ",nome_utente ,password
Next

dove "nome_server" e' il nome dell'elemento che hai nel file TNSNAMES.ORA che punta all'istanza del tuo DB.

Questa parte deve essere inserita dopo l'apertura del report:
Set session("oRpt") = session("oApp").OpenReport(reportname, 1)

che credo tu abbia nel file "AlwaysRequiredSteps.asp" che viene incluso nella tua pagina.
Apri questo file, vedi se hai l'istruzione per l'apertura del report. Se e' cosi', dopo l'include, metti il codice che ti ho indicato. Dopodiche', elimina queste righe:
StrConnection = "DSN=miao;UID=miao;PWD=miao;" 
Set oADOConnection = Server.CreateObject("ADODB.Connection") 
oADOConnection.Open StrConnection 

Set oADORecordset = Server.CreateObject("ADODB.Recordset") 
strSQL = Request("strSQL") 'query parametrizzata 
Set oADORecordset = oADOConnection.Execute(strSQL)

che non servono e usa solo la riga:
session("oRpt").SQLQueryString = Request("strSQL")

per passare al report la nuova query.

Vedi un po' se funziona..

Ciao
Alex

Internetworking Studio Srl
www.i-studio.it
576 messaggi dal 30 aprile 2003
Ciao Alex,
ora provo e poi ti faccio sapere!

Comunque vada... grazie mille

Prima o poi diventerò un guru!
576 messaggi dal 30 aprile 2003
Niente da fare... mi viene da piangere
Ti riscrivo la pagina, dovrei avere fatto come dici te (nome_server è il DSN del mio database, giusto?)
Ah, il parametro strSQL (la query) mi arriva correttamente alla pagina... non è quello il problema

<%@ LANGUAGE="VBSCRIPT" %>

<%
'===================================================================================
' WORKING WITH THE REPORT DESIGNER COMPONENT AND ASP TO SET A REPORT'S QUERY STRING
'===================================================================================
'
' CONCEPT                                                             
'                                                                     
'  ALWAYS REQUIRED STEPS (contained in AlwaysRequiredSteps.asp)
'   - create the application object                                
'   - create the report object                                     
'   - open the report                                              
'
'  SETTING A REPORT'S QUERY STRING
'   - access and set the report's SQLQueryString property
'
'  MORE ALWAYS REQUIRED STEPS (contained in MoreRequiredSteps.asp)
'   - retreive the records                                         
'   - create the page engine 
'
'  DISPLAY THE REPORT
'   - display the report using a smart viewer
'==================================================================
%>

<%
' This line creates a string variable called reportname that we will use to pass
' the Crystal Report filename (.rpt file) to the OpenReport method contained in 
' the AlwaysRequiredSteps.asp.

reportname = "rptFaxInviati.rpt"
%>

<%
'==================================================================
' ALWAYS REQUIRED STEPS
'
' Include the file AlwaysRequiredSteps.asp which contains the code    
' for steps:
'   - create the application object
'   - create the report object
'   - open the report
'==================================================================
%>                                                                     
<!-- #include file="AlwaysRequiredSteps.asp" -->                       

<%
'==================================================================
' SETTING A REPORT'S SQL QUERY STRING
'==================================================================
For inttable = 1 To Session("oRpt").Database.Tables.Count 
  Set CryTable = Session("oRpt").Database.Tables.Item(CInt(inttable)) 
  CryTable.SetLogOnInfo nome_server," ",user,password 
Next

Session("oRpt").SQLQueryString = Request("strSQL")
'This line of code sets the SQLQueryString property to the value of 
'the string variable NewQueryString.
%>

<%
'==================================================================
'
'  MORE ALWAYS REQUIRED STEPS
'
'  Include the file MoreRequiredSteps.asp which contains the code
'  for the steps:
'   - retreive the records                                         
'   - create the page engine                                       
'   - create the smart viewer and point it to rptserver.asp
'
'==================================================================
%>
<!-- #include file="MoreRequiredSteps.asp" -->

<%
' INSTANTIATE THE REPORT VIEWER
'
'When using the Crystal Reports in an ASP environment, we use
'the same page-on-demand Report Viewers used with the Crystal Web Component Server.
'There are six Report Viewers:
'
'1.  Report Viewer for ActiveX
'2.  Report Viewer for Java using Browser JVM
'3.  Report Viewer for Standard HTML with Frames
'4.  Report Viewer for Standard HTML
'5.  Report Viewer for Java Using Java Plugin
'6.  Report Viewer for Netscape Plug-in (ActiveX)
'
'The Report Viewer that you use will based on the browser's display capablities.
'For Example, you would not want to instantiate one of the Java viewers if the browser
'did not support Java applets.  For purposes on this demo, we have chosen to
'define a viewer.  You can through code determine the support capabilities of
'the requesting browser.  However that functionality is inherent in the Crystal
'Reports RDC and is beyond the scope of this demonstration application.
'
'We have chosen to leverage the server side include functionality of ASP
'for simplicity sake.  So you can use the SmartViewer*.asp files to instantiate
'the smart viewer that you wish to send to the browser.  Simply replace the line
'below with the Smart Viewer asp file you wish to use.
'
'The choices are SmartViewerActiveX.asp, SmartViewerJava.asp, JavaPluginViewer.asp,
'ActiveXPluginViewer.asp. SmartViewerHTMLFrame.asp, and SmartViewerHTMLPAge.asp.
'Note that to use this include you must have the appropriate .asp file in the 
'same virtual directory as the main ASP page.
'
'*NOTE* For SmartViewerHTMLFrame and SmartViewerHTMLPage, you must also have
'the files framepage.asp and toolbar.asp in your virtual directory.


'=============================================================================
'  DISPLAY THE REPORT
'   - display the report using a smart viewer
' 
' Include one of the Smart Viewers.
'  - Report Viewer for ActiveX      =   SmartViewerActiveX.asp
'  - Report Viewer for Java using Browser JVM  =   SmartViewerJAVA.asp
'  - Report Viewer for Standard HTML    =   SmartViewerHTMLPage.asp
'  - Report Viewer for Standard HTML w/ Frames  =   SmartViewerHTMLFrame.asp
'  - Report Viewer for Java Using Java Plugin  =   JavaPluginViewer.asp
'  - Report Viewer for Netscape Plug-in    =   ActiveXPluginViewer.asp
'=============================================================================
%>
<!-- #include file="SmartVieweractivex.asp" -->

Prima o poi diventerò un guru!
576 messaggi dal 30 aprile 2003
Questo è il codice della pagina AlwaysRequiredSteps.asp, se può aiutarti a capire meglio:

<%
'===================================================================================
'Create the Crystal Reports Objects
'===================================================================================
'
'You will notice that the Crystal Reports objects are scoped as session variables.
'This is because the page on demand processing is performed by a prewritten
'ASP page called "rptserver.asp".  In order to allow rptserver.asp easy access 
'to the Crystal Report objects, we scope them as session variables.  That way
'any ASP page running in this session, including rptserver.asp, can use them.


' CREATE THE APPLICATION OBJECT                                                                     
If Not IsObject (session("oApp")) Then                              
  Set session("oApp") = Server.CreateObject("CrystalRuntime.Application")
End If                                                               

'This "if/end if" structure is used to create the Crystal Reports Application
'object only once per session.  Creating the application object - session("oApp")
'loads the Crystal Report Design Component automation server (craxdrt.dll) into memory.
'
'We create it as a session variable in order to use it for the duration of the
'ASP session.  This is to elimainate the overhead of loading and unloading the
'craxdrt.dll in and out of memory.  Once the application object is created in
'memory for this session, you can run many reports without having to recreate it.
                                                                      
' CREATE THE REPORT OBJECT                                     
'                                                                     
'The Report object is created by calling the Application object's OpenReport method.

Path = Request.ServerVariables("PATH_TRANSLATED")                     
While (Right(Path, 1) <> "\" And Len(Path) <> 0)                      
iLen = Len(Path) - 1                                                  
Path = Left(Path, iLen)                                               
Wend                                                                  
                                                                      
'This "While/Wend" loop is used to determine the physical path (eg: C:\) to the 
'Crystal Report file by translating the URL virtual path (eg: http://Domain/Dir)                                                                        

'OPEN THE REPORT (but destroy any previous one first)                                                     

If IsObject(session("oRpt")) then
  Set session("oRpt") = nothing
End if

On error resume next

Set session("oRpt") = session("oApp").OpenReport(path & reportname, 1)
'This line uses the "PATH" and "reportname" variables to reference the Crystal
'Report file, and open it up for processing.

If Err.Number <> 0 Then
  Response.Write "Error Occurred creating Report Object: " & Err.Description
  Set Session("oRpt") = nothing
  Set Session("oApp") = nothing
  Session.Abandon
  Response.End
End If

'This On error resume next block checks for any errors on creating the report object
'we are specifically trapping for an error if we try to surpass the maximum concurrent
'users defined by the license agreement.  By destroying the application and report objects
'on failure we ensure that this client session will be able to run reports when a license is free

'
'Notice that we do not create the report object only once.  This is because
'within an ASP session, you may want to process more than one report.  The
'rptserver.asp component will only process a report object named session("oRpt").
'Therefor, if you wish to process more than one report in an ASP session, you
'must open that report by creating a new session("oRpt") object.

session("oRpt").MorePrintEngineErrorMessages = False
session("oRpt").EnableParameterPrompting = False
'session("oRpt").DiscardSavedData

'These lines disable the Error reporting mechanism included the built into the
'Crystal Report Design Component automation server (craxdrt.dll).
'This is done for two reasons:
'1.  The print engine is executed on the Web Server, so any error messages
'    will be displayed there.  If an error is reported on the web server, the
'    print engine will stop processing and you application will "hang".
'
'2.  This ASP page and rptserver.asp have some error handling logic desinged
'    to trap any non-fatal errors (such as failed database connectivity) and
'    display them to the client browser.
'
'**IMPORTANT**  Even though we disable the extended error messaging of the engine
'fatal errors can cause an error dialog to be displayed on the Web Server machine.
'For this reason we reccomend that you set the "Allow Service to Interact with Desktop"
'option on the "World Wide Web Publishing" service (IIS service).  That way if your ASP
'application freezes you will be able to view the error dialog (if one is displayed).
%>

Prima o poi diventerò un guru!
879 messaggi dal 09 luglio 2002
www.i-studio.it
Ma esattamente cosa succede? Ti estrae tutti i record e non applica il filtro che gli passi?
Se mi ricordo bene, la stringa che passi con il "SQLQueryString" deve essere UGUALE a quella che hai indicato nel report.
Nella versione che usavamo noi (mi pare la 7) facevamo in questo modo:
all'interno del report c'era un modo per leggere la stringa SQL che veniva usata all'interno. Prendevamo la stringa e facevamo un "copia-incolla" dentro la pagina ASP. L'unica cosa che andavamo a sostituire era il parametro.
Se ad esempio nel report c'era una cosa del genere:
select * from tabella where id=1

noi, nella pagina ASP scrivevamo cosi':
"select * from tabella where id=" & parametro

dove "parametro" conteneva un valore che cambiava a seconda del tipo di dati che volevi vedere.
Quindi, nel tuo caso, prova a fare in questo modo: nel report inserisci una query che contenga gia' i filtri (usa dei parametri di prova).
Poi, nella pagina ASP, cerca di ricreare la query cosi' come e' nel report ma con il parametro diverso.

Ciao
Alex

Internetworking Studio Srl
www.i-studio.it
576 messaggi dal 30 aprile 2003
Si, mi estrae tutti i record incondizionatamente.

La mia query ASP contiene una SELECT * (con l'asterisco), mentre nel record, se clicco su "visualizza SQL", vengono elencati i nomi di tutti i campi. Forse questo può causare problemi? Devo espressamente elencare i nomi dei campi anche nella pagina ASP?

In ogni caso, la cosa strana è che mi "ignora" le istruzioni in ASP: ad esempio, nel codice che mi hai detto di inserire

For inttable = 1 To Session("oRpt").Database.Tables.Count 
  Set CryTable = Session("oRpt").Database.Tables.Item(CInt(inttable)) 
  CryTable.SetLogOnInfo alias," ",user,pwd 
Next


se inserisco uno user o una password sbagliata, non mi da errore... è proprio come se ignorasse questi comandi.
Strano, nevvero?

Prima o poi diventerò un guru!
879 messaggi dal 09 luglio 2002
www.i-studio.it
Per il fatto di usare l'asterisco al posto dei campi, si, ti consiglio di usare la stessa sintassi.

Per quanto riguarda l'altro problema, ho la sensazione che si verifichi da qualche parte un errore e non te lo mostra perche' c'e' un "on error resume next" da qualche parte...
Ho ragione? Se c'e', commentalo e vedi se ti restituisce un errore.

Un'altra cosa. Noi usavamo una connessione "diretta" a Oracle, senza usare l'ODBC. Non so se questo puo' aiutarti...

Ciao
Alex

Internetworking Studio Srl
www.i-studio.it
576 messaggi dal 30 aprile 2003
Ho provato a fare delle prove, modificando la mia query in ASP...
... viene ignorata completamente, qualsiasi cosa scrivo... anche se ci metto degli errori (campi inesistenti, errori di sintassi SQL) la ignora, non mi da nemmeno errore.

Il problema quindi è che fallisce la connessione al Report?!?
Ma la connessione al Report dove viene effettuata, in quel ciclo FOR che mi hai detto di inserire? (ignora anche quello)

Prima o poi diventerò un guru!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.