powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подружить классы
12 сообщений из 12, страница 1 из 1
Подружить классы
    #36334573
Andrew Kovalchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для двух простых классов
Код: plaintext
1.
2.
3.
4.
5.
6.
Class User.Account Extends %Persistent {
 Property Login As %String;
 Property Password As %String;
 Property FIO As User.FIO;
}

Код: plaintext
1.
2.
3.
4.
Class User.FIO Extends %Persistent {
 Property SurName As %String;
 Property Name As %String [ Required ];
 Property LastName As %String;
}

посредством
Код: plaintext
1.
2.
insert into User.Account (login,password) values ('ltest', 'ptest')
insert into User.FIO (surname, name, lastname) values ('Иванов', 'Иван', 'Иванович')
внесены тестовые данные.

Требуется привязать пользователя к паре логин-пароль.

Пытался сделать так
Код: plaintext
1.
update user.account (FIO->name) values ('ivanov') where login='ltest'
ОШИБКА # 5540 : SQLCODE: - 21  Сообщение: NAME нельзя изменить операцией UPDATE ^ UPDATE user.account ( FIO -> name )
и так
Код: plaintext
1.
2.
insert into user.account (login, password, fio->name) values ('log', 'pass', 'ivan')
SQLCODE = - 21  Нельзя изменять Указатель->Поле операциями INSERT или UPDATE. NAME нельзя изменить операцией INSERT^insert into user.account (login, password, fio->name) 
Результат - на лице :(

Вопросы:
1. как правильно заполнить поля свойства?
2. как подружить эти две записи?
...
Рейтинг: 0 / 0
Подружить классы
    #36334686
neznau
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
update test.account as t1 (FIO) values (t2.id) from test.fio as t2 where t2.Name='Иван' and t1.login='ltest'

select * from test.account as t1,test.fio as t2 where t1.fio=t2.id

но так делать неправильно. используйте объектный доступ.

Если решитесь использовать объекты, не забудьте класс User.FIO так же унаследовать от %SerialObject
...
Рейтинг: 0 / 0
Подружить классы
    #36334752
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сбивает с толку наименование поля FIO, котрое есть на самом деле не фио, а ссылка .

В вашем случае я бы делал так
Код: plaintext
update user.account set fio=(select id from User.FIO where surname='Иванов' and name='Иван' and lastname='Иванович') where login='ltest'

А лучше бы вам получить Ид пользователя и апдейтить сразу Ид

Кстати хранить пароль в открытом виде плохо, используйте, например MD5 шифрование (%SYSTEM.Encryption кажется)

И почему не хотите унаследоватькласс User.Account От класса User.FIO или сделать просто одну таблицу?

авторно так делать неправильно. используйте объектный доступ.
из чего следует неверный вывод, что неиспользовать объектный доступ неверно
...
Рейтинг: 0 / 0
Подружить классы
    #36334786
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор...не забудьте класс User.FIO так же унаследовать от %SerialObject
Зачем?
...
Рейтинг: 0 / 0
Подружить классы
    #36334791
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew Kovalchuk,
А если так сделать?

Class User.Account Extends %Persistent {
Property Login As %String;
Property Password As %String;
Property FIO As %String [Calculated, SQLComputed, SqlComputeCode = {s {*}=$S(({personItem}>0):##class(User.FIO). FIOGetStored({personItem}),1:"")}];

Property personItem As User.FIO [Required];

}

Class User.FIO Extends %Persistent {
Property SurName As %String;
Property Name As %String [ Required ];
Property LastName As %String;
Proeprty FIO As %String (MAXLEN=200) [SqlComputed, SqlComputeCode = {s {*}={LastName}_" "_{Name}_" "_{SurName}}]
}

добавлять так:
insert into User.FIO (surname, name, lastname) values ('Иванов', 'Иван', 'Иванович')
insert into User.Account (login,password,personItem) values ('ltest', 'ptest',LAST_IDENTITY())
...
Рейтинг: 0 / 0
Подружить классы
    #36334793
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Dimon=Andrew Kovalchuk,
А если так сделать?

Class User.Account Extends %Persistent {
Property Login As %String;
Property Password As %String;
Property FIO As %String [Calculated, SQLComputed, SqlComputeCode = {s {*}=$S(({personItem}>0):##class(User.FIO). FIOGetStored({personItem}),1:"")}];

Property personItem As User.FIO [Required];

}

Class User.FIO Extends %Persistent {
Property SurName As %String;
Property Name As %String [ Required ];
Property LastName As %String;
Proeprty FIO As %String (MAXLEN=200) [SqlComputed, SqlComputeCode = {s {*}={LastName}_" "_{Name}_" "_{SurName}}]
}

добавлять так:
insert into User.FIO (surname, name, lastname) values ('Иванов', 'Иван', 'Иванович')
insert into User.Account (login,password,personItem) values ('ltest', 'ptest',LAST_IDENTITY())

Proeprty FIO As %String (MAXLEN=200) [SqlComputed, SqlComputeCode = {s {*}={LastName}_" "_{Name}_" "_{SurName}}]
читать как
Property FIO As %String (MAXLEN=200) [SqlComputed, SqlComputeCode = {s {*}={SurName}_" "_{Name}_" "_{LastName}}]
...
Рейтинг: 0 / 0
Подружить классы
    #36335034
neznau
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.авторно так делать неправильно. используйте объектный доступ.
из чего следует неверный вывод, что неиспользовать объектный доступ неверно

вывод не такой следует.

во первых, поле FIO можно сделать As %String, если уж использовать sql, то использовать sql, а не описывать класс со встроенным объектом и пытаться "засунуть объект" sql'ем.

я говорил что так не совсем правильно, т.к. потом, при открытии данных объектов в свойствах FIO у них ничего не будет, и данную информацию о fio получится узнать только через sql...
...
Рейтинг: 0 / 0
Подружить классы
    #36335431
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понимаю.

Зачем делать FIO как строку? Связывать потом с User.FIO через вычисление полей? Но это же ужас - преставьте лишние, абсолютно ненужные моменты при изменении фамилии.

В чем смысл делать встроенное хранение?

Почему "информацию о fio получится узнать только через sql"?
...
Рейтинг: 0 / 0
Подружить классы
    #36335661
neznau
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.
Зачем делать FIO как строку? Связывать потом с User.FIO через вычисление полей? Но это же ужас - преставьте лишние, абсолютно ненужные моменты при изменении фамилии.

я бы аккаунт отдельно от пользователей хранил.
при удалении акаунта на сервере (не выставлении флага), информация о пользователе теряется, если их хранить вместе.

Блок А.Н.
В чем смысл делать встроенное хранение?

Почему "информацию о fio получится узнать только через sql"?
тут я ошибся, извиняюсь (встроенным тоже не нужно делать и получить удастся через объекты...правда у меня дома с первого раза не получилось).
...
Рейтинг: 0 / 0
Подружить классы
    #36335668
neznau
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно не fio как строку, я запутался. связывать через ид-ры.
...
Рейтинг: 0 / 0
Подружить классы
    #36336759
Andrew Kovalchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
=Dimon=добавлять так:
insert into User.FIO (surname, name, lastname) values ('Иванов', 'Иван', 'Иванович')
insert into User.Account (login,password,personItem) values ('ltest', 'ptest',LAST_IDENTITY())Поправьте, если ошибаюсь, но такой вариант мне представляется потенциально небезопасным (в плане корректности данных) в случае внесения изменений в таблицу User.FIO между приведенными двумя insert'ами.

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

Напоследок подскажите где можно наблюдать корректные примеры реализаций (классов, процедур, функций и прочего с чем приходится сталкиваться) из жизни каше ?
Кирстен постоянно перед глазами, но в книге оказалось больше теории и недосказанностей, нежели практических примеров.
...
Рейтинг: 0 / 0
Подружить классы
    #36336912
neznau
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew KovalchukНапоследок подскажите где можно наблюдать корректные примеры реализаций (классов, процедур, функций и прочего с чем приходится сталкиваться) из жизни каше ?
Кирстен постоянно перед глазами, но в книге оказалось больше теории и недосказанностей, нежели практических примеров.
http://www.intersystems.ru/cache/devcorner/index.html
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подружить классы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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