powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Доступ к объектам в БД из метода класса
13 сообщений из 13, страница 1 из 1
Доступ к объектам в БД из метода класса
    #38504183
halcyonx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Недавно начал изучать Cache, столкнулся со следующей проблемой:
Допустим в студии Cache я сделал простой класс:Class Test.Human Extends %Persistent
{
Property Name As %String;

Property Id As %Integer;

ClassMethod AddNewHuman(name As %String, human_id As %String)
{
}

ClassMethod DeleteHuman(name As %String)
{
}

ClassMethod FindHumanByName(name As %String) As Test.Human
{
}

}
Также я могу создать объекты класса Test.Human и сохранить их в БД через терминал: set human1 = ##class(Test.Human).%New();
 do human1.%Save() 
Так вот суть проблемы: как создать и сохранить объекты, вызывая методы класса Test.Human?
Или же например удалить объект из БД методом DeleteHuman(name As %String), т.е. проверить есть ли объект в БД с указанным именем, если есть - то удалить его?
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38504543
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
halcyonxкак создать и сохранить объекты, вызывая методы класса Test.Human?
Да так же как и не из методов... Разницы нет никакой.

У тебя есть два подхода:
- классовый
- SQLный

Вот ими и орудуй...

Если вообще про классы ничего не знаешь - скачай файл objectqs.pdf с сайта IS и прочти. Там все на русском и с примерами...
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38505163
halcyonx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa, этот файл я изучил, поэтому самые базовые представления о создании класса, методов, и его свойств имею.
Меня интересует другое, допустим в базе сохранено 1000 объектов данного класса, как к ним можно получить доступ?
Грубо говоря, можно ли организовать цикл наподобие:
Код: plaintext
1.
2.
3.
4.
5.
 for( int i=0; i < 1000; i++ )
 { 
      set h = ##class(Test.Human).%OpenId(i);
      // проверить есть ли в базе человек с таким же именем, если нет то добавить его
 } 

?
Некоторое время программировал на C++, с бд и субд никогда дел не имел вообще :(. Может, посоветуете референс на правила синтаксиса и доступ к объектам в бд, для чайников? Или какой-нибудь элементарный пример кода. Буду признателен. :)
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38505183
2acid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
halcyonx,
Есть несколько вариаций перебора записей, в вашем случае лучше использовать SQL, например: &sql(declare cHuman cursor for
       select ID,Name 
         into :id,:name 
       from Test.Human)
 &sql(open cHuman )  
 for {
   &sql(fetch cHuman )
   quit:SQLCODE'=0
   ;id & name тут
 }  
 &SQL(close cHuman )
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38505289
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
halcyonxkrvsa, этот файл я изучил, поэтому самые базовые представления о создании класса, методов, и его свойств имею.
Меня интересует другое, допустим в базе сохранено 1000 объектов данного класса, как к ним можно получить доступ?
Грубо говоря, можно ли организовать цикл наподобие:
Код: plaintext
1.
2.
3.
4.
5.
 for( int i=0; i < 1000; i++ )
 { 
      set h = ##class(Test.Human).%OpenId(i);
      // проверить есть ли в базе человек с таким же именем, если нет то добавить его
 } 

?
Некоторое время программировал на C++, с бд и субд никогда дел не имел вообще :(. Может, посоветуете референс на правила синтаксиса и доступ к объектам в бд, для чайников? Или какой-нибудь элементарный пример кода. Буду признателен. :)
Так можно, но можно поступить еще лучше, чтобы не открывать без надобности все объекты, имея список пользователей которые должны существовать, создаете в таблице пользователей уникальный индекс по полям его идентифицирующим, и проверяете на существование нужного пользователя, и при отсутствии создаете, и это будет работать быстрее.
Проверка существования объекта по уникальному индексу описана в документации
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38505338
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
halcyonxkrvsa, этот файл я изучил , поэтому самые базовые представления о создании класса, методов, и его свойств имею.Там же можете найти:
  • Постреляционная технология Caché для реализации объектных приложений. Учебное пособие, МИФИ
  • Постреляционная СУБД Caché. Методическое пособие, НГУ
  • lusindane.at.tut.by – электронное руководство по Caché, сайт Евгения Борисевича
halcyonxМожет, посоветуете референс на правила синтаксиса и доступ к объектам в бд, для чайников? Или какой-нибудь элементарный пример кода. Caché Tutorials (начните с Caché QuickStart Tutorial или сразу приступите к Caché ObjectScript Tutorial )halcyonx// проверить есть ли в базе человек с таким же именем, если нет то добавить егоЕсли используете версию 2014.1, то проще это будет сделать с помощью новой команды INSERT OR UPDATE .

PS: массовые операции лучше делать через SQL, а не перебором в цикле объектов.
Собственный Id в классе лишний, поскольку по умолчанию он уже в нём присутствует: Object Persistence .
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38505448
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
halcyonxГрубо говоря, можно ли организовать цикл наподобие:
Код: plaintext
1.
2.
3.
4.
5.
6.

 for( int i=0; i < 1000; i++ )
 { 
      set h = ##class(Test.Human).%OpenId(i);
      // проверить есть ли в базе человек с таким же именем, если нет то добавить его
 } 
? Моч-то можно... Вот только нужно учесть:
  • ИД идут с минимум единицы
  • ИД не всегда идут по порядку Создавая объект нужно не забывать его удалять
START /* Перебор всех записей */   n   s id=""   f  s id=$o(^Test.HumanD(id)) q:id=""  d ID   q ID // Очередной ID   n o   s o=##class(Test.Human).%OpenId(id)   // тут некие действия с объектом   k o   q
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38505457
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
halcyonxпроверить есть ли в базе человек с таким же именем, если нет то добавить его
Я бы проверку сделал SQL-запросом...
А вот добавлять можно любым, удобным тебе, способом.

Про ускорения и индексы тебе уже писали выше...
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38505490
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
Код: sql
1.
2.
3.
4.
5.
6.
ID // Очередной ID
	n o
	s o=##class(Test.Human).%OpenId(id)
	// тут некие действия с объектом
	k o
	q

Команда
Код: javascript
1.
	k o

здесь лишняя, т.к. выход из области видимости переменной o и так удалит oRef.
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38505773
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovКоманда
Код: javascript
1.
	k o

здесь лишняя, т.к. выход из области видимости переменной o и так удалит oRef.
Я так же думал.
Пока не с толкнулся со сменой областей... Т.ч. теперь киляю в любом случае.
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38506260
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,

а что не так со сменой области? Пример можешь привести?
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38506273
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslovа что не так со сменой области? Пример можешь привести?Уже было: 15206965 , 15207055 и остановились на 15208246
...
Рейтинг: 0 / 0
Доступ к объектам в БД из метода класса
    #38506295
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslovа что не так со сменой области?
Там сама переменная-то ньюшилась... А объект так и оставался "открытым"...

Alexey MaslovПример можешь привести?
Да тут на форуме все и приводил...

Там идейка-то такая была...
Будучи в одной области, для неких элементов брались характеристики из классов другой области и записывались в глобал или просто переменные (не скть важно)... Так вот считывание происходило именно в процедурке и без кила. Алгоритм примерно такой был:
- перешел в область
- открыл объект
- что-то там сделал
- вернулся в начальную область
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Доступ к объектам в БД из метода класса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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