CRM 2013 - Quote product inline edit view - No editable unit price?

In CRM 2011, my customer was able to add products to a quote and still edit the price per unit for the selected product.
Doing this, the default price per unit was NOT affected on the product card itself.
This was a good functionality since their prices change every day, so their default price per unit on a product is € 1.
When creating a quote, they'd just enter the price per unit, per product, real time.
The good thing about CRM 2013 is that they can add products easy with the new grid.
First problem is, when adding a product and clicking on the find button, CRM shows only 10 products??
There are over 100 products in CRM, so they have to scroll down and then click on 'search more records'..
Too much clicking!
But the main problem is that they can't edit the price per unit anymore, on the quote itself, for the selected product:
The product grid is awesome: quick & easy to add products, but we need to be able to change the price per unit.
Even when we use the form 'products', we can't edit the price per unit anymore.
Is there a way to fix this?
I went looking in the field list of quoteproducts, there's a field names price per unit.
The description says it's meant to edit the price per unit, but we can't edit it anywhere but on the product card itself..
What am I overlooking?
*edit*
I found this this thread:
https://community.dynamics.com/crm/f/117/p/123743/264373.aspx
Where they post a link to this:
http://www.magnetismsolutions.com/blog/colinmaitland/2012/10/08/pricing_products_part_11_override_pricing_privileges
That was, fyi, how it worked in CRM 2011, they could override the price...
Now, I can't find a form where I can change the price per unit :/
Not on the new grid, and not on the quote products form.

Hi,
Doesn't anyone have a solution for the above? This is a real problem for several customers of ours. We know how to "fix" this by putting a price of 1 EUR and then changing the quantity, but that is stupid to say the least. 

Similar Messages

  • Not able to edit Unit Price in PO

    Hi,
    I am giving Authorization for a user.I have give authrization for PO,Price lists.But In PO the Unit Price is not editable.Which authorization should be enabled for this?
    Thanks and Regards,
    S.G.Sekar

    Hello,
    Give authorization setup in
    Sales A/R >Change Row amount ,And now user will able to change row amount in purchase order
    Thanks
    Manvendra SIngh Niranjan
    Edited by: Manvendra Singh Niranjan on Feb 8, 2012 12:16 PM

  • Display CRM 2013 Dashboard in SharePoint 2010 Page Viewer web part

    Hello,
    I am trying to add a simple CRM 2013 dashboard to a SharePoint 2010 web page (Page Viewer web part).  The page shows the banner only - the dark blue banner from CRM, but that is it.  No data, no headers, etc.
    Is this a permissions issue?  The SP and CRM servers and user are all on the domain.
    Thanks,

    Hello,
    I believe I found the answer to this issue.  The GUID for the dashboard needs to be copied from customizations/Dashboards in Settings.  Then the URL ends up looking [something] like this (note: this is just a sample) -
    http://SERVERNAME/ORGNAME/Dashboards/Dashboard.aspx?dashboardid=NNNNNNNNNNNNNNNNNNNNNNNNN
    Server name and org name and GUID (sample below shown as "NNNNNNNNNNNNNNNNNNNNNNNNN") needs to be replaced with the correct GUID of your entity to make the URL valid.  This is just a sample, not meant to be used in a production
    environment. 

  • Opportunity product doesn't delete if quote product is deleted in CR 2013

    Hi,
    The CRM 2013 out of the box functioanlity of creating a quote from opportunity works well for any additions and updates. I have a requirement where in after the creation of quote from opportunity, if the quote product (carried over form the opprotunity)
    is deleted, the same prodcut should be automatically deleted from the opportunity as well.
    Please tell me how to resovle this issue.

    There is no mapping between Quote Product and Opportunity Product.
    You can achieve this using Plugin. register a plugin on delete of Quote Product
    Plugin logic will look like ( I have not tried out this logic. But it should work):
    1. Get QuoteId for Quote Product
    2. Retrieve "Opportunity Id" value for above QuoteId
    3. Retrieve All OpportunityProducts for given Opportunity Id ( retrieved at step 2) 
    where "Opportunity Product"."ProductId" == "Quote Product"."Product Id" And
    "Opportunity Product"."UomId" == "Quote Product"."UomId"
    4. Delete all Opportunity Product retrieved at step 3
    Please note that Step 3 is not fool proof as same  product can be added multiple times and it will retrieve all. You can add additional check like Quanity and Discount.
    Also this implicitly assumes that user has delete permission on both Opportunity and Quote. If there is discrepancy in delete permission than this might not work. 

  • XSLT List View Web part with Inline Editing changing value for one field changes the other lookup field

    Hi
    It's a bit of a weird one. In an XSLT List View web part when Inline editing is enabled if I change the date column, it changes the lookup field column as well. This behavior only occurs if the lookup list has more than 20 entries. Below 20 and we are
    OK.
    Let me explain by example:
    MileStones List - Having more than 20 items
    Tasks List - having a lookup to the Title field from MileStones list. Also having a due date field.
    Simple web part page with one XSLT List View web part for Tasks having inline editing enabled.
    When I edit the first record's due date and press enter (which saves the changes and moves onto next record) and change the due date on second record without even touching the MileStone field. Press enter to commit changes and you see the milestone changing
    on first record!
    The wierd thing is that if the MileStone list has less than 20 items all works as expected.
    Any pointers will be appreciated
    Thanks

    Hi,
    This is a known limitation when working with complex fields like Lookup field.
    A workaround is that we can avoid using the inline edit feature when there are
    complex fields in a list.
    You can take a look at this KB from Microsoft Support to get more details:
    http://support.microsoft.com/kb/2600186/en-us
    A similar thread for your reference:
    http://social.technet.microsoft.com/Forums/sharepoint/en-US/3d369611-ee79-4b5c-86bb-c0f3878cd746/standard-list-view-with-inline-editing-lookup-column-copies-preceding-or-following-items-related?forum=sharepointgeneralprevious
    Thanks
    Patrick Liang
    TechNet Community Support

  • '$P_CRM' is undefined Error while opening Lookup field in Bulk edit form in CRM 2013

    Hi All,
    I am getting this strange error in MS CRM 2013
    When I do bulk edit for any entity , I select 2-3 records and click on Edit , the Bulk edit form opens
    then whenever I clicks on any field which is lookup type It does not open , after debugging with F12 developer tool
    I am getting this error.    "'$P_CRM' is undefined"
    I have MS CRM 2013 on premise , Service Pack 1 Update Rollup 1 installed and using IE 11.
    Any Idea
    Regards,
    Vilas
    Vilas Magar http://microsoftcrmworld.blogspot.com/

    Few questions that might help us to identify issue:
    1. Have you enabled Social Insight  ? If yes can you try bulk edit on entity which don't have social insight enabled and confirm if it repro there?
    For more information on how to enable Social Insight :
    http://technet.microsoft.com/en-us/library/dn659847.aspx
    2. When you close bulk edit form are you getting script error dialog? If yes can you share that error log reports?

  • Is it possible to disable the + button at the bottom of a view where Inline Editing in enabled?

    As per the title, I have a list view where Inline Editing is enabled. I need to know how to disable or hide the green plus icon at the bottom of the list (Add new item).

    Thank you Wendy! That solution works great.
    So all that is needed is this:
    <script
    src="http://code.jquery.com/jquery-1.10.2.min.js"
    type="text/javascript">
    </script>
    <style
    type="text/css">
    .ms-listviewtable
    img[alt='New']{
      display:none;
    </style>

  • Ms CRM 2013 Autosave loop in quote form.

    Hi Everyone,
    I have problem with autosave feature. I disabled this feature but in quote form when im triying to add quoteitem from quotedetailsGrid, form trying to save item.
    And never stop. I cant enter my quoteitem's name or discount because form trying to save it every second. First of i thought my preupdate plugin cause this problem. I debugged my plugin and i realize that context.depht is always "1". So infinitive
    loop continuous. Any advice?
    http://fuattatar.blogspot.com.tr/

    Just want to let you know that this will be fixed in Service pack 1 for CRM 2013.
    http://support.microsoft.com/kb/2941390
    Users of Microsoft Dynamics CRM 2013 Update Rollup will notice that the Save and Close button does not save appointments or recurring appointments they've entered.

  • Outlook Reading Pane Inline Editing?

    Is it possible to allow inline editing of items being viewed in the reading pane, like an Outlook task?
    Here is some background:
    One of my clients uses OneNote for task lists, which works ok to a point. I've never liked how there is no archive of completed tasks and they currently make a note tab called "completed" and manually move checked items there from time
    to time. But the big problem is the Notebook is shared over the network between 5 employees and some of the Section files are over 8MB and when viewing and editing these sections its very slow. So I want to try and migrate them to use Outlook Tasks for there
    "to do" list, which is hard since OneNote is so simple and fast. But Outlook will be able to handle archiving completed tasks and keep the system fast.
    I've created some custom Task views to make the task list nice and simple. One thing i don't like and I know the client won't is having to open a window to view & edit the task. Enabling the "Reading pane" on the right of the task list solves half this
    problem, but it would be nice if one could edit the task text contents in the reading pane.
    I've looked all through Outlook trying to find a setting and can't find one. So i'm wondering if this is possible? If not maybe is there a way to have opened tasks open in a pane rather than a new window when you double click them?

    I agree with you - editing of tasks in the reading pane would be very productive and help with the management of tasks.
    However given that 'in-pane editing' of emails was a new feature only in 2013, I gather that we'll be waiting for a future update before this will be made available.
    Any updates that can be shared on this?

  • CRM 2013 - "Save and Close" button behavnig like "Save and New"

    Hi,
    I am working in CRM 2013. I have a scenario in which I am saving new opportunity product record through javascript and preventing original save of CRM. Save is working fine. After save, I need to refresh the screen. So I have used "Xrm.Utility.openEntityForm"
    to open newly created item in edit mode. When I click on "Save and Close" button on this new form in edit mode, instead of closing the opportunity product screen, it opens new entity form. So in short, after saving the record, if I click on "Save
    and Close", it behaves like "Save and New".
    Any one facing such issue?

    Save & Close seems to behave like the Save & "Back" Button, so the form tries to return to the new form, that was opened before.
    But I have no solution for this behavior...

  • How to limit product catalogue and view authorization for web UI?

    Hi,
    We are in the process of upgrading our system from CRM 2004 to 2007.
    In CRM 2004 the product catalogues available for a user; as well as the views available for user within an available poduct catalogue were controlled by customizing user parameters: COM_PRDCAT and COM_PCAT_VIEW respectively.
    Is there anything we could do to get this done in CRM 2007?
    Is it possible to restrict the product catalogues a user can access, through PFCG roles? I was not able to find any CRM object for this purpose.
    Please help.
    Regards,
    Soumya Thomas
    Edited by: Soumya.Thomas on Jul 13, 2009 11:48 AM

    Hello Somya!
    The only possibilities I have found so far is to use the Parameters COM_PCAT_VIEW, COM_PCAT_VVRT and COM_PRDCAT as parameters for the user in SU01.
    regards,
    Andreas Bengtsson

  • How to make a "yes/no" field to be displayed as a checkbox during inline editing?

    I have a "yes/no" field in a SharePoint 2013 list. In a default list view I can click "edit" link and get to inline editing of the list. In this case I can edit the "yes/no" field via a dropdown with values "yes" and
    "no". Like so:
    But in my solution I have lots of records that must be clicked through by users as quickly as possible. And a checkbox is more convenient for this, but not a dropdown.
    So is there any way (with and without custom development) to display a checkbox instead of a dropdown in inline editing mode? Like so,
    v

    Hi,
    From your description, you want to make a “yes/no” field to be displayed as a checkbox in “Quick Edit” mode in SharePoint 2013.
    We can use code
    to achieve it.
    Here is a blog for your reference:
    http://sharepoint-community.net/profiles/blogs/custom-field-type-for-sharepoint-2013-custom-quick-edit-mode
    More information:
    http://spjsblog.com/2011/02/08/inline-editing-for-sharepoint-2007/
    Best Regards,
    Dennis Guo
    We
    are trying to better understand customer views on social support experience, so your participation in this
    interview project would be greatly appreciated if you have time.
    Thanks for helping make community forums a great place.

  • Dynamic CRM 2013 Online how to execute Report, generate PDF and email

    Dear All,
    I am using Dynamic CRM 2013 online. For quote, I have workflow and Dialogue processes for review process. On approval, I want the system to generate a PDF of quote report, attach the PDF and email it to the Customer.
    Better I would like, When approver, clicks on the approve button, the system should auto generate a PDF of quote report, attach the PDF and email it to the Customer, without any further input from the user. If its not possible, I may have to put button on
    quote form.
    I am using the attached code, but facing various issues.
    1. Under prepare the SOAP Message coding part, I am not sure what should be the below URL for CRM 2013 Online?
    xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
    2. What should be the emailid here? Is it Recepient Contact id(Guid) ?
    var emailid = resultXml.selectSingleNode("//CreateResult").nodeTypedValue;
    alert("emailid" + emailid.toString());
    3. Using this code, not able to create Entity for "ActivityMimeAttachment", I am getting newEntity as undefined.
    Below is the code I am using. Please check and help me out, where I am going wrong. Let me know if any better way to implement it. At present, I have put one button on quote form, on click event, below code will get executed.
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title></title>
    <script type="text/javascript">
    var Xrm;
    if (window.opener) { Xrm = window.opener.Xrm; }
    else if (window.parent) { Xrm = window.parent.Xrm; }
    function getReportingSession() {
    var reportName = "Quotation_Report"; //set this to the report you are trying to download
    var reportId = "7C39D18F-1DC6-E311-8986-D89D6765B238"; //set this to the guid of the report you are trying to download
    var recordid = Xrm.Page.data.entity.getId();
    // recordid = recordid.substring(1, 37); //getting rid of curly brackets
    alert(recordid);
    var pth = Xrm.Page.context.getServerUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
    var retrieveEntityReq = new XMLHttpRequest();
    retrieveEntityReq.open("POST", pth, false);
    retrieveEntityReq.setRequestHeader("Accept", "*/*");
    retrieveEntityReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    retrieveEntityReq.send("id=%7B" + reportId + "%7D&uniquename=" + Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false");
    var x = retrieveEntityReq.responseText.indexOf("ReportSession=");
    var ret = new Array();
    ret[0] = retrieveEntityReq.responseText.substr(x + 14, retrieveEntityReq.responseText.indexOf("&", x) - x - 14); //the session id
    x = retrieveEntityReq.responseText.indexOf("ControlID=");
    ret[1] = retrieveEntityReq.responseText.substr(x + 10, retrieveEntityReq.responseText.indexOf("&", x) - x - 10); //the control id
    return ret;
    function createEntity(ent, entName, upd) {
    var jsonEntity = JSON.stringify(ent);
    var createEntityReq = new XMLHttpRequest();
    var ODataPath = Xrm.Page.context.getServerUrl() + "XRMServices/2011/OrganizationData.svc";
    createEntityReq.open("POST", ODataPath + "/" + entName + "Set" + upd, false);
    createEntityReq.setRequestHeader("Accept", "application/json");
    createEntityReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    createEntityReq.send(jsonEntity);
    var newEntity = JSON.parse(createEntityReq.responseText).d;
    alert("new entity" + newEntity);
    return newEntity;
    function createAttachment() {
    var params = getReportingSession();
    var recordid = Xrm.Page.data.entity.getId();
    alert("recordid " + recordid);
    var orgName = Xrm.Page.context.getOrgUniqueName();
    var userID = Xrm.Page.context.getUserId();
    //create email record
    // Prepare the SOAP message.
    var xml = "<?xml version='1.0' encoding='utf-8'?>" +"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'" +
    " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" +
    " xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" +
    "<soap:Header>" +
    "</soap:Header>" +
    "<soap:Body>" +
    "<Create xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" +
    "<entity xsi:type='email'>" +
    "<regardingobjectid type='quote'>" + recordid + "</regardingobjectid>" +
    "<subject>" + "Email with Attachment4" + "</subject>" +
    "</entity>" +
    "</Create>" +
    "</soap:Body>" +
    "</soap:Envelope>";
    // Prepare the xmlHttpObject and send the request.
    var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
    xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
    xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Create");
    xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    xHReq.setRequestHeader("Content-Length", xml.length);
    xHReq.send(xml);
    // Capture the result
    var resultXml = xHReq.responseXML;
    // alert("resultXml " + resultXml);
    // Check for errors.
    var errorCount = resultXml.selectNodes('//error').length;
    if (errorCount != 0) {
    alert("ERROR");
    var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
    alert(msg);
    var emailid = resultXml.selectSingleNode("//CreateResult").nodeTypedValue;
    alert("emailid" + emailid.toString());
    //var emailid = userID;
    var post = Object();
    post.Body = encodePdf(params);
    var email = new Array();
    email[0] =new Object();
    email[0].id = emailid;
    email[0].entityType ='email';
    post.Subject ="File Attachment";
    post.AttachmentNumber = 1;
    post.FileName ="Report.pdf";
    post.MimeType ="application/pdf";
    post.ObjectId = Object();
    post.ObjectId.LogicalName ="email";
    post.ObjectId.Id = email[0].id;
    post.ObjectTypeCode ="email";
    alert(post.ObjectId.Id);
    createEntity(post,"ActivityMimeAttachment", "");
    alert("created successfully");
    email.Subject = "Your Order";
    //Set The current order as the Regarding object
    email.RegardingObjectId = {
    Id: Xrm.Page.data.entity.getId(), //Get the current entity Id , here OrderId
    LogicalName: Xrm.Page.data.entity.getEntityName()//Get the current entity name, here it will be “salesOrder”
    //Create Email Activity
    SDK.JScriptRESTDataOperations.Create(email, "Email", EmailCallBack, function (error) { alert(error.message); });
    // Email Call Back function
    function EmailCallBack(result) {
    email = result; // Set the email to result to use it later in email attachment for retrieving activity Id
    var activityPartyFrom = new Object();
    // Set the From party of the ActivityParty to relate an entity with Email From field
    activityPartyFrom.PartyId = {
    Id: customerId, // id of entity you want to associate this activity with.
    LogicalName: "contact"
    // Set the "activity" of the ActivityParty
    activityPartyFrom.ActivityId = {
    Id: result.ActivityId,
    LogicalName: "email"
    // Now set the participation type that describes the role of the party on the activity).
    activityPartyFrom.ParticipationTypeMask = { Value: 2 }; // 2 means ToRecipients
    // Create the from ActivityParty for the email
    SDK.JScriptRESTDataOperations.Create(activityPartyFrom, "ActivityParty", ActivityPartyFromCallBack, function (error) { alert(error.message); });
    var activityPartyTo = new Object();
    // Set the From party of the ActivityParty to relate an entity with Email From field
    activityPartyTo.PartyId = {
    Id: ownerId, // id of entity you want to associate this activity with.
    LogicalName: "systemuser"
    // Set the "activity" of the ActivityParty
    activityPartyTo.ActivityId = {
    Id: result.ActivityId,
    LogicalName: "email"
    // Now set the participation type that describes the role of the party on the activity). activityPartyTo.ParticipationTypeMask = { Value: 1 }; // 1 means Sender
    // Create the from ActivityParty
    SDK.JScriptRESTDataOperations.Create(activityPartyTo, "ActivityParty", ActivityPartyToCallBack, function (error) { alert(error.message); });
    //ActivityParty From Callback
    function ActivityPartyFromCallBack(result) {
    //ActivityParty To Callback
    function ActivityPartyToCallBack(result) {
    var StringMaker = function () {
    this.parts = [];
    this.length = 0;
    this.append = function (s) {
    this.parts.push(s);
    this.length += s.length;
    this.prepend = function (s) {
    this.parts.unshift(s);
    this.length += s.length;
    this.toString = function () {
    return this.parts.join('');
    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    function encode64(input) {
    var output = new StringMaker();
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;
    while (i < input.length) {
    chr1 = input[i++];
    chr2 = input[i++];
    chr3 = input[i++];
    enc1 = chr1 >> 2;
    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    enc4 = chr3 & 63;
    if (isNaN(chr2)) {
    enc3 = enc4 = 64;
    else if (isNaN(chr3)) {
    enc4 = 64;
    output.append(keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4));
    return output.toString();
    var bdy = new Array();
    var bdyLen = 0;
    function concat2Bdy(x) {
    bdy[bdyLen] = x;
    bdyLen++;
    function encodePdf(params) {
    bdy = new Array();
    bdyLen = 0;
    var retrieveEntityReq = new XMLHttpRequest();
    var pth = Xrm.Page.context.getServerUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + params[0] + "&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + params[1] + "&OpType=Export&FileName=Public&ContentDisposition=OnlyHtmlInline&Format=PDF";
    retrieveEntityReq.open("GET", pth, false);
    retrieveEntityReq.setRequestHeader("Accept", "*/*");
    retrieveEntityReq.send();
    BinaryToArray(retrieveEntityReq.responseBody);
    return encode64(bdy);
    </SCRIPT>
    <SCRIPT type=text/vbscript>
    Function BinaryToArray(Binary)
    Dim i
    ReDim byteArray(LenB(Binary))
    For i = 1 To LenB(Binary)
    byteArray(i-1) = AscB(MidB(Binary, i, 1))
    concat2Bdy(AscB(MidB(Binary, i, 1)))
    Next
    BinaryToArray = byteArray
    End Function
    </SCRIPT>
    </head>
    <body>
    <input type="button" onclick="createAttachment();" value="Attach Report" />
    </body>
    </html>
    Thanks. and waiting for your valuable comments.
    - Mittal

    Hello,
    Yes, I was able to make my code working as below. Tested on CRM online 2013.
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
    <script type="text/javascript">
    if (typeof (SDK) == "undefined")
    { SDK = { __namespace: true }; }
    SDK.JScriptRESTDataOperations = {
    _context: function () {
    if (typeof GetGlobalContext != "undefined")
    { return GetGlobalContext(); }
    else {
    if (typeof Xrm != "undefined") {
    return Xrm.Page.context;
    else { return new Error("Context is not available."); }
    _getServerUrl: function () {
    var serverUrl = this._context().getServerUrl()
    if (serverUrl.match(/\/$/)) {
    serverUrl = serverUrl.substring(0, serverUrl.length - 1);
    return serverUrl;
    _ODataPath: function () {
    return this._getServerUrl() + "/XRMServices/2011/OrganizationData.svc/";
    _errorHandler: function (req) {
    return new Error("Error : " +
    req.status + ": " +
    req.statusText + ": " +
    JSON.parse(req.responseText).error.message.value);
    _dateReviver: function (key, value) {
    var a;
    if (typeof value === 'string') {
    a = /Date\(([-+]?\d+)\)/.exec(value);
    if (a) {
    return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10));
    return value;
    Create: function (object, type, successCallback, errorCallback) {
    var req = new XMLHttpRequest();
    req.open("POST", this._ODataPath() + type + "Set", true);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.onreadystatechange = function () {
    if (this.readyState == 4 /* complete */) {
    if (this.status == 201) {
    successCallback(JSON.parse(this.responseText, SDK.JScriptRESTDataOperations._dateReviver).d);
    else {
    errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
    req.send(JSON.stringify(object));
    Retrieve: function (id, type, successCallback, errorCallback) {
    var req = new XMLHttpRequest();
    req.open("GET", this._ODataPath() + type + "Set(guid'" + id + "')", true);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.onreadystatechange = function () {
    if (this.readyState == 4 /* complete */) {
    if (this.status == 200) {
    successCallback(JSON.parse(this.responseText, SDK.JScriptRESTDataOperations._dateReviver).d);
    else {
    errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
    req.send();
    Update: function (id, object, type, successCallback, errorCallback) {
    var req = new XMLHttpRequest();
    req.open("POST", this._ODataPath() + type + "Set(guid'" + id + "')", true);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("X-HTTP-Method", "MERGE");
    req.onreadystatechange = function () {
    if (this.readyState == 4 /* complete */) {
    if (this.status == 204 || this.status == 1223) {
    successCallback();
    else {
    errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
    req.send(JSON.stringify(object));
    Delete: function (id, type, successCallback, errorCallback) {
    var req = new XMLHttpRequest();
    req.open("POST", this._ODataPath() + type + "Set(guid'" + id + "')", true);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("X-HTTP-Method", "DELETE");
    req.onreadystatechange = function () {
    if (this.readyState == 4 /* complete */) {
    if (this.status == 204 || this.status == 1223) {
    successCallback();
    else {
    errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
    req.send();
    RetrieveMultiple: function (type, filter, successCallback, errorCallback) {
    if (filter != null) {
    filter = "?" + filter;
    else { filter = ""; }
    var req = new XMLHttpRequest();
    req.open("GET", this._ODataPath() + type + "Set" + filter, true);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.onreadystatechange = function () {
    if (this.readyState == 4 /* complete */) {
    if (this.status == 200) {
    successCallback(JSON.parse(this.responseText, SDK.JScriptRESTDataOperations._dateReviver).d.results);
    else {
    errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
    req.send();
    __namespace: true
    </script>
    <script type="text/javascript">
    //Create Email and link it with Order as Regarding field
    var Xrm;
    var email = new Object();
    var ownerID = "";
    var CustomerId = "";
    if (window.opener) { Xrm = window.opener.Xrm; }
    else if (window.parent) { Xrm = window.parent.Xrm; }
    //Get ownerid who send email of quotation to customer
    function GetOwnerID() {
    var owner = Xrm.Page.getAttribute("ownerid").getValue();
    ownerID = owner[0].id;
    var ownerName = owner[0].name;
    var entityType = owner[0].entityType;
    GetToEmailGUID();
    //Get customerid who receive email of quotation from owner
    function GetToEmailGUID() {
    var Customer = Xrm.Page.getAttribute('customerid').getValue();
    CustomerId = Customer[0].id;
    var CustomerName = Customer[0].name;
    var entityType = Customer[0].entityType;
    //if CustomerId is type of "Account" then get Primary Contact id of that account
    if (entityType == "account") {
    var contact = Xrm.Page.getAttribute("customerid").getValue();
    if (contact === null) return;
    var serverUrl = Xrm.Page.context.getClientUrl();
    var oDataSelect = serverUrl + "/XRMServices/2011/OrganizationData.svc/AccountSet(guid'" + contact[0].id + "')?$select=PrimaryContactId";
    var req = new XMLHttpRequest();
    req.open("GET", oDataSelect, false);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json;charset=utf-8");
    req.onreadystatechange = function () {
    if (req.readyState === 4) {
    if (req.status === 200) {
    var retrieved = JSON.parse(req.responseText).d;
    CustomerId = retrieved.PrimaryContactId.Id;
    else {
    alert(this.statusText);
    req.send();
    function CreateEmail() {
    GetOwnerID();
    email.Subject = "Email with Report Attachment";
    //Set The current order as the Regarding object
    email.RegardingObjectId = {
    Id: Xrm.Page.data.entity.getId(), //Get the current entity Id , here OrderId
    LogicalName: Xrm.Page.data.entity.getEntityName()//Get the current entity name, here it will be “salesOrder”
    //Create Email Activity
    SDK.JScriptRESTDataOperations.Create(email, "Email", EmailCallBack, function (error) { alert(error.message); });
    // Email Call Back function
    function EmailCallBack(result) {
    email = result; // Set the email to result to use it later in email attachment for retrieving activity Id
    var activityPartyFrom = new Object();
    // Set the From party of the ActivityParty to relate an entity with Email From field
    activityPartyFrom.PartyId = {
    Id: CustomerId, //"79EBDD26-FDBE-E311-8986-D89D6765B238", // id of entity you want to associate this activity with.
    LogicalName: "contact"
    // Set the "activity" of the ActivityParty
    activityPartyFrom.ActivityId = {
    Id: result.ActivityId,
    LogicalName: "email"
    // Now set the participation type that describes the role of the party on the activity).
    activityPartyFrom.ParticipationTypeMask = { Value: 2 }; // 2 means ToRecipients
    // Create the from ActivityParty for the email
    SDK.JScriptRESTDataOperations.Create(activityPartyFrom, "ActivityParty", ActivityPartyFromCallBack, function (error) { alert(error.message); });
    var activityPartyTo = new Object();
    // Set the From party of the ActivityParty to relate an entity with Email From field
    activityPartyTo.PartyId = {
    Id: ownerID, //"79EBDD26-FDBE-E311-8986-D89D6765B238", // id of entity you want to associate this activity with.
    LogicalName: "systemuser"
    // Set the "activity" of the ActivityParty
    activityPartyTo.ActivityId = {
    Id: result.ActivityId,
    LogicalName: "email"
    // Now set the participation type that describes the role of the party on the activity).
    activityPartyTo.ParticipationTypeMask = { Value: 1 }; // 1 means Sender
    // Create the from ActivityParty
    SDK.JScriptRESTDataOperations.Create(activityPartyTo, "ActivityParty", ActivityPartyToCallBack, function (error) { alert(error.message); });
    //ActivityParty From Callback
    function ActivityPartyFromCallBack(result) {
    //ActivityParty To Callback
    function ActivityPartyToCallBack(result) {
    GetReportId('Quotation');
    //Create attachment for the created email
    function CreateEmailAttachment() {
    //get reporting session and use the params to convert a report in PDF
    var params = getReportingSession();
    //Email attachment parameters
    var activitymimeattachment = Object();
    activitymimeattachment.ObjectId = Object();
    activitymimeattachment.ObjectId.LogicalName = "email";
    activitymimeattachment.ObjectId.Id = email.ActivityId;
    activitymimeattachment.ObjectTypeCode = "email",
    activitymimeattachment.Subject = "File Attachment";
    activitymimeattachment.Body = encodePdf(params);
    activitymimeattachment.FileName = "Report.pdf";
    activitymimeattachment.MimeType = "application/pdf";
    //Attachment call
    SDK.JScriptRESTDataOperations.Create(activitymimeattachment, "ActivityMimeAttachment", ActivityMimeAttachmentCallBack, function (error) { alert(error.message); });
    //ActivityMimeAttachment CallBack function
    function ActivityMimeAttachmentCallBack(result) {
    var features = "location=no,menubar=no,status=no,toolbar=no,resizable=yes";
    var width = "800px";
    var height = "600px";
    window.open(Xrm.Page.context.getServerUrl() + "main.aspx?etc=" + 4202 + "&pagetype=entityrecord&id=" + email.ActivityId, "_blank", features);
    // To open window which works in outlook and IE both
    //openStdWin(Xrm.Page.context.getServerUrl() + "main.aspx?etc=" + 4202 + "&pagetype=entityrecord&id=" + email.ActivityId, "_blank", width, height, features);
    //This method will get the reportId based on a report name that will be used in getReportingSession() function
    function GetReportId(reportName) {
    var oDataSetName = "ReportSet";
    var columns = "ReportId";
    var filter = "Name eq '" + reportName + "'";
    retrieveMultiple(oDataSetName, columns, filter, onSuccess);
    function retrieveMultiple(odataSetName, select, filter, successCallback) {
    var serverUrl = Xrm.Page.context.getServerUrl();
    var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
    var odataUri = serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "?";
    if (select) {
    odataUri += "$select=" + select + "&";
    if (filter) {
    odataUri += "$filter=" + filter;
    $.ajax({
    type: "GET",
    contentType: "application/json; charset=utf-8",
    datatype: "json",
    url: odataUri,
    beforeSend: function (XMLHttpRequest) {
    XMLHttpRequest.setRequestHeader("Accept", "application/json");
    success: function (data) {
    if (successCallback) {
    if (data && data.d && data.d.results) {
    successCallback(data.d.results);
    else if (data && data.d) {
    successCallback(data.d);
    else {
    successCallback(data);
    error: function (XmlHttpRequest, errorThrown) {
    if (XmlHttpRequest && XmlHttpRequest.responseText) {
    alert("Error while retrieval ; Error – " + XmlHttpRequest.responseText);
    function onSuccess(data) {
    reportId = data[0].ReportId.replace('{', ").replace('}', ");
    CreateEmailAttachment(); // Create Email Attachment
    //Gets the report contents
    function getReportingSession() {
    var pth = Xrm.Page.context.getServerUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
    var retrieveEntityReq = new XMLHttpRequest();
    var Id = Xrm.Page.data.entity.getId();
    var quotationGUID = Id.replace('{', ""); //set this to selected quotation GUID
    quotationGUID = quotationGUID.replace('}', "");
    var reportName = "Quotation"; //set this to the report you are trying to download
    var reportID = "7C39D18F-1DC6-E311-8986-D89D6765B238"; //set this to the guid of the report you are trying to download
    var rptPathString = ""; //set this to the CRMF_Filtered parameter
    var strParameterXML = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='quote'><all-attributes /><filter type='and'><condition attribute='quoteid' operator='eq' uitype='quote' value='" + quotationGUID + "' /> </filter></entity></fetch>";
    retrieveEntityReq.open("POST", pth, false);
    retrieveEntityReq.setRequestHeader("Accept", "*/*");
    retrieveEntityReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    rptPathString = "id=%7B" + reportID + "%7D&uniquename=" + Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" +
    reportName + "&isScheduledReport=false&p:CRMAF_Filteredquote=" + strParameterXML;
    //remove the part starting from &p:salesorderid if your report has no parameters
    retrieveEntityReq.send(rptPathString);
    var x = retrieveEntityReq.responseText.indexOf("ReportSession=");
    var ret = new Array();
    ret[0] = retrieveEntityReq.responseText.substr(x + 14, retrieveEntityReq.responseText.indexOf("&", x) - x - 14); //the session id
    x = retrieveEntityReq.responseText.indexOf("ControlID=");
    ret[1] = retrieveEntityReq.responseText.substr(x + 10, retrieveEntityReq.responseText.indexOf("&", x) - x - 10); //the control id
    return ret;
    var bdy = new Array();
    var bdyLen = 0;
    function concat2Bdy(x) {
    bdy[bdyLen] = x;
    bdyLen++;
    function encodePdf(params) {
    bdy = new Array();
    bdyLen = 0;
    var retrieveEntityReq = new XMLHttpRequest();
    var pth = Xrm.Page.context.getServerUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + params[0] +
    "&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + params[1] +
    "&OpType=Export&FileName=Public&ContentDisposition=OnlyHtmlInline&Format=PDF";
    retrieveEntityReq.open("GET", pth, false);
    retrieveEntityReq.setRequestHeader("Accept", "*/*");
    retrieveEntityReq.send();
    BinaryToArray(retrieveEntityReq.responseBody);
    return encode64(bdy);
    var StringMaker = function () {
    this.parts = [];
    this.length = 0;
    this.append = function (s) {
    this.parts.push(s);
    this.length += s.length;
    this.prepend = function (s) {
    this.parts.unshift(s);
    this.length += s.length;
    this.toString = function () {
    return this.parts.join('');
    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    function encode64(input) {
    var output = new StringMaker();
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;
    while (i < input.length) {
    chr1 = input[i++];
    chr2 = input[i++];
    chr3 = input[i++];
    enc1 = chr1 >> 2;
    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    enc4 = chr3 & 63;
    if (isNaN(chr2)) {
    enc3 = enc4 = 64;
    } else if (isNaN(chr3)) {
    enc4 = 64;
    output.append(keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4));
    return output.toString();
    </script>
    <script type="text/vbscript">
    Function BinaryToArray(Binary)
    Dim i
    ReDim byteArray(LenB(Binary))
    For i = 1 To LenB(Binary)
    byteArray(i-1) = AscB(MidB(Binary, i, 1))
    concat2Bdy(AscB(MidB(Binary, i, 1)))
    Next
    BinaryToArray = byteArray
    End Function
    </script>
    </head>
    <body>
    <input type="button" onclick="CreateEmail();" value="Attach Report" />
    </body>
    </html>
    Thank you,
    Mittal.

  • Save and Close button issue in CRM 2013 for Activity Type Appointment

    Hi All,
    Have come across a strange behavior in CRM 2013 and would like  to be sure that it really is an issue which others have encountered too.
    Open a Case record, and click on Activity navigation link to see the Open Activity Associated View. Then try creating an Activity of type Meeting and click on
    Save & Close button (not just Save). When you refresh the view, the activity might show up. But repeat the same steps and create another Activity of Type Meeting and this activity will not show up. It doesnt show up even in the All Activities
    view. Seems like the activity does not get created when using Save and Close button.
    This behavior is replicated even on online 30 day trial version. Any inputs?
    Regards,
    Yogesh

    The problem only occurs when your appointment times clash.   "Save and close" just throws the appointment away.  "Save" tells you about clash (or perhaps it's just unavailability) and allows you to ignore and continue with the
    save.

  • BIDSExtensionsSetup.dll error while installing CRM 2013 authoring

    Been having this trouble for a month, and have found no solution on MSDN.
    I have SQL Data Tools 2010 installed.
    Cannot proceed instalation after getting this error:
    Setup cannot continue because C:\Users\[My User]\AppData\Local\Temp\MSCRM_{GUID}\BIDSExtensionsSetup.dll cannot be found or is incorrect.
    For additional details see logfile:
    21:26:13|   Info| === Setup bootstrap logging started 02/02/2015 09:26:13 p.m. ===
    21:26:13|   Info| Bootstrap version: 7.0.0.3027.
    21:26:14|   Info| User: [My User].
    21:26:14|   Info| Invoked with command line: "C:\Users\[My User]\Downloads\SetupBIDSExtensions.exe" 
    21:26:14|   Info| Running C:\Users\[My User]\Downloads\SetupBIDSExtensions.exe
    21:26:14|   Info| Loading bootstrap library C:\Users\[My User]\Downloads\BIDSExtensionsSetup.dll
    21:26:35|   Info| Microsoft Dynamics® CRM Report Authoring Extension is not currently installed.
    21:26:37|   Info| Closing bootstrap library C:\Users\[My User]\Downloads\BIDSExtensionsSetup.dll
    21:26:38|   Info| Patchfile target Product code: {0C524DF0-0409-0060-BF3E-80D80B490D53}
    21:26:38|   Info| Patchfile target version: 6.0.0000.0302
    21:26:38|   Info| Patchfile target language: 1033
    21:26:38|   Info| Patchfile target upgrade code: {3315FF72-9F24-423B-B854-7EDCF3394F50}
    21:26:38|  Error| Patch file is not valid for installing package. (packagevalidator.cpp:CWindowsInstallerPatchPackageValidator::Validate:364).
    21:26:38|   Info| Expected parameters for update file: 
    Upgrade code - {3315FF72-9F24-423B-B854-7EDCF3394F50}
    Product code - {0C524DF0-0409-0070-BF3E-80D80B490D53}
    ProductLanguage - 1033
    BaseVersion - 7.0.0.3027
    21:26:39|   Info| Error not a valid MSP file - C:\Users\[My User]\Downloads\Update\Bids_KB2888948_i386_1033.msp
    21:26:39|  Error| The update file is not valid for installation of this application. (setup.cpp:CCrmSetup::RetrieveUpdateFilePath:1184).
    21:26:39|   Info| Clean up the BITS downloader.
    21:32:50|  Error| The update file is not valid for installation of this application., Error, OK
    21:32:50|   Info| InputResult: OK
    21:33:07|   Info| Uninitializing COM.
    21:33:08|   Info| Uninitialized COM.
    21:33:08|   Info| Clean up the BITS downloader.
    21:33:08|   Info| === Setup bootstrap logging ended 02/02/2015 09:33:08 p.m. ===
    21:33:10|   Info| === Setup bootstrap logging started 02/02/2015 09:33:10 p.m. ===
    21:33:10|   Info| Bootstrap version: 6.0.0.302.
    21:33:10|   Info| User: [My User].
    21:33:11|   Info| Invoked with command line: "C:\Users\[My User]\Downloads\crm2013\SetupBIDSExtensions.exe" 
    21:33:11|   Info| Running C:\Users\[My User]\Downloads\crm2013\SetupBIDSExtensions.exe
    21:33:11|   Info| Loading bootstrap library C:\Users\[My User]\Downloads\crm2013\BIDSExtensionsSetup.dll
    21:33:15|   Info| Microsoft Dynamics® CRM Report Authoring Extension is not currently installed.
    21:33:16|   Info| Closing bootstrap library C:\Users\[My User]\Downloads\crm2013\BIDSExtensionsSetup.dll
    21:33:17|   Info| Patchfile target Product code: {0C524DF0-0409-0060-BF3E-80D80B490D53}
    21:33:17|   Info| Patchfile target version: 6.0.0000.0302
    21:33:18|   Info| Patchfile target language: 1033
    21:33:18|   Info| Patchfile target upgrade code: {3315FF72-9F24-423B-B854-7EDCF3394F50}
    21:33:30|   Info| Patchfile passed validation checks.
    21:33:30|   Info| MSP file C:\Users\[My User]\Downloads\crm2013\Update\Bids_KB2888948_i386_1033.msp will be installed
    21:33:31|   Info| Searching for MU Service in system
    21:33:32|   Info| MU service found in system.
    21:33:32|   Info| MU is registered with AU
    21:33:32|   Info| MU Service registration status = Registered
    21:33:35|   Info| Do not update Radio clicked -- proceeding with setup without update
    21:33:36|   Info| Do not update Radio clicked -- proceeding with setup without update
    21:33:37|   Info| Copying installer files to local directory:  
    21:33:37|   Info| Package: C:\Users\[My User]\Downloads\crm2013\BIDSExtensions.msi, Options: ADDLOCAL="Installer" INSTALLDIR="C:\Users\[My User]\AppData\Local\Temp\MSCRM_{7BCE165E-AEEC-4323-802B-E609A072076C}" TARGETDIR="C:\Users\[My
    User]\AppData\Local\Temp\MSCRM_{7BCE165E-AEEC-4323-802B-E609A072076C}" ALLOWRUN=1 PATCH="C:\Users\[My User]\Downloads\crm2013\Update\Bids_KB2888948_i386_1033.msp"
    21:34:07|   Info| Loading bootstrap library C:\Users\[My User]\AppData\Local\Temp\MSCRM_{7BCE165E-AEEC-4323-802B-E609A072076C}\BIDSExtensionsSetup.dll
    21:34:08|  Error| LoadLibrary(C:\Users\[My User]\AppData\Local\Temp\MSCRM_{7BCE165E-AEEC-4323-802B-E609A072076C}\BIDSExtensionsSetup.dll) failed.(error = 5) (bootstrapwrapper.h:CBootstrapLibrary::Load:80).
    21:34:08|  Error| Setup cannot proceed because C:\Users\[My User]\AppData\Local\Temp\MSCRM_{7BCE165E-AEEC-4323-802B-E609A072076C}\BIDSExtensionsSetup.dll cannot be found or is incorrect. (bootstrapwrapper.h:CBootstrapLibrary::Load:116).
    21:36:02|  Error| Setup cannot proceed because C:\Users\[My User]\AppData\Local\Temp\MSCRM_{7BCE165E-AEEC-4323-802B-E609A072076C}\BIDSExtensionsSetup.dll cannot be found or is incorrect., Error, OK
    21:36:02|   Info| InputResult: OK
    21:36:05|   Info| Are you sure you want to cancel Setup?, Question, Yes|No
    21:36:05|   Info| InputResult: Yes
    21:36:06|   Info| Clean up the BITS downloader.
    21:36:06|   Info| Uninitializing COM.
    21:36:06|   Info| Uninitialized COM.
    21:36:07|   Info| Clean up the BITS downloader.
    21:36:07|   Info| === Setup bootstrap logging ended 02/02/2015 09:36:07 p.m. ===

    The Report Authoring Extensions (any version) don't support VS 2013. Currently the Crm 2015 Report Authoring Extensions support VS 2012 and VS 2010, and the Crm 2013 Report Authoring Extensions supports only VS 2010.
    By the way, the error you posted suggests you're trying to install the Crm 2011 Report Authoring Extensions
    Microsoft CRM MVP - http://mscrmuk.blogspot.com/ http://www.excitation.co.uk

Maybe you are looking for

  • Copying iMovie back to tape: "your firewire camera is not powered on"

    I'm trying to follow iMovie 6 instructions for copying a movie back to tape. I connected my camcorder to the computer with the firewire cable, and it shows up in the Share-->Video Camera menu as an attached device. (It's a Canon Elura 100, btw.) So a

  • READ DATASET  fails!

    Hi, data: dsn(95) value '/usr/sap/U6B/D85/work/jana10'.    "dsn data is filled by another program DATA: BEGIN OF STR,          STLNR LIKE STZU-STLNR,          CNTRL,       END OF STR.        " this is a pure character type structure OPEN DATASET DSN

  • How can I play a song

    To Meg St._Clair

  • I've lost my ipad password

    I need some help cause i've forget my security Password, so i can't access anything. Please

  • Master Data Loading in Process Chain

    Hello All I want to design process chain for Master data loading we have 8 modules in our project such as SD,MM,FI,CO,PP,QM,PM and LO how Design PC .Each Module one start varient and All Text,Attribaute and hierarchies  Loading parallel ofter one Att