Добрый день!!

Прошу помочь в решении проблемы.
Есть необходимость импортировать данные из таблицы Excel (3 столбца - ФИО, Обращение, e-mail) в Terrasoft.
При осуществлении импорта данных в отчете указано, что импорт завершен, обновлено столько то записей и все.
НО для нас главное, чтобы изменились обращения, которые корректно прописаны в таблице Excel. А они как были неверно указаны в базе, так и остаются.

У нас установлен Terrasoft XRM, версия 3.3.2.292

Прошу помочь в решении данного затруднения!!

Нравится

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

Анастасия, как выполнено сопоставление полей в настройках интеграции?
Вложите, пожалуйста, пример шаблона Excel и файл с настройками интеграции (подойдет демонстрация настроек скриншотом).

Наталия, необходимые документы в прикрепленных файлах.

Анастасия, во вложении прилагаю файл настроек интеграции, который позволит выполнить импорт контактов с обращениями.
Обратите, пожалуйста, внимание - в шаблоне добавлена проверка уникальности по 2-м полям "ФИО" и "Контрагент". Сделано это для того, чтобы проимпортировать контакты с одинаковыми именами.
Вы можете оставить проверку уникальности только по полю "ФИО" либо сочетать со средством связи.
Чтобы применить настройки, достаточно открыть созданную настройку интеграции (либо добавить новую) и вызвать действие "Файл" - "Загрузить настройки из файла".

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

Имеется деталь "контакты" и у каждого контакта есть, привязанные к нему файлы. Мне необходимо на другой детали получить список привязанных файлов. В дереве нашел dataset ds_Files (при выводе этих данных на экран все работает - выводятся все файлы для всех контактов). Дело остается за малым - отфильтровать по ContactID, однако данное поля в датасете ds_Files нет. Я не могу найти это самое связующее поле. Кто-нибудь знает?

Нравится

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

Если вдруг кому-нибудь пригодится:

Все файлы хранятся в таблице tbl_Files, информация о принадлежности файла к записям разделов хранится в таблицах развязки (например, tbl_FileInAccount, tbl_FileInContact).

Соответственно, для получения названия файла (колонка Link таблицы tbl_File), Вам необходимо получить идентификатор записи файла из таблицы развязки, отфильтровав записи по идентификатору записи раздела. Затем, получить информацию из таблицы файлов по идентификатору.

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

У Вас остались еще вопросы касательно данной темы?

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

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

В разделе Контрагенты есть деталь Контакты, но там нет таблицы для детали. На сколько я понимаю, там просто запрос с фильтрами. Так вот, задача состоит в том, чтобы сделать точно такую же деталь для раздела Задачи (т.е. просто фильтры по контактам контрагента этой задачи без возможности добавления). Как это можно реализовать?

Спасибо!

Нравится

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

Добюрый день, Дмитрий.

Предлагаю такой вариант, реализации Вашей задачи:
В сервисе Tasks\Details\Contacts\wnd_ContactInTaskGridArea для фрейма формы frmButtons установите в свойствах следующие параметры:

  • Is Enabled = False
  • IsTransparent = True
  • IsVisible = False

Для каждой из кнопок этого фрейма установите свойство IsVisible = False.

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

Спасибо.

Еще вопрос: можно ли сделать копию сервисов, которые находятся в группе: Accounts\Details\Contacts\, переместить их в раздел Task и адаптировать под этот раздел? Чтобы в этой детали отображалось тоже самое, что и в разделе Контрагенты, но фильтр был по полю AccountID задачи.

Пытался сделать сам, но все манипуляции с фильтрами ничего не дали, результат один - ни одной записи в реестре.

Или может быть есть другой вариант? Задача вообще состоит в том, чтобы на детали Контакты раздела Задачи автоматически отображались все контакты выбранного в задаче контрагента.

Добрый день, Дмитрий.
Ипортируйте, пожалуйста, прирепленные сервисы. (Не забывайте про резервные опии!).

В Tasks\General\Main Grid\wnd_TasksWorkspace Деталь[Контакты] переименована на Контакты в задаче и добавленна Деталь[Контакты в контрагенте]. Это делать наследуется от датагрида "Контакты в контрагенте" - wnd_ContactsInAccountGridArea.

Добавленной логике в Tasks\General\Main Grid\scr_TasksWorkspace предшевствует коментарий //ContactInAccount

Большое спасибо! Именно то что нужно.

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

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

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

В модуле фильтрации выбираю:

Контакт: количество контактов = 0, применить
либо Контакт: количество контактов Пусто, применить,
но контрагенты не отображаются.

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

При этом, если я указываю = 1, > 1, контрагенты отображаются в зависимости от условия.

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

Нравится

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

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

Добрый день, коллеги!

Да, нужны исправления в сервисе sq_Account. Пошагово ниже:

  1. Добавить в сервис sq_Account фильтр Exists Filter, в его Test Subquery для таблицы FROM указать tbl_Contact as tbl_ContactInAccount.

    В Select - tbl_ContactInAccount.ID:
    cf1.png
  2. В условие WHERE добавить Integer User Filter:
    if.png
  3. В добавленном Integer User Filter указать таблицу для выбирки данных:
    tbl_Contact as ContactInAccount
  4. В Select указать ContactInAccount.ID и Summary Type = Count:
    cf2.png
  5. В WHERE добавить фильтр сравнения: cf3.png
  6. В WHERE добавить фильтр сравнения: cf4.png

Большое спасибо за информацию :smile:

Я вот хотел утром решение написать, да постеснялся, чтобы топикстартера не напугать:smile:
Ветка то пользовательская...
По решению: приведенный вариант решения не полный
1. нужно "почистить" и штатный фильтр Контакт-Количество контактов чтобы путаницы не было с новым фильтром удалить его что-ли или переименовать
2. в примере я так понял учитывается либо указание Контрагента в карточке Контакта, либо его назначение Основным контактом; но не учтена Карьера контакта - а записи могут быть именно там, и по ней же работает штатный фильтр

Главное, что это не топикстартер тупит, и что баг поправим :wink:

Баг попра́вим или поправи́м?:smile:

Да баг надо бы на уровне коробочной версии поправлять, он во всех TS такой:smile:
Запросик на изменение добавьте плиз:confused:

Да, в четверке он тоже есть :sad:

Коллеги, заявка на изменение зарегистрирована.
В следующих сборках, думаю, исправление будет включенно.

Спасиба за замечания и коментарии.

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

1. Сделайте резервную копию базы данных. Это поможет обезопасить программу от случайных сбоев в процессе доработки, т.к. изменение конфигурации влияет на систему целиком.
2. Закройте все запущенные приложения комплекса Terrasoft и убедитесь, что TSClient.exe и OUTLOOK.exe не запущены в процессах.
3. Откройте утилиту TSAdmin.exe
4. Найдите по поиску компонент scr_ContactEdit и откройте его по Enter;
AdminTree
5. В коде скрипта найдите функцию function wnd_ContactEditOnPrepare и добавьте в нее следующие строки:
var Dataset = dlData.Dataset;
if (!IsEmptyValue(Dataset('Name'))&&IsEmptyValue(Dataset('Dear'))) {
Dataset('Dear') = GetDearFromName(Dataset('Name'));
}

В результате функция примет вид:
Config
6. Затем необходимо сохранить скрипт и запустить TSClient.

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

Нравится

Поделиться

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

Долго не мог понять, почему если я вношу телефон в "Средство связи 1", а такой же указан в "Средство связи 2" другого контакта, то CRM меня не предупреждает?
Вижу, не только меня этот вопрос интересует...
http://community.terrasoft.ua/forum/topic/4121
Как можно решить?

Мой вариант (предлагаю использовать процедуру, для быстроты поиска)

CREATE PROCEDURE [dbo].[tsp_CheckForDoublet] (
        @ID AS uniqueidentifier,
        @Communication1 AS nvarchar(250),
        @Communication2 AS nvarchar(250),
        @Communication3 AS nvarchar(250),
        @Communication4 AS nvarchar(250),
        @NumOfDigits AS int,
        @ReturnResult AS int = 0 OUTPUT
        )
AS

SET @ReturnResult = 0

IF EXISTS (SELECT [ID] FROM [dbo].[tbl_Contact] WHERE
[ID] > @ID AND (  
RIGHT(REPLACE(REPLACE([Communication1], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4)
OR
RIGHT(REPLACE(REPLACE([Communication2], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4)
OR
RIGHT(REPLACE(REPLACE([Communication3], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4)
OR
RIGHT(REPLACE(REPLACE([Communication4], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4)
) ) SET @ReturnResult = 1

RETURN

Процедура вылавливает дубли даже с тире и пробелами :lol:
8-032-229-99-99 и 2299999 - в данном случае считаются дублями. Если Вас это не устраивает, просто в параметр NumOfDigits большое количество символов для обработки

CreateSPParameter(Parameters, 'NumOfDigits', pdtInteger, 12);

Добавим права доступа на запуск данной процедуры группой "Все пользователи"

Правим событие в файле scr_Contact

function SelfOnDatasetBeforePost(Dataset, DoPost) {

..........
/* START */
        var Parameters = CreateSPParameters();
        CreateSPParameter(Parameters, 'ID', pdtGUID, Dataset('ID'));
        CreateSPParameter(Parameters, 'Communication1', pdtString, Dataset('Communication1'));
        CreateSPParameter(Parameters, 'Communication2', pdtString, Dataset('Communication2'));
        CreateSPParameter(Parameters, 'Communication3', pdtString, Dataset('Communication3'));
        CreateSPParameter(Parameters, 'Communication4', pdtString, Dataset('Communication4'));
        CreateSPParameter(Parameters, 'NumOfDigits', pdtInteger, 7); //количество символов
        CreateSPParameter(Parameters, 'isDoublet', pdtInteger, 0);
        Parameters.ItemsByName('isDoublet').ParamType = 1;
        var SQLText = 'exec dbo.tsp_CheckForDoublet :ID, :Communication1, :Communication2, :Communication3, :Communication4, :NumOfDigits, :isDoublet OUTPUT';
        Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
        var isDoublet = Parameters.ItemsByName('isDoublet').ValAsInt;  
        if (isDoublet == 1) {
                var Message = 'Дублируются средства связи!';
                ShowWarningDialog(Message);
                DoPost.Value = false; // не сохранять в базу
        }
/* END */
}

Доработки - возвращать массив ID и заполнять реестр нового окна ссылками на контактов, с возможностью "перейти к" (В данном варианте мы не знаем где именно дубль, но зато проверяем по всей базе, даже если отсутствуют права на чтение)

Развиваем идею здесь!

Нравится

Поделиться

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

"Виталий Ковалишин aka samael" написал:но зато проверяем по всей базе, даже если отсутствуют права на чтение

:twisted:

"Underscore a.k.a. _" написал::twisted:

Спасибо! А "плюс Адин" где? :wink:

--
www.it-sfera.com.ua

Сорри, забыл. Плюсанул :)

Оооо, другое дело!

Спасибо! :biggrin:

--
www.it-sfera.com.ua

Что-то меня терзают смутные сомнения, что если вы редактируете существующую запись, то вы её тоже выловите своей хранимой процедурой как дублирующуюся. Т.е. как минимум надо добавить проверку по ID записи.

SelfOnDatasetBeforePost

BeforePost может же быть и при редактировании существующей записи.

Согласен!
Нужно добавить проверку на ID :wink:
подправим...

--
www.it-sfera.com.ua

"Раловец Ольга" написал:BeforePost может же быть и при редактировании существующей записи.

Да что Вы говорите /*шепотом так и с большими круглыми глазами*/ :) Но проверка дублей делается только при вставке, или я ошибаюсь?

"Underscore a.k.a. _" написал:Но проверка дублей делается только при вставке, или я ошибаюсь?

"Да что Вы говорите" (с) я вижу вызов процедуры прямо в обработчике события DatasetBeforePost, или я ошибаюсь?

Там жирных 10 точек стоит перед вызовом, или я ошибаюсь?

Не ошибаетесь, ровно 10.

"Underscore a.k.a. _" написал:Там жирных 10 точек стоит

Надо же посчитали :)
Ну и что что точки?
Нигде не написано, что проверку делать надо только при вставке записи. Кроме того это логически не правильно. Проверку делать надо и при обновлении записи.

"Агутин Алексей" написал:Проверку делать надо и при обновлении записи.

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

"Раловец Ольга" написал:Не ошибаетесь, ровно 10.

Учите матчасть, мадам. Ну и не ленитесь смотреть в исходники.

Поулыбался над комментами :smile:

Виталий, огромное спасибо.
Но нубский вопрос - Куда вставлять данную процедуру?
И можно полностью разжевать, а?
______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

Как малые дети! :lol:

1. Проверка и так на стороне сервера (процедуры), не должно быть напрягов :)
2. Можно не на датасет а на карточку повесить, тогда она не будет закрываться (как это сейчас происходит и мы заново должны все набирать из-за одного телефона)
3. Да, точек 10 - но это случайно получилось
4. Сегодня постараюсь подправить процедуру на проверку по ID (вместо баловства - могли бы и помочь) -- уже подправил
5. После - полностью разъясню куда и что вставить (я о процедуре) :)

Спасибо, не ожидал такого бурного обсуждения! :biggrin:

--
www.it-sfera.com.ua

"Евгений Лемеш" написал:Поулыбался над комментами

Видать вчера магнитные бури были. Сам себе удивляюсь :)

"Биккинин Т.Р." написал:Куда вставлять данную процедуру?

Вам необходимо открыть SQL Server Management Studio на сервере и выполнить данный скрип - процедура будет создана. После, добавить права доступа (иначе, только Supervisor сможет нею воспользоваться):

GRANT EXECUTE ON PROCEDURE [dbo].[tsp_CheckForDoublet] TO public

Дальше код в админке :)

Это быстрое решение, для большего удобства пользования, оно еще нуждается в доработке... :lol:

--
www.it-sfera.com.ua

Виталий, добрый день.
Добрался до Вашего ответа.
Скрипт на сервере прошел, но на

 
GRANT EXECUTE ON PROCEDURE [dbo].[tsp_CheckForDoublet] TO public 

выдает следующее:
Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'PROCEDURE'.

Что я делаю не так?
______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

GRANT EXECUTE ON [dbo].[tsp_CheckForDoublet] TO public 

А так?

Копи-пейст он до добра не доводит :)

Ольга,

Server: Msg 208, Level 16, State 11, Line 1
Invalid object name 'dbo.tsp_CheckForDoublet'.

______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

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

Ольга,

в том то и дело, что процедура создалась успешно, только я не понял для какой именно базы. на сервере у меня их 3 лежит. Таким же образом добавляю grant execute, но она не проходит. ______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

Для начала нужно определиться с именем нужной базы данных :) Приблизительная последовательность действий: открываем SQL Server Management Studio, подключаемся к серверу, далее слева в инспекторе объектов разворачиваем ветку "Databases" и останавливаемся на той, в которой хотим создать процедуру. Далее нажимаем кнопочку "New Query", откроется окно редактирования и появится еще одна строчка в меню, там будет выпадающий список, в котором выбрана та база данных, на которой мы стояли в инспекторе объектов. Если сразу нажать "New Query", то будет выбрана бд "master".

Ольга, спасибо. Пошел проверять. Отпишусь позднее.
______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

Вот, что называется отсутствие знаний!
Ольга, все сделал, как Вы сказали, обе процедуры прошли успешно. Добавил функцию в скрипт scr_Contact, но новая функция не работает.
Вот так выглядит теперь функция SelfOnDatasetBeforePost:

function SelfOnDatasetBeforePost(Dataset, DoPost) {
	var ContactsDataset = Dataset;
	Contact.NeedActualizeCommunication = GetFieldsValuesAreChanged(Dataset,
		'Communication1', 'Communication2', 'Communication3',
		'Communication4', 'Communication1TypeID', 'Communication2TypeID',
		'Communication3TypeID', 'Communication4TypeID');
	Contact.NeedActualizeAddress = GetFieldsValuesAreChanged(Dataset, 'Address',
		'CountryID', 'AddressTypeID', 'StateID', 'CityID', 'TerritoryID');
	Contact.NeedActualizeCareer = GetFieldsValuesAreChanged(Dataset, 'AccountID',
		'JobID','JobTitle','DepartmentID');
	/* MODULE CAMPAIGNS */
	Contact.NeedActualizeCampaign = GetFieldsValuesAreChanged(Dataset,
		'CampaignID');
	/* ENDMODULE CAMPAIGNS */
	if(!IsEmptyValue(Dataset.Values('AccountID')))
	{
	Dataset.Values('WorkName') = Dataset.Values('Name')+' , '+GetDatasetFieldValueByID('ds_Account',Dataset.Values('AccountID'),'Name');
	}
	else
	{
	Dataset.Values('WorkName') = Dataset.Values('Name');
}
 
        Contact.IsAppend = (Dataset.State == dstInsert);  
        //SetItemSystemNumber('Contact', Dataset, 'ClientNumber');
 
    var Parameters = CreateSPParameters();
        CreateSPParameter(Parameters, 'ID', pdtGUID, Dataset('ID'));
        CreateSPParameter(Parameters, 'Communication1', pdtString, Dataset('Communication1'));
        CreateSPParameter(Parameters, 'Communication2', pdtString, Dataset('Communication2'));
        CreateSPParameter(Parameters, 'Communication3', pdtString, Dataset('Communication3'));
        CreateSPParameter(Parameters, 'Communication4', pdtString, Dataset('Communication4'));
        CreateSPParameter(Parameters, 'NumOfDigits', pdtInteger, 7); //количество символов
        CreateSPParameter(Parameters, 'isDoublet', pdtInteger, 0);
        Parameters.ItemsByName('isDoublet').ParamType = 1;
        var SQLText = 'exec dbo.tsp_CheckForDoublet :ID, :Communication1, :Communication2, :Communication3, :Communication4, :NumOfDigits, :isDoublet OUTPUT';
        Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
        var isDoublet = Parameters.ItemsByName('isDoublet').ValAsInt;  
        if (isDoublet == 1) {
                var Message = 'Дублируются средства связи!';
                ShowWarningDialog(Message);
                DoPost.Value = false; // не сохранять в базу
        }    
}

Что неправильно?
______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

Я вот подумала, что не очень-то хорошо прописывать строки, среди которых есть вывод сообщения пользователю в скрипте датасета. Лучше сделать это в скрипте карточки (scr_ContactEdit). Открываете окно wnd_ContactEdit, переходите на закладку не визуальные(в левой верхней стороне), становитесь на dlData, ниже среди событий находите OnDatasetBeforePost, нажимаете 2 раза и пишете

if (Dataset.State == dstInsert) {
var Parameters = CreateSPParameters();
        CreateSPParameter(Parameters, 'ID', pdtGUID, Dataset('ID'));
        CreateSPParameter(Parameters, 'Communication1', pdtString, Dataset('Communication1'));
        CreateSPParameter(Parameters, 'Communication2', pdtString, Dataset('Communication2'));
        CreateSPParameter(Parameters, 'Communication3', pdtString, Dataset('Communication3'));
        CreateSPParameter(Parameters, 'Communication4', pdtString, Dataset('Communication4'));
        CreateSPParameter(Parameters, 'NumOfDigits', pdtInteger, 7); //количество символов
        CreateSPParameter(Parameters, 'isDoublet', pdtInteger, 0);
        Parameters.ItemsByName('isDoublet').ParamType = 1;
        var SQLText = 'exec dbo.tsp_CheckForDoublet :ID, :Communication1, :Communication2, :Communication3, :Communication4, :NumOfDigits, :isDoublet OUTPUT';
        Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
        var isDoublet = Parameters.ItemsByName('isDoublet').ValAsInt;  
        IF (isDoublet == 1) {
                var Message = 'Дублируются средства связи!';
                ShowWarningDialog(Message);
                DoPost.Value = false; // не сохранять в базу
        }    
}
}

Ольга, спасибо.
Заработало. Результатом является появление диалогового сообщения, причем повторного и карточка не сохраняется. И при этом система не различает телефон 123456, 123-456, 12-34-56 и 123 456. По идее должно же?

______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

"Биккинин Т.Р." написал:Результатом является появление диалогового сообщения, причем повторного и карточка не сохраняется.

Что значит повторного? Вы, наверное, не убрали из скрипта датасета то, что внесли до того, как я посоветовала редактировать scr_ContactEdit.
"Биккинин Т.Р." написал:И при этом система не различает телефон 123456, 123-456, 12-34-56 и 123 456. По идее должно же?

Судя по тому, что написал Виталий, должно считать их одним и тем же.
"Виталий Ковалишин aka samael" написал:Процедура вылавливает дубли даже с тире и пробелами :lol:
8-032-229-99-99 и 2299999 - в данном случае считаются дублями. Если Вас это не устраивает, просто в параметр NumOfDigits большое количество символов для обработки

Еще обратите внимание, что проверка выполняется только при попытке сохранить новую запись.

Ольга,

"Раловец Ольга" написал:Что значит повторного? Вы, наверное, не убрали из скрипта датасета то, что внесли до того, как я посоветовала редактировать scr_ContactEdit.
Да, действительно не удалил.
[br]
"Раловец Ольга" написал:Судя по тому, что написал Виталий, должно считать их одним и тем же.
Походу не считает, даже если дубль записывается в то же поле "средство связи".
[br]
"Раловец Ольга" написал:Еще обратите внимание, что проверка выполняется только при попытке сохранить новую запись.
Так оно и есть, тем не менее, что-то здесь с тире и пробелами не так.

______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

В качестве примера:
Есть карточка, с телефонов 379007 в поле "Средство связи 1".
Если я создаю другую карточку с телефоном 379-007 или 379 007 в этом же поле, то система не воспринимает это как дубль и карточку сохраняет.
______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

Добрый день!

Проверил - считает дублями записи 2233445 и 22-33-44-5!
У Вас 6-ти значные номера телефонов? Попробуйте заменить

CreateSPParameter(Parameters, 'NumOfDigits', pdtInteger, 7); //количество символов

На:

CreateSPParameter(Parameters, 'NumOfDigits', pdtInteger, 6); //количество символов

--
www.it-sfera.com.ua

Как-то странно отрабатывает:
1) Не различает 123456, 1-23-456, 12 34 56. При этом абсолютно одинаковые номера отлавливает.
2) Если одно или более средств связи остаются пустыми, срабатывает как на дубль;
3) Не проверяет средства связи не отображенные в карточке.

"Виталий Ковалишин aka samael" написал:У Вас 6-ти значные номера телефонов? Попробуйте заменить

В системе хранятся номера с различным кол-вом знаков, каким тогда задавать параметр NumOfDigits?

"Виталий Ковалишин aka samael" написал:Это быстрое решение, для большего удобства пользования, оно еще нуждается в доработке...

Я написал как пример реализации. Вы можете внести свой вклад в развитие идеи и ее совершенствования (Доработки - читали? А никто так ничего и не предложил...)

"Виталий Ковалишин aka samael" написал:вместо баловства - могли бы и помочь

Welcome to OpenSource :) Развиваем!

--
www.it-sfera.com.ua

Подтверждаю слова Олега.
Все аналогично
______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

"Виталий Ковалишин aka samael" написал:Я написал как пример реализации. Вы можете внести свой вклад в развитие идеи и ее совершенствования

Сорь, упустил этот момент.:biggrin:

У меня предварительно получилось что-то такое:
1) Хранимка

CREATE PROCEDURE [dbo].[tsp_CheckForDoublet] (
        @ID AS uniqueidentifier,
        @Communication1 AS nvarchar(250),
        @Communication2 AS nvarchar(250),
        @Communication3 AS nvarchar(250),
        @Communication4 AS nvarchar(250),
        @ReturnResult AS int = 0 OUTPUT
        )
AS
 
SET @ReturnResult = 0
SET @Communication1 = REPLACE(REPLACE(@Communication1, '-', ''), ' ', '')
SET @Communication2 = REPLACE(REPLACE(@Communication2, '-', ''), ' ', '')
SET @Communication3 = REPLACE(REPLACE(@Communication3, '-', ''), ' ', '')
SET @Communication4 = REPLACE(REPLACE(@Communication4, '-', ''), ' ', '')
 
IF EXISTS (SELECT [ID] FROM [dbo].[tbl_ContactCommunication] WHERE 
[ContactID] <> @ID AND (  
REPLACE(REPLACE([Number], '-', ''), ' ', '') IN (@Communication1, @Communication2, @Communication3, @Communication4)
) ) SET @ReturnResult = 1
 
RETURN
GO

2) Функция:

function CheckContactCommunication(Dataset) {
	var Parameters = CreateSPParameters();
	CreateSPParameter(Parameters, 'ID', pdtGUID, Dataset.ValAsGUID('ID'));
	CreateSPParameter(Parameters, 'Communication1', pdtString, 
		Dataset.ValAsStr('Communication1'));
	CreateSPParameter(Parameters, 'Communication2', pdtString, 
		Dataset.ValAsStr('Communication2'));
	CreateSPParameter(Parameters, 'Communication3', pdtString,
		Dataset.ValAsStr('Communication3'));
	CreateSPParameter(Parameters, 'Communication4', pdtString,
		Dataset.ValAsStr('Communication4'));
	CreateSPParameter(Parameters, 'isDoublet', pdtInteger, 0);
    Parameters.ItemsByName('isDoublet').ParamType = 1;
    var SQLText = 'exec dbo.tsp_CheckForDoublet :ID,:Communication1,:Communication2,:Communication3,:Communication4,:isDoublet OUTPUT';
    Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
    var isDoublet = Parameters.ItemsByName('isDoublet').ValAsInt;   
    if (isDoublet == 1) {
        ShowWarningDialog('Дублируются средства связи!');
        return false;
    }
    return true;
}

3)Вызов функции:

function dlDataOnDatasetBeforePost(Dataset, DoPost) {
	if (!CheckContactCommunication(Dataset)) {
		DoPost.Value = false;
	}
}

Возник вопрос:
Если в процедуру добавляю еще один параметр, то выпадает ошибка:
Formal parameter 'такой-то' was defined as OUTPUT but the actual parameter not declared OUTPUT.
На сколько я смог понять, это связанно с типом параметра, но не могу понять как. Может кто-то сталкивался?

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

Parameters.ItemsByName('isDoublet').ParamType = 1;

Так в том то и вопрос что параметр входящий, а для них(входящих), я так понял, указывать тип не надо.

По умолчанию тип входящий. Может, каким-то образом порядок повлиял?

Действительно. Поставил параметр в описании первым и все заработало.:confused:

Я думаю, было бы удобно повесить этот алгоритм поиска на сервис проверки дублей, для поиска в уже введенных контактах.
Может кто подскажет, как это сделать.

Руслан, думаю, адаптировать проверку дублей в базовой версии для реализации данного функционала будет не совсем верно, так как он является универсальным для поиска по одному полю. Данный пример реализации таковым не является, так как с физической точки зрения поля Communication1 и Communication4 отличаются между собой так же, например, как Communication1 и Name.

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

CREATE PROCEDURE [dbo].[tsp_CheckForDoublet]
			@ContactID uniqueidentifier,
			@NumOfDigits int
AS
begin
 
	declare @SecondID uniqueidentifier
	declare @ContactName nvarchar(250)
	declare @SecondName nvarchar(250)
	declare @Communication1 nvarchar(250)
        	declare @Communication2 nvarchar(250)
        	declare @Communication3 nvarchar(250)
        	declare @Communication4 nvarchar(250)
	create table #tmp (
		ID uniqueidentifier,
		ParentRecordID uniqueidentifier,
		ChildRecordID uniqueidentifier,
		ParentRecordValue nvarchar(250),
		ChildRecordValue nvarchar(250))
 
 
	SELECT @ContactName = [Name], @Communication1 = RIGHT(REPLACE(REPLACE([Communication1], '-', ''), ' ', ''), @NumOfDigits),
		@Communication2 = RIGHT(REPLACE(REPLACE([Communication2], '-', ''), ' ', ''), @NumOfDigits),
		@Communication3 = RIGHT(REPLACE(REPLACE([Communication3], '-', ''), ' ', ''), @NumOfDigits),
		@Communication4 = RIGHT(REPLACE(REPLACE([Communication1], '-', ''), ' ', ''), @NumOfDigits) FROM tbl_Contact
	WHERE [ID] = @ContactID
 
 
	declare c_Contact cursor for
		SELECT [ID], Name FROM [dbo].[tbl_Contact] WHERE
		[ID] <> @ContactID AND (  
		(RIGHT(REPLACE(REPLACE([Communication1], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4) and RIGHT(REPLACE(REPLACE([Communication1], '-', ''), ' ', ''), @NumOfDigits) <> '')
		OR
		(RIGHT(REPLACE(REPLACE([Communication2], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4) and RIGHT(REPLACE(REPLACE([Communication2], '-', ''), ' ', ''), @NumOfDigits) <> '')
		OR
		(RIGHT(REPLACE(REPLACE([Communication3], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4) and RIGHT(REPLACE(REPLACE([Communication3], '-', ''), ' ', ''), @NumOfDigits) <> '')
		OR
		(RIGHT(REPLACE(REPLACE([Communication4], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4) and RIGHT(REPLACE(REPLACE([Communication4], '-', ''), ' ', ''), @NumOfDigits) <> '')
		)
 
	open c_Contact
	while 1 = 1
	begin
		fetch next from c_Contact into @SecondID, @SecondName
		if @@fetch_status = -1 break
		if @@fetch_status = -2 continue
 
		insert into #tmp (ID, ParentRecordID, ChildRecordID, ParentRecordValue, ChildRecordValue)
		values (NewID(), @ContactID, @SecondID, @ContactName, @SecondName)
	end
 
	close c_Contact
	deallocate c_Contact
 
	select distinct ParentRecordID, ChildRecordID, ChildRecordValue from #tmp
	--where ParentRecordID = @ContactID
 
	drop table #tmp
 
end
GO

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

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

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

Здравствуйте,
Подскажите какую версию Terrasoft вы используете ?
Ознакомьтесь, пожалуйста, с вложением "Настройка поиска дублей", такова реализация в 3.4.0

Здравствуйте.
Используется Terrasoft Press версии 3.3.0.45.
С вложением ознакомился, но видимо данный функционал в имеющейся версии не представлен.

Хатемкин В.А.
ОАО "Пилот-Медиа"

Функционал поиска дублей в существующих записях полноценно реализован начиная с версии 3.3.2

Для 3.3.0 его можно только дорабатывать вручную, а это довольно серьезный объем работы.

Алгоритм таков:

1. Создать зранимую процедуру поиска дублей в БД;
2. Создать интерфейсную часть в Terrasoft, которая позволила бы пользователям задавать настройки поиска и слияния дублей;
3. Интегрировать поиск дублей в систему.

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

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

Буквально два дня назад у одного и только одного пользователя в системе переставли открываться сервисы Задачи, Контрагенты и Контакты.

При попытке открыть эту закладку появляется сообщение об ошибке:

Ошибка открытия источника данных "ds_Account"
Оригинальное сообщение об ошибке: Dynamic SQL Error
SQL error code=-204
Table unknown
vw_Account
At line 14, column 15
can't format message 13:796 -- message file C:\Program Files\Terrasoft CRM X25\firebird.msg not fount
Error Code: 249

Аналогично для источников ds_Contacts и ds_Task.

Пробовал в администрировании сбрасывать и заново устанавливать права доступа, ситуация не меняется. Остальные сервисы работают нормально. То есть открываем Проекты, там все показывает, кроме Клиента и Контакта.

Нравится

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

Может попробовать забрать и снова раздать права на эти разделы.

Здравствуйте, Алексей!
Для решения возникшей у Вас проблемы могу посоветовать зайти в TSAdmin.exe, открыть таблицу, например, tbl_Account и пересохранить ее (для этого добавьте в название таблицы например пробел, потом уберите его и сохраните таблицу). Таблица пересохранится, что в результате приведет к пересозданию View-представления vw_Account на сервере.
Аналогичные действия выполните для таблиц tbl_Contacts и tbl_Task.
После этого перезапустите рабочее приложение Terrasoft CRM и протестируйте работосопосбность системы.

Также советую скопировать файл Firebird.msg из папки Firebird (с серверной машины) на клиенскую машину. Таким образом, на клиентской машине должны быть два файла fbclient.dll и Firebird.msg.

Желаю удачи!

Мельникова Екатерина

При попытке пересохранить tbl_Account получил вот это сообщение об ошибке.

violation of FOREIGN KEY constraint "PCONTACT_ID" on table "tbl_Contact"
Foreign key reference target does not exist
violation of FOREIGN KEY constraint ""
Error Code: 146
ALTER TABLE "tbl_Account" ADD CONSTRAINT "FAccountPrimaryContactID2"
FOREIGN KEY ("PrimaryContactID") REFERENCES "tbl_Contact" ("ID")

Проверил отношения, все заполнено верно. Поле ID в tbl_Contact присутствует. Странно...

При пересохранении tbl_Task получил вот это сообщение:

violation of FOREIGN KEY constraint "PCONTACTGROUP_ID" on table "tbl_ContactGroup"
Foreign key reference target does not exist
violation of FOREIGN KEY constraint ""
Error Code: 146
ALTER TABLE "tbl_Task" ADD CONSTRAINT "FTaskOwnerGroupID"
FOREIGN KEY ("OwnerGroupID") REFERENCES "tbl_ContactGroup" ("ID")

Тоже все проверил, все должно быть в норме.

tbl_Contact пересохраняется нормально. И кстати, этот сервис у пользователя заработал еще до того, как е его пере сохранил.

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

Горелов Виталий
Компания Лабитек

Да, совершенно верно. Были ошибки в ссылках на таблицы. Исправил, сервисы пересохранил. Как только появится возможность, я тут же проверю заработали ли сервисы у пользователя.

После исправления ошибок в ссылках, таблицы пересохранились нормально. Но система ведется себя странно. Пользователь входит, сообщений об ошибках нет, но все датасеты пустые и наверху в заголовке окна террасофта, где пишется в скобках ФИО контакта - Террасофт 3.1 - Террасофт (Иванов Иван Иванович) - теперь в скобках пишет "Null".
То есть теперь заголовок окна выглядит так:

Террасофт 3.1 - Террасофт (Null)

Права проверил, стоят все какие есть на все сервисы.
Пришлось ставить галочку "Администратор" пользователю. Тогда все заработало нормально.

:-) Террасофт 3.1 - Террасофт (Null)
значит пользователь не имеет прав доступа на строку своего контакта (в разделе Администрирование , пользователь создается с привязкой к определённому контакту) , дайте ему права на чтение этой строки

Так в том-то и дело, что в Администрировании в Террасофт у пользователя стоят все галочки на группе таблиц Контакты. И конкретно на этот контакт в Детали "Доступ" указанному пользователю разрешено Запись и Чтение.

"Барабанов Алексей Александрович" написал:Так в том-то и дело, что в Администрировании ...

Если всё настроено правильно , то найти ошибку можно только отслеживая по профайлеру , запросы к БД , а потом отрабатывать их непосредственно на базе.

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

Создаю нового контрагента и тут же создаю новый контакт. Но при этом почему-то контакт создается без связи на контрагента. Постоянно приходится поддерживать обратную связь. Как обработать такой случай? Может есть функция, которая позволяет по одной связи (контрагент - контакт) создать обратную (контакт - контрагент)

Нравится

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

Не совсем понятна ситуация. Объясните, пожалуйста подробнее.

Если контрагент не сохранен, то создавая новый контакт, никак его не привязать к еще не сохраненному контрагенту.

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

Рекомендую воспользоваться действием [Создать контакт].

[IMG]http://pic.ipicture.ru/uploads/090409/Dz0rjohX0y.jpg[/IMG]

Данное меню можно вызвать нажатие правой кнопкой мышки или из меню действий.

[Создать контакт] – возможность создания контактного лица, связанного с выбранным контрагентом. При выполнении этого действия на экране появляется предварительная форма выбора, в которой определяется, нужно ли заполнять карточку нового контакта данными контрагента.

При нажатии на кнопку [Да] сообщения некоторые поля карточки контакта (название контрагента, средства связи, местоположение) будут заполнены из карточки-источника. При нажатии на кнопку [Нет] все поля новой карточки будут пустыми, за исключением названия контрагента.
После сохранения карточки контакта, если необходимо, можно перейти к созданной записи.

Terrasoft Support Team

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