2013-05-29 1 views
4

그래요.이 구문을 이해하지 못하고 약간의 지침이 필요합니다. SSRS의 XML 쿼리 구조는 XML 구조 또는 WCF 서비스를 쿼리하는 데 사용됩니다. 나는 잘 작동하지만 데이터 유형은 WCF 서비스에서 정의 된 것이 아니므로 데이터 유형이 변환 된 후에 변환해야합니다. 어떻게 든 먼저이 일을 할 수있는 방법이 있습니까? 나는이 MSDN 문서 보았 듯이XML에서 데이터 유형을 명시 적으로 정의하십시오. WCF servicie에서 인식 할 SSRS 쿼리

나는 이렇게 가정 http://msdn.microsoft.com/en-us/library/ms365158%28v=sql.105%29.aspx

을하지만 내 구조가 생성에서와 같이 손실하고 'DataContract'내 '의 ServiceContract'에 적용하고 나는 구조를 협상 할 수 없습니다 아무리 노력해도. 나는 그것 모두 또는 아무것도 얻는다.

가장 간단한 용어로 : xml 쿼리 방법을 사용하여 SSRS에서 텍스트 값을 정수로 어떻게 변환합니까? 핵심 문제는 내가 매트릭스 보고서를 수행 할 내가이 작업을 수행 할 수 있습니다

행은 다음과 같습니다 '상태' 열은 다음과 같습니다 'Adjudication_Type' 값은 다음과 같습니다!의 (표현) = SUM (CINT (필드 볼륨. 값))

그러나이 방법은 IMHO에서 데이터가 계약서에 정의 된대로되어야합니다. 그렇지 않으면 SSRS에서 클라이언트가 정의 할 때 데이터를 명시 적으로 올바른 유형으로 만들 수있는 능력이 있어야합니다. 나는 다른 일 SSRS하는 WCF와 다른 문제를 가지고 있었고,이 스레드에서 해결했다 : 그래서 QUERY method of Soap request for SSRS and WCF testing

의 내가 사용하는 .NET 4.5 엔티티 모델을 만들어

  1. 내 생성 및 구현을 통해 실행하자를 C#의 Entity Framework 5를 라이브러리 프로젝트에서 사용하여 데이터의 모델 부분을 격리합니다. 데이터의 T4에서 생성 된 기본 모델과 같이 모델로 클래스 : 다음 그것을 유지하기 위해 자사의 '자신의 프로젝트와 같은은 BasicHttpBinding을 사용하여 호스팅하는 웹 사이트 WCF 프로젝트에 인터페이스와 구현을 생성

    public partial class fMonthlyImpactedVolume_Result 
        { 
         public string state { get; set; } 
         public string ADJUDICATION_TYPE { get; set; } 
         public Nullable<int> Yr { get; set; } 
         public Nullable<int> Mn { get; set; } 
         public Nullable<int> VOLUME { get; set; } 
         public Nullable<decimal> QSI_FEES { get; set; } 
         public Nullable<int> ActivityDays { get; set; } 
        } 
    
  2. 모델에서 격리.
  3. 나는 웹 사이트 프로젝트에서 엔티티 프로젝트를 참조하고

  4. 내 인터페이스 그래서이다 (나의 이해에서 POCO 클래스 생성기처럼 * TT =.)를 T4 템플릿에서 생성 된 클래스를 반환 :

    를 반품은 nullable 형식을 생성하지 않습니다 있도록 '데이터 계약'에서 명시 적으로 값을 알리는 또 다른 하나로서있는 그대로 단지 모델을 구현하기위한 하나를 다음과 같이 반환
    [ServiceContract] 
    public interface IReportingService 
    { 
        [OperationContract] 
        List<fMonthlyImpactedVolume_Result> GetMonthlyData(string aStart, string aEnd); 
    
        [OperationContract] 
        List<MonthlyType> GetMonthlyData2(string aStart, string aEnd); 
    
    } 
    
    [DataContract] 
    public class MonthlyType 
    { 
        [DataMember(Order = 0)] 
        public string state; 
    
        [DataMember(Order = 1)] 
        public string AdjudicationType; 
    
        [DataMember(Order = 2)] 
        public int Yr; 
    
        [DataMember(Order = 3)] 
        public int Mn; 
    
        [DataMember(Order = 4)] 
        public int Volume; 
    
        [DataMember(Order = 5)] 
        public decimal QSI_Fees; 
    
        [DataMember(Order = 6)] 
        public int ActivityDays; 
    } 
    
  5. 내 구현입니다.

    public List<fMonthlyImpactedVolume_Result> GetMonthlyData(string aStart, string aEnd) 
        { 
         using (SSRSReportsEntities re = new SSRSReportsEntities()) 
         { 
          DateTime dstart = DateTime.Parse(aStart); 
          DateTime dend = DateTime.Parse(aEnd); 
    
          return re.fMonthlyImpactedVolume(dstart, dend, null).ToList(); 
         } 
        } 
    
        public List<MonthlyType> GetMonthlyData2(string aStart, string aEnd) 
        { 
         using (SSRSReportsEntities re = new SSRSReportsEntities()) 
         { 
          DateTime dstart = DateTime.Parse(aStart); 
          DateTime dend = DateTime.Parse(aEnd); 
    
          return re.fMonthlyImpactedVolume(dstart, dend, null) 
            .Select(m => new MonthlyType 
             { 
              state = m.state, 
              AdjudicationType = m.ADJUDICATION_TYPE, 
              Yr = (int) (m.Yr ?? 0), 
              Mn = (int) (m.Mn ?? 0), 
              Volume = (int) (m.VOLUME ?? 0), 
              QSI_Fees = (decimal) (m.QSI_FEES ?? 0), 
              ActivityDays = (int) (m.ActivityDays ?? 0) 
             }) 
            .ToList(); 
         } 
        } 
    
  6. 나는 7 엔터프라이즈 '보고'라는 내 기본 사이트에 응용 프로그램에서 Windows에 IIS 7.5에 내 로컬 호스트에이 게시, 엔드 포인트는 다음과 같습니다

    HTTP가 : // (로컬 호스트)/Reporting/ReportingService.svc

  7. 클라이언트 용 C# 솔루션에 대한 또 다른 프로젝트를 만들었습니다. 두 개의 서비스 참조를 추가합니다. 하나는 서비스 프로젝트의 발견을 위해 즉시 테스트합니다. 그리고 한번 출판 된 서비스를위한 또 하나. 끝점 바인딩을 확인하고 제대로 작동합니다.

  8. 클라이언트의 끝점을 테스트하면 프로젝트의 모든 세 가지 메서드에 대해 예상대로 작동하고 참조를 게시합니다. 큰.

  9. 나는 WCF 데이터 소스를

  10. 내가의 방법을 테스트입니다를 BIDS로 이동 XML 유형의 연결을위한 6 단계에서 엔드 포인트와 데이터 소스를 설정하고 전화를 1 또는 2하지만 그들은 모두 양도하지 마십시오 내가 정의하는 유형. 그게 문제 야.

    < Query> 
    < Method Name="GetMonthlyData2" Namespace="http://tempuri.org/"> 
    < Parameters> 
    < Parameter Name="aStart"></Parameter> 
    < Parameter Name="aEnd"></Parameter> 
    </Parameters> 
    </Method> 
    < SoapAction> 
    http://tempuri.org/IReportingService/GetMonthlyData2 
    </SoapAction> 
    < ElementPath> 
    // From my reading SOMETHING should magically identify types here but I can't get 
    // ANYTHING to work like ./{Volume}, {Volume}, Document{}/{Volume}, Root{}/{Volume} 
    </ElementPath> 
    </Query> 
    
+0

SSRS에서 XML 데이터를 쿼리 할 때 쿼리의 각 필드에 대한 데이터 형식을 제공해야합니다. – Mike

+0

사람들은 어떻게 2 년이 넘는 질문에 답을 한 문장으로 대답합니까? – djangojazz

답변

0

첫 번째 단계는 아래와 같은 데이터 유형을 정의하는 시도하지 않고 간단한 쿼리를이 서비스 요청에서 다시 데이터를 받고 확인하는 것입니다 : 당신이 경우

<Query> 
<Method Name="GetMonthlyData2" Namespace="http://tempuri.org/"> 
<Parameters> 
<Parameter Name="aStart"> 
     <DefaultValue>1/1/2016</DefaultValue> 
</Parameter> 
<Parameter Name="aEnd"> 
     <DefaultValue>2/1/2016</DefaultValue> 
</Parameter> 
</Parameters> 
</Method> 
<SoapAction> 
http://tempuri.org/IReportingService/GetMonthlyData2 
</SoapAction> 
<ElementPath IgnoreNamespaces="true">*</ElementPath> 
</Query> 

데이터를 다시 가져 오는 경우 피들러에서 응답이 어떻게 보이는지 파악한 다음 정확한 구조를 쿼리하고 다음과 같이 각 필드의 유형을 개별적으로 정의 할 수 있습니다.

<Query> 
<Method Name="GetMonthlyData2" Namespace="http://tempuri.org/"> 
<Parameters> 
<Parameter Name="aStart"> 
     <DefaultValue>1/1/2016</DefaultValue> 
</Parameter> 
<Parameter Name="aEnd"> 
     <DefaultValue>2/1/2016</DefaultValue> 
</Parameter> 
</Parameters> 
</Method> 
<SoapAction> 
http://tempuri.org/IReportingService/GetMonthlyData2 
</SoapAction> 
<ElementPath IgnoreNamespaces="true"> 
GetMonthlyData2Response/GetMonthlyData2Result/dataItems{state(string)} 
</ElementPath> 
</Query> 

이 경로를 알아내는 한 가지 방법은 서비스에 대한 좋은 요청에서 피들러의 원시 응답을 조사하는 것입니다. 피들러가 설치되어있는 경우 WCFTestClient를 사용하고 HTTP 끝점의 WCFTestClient에서 포트 8888을 사용하도록 구성을 변경하십시오. WCFTestClient에서 요청하십시오. 피들러에서 요청을 볼 수 있습니다. 피들러의 작성기 탭으로 이동하여 성공적인 요청을 작곡가로 드래그 앤 드롭 한 다음 인스펙터 탭을 클릭하고 인스펙터 내부의 텍스트 뷰 탭을 클릭하십시오. 응답 봉투는 요소 경로가 어떻게 보이는지에 대한 아이디어를 제공합니다.

관련 문제