WSS 3 SP2 OnTask Создано
На работе у нас была проблема после установки SP2 на WSS 3.0, связанная с плохим поведением OnTaksCreated. Для получения дополнительной информации об этой проверке " http://fightingvssharepoint.blogspot.com/2009/06/ontaskcreated-in-wss-30-sp2.html ". Мы еще не нашли исправления, поэтому пытаемся найти альтернативное решение. Состоит в том, чтобы вынуть OnTaksCreted и перенести всю свою деятельность в OnTaskInit. Если у вас есть решение проблемы SP2 OnTaskCreated, пожалуйста, дайте мне знать! Но если вы не продолжаете читать, пожалуйста...
Краткое описание настраиваемого рабочего процесса: создает новые такты в списке "Задачи", устанавливает статус рабочего процесса и отправляет электронное письмо сотруднику "назначенного". Тело электронной почты заполнено недавно созданной информацией о задаче. Чтобы получить эту информацию, есть вызов метода "GetWorkflowTask". Подпись метода:
SPWorkflowTask task GetWorkflowTask (int taskID)
Этот метод прекрасно получает задачу при вызове из OnTaskCreated. Но если я вызову его в OnTaskInit, после действия Createtask получит ноль. Зачем?
Спасибо! Хорхе.
2 ответа
Я уже видел эту ошибку раньше, и, к сожалению, она непредсказуема, я могу предложить вам обходной путь, включающий указание listItemID (не GUID) для задачи, которую вы просите создать SharePoint, откуда вы можете получить доступ к элемент списка на любое будущее событие, предполагая, что создание завершилось успешно. Если используемый вами список получает много трафика, это может не сработать из-за условий гонки...
Опять "обходной путь", так что будьте осторожны... - Когда вы создаете задачу "onTaskCreateTask1", задайте простоту taskItemID в SPWorkflowTaskProperties.TaskItemID = x, где x - это значение, которое вы генерируете.
- сохранить сгенерированный taskItemID в переменной-члене - получить доступ к списку с помощью метода getListItemFromID(x) или методов / аксессоров list.items[x]
Я не написал код ниже, отдавая должное Мартину Холи. http://social.msdn.microsoft.com/Forums/en-US/sharepointworkflow/thread/26ff3ce1-6d6f-40a5-90b4-a7436acdfffe
/// <summary>
/// Because our task form's don't let us inject the ID we have to
/// generate one beforehand.
/// </summary>
/// <param name="site"></param>
/// <param name="listId"></param>
/// <returns></returns>
public static int GetNextAvailableIdFromList(SPSite site, Guid listId)
{
int nextAvailableID = -1;
if (site.WebApplication.ContentDatabases.Count > 0)
{
string DBConnString = site.WebApplication.ContentDatabases[0].DatabaseConnectionString;
SqlConnection con = new SqlConnection(DBConnString);
try
{
con.Open();
SqlCommand com = con.CreateCommand();
com.CommandText = String.Format("select tp_NextAvailableId from AllLists where tp_ID = '{0}'", listId.ToString());
nextAvailableID = (int)com.ExecuteScalar();
}
finally
{
con.Close();
}
}
return nextAvailableID;
}
У меня была такая же проблема с OnTaskCreated
Microsoft рекомендует не использовать OnTaskCreated
, но для решения этой проблемы смотрите этот пост в блоге.