Изменения телефонов

Добрый день!
Были изменены поля с телефонами контактов, добавлены 2 поля [Телефон] и [Мобтел], который содержат ID телефонов контрагента. Датасет ds_ContactCommunication не используется вовсе, поля в таблице Контактов - Communication1,2,3,4 и Communication1,2,3,4Type спрятаны и не используются.

Подскажите пожалуйста в каких скриптах необходимо изменить, чтобы он всегда обращался к этим полям и соответственно звонил только по ним.
Или можно хитрым способом: переделать ds_ContactCommunication на поля AccountCommunication, a поля [Телефон] и [Мобтел] переименовать в Communication1 и Communication2?

Нравится

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

Добрый день!
По постановке задчи можно предположить, что в таблице tbl_Account имеются 2 поля: PhoneID и MobileID типа UID, которые связанны по вторичному ключу с талицей tbl_AccountCommunication, полем ID. Очевидно, что для того, чтобы отобразить те же записи в выборке sq_Contact необходимо обратиться полям PhoneID и MobileID таблицы tbl_Account которая уже связанна с sq_Contact по вторичному ключу AccountID - это иллюстрирует прилагаемый скриншот.
AccountID.png

И если задача заключается в том, чтобы отобразить в карточке Контакта записи из таблицы tbl_AccountCommunication, связанные с tbl_Account по полям PhoneID и MobileID, в таком случае, в сервисе sq_Contact обратитесь непосредственно необходимым записям из талицы tbl_AccountCommunication в Subselect.

  1. Создаем Subselect в сервисе sq_Contact, называем его Phone
    Subselect Pnone
  2. В блоке FROM указываем таблицу tbl_AccountCommunication
  3. В блок WHERE добавляем фильтр сравнения:
    CompareFilter
  4. В блок Select поле Number из таблицы tbl_AccountCommunication, алиас ему можно задать, например, Phone

    AccCommunicationPhone.png

После этого, данное поле можно вынести в карточку редактирования Контакта.
Таким же образом добавьте телефон по связи с MibileID.

Задача заключается не в отображении данных, а в обращении к ним при звонке.
У контрагента может быть скока угодно телефонов, а у контакта лишь городской или мобильный, которые выбираются из телефонов контрагента. С отображением и взаимодействием проблем нет.
Таблица tbl_Account не была затронута на изменение телефонов, т.е. там все как было. В таблице tbl_Contact добавлены 2 поля: PhoneID и MobileID типа UID, которые связанны по вторичному ключу с талицей tbl_AccountCommunication, полем ID.
И когда выбираешь действие позвонить контакту он пишет пустые поля, так как обращается к communication1,2,3,4 а они соответственно пусты. Вот тут надо изменить, чтобы он звонил по телефону и по мобильному контакта.

Здравствуйте, Константин.

Для контакта также можно задать сколько угодно средств связи различных типов, помимо 4-ех основных, которые отображаются в карточке редактирования. Именно поэтому, к примеру, при создании нового контакта, эти 4-ре средства связи копируются также на деталь "Средства связи контакта", которые в дальнейшем используются в т.ч. при звонках.
В связи с этим, предлагаю Вам :

1) В sq_ContactCommunication переделать выборку Communication1(2) на связанные поля в карточке контрагента. (если связь отсутствует - добавить).
2) В датасете ds_ContactCommunication переименовать заголовок полей Communication1, Communication2 на "Мобильный телефон", "Городской телефон". При необходимости изменить тип поля.
3) В коде при нажатии кнопки "Ок" карточки редактирования "захардкодить" CommunicationType1(2) на ID типа "телефон".

Далее для теста создайте новый контакт и заполните ему данные поля. Проверьте, если выбранные номера телефонов были скопированы на деталь "средства связи" - значит все ок. Можно звонить.

Решил сделать проще, так как уже поля PhoneID и MobileID созданы и работают корректно, просто по нажатию на кнопку ok копируются значения в поля communication1,2 и соответственно присваиваются их communicationtype1,2.
Но возникла другая проблема, выкидывает на ошибке throw ErrorMgs

function CheckAssigned(Object, ObjectName) {
	if (!Assigned(Object)) {
		var ErrorMgs = FormatStr(ObjectNotAssignedError, ObjectName);
		throw ErrorMgs;
	}
}

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

После долгих копаний в дебагере выянилось, что ошибка вылетает при выполнении функции SelfOnDatasetAfterPost(Dataset) в scr_Contact внутри которой есть функция ActualizeCommunicationEx(Dataset, Contact.ModifiedCommunicatonPositionArray, 'ContactID'):

function ActualizeCommunicationEx(Dataset, PositionArray, FilterFieldName) {
	var CommunicationDatasetUSI = Dataset.Attributes('CommunicationDataset');
	if (IsEmptyStr(CommunicationDatasetUSI)) {
		return;
	}
	var CommunicationDataset = GetSingleItemByCode(CommunicationDatasetUSI, 
		'CommunicationUtils');
	ApplyDatasetFilter(CommunicationDataset, 
		FilterFieldName, Dataset.Values('ID'), true);	
	CommunicationDataset.DisableEvents();
	try {
		CommunicationDataset.Open();
		for (i = 0; i < PositionArray.length; i++) {
			FieldName = 'Communication' + PositionArray[i];
			if (!CommunicationDataset.Locate('Position', PositionArray[i])) {
				if (!IsEmptyValue(Dataset.Values(FieldName))) {
					CommunicationDataset.Append();
					CommunicationDataset.Values(FilterFieldName) = 
						Dataset.Values('ID');
					CommunicationDataset.Values('Position')	= PositionArray[i];
					CommunicationDataset.Values('Number') = 
						Dataset.Values(FieldName);
					CommunicationDataset.Values('Digits') = 
						DigitsFromString(Dataset.Values(FieldName));						
					CommunicationDataset.Values('CommunicationTypeID') = 
						Dataset.Values(FieldName + 'TypeID');
					CommunicationDataset.Post();
				}
			} else
			if (IsEmptyValue(Dataset.Values(FieldName))){
				CommunicationDataset.Delete();
			} else {
				CommunicationDataset.Edit();
				CommunicationDataset.Values('Number') = 
					Dataset.Values(FieldName);
				CommunicationDataset.Values('Digits') = 
					DigitsFromString(Dataset.Values(FieldName));						
				CommunicationDataset.Values('CommunicationTypeID') = 
					Dataset.Values(FieldName + 'TypeID');
				CommunicationDataset.Post();
			}
		}
	} finally {
		CommunicationDataset.Close();	
		CommunicationDataset.EnableEvents();
	}
}

А конкретно у него CommunicationDatasetUSI определяется как ds_AccountComunication, вместо ds_ContactCommunication, что и вызывает дальнейшую ошибку по несуществующему фильтру.
Dataset является Контакт.

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

А какое значение параметра FilterFieldName в функции?
Есть ли фильтр с таким именем в sq_AccountCommunication и sq_ContactCommunication?

Здравствуйте.
FilterFieldName=ContactID и он есть в sq_ContactCommunication

Константин, нужно либо отладчиком пройтись по функции которая идет перед вызовом ActualizeCommunicationEx(Dataset, PositionArray, FilterFieldName), и проверить почему передается не верное значение атрибута CommunicationDataset.

Либо второй вариант:

try
{
var CommunicationDataset = GetSingleItemByCode(CommunicationDatasetUSI,
                'CommunicationUtils');
ApplyDatasetFilter(CommunicationDataset, 
                FilterFieldName, Dataset.Values('ID'), true);
}
catch(e)
{
var CommunicationDataset = Services.GetNewItemByUSI('ds_ContactCommunication');
ApplyDatasetFilter(CommunicationDataset, 
                FilterFieldName, Dataset.Values('ID'), true);
}

try catch не помогает, все равно выкидывает на том же месте и не идет на catch.
Показывает ошибка "OLE error 80020101"
Через отладчик нигде не видно AccountCommunication :exclaim:

Доброе утро, Константин.

Ок, тогда предлагаю в функции OnDatasetAfterPost перед вызовом ActualizeCommunicationEx, явно задать атрибут для Dataset'a:

Dataset.Attributes('CommunicationDataset') ='ds_ContactCommunication' ;

Все получилось. И в правду доброе утро!:biggrin:
Спасибо Большое!!
По этому же вопросу, у контакта появились пункты позвонить по "Городскому телефону" и по "Мобильному телефону", но пишет всегда что они пусты.
Меню - позвонить контакту, все нормально, дает выбрать все телефоны контакта.

Здравствуйте, Константин.

Скорее всего пункты позвонить по "Городскому телефону" и по "Мобильному телефону" обращаются к полям Communication1(2) карточке редактирования контакта (именно контакта, а не средств связи) .
Поэтому, необходимо настроить копирование также и в эти поля.

Все хорошо копируется, вот таблицы:
contact.txt
contactcommunication.txt

Доброе утро, Константин.

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

Добрый день.
Вопрос как раз в том как найти этот пункт. Никак не могу понять как он формирует этот список.

Здравствуйте, Константин.
Предлагаю запланировать удаленное подключение к Вашему рабочему месту. Попробуем отладиться с Вами вместе, и исправить данную ситуацию. Сообщите удобную для Вас дату и время.

Давайте в пятницу, с 10.30- 17.00 по Москве, попробую подстроиться.

Константин, здравствуйте.

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

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

Дмитрий, здравствуйте.
Вот что получилось:

		if (DataField.Name == 'MobileID')               //если мобильный
			{
			 	var AccountDataset = Services.GetNewItemByUSI('ds_Contact');
			 	var IDDataset = Dataset.DataFields('ID');
			 	var IDS=IDDataset.Value;
			 	ApplyDatasetFilter(AccountDataset, 'MobileID', DataFieldValue, true);
			 	ApplyDatasetFilter(AccountDataset, 'ID', IDS, true);
			 	AccountDataset.Open();
			 	DataFieldValue = AccountDataset('ID');
			 	AccountDataset.Close();
			 	LookupDatasetUSI='ds_ContactCommunication';     // привязываем ContactCommunication
			}

Ну и перед вызовом фильтруем по CommunicationTypeID чтобы показывал только Мобильный, аналогична привязка и для Городского.
Еще раз Большое спасибо за разъяснения.

Здравствуйте, Константин.

Рад, что у Вас все получилось!
Если возникнут дополнительные вопросы - обращайтесь.

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