Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подружить классы / 12 сообщений из 12, страница 1 из 1
26.11.2009, 21:57
    #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
27.11.2009, 01:06
    #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
27.11.2009, 05:36
    #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
27.11.2009, 07:54
    #36334786
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подружить классы
автор...не забудьте класс User.FIO так же унаследовать от %SerialObject
Зачем?
...
Рейтинг: 0 / 0
27.11.2009, 08:04
    #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
27.11.2009, 08:08
    #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
27.11.2009, 10:34
    #36335034
neznau
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подружить классы
Блок А.Н.авторно так делать неправильно. используйте объектный доступ.
из чего следует неверный вывод, что неиспользовать объектный доступ неверно

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

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

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

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

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

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

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

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

Почему "информацию о fio получится узнать только через sql"?
тут я ошибся, извиняюсь (встроенным тоже не нужно делать и получить удастся через объекты...правда у меня дома с первого раза не получилось).
...
Рейтинг: 0 / 0
27.11.2009, 13:47
    #36335668
neznau
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подружить классы
конечно не fio как строку, я запутался. связывать через ид-ры.
...
Рейтинг: 0 / 0
28.11.2009, 01:21
    #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
28.11.2009, 13:00
    #36336912
neznau
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подружить классы
Andrew KovalchukНапоследок подскажите где можно наблюдать корректные примеры реализаций (классов, процедур, функций и прочего с чем приходится сталкиваться) из жизни каше ?
Кирстен постоянно перед глазами, но в книге оказалось больше теории и недосказанностей, нежели практических примеров.
http://www.intersystems.ru/cache/devcorner/index.html
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подружить классы / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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