powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопрос по SqlComputedCode
17 сообщений из 17, страница 1 из 1
Вопрос по SqlComputedCode
    #37705884
Vixler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть поле

Property IsDeleted As %Boolean;

Нужно выбрать все объекты, у которых IsDeleted не равно 1 (true). По идее, это все существующие строки, потому как это поле было добавлено к уже существующему классу с кучей экземпляров в базе. Пишу запрос:

Select * from docs where isdeleted <> 1

Результат: ноль строк. Не, оно понятно, что надо писать:

Select * from docs where is deleted is null or isdeleted = 0

Но не хотелось бы в куче запросов (а это поле добавлено в родительском классе) писать длинное условие, да и на будущее хочется знать, нельзя ли как-то исключить null из получаемых значений?

Пытался сделать так:

Property IsDeleted As %Boolean [ InitialExpression = 0, SqlComputeCode = {s {*} = ({*}=1)}, SqlComputed, SqlFieldName = IsDeleted ];

или какие-то другие условия. Ноль строк. Причём sqlcomputecode не выполняется, видимо, вообще.
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37705888
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
select * from docs where ISNULL(isdeleted,0)!=1



Хотя я бы на вашем месте просто ручками в базе проапдейтила все существующие NULL'ы, заменив их на 0, т.к. в случае использования функции ISNULL в некоторых случаях это может приводить к потере в скорости, поэтому сначала:

Код: sql
1.
update docs set isdeleted = 0 where isdeleted IS NULL



затем:
Код: sql
1.
select * from docs where isdeleted!=1


ну или
Код: sql
1.
select * from docs where isdeleted<>1


как вам удобнее..
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37705889
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и для вновь создаваемых записей [InitialExpression = 0] обязательно должно быть
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37722740
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму темку...

Есть ли какая-то возможность получить ID екземпляра в этой конструкции?

Код: vbnet
1.
2.
3.
4.
/// Местный ID
Property keyId As %Numeric [ SqlComputeCode = { 
		Set {*}={%%ID} // пока тут записывается "" но и ошибок компиляции нет
	}, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37722904
andrew_tsw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня на Cache 2011.1.3 (Build 800U) получилось двумя способами:
Код: plaintext
1.
2.
Property ItemId1 As %Integer [ SqlComputeCode = {set {*}={%%ID} }, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];
Property ItemId2 As %Integer [ SqlComputeCode = {set {*}={ID} }, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];


Но значение в вычисляемое поле запишется только после сохранения объекта. Возможно, у Вас значение keyId проверяется до вызова %Save , а не после вызова.
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37722955
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня
Код: vbnet
1.
Cache for Windows (x86-64) 2010.2.3 (Build 702) Tue Feb 15 2011 14:20:27 EST



andrew_tswУ меня на Cache 2011.1.3 (Build 800U) получилось двумя способами:
Код: vbnet
1.
Property ItemId1 As %Integer [ SqlComputeCode = {set {*}={%%ID} }, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];



Таккой способ не даёт ошибок но записывал пусто...

andrew_tsw
Код: vbnet
1.
Property ItemId2 As %Integer [ SqlComputeCode = {set {*}={ID} }, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];



Тако тоже пробовал - давал ошибку компилляции...


andrew_tswНо значение в вычисляемое поле запишется только после сохранения объекта.
Это-то понятно.

andrew_tswВозможно, у Вас значение keyId проверяется до вызова %Save , а не после вызова.
Это вроде как невозможно... Т.к. сама конструкция SqlComputeCode вызывается именно после %Save ...
Я просто даю команду %New() и %Save или %OpenId() и %Save...
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37723013
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал тестовый пример...

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
/// tmp
Class soi.tmp Extends %Persistent
{

/// key
Property key As %String [ SqlComputeCode = {
		set {*}="abn"_{ID}
	}, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];

/// keyAbn
Property keyAbn As %String [ SqlComputeCode = {
		set {*}="abn"
	}, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];

/// keyId
Property keyId As %Numeric [ SqlComputeCode = {
		set {*}={%%ID} 
	}, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];

/// tmp
Property tmp As %String;

}


Дал соответствующие команды в терминале...

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
OCZ>s o=##class(soi.tmp).%New()
 
OCZ>s o.tmp=4
 
OCZ>d o.%Save()
 
OCZ>k o


Но данных по ID нет.

# ID key keyAbn keyId tmp1 7 abn abn 4
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37724076
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По этому вопросу открыли ВРЦ...
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37734251
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В и тоге в {ID} что-то будет только после записи. Т.о. данная конструкция для фиксации изменений нам не подходит...
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37734322
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaВ и тоге в {ID} что-то будет только после записи. Т.о. данная конструкция для фиксации изменений нам не подходит...Вы можете гарантированно определить автоматически генерируемый ID до физической записи объекта, который он получит?

s o=##class(soi.tmp).%New()
s o.tmp=4
w o.%Id() ; ?
// ...
d o.%Save()

Если можете, то проблем не должно быть даже сейчас.
Если нет, то какой другой конструкцией Вы собираетесь воспользоваться?
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37734648
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitВы можете гарантированно определить автоматически генерируемый ID до физической записи объекта, который он получит?
У нас будет использоваться не только "классовый" подход, но и SQLный... Т.ч. частное решение не устраивает. Про тот метод мы знали, правда всегда использовали его только после %Save()...

servitЕсли нет, то какой другой конструкцией Вы собираетесь воспользоваться?
Просто будем использовать произвольный счетчик для получения уникальной идентификации. И процедуру записи данных об изменении в "журнал"...
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37734835
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaПро тот метод мы знали, правда всегда использовали его только после %Save()...Это был пример вопроса, а не решения.
krvsaПросто будем использовать произвольный счетчик для получения уникальной идентификацииВ таком случае проблем с получением псевдо Id быть не должно:
Class test.B Extends %Persistent
{

Index ikeyId1 On keyId1 [ Unique ];

Index ikeyId2 On keyId2 [ Unique ];

Property x As %Integer;

/// Местный ID #1
Property keyId1 As %String [ InitialExpression = {$system.Util.CreateGUID()}, ReadOnly ];

/// Местный ID #2
Property keyId2 As %Numeric [ InitialExpression = {$i(^sequenceKeyId)}, ReadOnly ];

/// Используем местный ID #1
Property auditkeyId1 As %String [ SqlComputeCode = { Set {*}={x}_"_"_{keyId1}}, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];

/// Используем местный ID #2
Property auditkeyId2 As %String [ SqlComputeCode = { Set {*}={x}_"_"_{keyId2}}, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];

ClassMethod Test()
{
  d ..%KillExtent()
  
  s b=..%New()
  s b.x=4
  d b.%Save()

  &sql(insert into test.B(x) values(4))
  
  zw ^test.BD
  
  s b=..%OpenId(1)
  s b.x=5
  d b.%Save()

  &sql(update test.B set x=5 where %ID=2)

  zw ^test.BD
}

}
Код: plaintext
1.
2.
3.
4.
5.
6.
TEST>d ##class(test.B).Test()
^test.BD=2
^test.BD(1)=$lb("",4,"3B5BB147-BE0F-4503-8420-326954E05867",146,"4_3B5BB147-BE0F-4503-8420-326954E05867","4_146")
^test.BD(2)=$lb("",4,"632F5D45-4D1F-42B1-823A-1F2960AF9D26",147,"4_632F5D45-4D1F-42B1-823A-1F2960AF9D26","4_147")
^test.BD=2
^test.BD(1)=$lb("",5,"3B5BB147-BE0F-4503-8420-326954E05867",146,"5_3B5BB147-BE0F-4503-8420-326954E05867","5_146")
^test.BD(2)=$lb("",5,"632F5D45-4D1F-42B1-823A-1F2960AF9D26",147,"5_632F5D45-4D1F-42B1-823A-1F2960AF9D26","5_147")
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37734848
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitВ таком случае проблем с получением псевдо Id быть не должно
Спасибо за примерчик! Очень познавательно.
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37734854
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit , но, если я правильно понял, без свойства

Код: vbnet
1.
2.
/// Местный ID #2
Property keyId2 As %Numeric [ InitialExpression = {$i(^sequenceKeyId)}, ReadOnly ];



Никак не получится сделать.
Просто нам-то оно без надобности...
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37734863
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitЭто был пример вопроса, а не решения.
При нашей (кустарной) системе хранения данных, после команды "New" мы уже имели счётчик "ID"... Т.о. да, я могу гарантировать наличие уникального "ID" без "Save"...
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37734891
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa ,

Если получение значения ID можете оформить в метод класса, то не вижу проблем:

Property auditkeyId As %String [ SqlComputeCode = { Set {*}=##class(package.class).GetKeyId()}, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ];
...
Рейтинг: 0 / 0
Вопрос по SqlComputedCode
    #37735239
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit , спасибо большое за помощь и разъяснения.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопрос по SqlComputedCode
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]