Şimdi sizlere formun ribbonundan bir butona tıklanarak invoice un nasıl canceled edilecegini anlatacağım.
İlk olarak formun ribbonuna bir buton ekleyelim ve javascript yazarak bu butona tıklanınca bir aspx sayfasına yönlendirilmesini sağlayalım.(ribbona buton ekleme ve bunun calıstırılacagı javascript dosyasının nasıl verildiğini bir başka yazımda anlatmıştım. )
namespace TestCRM.InvoiceInterface
{
public partial class InvoiceCanceled : System.Web.UI.Page
{
IOrganizationService crmService;
//İlk olarak bir web sayfasından aspx sayfasına veri göndermeyi ve veri alıs verişini saglamak için Render metodunu kullandık.Gonderdıgımız veriyi queryString ile okuyoruz.
Verinin javascriptle nasıl yollandıgı sayfanın en alt kısmında bulabilirsiniz.
protected override void Render(HtmlTextWriter writer)
{
Response.Clear();
Response.ContentType = "text/xml";
string entityID = Request.QueryString["entityid"];
Session["entityid"] = entityID;// entity id yi postback olsa da kullanabiliyoruz.Sayfa kapanana kadar session da saklayıp ,istediğimiz zaman kullanabiliriz.
if (!string.IsNullOrEmpty(entityID))
{
CanceledInvoice();
}
else
{
Response.Redirect("../ErrorPage.aspx");
//entity id javascript ile gönderilemezse hata sayfasına yonlendırıyoruz.
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
}
}
private void CanceledInvoice()
{
string invoiceId = (string)Session["entityid"];
Guid _invoiceId = Guid.Empty;
if (!string.IsNullOrEmpty(invoiceId))
_invoiceId = Guid.Parse(invoiceId);
if (_invoiceId != Guid.Empty)
{
//Crm e baglanıyoruz.
crmService = DynamicCrmConnection.GetCrmService();
if (crmService != null)
{
Invoice invoice = (Invoice)crmService.Retrieve("invoice", invoice.Id, new ColumnSet() { AllColumns=true});
if (invoice != null && invoice.Id != Guid.Empty)
{
if (invoice.StateCode ==InvoiceState.Active)
{//invoice active se cancel edilebilir.
try
{
//SetStateRequest ile invoice un id si ve logical name ini vererek cancel edebiliyoruz.
//Statecode=3 invoice formunun canceled oldugunu gosterir.
//Status =100003 de canceled formunun bir durumudur.
SetStateRequest setStateRequest = new SetStateRequest()
{
EntityMoniker = new EntityReference
{
Id = invoice.Id,
LogicalName = "invoice"
},
State = new OptionSetValue(3),// inactive
Status = new OptionSetValue(100003)// qualified
};
crmService.Execute(setStateRequest);
}
catch (Exception)
{
//Hata alınmazsa invoice canceled olmus demektir.
}
}
}
}
}
}
}
}
Javascript
function CanceledInvoice() {
var entityid = Xrm.Page.data.entity.getId();
/*invoice formunun id si alınır ve XML.Dom kullanılarak aspx sayfasına veri gönderilir ve geriye veri okunur.*/
var xmldoc_sendApp = new ActiveXObject("Microsoft.XMLDOM");
xmldoc_sendApp.async = false;
xmldoc_sendApp.load("http://denemehost:8989/InvoiceInterface/InvoiceCanceled.aspx?entityid=" + entityid);
/*yukarıdakı url sayfanızı host ettiğiniz sayfanın adresidir.Ben IIS teki yolunu verdim.8989 ise sayfanın bulundugu hostdakı port numarasıdır.*/
var logMessage = xmldoc_sendApp.selectSingleNode("logmessage");
/*logmessage tagları arasında geriye veri gönderilir.*/
if (logMessage != null) {
if (logMessage.text != "") {
alert(logMessage.text);
window.location.reload();//Sayfa refresh olur.
}
}
}
Sorularınızı gkhnmnts@gmail adresine atabilirsiniz.