Добавление значений по кнопке

Здравствуйте.
Мне надо в карточке контакта (ContactPageV2) по нажатию кнопки (UsrAddBtn), добавить несколько значений детали (UsrLoyaltyDetail и к ней относящиеся объект и страница соответственно UsrLoyaltyObj, UsrLoyaltyDetailPage). Как это сделать?

Причем одно из полей детали, берется из поля ContactPageV2 (допустим из: UsrString).

Обработчик кнопки есть, что в него вписать?

Нравится

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

Здравствуйте,
Для чтения данных из колонок карточки, в контексте карточки можно использовать просто var myValue = this.get("UsrString")
Если данные нужно вытащить из другого объекта, можно было бы использовать EntitySchemaQuery:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/ispolzovanie-r…
Для записи значения детали, используйте InsertQuery, множество примеров использования можете посмотреть в базовой конфигурации, к примеру в схеме EmailPageV2 из UIv2:

var roleId = ConfigurationConstants.Activity.ParticipantRole.Participant;
var insert = this.Ext.create("Terrasoft.InsertQuery", {
rootSchemaName: "ActivityParticipant"
});
var id = Terrasoft.utils.generateGUID();
insert.setParameterValue("Id", id, Terrasoft.DataValueType.GUID);
insert.setParameterValue("Activity", activityId, Terrasoft.DataValueType.GUID);
insert.setParameterValue("Participant", contactId, Terrasoft.DataValueType.GUID);
insert.setParameterValue("Role", roleId, Terrasoft.DataValueType.GUID);

insert.execute();

Так же небольшой пример с пакетной записью есть здесь:
https://academy.terrasoft.ru/documents/technic-sdk/7-9/sozdanie-detali-…

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

сообщение
messages: {
			"GetLoyalty": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		}

отправка

this.sandbox.publish("GetLoyalty", id1, [this.sandbox.id])

где id1 = { value: itemID, displayValue: Лояльный }

В карточке Детали, идет прием:
сообщение:

messages: {
			"GetLoyalty": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		}

подпись:

init: function() {
				var sandID = "CardModuleV2_dad159f3-6c2d-446a-98d2-0f4d26662bbe_ContactPageV2"; //sandboxID - карточки контакта
				this.callParent(arguments);
				this.sandbox.subscribe("GetLoyalty", function(recordId) {
					var id = {
						value: recordId.value,
						displayValue: recordId.displayValue
					};
					this.set("UsrLoyalty", id);
					}, this, [sandID]);
}

Где у меня промашка? Предполагаю, что как-то с айдишками накосячил.

"Михайловский Илья Викторович" написал:Где у меня промашка?

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

Не нужно использовать песочницу, передавать сообщение между схемами. Просто сделайте Terrasoft.InsertQuery в объект детали с нужными данными.
И в колбеке, кстати вот как можно писать колбек во время вызова создания записи:

insert.execute(function(response) {
if (response && response.success) {
this.updateDetail({detail: "SupplyPayment"});
}
}, this);

напишите this.updateDetail({detail: "SupplyPayment"}); что вызовет перезагрузку детали, и отобразит созданные записи. Где SupplyPayment имя детали, так, как оно написано в схеме ContactPageV2 в блоке details.

"Максим Шевченко" написал:
Михайловский Илья Викторович пишет:

Где у меня промашка?

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

Не нужно использовать песочницу, передавать сообщение между схемами. Просто сделайте Terrasoft.InsertQuery в объект детали с нужными данными.

И в колбеке, кстати вот как можно писать колбек во время вызова создания записи:

insert.execute(function(response) {

if (response && response.success) {

this.updateDetail({detail: "SupplyPayment"});

}

}, this);

напишите this.updateDetail({detail: "SupplyPayment"}); что вызовет перезагрузку детали, и отобразит созданные записи. Где SupplyPayment имя детали, так, как оно написано в схеме ContactPageV2 в блоке details.


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

Ну для этого тоже не обязательна песочница. Достаточно по Id родительской записи, вытащить нужные данные. В схеме страницы детали, в onEntityInitialyzed методе

onEntityInitialized: function() {
this.callParent(arguments);
// ваш код
}

делаете EntitySchemaQuery запрос к объекту контакта, с фильтром по Id, достаете нужные данные, и в колбеке делатете this.set( ... нужным колонкам карточки детали.

Id родительской записи из которой добавляется запись детали, в карточке детали можно получить по колонке связи, подозреваю колонка связи в объекте детали у вас контакт, возможно с приставкой Usr, значит получить её ид можно так:
this.get("UsrContact").value

Но как именно это сделать, не могли бы написать код?
Карточка конткта: UsrContactPageV2 (объект контакта: UsrContact)
поле из которого нужуно получить значение (справочное): UsrLoyalty
деталь: объект - UsrLoyaltyObj, карточка: UsrLoyaltyObj1Page
поле куда надо поместить в детале: UsrLoyalty

"Михайловский Илья Викторович" написал:не могли бы написать код?

Код написать не видя всей картины, всех полей объектов карточки и детали, нет, но выше достаточно информации для написания данной логики самостоятельно,
больше всего почитайте про https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/ispolzovanie-r…
если возникнут точечные трудности, обращайтесь. Так же если у вас достаточный пакет поддержки для консультаций по разработке, можете обратится в поддержку террасофт с предоставлением доступа к сайту: support@terrasoft.ru

"Максим Шевченко" написал:
Михайловский Илья Викторович пишет:

не могли бы написать код?

Код написать не видя всей картины, всех полей объектов карточки и детали, нет, но выше достаточно информации для написания данной логики самостоятельно,

больше всего почитайте про https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/ispolzovanie-re...

если возникнут точечные трудности, обращайтесь. Так же если у вас достаточный пакет поддержки для консультаций по разработке, можете обратится в поддержку террасофт с предоставлением доступа к сайту: support@terrasoft.ru


Ну вот взял из примера:

// Получаем [Id] объекта карточки.
var recordId = this.get("Id");
// Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "Contact"
});
// Добавляем колонку с именем основного контакта контрагента, который относится к данному контакту.
esq.addColumn("Account.PrimaryContact.Name", "PrimaryContactName");
// Получаем одну запись из выборки по [Id] объекта карточки и отображаем ее
// в информационном окне.
esq.getEntity(recordId, function(result) {
    if (!result.success) {
        // обработка/логирование ошибки, например
        this.showInformationDialog("Ошибка запроса данных");
        return;
    }
    this.showInformationDialog(result.entity.get("PrimaryContactName"));
}, this);

Не работает, вернее выдает пустое сообщение...

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

"Максим Шевченко" написал:

Что-то я не понял как работает InsertQuery.
Есть деталь (UsrLoyaltyObj), со справочными полями (UsrLoyalty, usrParam)
Так деталь выглядит в карточке контакта:
Эта деталь на на странцие контакта
Ну и далее в обработчике кнопки:

var insert = Ext.create("Terrasoft.InsertQuery", {
					rootSchemaName: "UsrLoyaltyObj"
				});
				insert.setParameterValue("UsrLoyalty", "ТЕКСТ", Terrasoft.DataValueType.TEXT);
				insert.setParameterValue("UsrParam", "Parametr", Terrasoft.DataValueType.TEXT);
				insert.execute(function(response) {
					window.console.log(response);
				});
				this.reloadGridData();

Что именно указывать в рут схема? (Карточку контакта или карточку детали). и сет параметерс, думаю это заполнено верно. Но чего-то не хватает...

"Михайловский Илья Викторович" написал:Или есть какой-то способ узнать, айди контакта который открыл карточку?

Контакта, который открыл карточку? Вы про пользователя который работает в системе? Или все же про Id карточки контакта из которой открыта карточка детали? Если второе, то выше был ответ, this.get("... колонки связи с карточкой контакта, тоесть, колонка справочного типа "Контакт" в карточке детали. Если же про первое, то:
ar currentUserContactId = this.Terrasoft.SysValue.CURRENT_USER_CONTACT.value;

"Михайловский Илья Викторович" написал:Что именно указывать в рут схема? (Карточку контакта или карточку детали). и сет параметерс, думаю это заполнено верно. Но чего-то не хватает...

В rootSchemaName вы пишите имя объекта, В КОТОРЫЙ хотите добавлять запись, setParameterValue вроде верный, вначале имя колонки, второй параметр значение, третий, тип данных.

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