2015-03-11 3 views
0

У меня есть приложение, разработанное в VB6, которое я переношу на .Net Framework 4.0. Существует отчет, который корректно работает в исходном приложении, но перенесенное приложение не работает с исходным приложением. В качестве специальной функции этот отчет изменился в атрибуте «время» времени выполнения в двух таблицах (на самом деле они видны), используемых для генерации SQL, с которым подается отчет, но при «стрельбе» повторите изменение таблиц с атрибутом « местоположение»не отражается, что я могу отобразить с помощью„SQL Server Profiler“инструмент:Crystal Reports - Изменение таблиц Не работает

objReportDocument.Database.Tables(0).Location = "NameReferenceTable""

Моя точка зрения такова: Когда отчет был построен, они использовали 5 таблиц базы данных из базы данных: Таблица1 , Таблица 2, Таблица 3, Таблица 4 и Таблица 5. Позже в базе данных таблицы Table1 и Table2 были удалены. Идея заключается в том, что en run time процедура хранилища, построенная в таблицах 1 и таблице 2, как временные таблицы с исходным именем больше любой строки id; эти новые таблицы базы данных должны использоваться, когда отчет возрастает.

Когда вы просматриваете массив таблиц отчета (ReportDocument.DataBase.Tables (n)), для каждой таблицы вы можете увидеть два ключевых свойства: Имя и местоположение. Я понимаю, что Location propertytie указывает на Crystal Reports, с которыми таблицы должны работать, чтобы строить реторты, это правда?

У меня мало опыта работы с Crystal Reports, я исследовал две недели, почему эта ошибка возникает без ответа ... Надеюсь, вы можете мне немного помочь, я очень ценю это.

приветствия,

Fabian.

+0

В вашем отчете используются любые субрегионы? Я также столкнулся с некоторыми проблемами при переносе наших Crystal Reports на .NET-версию. Если у вас есть какие-либо субресурсы, вам необходимо их рекурсивно перебирать (в случае, если есть какие-либо подзаголовки и т. Д.) И также устанавливать информацию о них. –

+0

Привет, спасибо за ваш ответ! В этом случае я не использую подзаголовки. –

+0

Надеюсь, вы можете использовать метод, который я опубликовал в своем ответе ниже. Вы не указали, используете ли вы VB.NET или C#, но код, который я предоставил, конечно, из проекта VB.NET. –

ответ

0

Ну, наконец, найти решение ...

  1. В моем Conection к BD использования ODBC, ассоциированный пользователю этой Conection не было ассоциировать схемы в БД, а затем, когда процедура хранения не созданы temporaly таблицы есть создает ниже shchema БДО, но когда кристалл отчеты увеличивают отчет (используется мой ODBC с ассоциированным пользователем), не найдены таблицы временных таблиц. Поэтому я связал scheemma с пользователем, используемым в моем ODBC.

  2. Мои исходные отчеты старые, тогда мне пришлось открыть каждый в VS2012, перезаписать отчет, чтобы обновить формат и протестировать в главном предварительном просмотре.

0

Я предоставлю метод, который я использую для объектов Crystal Reports в своем приложении. Это просто используется для установки информации для входа в отчет (наши отчеты используют встроенную защиту), но если я правильно понимаю вашу проблему, вы должны иметь возможность добавить/изменить этот метод, чтобы установить Location.

Свойства, используемые в приведенной ниже способа являются:

Me.ConnectionInfo имеет тип CrystalDecisions.Shared.ConnectionInfo

Me.LogOnInfo является типом CrystalDecisions.Shared.TableLogOnInfo

Me.Report является типом CrystalDecisions.CrystalReports.Engine.ReportDocument

Кроме того, g_strDb, g_strServer и g_strMirror являются некоторые String s, значение которых равно не имеет значения.

Одна вещь, которую я нашел в работе с Crystal Reports в .NET, заключается в том, что вам нужно установить свойства на уровне Table, как вы можете видеть в приведенном ниже методе. Надеюсь, это поможет вам в решении вашей проблемы.

''' <summary> 
''' Apply the database connection info to all tables recursively. 
''' </summary> 
''' <param name="crxRpt">The report document (or subreport) to apply connection info.</param> 
Private Sub SetConnectionInfo(ByVal crxRpt As ReportDocument) 
    Dim reportObject As ReportObject 
    Dim subReportObject As SubreportObject 
    Dim section As Section 
    Dim t As Table 

    For Each t In crxRpt.Database.Tables 
     ' if the DatabaseName in the report is <special db name>, 
     ' we need to make sure to set the DatabaseName to the environment 
     ' that the user is currently connected to in order to be able to 
     ' pull the correct information for the report 
     If t.LogOnInfo.ConnectionInfo.DatabaseName = "<special db name>" Then 
      Me.ConnectionInfo.DatabaseName = g_strDb 
     Else 
      Me.ConnectionInfo.DatabaseName = t.LogOnInfo.ConnectionInfo.DatabaseName 
     End If 

     ' only ApplyLogOnInfo for tables that are being pulled from the SQL 
     ' server, this avoids problems that arise with reports that are 
     ' created using field definition files 
     If t.LogOnInfo.ConnectionInfo.ServerName = g_strServer OrElse t.LogOnInfo.ConnectionInfo.ServerName = g_strMirror Then 
      t.ApplyLogOnInfo(Me.LogOnInfo) 
     End If 
    Next t 

    For Each section In crxRpt.ReportDefinition.Sections 
     For Each reportObject In section.ReportObjects 
      If reportObject.Kind = ReportObjectKind.SubreportObject Then 
       subReportObject = CType(reportObject, CrystalDecisions.CrystalReports.Engine.SubreportObject) 
       SetConnectionInfo(subReportObject.OpenSubreport(subReportObject.SubreportName)) 
      End If 
     Next reportObject 
    Next section 
End Sub 

выше метод вызывается из метода настройки:

''' <summary> 
''' Initialize the database connection info. 
''' </summary> 
Public Sub SetUpReport() 
    Me.LogOnInfo = New TableLogOnInfo 

    Me.ConnectionInfo.UserID = conUID 
    Me.ConnectionInfo.Password = conPWD 
    Me.ConnectionInfo.ServerName = g_strServer 
    Me.ConnectionInfo.DatabaseName = g_strDb 

    Me.SetConnectionInfo(Me.Report) 
End Sub 

И SetUpReport() называется любое время, нам нужно отобразить/напечатать отчет.

Смежные вопросы