Уважаемые форумчане, подскажите пожалуйста...столкнулся с проблемой:
Для копирования прав доступа создал isq_CopyRight
Но выдает следующую ошибку: "Operand type clash: int is incompatible with uniqueidentifier", никак не могу разобраться. Опыта крайне мало, поэтому прошу помощи у профессионалов.

isq_CopyRight

INSERT INTO [dbo].[tbl_CashflowRight] ([ID], [RecordID], [AdminUnitID], [CanRead], [CanWrite], [CanDelete], [CanChangeAccess])
SELECT
        [tbl_CashflowRight].[CanRead] AS [CanRead],
        [tbl_CashflowRight].[CanWrite] AS [CanWrite],
        [tbl_CashflowRight].[CanDelete] AS [CanDelete],
        [tbl_CashflowRight].[CanChangeAccess] AS [CanChangeAccess],
        :OldRecordID AS [NewRecordID],
        :MyAdminUnitID AS [AdminUnitID],
        [tbl_CashflowRight].[ID] AS [ID]
FROM
        [dbo].[tbl_CashflowRight] AS [tbl_CashflowRight]
WHERE([tbl_CashflowRight].[RecordID] = :OldRecordID AND
        [tbl_CashflowRight].[AdminUnitID] = :MyAdminUnitID)

function CopyRight:

function CopyRight(OldRecordID, NewRecordID) {
        var InsertSelectQuery = GetSingleItemByCode('isq_CopyRight');
        var Columns = InsertSelectQuery.SelectQuery.Columns;
        var ConstColumn = Columns.ItemsByAlias('NewRecordID');
                ConstColumn.ColumnValue = NewRecordID;
        SetParameterValue(InsertSelectQuery.Parameters, 'OldRecordID', OldRecordID);
        SetParameterValue(InsertSelectQuery.Parameters, 'MyAdminUnitID',
        Connector.CurrentUser.ID);
                try {
        InsertSelectQuery.Execute();
        }
        catch(e) {
        CatchException(e);
        }
        }            

Нравится

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

Добрый день Дмитрий!!!

ваш запрос выглядит неверно. Вот правильный запрос на копирования прав:

INSERT INTO [dbo].[tbl_CashflowRight] ([ID], [RecordID], [AdminUnitID], [CanRead], [CanWrite], [CanDelete], [CanChangeAccess]) 
SELECT
        [tbl_CashflowRight].[ID] AS [ID],
        :OldRecordID AS [RecordID],
        :MyAdminUnitID AS [AdminUnitID],
        [tbl_CashflowRight].[CanRead] AS [CanRead],
        [tbl_CashflowRight].[CanWrite] AS [CanWrite],
        [tbl_CashflowRight].[CanDelete] AS [CanDelete],
        [tbl_CashflowRight].[CanChangeAccess] AS [CanChangeAccess]
FROM
        [dbo].[tbl_CashflowRight] AS [tbl_CashflowRight]
WHERE([tbl_CashflowRight].[RecordID] = :OldRecordID AND
        [tbl_CashflowRight].[AdminUnitID] = :MyAdminUnitID)

у вас Дмитрий поля в SELECT местами перепутаны. Порядок должен соответствовать порядку вставляемых полей

Спасибо большое!
Сейчас попробую :smile:

Ошибки не возникло, однако копирование прав не произошло :(
Не подскажете, где я мог еще ошибиться?

Дмитрий в Profiler SQL сервера выполните трассировку и посмотрите какой запрос формирует приложение к серверу. Вручную его исполните и увидите почему у вас непроизошла вставка новых данных.

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

Подскажите пожалусйта как и где можно использовать функцию GetDBValue?

Нравится

1 комментарий

Здравствуйте, Юрий!

В базовой конфигурации функции GetDBValue нет.

Вероятно, она была реализована в рамках Вашего проектного решения.

К сожалению, без кода самой функции нельзя ответить на Ваш вопрос относительно того, как и где её можно использовать :sad:

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

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

Нравится

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

Здравствуйте, Дмитрий!

1. Для того, чтобы при копировании поменялось значение поля, нужно в обработчике события OnDatasetAfterAppend датасета даталинка прописать такой код:
if (BaseDBEdit.IsCopy) {
//TO DO присвоение нужного значения полю
}

2. Для копирования прав доступа нужно в обработчике кнопки OK прописать вызов функции копирования прав доступа CopyRight:
function btnOKOnClick(Control) {
scr_BaseDBEdit.btnOKOnClick(Control);
if (Self.Attributes('IsCopy')) {
var RecordID = Self.Attributes('RecordID');
CopyRight(Self.Attributes('SourceRecordID'), RecordID);
}
}

function CopyRight(OldRecordID, NewRecordID) {
var InsertSelectQuery = GetSingleItemByCode('isq_CopyRight');
var Columns = InsertSelectQuery.SelectQuery.Columns;
var ConstColumn = Columns.ItemsByAlias('NewRecordID');
ConstColumn.ColumnValue = NewRecordID;
SetParameterValue(InsertSelectQuery.Parameters, 'OldRecordID', OldRecordID);
SetParameterValue(InsertSelectQuery.Parameters, 'MyAdminUnitID',
Connector.CurrentUser.ID);
try {
InsertSelectQuery.Execute();
}
catch(e) {
CatchException(e);
}
}

где isq_CopyRight - сервис InsertSelect Query, который Вы можете реализовать самостоятельно по аналогии с подобным сервисом, структуру которого можно увидеть на скриншоте в прикрепленном к данному посту файлу.

Я не совсем верно задал вопрос, прошу прощения.
При нажатии на кнопку "Копировать", которая находится в CashFlowGridArea.

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

function btnCopyOnClick(Control) {
	var AdditionalAttributes = GetNewDictionary();
	AdditionalAttributes('OldRecordID') = dlData.Dataset.Values('ID');
	var WorkspaceDataset = Self.Attributes('WorkspaceDataset');   
	if (Assigned(WorkspaceDataset)) {
		AdditionalAttributes('IsDetailCopy') = true;
	}
	CopyGridAreaData(Self, BaseGridArea, AdditionalAttributes);
 
}   

scr_BaseGridAreaUtils

function CopyGridAreaData(Window, BaseGridArea, AdditionalAttributes) {
	if (!GetCanCopyData(BaseGridArea.GridDataset)) {
		return;
	}
	CheckAttributes(Window, 'EditWindowUSI');	
	var Attributes = GetCopyDataAttributes(Window, BaseGridArea);	
	if (Assigned(AdditionalAttributes)) {
		CopyAttributes(AdditionalAttributes, Attributes);
	}	
	if (IsAttributeExists(Window, 'EditWindowDatasetUSI')) {
		Attributes('DatasetUSI') = Window.Attributes('EditWindowDatasetUSI');
	}
	Attributes('WorkspaceDataset') = BaseGridArea.WorkspaceDataset;
	Attributes('EditWindowCaption') = Window.Attributes('EditWindowCaption');
 	ShowEditWindowEx(BaseGridArea.EditWindowUSI, Attributes);	
}

C копированием дат разобрался :)
В свойствах датасета убрал галочку "копирование поля"

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

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

Нравится

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

Здравствуйте, Виталий!

Для реализации такой функциональности нужно в обработчике OnDatasetDataChange Datalink карточки редактирования контакта выполнять проверку:

if (DataField.Name == 'SalutationID') {
// TO DO
}

А в теле if делаете проверку:

if (DataField.Value == [ID значения госпожа]) {
dlData.Dataset('GenderID') = [ID значения Женский];
} else
if... // по аналогии прописываете проверку для Мужской

Посмотреть значения для поля [Приветствие] можно в таблице tbl_Salutation, а для поля [Пол] - в перечислении enm_Gender.

Зашел в OnDatasetDataChange, у меня получилась такая проверка, ID подставил правильно, не понимаю почему не работает?

	if (DataField.Name == 'SalutationID') {
if (DataField.Value == '1F87FD97-A663-4C02-8530-48951F912C6B') {
dlData.Dataset('GenderID') = '8CB0B216-3E35-47CE-8C31-8DFAA3C1548D';
} else
if
    (DataField.Value == 'E285E1C6-841C-45CE-B5CD-B256C445DFFB') {
dlData.Dataset('GenderID') = '264EF705-6CC4-4E2F-9611-45531D04CBE7';
} 
}

Покажите весь код обработчика OnDatasetDataChange.

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

function dlDataOnDatasetDataChange(DataField) {
	var Dataset = DataField.ParentDataFields.ParentDataset;
	var DataFieldName = DataField.Name;
 
 
 
	if (DataFieldName.indexOf('Communication') == 0) {
		var Index = DataFieldName.substr(13, 1);
		var CommTypeDataControl =
			Self.ComponentsByName('edtCommunication' + Index + 'Type');
		var CommDataControl =
			Self.ComponentsByName('edtCommunication' + Index);
		RefreshCommunicationActionSmartTag(CommTypeDataControl, CommDataControl,
			(DataFieldName.indexOf('Type') > -1));
	}
	if (!ContactEdit.IsUpdating){
		switch (DataFieldName) {
			case ('AccountID'):
				if (!IsEmptyStr(DataField.DisplayValue)) {
					ContactEdit.IsUpdating = true;
					try {
						FillInformationBySelectedItem(Dataset, DataField.Value, 
							DoYouWantToFillContactEntriesMessage);
					} finally {
						ContactEdit.IsUpdating = false;
					}
				}
				break;
		}
	}
 
	if (DataField.Name == 'SalutationID') {
if (DataField.Value == '1F87FD97-A663-4C02-8530-48951F912C6B') {
dlData.Dataset('GenderID') = '8CB0B216-3E35-47CE-8C31-8DFAA3C1548D';
} else
if
    (DataField.Value == 'E285E1C6-841C-45CE-B5CD-B256C445DFFB') {
dlData.Dataset('GenderID') = '264EF705-6CC4-4E2F-9611-45531D04CBE7';
} 
}
 
}
 

Если бы Вы запустили debugger, то сразу бы поняли причину, почему не срабатывает этот код.
Попробуйте добавить Ваш код в начало обработчика.

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

Добрый день! добавил поле в карточку контрагента, но при его открытии выбивает ошибку, в меню справочник данное поле работает, можно редактировать и добавлять записи. Подскажите, что делать, чтобы и в карточке контрагента можно было добавлять и редактировать записи?

Нравится

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

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

необходимо сделать, это выполнить отладку кода при помощи Microsoft Visual Studio или Microsoft Script Debugger.

Необходимо пройтись по коду и найти место где идет обращение к методу ShowNoModalSelectDataWindow (в базовой конфигурации такой функции, обращения метода нет), после чего закомментировать обращение и проверить работоспособность системы..

Microsoft Script Debugger у меня работает, но данную ошибку он не отслеживает.

Если дебагер не подхватывает ошибку,в таком случае необходимо в окне сообщения об ошибке приложения Terrasoft посмотреть по стеку где возникло исключение:

Найдите функцию в сервисе конфигурации, которая указана в стеке вызова, и в ней устанавливаете прерывание:

function edtCountryOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
debugger;
	FilterLookupDataControlLookupDatasetByTerritory(LookupDataControl, 
		edtTerritory.DataField.Value);
}

Сохраните сервис и перезапускаете приложение, после этого дебагер подхватит прерывание и Вы сможете пройтись по коду дебагером

Не забудьте включить дебагер. Прикрепил файлы которые включают/отключают дебагер.
jitdebug_ru.zip

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

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

Нравится

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

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

Вы можете просмотреть пример реализации фильтрации для поля [Город] и повторить для поля [Вид деятельности] создать свою функцию фильтрации или установить фильтрацию сразу в событии edtActivityOnPrepareSelectWindow.

Различие будет только в названиях полей.

Павел, спасибо)

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

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

Есть функция Log.Write - выводит сообщение в лог. На диск лог сохраняется при закрытии.
Есть ли функционал, с помощью которого, можно принудительно сохранить лог в файл, а последующие сообщения начнут записываться в новый лог(файл).

И подскажите может есть статья\тема описания работы с системным логом (журнал в БД, насколько я понимаю)?

Terassoft 3.3.2

Нравится

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

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

при вызове функции Log.Write, данные сразу записываются в файл и это реализовано на уровне ядра.

Можете реализовать подобный функционал при помощи JScript в конфигурации.

Если правильно понял, Вы имеете ввиду логирование изменений в БД:

Здравствуйте. Да изменения сразу записываються в файл, но его нельзя просмотреть в процессе, он открыт для записи и пока не закроешь TS или не сохранишь через визуальные элементы окна логирование его не просмотришь. Если функция которая с помощью которой можно програмно сохранить лог файл и начать запись в новый.

Нет не логирование изменений, как то натыкался на функцию ккоторая записывает информацию не в лог(Log.Write), а в системный журнал или как то так, насколько я понял записывает в спец. таблицу - про это хотел бы узнать больше.

"Дашкевич К." написал:как то натыкался на функцию ккоторая записывает информацию не в лог(Log.Write), а в системный журнал или как то так, насколько я понял записывает в спец. таблицу - про это хотел бы узнать больше.

Log.WriteToSystemLog, она?

Да она, спасибо.

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

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

Нравится

1 комментарий

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

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

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

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

Нравится

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

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

Для этого выполните такую последовательность действий:

  1. Добавить новое поле в сервис таблицы tbl_Field с типом идентификатор, которое будет ссылаться на таблицу tbl_Activity
  2. Добавьте два поля на выборку в сервис sq_Field; 1 поле - поле которое добавили ранее и 2 поле - это выборка поля Name из таблицы tbl_Activit по новому добавленному полю
  3. Добавить лукапное поле в сервис датасета ds_Field

Чтобы не ошибиться, делайте по аналогии с таблицей tbl_Country.

Сделал все изменения в файлах tpl, sq и ds по аналогии с country и terrytory, но справочники не объединяются

Немного не понятно, что имеете ввиду под "справочники не объединяются".

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

После этого, в разделе [Справочники] необходимо изменить свойство справочника [Отрасли]. Установить значение полю [Окно реестре] = 'wnd_FieldEdit'.

Если изменение свойств будет заблокировано, в токам случае, выполните sql скрипт:

UPDATE tbl_Dictionary SET EditWindowCode = 'wnd_FieldEdit' WHERE DatasetCode = 'ds_Field'

где wnd_FieldEdit - Ваше окно редактирования справочника

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

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

приведу пример на окне редактирования [Контрагенты].

  1. 1. Открываем окно редактирования wnd_AccountEdit
  2. 2. Переходим в событие dlDataOnDatasetDataChange, не визуального компонента dlData
  3. 3. В событии dlDataOnDatasetDataChange добавляем строчку кода var FieldValue = DataField.Value;. Должно получится, что-то виде такого:
    	var FieldName = DataField.Name;
    	var Dataset = DataField.ParentDataFields.ParentDataset;
    	var FieldValue = DataField.Value;
  4. 4. В конец функции дописываем код:
    	if (FieldName == 'FieldID') {
    		if (IsEmptyValue(FieldValue)) {
    			Dataset.DataFields('ActivityID').Value = null;
    		} else {
    			Dataset.DataFields('ActivityID').Value = 
    				GetFieldValueFromLookupDatasetByLookupField(DataField, 'ActivityID');
    		}	
    	}
  5. 5. Сохраняем сервис

В результате у Вас должна получится функция:

function dlDataOnDatasetDataChange(DataField) {
	var FieldName = DataField.Name;
	var Dataset = DataField.ParentDataFields.ParentDataset;
	var FieldValue = DataField.Value;
 
	if (FieldName.indexOf('Communication') == 0) {
		var Index = FieldName.substr(13, 1);
		var CommTypeDataControl =
			Self.ComponentsByName('edtCommunication' + Index + 'Type');
		var CommDataControl =
			Self.ComponentsByName('edtCommunication' + Index);
		RefreshCommunicationActionSmartTag(CommTypeDataControl, CommDataControl,
			(FieldName.indexOf('Type') > -1));
	} 
	if (FieldName == 'FieldID') {
		if (IsEmptyValue(FieldValue)) {
			Dataset.DataFields('ActivityID').Value = null;
		} else {
			Dataset.DataFields('ActivityID').Value = 
				GetFieldValueFromLookupDatasetByLookupField(DataField, 'ActivityID');
		}	
	}
}

Содержимое функции может немного отличаться, это зависит от продукта.

спасибо большое))

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

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

Нравится

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

в скрипт scr_Account в функцию SelfOnDatasetAfterAppend (обработчик события AfterAppend) добавьте:

Dataset.Values('Communication1TypeID') = '{FA08FC2A-9D55-40C9-9576-0017EAED3E49}';
Dataset.Values('Communication2TypeID') = '{DBCB6A43-D99F-45AE-9B41-037DE595242E}';
Dataset.Values('Communication3TypeID') = '{82696D8B-71AE-4BA4-94FD-3F77474D74E7}';
Dataset.Values('Communication4TypeID') = '{7A628D16-D7D0-4979-B8BA-B64EF54A0366}';
Dataset.Values('Communication5TypeID') = '{7B77F07B-9976-47D6-95AA-D161FF369D6D}';

аналогично для контактов:

function ds_ContactOnDatasetAfterAppend(Dataset) {
	Dataset.Values('Communication1TypeID') = '{FA08FC2A-9D55-40C9-9576-0017EAED3E49}';
	Dataset.Values('Communication2TypeID') = '{DBCB6A43-D99F-45AE-9B41-037DE595242E}';
	Dataset.Values('Communication3TypeID') = '{82696D8B-71AE-4BA4-94FD-3F77474D74E7}';
	Dataset.Values('Communication4TypeID') = '{7A628D16-D7D0-4979-B8BA-B64EF54A0366}';
}

большое спасибо

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