none
[CRM 2011 ] Plugin: Erro para atualizar a entidade Linha de Contrato (contractdetail)

    Question

  • Olá. 

    Conto com a ajuda de vocês, estou a três dias tentando solucionar este problema e ainda não consegui.

    Tenho a seguinte modelagem:
    1 Contrato tem N Linhas de Contrato (contractdetail)
    1 Linha de Contrato (contractdetail) tem N Ocorrências
    1 Ocorrência tem N Atividades

    Toda vez que um Atividade é marcada como concluída, atualizo as horas consumidas da Linha de Contrato de acordo com a horas trabalhadas na Atividade concluída.
    A lógica para obter os dados e fazer os devidos cálculos estão prontos, porém na hora de atualizar a entidade Linha de Contrato (contractdetail) o seguinte erro aparece: "The state is invalid, this contract line item cannot be updated".

    Já tentei atualizar a Linha de Contrato, com um evento disparado por ela mesma, ou seja, no próprio target da Linha de Contrato, porém o erro persiste.

    Abaixo tem o código (modificado para melhor entendimento)

    	public void Execute(IServiceProvider serviceProvider)
            {
    
                if (serviceProvider == null)
                    throw new ArgumentNullException("serviceProvider");
    
                // Obtain the execution context from the service provider.
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    
                // Get a reference to the organization service.
                IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    
                IOrganizationService service = factory.CreateOrganizationService(context.UserId);
    
                // Get a reference to the tracing service.
                ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
    
                IFormatProvider culture = new System.Globalization.CultureInfo("pt-BR", true);
    
                OrganizationServiceContext serviceContext = new OrganizationServiceContext(service);
    
                try
                {
                    if (!(context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)) return;
    
    		//Target da entidade Atividade
                    Entity entityContext = (Entity)context.InputParameters["Target"];
    
                    //Recupero a entidade Linha de Contrato (contractdetail)
                    Entity entityLinhaContrato = _helper.GetLinhaContrato(entityContext["idAtividade"]);
                    if (entityLinhaContrato == null) return;
    				
                    
    		//Calculo as horas
    				
    				
    		//Set valores nos atributos da entityLinhaContrato         
    
    
    				
                    //Update Linha Contrato
                    
    				
    		//Opção 1: The state is invalid, this contract line item cannot be updated
    		service.Update(entityLinhacontrato);
    				
    				
    		//Opção 2: The state is invalid, this contract line item cannot be updated
    		UpdateRequest updateEntity = new UpdateRequest() { Target = entityLinhacontrato };
    		service.Execute(updateEntity);
    				
    				
    		//Opção 3: The state is invalid, this contract line item cannot be updated
    		serviceContext.ClearChanges();
    		serviceContext.Attach(entityLinhaContrato);
    		serviceContext.UpdateObject(entityLinhaContrato);
    		serviceContext.SaveChanges();
    
                }
                catch (Exception ex)
                {
                    throw new InvalidPluginExecutionException(string.Format("Erro: {0}", ex.Message));
    
                }
            }

    Alguma solução?


    Vanderlei Santana


    Wednesday, July 03, 2013 5:46 PM

Answers

  • Boas Vanderlei,

    Em que estado está o contrato? Eu penso que só é possível editar contratos no estado draft. Podes confirmar?

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    Thursday, July 04, 2013 2:58 PM

All replies

  • Boas Vanderlei,

    Quais são os campos que estas a alterar? Sobre que mensagem este plugin está a correr? O tracing dá mais informações?


    Pedro Azevedo Crm Specialist 4.0\2011

    Thursday, July 04, 2013 8:43 AM
  • Olá Pedro!

    Estou tentando alterar os seguintes campos: new_horastrabalhadas, new_horasconsumidas, new_horasexcedentes, new_horasdesaldo (todos do tipo decimal)
    Porém, acredito que esse não seja o problema, pois já tentei atualizar a entidade sem fazer nenhuma alteração, tentei também atualizar a entidade Linha de Contrato (sem alterações nos campos) no create da mesma, ou seja, no mesmo target e ainda sim, não funcionou.

    Vejas as configurações do registro do Plugin:
       
    Message: Update   
    Primary Entity: Task
    Secondary Entity: none
    Post-Operation, Synchronous 

    Observação:  Também fiz um teste no modo Asynchronous, e o erro persistiu.


    Tracing:
    System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: The state is invalid, this contract line item cannot be updated. (Fault Detail is equal to Microsoft.Xrm.Sdk.OrganizationServiceFault).


    Detalhes do Erro:
    Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: System.Web.HttpUnhandledException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #E230E365Detail: 
    <OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
      <ErrorCode>-2147220970</ErrorCode>
      <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
      <Message>System.Web.HttpUnhandledException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #E230E365</Message>
      <Timestamp>2013-07-04T12:24:00.5649655Z</Timestamp>
      <InnerFault>
        <ErrorCode>-2147220891</ErrorCode>
        <ErrorDetails xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
        <Message>Erro: The state is invalid, this contract line item cannot be updated.</Message>
        <Timestamp>2013-07-04T12:24:00.5649655Z</Timestamp>
        <InnerFault i:nil="true" />
        <TraceText>

    [EMPRESA.CRM.Plugins: EMPRESA.CRM.Plugins.UpdateContractDetail]
    [05b8c857-70d4-e211-bf89-00155d02490f: EMPRESA.CRM.Plugins.UpdateContractDetail: Update of task]


    </TraceText>
      </InnerFault>
      <TraceText i:nil="true" />
    </OrganizationServiceFault>



    Vanderlei Santana

    Thursday, July 04, 2013 1:04 PM
  • Boas Vanderlei,

    Em que estado está o contrato? Eu penso que só é possível editar contratos no estado draft. Podes confirmar?

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    Thursday, July 04, 2013 2:58 PM
  • Pedro. É isso mesmo.

    O estado do meu contrato é Active.

    Muito obrigado.


    Vanderlei Santana

    Thursday, July 04, 2013 4:31 PM