Здравствуйте.
Мне надо в карточке контакта (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-…
Что не так, почему не срабатывает публикация сообщения:
При изменении поля в карточке клиента происходит событие:
[javascript]
сообщение
messages: {
"GetLoyalty": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.PUBLISH
}
}
[/javascript]
отправка
[javascript]
this.sandbox.publish("GetLoyalty", id1, [this.sandbox.id])
[/javascript]
где id1 = { value: itemID, displayValue: Лояльный }
В карточке Детали, идет прием:
сообщение:
[javascript]
messages: {
"GetLoyalty": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.SUBSCRIBE
}
}
[/javascript]
подпись:
[javascript]
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]);
}
[/javascript]
Где у меня промашка? Предполагаю, что как-то с айдишками накосячил.
"Михайловский Илья Викторович" написал:Где у меня промашка?
Зачем вы что-то отправляете в схему детали, все же намного проще. Если вам нужно то, что вы изначально написали в теме, а именно создание записи (новой строчки) для детали которая размещена на карточке 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
Ну вот взял из примера:
[javascript]
// Получаем [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);
[/javascript]
Не работает, вернее выдает пустое сообщение...
Так все, заработало. Но тут есть проблема. Все же придется как-то через сэндбокс делать, т.к. чтобы получить айди карточки контакта, из которого запустили деталь.
Или есть какой-то способ узнать, айди контакта который открыл карточку?
"Максим Шевченко" написал:
Что-то я не понял как работает InsertQuery.
Есть деталь (UsrLoyaltyObj), со справочными полями (UsrLoyalty, usrParam)
Так деталь выглядит в карточке контакта:

Ну и далее в обработчике кнопки:
[javascript]
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();
[/javascript]
Что именно указывать в рут схема? (Карточку контакта или карточку детали). и сет параметерс, думаю это заполнено верно. Но чего-то не хватает...
"Михайловский Илья Викторович" написал:Или есть какой-то способ узнать, айди контакта который открыл карточку?
Контакта, который открыл карточку? Вы про пользователя который работает в системе? Или все же про Id карточки контакта из которой открыта карточка детали? Если второе, то выше был ответ, this.get("... колонки связи с карточкой контакта, тоесть, колонка справочного типа "Контакт" в карточке детали. Если же про первое, то:
ar currentUserContactId = this.Terrasoft.SysValue.CURRENT_USER_CONTACT.value;
"Михайловский Илья Викторович" написал:Что именно указывать в рут схема? (Карточку контакта или карточку детали). и сет параметерс, думаю это заполнено верно. Но чего-то не хватает...
В rootSchemaName вы пишите имя объекта, В КОТОРЫЙ хотите добавлять запись, setParameterValue вроде верный, вначале имя колонки, второй параметр значение, третий, тип данных.