При создании сценария через JMeter создаются обращения и переводятся в работу. Необходимо чтобы и наряды переходили в статусы дальше, но через штатные решения jmetr'а решения не было найдено. Пришла идея что возможно нужно что-то отключить в системе, потому что отправляя запросы со сгенерированными через jmeter guid для нарядов система заменяет на автоматически созданные. У кого какие есть идеи? Возможно ли отключить проверку и ставить свои значения?

Нравится

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

Можете написать свой сервис и в методе этого сервиса менять статус обращения и сохранять обращение без валидации полей.

Такая постановка вопроса не вполне корректна, eugenes. Если отключить проверку целостности, то можно залить в справочное поле Id записи, которой нет в справочнике этого поля. После этого, пока запись в справочнике не появится, проверку обратно не включить. То есть такое допустимо, но только когда точно знаете, что делаете, например, когда заливаете наполнение связанных таблиц, взятых в произвольном порядке, а не по связям.

В Вашем случае нужно другое, выяснить, почему Вы заполняете Id, а он не передаётся. При обычной работе из раздела, создании новой записи, её Guid формируется на клиенте и передаётся на веб-сервис, где и присваивается новой записи, как я уже писал.

Нужно смотреть, какие запросы к DataService или другим стандартным сервисам Вы отправили. Например, в Fiddler или встроенными средствами браузера.

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

Сущности в системе идентифицируются Guid. который, будучи преобразованным в строку, имеет вид типа "846d8d33-004b-4a3e-b778-10cfd163f3bb" (буквы строчные, в таком виде он фигурирует, например, в параметрах запросов http)

С другой стороны в БД сущности хранятся с первичным ключем, построенным на id varchar2(38), но содержиное там заключено в фигурные скобки и буквы заглавные.

Есть ли стандартная функция преобразования одного в другое? В запрос нужно передать Id текущего контакта, но "{"+UserConnection.CurrentUser.ContactId.ToUpper()+"}" выглядит достаточно неуклюже.

Нравится

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

Могу предложить "элегантный костыль":

string contact = "846d8d33-004b-4a3e-b778-10cfd163f3bb";

string result = String.Join(String.Empty, "{", contact.ToUpper(), "}");

Если используете механизмы EntityShchemaQuery или Select/Insert/Update/Delete, то ничего преобразовывать не нужно, в функции передаётся переменная типа Guid и при генерации SQL в нужном формате подставится само. Если же самостоятельно создаёте SQL, воспользуйтесь своим кодом или советом выше.

Эелегантность костыля в виде сокращения записи обращения к переменной иррелевантна задаче :)

Меня больше интересовал источник подобных сложностей, почему сразу было не привести к одному формату? Ведь была ж какая-то причина?

Причина в том, что основная поддерживаемая база  — MS SQL, где есть тип «uniqueidentifier» и база поймёт вставку в любом формате. А поддержка Oracle добавлена опционально.

В этом и была суть вопроса: если в Oracle используется просто текст, какая разница, что туда писать? Зачем эти скобочки? Чтобы что-то в базе посмотреть, скопировать Id из URL не получится, это минус. Как и при склеивании ESQ и Select. А плюсы вообще есть?

Этот текст, хоть и не является отдельным типом «uniqueidentifier», но служит в качестве первичного или внешнего ключа. Соответственно, если писать в двух полях один GUID разным способом, связи между ними не получится.

Зверев Александр,

В каких 2-х полях??? Почему не писать ОДНИМ способом, в нижнем регистре и без скобок? Везде.

В версии для MS SQL пишите как вам нужно, а в Oracle — именно требуемым способом.

Зверев Александр,

Спасибо, я ожидал компетентный ответ, а не бессмысленный совет следовать инструкциям, я им и так следую, но не могу понять необходимость такого усложнения и препятствия к его устранению. Если препятствий нет, то, думаю,  все, кто на Oracle, меня поддержат, было бы хорошо привести все к единому знаменателю.

Дмитрий, оно и приведено к единому знаменателю — с фигурными скобками в верхнем регистре. Нет смысла в версиях с 3.0 по 7.13 использовать один формат, а потом внезапно менять просто потому, что не нравятся скобки.

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

При обычной работе с форматом написания не сталкиваются никак, все C#-классы принимают значения типа Guid и преобразуют в нужный формат при генерации SQL автоматически. В чём именно негативное влияние фигурных скобок, Вы так и не объяснили. 

Вероятно, первоисточник именно такого написания — стандартная функция CreateGuid в Delphi, на котором была написана система Terrasoft 3.X. Она генерирует именно в таком формате. И в таблицу базы Firebird и Oracle, где нет встроенных типов для хранения GUID, так и записывали.

В Microsoft для C# рекомендуют для получения нужного формата использовать для переменной типа Guid метод ToString("N") в сочетании с String.ToUpper.

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

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

Всплывает ошибка при загрузке мастера редактирования карточки:

file: undefined
line: undefined
column: undefined
message: Элемент с ключом 33e46153-d870-42af-a250-8d8a9ecae940 Не существует 
 date: Thu Nov 15 2018 16:02:43 GMT+0500 (Екатеринбург, стандартное время)
moduleId: undefined
moduleName: undefined





Пишет что id не найден, смотрел в БД, таблицу SysSchema там реально этого UId нету, но зато есть эта карточка но с другим Id

Почему так могло произойти ? И как это можно исправить ?



Изображение удалено.





Изображение удалено.

Нравится

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

Уточните, возникают ли какие-то ошибки в консоли просто при открытии этой карточки редактирования?

Возможно, что-то не перенеслось, если эти карточки переносили на основной сайт с базы разработки. 

Попробуйте сравнивать наполнение системных таблиц, связанных с разделами (вроде SysModule, SysModuleEdit и т.д.) для этого и для нормально работающего разделов. Либо произведите автоматический поиск по всем полям всех таблиц базы, чтобы найти, где именно записан этот ID 33e46153-d870-42af-a250-8d8a9ecae940.

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

Возник вопрос. Как создать такое поле чтобы его значение было уникальным, как id ?

К примеру наименование услуги, чтобы не было 2 одинаковых.
Или как заменить системный ID на свой?

Нравится

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

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

Вы можете добавить проверку на объекте на событие "До сохранение записи". Либо сделать триггером в БД.

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

Добрый день. Подскажите, пожалуйста, как получить Id выделенной записи реестра детали?
В SelectedNodePrimaryColumnValue лежит Id записи основного реестра

Нравится

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

Попробуйте воспользоваться подобной конструкцией:

var recordId = new Guid(Page.TreeGrid.SelectedNodes[0].Values["Id"].ToString());
Показать все комментарии

Добрый день.
Помогите разобраться с проблемой.

Есть раздел, у раздела есть деталь. Одно из полей детали - справочник. При редактировании детали необходимо осуществлять фильтрацию элементов справочника в зависимости от значений двух полей раздела.

Фильтрацию в справочнике я реализовал, передачу параметров из скрипта окна редактирования детали в датасет справочника тоже. Осталось решить такую проблему: из скрипта редактирования детали получить доступ к значениям двух полей той записи раздела, для которой открыта деталь.

Раздел самописный (называется Чеки - Drafts). Деталь раздела - товары в чеке (ItemsInDraft).
Справочник, который фильтруем - номенклатуры товаров. Его необходимо фильтровать по двум параметрам записи раздела - организации (Org) и спд (BuName)

Мой код в скрипте wnd_ItemsInDraftEditScript

function edtNomenameOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
    var Dataset = LookupDataControl.DataField.LookupDataset;
    var SelectQuery = Dataset.SelectQuery;
 // в этих двух строчках я пытался получить нужные мне значения, но BaseGridArea.WorkspaceDataset - null
//var OrgID = GetFieldValueFromDisabledField(BaseGridArea.WorkspaceDataset, 'Org');
//var BuNameID = GetFieldValueFromDisabledField(BaseGridArea.WorkspaceDataset, 'BuName');
    SetParameterValue(SelectQuery.Parameters, 'Org', OrgID);
    SetParameterValue(SelectQuery.Parameters, 'BuName', BuNameID);
}

Нравится

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

Что-то типо этого

var OrgID = GetDatasetFieldValueByID('ds_Drafts', dlData('DraftsID'), 'Org');
var BuNameID = GetDatasetFieldValueByID('ds_Drafts', dlData('DraftsID'), 'BuName');

где 'ds_Drafts' - USI раздела Чеки
dlData - название датасета в карточке редактирования товаров в чеке
'DraftsID' - поле, связывающее товары в чеке с чеком

Мой код выглядит так

var OrgID = GetDatasetFieldValueByID('ds_SDrafts', dlData('SDraftsID'), 'Org');
var BuNameID = GetDatasetFieldValueByID('ds_SDrafts', dlData('SDraftsID'), 'BuName');

Выдает ошибку 438 "Объект не поддерживает это свойство или метод".

Попробуйте поменять так:

var OrgID = GetDatasetFieldValueByID('ds_SDrafts', dlData.Dataset('SDraftsID'), 'Org');
var BuNameID = GetDatasetFieldValueByID('ds_SDrafts', dlData.Dataset('SDraftsID'), 'BuName');

И корректно ли в переменную OrgID получать поле Org ? Может надо получать поля OrgID и BuNameID соответственно?

Спасибо, последний вариант заработал.

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

К идее http://www.community.terrasoft.ru/ideas/9586
А вот вам и решение :cool:
Не уверен, что не вызовет где-нибудь конфликта, но пока полет нормальный
Модифицировал scr_BaseGridArea.
Обращаю внимание, что это затронет только гриды на базе BaseGridArea.

1. Добавляем функции в scr_BaseGridArea

function UpdateGridForIDFields(Window) {
        if (!Connector.CurrentUser.IsAdmin) return;
       
        var Grid = GetGrid(Window);
        if (Assigned(Grid)) {
                var Count = Grid.Count;
                for (var i = 0; i Count; i++) {
                        var GridView = Grid.Items(i);
                var ComponentName = 'col' + 'ID' + GridView.Name;
                if (Assigned(Window.ComponentsByName(ComponentName))) return
                var DataGridColumn = Window.CreateComponent('DataGridColumn', ComponentName);
                DataGridColumn.DataFieldName = 'ID';
                DataGridColumn.IsVisible = false;
                GridView.Add(DataGridColumn);  
                }
        }
}

function GetGrid(Window) {
        var Count = Window.ComponentCount;
        for (var i = 0; i Count; i++) {
                var Component = Window.Components(i);
                if ((Component.TypeCode == 'DataGrid') || (Component.TypeCode == 'DataTreeGrid')) {
                        return Component;
                }
        }
        return null;
}

2. Добавляем вызов UpdateGridForIDFields на OnPrepare

function wnd_BaseGridAreaOnPrepare(Window) {
        InitializeGridArea(Window, BaseGridArea, dlData);
        InitializeGridAreaHotKeyList(Window);
        UpdateGridForIDFields(Window); // test
}

Нравится

Поделиться

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

исправление:
надо еще проверку добавить
if (Assigned(Window.ComponentsByName(ComponentName))) return

Справочники используют свое окно (где грид пересоздается). Чтобы это сработало и с ними, надо в wnd_DictionaryGridAreaScript в функцию добавить UpdateGridForIDFields(Window):

function wnd_DictionaryGridAreaOnPrepare(Window) {
	wnd_BaseGridAreaOnPrepare(Window);
	Initialize(Window);
	UpdateGridForIDFields(Window);
/* 3.4.0	if (!DictionaryGridArea.ExternalOpening) {	
		BaseGridArea.GridDataset.Open();
	}
*/
}

если код функции у вас не в scr_BaseGridArea - не забудьте подключить

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

BPM 5.4.0
Создал кнопку реестре, для обработки необходимо получить id и другие поля выделенной записи. Как это сделать?
И еще вопрос, как потом в эту запись что-то добавить или изменить?

Нравится

1 комментарий
Page.TreeGrid.SelectedNodes

вернет Вам выделенные клиентом в реестре записи как ObservableCollection
А свойство

SelectedNodePrimaryColumnValue

- Id той записи на которой находится курсор

Какой-то странный вопрос??? Как в уже существующую запись можно что либо добавить. Если Вам нужно изменить запись, то вот код:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Page.DataSource.Schema.Name);
esq.AddAllSchemaColumns();
var entity = esq.GetEntity(UserConnection, SelectedNodePrimaryColumnValue);
// код модификации записи
// entity.SetValueAndText("Id записи лукапного", "Текстовое представление лукапного поля");
entity.Save();

Для создания новой записи код:

var manager = UserConnection.EntitySchemaManager.GetInstanceByName(Page.DataSource.Schema.Name);
var entity = manager.CreateEntity(UserConnection);
entity.SetDefValues();
// код модификации записи см. выше
entity.Save();

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

создаю запрос, но вместо текста в нем отображается ID. как исправить?

Нравится

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

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

Содержимое справочников хранится в основной таблице в виде уникальных идентификаторов, Название в запросы подтягивается при помощи JOIN'ов.

Пример запроса:

SELECT
	[tbl_Country].[ID] AS [ID],
	[tbl_Country].[Name] AS [Name],
	[tbl_Country].[TerritoryID] AS [TerritoryID],
	[tbl_Territory].[Name] AS [TerritoryName],
FROM
	[dbo].[tbl_Country] AS [tbl_Country]
LEFT OUTER JOIN
	[dbo].[tbl_Territory] AS [tbl_Territory] ON [tbl_Territory].[ID] = [tbl_Country].[TerritoryID]

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

я запрос строю через клиента XRM, раздел инструменты - запросы

Уточните, пожалуйста, идентификатор отображается прямо в конструкторе запросов? Есть ли у Вас возможность приложить скриншот для диагностики?

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

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

Здравствуйте обитатели форум, пожалуйста прошу помочь мне в следующей проблеме: Когда я пытаюсь вернуть значение Dataset.Values('Dataset.Values('RemindingToOwnerID'); из ds_Task, почему-то возвращается значение null, хотя я пробывал вернуть другие значения этой же таблицы для проверки, вдруг я вообще не стем полем работаю, так все остальные значения данного поля выводятся нормально, как и следует, кроме поля 'RemindingToOwnerID'
данное значение мне нужно для фильтрации другого датасета, по данному значению, к стати так-же у меня не срабатывает ApplyDatasetFilter хотя я туда уже и записал готовое значени поля нужного мне ID, хотя ApplyDatasetIDFilter работает нормально, далее я представлю свой код, для лучшего понимания моей проблемы...

function UpdateDatasetRecordByEvent(Dataset, Event) {
var DataFields = Dataset.DataFields;
        var StartDateDataField = DataFields.ItemsByName('StartDate');
         var StartDateDataField2 = Dataset.Values('StartDate');
        var DueDateDataField = DataFields.ItemsByName('DueDate');
        var OwnerIDDataField = DataFields.ItemsByName('OwnerID');
    var RemindingToOwnerID1 = Dataset.Values('Title');
   
     var RemindingToOwnerID = Dataset.Values('ID');
//     var RemindingToOwnerID = Dataset.Values('RemindingToOwnerID'); // вот оно это самое null значение!!!
var RemindingToOwnerID2 = Dataset.Values('RemindingToOwnerID');
ShowInformationDialog('id нужной записи = {48EE50FD-F61F-4C01-9D01-1CF42AC3880D}'+' заголовок нужной задачи = '+RemindingToOwnerID1+'  ID нужной задачи = '+RemindingToOwnerID+'  значние поля RemindingToOwnerID нужной задачи ='+RemindingToOwnerID2);
        Dataset.Locate('ID', Event.ID);
        var PriorStartDate = StartDateDataField.ValAsDateTime;
        var PriorDueDate = DueDateDataField.ValAsDateTime;
        var ds_Remindings = GetRemindingDataset();
        var RemDataFields = ds_Remindings.DataFields;
//      Dataset.Open();
       

//      ApplyDatasetFilter(ds_Remindings, 'id',RemindingToOwnerID, true);
        var RemStartDateDataField = RemDataFields.ItemsByName('RemindTime');
        ds_Remindings.Open();
    var RemindingDescription = ds_Remindings.Values('Description');
    var RemindingDescription2 = ds_Remindings.Values('RemindTime');
   
        if (!CheckTaskCovering(Dataset, OwnerIDDataField, Event.Start,
                Event.Finish)) {
        CancelChangeEvent(Event, PriorStartDate, PriorDueDate);
                return;

               
        }
var converted = Date.parse(Event.Start) ;
var converted1 = Date.parse(StartDateDataField2) ;
var converted2 = Date.parse(RemindingDescription2) ;

if (Event.Start>StartDateDataField2) {
var conv1 = converted - converted1;
var conv2 = converted2 + conv1;
var someDate = new Date(conv2);
}

if (Event.StartStartDateDataField2) {
var conv1 = converted1-converted;
var conv2 = converted2 - conv1;
var someDate = new Date(conv2);
}


//ds_Remindings.Edit();
//RemStartDateDataField.ValAsDateTime = Event.Start;
//RemStartDateDataField.ValAsDateTime = DateToStr(someDate)+' '+TimeToStr(someDate);
//ds_Remindings.Post();
//ds_Remindings.Close();
//ds_Remindings.Open();
//ApplyDatasetFilter(ds_Remindings, 'id','0000', true);
ds_Remindings.Close();
//ApplyDatasetIDFilter(ds_Remindings,'{48EE50FD-F61F-4C01-9D01-1CF42AC3880D}', true);
ApplyDatasetFilter(ds_Remindings,'id','{48EE50FD-F61F-4C01-9D01-1CF42AC3880D}', true);
ds_Remindings.Open();
//ds_Remindings.Open();


ShowInformationDialog(ds_Remindings.Values('Description')+'hkjhkjh');
//ShowInformationDialog('id нужной записи = {48EE50FD-F61F-4C01-9D01-1CF42AC3880D}'+' Id записи RemindingТoOwnerID = '+RemindingToOwnerID);

 //ds_Remindings.Open();
//var RemindingToOwnerID1 = Dataset.Values('RemindingToOwnerID');      
//ShowInformationDialog('id нужной записи = {48EE50FD-F61F-4C01-9D01-1CF42AC3880D}'+' значение нужной задачи = '+RemindingToOwnerID1+'====='+RemindingToOwnerID);

        Dataset.Edit();
        Dataset.ValAsStr('Title') = Event.Caption;
        StartDateDataField.ValAsDateTime = Event.Start;
        DueDateDataField.ValAsDateTime = Event.Finish;
        UpdateDuration(Dataset);
        Dataset.Post();
        UpdateEventColorsByDatasetRecord(Event, Dataset);
       

}

:cry:

Нравится

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

ApplyDatasetFilter(ds_Remindings,'id','{48EE50FD-F61F-4C01-9D01-1CF42AC3880D}', true);
необходимо писать 'id' в верхнем регистре 'ID'

Спасибо! Теперь фильтрует, но значение переменной в которую присваиваю значение поля RemindingToOwnerID, попрежнему пустое.... как быть ?

"Мамажанов Марат Кадралдыкович" написал:попрежнему пустое.... как быть ?

вариантов может быть несколько , если нет ошибки , то лучше всего в профайлере посмотреть запрос , возможно данные берутся не оттуда , откуда хотелось бы :-)

как это сделать ?

"Мамажанов Марат Кадралдыкович" написал:как это сделать ?

какая БД у Вас?

sql-server 2005

По-моему RemindingToOwnerID хитрое поле и наличие в нем значения, отличного от пустого еще ни о чем не говорит. Учтите это.

Upd: Предлагаю после нажатия кнопки "Добавить комментарий" дизейблить ее :)

"Мамажанов Марат Кадралдыкович" написал:sql-server 2005

С инсталляцией идет SQl Server Profiler

--
www.it-sfera.com.ua

у него есть SQL Server Profiler
с его помошью можно отслеживать все запросы к серверу (очень удобная и полезная для разработки)

вы знаете, у меня что-то не совсем получаеться с данной утилитой SQL Server Profiler, но думаю что я правильно обращаюсь к базе и к таблице, просто исходя из того что, другие данные из тойже таблицы и поля, выводяться нормально, т.е. все поля данной зиписи выводятся как и следует, но именно при обращении к данному полю "RemindingToOwnerID" получаеться вот такая вот непонятная ситуация ....

Скажите может ли это быть из-за того что, я пытаюсь присвоить значение уникального идентификатора, может ли в этом крыться ошибка?, т.к. для сравнения пробовал присваивать значения других полей данной записи имеющих отличный тип данных, все выводятся нормально, но как только дело доходить до полей с уникальным идентификатором, то они как мое поле ругаются на то что, значение null...
скажите как в этом случае мне поступить ???
Может быть есть возможность конвертировать значение данного тип в строку?
С уважением Марат Мамажанов.

"Мамажанов Марат Кадралдыкович" написал:конвертировать значение данного тип в строку

Dataset.ValAsStr('FieldName')
вроде еще такое бывает SomeVariable.toString()

а вообще посмотрите для данной записи прямо в таблице значение злополучного поля - оно там значение какое имеет?

ООО "Лайнсервис"
www.ls-crm.ru

значение поля = {48EE50FD-F61F-4C01-9D01-1CF42AC3880D} уникальный идентификатор

Исключая элемент мистики))
var RemindingToOwnerID = Dataset.Values('RemindingToOwnerID');
- а если дебаггером посмотреть что присваивается переменной? если null, тогда смотрим здесь же значение поля Dataset.Values('ID'), потом в базе смотрим, действительно ли там для соответствующей записи поле RemindingToOwnerID имеет значение null или нет еще раз)).
Если нет там null, делаем вывод, что в датасете это поле сначала получает благодаря запросу правильное значение, а потом уже заполняется значением null (благодаря какому-либо скрипту) перед тем, как мы к нему обращаемся

ООО "Лайнсервис"
www.ls-crm.ru

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

Если это в карточке происходит, то там идет вызов PrepareRemindControls в wnd_TaskEditOnPrepare и там есть кусок кода

if (!ExistRemindingToOwner){
	Dataset.Values('RemindingToOwnerID') = null;
}

Т.е. если в таблице поле RemindingToOwnerID не пустое, но напоминание уже удалено, то RemindingToOwnerID сбрасывается в null

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

"Мамажанов Марат Кадралдыкович" написал:данный скрипт вызыватеться при перетягивании задачи в расписании, может ли при этом происходить то действие, которое Вы описываете ?

а Вы debugger туда впишите в начале функции, вот и узнаем наверняка:smile:

ООО "Лайнсервис"
www.ls-crm.ru

Не должен, хотя чем черт не шутит :)

Вы знаете, так ничего у меня и не получилось с этим полем
:sad:
Если не затруднит, может кто-нибудь попробует проделать такое же действие, может получиться что...
Хотя бы просто присвоить значение этого поля и вывести его в сообщении ShowInformationDialog.
Заранее спасибо!

Вы бы сначала с профайлером разобрались. Ато нехорошо просить людей что-то сделать, а самому не попытаться разобраться в такой элементарной вещи. Посмотрите какой запрос. Выполните его QueryAnalizer-ом. Посмотрите там значение поля. И уже от сюда плясать будем.

Кстати убедитесь, что напоминание не удалено из базы. Мне кажется все спецэфекты с этим связаны.

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