Ниже описан вариант решения для отображения необходимой иконки в зависимости от определенного условия возле записи в реестре. Релизовано на примере признака "Важность" в окне напоминаний.

1

То есть, при установке признака «Важность» будет появляться иконка возле записи в реестре.

Перед изменениями советую сделать бекап базы данных.

Для этой реализации необходимо:

1. Создать новый сервис ImageList:

1

2. Заполнить поля обращения к нему и добавить изображение:

1

3. Загрузить картинку и сохранить изменения:

1

4. Открыть окно редактирования грида (wnd_RemindingsGridArea).
5. Выделить элемент grdData. В нем выбрать созданный ImageList, установить свойство HasCustomDraw – True.

1

6. Теперь необходимо перейти на вкладку «события» и дважды щелкнуть на поле «OnGetRowDrawInfo» для создания функции. Откроется окно скрипта, необходимо вернуться обратно к окну wnd_RemindingsGridArea и сохранить изменения.

1

7. В открывшемся окне скрипта, необходимо добавить текст кода, как показано на скриншоте и сохранить изменения:

            var Dataset = dlData.Dataset;    

            var check = GetFieldValueFromDisabledField(Dataset,'Urgent');

            if (check) {
            ImageName.Value = 'Check';
            }
            else
            {
            ImageName.Value = '';
            }

1

8. Необходимо добавить поле в таблицу tbl_Reminding, как показано на скриншоте и сохранить изменения:

1

9. Далее требуется добавить выборку в sq_Reminding, как показано на скриншоте:

1

10. Добавить новое булевское поле в ds_Reminding:

1

11. Заполнить поля и сохранить изменения:

1

12. Открыть карточку wnd_RemindingEdit и добавить элемент BoolDataControl:

1

13. Заполнить свойства, как показано на скриншоте, и сохранить изменения:

1

Нравится

Поделиться

0 комментариев
Показать все комментарии

Здравствуйте!

У сотрудников, использующих напоминания, периодически появляется пустое окно напоминаний, не содержащее записей и лог с текстом "Ошибка выполнения метода 'wnd_RemindingOnShow'"

Скриншот
http://i.piccy.info/i7/dc5a38911a8589f4f813bd2bf76c00eb/1-5-4084/3027969...

Симптомы очень похожи на описанные Анатолием Будаком здесь https://community.terrasoft.ru/blogs/2284, но в нашей версии (3.3.1.65), код указанных процедур отличается, как я понял, та ошибка уже исправлена.
Кроме того, я проверял напоминания людей, столкнувшихся с проблемой. Объекты на которые ссылаются напоминания существуют.

Пока других идей нет, может быть кто-то уже сталкивался с подобным?

Нравится

5 комментариев

Здравствуйте, Александр!

Уточните, пожалуйста, проводились ли доработки в сервисах окна Напоминания и в сервисах раздела, где возникает проблема?

Судя по журналу событий в нижней части скриншота, не удается выпонить инициализацию окна, и в результате не отображаются напоминания.

Рекомендуется проверить сервисы и состояние таблицы в базе данных.

Сервисы окна напоминания не трогались.

Сервисы раздела задач подвергались незначительным изменениям (напоминания у нас используеются в основном по задачам).

Как можно проверить состояние таблицы в базе?

Здравствуйте, Александр!

Под проверкой состояния таблицы в базе данных имеется в виду следующее:

1. Выполнить запрос select * from tbl_Reminding
2. Посмотреть значения, которые вернул запрос. Особое внимание обратить на то, все ли поля ContactID, SubjectTipeID и SubjectID заполнены.

В случае, если одно из них пустое, как конкретное напоминание, так и вся таблица может давать сбой.

Если некоторое количество напоминаний пусто, тогда рекомендуется проверить функционал раздела, из которого они создаются, возможно, они создаются некорректно (заполняются не все поля).

Для более детального анализа проблемы, пожалуйста, предоставьте сервисы раздела напоминаний.

В частности, интересует скрипт реестра напоминаний wnd_Remindings - scr_Remindings, в котором, собственнно, и находится обработчик события wnd_RemindingOnShow

Анна, спасибо за участие.

Пустых полей в таблице нет, все корректно.

Единственная известная мне возможность некорректных данных в tbl_Reminding - это удаление процесса целиком, одна из задач которого имела напоминание.
При этом все задачи удаляются, а напоминания - нет. Соответственно, в поле tbl_Reminding.SubjectID - идентификатор уже несуществующей задачи.
Однако, это не вызывает ошибки. Просто появляется окном напоминаний, в нем видно само напоминание, однако при нажатии "Перейти" получаем пустой раздел "Задачи". В общем-то, все логично, думаю, это не может быть причиной ошибки.

Прикрепляю пару сервисов (архив).

Здравствуйте, Александр!

На сервисах проблема не воспроизводится, необходим детальный анализ базы данных.

Пожалуйста, активируйте отладчик на проблемном компьютере. Инструкция по активации отладчика в приложении.

Показать все комментарии

Здравствуйте!
Так как я не являюсь программистом и уровень моих знаний в языках программирования (JScript и другие) равен «0» :(, обращаюсь с вопросом/просьбой к Вам, уважаемые специалисты в данной области.

Версия программы: Terrasoft Service Desk 3.3.2.182
В стандартном окне «Напоминания» (wnd_Remindings), есть потребность добавить новую кнопку «Комментарий» (wnd_IncidentCommentEdit, wnd_TaskCommentEdit), с помощью которой сотрудник сможет, не отвлекаясь при переключении между окнами, добавлять соответствующие комментарии к напоминанию по инциденту или задаче.

Новую кнопку в окне добавил без трудностей, но проблема в том, что я не могу ее заставить правильно работать, так как мне этого нужно.
Пробивал найти подобный код в разных сервисах, но его я не нашел. Пробивал разные вариации построения этого кода под мою потребность, с разных сервисов (скриптов) так же без результатов.
В скрипте «scr_Remindings» указано, что окно открывается от типа объекта (Задача или Инцидент), если использовать кнопку «Открыть». Так же мне нужно, что бы от типа объекта открывался тот или иной комментарий.

Подскажите, пожалуйста, как можно реализовать такой функционал.
Буду Вам очень признателен за помощь.

P.S. Подскажите, пожалуйста, литературу для начинающих по JScript’y :).
Спасибо.

Нравится

23 комментария

Насколько я представляю, реализовать Вам вопрос необходимо следующим образом:

1. При нажатии на кнопку записать в переменную ID (инцидента или задачи).
2. Прописать открытие окна добавления комментариев.
3. После добавления текста в поле и нажатия на ОК провести фильтрацию датасета по ID.
4. Сделать пост на деталь комментариев записи, которая у нас есть после фильтрации.

"Гакало Игорь Александрович" написал:

Насколько я представляю, реализовать Вам вопрос необходимо следующим образом:

1. При нажатии на кнопку записать в переменную ID (инцидента или задачи).
2. Прописать открытие окна добавления комментариев.
3. После добавления текста в поле и нажатия на ОК провести фильтрацию датасета по ID.
4. Сделать пост на деталь комментариев записи, которая у нас есть после фильтрации.

Здравствуйте, Игорь!
Спасибо Вам за ответ, но могли бы Вы поподробнее описать или показать где в сервисах есть подобные коды?
К сожалению, моих знаний в программировании не достаточно для того чтобы выполнить Ваши рекомендации. :sad:
Спасибо.

Внесу небольшие уточнения и пояснения по описанному мной варианту.
Запись, которая находится в таблице напоминаний, имеет кроме ID, описания, времени создания, объекта напоминания и подобных полей еще такие полезные данные, как SubjectTypeID и SubjectID.

К примеру, Вы создали запись в разделе "Инциденты" и добавили к ней напоминание кому-либо.
В SubjectTypeID будут данные о том, что запись относиться к разделу инцидентов, а в SubjectID будет находиться ID записи инцидента, к которой было создано напоминание.

Итак. Появляется окошко напоминаний. Для текущей записи в окне напоминаний необходимо определить, к какому из разделов относиться данное напоминание. Такую проверку можно сделать по SubjectTypeID. По этому ID мы понимаем, что напоминание находиться в инцидентах.

Открыть окно добавления комментариев можно, к примеру, с помощью функции ShowEditWindowEx. Примеры ее использования в конфигурации есть.

Появляется окошко, вводится текст, нажимается ОК, происходит фильтрация датасета.
К примеру, ApplyDatasetFilter(IncidentDataset, 'ID', SubjectID, true);
Есть случаев использования такого фильтра в конфигурации :smile:

В теории, таким образом у нас есть все, чтобы найти необходимую запись, из окна напоминаний, к которой мы можем добавить комментарий.

Посмотрите, как реализовано добавление обычных напоминаний, к примеру, по установке "Напоминания ответственному" в карточке задачи. И подобным образом попробуйте добавить комментарий.

Роман, если по ходу реализации будут возникать вопросы, напишите.

Здравствуйте, Игорь!
Спасибо Вам за пояснения, но разобраться до конца с этой задачей я не сумел.

Раньше у меня кнопка была вообще не активна при нажатии, но сейчас, с помощью Ваших рекомендаций, у меня уже открывается окно «Комментарий», но:
1.Таких окон, как комментарий у меня сразу же 2.
2.При нажатии на кнопку комментарий, отображается окно добавления комментария (новая запись).
Окно остается (2 окна) и в нем можно даже прописать текст, а сохранить не удается так, как отсутствует «Автор».
3.Ошибок никаких нет.
Собственно на этом этапе я и застрял :sad:
Не пойму, как исправить ошибку с 2 окнами, которые открываются одновременно и как привязать к записи (к новому комментарию) автора.
Покажу Вам «кашу» (код, если его можно так назвать:smile:), может быть с него Вам будет более понятней где ошибка:

function OpenIncidentCommentEdit(Window) {
var Attributes = GetNewDictionary();
Attributes.Add('IsNew', true);
var DefaultValues = GetNewDictionary();	
ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);
var RemindingsDataset = GetSingleItemByCode('ds_IncidentComment');
ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);
var RemindingsDataset = GetSingleItemByCode('ds_TaskComment');
RemindingsDataset.Open();
	    if (!RemindingsDataset.IsEmptyPage) {
	        return;
	    }
ApplyDatasetFilter(IncidentCommentDataset, 'IncidentID', SubjectID, true);
ApplyDatasetFilter(TaskCommentDataset, 'TaskID', SubjectID, true);
}
 
function btnCommentOnClick(Control) {
	var OwnerID = Connector.CurrentUser.ContactID;
	OpenIncidentCommentEdit();
}

Игорь, спасибо Вам за помощь.

Добрый день!

Роман, Вы прописали дважды открытие окна комментариев. Одно для инцидентов (ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);), другое для задач (ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);).
Предлагаю перед открытием окон сделать проверку на то, к какому датасету относится запись и в зависимости от датасета открыть либо окно комментариев для инцидентов, либо окно для задач.

Подстановку пользователя в необходимое окно, в случае, если автор не заполняется, можно сделать при помощи DefaultValues.Add. Узнать текущего пользователя можно при помощи Connector.CurrentUser.ContactID;

А фильтрацию данных датасета (ApplyDatasetFilter) и добавление записи "повесьте" на ОК соответствующей карточки комментариев.

"Гакало Игорь Александрович" написал:

Добрый день!

Роман, Вы прописали дважды открытие окна комментариев. Одно для инцидентов (ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);), другое для задач (ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);).
Предлагаю перед открытием окон сделать проверку на то, к какому датасету относится запись и в зависимости от датасета открыть либо окно комментариев для инцидентов, либо окно для задач.

Подстановку пользователя в необходимое окно, в случае, если автор не заполняется, можно сделать при помощи DefaultValues.Add. Узнать текущего пользователя можно при помощи Connector.CurrentUser.ContactID;

А фильтрацию данных датасета (ApplyDatasetFilter) и добавление записи "повесьте" на ОК соответствующей карточки комментариев.

Спасибо Игорь, за предоставленный ответ.
Я бы с радостью выполнил Ваши рекомендации, но не могу по той простой причине, что я не опытен в JScript’e, да и в других областях программирования. (учусь по мере возможностей)

Пробивал подобрать похожие коды, с разных сервисов, но не получилось у меня….

К примеру, я понимаю, о чем Вы здесь написали:
«…Предлагаю перед открытием окон сделать проверку на то, к какому датасету относится запись и в зависимости от датасета открыть либо окно комментариев для инцидентов, либо окно для задач…»
Но как оно должно выглядеть в коде понятия не имею. Знаю как называются нужные для меня окна в сервисах, но....:sad:

Игорь, я прошу у Вас извинения за то, что Вас отвлекаю, но могли бы Вы мне «разжевать» то о чем Вы писали ранее.
Спасибо.

Роман, сейчас попробую сделать проверку, о которой я говорил, и по результату напишу.

"Гакало Игорь Александрович" написал:

Роман, сейчас попробую сделать проверку, о которой я говорил, и по результату напишу.

Спасибо большое, жду.

В окне напоминаний у нас есть колонка "Тип объекта" (по умолчанию крайняя права), в которой мы видим, к какому разделу относится данное напоминание.

По нажатию на кнопку нам необходимо получить запись этого поля.
Для выделенной записи в реестре напоминаний нам подойдет следующий код:

if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Задача') 
{
sw = 0;
}
 
if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Инцидент') 
{
sw = 1;
}

В зависимости от типа раздела напоминаний, происходила запись нуля или единички в переменную. В условие проверки впишите открытие необходимого окна комментариев, либо инцидентов, либо задач. Таким образом, будет открываться только одно окно и нужное.

"Гакало Игорь Александрович" написал:

В окне напоминаний у нас есть колонка "Тип объекта" (по умолчанию крайняя права), в которой мы видим, к какому разделу относится данное напоминание.

По нажатию на кнопку нам необходимо получить запись этого поля.
Для выделенной записи в реестре напоминаний нам подойдет следующий код:

if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Задача')
{
sw = 0;
}

if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Инцидент')
{
sw = 1;
}

В зависимости от типа раздела напоминаний, происходила запись нуля или единички в переменную. В условие проверки впишите открытие необходимого окна комментариев, либо инцидентов, либо задач. Таким образом, будет открываться только одно окно и нужное.

Игорь, спасибо Вам, но где находится "условие проверки", как оно изображено в коде?
И как правильно сделать подстановку пользователя в этом коде?

Сейчас у меня открываются 2 окна одновременно, без автора.

Проверьте, пожалуйста, что не правильно в этом коде (по идее - все не правильно:smile:):

function OpenIncidentCommentEdit(Dataset) {
 var IncidentID = Dataset.Values('IncidentID'); {
	var IncidentData = GetDatasetFieldValuesByID('ds_Incident', IncidentID,
		'OwnerID', 'ContactID');
	if (IncidentData == null) {
		return;
	}
  } 
}
 
function OpenTaskCommentEdit(Dataset) {
 var TaskID = Dataset.Values('TaskID'); {
	var TaskData = GetDatasetFieldValuesByID('ds_Task', TaskID,
		'OwnerID', 'ContactID');
	if (TaskData == null) {
		return;
	}
  }
} 
 
function OpenIncidentCommentEdit(Window) {
 if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Инцидент') 
{
sw = 1;
}
var Attributes = GetNewDictionary();
Attributes.Add('IsNew', true);
var DefaultValues = GetNewDictionary();	
/*if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Инцидент') 
{
sw = 1;
}*/
ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);
var RemindingsDataset = GetSingleItemByCode('ds_IncidentComment');
RemindingsDataset.Open();
            if (!RemindingsDataset.IsEmptyPage) {
                return;
            }
ApplyDatasetFilter(IncidentCommentDataset, 'IncidentID', SubjectID, true);
ApplyDatasetFilter(Dataset, 'AuthorID', AuthorID, true);
 }
 
function OpenTaskCommentEdit(Window) {
var Attributes = GetNewDictionary();
Attributes.Add('IsNew', true);
var DefaultValues = GetNewDictionary();	
/*if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Задача') 
{
sw = 0;
}  */
ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);
var RemindingsDataset = GetSingleItemByCode('ds_TaskComment');
RemindingsDataset.Open();
            if (!RemindingsDataset.IsEmptyPage) {
                return;
            }
ApplyDatasetFilter(TaskCommentDataset, 'TaskID', SubjectID, true);
ApplyDatasetFilter(Dataset, 'AuthorID', AuthorID, true);
}
 
function btnCommentOnClick(Control) {
	if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Инцидент') 
{
sw = 1;
}	
    OpenIncidentCommentEdit();
    if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Задача') 
{
sw = 0;
}
    OpenTaskCommentEdit();
}

Спасибо.

Роман, использование переменной sw было только для примера :smile: Использовать ее не стоит)

В базовой версии комментариев в задачах нет, поэтому полностью проверить не смог.
Условие вызова окна в зависимости от типа будет выглядеть так:

if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Задача') 
{
ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);
}
 
if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Инцидент') 
{
ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);
}

:smile:
Да, действительно сейчас у меня добавляются комментарии в соответствии от выбранного поля, но автор не подтягивается. Пробивал так:

DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
// и так
var AuthorCommentID = Connector.CurrentUser.ContactID;
DefaultValues.Add('SubjectID', OwnerID);

Как видите - без результатов.

Игорь, для того что бы у меня в окно комментариев добавлялся автор, мне нужно в коде указать ID контакта (пользователя) и SubjectID или что то другое?
Спасибо.

Автора в окно добавил, как показано в коде ниже:

	var Attributes = GetNewDictionary();
	Attributes.Add('IsNew', true);
	var DefaultValues = GetNewDictionary(); 
	var OwnerID = Connector.CurrentUser.ContactID;
	var DefaultValues = GetNewDictionary();
	DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
	var IncidentID = dlData.Dataset.Values('SubjectID');
	var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID');
 
	if (SubjectType == 'Задача') 
	{
		ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);
	}
 
	if (SubjectType == 'Инцидент') 
	{
		ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);
	}

Обратите внимание на то, что сравнение типа объекта было изменено через переменную (по совету добрых наблюдателей темы :wink:).
И есть еще один момент, который также можно улучшить - проверку не по DisplayValues, а по Values. Тип напоминания может быть переименован, ID останется прежним.
Посмотреть ID Вы можете в перечислении, как показано на скриншоте:

1

Вы можете опционально изменить запись в переменную так:

var SubjectType = dlData.Dataset.Values('{8E742F80-1C1A-4657-8D46-F189F0640544}');

Здравствуйте, Игорь!

Извините за то, что долго не отвечал, не было времени проверить.
Сейчас проверил, следуя Вашим рекомендациям и рекомендациям наблюдателей темы (спасибо:smile:), автор подтягивается, все отлично, но (как всегда:smile:) запись (комментарий) не сохраняется в реестре Инцидентов и Задач.
Как я понимаю, я не прописал фильтрацию данных датасета.
Вы ранее писали что: «фильтрацию данных датасета (ApplyDatasetFilter) и добавление записи "повесьте" на ОК соответствующей карточки комментариев.» Не пойму как мне это сделать.
Пробивал разные подобные коды в сервисах. Привожу пример (закомментированные поля, это те которые я пробивал):

function OpenIncidentCommentEdit(Window) {
var Attributes = GetNewDictionary();
Attributes.Add('IsNew', true);
        var DefaultValues = GetNewDictionary(); 
        var OwnerID = Connector.CurrentUser.ContactID;
        var DefaultValues = GetNewDictionary();
        DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
        var IncidentID = dlData.Dataset.Values('SubjectID');
        var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID');
if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Инцидент') 
{
ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);
}
var RemindingsDataset = GetSingleItemByCode('ds_IncidentComment');
RemindingsDataset.Open();
            if (!RemindingsDataset.IsEmptyPage) {
                return;
            }
ApplyDatasetFilter(IncidentDataset, 'ID', SubjectID, true);          
//ApplyDatasetFilter(IncidentCommentDataset, 'IncidentID', SubjectID, true);
//ApplyDatasetFilter(Dataset, 'AuthorID', OwnerID, true);
 }
 
function OpenTaskCommentEdit(Window) {
var Attributes = GetNewDictionary();
Attributes.Add('IsNew', true);
var DefaultValues = GetNewDictionary();	
var OwnerID = Connector.CurrentUser.ContactID;
var DefaultValues = GetNewDictionary();
DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
var TaskID = dlData.Dataset.Values('SubjectID');
var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID');
if (dlData.Dataset.DisplayValues('SubjectTypeID') == 'Задача') 
{
ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);
}
var RemindingsDataset = GetSingleItemByCode('ds_TaskComment');
RemindingsDataset.Open();
            if (!RemindingsDataset.IsEmptyPage) {
                return;
ApplyDatasetFilter(TaskDataset, 'ID', NewCommentID, true);            }
//ApplyDatasetFilter(TaskCommentDataset, 'TaskID', SubjectID, true);
//ApplyDatasetFilter(Dataset, 'OwnerID', OwnerID, true);   
//ApplyDatasetFilter(Dataset, 'ID', RecordID, true);
}
 
function btnCommentOnClick(Control) {
    OpenIncidentCommentEdit();
    OpenTaskCommentEdit();
}

И еще одно, не понимаю, что Вы имели, введу: "И есть еще один момент, который также можно улучшить - проверку не по DisplayValues, а по Values. Тип напоминания может быть переименован, ID останется прежним.
Посмотреть ID Вы можете в перечислении, как показано на скриншоте:"

Можно поподробнее описать.
Спасибо.

Доброе утро, Роман!

На самом деле, комментарий сохраняется. В этом Вы можете убедиться, сделав выборку на базе данных:

select * from tbl_IncidentComment

Дело в том, что запись в таблице есть, но IncidentID у него NULL, поэтому ни на одной детали записи нет.
Для решения вопроса обойдемся без фильтрации данных. Просто можно запостить комментарий, при этом присвоив IncidentID.

То есть, в скрипте комментариев добавим условие, что если комментарий добавляется из окна напоминаний, то сделать запись IncidentID. Реализуемо с помощью атрибутов. Когда проверю этот вариант, напишу Вам.

P.S: Идея насчет ID довольно детально описана в предыдущем моем посте, если что-то детально не понятно, напишите.

Роман, использовав атрибуты, код принял следующий вид:

	var CommentSource = Connector.Attributes('CommentSource');
	var Incident = Connector.Attributes('Incident');
	var Task = Connector.Attributes('Task');
 
	var Attributes = GetNewDictionary();
	Attributes.Add('IsNew', true);
	var DefaultValues = GetNewDictionary(); 
	var OwnerID = Connector.CurrentUser.ContactID;
	var DefaultValues = GetNewDictionary();
	DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
 
	Connector.Attributes('Incident') = dlData.Dataset.Values('SubjectID');
	var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID');
 
	if (SubjectType == 'Задача') 
	{
		ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);
		Connector.Attributes('CommentSource') = 'Task';  
	}
 
	if (SubjectType == 'Инцидент') 
	{
		ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);
		Connector.Attributes('CommentSource') = 'Incident';
	}

Затем я создал событие ds_IncidentCommentOnDatasetBeforePost для ds_IncidentComment:

1

На обработку в него поместил код:

if (Connector.Attributes('CommentSource') == 'Incident'){
Dataset.Append();
Dataset.Values('IncidentID') = Connector.Attributes('Incident');
}

После этого комментарий добавлялся к необходимому инциденту :wink:

Здравствуйте, Игорь!
Спасибо Вам, спасибо Вам наблюдатели темы – кнопка работает, комментарий успешно добавляется.:biggrin:
Вот получившийся код:

function OpenIncidentCommentEdit(Window) {
var CommentSource = Connector.Attributes('CommentSource');
        var Incident = Connector.Attributes('Incident');
 
        var Attributes = GetNewDictionary();
        Attributes.Add('IsNew', true);
        var DefaultValues = GetNewDictionary();
        var OwnerID = Connector.CurrentUser.ContactID;
        var DefaultValues = GetNewDictionary();
        DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
 
        Connector.Attributes('Incident') = dlData.Dataset.Values('SubjectID');
        var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID');
        if (SubjectType == 'Инцидент')
        {
                ShowEditWindowEx('wnd_IncidentCommentEdit', Attributes, DefaultValues);
                Connector.Attributes('CommentSource') = 'Incident';
        }
}        
function OpenTaskCommentEdit(Window) {
var CommentSource = Connector.Attributes('CommentSource');
        var Task = Connector.Attributes('Task');
        var Attributes = GetNewDictionary();
        Attributes.Add('IsNew', true);
        var DefaultValues = GetNewDictionary();
        var OwnerID = Connector.CurrentUser.ContactID;
        var DefaultValues = GetNewDictionary();
        DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);
        Connector.Attributes('Task') = dlData.Dataset.Values('SubjectID');
        var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID');
 
        if (SubjectType == 'Задача')
        {
                ShowEditWindowEx('wnd_TaskCommentEdit', Attributes, DefaultValues);
                Connector.Attributes('CommentSource') = 'Task';  
        }
}
function btnCommentOnClick(Control) {
    OpenIncidentCommentEdit();
    OpenTaskCommentEdit();
}

P.S.
С Вашего поста: «И есть еще один момент, который также можно улучшить - проверку не по DisplayValues, а по Values. Тип напоминания может быть переименован, ID останется прежним.
Посмотреть ID Вы можете в перечислении, как показано на скриншоте:»
Банальный вопрос:smile::
Зачем переименовивать тип напоминания?
Что в итоге поменяется, если проверку делать по Values?
Если я правильно понимаю, то я могу использовать этот код:

var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID')

Или этот (проверку делать по ID):

var SubjectType = dlData.Dataset.Values('{8E742F80-1C1A-4657-8D46-F189F0640544}');

А в чем разница?:smile:
Если подобные команды где-то описаны (руководство может) подскажите, пожалуйста, о них.
Спасибо.

Роман, только в том, что в первом случае мы обращаемся по имени, а во втором - по ID :)
Правильным тоном является обращение по ID.
Кроме случаев, если может быть несколько перечислений с одинаковыми именами или имя будет переименовываться, придумать причин не могу. Оба варианта исключает использование ID.

"Roman.Mykytenko" написал:Зачем переименовивать тип напоминания?
Что в итоге поменяется, если проверку делать по Values?
Если я правильно понимаю, то я могу использовать этот код:
var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID')

Или этот (проверку делать по ID):
var SubjectType = dlData.Dataset.Values('{8E742F80-1C1A-4657-8D46-F189F0640544}');

А в чем разница?


Не совсем:
Вы можете проверку выполнять так:

var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID');
if (SubjectType == "Задача") {// do something}

НО, если отображаемое значение будет изменено, то Ваш код просто перестанет работать. Зачем переименовывать Вас не должно сильно волновать, т.к. в этом конкретном случае, может, быть никто и не будет менять заголовок, но в общем случае справочники даются пользователю с возможностью их редактировать и задачу легко могут назвать активностью, а вот Id записи из интерфейса пользователя поменять не удастся, поэтому Ваша проверка станет надежнее, если проверять Вы будете значение, которое с меньшей вероятностью может быть изменено. Лучше всего, конечно, проверять по коду, если в справочнике есть такое поле, но давайте пока что остановимся на этом:

var taskSubjectTypeId = '{8E742F80-1C1A-4657-8D46-F189F0640544}';
var SubjectTypeId = dlData.Dataset.Values('SubjectTypeId');
if (SubjectTypeId == taskSubjectTypeId) {//do something} 

Спасибо Игорь.

В ходе тестирования комментариев с напоминаний, они успешно добавлялись к соответствующему Инциденту или Задаче.
Когда я добавлял комментарий не через напоминания, к примеру, создавал новый Инцидент (или существующий) комментарий к нему не добавлялся, а добавляется к тому Инциденту или Задаче к которому ранее добавил комментарий через напоминания.
Это через, то что мы обращаемся по имени, а не по ID?

"Раловец Ольга" написал:Roman.Mykytenko пишет:

Зачем переименовивать тип напоминания?
Что в итоге поменяется, если проверку делать по Values?
Если я правильно понимаю, то я могу использовать этот код:
var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID')

Или этот (проверку делать по ID):
var SubjectType = dlData.Dataset.Values('{8E742F80-1C1A-4657-8D46-F189F0640544}');

А в чем разница?

Не совсем:
Вы можете проверку выполнять так:

var SubjectType = dlData.Dataset.DisplayValues('SubjectTypeID');
if (SubjectType == "Задача") {// do something}
НО, если отображаемое значение будет изменено, то Ваш код просто перестанет работать. Зачем переименовывать Вас не должно сильно волновать, т.к. в этом конкретном случае, может, быть никто и не будет менять заголовок, но в общем случае справочники даются пользователю с возможностью их редактировать и задачу легко могут назвать активностью, а вот Id записи из интерфейса пользователя поменять не удастся, поэтому Ваша проверка станет надежнее, если проверять Вы будете значение, которое с меньшей вероятностью может быть изменено. Лучше всего, конечно, проверять по коду, если в справочнике есть такое поле, но давайте пока что остановимся на этом:

var taskSubjectTypeId = '{8E742F80-1C1A-4657-8D46-F189F0640544}';
var SubjectTypeId = dlData.Dataset.Values('SubjectTypeId');
if (SubjectTypeId == taskSubjectTypeId) {//do something}

Здравствуйте, Ольга!
Спасибо Вам за разъяснения.
Теперь я понял, зачем надо было делать проверку по ID.
Пробивал сделать по аналогии с тем, как Вы описали, к сожалению, код у меня вышел не рабочий.
Объект «DataField {Id Инцидента или Задачи}» не предназначен.
В принципе заголовки никто не будет менять, кроме меня, по этому, сейчас у меня нет нужды в том, чтобы проверку делать по ID.
Сейчас, я не пойму, почему у меня все новые записи (комментарии) добавляются к тому типу объекта, к которому я ранее добавил комментарий через напоминания. :smile:

Роман, дело в том, что значения атрибутов остались теми, которые использовались при заполнении напоминаний. То есть условие if (Connector.Attributes('CommentSource') == 'Incident') продолжает выполняться. Необходимо в них записать другие значения.

Измените код следующим образом:

if (Connector.Attributes('CommentSource') == 'Incident'){
Dataset.Append();
Dataset.Values('IncidentID') = Connector.Attributes('Incident');
}
    Connector.Attributes('CommentSource') = null;
    Connector.Attributes('Incident') = null;

Игорь, спасибо, все работает :smile:
В случае неработоспособности функционала, я отпишусь.

Показать все комментарии

Здравствуйте. Однажды я уже писала о знаменательных событиях в Террасофт (https://community.terrasoft.ua/forum/topic/5574).
Самое интересное, что на тот момент я была уверена , и сотрудники техподдержки видимо тоже, что нормальных напоминаний без доработок в нашей версии 3.3 получить нельзя.
Я решила отложить эту задачу, и просто не занималась этим вопросом больше чем полгода.
А потом случайно в системных настройках увидела переменную CheckAnniversaryForDays.
В комментарии к ней написано - " Проверяется наличие знаменательных событий за указанное количество дней. Если установлено значение 0, проверка не будет осуществлена".
В этом поле по умолчанию стояло значение именно 0.
Очень интресная переменная.
Я поискала ее использование в скриптах. И, о чудо: нашла две функции, CheckAnniversary и SetNewRemindingByAnniversary в скрипте scr_Main. Получается, что если переменная CheckAnniversaryForDays не равна 0, то при открытии Террасофт пользователю по его контактам должно приходить напоминание по знаменательным событиям его контакта!
После этого я радостно изменила 0 в переменной на 2. Но при тесте напоминания не пришли.
Я внимательно пречитала скрипт и исправла проверку условия CheckAnniversaryForDays == DayDateDiff на CheckAnniversaryForDays >= DayDateDiff. Напоминания стали приходить!
Правда, не правильно. Если сегодня 07.09.2011, то напоминания о дне рождения с датой 09.09.1960 не приходят, а о событии 09.09.2011 и о событии 05.09.2011 приходят.
Поэтому изменить скрипт пришлось еще раз:

if (AnniversaryDate>=SystemDate) {
if (CheckAnniversaryForDays >= DayDateDiff) {
SetNewRemindingByAnniversary(AnnyversaryDataset);
}
}
 if (AnniversaryDate var i=0;
DayDateDiff = -DayDateDiff ;
while (DayDateDiff0){
 DayDateDiff = DayDateDiff +365;
 i=i+1;
 if (i==4){
DayDateDiff = DayDateDiff+1;
 i=0;
}
}
if (CheckAnniversaryForDays >= DayDateDiff) {
SetNewRemindingByAnniversary(AnnyversaryDataset);
}
}  

Вот в таком написании напоминания приходят! и по событию 09.09.1960 ! и по 09.09.2011. И не приходят по событию 05.09.2011.

Надеюсь, что это поможет всем тем, кто ее не разобрался с этой проблемой сам.

Нравится

0 комментариев
Показать все комментарии

Всем добрый день.Сегодня с удивлением обнаружила , что в разделе Операции нет детали напоминаний... Начала восстанавливать этот пробел.
Создала саму деталь в разделе, сделала функции по обновлению и инциализации детали. По образу и подобию этих деталей в других разделах.
Потом нашла перечисление, в котором кодируется тип объекта напоминания. Есть такое enm_RemindingSubjectType. Оказалось , что там уже прописан нужный тип rst_Cafhflow.
Видимо , до меня разработчики пытались создать напоминания в этом разделе, но передумали. :smile:
Потом еще изменила sq_Remindings, добавив туда CashflowSelect (опять же - по принципу и подобию с другими разделами). Скриншот в файле. Что интересно , параметр CashflowSubjectTypeID создавать не пришлось, до меня был создан :smile:
И вот после всех этих изменений, попробовала создать напоминание в детали Напоминания в разеделе Операции. Деталь открылась, напоминание добавить получилось. В момент его выполнения у меня появилась в скрипте scr_Remindings (в файле есть скриншот).
Как исправить?

Нравится

8 комментариев

А если в отладчике нажать F5 (чтобы продолжить выполнение) - какую ошибку в лог записывает?

Сообщение об ошибке: OLE error 80020101 (и далее в файле). Ошибка будет повторяться потом до тех пор, пока в разделе Операции не удалить ошибочное напоминание.

Можете выложить sq_Remindings ?

Думала, что смогу, но оказалось , что при этом выдается лог:
[11.07.04 16.05.54.900] (W) Can't show Select Query text.
Details: Property 'Join.LeftField' not assigned

Перепроверила все Joinы, там все поля определены. Не пойму в чем же причина.

начала проверять другие Joinы, которые были в этом sq до моих изменений, и нашла такой "поломанный"... Исправила.
Странно, что напоминания из других разделов в системе уходили нормально. Напоминания из раздела Операции все равно не уходят.

Тект sql запроса в файле

Если можно, сохраните sq_Remindings в виде файла, и выложите на форум.
Также, проверьте галочки "Всегда выбирать в запросе" у колонок своего подзапроса - они должны быть установлены/сняты так же, как и у колонок других подзапросов:

И еще, очень важно, может сразу и поможет - ваш подзапрос называется CashflowSelect. Назовите его tbl_Cashflow, в последних версиях Террасофта это неявное, но обязательное требование для корректного отображения напоминаний

Действительно, помогло!!!:smile:
Вот никогда бы не догадалась бы, ведь везде не так называется!

Показать все комментарии

Недавно заказчик захотел, чтобы, при появлении нового напоминания, свернутое окно напоминаний разворачивалось и выводилось на передний план.
В версии Terrasoft XRM 3.3.1 в стандартном функционале окно напоминаний не разворачивается при появлении нового напоминания - выполняется метод BringToFront(), но он не разворачивает свернутое окно:

Посмотрел в SDK и не нашел там еще какой-либо функции для разворачивания окна. Найти метод окна, который бы выполнял нужные мне действия, помог отладчик:

Это метод окна ForceBringToFront(), он разворачивает свернутое окно и выводит его на передний план.
Заменил вызов метода BringToFront() на ForceBringToFront(), и получил желаемый результат.

Нравится

Поделиться

0 комментариев
Показать все комментарии

Всем добрый день.
Возможно, что эта тема не нова, и я повторюсь, но написать все же хочется.
Поделитесь, пожалуйста, опытом - как Вы используете деталь Знаменательные события в Контактах и Контрагентах?

Неужели никому и никогда не приходило в голову, что по сути если на этой детали создать запись о знаменательном событии, то Вы никогда не получите от Террасофта напоминание о том, что вам надо кого-то поздравить.

Как это получается? Вы можете написать, например, что День рождения у Вашего клиента 01.11.1980г и еще добросовестно заполнить эту деталь у 5000 Ваших клиентов. Но с этой информацией ничего не произойдет далее, и Вы каждый день будете просматривать список Ваших клиентов, выискивая у кого же в ближайшем будущем День рождения.
Нет, Вы, конечно, можете поставить себе отдельно вручную задачу в расписание. Такая функция есть. Заметьте, что это 5000 задач, поставленных вручную.
Задача, правда, возникнет автоматически 01.11.2010, а не 01.11.2011. И если ответственный не Вы, то придется поменять ответственного в самой задаче. Но это уже детали, ведь Вы достигли цели.
Хорошо еще то, что мы в своей базе дописали себе возможность ставить циклические задачи, т.е. я создавая задачу укажу, что повторять эту задачу надо раз в год 50 лет подряд.

Но возможно кто-то из Вас когда-либо пользовался Outlook. Тогда вы знаете, что там тоже есть знаменательные события и расписание с задачами. Если не знаете, я Вам расскажу как это работает: просто заполнив поле День рождения контакта Вы сразу получите в своем расписании циклическое событие! Одно заполненное поле!

Кстати, если Вы решите, что в Террасофт можно просто сформировать отчет по знаменательным событиям Ваших клиентов (сделать выборку на текущую неделю), спешу Вас огорчить - у Вас получится это сделать, если дни рождения написаны в форме 01.11.2010, а не 01.11.1980.
Т.е. у Вас будет прекрасная возможность раз в год, желательно 1 января, сесть и открыть все 5000 записей по Вашим клиентам и проставить новые знаменательные события.

Чего бы хотелось ? Хотелось бы, чтобы напоминания (задачи) формировались ответственному автоматически после установки знаменательного события на детали.
Может быть, кто-то уже реализовывал это у себя в базе?

Нравится

5 комментариев

Виктория, здесь один из вариантов решения.

Уважаемый Олег,
Спасибо за ссылку, но должен обратить Ваше внимание, что функция работы со Знаменательными событиями - это функция для рядовых пользователей.
А Вы даете ссылку на рекомендации программисту как написать программу для решения этой задачи.
Вопрос - а когда это решение появится в стандартной версии Террасофт в виде, удобном для обычного пользователя?

Федор Владимирович, это решение появится в следующей версии, 3.4.0. В конфигурацию Terrasoft будет добавлен так называемый Job-менеджер, с помощью которого можно будет запланировать на сервере создания напоминаний по знаменательным событиям, а также любые другие действия, которые должны периодически выполняться. На данный момент эта функциональность реализована в TS XRM Bank 3.3.2, а в версии 3.4.0 будет добавлена и в остальные продукты Terrasoft.

Да, очень жаль, что прийдется самим устранять этот пробел. Ведь никто же не станет переходить из версии в версию с доплатой ради этого функционала. Возможно, это можно включить в какое-то бесплатное обновление ?

"Тихенко Виктория" написал:Возможно, это можно включить в какое-то бесплатное обновление

Ну самостоятельно часть функционала для себя завсегда руками в виде сервисов из конфигурации можно перенести:wink:

Показать все комментарии

В версии X25 3.2 при отображении напоминаний дублируются значение в столбце Объект и Описание (в случаи задачи это ее название), хотя в руководстве пользователя написанно совсем другое. Подскажите, что это такое и как с этим бороться?

Нравится

3 комментария

В поле [Объект] отображается заголовок задачи.
В поле [Описание] отображается введенное Вами описание данного напоминания.

В случае, если Вы имеете ввиду автоматически создаваемые напоминания - то в поле [Описание] напоминания заноситься тот же заголовок, так как подобного поля нет в карточке задач.

Вы можете изменить базовую логику корректируя текст напоминания или назначив другое поле(не [Заголовок]) для отображения в напоминании. Для этого измените скрипт scr_TaskEdit
Функция ActualizeRemindingForContact
Строка
RemindingDataset.ValAsStr('Description') = Dataset.Values('Title');

Это понятно. Спасибо.
Но вот в файле скрин из руководства. Можно ли отображать данные напоминания в данном формате?

Предоставленный Вами скриншот - напоминание по контакту, где объектом является название контакта, а описание введено вручную.
Для отображения подобного формата перейдите в раздел [Контакты] и создайте напоминание по выбранному контакту.

Вы можете отображать напоминания в любом необходимом для Вас формате (назначив любое поле для подстановки, по умолчанию, при автоматическом создании напоминания) используя предоставленный выше код.
В случае если Вам необходимо чтобы при создании автоматического напоминания по задаче указывался контакт, по которому выставлена задача - используя упомянутый код, измените отображаемое поле в строке:
RemindingDataset.ValAsStr('Description') = Dataset.Values('/Ваше поле/');
Где Ваше поле - название поля [Контакт] в карточке Задач.

Показать все комментарии

Здравствуйте!
Хочу автоматический изменять напоминания по определенной задачи для ответственного,
Некоторые строчки из моего кода:
var ds_Remind = dl_remLNK.Dataset;//ds_Remindings
vat ds_rem = ds_Remind.DataFields.ItemsByName('RemindTime');
RemindToOwnerID = DataFields.ItemsByName('RemindingToOwnerID');
//датасет задачи

ApplyDatasetFilter(ds_Remind, 'ID',RemindToOwnerID, true);
// пытаюсь фильтровать по ответственному
ds_Remind.Open();
ds_Remind.edit();
ds_rem.ValAsDateTime = Event.Start;
ds_Remind.post();

у меня никак не получается нормально фильтровать записи, чтобы найти напоминание связанное с ответственным по задаче и внести изменения в расписание напоминания,
буду рад любой помощи, особенно был бы признателен за примеры.
С уважением Марат Мамажанов.

Нравится

19 комментариев

Вы применяете фильтр по полю ID(я так понимаю ID записи напоминания), а следует по полю контакта ContactID.

да я уже пробывал, только вот ошибки все равно выходят, когда ставлю ContactID, выходит ошибка что невозможно вставить значение nill, значение не допустипо для этого поля, а когда ставлю id вообще "выходит неопознаная ошибка"
это мне лог так пишет

В случаи с ContactID попробуйте вывести какое либо поле dataset-а(отбирает ли фильтр значения?).
Возможно Вы пытаетесь вставить пустое значение(Event.Start).

Event.Start значение не пустое, т.к. предворительно я туда присваиваю опред-е значение, да и лог ругается совсем на другое, я так понял что фильтрация если и происходит, то не потому значению либо она вообще у меня не срабатывает, так как в случае если фильтрация удачно, то поле "описание" не должно быть пустым, там уже есть старое описание задачи, а когда я присваиваю полю RemindTime значение Event.Start то оно присваетвается но при этом ругается что поле "описание" не должно быть пустым, в этом случае значит что фильтрация не дала нужного результата, как думаете может мне по пробывать вместо edit(); использовать append(); ???

Не стоит.
На какое событие вызывается Ваш скрипт?

UpdateDatasetRecordByEvent(Dataset, Event)
вот весь код:

function UpdateDatasetRecordByEvent(Dataset, Event) {

var DataFields = Dataset.DataFields;
//121321321

//4654654
var StartDateDataField = DataFields.ItemsByName('StartDate');
var DueDateDataField = DataFields.ItemsByName('DueDate');
var OwnerIDDataField = DataFields.ItemsByName('OwnerID');
var RemindToOwnerID = DataFields.ItemsByName('RemindingToOwnerID');
Dataset.Locate('ID', Event.ID);
var PriorStartDate = StartDateDataField.ValAsDateTime;
var PriorDueDate = DueDateDataField.ValAsDateTime;
if (!CheckTaskCovering(Dataset,OwnerIDDataField,Event.Start,Event.Finish)) {
CancelChangeEvent(Event, PriorStartDate, PriorDueDate);
return;
}

Dataset.Edit();
var RemindingToOwnerID = Dataset.Values('RemindingToOwnerID');
var uq_Remindings = GetSingleItemByCode('uq_Remindings', 'uq_RemindSingle');
var ds_Reminding1 = dl_remLNK.Dataset;
var Parameters = uq_Remindings.Parameters;
var ColumnsValues = uq_Remindings.ColumnsValues;
var ds_rem = ds_Reminding1.DataFields.ItemsByName('RemindTime');
var OwnerID = Dataset.DataFields.ItemsByName('OwnerID');
// SetParameterValue(Parameters, 'ID', RemindingToOwnerID);
// ColumnsValues.ItemsByName('RemindTime').Value = Event.Start;
// uq_Remindings.Execute();
//ds_Reminding1.Close();
// ds_Reminding1.DisableEvents();
ApplyDatasetFilter(ds_Reminding1, 'ID', RemindToOwnerID, true);
//ApplyDatasetIDFilter(ds_Remindings, RemindingToOwnerID, true);
// ds_Reminding1.EnableEvents();
ds_Reminding1.Open();
//RefreshDataset(ds_Remindings);
ds_Reminding1.edit();
ds_rem.ValAsDateTime = Event.Start;
ds_Reminding1.post();

StartDateDataField.ValAsDateTime = Event.Start;
DueDateDataField.ValAsDateTime = Event.Finish;
UpdateDuration(Dataset);
Dataset.Post();
UpdateEventColorsByDatasetRecord(Event, Dataset);

}

Передаете Dataset задач?

RemindToOwnerID = DataFields.ItemsByName('RemindingToOwnerID');
не вернет значение для
ApplyDatasetFilter(ds_Remind, 'ID',RemindToOwnerID, true);

и если хотите вернуть напоминания по ответственному то лучше
var RemindToOwnerID = Dataset.Values('RemindingToOwnerID');
ApplyDatasetFilter(ds_Remind, 'ComtactID',RemindToOwnerID, true);

Здравствуйте!
Что-то у меня никак не заладится, сделал:

var RemindToOwnerID = Dataset.Values('RemindingToOwnerID');
ApplyDatasetFilter(ds_Remind, 'ContactID',RemindToOwnerID, true);

как мне и посоветовали, но все равно не выходит, если я ставлю имя поля по которому фильтровать ID то выходит неопознаная ошибка, а если ставлю ContactID то выходит след-я ошибка:
[09.07.02 09.26.43.281] (E) Ошибка выполнения метода 'ScheduleControlOnChangeEvent'. Ошибка сохранения записи. Оригинальное сообщение об ошибке: Выполнение данной инструкции было прервано.
Не удалось вставить значение NULL в столбец "Description", таблицы "tsDemo331.dbo.tbl_Reminding"; в столбце запрещены значения NULL. Ошибка в INSERT «Call Stack»

из чего следует, что фильтр не вернул мне того значение, которо мне нужно, т.к. в таком случае поле "Description" небыло бы пустым, в нем должно хранится описание напоминания, я лишь пытаюсь изменить его время,
к стати еще вот такой вопрос, там же где и ds_Remindig там есть и ds_Remindigs чем они отличаются, какого назначение каждого?

может я не правильно подставляю датасет в фильтр, так как
датасет связанный с напомянанимями, я просто подключил данный источник данных к форме расписания задачи в не визульных компанентах, как дополнительный источник данных (dl_Link) просто потому-что не знал как подключить датасет из другого раздела, другой группы....в данный раздел, хотя запись в датасет идет, иначе ошибка в поле "Description" не появлялась бы........

Не понимаю причем здесь поле Description, ведь Вам нужно только время изменить. Или Вы хотите создавать новую напоминалку?

в этом и есть проблема, я хочу изменить время и для этого делаю фильтрацию по ответсвенному для того чтобы изменить время на том напоминании, кторое относится к нему, у которого поле Description уже заполнено, но фильтрации не просходит, и когда я пытаюсь изменть время, то запись идет вообще в другое напоминание, или создается новое, в котором это смое поле Description не заполнено, так происходит потому что у меня никак не заработает фильтр, или есть еще проблемы о которых я не догадываюь .. .
вот так обстоят дела

Марат, а Вы смотрели запрос в Profiler, который идет при включении фильтра?

:) а где этот Profiler можно посмотреть : ) я вообще навичек в этой среде, так что вы уже меня простите если задаю глупые вопросы : )

Марат, Profiler устанавливается с полным MS SQL:

я так понимаю что пример этот с 2000 го sql, у меня 2005 и Profiler мне найти не удалось : (

Функция, которая будет обновлять конкретное напоминание.
ContactID - контакт;
SubjectID - запись, для которой необходимо изменить напоминание;
NewTime - новое время напоминания;

function UpdateRiminding(ContactID, SubjectID, NewTime) {
	if ((IsEmtyValue(ContactID)) || (IsEmtyValue(SubjectID))) {
		ShowInformationDialog('Пустой параметр!');
		return;
	}
	var RimindingQuery = GetSingleItemByCode('sq_Reminding');
	RimindingQuery.Parameters.ItemsByName('ContactID').Value = ContactID;
	RimindingQuery.Parameters.ItemsByName('SubjectID').Value = SubjectID;
	var RemindingDataset = RimindingQuery.Open();
 
	if (IsEOF(RemindingDataset)) {
		return;
	}
	var OldTime = RemindingDataset.ValAsDateTime('RemindTime');
	var RemindingID = RemindingDataset.Values('ID');
	RemindingDataset.Close();
 
	var UpdateQuery = GetSingleItemByCode('up_Temp');
	UpdateQuery.Parameters.ItemsByName('ID').Value = RemindingID;
	UpdateQuery.ColumnsValues.ItemsByName('RemindTime').Value = NewTime;
	UpdateQuery.Execute();
 
}

пример запроса в файле.

Добрый день!
Вопрос по SQL 2005 оказывается довольно актуальный)
Не могли бы Вы открыть секрет как все же найти там profiler?
Спасибо!

Есть решение, вопрос снимается:twisted:
[quote="Лабьяк Олег Игоревич"]Если у Вас не Express, а более полная версия, то он находится в меню Tools->SQL Server Profiler. Если Express, то бесплатный профайлер, говорили, можно здесь скачать: http://sqlprofiler.googlepages.com/[/quote]

Показать все комментарии

Следующий материал описывает работу с окном напоминаний. Очень часто пользователи хотят отобразить дополнительную информацию элемента по которому создано напоминание: приоритет задачи, тип и т.п. в "некой" дополнительной колонке. Но не все знают как же добавить эту дополнительную колонку...

Воспользовавшись данными инструкциями Вы сможете по аналогии добавить колонки в окно напоминаний и отобразить в них необходимую для Вашей работы информацию.

Удачи!

Нравится

Поделиться

0 комментариев
Показать все комментарии