2016-06-08 27 views
6

Ho utilizzato la procedura memorizzata con parametri sql con il mio report principale che funziona.Report Crystal con sottoreport collegato che funziona solo su Anteprima report

enter image description here

mia stored procedure per il mio rapporto principale enter image description here

poi ho cercato di aggiungere subreport all'interno del rapporto di lavoro con la seguente stored procedure

enter image description here

quindi collegare campo Subreport parametri per il mio principale

enter image description here

ho controllato il principale Anteprima di report se subreport stanno lavorando

enter image description here

Poi ho eseguito la relazione, ma tutto quello che vedo è questa enter image description here appena bloccato in questo messaggio e continuò a correre, Attendo persino ore e controllo se il task manager ha bloccato il report, ma no. Inoltre non ha alcun messaggio di errore. Ma per chiudere il rapporto in esecuzione devo "Termina processo" nel Task Manager.

così ho provato a rimuovere i parametri di campo dal rapporto secondario, nonché i collegamenti e rieseguire il rapporto.

enter image description here

si sta lavorando, ma è inutile avere un rapporto senza passare i valori dalla relazione principale. perché ho un intervallo di date in esso. Quello che sembra essere il problema? Perché è rimasto bloccato sul caricamento del rapporto quando collego i parametri?

per ulteriori informazioni che sto utilizzando SAP Crystal Report Service Pack 16, e IDE come Visual Studio 2015

e questo è il codice che ho usato per i valori di get/set per i parametri sulla relazione principale

private void SalesByRangeReport_Load(object sender, EventArgs e) 
    { 

     FormBorderStyle = FormBorderStyle.Sizable; 

     WindowState = FormWindowState.Maximized; 

     TopMost = true; 

     DataTable dtSalesByRangeReport = GetData(); 

     showReport(dtSalesByRangeReport); 
    } 

    private void showReport(DataTable dtSalesByRangeReport) 
    { 
     ReportDocument rdoc = new ReportDocument(); 

     //rdoc.Load(@"Report\SalesByRangeReport.rpt"); 

     rdoc.Load(AppDomain.CurrentDomain.BaseDirectory + @"Report\SalesByRangeReport.rpt"); 
     rdoc.SetDataSource(dtSalesByRangeReport); 

     TextObject txt; 
     if (rdoc.ReportDefinition.ReportObjects["test"] != null) 
     { 
      txt = (TextObject)rdoc.ReportDefinition.ReportObjects["test"]; 
      txt.Text = "From :" + StartDate.ToString(" MMMM dd yyyy hh :mm") + " To :" + EndDate.ToString(" MMMM dd yyyy hh :mm"); 
     } 

     SalesByRangeCystalReport.ReportSource = rdoc; 
    } 


private DataTable GetData() 
    { 
     DataTable dtData = new DataTable(); 

     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CSPOSWare.Reports.Properties.Settings.fpos_chaplinConnectionString"].ConnectionString)) 
     { 

      //TODO Mark and Reni : Create a Stored Procedure, Saved in SalesByRangeReport.txt 

      using (SqlCommand cmd = new SqlCommand("usp_ReportShowSalesRangeDateTime", conn)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 

       conn.Open(); 

       //cmd.Parameters.AddWithValue("@TopInt", this.TopInt); 
       cmd.Parameters.AddWithValue("@SortType", this.SortType); 
       cmd.Parameters.AddWithValue("@StartDate", this.StartDate); 
       cmd.Parameters.AddWithValue("@EndDate", this.EndDate); 
       cmd.Parameters.AddWithValue("@DeptGroup", this.DeptGroup); 
       cmd.Parameters.AddWithValue("@DateType", this.DateType); 

       //Console.WriteLine("Start Date" + StartDate); 

       SqlDataReader rdr = cmd.ExecuteReader(); 

       dtData.Load(rdr); 
      } 

     } 


     return dtData; 
    } 

ed entrambi della mia relazione hanno queste proprietà:

Build Action: Compile 
Copy to Output Directory: Copy Always 
Custom Tool: 
Custom Tool Name: 

Così ho provato AGGIUNTO OPTIMIZE FOR UNKNOWN sia sul mio principale SP e SUB SP PRINCIPALE:

ALTER PROCEDURE[dbo].[usp_ReportShowSalesRangeDateTime] 
     (       
      @SortType  Varchar(50), 
      @StartDate DATETIME, 
      @EndDate  DATETIME, 
      @DeptGroup Varchar(50), 
      @DateType  Varchar(50) 
     ) 
     AS 
    BEGIN 
     Declare @SQLQuery NVARCHAR(max) 
     Declare @ReportCriteria NVARCHAR(max) 
     If (LEN(@DeptGroup) > 0) 
      Set @ReportCriteria = ' AND B.Department = ''' + @DeptGroup + ''''; 
     If (LEN(@DeptGroup) = 0) 
     Set @ReportCriteria = ' '; 

      WITH SalesRange AS(
         Select A.EndDate as [Log Date], A.StoreDate as [Store Date], B.Department as [Department], B.Quantity as [Quantity], 
         isnull(C.Amount,0) as [Discount], B.AmountDue as [AmountDue],round(B.BasePrice*1.12,4) as [Gross Sales], 
         B.BasePrice + isnull(vsa.Tax,0) as [BasePrice], 
         case when vsa.type = 0 then isnull(vsa.Amount,0) else 0.0000 end As [VAT Sales Amount], 
         case when vsa.type = 1 then isnull(vsa.Amount,0) else 0.0000 end As [VAT Exempt Sales Amount], 
         B.ServiceCharge as [ServiceCharge], isnull(vsa.Tax,0) As [VAT Sales Tax], 
         case when D.[Type] = 0 Then D.Tax Else 0 End As [Tax], 
         case when T.MediaIndex = 4 then T.Amount else 0 End As [GiftCert], 
         case when T.MediaIndex = 4 then 1 else 0 End As [GCCount] 
         FROM CSSaleItem B WITH(NOLOCK) 
         LEFT JOIN CSSaleItemDiscount C WITH(NOLOCK) ON B.CSSaleItemID = C.CSSaleItemID 
         LEFT JOIN CSSale A WITH(NOLOCK) ON A.CSSaleID = B.CSSaleID 
         LEFT JOIN CSSaleItemTax D WITH(NOLOCK) ON B.CSSaleItemID = D.CSSaleItemID 
         LEFT JOIN (Select CSSaleItemID, Amount, Tax, [Type] From CSSaleItemTax WITH(NOLOCK) Where [Type] = 0) As vsa ON vsa.CSSaleItemID = B.CSSaleItemID 
         LEFT JOIN CSSaleTender T WITH(NOLOCK) ON T.CSSaleID = A.CSSaleID 
         Where StoreDate BETWEEN convert(VARCHAR,@StartDate) AND convert(VARCHAR,@EndDate) and a.RefundStoreDate IS NULL 
         ) 
         SELECT [Department], sum([Quantity]) as [Quantity], SUM([Tax]) as [Tax] , sum([Discount]) as [Discount], 
         sum(([Gross Sales]+[ServiceCharge])) as [Gross Sales], sum(([BasePrice]+[ServiceCharge]-[Discount])) As [Net Sales], 
         sum(([BasePrice]+[ServiceCharge]-[Discount]))/ 
         (Select sum(NetSales) FROM CSSale B LEFT JOIN (select csSaleID, Department from CSSaleItem WITH(NOLOCK) group by Department, CSSALEID) AS A On A.CSSaleID = B. CSSaleID 
          Where StoreDate BETWEEN convert(VARCHAR,@StartDate) AND convert(VARCHAR,@EndDate) and RefundStoreDate IS NULL)*100 as [% Total], 
         sum([GiftCert]) as [Gift Cert Total], sum([ServiceCharge]) as [Service Charge], sum([GCCount]) as [GCCountTotal] 
         From SalesRange 
         Group By [Department] 
         Order By [Department] desc 
        OPTION (OPTIMIZE FOR (@StartDate UNKNOWN, @EndDate UNKNOWN)) 
       END 

Subreport:

ALTER PROCEDURE[dbo].[usp_ReportShowMedia](
     @StartDate2 DATETIME, 
       @EndDate2  DATETIME 
       ) 
As 
     BEGIN 


     Select isnull(M.MediaName,'Other') As [Media], 
     COUNT(T.MediaIndex) As [Count], 
     isnull(sum(T.Amount),0) As [Sales Amount], 
     isnull(sum(case when S.EndDate IS NOT NULL and DateRefunded IS NULL Then  S.NetSales Else 0 End),0) As [Total Sales], 
     isnull(sum(case when S.EndDate IS NULL then S.NetSales else 0 end),0) as [Cancelled Sales], 
     isnull(sum(case when S.DateRefunded IS NOT NULL then S.NetSales else 0 end),0) as [Refunded Sales] 
     FROM CSSale S WITH(NOLOCK) 
     LEFT JOIN (Select CSSaleID, Department from CSSaleItem WITH(NOLOCK) group by CSSaleID,Department) As I ON I.CSSaleID = S.CSSaleID 
     LEFT JOIN CSSaleTender T WITH(NOLOCK) On S.CSSaleID = T.CSSaleID 
     LEFT JOIN Media M WITH(NOLOCK) ON M.MediaIndex = T.MediaIndex 
     Where StoreDate BETWEEN convert(VARCHAR,@StartDate2) AND  convert(VARCHAR,@EndDate2) 
     group by M.MediaName 
     order by M.MediaName 
     OPTION (OPTIMIZE FOR (@StartDate2 UNKNOWN, @EndDate2 UNKNOWN)) 
     END 

stessi risultati, credo che il dal report principale non passano attraverso il rapporto di sub, perché sempre funziona solo su Preview, ma il runtime appena bloccato sul caricamento.

Ho provato sp_who2 attivo per controllare se bloccato. enter image description here

btw Sto usando questa connessione, sul mio App.config se questo aiuta ..

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
</startup> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="lib" /> 
    </assemblyBinding> 
</runtime> 
<connectionStrings> 
    <add name="CSPOS.Reports.Properties.Settings.chaplinConnectionString" connectionString="Data Source=RENZ\SQLEXPRESS;Initial Catalog=erika;Integrated Security=True" providerName="System.Data.SqlClient"/> 
</connectionStrings> 
</configuration> 

ho controllato autorizzazioni per il database su Master

enter image description here

+1

In quale sezione hai inserito il rapporto secondario all'interno del rapporto principale? potrebbe essere che sta causando il problema – Siva

+0

L'ho messo nella sezione Pippo di riporto del rapporto – FatalError

+0

Perché stai convertendo le date in VARCHAR? "BETWEEN convert (VARCHAR, @ StartDate2) AND convert (VARCHAR, @ EndDate2)" – Alex

risposta

0

Ho risolto il problema utilizzando due sqlcommand ed eliminato l'uso della stored procedure .. grazie btw.

1

ho avuto una situazione come questa un giorno. Il problema principale era nel piano di esecuzione errato per diversi parametri nella stored procedure.

Può essere fissato da OPTION (Ottimizza per (@param SCONOSCIUTO) Potete leggere tutto su in in here

La seconda:.. Ci possono essere alcuni blocchi di lettura nelle query È possibile utilizzare. standard di CON (NOLOCK) suggerimento (READ UNCOMMITTED livello isolamento), se i dati rapporto non è così sensibile.

tenta di modificare la query a guardare come questo e controllare il risultato.

SELECT 
... 
FROM CSSale S WITH(NOLOCK) 
LEFT JOIN (... FROM CSSaleItem WITH(NOLOCK) ...) 
LEFT JOIN CSSaleTender T WITH(NOLOCK) ... 
LEFT JOIN Media M WITH(NOLOCK) 
ORDER BY M.MediaName 
OPTION (OPTIMIZE FOR (@StartDate2 UNKNOWN, @EndDate2 UNKNOWN)) 

È inoltre necessario controllare la stored procedure utilizzata per la query principale per gli stessi problemi.

P.S. In ogni caso, controlla il SQL Profiler per le query in uscita.

+0

Ciao @ andrey-nadezhdin Ho provato l'opzione e WithNoLock Controlla se è corretta (ho modificato la mia domanda e aggiunto le mie immagini alla mia stored procedure) – FatalError

+0

Voglio anche sapere se tutto questo può essere fatto su una versione non registrata di SAP CR? (gratuito) – FatalError

+0

La query sembra OK. Ma proviamo a farlo in diversi passaggi. Innanzitutto, rimuovere il suggerimento WITH (NOLOCK) e lasciare solo l'istruzione OPTIMIZE FOR. –

1

Proviamo a trovare se il problema riguarda la stored procedure.

Provare a catturare i parametri passati alla stored procedure (dbo.usp_ReportShowMedia) del sottoreport inserendoli in una tabella fittizia (dbo.subReportParamsTb) come prima istruzione di SP.

INSERT INTO dbo.subReportParamsTb(
StartDate2, 
EndDate2 
) 
VALUES (
@StartDate2, 
@EndDate2 
); 

Dopo l'esecuzione di rapporto principale, quando si sta vedendo messaggio bloccato, controllo contiene dei dbo.subReportParamsTb con NOLOCK.

SELECT * 
FROM dbo.subReportParamsTb WITH(NOLOCK); 

Se vedi parametri vengono passati con successo alla SP, tenta di eseguire SP indipendentemente con questi parametri.

Se SP non produce output in un tempo limitato, è possibile provare a risolvere ulteriormente il problema osservando il piano di esecuzione.

Se SP funziona correttamente, puoi essere sicuro che il problema non è con SP.

+0

C'è SQL Profiler per questo /: –

+0

Ciao, @Swapnil ho cercato la query di prova 'ALTER PROCEDURE [dbo] [usp_ReportShowMedia] ( @ StartDate2 DATETIME, \t @ EndDate2 DATETIME. \t) Come \t \t BEGIN \t \t \t INSERTO in dbo.test ( StartDate2, EndDate2 ) VALORI ( @ StartDate2, @ EndDate2 ); END' E 'ancora bloccato su quel caricamento. e nessun parametro inserito, – FatalError

+0

Hi @FatalError, quando il report è bloccato, eseguire "sp_who2 active" sul server del database per ottenere lo SPID corrispondente al report. Dopo aver ottenuto SPID utilizzando sp_who2, utilizzare dbcc inputbuffer (spid) per ottenere l'esecuzione di sql. Non conosco le relazioni sui cristalli, ma questo esercizio ti aiuterà a capire quale affermazione di SQL è bloccata. – Swapnil

0

Penso che potrebbe essere il problema di collegamento dei dati tra entrambi i report. i pls assicurano che il rapporto principale e il rapporto secondario abbiano un ID univoco e siano collegati correttamente.