Коллеги, добрый день!

Подскажите, пожалуйста, каким образом можно изменить настройки числового поля, чтобы по умолчанию сохранялось значение не "0", а Null. Есть ли возможность такое изменение внести на уровне приложения, а не через субд?

С уважением,
Дмитрий

Нравится

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

Здравствуйте, Дмитрий!

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

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



В связи с Вашим ответом возник следующий вопрос. Используем числовое поле для хранения числового уникального идентификатора из другой системы. Это поле будем использовать для связи и обновления данными из другой системы. Можем ли изменить настроки числового целого поля таким образом, чтобы ему не назначалось значение по умолчанию, равное 0?

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

Добрый день!
Подскажите, пожалуйста, как
1) очистить дату через элемент "Изменение данных" - то есть как обозначить пустую дату?
2) как сравнить в условии(условный поток) в бизнес-процессе дату с null (то есть проверить заполнена дата или нет)

Собственно, интересует вопрос как обозначить пустую дату? (незаполненную)
Например, строка - это string.Empty
а в случае даты?

Нравится

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

Дарья, добрый день!

На уровне приложения поле с типом DateTime является non-nullable. Т.е. установить значение null в элемент “Изменить данные” не получится.
Список доступных методов DateTime можно посмотреть в документации https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx
Если не указывать значение для поля с типом DateTime при создании записи в объекте – в базе данных будет установлено значение null.

а в условном потоке можно как-то проверить, заполнена дата или нет?

Если нельзя очистить дату с помощью элемента "Изменить данные", тогда как действовать? использовать элемент сценарий?

Здравствуйте, Дарья!

Для проверки заполнена дата или нет Вы можете в условном потоке сравнивать [#Параметр#] c минимальной датой (DateTime.MinValue).

Дата не заполнена, если [#Параметр#]<=(DateTime.MinValue).

Для очистки даты Вам нужно использовать задание-сценарий, т.к. элементом "Изменить данные" Вы сможете только задать значение DateTime.MinValue, которое соответствует 01.01.0001 (такое значение будет отображаться на странице редактирования/в реестре, что не очень красиво).

спасибо

Добрый день!
Использую такой код в сценарии для очищения даты
UserConnection userConnection = context.UserConnection;
var update = new Update(userConnection, "Case")
.Set("SolutionProvidedOn", new QueryParameter(null))
.Where("Id").IsEqual(new QueryParameter(RecordId));
update.Execute();
Возникает ошибка при исполнении процесса -
Ссылка на объект не указывает на экземпляр объекта.

Пробую использовать такой код в сценарии для очищения даты
UserConnection userConnection = context.UserConnection;
var update = new Update(userConnection, "Case")
.Set("SolutionProvidedOn", null)
.Where("Id").IsEqual(new QueryParameter(RecordId));
update.Execute();
При публикации объекта возникает ошибка

Как очистить дату с помощью элемента-сценарий?

Здравствуйте, Дарья!

Вы можете использовать CustomQuery.

var dr = new CustomQuery(UserConnection, String.Format(
"update case set SolutionProvidedOn = null where Id = 974ca9fc-c066-4a7a-ac65-7ec91a44a067")).ExecuteReader(dbExecutor);

При этом сам запрос Вам необходимо формировать отдельно (так как Id каждый раз будет новый).

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

Пытаюсь решить простую задачу - нужно в скрипте "обнулить" значение поля справочника. Поле не обязательное для заполнения, значение отличное от null в него записать удается, а вот как стереть из него все?

update = new Update(Page.UserConnection, "ConsignmentCargo")
        .Set("CurrentRoutePointId", Column.Parameter(DBNull.Value))
        .Where("IsLast").IsNotEqual(Column.Parameter(1))
        .And("ConsignmentId").IsEqual(Column.Parameter(CurrentConsignmentId));
update.Execute();

В примере это поле CurrentRoutePointId.

Через entity также установить null не удается

var entitySchemaManager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as Terrasoft.Core.Entities.EntitySchemaManager;
        var entitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, "ConsignmentCargo");
        entitySchemaQuery.AddColumn("CurrentRoutePoint");
        entitySchemaQuery.Filters.Add(entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Consignment", CurrentConsignmentId));
        entitySchemaQuery.Filters.Add(entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.NotEqual, "IsLast", 1));       
        var entities = entitySchemaQuery.GetEntityCollection(UserConnection);  
               
        foreach (var entity in entities) {
                entity.SetColumnValue("CurrentRoutePointId", Column.Parameter(Guid.Empty));
                entity.Save();
        }

Нравится

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

Александр, попробуйте так

Column.Parameter(null, "Guid")

Думаю, такие примеры тоже пригодятся

			var dbNull = DataTypeUtilities.ValueAsType<Guid>(DBNull.Value);
			Assert.AreEqual(Guid.Empty, dbNull);
 
			var dbNull = DataTypeUtilities.ValueAsType<Guid>(null);
			Assert.AreEqual(Guid.Empty, dbNull);
 
			var dbNull = DataTypeUtilities.ValueAsType<DateTime>(DBNull.Value);
			Assert.AreEqual(DateTime.MinValue, dbNull);
 
			var dbNull = DataTypeUtilities.ValueAsType<DateTime>(null);
			Assert.AreEqual(DateTime.MinValue, dbNull);

"Раловец Ольга" написал:

Александр, попробуйте так

Column.Parameter(null, "Guid")


Сработало, спасибо!

"Александр Кудряшов" написал:

.Where("IsLast").IsNotEqual(Column.Parameter(1))


Александр, такой код не переносим на Oracle. К сожалению, или к с частью :), mssql очень много "додумывает" за разработчика и неявно приводит типы данных. Но Oracle не сможет интерпретировать 1 как true. Поэтому лучше написать:

.Where("IsLast").IsNotEqual(Column.Parameter(true, "Boolean"))
Показать все комментарии

Здравствуйте обитатели форум, пожалуйста прошу помочь мне в следующей проблеме: Когда я пытаюсь вернуть значение 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-ом. Посмотрите там значение поля. И уже от сюда плясать будем.

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

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