2

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 はユーザー コードによって処理されませんでした
Message=この要求の処理中にエラーが発生しました。
Source=Microsoft.Xrm.Sdk
StackTrace: C:\Users\mycrm\Desktop\BMSD.QuoteProduct の Plugin.TaxCreator (IOrganizationService サービス、Guid QPID)
の Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChanges(SaveChangesOptions オプション)にあります。
Tax\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax.cs:
C:\Users\mycrm\Desktop\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax\BMSD の Plugin.Execute(IServiceProvider serviceProvider) の 62 行目。 QuoteProduct.Tax.cs:
Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal (PipelineExecutionContext コンテキスト)の 38 行目
Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.Execute (PipelineExecutionContext コンテキスト)
InnerException: System.ServiceModel.FaultException メッセージ = System.InvalidCastException: Microsoft Dynamics CRM でエラーが発生しました。管理者またはサポートの参照番号: #BE061894
Source=Microsoft.Crm.Extensibility
StackTrace:
at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType)
at Microsoft.Crm.Extensibility.InprocessServiceProxy. ExecuteCore(OrganizationRequest リクエスト)
Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute (OrganizationRequest 要求)
で Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange (OrganizationRequest 要求、IList`1 の結果)
InnerException:

4

2 に答える 2

4

スタック トレースから、System.InvalidCastException

一部の属性の値の型が正しくないことを意味します。「税金」属性のみを変更しているため、そのタイプは正しくありません。decimalほとんどの場合、「税金」は Money フィールドであるため、 ではなくタイプの変数をそれに割り当てる必要があると思いますdouble。次のようなことを試してください:

decimal Tax = (decimal)((QuoteProduct.BaseAmount 
  - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
  - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault()) / 20);
于 2013-03-10T08:43:36.780 に答える
1

提示された情報に基づいて、double にキャストするときの変換の問題である可能性があります。問題は、CRM がデフォルトで、実際の値をボックス化しようとしている精度よりも高い精度で表示することです。

  • doubleは 8 バイトの高さで、15 桁の有効桁数を保持します
  • 10 進数は 12 バイトの高さで、28 桁の有効桁数を保持します

したがって、処理している実際の値がそれらのいずれにも収まる場合でも (そしてdoubleは C# の非整数の事実上の標準です)、コンピューターは反応し、(潜在的に) 本当に何かを入れているという警告を出します。 (比較的)小さな穴に大きな。

次のように税金を再申告する必要があります。

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

または、組み込みの変換クラスを使用して、手動で10 進数の値を2 倍に変換することもできます。ただし、結果をフィールド (確実に10 進数型を管理する) に入れていることを考えると、私の意見では、これは不必要な回り道です。

ここをクリックすると、さまざまなタイプの詳細を読むことができます。

于 2013-03-10T09:29:04.803 に答える