Здравствуйте.
Мне надо в карточке контакта (ContactPageV2) по нажатию кнопки (UsrAddBtn), добавить несколько значений детали (UsrLoyaltyDetail и к ней относящиеся объект и страница соответственно UsrLoyaltyObj, UsrLoyaltyDetailPage). Как это сделать?
Причем одно из полей детали, берется из поля ContactPageV2 (допустим из: UsrString).
Обработчик кнопки есть, что в него вписать?
Нравится
Здравствуйте,
Для чтения данных из колонок карточки, в контексте карточки можно использовать просто 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 вроде верный, вначале имя колонки, второй параметр значение, третий, тип данных.