07.08.2009, 14:44 | #81 |
Участник
|
Цитата:
Главная проблема, почему данные не добавляются во вложенный отчёт... |
|
07.08.2009, 14:53 | #82 |
Чайный пьяница
|
При запуске отчёта под пользователем, под учётной записью которого работает асинхронный сервис - в отчёт попадают данные?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
07.08.2009, 15:01 | #83 |
Участник
|
|
|
07.08.2009, 15:11 | #84 |
Чайный пьяница
|
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
07.08.2009, 15:13 | #85 |
Участник
|
|
|
07.08.2009, 15:34 | #86 |
Чайный пьяница
|
Исследуйте почему из базы не приходят данные. Вот и будет Вам и ответ и решение проблемы.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
11.08.2009, 16:59 | #87 |
Участник
|
Вобщем так у меня проблема с вложением отчёта в письмо и не разрешается...
Письмо само вкладывается, а данных там так и нет. Попытался сделать немного по-другому(не как у вас в примере): ksdb3.ReportExecutionService rs = new ksdb3.ReportExecutionService(); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; string format = "Excel"; byte[] result = null; string reportPath = "/Новая папка/Прайс-лист"; string encoding; string mimeType; string extension; ksdb3.Warning[] warnings = null; string[] streamIDs = null; ksdb3.ExecutionInfo execInfo = new ksdb3.ExecutionInfo(); ksdb3.ExecutionHeader execHeader = new ksdb3.ExecutionHeader(); rs.ExecutionHeaderValue = execHeader; execInfo = rs.LoadReport(reportPath, null); string SessionID = rs.ExecutionHeaderValue.ExecutionID; result = rs.Render(format, null, out extension, out encoding, out mimeType, out warnings, out streamIDs); Всё равно то же самое. Сейчас хочу cохранить в файл, вообще, что получает result. Для этого дальше помещаю следующий код: [I]int i; StreamWriter sw = new StreamWriter("C:\\temp.txt"); for (i = 0; i < result.Length; i++) { sw.WriteLine(result); } sw.Close(); В логах асинхронного сервиса пишет: [2009-08-11 16:18:33.2] Process:CrmAsyncService |Organization:e26d7e2d-33b0-417e-8875-7e0c045fda3e |Thread: 4 |Category: Platform.Workflow |User: 00000000-0000-0000-0000-000000000000 |Level: Error | WorkflowHost.OnWorkflowTerminated >Workflow terminated: {5615DD03-7186-DE11-9267-000E0C4BF7BF} - System.UnauthorizedAccessException: Отказано в доступе по пути "C:\temp.txt". в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) в System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) в System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) в System.IO.StreamWriter.CreateFile(String path, Boolean append) в System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) в System.IO.StreamWriter..ctor(String path) в SendReportAction.SendReport.Execute(ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.CompositeActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.ActivityExecutor`1.Execute(Activity activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.ActivityExecutionFilter.Execute(Activity activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.FaultAndCancellationHandlingFilter.Execute(Activity activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime) в System.Workflow.Runtime.Scheduler.Run() Почему отказано в доступе не пойму... P.S. При запуске отчёта под пользователем, под учётной записью которого работает асинхронный сервис - в отчёт попадают данные. Зато при запуске Асинхронного сервиса от имени пользователя, который ставил всё(то есть имеет все права) письмо даже не создаётся. В логах пишет следующее: [2009-08-11 16:57:44.0] Process:CrmAsyncService |Organization:e26d7e2d-33b0-417e-8875-7e0c045fda3e |Thread: 21 |Category: Platform.Async |User: 00000000-0000-0000-0000-000000000000 |Level: Error | AsyncOperationCommand.Execute >Exception while trying to execute AsyncOperationId: {1C98A682-7686-DE11-9267-000E0C4BF7BF} AsyncOperationType: 1 - в System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) в System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) в Microsoft.Crm.SdkTypeProxy.CrmService.Retrieve(String entityName, Guid id, ColumnSetBase columnSet) в Microsoft.Crm.Asynchronous.SdkTypeProxyCrmServiceWrapper.Retrieve(String entityName, Guid id, ColumnSetBase columnSet) в Microsoft.Crm.Asynchronous.SdkPluginDescriptionProvider.GetPluginTypeDescription(Guid pluginTypeId, IOrganizationContext context) в Microsoft.Crm.Caching.PluginTypeCacheLoader.LoadCacheData(Guid key, IOrganizationContext context) в Microsoft.Crm.Caching.CrmMultiOrgCache`2.CreateEntry(TKey key, IOrganizationContext context) в Microsoft.Crm.Caching.CrmSharedMultiOrgCache`2.LookupEntry(TKey key, IOrganizationContext context) в Microsoft.Crm.Caching.PluginTypeCache.LookupEntry(Guid pluginTypeId, IOrganizationContext context) в Microsoft.Crm.Asynchronous.AsyncOperationCommand.GetPluginType(Guid pluginTypeId) в Microsoft.Crm.Asynchronous.EventOperation.InternalExecute(AsyncEvent asyncEvent) в Microsoft.Crm.Asynchronous.AsyncOperationCommand.Execute(AsyncEvent asyncEvent) |
|
11.08.2009, 17:10 | #88 |
Чайный пьяница
|
Цитата:
Сообщение от moskalevas
Вобщем так у меня проблема с вложением отчёта в письмо и не разрешается...
Письмо само вкладывается, а данных там так и нет. Попытался сделать немного по-другому(не как у вас в примере): ksdb3.ReportExecutionService rs = new ksdb3.ReportExecutionService(); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; string format = "Excel"; byte[] result = null; string reportPath = "/Новая папка/Прайс-лист"; string encoding; string mimeType; string extension; ksdb3.Warning[] warnings = null; string[] streamIDs = null; ksdb3.ExecutionInfo execInfo = new ksdb3.ExecutionInfo(); ksdb3.ExecutionHeader execHeader = new ksdb3.ExecutionHeader(); rs.ExecutionHeaderValue = execHeader; execInfo = rs.LoadReport(reportPath, null); string SessionID = rs.ExecutionHeaderValue.ExecutionID; result = rs.Render(format, null, out extension, out encoding, out mimeType, out warnings, out streamIDs); Всё равно то же самое. Сейчас хочу cохранить в файл, вообще, что получает result. Для этого дальше помещаю следующий код: [I]int i; StreamWriter sw = new StreamWriter("C:\\temp.txt"); for (i = 0; i < result.Length; i++) { sw.WriteLine(result); } sw.Close(); В логах асинхронного сервиса пишет: [2009-08-11 16:18:33.2] Process:CrmAsyncService |Organization:e26d7e2d-33b0-417e-8875-7e0c045fda3e |Thread: 4 |Category: Platform.Workflow |User: 00000000-0000-0000-0000-000000000000 |Level: Error | WorkflowHost.OnWorkflowTerminated >Workflow terminated: {5615DD03-7186-DE11-9267-000E0C4BF7BF} - System.UnauthorizedAccessException: Отказано в доступе по пути "C:\temp.txt". в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) в System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) в System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) в System.IO.StreamWriter.CreateFile(String path, Boolean append) в System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) в System.IO.StreamWriter..ctor(String path) в SendReportAction.SendReport.Execute(ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.CompositeActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.ActivityExecutor`1.Execute(Activity activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.ActivityExecutionFilter.Execute(Activity activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.FaultAndCancellationHandlingFilter.Execute(Activity activity, ActivityExecutionContext executionContext) в System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime) в System.Workflow.Runtime.Scheduler.Run() Почему отказано в доступе не пойму... P.S. При запуске отчёта под пользователем, под учётной записью которого работает асинхронный сервис - в отчёт попадают данные. Зато при запуске Асинхронного сервиса от имени пользователя, который ставил всё(то есть имеет все права) письмо даже не создаётся. В логах пишет следующее: [2009-08-11 16:57:44.0] Process:CrmAsyncService |Organization:e26d7e2d-33b0-417e-8875-7e0c045fda3e |Thread: 21 |Category: Platform.Async |User: 00000000-0000-0000-0000-000000000000 |Level: Error | AsyncOperationCommand.Execute >Exception while trying to execute AsyncOperationId: {1C98A682-7686-DE11-9267-000E0C4BF7BF} AsyncOperationType: 1 - в System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) в System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) в Microsoft.Crm.SdkTypeProxy.CrmService.Retrieve(String entityName, Guid id, ColumnSetBase columnSet) в Microsoft.Crm.Asynchronous.SdkTypeProxyCrmServiceWrapper.Retrieve(String entityName, Guid id, ColumnSetBase columnSet) в Microsoft.Crm.Asynchronous.SdkPluginDescriptionProvider.GetPluginTypeDescription(Guid pluginTypeId, IOrganizationContext context) в Microsoft.Crm.Caching.PluginTypeCacheLoader.LoadCacheData(Guid key, IOrganizationContext context) в Microsoft.Crm.Caching.CrmMultiOrgCache`2.CreateEntry(TKey key, IOrganizationContext context) в Microsoft.Crm.Caching.CrmSharedMultiOrgCache`2.LookupEntry(TKey key, IOrganizationContext context) в Microsoft.Crm.Caching.PluginTypeCache.LookupEntry(Guid pluginTypeId, IOrganizationContext context) в Microsoft.Crm.Asynchronous.AsyncOperationCommand.GetPluginType(Guid pluginTypeId) в Microsoft.Crm.Asynchronous.EventOperation.InternalExecute(AsyncEvent asyncEvent) в Microsoft.Crm.Asynchronous.AsyncOperationCommand.Execute(AsyncEvent asyncEvent) По поводу второго - а на данный момент тот пользователь, который ставил - обладает доступом к CRM, т.е. имеет право на создание записей и т.п.?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 11.08.2009 в 17:22. |
|
12.08.2009, 10:02 | #89 |
Участник
|
Заработало!
Ошибка заключалась в том, что в коде необходимо было дописать от кого подключаемся к Reporting Services. Так как у нас Асинхронный сервис был запущен от имени NT AUTHORITY\Network service, то и к Reporting Services он пытался подключиться от этого же имени. То есть просто добавил строчку: rs.Credentials = new System.Net.NetworkCredential("username", "password", "domain"); Осталось сделать, чтобы параметр для отчёта брался с самой формы ЗАКАЗ. |
|
12.08.2009, 10:10 | #90 |
Чайный пьяница
|
Цитата:
Сообщение от moskalevas
Заработало!
Ошибка заключалась в том, что в коде необходимо было дописать от кого подключаемся к Reporting Services. Так как у нас Асинхронный сервис был запущен от имени NT AUTHORITY\Network service, то и к Reporting Services он пытался подключиться от этого же имени. То есть просто добавил строчку: rs.Credentials = new System.Net.NetworkCredential("username", "password", "domain"); Осталось сделать, чтобы параметр для отчёта брался с самой формы ЗАКАЗ.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
12.08.2009, 10:16 | #91 |
Участник
|
Цитата:
А для того, чтобы из формы ЗАКАЗ передавался параметр для отчёта в репортинг необходимо добавить что-то вроде: ParameterValue[] parameters = new ParameterValue[1]; parameters[0] = new ParameterValue(); parameters[0].Name = "Param2"; parameters[0].Value = "ФУА Северодвинска"; Как в Value передать значение аттрибута name из формы ЗАКАЗ? |
|
12.08.2009, 10:27 | #92 |
Чайный пьяница
|
Цитата:
Сообщение от moskalevas
Так я и запускал Асинхронный Сервис под учёткой пользователя который имеет доступ на репортинг сервис. Тогда он вообще не создавао письмо...Теперь у меня асинхронный сервис запущен от имени NT AUTHORITY\Network, но в коде дополнительно прописано подключение к Reporting Services от имени пользователя, который имеет доступ к немуСпасибо!
А для того, чтобы из формы ЗАКАЗ передавался параметр для отчёта в репортинг необходимо добавить что-то вроде: ParameterValue[] parameters = new ParameterValue[1]; parameters[0] = new ParameterValue(); parameters[0].Name = "Param2"; parameters[0].Value = "ФУА Северодвинска"; Как в Value передать значение аттрибута name из формы ЗАКАЗ? Посмотрите http://a33ik.blogspot.com/2009/06/cr...record-in.html. Можно получить идентификатор записи, которая вызвала запуск воркфлова и уже исходя из этой записи - получить любое поле этой записи.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: moskalevas (1). |
12.08.2009, 11:50 | #93 |
Участник
|
Цитата:
Сообщение от a33ik
Вы можете получить это значение в теле Custom WorkFlow Action.
Посмотрите http://a33ik.blogspot.com/2009/06/cr...record-in.html. Можно получить идентификатор записи, которая вызвала запуск воркфлова и уже исходя из этой записи - получить любое поле этой записи. Пытаюсь передавать параметр следующим образом: salesorder sss = (salesorder)crmservice.Retrieve(EntityName.salesorder.ToString(), workflowContext.OrganizationId, new ColumnSet(new string[] { "name" })); string sales = sss.name; ParameterValue[] parameters = new ParameterValue[1]; parameters[0] = new ParameterValue(); parameters[0].Name = "Param2"; parameters[0].Value = sales.ToString(); Но отчёт не вкладывается...Не могли бы кинуть ссылочку, где поподробнее говорится о том, как получать значения полей с разных форм в теле Custom WorkFlow Action? |
|
12.08.2009, 11:56 | #94 |
Чайный пьяница
|
Цитата:
Сообщение от moskalevas
Прочитал вашу статейку, но не совсем понял...
Пытаюсь передавать параметр следующим образом: salesorder sss = (salesorder)crmservice.Retrieve(EntityName.salesorder.ToString(), workflowContext.OrganizationId, new ColumnSet(new string[] { "name" })); string sales = sss.name; ParameterValue[] parameters = new ParameterValue[1]; parameters[0] = new ParameterValue(); parameters[0].Name = "Param2"; parameters[0].Value = sales.ToString(); Но отчёт не вкладывается...Не могли бы кинуть ссылочку, где поподробнее говорится о том, как получать значения полей с разных форм в теле Custom WorkFlow Action? И непонятно зачем такое надо - parameters[0].Value = sales.ToString(); достаточно parameters[0].Value = sales;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
12.08.2009, 14:06 | #95 |
Участник
|
Надеюсь последний вопрос по данной теме
Как сделать, чтобы при нажатии на кнопку "выполнить бихнес-процесс" у нас сразу же открывалось создавшееся письмо? |
|
12.08.2009, 14:41 | #96 |
Чайный пьяница
|
Цитата:
Как я советовал это сделать и результат был бы гарантированным.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
13.08.2009, 09:51 | #97 |
Участник
|
Цитата:
Сообщение от a33ik
Думаю, что в данном случае я ответа дать не смогу. Отрабатывание бизнес процесса - процесс асинхронный. Запустить бизнесс процесс можно при помощи кода, написанного Jian Wang. Совсем другая задача - дождаться его выполнения, найти письмо созданное в результате его работы и т.п.
Как я советовал это сделать и результат был бы гарантированным. У электронной почты существует activityid, по которому мы можем искать необходимую нам почту?Возможно ли добавить ещё один шаг в созданный нами бизнес-процесс, который бы по этому ID ( ID мы могли бы сохранять на первом шаге бизнес-процесса ) находил и открывал необходимое нам письмо? Второй вопрос: параметр для отчёта я передал, всё работает. А вот как передать значение поля КЛИЕНТ (Customerid) из формы заказ в поле КОМУ (to) формы сформированной электронной почты? получается передать только systemuser: activityparty toparty = new activityparty(); toparty.partyid = new Lookup(); toparty.partyid.type = EntityName.systemuser.ToString(); toparty.partyid.Value = workflowContext.UserId; mail.to = new activityparty[] { fromparty }; Последний раз редактировалось moskalevas; 13.08.2009 в 10:08. |
|
13.08.2009, 10:13 | #98 |
Чайный пьяница
|
Цитата:
Сообщение от moskalevas
Добрый день!Хотел у вас ещё поинтересоваться
У электронной почты существует activityid, по которому мы можем искать необходимую нам почту?Возможно ли добавить ещё один шаг в созданный нами бизнес-процесс, который бы по этому ID ( ID мы могли бы сохранять на первом шаге бизнес-процесса ) находил и открывал необходимое нам письмо? Второй вопрос: параметр для отчёта я передал, всё работает. А вот как передать значение поля КЛИЕНТ (Customerid) из формы заказ в поле КОМУ (to) формы сформированной электронной почты? получается передать только systemuser: activityparty toparty = new activityparty(); toparty.partyid = new Lookup(); toparty.partyid.type = EntityName.systemuser.ToString(); toparty.partyid.Value = workflowContext.UserId; mail.to = new activityparty[] { fromparty }; По поводу заполнения to - просто вычитываете значение этого поля из Заказа и формируете свой activityparty уже исходя из полученных значений типа кастомера (контакт или компания) и идентификатора этой записи.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
13.08.2009, 11:02 | #99 |
Участник
|
Цитата:
Сообщение от a33ik
Бизнес процесс выполняется на сервере. Как Вы себе представляете, чтобы он открывал карточки?
По поводу заполнения to - просто вычитываете значение этого поля из Заказа и формируете свой activityparty уже исходя из полученных значений типа кастомера (контакт или компания) и идентификатора этой записи. 2. По поводу to. Там проблема в том, что в форме ЗАКАЗ поле КЛИЕНТ(customerid) - айдишник, а нам нужно его значение. Как в коде произвести связь и сразу же передать именно значение, а не айдишник? |
|
13.08.2009, 11:15 | #100 |
Чайный пьяница
|
Цитата:
Цитата:
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Bondonello (1). |
Теги |
c#, custom workflow action, plugin, workflow, reporting services, report |
|
|