Attenzione ai cambiamenti di stato!!!

Come si sa ogni record del CRM possiede uno stato e un motivo dello stato

Il primo non è modificabile, mentre il secondo si' (si possono aggiungere motivi propri). Nella maggior parte dei casi gli stati sono due: Attivo e Inattivo.
Esistono pero' alcune entita' che hanno un insieme piu' complesso di stati e che, quando cambiano stato, registrano un particolare tipo di attivita' che specifica dettagliatamente quanto avvenuto.

Tali entita' si possono facilmente individuare per il fatto che quando si cambia via interfaccia utente il loro stato, il sistema espone una finestra di dialogo che richiede degli approfondimenti: è il caso ad esempio della chiusura dei casi o delle offerte.
Per modificare questi stati via codice non basta usare il messaggio "SetState", a volte bisogna usare dei messaggi appositamente creati i quali contengono come proprieta' il record attivita' da creare.

Il segreto e' proprio questo: l'attivita' non e' da creare prima del cambiamento di stato, ma viene creata dal cambiamento stesso. Quindi bisogna solo "creare" l'attività in RAM (valorizzando quindi un oggetto del tipo corretto) e passarla all'oggetto di request del messaggio.
Nell'esempio seguente il codice per cambiare lo stato di un'offerta Attiva in persa:

private bool LostQuote(Guid quoteid, CrmService crm, string motivazioni, string quotename, string quotenumber, int revisionnumber, string descrizione)

{

try

{

quoteclose qclose = new quoteclose();

CrmDateTime d = new CrmDateTime();

d.Value = DateTime.Now.ToString("s");

qclose.actualend = d;

d = new CrmDateTime();

d.Value = DateTime.Today.ToString("s");

qclose.actualstart = d;

Lookup lquote=new Lookup();

lquote.name=quotename;

lquote.type="quote";

lquote.Value=quoteid;

qclose.quoteid = lquote;

qclose.quotenumber = quotenumber;

CrmNumber n=new CrmNumber();

n.Value=revisionnumber;

qclose.revision = n;

qclose.subject = motivazioni;

qclose.description = descrizione;

CloseQuoteRequest req = new CloseQuoteRequest();

req.QuoteClose = qclose;

req.Status = 5;

crm.Execute(req);

return true;

}

catch (Exception ex)

{

return false;

}

}

Dettagli...