2013-09-25 4 views
0

변경하는 응용 프로그램을 작성하고 있습니다. Crystal Reports 데이터베이스 액세스 매개 변수가 보고서 파일에 있습니다. 나는 와 함께 보고서를 엽니 다. .NET 창 양식 앱 및 드라이버 유형 (ODBC/OLEDB), 서버 이름, 데이터베이스 이름, 사용자, 암호, 인증 유형 등을 변경하는 SDK 기능을 적용합니다. 에 문제가 있습니다. 데이터베이스 이름. 내 코드가 테이블 ConnectionInfo (하위 보고서에도 있음)의 특정 속성을 변경하지만 은 보고서 내의 일반 SQL 쿼리을 업데이트하지 못합니다. 이로 인해 보고서는 여전히 이전 데이터베이스에 액세스합니다.Crystal Reports의 SQL 쿼리가 업데이트되지 않습니다.

원본 보고서가 database_1에 액세스하도록 구성되어 있고이를 database_2로 변경하면 모든 테이블 속성이 database_2 (디자이너에서 확인할 수 있음)로 올바르게 변경됩니다. 그래도 쿼리에는 database_1이 남아 있습니다. 데이터베이스 이름은 SDK RowsetController.GetSQLStatement() 결과와 Crystal Reports Developer 쿼리 뷰 (데이터베이스 -> SQL 쿼리 표시 ...)에서 변경되지 않습니다. 또한

나는 그렇지 않으면 나도 GetSQLStatement에 예외를 얻을, 변환이 이루어지는 동안 온라인을 모두 데이터베이스 (참고 Database_1 및 database_2)를 가지고있다 (참고 Database_1가 오프라인 상태 일 때, 그것은 여전히를 의미 becuase) 또는 SetTableLocation (시 database_2 하지만 이것은 예상과 수용 가능한 행동입니다.). 두 데이터베이스가 모두 온라인 상태이면 오류가 없습니다.이

1) CrystalDecisions.CrystalReports.Engine.ReportDocument.Load (적인 filePath, OpenReportMethod.OpenReportByTempCopy) (...)

2) 확인 : 여기

내가 사용하고 정확히 CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag를 채우십시오.

3) CrystalDecisions.ReportAppServer.DataDefModel.Tables를 통해 반복하고 각각에 대해 SetTableLocaiton()으로 모든 속성을 적용하십시오.

4) 보고서의 SQL 쿼리를보기 위해 각 하위 보고서

5) RowsetController.GetSQLStatement()를 반복합니다.

새 테이블 ConnectionInfos (올바르게 설정된 것 같습니다)를 기반으로 쿼리를 업데이트하는 방법이 있습니까? 나는 쿼리 (GET, 검색 & 대체, SET)를 수동으로 업데이트 할 수있는 가능성조차 보이지 않는다.

내가 사용하고 있습니다 :

.NET 4.5, CR은 VS 13.0.5, 결과 검증을위한 크리스탈 리포트 개발자 9.2.2.693에 대한

(소스 보고서도 함께 생성된다) 비주얼 스튜디오 2012
+1

쿼리를 말할 때 Crystal 보고서에서 생성 한 SQL을 의미합니까 아니면 명령을 사용하고 있습니까? 질문을 업데이트하는 방법은 무엇입니까? 이 제품을 확인할 수 있습니다 : http : //www.r-tag.com/Pages/CRDataSource.aspx 연결을 변경할 수 있으면이 작업도 가능해야합니다. 그렇지 않으면 쿼리와 관련된 특정 것이 있습니다. – Lan

+0

CR이 작성한 기본 보고서에 대한 전반적인 SQL 쿼리를 의미합니다. 명령은 모든 테이블을 반복하면서 속성 가방을 적용하고 SetTableLocation을 사용하여 쉽게 업데이트됩니다. 이미 답변을 찾았지만 제품에 대한 링크를 제공해 주셔서 감사합니다! –

답변

1

답 : 각 테이블에 대해 프로퍼티 QualifiedName을 설정하십시오. QualifiedName은 DbName을 포함한 테이블의 전체 이름입니다. 나중에이 보고서의 SQL 쿼리에 나타납니다. 공인 된 이름을 통해 우리는 다음을 이해합니다 :

myDatabase.mySchema.myTableName

코드 예제 :

CrystalDecisions.ReportAppServer.DataDefModel.Table boTable = new CrystalDecisions.ReportAppServer.DataDefModel.Table(); 
CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag boMainPropertyBag = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag(); 
CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag boInnerPropertyBag = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag(); 

// Custom function to fill property bags with values which influence the table properties as seen in CR Developer 
FillPropertyBags(boMainPropertyBag, boInnerPropertyBag); 

CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo boConnectionInfo = new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo(); 
boConnectionInfo.Attributes = boMainPropertyBag; 
boConnectionInfo.Kind = CrystalDecisions.ReportAppServer.DataDefModel.CrConnectionInfoKindEnum.crConnectionInfoKindCRQE; 

boTable.ConnectionInfo = boConnectionInfo; 

CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables = boReportDocument.ReportClientDocument.DatabaseController.Database.Tables; 

for (int i = 0; i < boTables.Count; i++) 
{ 
    boTable.Name = boTables[i].Name; 
    // the QualifiedName is directly taken into the CR general query so this is a quick fix to change it 
    boTable.QualifiedName = boTables[i].QualifiedName.Replace("oldDbName", "newDbName"); 
    boTable.Alias = boTables[i].Alias; 
    boReportDocument.ReportClientDocument.DatabaseController.SetTableLocation(boTables[i], boTable); 
} 

어 ... 하루 종일 등등 질문을 게시 후 발견 대답을 검토 한 결과.