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

Имеется класс MyClass
в нем есть уникальное свойство ID
свойство Articles - тип массив типа %Library.String
и свойство Notes - символьный поток (Cheracter Stream)

1)
Нужно в Терминале создать новый объект Arts класса %Library.ArrayOfDataTypes.
Добавитьв массив три или большее количество Articles, индексированных по дате
публикации. Для этого нужно воспользоваться функцией SetAt().


2)
Создаю новый объект класса MyClass в Терминале. Добавляю несколько строк в свойство
Notes. Делаю я это так:
set st=##class(Main.MyClass).%New()
do st.Notes.Write("Заметка 1")
do st.%Save()

Теперь мне нужно используя метод
%OpenId(<ID>) открыть объект класса MyClass и присвоить созданный массив
Arts (см. пункт 1) свойству Articles объекта MyClass

Подскажите пожалуйста - Как это делается?
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34457909
solwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ольга СеменоваВсем привет.
Нужно в Терминале создать новый объект Arts класса %Library.ArrayOfDataTypes.
Добавитьв массив три или большее количество Articles, индексированных по дате
публикации. Для этого нужно воспользоваться функцией SetAt().

Set arts=##class(%Library.ArrayOfDataTypes).%New(), а как заполнять массив Вы смотрите сами.
Для теста я сделал так

Set arts(1)="1"
Set arts(1)="2"
Set arts(1)="3"
D arts.%Save()
Ольга Семенова
Теперь мне нужно используя метод
%OpenId(<ID>) открыть объект класса MyClass и присвоить созданный массив
Arts (см. пункт 1) свойству Articles объекта MyClass

Подскажите пожалуйста - Как это делается?
set st=##class(Main.MyClass).%OpenId(<ID>)
ser st.Articles=arts
D st.%Save()

где arts это объектная ссылка на созданный выше массив

Для проверки можно посмотреть

set st=##class(Main.MyClass).%OpenId(<ID>)
w st.Articles

Результат : 1@%Library.ArrayOfDataTypes или перед знаком @ любое число - это есть объектная ссылка на массив.
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34457970
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за ответ
solwolf
Set arts=##class(%Library.ArrayOfDataTypes).%New(), а как заполнять массив Вы смотрите сами.
Для теста я сделал так

Set arts(1)="1"
Set arts(1)="2"
Set arts(1)="3"
D arts.%Save()
[quot]

а можно пару вопросов:
1) SetAt() и Set это одно и тоже?

2)
[quot solwolf]
Set arts(1)="1"
Set arts(1)="2"
Set arts(1)="3"[quot]

а разве нужно не так? Это опечатка? или так и нужно?
Set arts( 1 )="1"
Set arts( 2 )="2"
Set arts( 3 )="3"

3) [quot solwolf]D arts.%Save()[quot]
Что такое D ?


[quot solwolf]set st=##class(Main.MyClass).%OpenId(<ID>)
ser st.Articles=arts
D st.%Save()

где arts это объектная ссылка на созданный выше массив

Для проверки можно посмотреть

set st=##class(Main.MyClass).%OpenId(<ID>)
w st.Articles

Что такое w ?
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34457971
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне всегда было интересно... Что толкает разработчиков к использованию свойств типа "массив" и "коллекция"? В чем они видят их преимущество перед другим классом, в котором эти же данные станут "простыми" свойствами?
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34458056
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга СеменоваЧто такое D ?
Это команда Do (выполнить)
Ольга СеменоваЧто такое w ?
Это команда Write (вывод на текущее устройство)
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34458078
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга Семенова1) SetAt() и Set это одно и тоже?
В данном примере Set это оператор "присвоения"... А откуда вы взяли SetAt()? Если не в курсе про D и W :)
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34458092
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга Семенова solwolf
Set arts(1)="1"
Set arts(1)="2"
Set arts(1)="3"

а разве нужно не так? Это опечатка? или так и нужно?
Set arts( 1 )="1"
Set arts( 2 )="2"
Set arts( 3 )="3"

Наверное просто копировал строки и не везде поменял...
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34458317
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Ольга Семенова1) SetAt() и Set это одно и тоже?
В данном примере Set это оператор "присвоения"... А откуда вы взяли SetAt()? Если не в курсе про D и W :)

в методичке написано что нужно использовать SetAt()
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34458332
Hmmmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ольга Семенова
в методичке написано что нужно использовать SetAt()
Ну да, это то же самое что не знающему языка С посоветовать использовать strcpy().
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34458489
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я смотрел описание класса %Library.ArrayOfDataTypes ... Там нет такого метода SetAt() :( GetAt() есть.
Применительно к классу SetAt() должен быть методом.
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34458911
solwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa Ольга Семенова solwolf
Set arts(1)="1"
Set arts(1)="2"
Set arts(1)="3"

а разве нужно не так? Это опечатка? или так и нужно?
Set arts( 1 )="1"
Set arts( 2 )="2"
Set arts( 3 )="3"

Наверное просто копировал строки и не везде поменял...

Да действительно копировал и не поменял. :) Я Вам привел этот пример для наглядности.

Ольга Семенова
свойство Articles - тип массив типа %Library.String

Я так понимаю, что класс имеет свойство Articles типа %Library.ArrayOfDataTypes ?
Просто если это свойство будет иметь тип %Library.String, то в нем сохранится только строка 1@%Library.ArrayOfDataTypes, а не сам объект. Это я уточняю для того, чтобы Вы представляли себе отличие свойства имеющего простой тип от свойства имеющего тип объекта.
Ольга Семенова
в методичке написано что нужно использовать SetAt()

У объекта ArrayOfDataTypes нет методов, которыми его можно заполнять кроме разве что метода BuildValueArray. Есть методы при помощи которых пожно передвигаться и возвращать элементы массива. Так что если Вы заполните массив таким образом Set arts(1)="1" ошибкой это не будет.
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34459440
newbie'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaЯ смотрел описание класса %Library.ArrayOfDataTypes ... Там нет такого метода SetAt() :( GetAt() есть.
Применительно к классу SetAt() должен быть методом.
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT

%Library.AbstractArray наследует %Library.ArrayOfDataTypes метод SetAt().
Код: plaintext
Class %Library.ArrayOfDataTypes Extends (%SerialObject, %AbstractArray)
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34459454
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит можно писать и так:
D arts.SetAt(<значение>,<индекс>)
А Insert() там получается то же есть?
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34459482
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У %Library.AbstractArray даже примерчик есть с SetAt() :)
код программыSet arr=##class(%ArrayOfDataTypes).%New()
; place items into the array
Do arr.SetAt("red","color")
Do arr.SetAt("large","size")
Do arr.SetAt("expensive","price")
; iterate over contents of array
Set key=""
For Set value=arr.GetNext(.key) Quit:key="" Write key,":",value,!
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34459694
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot solwolf]
Я так понимаю, что класс имеет свойство Articles типа %Library.ArrayOfDataTypes ?
Просто если это свойство будет иметь тип %Library.String, то в нем сохранится только строка 1@%Library.ArrayOfDataTypes, а не сам объект. Это я уточняю для того, чтобы Вы представляли себе отличие свойства имеющего простой тип от свойства имеющего тип объекта.

свойство Articles - типа массива (array) литералов типа %Library.String

см. рисунок

http://dump.ru/files/4/44964177/
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34460082
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда наверное так
Код: plaintext
1.
2.
3.
4.
5.
s o=##class(Main.MyClass).%OpenId(<ID>)
s o.Articles.SetAt("Артикул 1","01.01.2007")
s o.Articles.SetAt("Артикул 2","12.02.2007")
s o.Articles.SetAt("Артикул 3","01.04.2007")
D o.%Save()
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34460087
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только вот с датами в таком виде будут проблемы с сортировкой :) Лучше использовать "хоролог" ;)
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34460106
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaТогда наверное так
Код: plaintext
1.
2.
3.
4.
5.
s o=##class(Main.MyClass).%OpenId(<ID>)
s o.Articles.SetAt("Артикул 1","01.01.2007")
s o.Articles.SetAt("Артикул 2","12.02.2007")
s o.Articles.SetAt("Артикул 3","01.04.2007")
D o.%Save()

спасибо - щас буду пробовать
...
Рейтинг: 0 / 0
Пару вопросов по работе в терминале
    #34460764
solwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
solwolf
У объекта ArrayOfDataTypes нет методов, которыми его можно заполнять кроме разве что метода BuildValueArray. Есть методы при помощи которых пожно передвигаться и возвращать элементы массива. Так что если Вы заполните массив таким образом Set arts(1)="1" ошибкой это не будет.


Здесь я немножко недосмотрел. В версии Cache 5.0.21 действительно метода SetAt() нет. Он появился позже. Во всяком случае в Cache 2007 он уже есть :)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Пару вопросов по работе в терминале
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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