2012-07-06 7 views
2

절차 중 하나를 사용하면보기를 선택하고 리본 버튼을 눌러 관련 레코드를 대량 삽입 할 수 있습니다. 양식이 저장되고 플래그가 설정되고 플러그인이 작업을 수행합니다.서버 측 Fetchxml이 다른 결과를 반환합니다.

우리는 뷰 선택기로 서브 그리드를 사용하여 사용자가 자신의 뷰를 즉시 선택하거나 만들 수있게합니다. 보기가 선택되면 결과 수 (제공되는 5k)가 표시됩니다.

플러그인이 동일한 fetchxml 서버 측 (사용자 쿼리 또는 저장된 쿼리, Retrieve + FetchExpression 검색)을 실행하면 결과가 변경됩니다. 우리는 다른 수의 레코드뿐만 아니라 일부 레코드도 다릅니다.

우리는이 문제가 시간대와 관련이 있다고 결론을 내 렸습니다. 일부 필터에는 날짜 값과 함께 "on-after-after"연산자가 포함되어 있습니다. 예 :

<filter type="and"> 
    <condition attribute="modifiedon" operator="on-or-after" value="2011-01-01" /> 
    <condition attribute="modifiedon" operator="on-or-before" value="2011-12-31" /> 
</filter> 

플러그인은 관리자로 실행. 플러그인 사용자를 변경해도 FetchExpression을 사용하여 CRM에서 레코드를 가져올 때 현재 사용자 시간대가 고려되지 않은 것처럼 효과가 없습니다.

fetchxml 표현식이 클라이언트 측과 서버 측에서 동일한 결과를 반환하도록하려면 어떻게해야합니까?

아마 관련 : MSDN thread.

감사합니다.

편집 : Daryl의 제안에 따라 SQL 추적을 실행했습니다. 결과는 의아해하고있다. 클라이언트 측 쿼리 (CRM, 즉 고급 찾기에서 실행)에 대해 날짜가 올바르게 오프셋됩니다. 즉, fetchxml이 사용자의 시간대 설정을 사용하여 올바르게 변환되었음을 의미합니다. 동일한 쿼리 인 서버 쪽에서는 발생하지 않습니다. 출력 SQL에는 시간대 오프셋이없는 "있는 그대로"의 날짜 필터가 포함됩니다. 쿼리 실행 컨텍스트의 원점에 관계없이 동일한 변환이 발생했다고 가정했습니다.

편집 2 : 코드의 숨겨진 영역 (마지막 디버깅 리조트)의 플래그가 플러그인이 실행중인 사용자의 컨텍스트에서 서비스를 인스턴스화하지 못하게합니다. 모든 것이 잘 돌아갑니다. 시간과 도움을 주신 모든 분들께 감사드립니다.

+1

아마도 보안 권한 문제가 아니라는 것을 확인할 가치가 있습니다. 관리자 대 사용자로 쿼리 할 때 더 많은 레코드가 표시됩니까? 여기에서 사용중인 사용자에게 관리자 보안 역할이 할당되어 있습니까? – BenPatterson1

+0

두 개의 가져 오기 진술이 "on-after-after"및 "on-before-before"와 다른 것을 사용한 이후 완전히 동일하지 않다는 말입니까? –

+0

@ BenPatterson1,이 문제를 처음 알았던 사용자와 내 자신의 사용자는 모두 관리자 수준의 권한을가집니다. 귀하의 의견에 감사드립니다. – Raine

답변

6

날짜를 사용할 때 CRM이 데이터베이스에 저장하는 방법이므로 항상 utc로 변환해야합니다.

네이티브 CRM 고급 찾기는 현재 사용자의 시간대가 무엇이든 상관없이 SQL 쿼리를 수행하기 전에 입력 한 시간에 상관없이 고급 찾기에서 UTC로 변환합니다. 플러그인 컨트롤도 똑같이해야합니다. 다음은 Fetch Xml/Linq Expression/Query Expression에 조건을 적용하기 전에 수행해야하는 단계입니다.

  1. SystemUserId를 통해 사용자의 UserSetting.TimeZoneCode를 가져옵니다.
  2. 조회 1 단계
  3. 전화 TimeZoneInfo.FindSystemTimeZoneById (에서 TimeZoneCode에 대한 TimeZoneDefinition.StandardName) 2 단계의 표준 이름을 전달은 (단일 쿼리로 1 단계와 2 단계를 결합 할 수 있습니다,하지만 난 캐시 선호 약간의 성능 개선을 위해 1 단계의 입력을 사용하여 3 단계의 결과.

: 당신이 당신의 플러그인 쿼리에 사용하려고하고있는 시간에 대한 UTC 값을 얻기 위해 키와 TimeZoneCode과 값으로 TimeZoneInfo 중)
  • 이 기능을 사용하여 사전을 사용
    public static DateTime ConvertTimeToUTC(DateTime time, TimeZoneInfo timeZone) 
    { 
        if (time.Kind != DateTimeKind.Unspecified) 
        { 
         // If the DateTime is created with a specific time zone(ie DateTime.Now), getting the offset will 
         // blow chow if it isn't the correct time zone: 
         // The UTC Offset of the local dateTime parameter does not match the offset argument. 
         //Parameter name: offset 
    
         // This quick check will recreate the serverLocal time as unspecified 
    
         time = new DateTime(
          time.Year, 
          time.Month, 
          time.Day, 
          time.Hour, 
          time.Minute, 
          time.Second, 
          time.Millisecond); 
    
        } 
        var offest = new DateTimeOffset(time, timeZone.GetUtcOffset(time)); 
        return offest.UtcDateTime; 
    } 
    
  • +0

    이것은 일반적으로 건전한 조언이지만이 특정 사례에서 어떻게 도움이되는지 잘 모르겠습니다. 특정 날짜 필드를 사용하고 있지 않습니다. 나는 서버 측을 실행할 때 fetchxml을 실행하고 다른 결과를 얻고있다. fetchxml은 수정되지 않고 날짜 연산자를 포함합니다. 이 문제는 아마도 현지에서 utc 로의 전환 일 가능성이 높습니다. 아마도이를 방지 할 방법을 찾고있을 것입니다. 감사. – Raine

    +2

    @raine 나는 클라이언트 측을 실행하는 것이 무엇을 의미하는지 혼란 스럽다. 나는 당신이 자바 스크립트를 사용하고 있다고 가정하고 있습니까? 추적을 켜고 가져 오기 XML이 예상대로 SQL 쿼리로 올바르게 변환되도록하는 것이 좋습니다. 그것은 어느 쪽이 로컬 대 UTC 문제를 가지고 있는지 좁히는 데 도움이 될 것입니다 ... – Daryl

    +0

    Daryl, 내가 클라이언트 사이드를 언급 할 때, 표준 그리드를 업데이트하거나 표준 고급 찾기 기능으로 쿼리를 실행하는 것과 같은 일반적인 CRM 사용을 의미합니다. 추적 제안은 흥미 롭습니다. 시도해 보겠습니다. 감사. – Raine

    관련 문제