2013-03-10 2 views
2

내 CRM 2011 플러그인에 문제가 있습니다.SaveChanges CRM 2011 플러그인의 처리되지 않은 예외

var QuoteProduct = crm.QuoteDetailSet.Where(c 
    => c.QuoteDetailId == QPID).First(); 
double Tax = (double)(
    (QuoteProduct.BaseAmount 
    - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
    - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault())/20); 
QuoteProduct.Attributes["tax"] = Tax; 
crm.UpdateObject(QuoteProduct); 
crm.SaveChanges(); 

변경 내용 저장 라인에서 오류가 발생합니다. 오류 세부 사항은 다음과 같습니다.

Microsoft.Xrm.Sdk.SaveChangesException이 요청을 처리하는 동안 에러가 발생한 = 사용자 코드에 의해 처리되지 않은 메시지
이었다.
출처 = Microsoft.Xrm.Sdk
스택 트레이스 : Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChanges (SaveChangesOptions 옵션) Plugin.TaxCreator (IOrganizationService 서비스, 가이 드 QPID)에서
C에서의
: 사용자 \ \ mycrm \ Desktop \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax.cs : 행 62
at Plugin.Execute (IServiceProvider serviceProvider) in C : \ Users \ mycrm \ Desktop \ BMSD.QuoteProduct. Tax \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax.cs : 줄 38
at Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal (PipelineExecutionContext context)
at Microsoft.C rm.Extensibility.VersionedPluginProxyStepBase.Execute (PipelineExecutionContext 컨텍스트)
InnerException : System.ServiceModel.FaultException 메시지 = System.InvalidCastException : Microsoft Dynamics CRM에서 오류가 발생했습니다. 관리자 또는 지원을위한 참조 번호 : # BE061894
자료 = Microsoft.Crm.Extensibility
스택 트레이스 :
Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute (OrganizationRequest 요청 CorrelationToken correlationToken, CallerOriginToken callerOriginToken, ServiceType 자리 WebServiceType)에서
에서 Microsoft.Crm.Extensibility.InprocessServiceProxy.ExecuteCore (OrganizationRequest 요청)에 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute
(OrganizationRequest 요청)에 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange
(OrganizationRequest 요청은 IList `1 결과)
의 InnerException : 당신의 스택 추적에서

답변

4

그것은 어떤 속성의 값이 잘못된 유형이 의미 System.InvalidCastException

있다. '세금'속성 만 변경하기 때문에 유형이 잘못되었습니다. 아마 "세금"돈 필드입니다, 그래서 double 아닌 형식의 변수를 할당해야 것 같아요. 이 같은 것을보십시오 : 당신은 두 번 캐스팅 할 때

제공되는 정보를 바탕으로
decimal Tax = (decimal)((QuoteProduct.BaseAmount 
    - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
    - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault())/20); 
+0

감사합니다. Sergey. 내가이 주제들에서 새롭기 때문에 내 질문이 어리석은 것처럼 보일 수있다! –

+0

@PaymanBiukaghazadeh 아니, 그렇지 않았다. 귀하의 질문에 개선을 고려할 수있는 유일한 방법은 서식입니다. 나는 이번에 당신을 위해이 일을했지만, 질문을 아름답게 형식화한다면 미래에 더 나은 응답을 얻을 수 있습니다. 해피 코딩! –

1

, 그것은 아마 변환 문제입니다. 문제는 CRM이 기본적으로 상자에 넣는 것보다 더 높은 정밀도로 실제 값을 표시한다는 것입니다.이중

  • 는 8 바이트 높이 15 자리
  • 진수 12 바이트 높이의 중요성을 보유하고 있으며 28 자리
  • 그래서

의 중요성을 보유하더라도 실제 값 당신 ' (그리고 double이 C#의 비 - 정수에 대한 사실상의 표준입니다.) 컴퓨터는 반응하고 여러분이 (잠재적으로) 무언가를 (상대적으로) 작은 h 올레.

세금을 다음과 같이 다시 작성해야합니다.

//double tax; 
decimal tax = QuoteProduct.BaseAmount 
    - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
    - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault(); 
QuoteProduct.Attributes["tax"] = tax/20; 

또는 수동으로 사용 더블진수 값을 변환 할 수 내장 클래스를 변환. 그러나 결과를 필드 (확실하게 십진수 유형을 관리함)에 넣는다면 이는 제 의견으로는 불필요한 우회입니다.

다른 유형 by clicking here에 대해 더 자세히 읽을 수 있습니다.

+0

고마워요 콘라드. –

+0

흠! 이것은 좋은 것 같습니다. –