17.03.2009, 18:37 | #1 |
Участник
|
Изменить область Действия
Идём Продажи -> Бизнес-Партнёры -> Действия
Нужно изменить страницу Действий так, чтобы отображались не только запланированные действия, но и все действия (в том числе закрытые). Пока копаюсь полтора дня с Dynamics CRM, накопал следующие возможные варианты: 1) с помощью javascript я удаляю текущую страницу "Действия" при загрузке Бизнес-Партнёра, и потом через ISVConfig каким-то образом добавляю свою страницу. Но как добавить пока не совсем понимаю. Вроде как имеется готовое Представление Действий со всеми действиями, но как его подключить пока понимания нет. ( Как представления привязываются к пунктам в левой рабочей области?) 2) Просто ставить Visual Studio и править существующие apsx-формы Действий. Эти возможности скорее корявые и наверняка есть более простой путь. Прошу помочь и подсказать как правильнее такую задачу решить? Спасибо! Моя классификация - новичок. |
|
17.03.2009, 22:27 | #2 |
Kostya Afendikov
|
Посмотрите здесь, должно помочь. Варианты для MS CRM 4.0 и 3.0
|
|
23.03.2009, 18:00 | #3 |
Участник
|
Цитата:
Сообщение от Bondonello
Посмотрите здесь, должно помочь. Варианты для MS CRM 4.0 и 3.0
Пока я нашёл немного другой подход к решению проблемы - использовать расширенный поиск, где настраивается использование представления "Все действия" и ещё можно указать чтобы отображались действия только текущего пользователя как ответственного. Есть только две небольшие проблемы: 1) Пока не понял как фильтровать по текущему бизнес-партнёру (поскольку форма открывается из формы бизнес-партнёра). 2) При настраивании левого навигационного меню для бизнес-партнёра в "Продажах" через ISV Config типа <NavBar> <NavBarItem Icon="/_imgs/ico_18_debug.gif" Url="http://mdynamics/scg/advancedfind/advfind.aspx?etn=activitypointer&QueryId=%7b6A17FCA2-A517-DE11-800C-005056AF5786%7d&ViewType=4230&AutoRun=True" Id="navISV1" Area="Info"> <Titles> <Title LCID="1033" Text="Все действия" /> </Titles> </NavBarItem> </NavBar> // где Url - url отчёта после импорта isvconfig при кликании на соответствующий пункт выдаётся непонятная ошибка: Error Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Error Details: Exception of type 'System.Web.HttpUnhandledException' was thrown. Full Stack: [NullReferenceException: Object reference not set to an instance of an object.] at Microsoft.Crm.Application.Controls.AppAreaPage.ConfigureHeader() at Microsoft.Crm.Application.Controls.AppUIPage.OnPreRender(EventArgs e) at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) [HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown.] at System.Web.UI.Page.HandleError(Exception e) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) at System.Web.UI.Page.ProcessRequest(HttpContext context) at ASP.scg_sfa_accts_areas_aspx.ProcessRequest(HttpContext context) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) Other Message: Error Number: Source File: Not available Line Number: Not available Date: 03-23-2009 Time: 17:49:42 Server: mdynamics Request URL: http://mdynamics/scg/sfa/accts/areas.aspx?oId={0A241698-F7FC-DD11-800C-005056AF5786}&oType=1&security=852023&tabSet=navISV1Area Когда отчёт открывается в броузере самостоятельно, т.е. не через навигационное меню, то всё открывается нормально (кроме п.1 разумеется ). Кто-нибудь знает куда дальше копать? |
|
06.04.2009, 17:21 | #4 |
Участник
|
Смотрю тема пользуется бешеной популярностью. Вобщем указанная ошибка возникала вследствии того, что при открытии этого урла dynamics crm добавляет к нему ещё какие-то параметры, но разбираться как их убрать пока не стал в следствии осознания безперспективности, потому как потом ещё нужно будет фильтровать по Account (и фильтровать на стороне клиента, поэтому идеологически это скорее неверный путь)
По ходу поисков решения проблемы наступил на все возможные грабли. Даже в базе пытался подменить запрос приписаный к указаной вшитой вьюшке. Пробовал также используя Plugin перехватить запрос в плагине с меседжем Rollup (который описан в SDK) удалить из объекта запроса условие на статус Действия (похожие примеры находил в инете, но не для Rollup). Такой вариант тоже не сработал, поскольку реально меседж Rollup не поддерживается пока, о чём тоже никакой официальной инфы, всё на уровне слухов из форумов. Сейчас остановился на Custom Page, который и пишу. Ребята в инете в иностранных блогах уже встречались с такой задачей и писали свои странички, но кодами не делятся за бесплатно |
|
06.04.2009, 19:13 | #5 |
Чайный пьяница
|
Цитата:
Сообщение от ppa80
Смотрю тема пользуется бешеной популярностью. Вобщем указанная ошибка возникала вследствии того, что при открытии этого урла dynamics crm добавляет к нему ещё какие-то параметры, но разбираться как их убрать пока не стал в следствии осознания безперспективности, потому как потом ещё нужно будет фильтровать по Account (и фильтровать на стороне клиента, поэтому идеологически это скорее неверный путь)
По ходу поисков решения проблемы наступил на все возможные грабли. Даже в базе пытался подменить запрос приписаный к указаной вшитой вьюшке. Пробовал также используя Plugin перехватить запрос в плагине с меседжем Rollup (который описан в SDK) удалить из объекта запроса условие на статус Действия (похожие примеры находил в инете, но не для Rollup). Такой вариант тоже не сработал, поскольку реально меседж Rollup не поддерживается пока, о чём тоже никакой официальной инфы, всё на уровне слухов из форумов. Сейчас остановился на Custom Page, который и пишу. Ребята в инете в иностранных блогах уже встречались с такой задачей и писали свои странички, но кодами не делятся за бесплатно
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
27.04.2009, 15:56 | #6 |
Чайный пьяница
|
Дошли руки - проверил, написал, работает
Итак. Решение таково:
1. Пишется плагин на RetreiveMultiple сущности activitypointer задача которого - перехватить Query, который отправляется серверу для получения данных, изменить её, отдать серверу. 2. Задеплоить на сервер. 3. Пользоваться. Код плагина: Код: using System; using System.Collections.Generic; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; using Microsoft.Win32; namespace TestPlugin { public class ExecuteHandler : IPlugin { public ExecuteHandler(string config, string secureConfig) { } #region IPlugin Members public void Execute(IPluginExecutionContext context) { if (context.PrimaryEntityName == EntityName.activitypointer.ToString() && context.InputParameters.Contains("Query")) { Microsoft.Crm.Sdk.Query.QueryExpression query = (Microsoft.Crm.Sdk.Query.QueryExpression)context.InputParameters["Query"]; if (query.LinkEntities.Count == 1)//делается для проверки, что есть фильтр по связанности { Microsoft.Crm.Sdk.Query.LinkEntity link = (Microsoft.Crm.Sdk.Query.LinkEntity)query.LinkEntities[0]; if (link.LinkFromAttributeName == "activityid" && link.LinkFromEntityName == "activitypointer" && link.LinkToAttributeName == "activityid" && link.LinkToEntityName == "activityparty")//проверка на то, что связка идёт в поле regarding { Microsoft.Crm.Sdk.Query.ConditionExpression expr = (Microsoft.Crm.Sdk.Query.ConditionExpression)link.LinkCriteria.Conditions[0]; if (expr.AttributeName == "partyid" && expr.Operator == Microsoft.Crm.Sdk.Query.ConditionOperator.Equal) { Guid relatedEntityId = (Guid)expr.Values[0];//получаю идентификатор связанной записи CrmService crmService = GetCrmService(context.OrganizationName);//потребуется для проверки то, что связанная сущность - компания - чтобы остальные цепочки такого рода не порезало try { crmService.Retrieve(EntityName.account.ToString(), relatedEntityId, new Microsoft.Crm.Sdk.Query.AllColumns());//еслит связанная сущность - действительно компания - всё пройдёт нормально, если нет - будет экзепшен и изменение фильтра не произойдёт query.Criteria.Filters.RemoveAt(0); } catch { } } } } } } #endregion private CrmService GetCrmService(string OrgName) { CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = AuthenticationType.AD; token.OrganizationName = OrgName; CrmService crmService = new CrmService(); crmService.UseDefaultCredentials = true; crmService.Url = (string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl")) + "/2007/crmservice.asmx"; crmService.CrmAuthenticationTokenValue = token; return crmService; } } } Собственно всё.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: mistah (1). |