powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Программное чтение / запись в глобал
58 сообщений из 58, показаны все 3 страниц
Программное чтение / запись в глобал
    #36321807
abrikos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Cache' новичек.
Программирую метод (ObjectScript) для чтения/записи в глобал ^SP("Zakaz","Table")

1. Как получить вцикле данные из глобала?
2. Как загнать массив в в глобал?
3. Как редактировать значения в глобале?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36321837
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abrikos1. Как получить вцикле данные из глобала?

Код: plaintext
1.
2.
3.
4.
5.
s glb=$na(^Test)
s uz=""
do {
   s uz=$o(@glb@(uz))
   w:uz'="" w !,uz,"=",@glb@(uz)
} while uz'=""

abrikos2. Как загнать массив в в глобал?

Если arr это массив... И структура в глобале нужна такая же... То

Код: plaintext
m ^Test=arr

abrikos3. Как редактировать значения в глобале?

Код: plaintext
1.
s ^Test="Это мой глобал"
s ^Test( 1 )="Это мой подузел"
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36321845
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abrikos , по большему счету, массивы в глобал "загонять" не нужно. Нужно сразу писать данные в глобальный массив.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36321854
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с такими вопросами лучше сначала почитать документацию например вот здесь
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36321889
Ahilles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
s uz=$o(@glb@(uz))

Я чтото забыл для чего @ используется. без него разве неполучится?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36322017
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
'@' ссылочный синтаксис для обращения к глобалам
можно и без него конечно, но когда в глобале несколько узлов, тогда очень удобно использовать ссылочный синтаксис

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36322048
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor'@' ссылочный синтаксис для обращения к глобалам

Это только частный случай...
Это называется "Косвенные выражения". Вычисляется аргумент оператора и подставляется в "командную строку"...

Ahillesдля чего @ используется.

Для удобства и унификации программного кода, например...

Ahillesбез него разве неполучится?

Конечно получится. Нужно будет напрямую везде (!) указывать имя глобальной переменной. А так в одном месте указал и все.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36348547
Dmitry V. Liseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaКонечно получится. Нужно будет напрямую везде (!) указывать имя глобальной переменной. А так в одном месте указал и все.Макросы для таких вещей существуют, чтобы во время компиляции подставлять, а не во время исполнения.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36349269
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry V. Liseev , про какие "макросы" ты говоришь?

Код: plaintext
s @glb@(i,j)= 1 

никогда не будет "во время компиляции подставлять"... Оно будет вычисляться именно "во время исполнения"/

Другое дело

Код: plaintext
1.
2.
#define glb ^tmp(i,j)
...
s $$$glb= 1 
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36349273
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вот макросы "хороши" когда точно известно что нужно подставить при компиляции. Тут же вопрос глубже... Бывает что само имя не известно на момент компиляции. Оно именно вычисляется в нужный момент исполнения.
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36840829
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь вопрос сюда :)) Построчное чтение из глобала. Как считывать строки из глобала (с определенными данными, н-р: ^Book(ID, ID.Avtor), не знаю как точно пишется) из присваивать их опред. переменным. Глобал в несколько узлов.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841022
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ostika , у глобала нет строк... У него есть имя, узлы и значения...

Код: plaintext
s ^Tmp( 1 , 2 , 3 ,"Test")="Value"
Tmp - имя
1,2,3,"Test" - узлы
"Value" - значение
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841039
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa Ostika , у глобала нет строк... У него есть имя, узлы и значения...

Ясно. Тогда мне надо сформировать строки из определенных значений. В глобале есть узел (пусть будет ID) и его подузел. Надо по знач. ID и из второго узла записать в переменную "ID, Avtor, Nazvanie"

Т.е. вытащить не все данные, а только определенные. И засунуть в переменную.
Как можно это сделать?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841041
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или в разные переменные.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841091
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая вот функция (код, метод....):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ClassMethod WrFileGl() As %String
{
	Set str=$Order(^Book( 13 ,"Author"))
	Set file=##class(%File).%New("c:\box\fileGl.txt")
	w file
	Do file.Open("WNKS")
	Do file.WriteLine(str)
	Do file.Close()
	q  1 
}
Файл либо пустой, либо записано след. узел (но не значение). Что здесь не так?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841102
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В str действительно что-то есть? Проверьте.
Если мне не изменяет память, имя файла задается параметром Name, а не при создании объекта.
Меня смущает флаг открытия файла K, попрбуйте просто NWS.
Возможно один из ваших процессов заблокировал файл (может вы забыли его закрыть или программа вылетела до закрытия файла), попробуйте изменить имя файла.

Функции Open и Write возвращают статусы, проверьте их.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841105
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н. , я в этом ничего не понимаю.. процессов никаких больше нет (если я правильно поняла), так что, что именно проверять и как? Можете объяснить подробнее? Пожалуйста 8)
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841107
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, как всегда не читаю вопрос перед тем как отвечать.
А значение вы таким способом и не получите.

$Order дает значение следующего ключа.
Чтобы записать просто значение глобала, нужно просто взять ^Book(13,"Author")
Типа
Do file.WriteLine(^Book(13,"Author"))

А если вам нужна именно полная ссылка, то попробуйте команды $query(^Book(13)
Она подобна $Order, но возвращает не значение ключа, а текст глобальной ссылки целиком, и она работает на разных уровнях, а $Order только на одном.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841111
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы посмотреть статус возврата, нужно вместо
Do file.Open("WNKS")
делать
s sc=file.Open("WNKS")
w !,sc
Обычно хороший статус равен единице, а плохой там хитро написан.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841194
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OstikaТогда мне надо сформировать строки из определенных значений. В глобале есть узел (пусть будет ID) и его подузел. Надо по знач. ID и из второго узла записать в переменную "ID, Avtor, Nazvanie"

Т.е. вытащить не все данные, а только определенные. И засунуть в переменную.
Как можно это сделать?
Если я правильно понял про узлы...

Код: plaintext
1.
2.
3.
s val1=$g(^Book(ID,"Avtor"))
s val2=$g(^Book(ID,"Nazvanie"))
zw val1,val2
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841269
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaOstikaТогда мне надо сформировать строки из определенных значений. В глобале есть узел (пусть будет ID) и его подузел. Надо по знач. ID и из второго узла записать в переменную "ID, Avtor, Nazvanie"

Т.е. вытащить не все данные, а только определенные. И засунуть в переменную.
Как можно это сделать?
Если я правильно понял про узлы...

Код: plaintext
1.
2.
3.
s val1=$g(^Book(ID,"Avtor"))
s val2=$g(^Book(ID,"Nazvanie"))
zw val1,val2


Ну вы блин даете...
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36841965
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MX-9 , в каком смысле?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36842700
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaAhillesбез него разве неполучится?

Конечно получится. Нужно будет напрямую везде (!) указывать имя глобальной переменной. А так в одном месте указал и все.
Действительно. А что скорость просядет раза в 3 и читабельность кода стремится к 0,
так это фигня.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36842723
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей, не вводите человека в заблуждение.

Чтение блока данных занимает время порядка .003
выполнение той же команды разрешения косвенности занимает порядка 0.00003, т.е. разница два порядка. И нужно в первую очередь оптимизировать с точки зрения чтения блоков данных, а только потом с точки зрения выполнения вычислительных операций.

Так что если одна операция может и будет выполняться в 10 раз дольше, но конечное время будет таким же (в пределах погрешности).
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36842772
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н. , да пусть везде пишет полное имя глобала. Может через несколько лет работы устанет и таки поймёт...

P.S. Про "читабельность", точнее про её стремление к 0, вообще добил.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36842886
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения читаемости @global@ мне тоже не нравилось.
Но пару раз ошибся с именем глобала - и решил, что в иногда @ все-таки имеет смысл, особенно при "глубоких" ссылках или когда их нужно исправлять.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36843215
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас в МСМовских задачках количество узлов бывало в районе 10шт... Какая там читабельность будет если одно только имя глобала с узлами будет на весь экран?

И самое интересно начиналось через несколько лет, когда требавалось "слегка" поменять структуру хранения в тех глобалах.

Косвенность же решает все эти проблемы.

А вот использовать её или нет... Пожалуй таки решать каждому самостоятельно или коллегиально.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36844326
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подсказку, завтра все опробую.. :)

krvsa, можно не много личный вопрос? Где вы работаете? А то мне кажется я уже где то встречала вашу фамилию, а где не вспомню :(
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36844365
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OstikaГде вы работаете?
Советская 69А, ООО "НПЦ Аир"...

OstikaА то мне кажется я уже где то встречала вашу фамилию, а где не вспомню :(
Ты смотри! Становлюсь известным...

А ты значит земляк? Кто это у нас еще кашеварить решил?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36844624
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Сергей, не вводите человека в заблуждение.

Чтение блока данных занимает время порядка .003
выполнение той же команды разрешения косвенности занимает порядка 0.00003, т.е. разница два порядка. И нужно в первую очередь оптимизировать с точки зрения чтения блоков данных, а только потом с точки зрения выполнения вычислительных операций.

Так что если одна операция может и будет выполняться в 10 раз дольше, но конечное время будет таким же (в пределах погрешности).
Ну-ну. Давайте Вы не будете пудрить людям мозги, если уж не понимаете
механизма отработки команд. А на будущее поясню, что для выполнения
Xecute и косвенности тупо подгружается интерпретирующий модуль. Со
всеми вытекающими "вкусностями" оной подгрузки, выгрузки и выполнения.
Это что касается "выполнения вычислительных операций". Что же касается данных,
насколько я обратил внимание, никто здесь давно уже не заморачивается "неполными
глобальными ссылками". Следовательно, глобальное обращение, мало того, что
будет разворачиваться из косвенности, так еще и пойдет читаться по полной
схеме. Мне пояснить разницу или все же понятно?

P.S. Что же касается "0.00003" и прочих цифирь... когда Вы будете обрабатывать
данные миллионами строк, Вы поймете, что значит "оптимизация вычислительных операций".
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36844627
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Блок А.Н. , да пусть везде пишет полное имя глобала. Может через несколько лет работы устанет и таки поймёт...

P.S. Про "читабельность", точнее про её стремление к 0, вообще добил.
Ну, ежели за 24 года еще не понял, то видимо и не пойму. А Вы не стесняйтесь,
мне очень приятно смотреть на Ваше творчество.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36844636
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
А ты значит земляк? Кто это у нас еще кашеварить решил?

Землячка Тем более всегда приятно встретить человека из своего же города, где нибудь
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36844669
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OstikaЗемлячка
Ну тада ваще!
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36849399
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ClassMethod WrFileGl() As %String
{
	Set str=$G(^Book( 13 ,"Author"))
	Set file=##class(%File).%New("c:\box\fileGl.txt")
	w file
	Do file.Open("NWS")
	Do file.WriteLine(str)
	Do file.Close()
	q  1 
}
Работает прекрасно, все записывает и т.п. Но если добавлять еще одну переменную, то результат пропадает Или я что-то не то делаю?

Вар. 1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ClassMethod WrFileGl() As %String
{
	Set str1=$G(^Book( 13 ,"Author"))
	Set str2=$G(^Book( 13 ,"Cont_Name"))
	Set file=##class(%File).%New("c:\box\fileGl.txt")
	w file
	Do file.Open("NWS")
	Do file.WriteLine(str1, str2)
	Do file.Close()
	q  1 
}

Вар.2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ClassMethod WrFileGl() As %String
{
	Set str1=$G(^Book( 13 ,"Author"))
	Set str2=$G(^Book( 13 ,"Cont_Name"))
	Set file=##class(%File).%New("c:\box\fileGl.txt")
	w file
	Do file.Open("NWS")
	Do file.WriteLine(str1)
	Do file.WriteLine(str2)
	Do file.Close()
	q  1 
}

Возможно запись в файл идет не правильно, но не знаю как по др. сделать, надо чтобы записывалось все в строку. При этом переменных для записи может быть и больше. Но мне бы хотя бы с двумя сделать :))
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36849489
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OstikaНо если добавлять еще одну переменную, то результат пропадает
Не совсем понятно, что означает "результат пропадает"... Файл пуст? Или что?

Ostikaнадо чтобы записывалось все в строку. При этом переменных для записи может быть и больше.
На выбор...
Вар. 1:
Код: plaintext
1.
	Do file.WriteLine(str1_str2)
Вар.2:
Код: plaintext
1.
2.
	Do file.Write(str1)
	Do file.Write(str2)
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36851532
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaНе совсем понятно, что означает "результат пропадает"... Файл пуст? Или что?
да, файл пустой...

Спс. за варианты, попробую.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36851785
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ostikaфайл пустой...
В этом варианте

Код: plaintext
Do file.WriteLine(str1, str2)
понятно почему. У этого метода нет второго параметра - должна быть ошибка.

И в этом варианте

Код: plaintext
1.
Do file.WriteLine(str1)
Do file.WriteLine(str2)
файл пуст?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852185
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaИ в этом варианте
Код: plaintext
1.
Do file.WriteLine(str1)
Do file.WriteLine(str2)
файл пуст?

Уже нет :) Но там оно записывает в две строки, а надо в одну
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852192
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
Код: plaintext
1.
	Do file.WriteLine(str1_str2)


а как можно пробел между ними вставить??
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852214
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вопрос :)
Есть глобал Book. И первый узел ID (номерной). Надо начиная с первого номера узла (не с 1, там может стоять др.) перебрать все остальные, при этом каждый раз записывая в файл. Я так поняла нужен цикл. Но как выводить знач. узлов по порядку, а не задавая опред. значение?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852224
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ostikakrvsa
Код: plaintext
1.
	Do file.WriteLine(str1_str2)


а как можно пробел между ними вставить??

уже разобралась :)
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852367
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
ClassMethod WrFileGl() As %String
{
	Set nId= 1 
	Set nId=$O(^Book(nId))
	Set str1=$G(^Book(nId,"Author"))
	Set str2=$G(^Book(nId,"Name"))
	Set file=##class(%File).%New("c:\box\fileGl.txt")
	w file
	Do file.Open("NWS")
	Do file.WriteLine(nId_" "_str1_" "_"<"_str2_">")
	Do file.Close()
	q  1 
}
Вот что получилось.. все работает и записывает. Теперь проблема добавления цикла.
Когда задаю файл:
Код: plaintext
1.
2.
3.
4.
Set file=##class(%File).%New("c:\box\fileGl.txt")
	w file
	Do file.Open("NWS")
	Do file.Close()
до цикла, возникает ошибка.
Тело цикла должно быть таким:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ClassMethod WrFileGl() As %String
{
	Set str1=$G(^Book(nId,"Author"))
	Set str2=$G(^Book(nId,"Name"))
	Set file=##class(%File).%New("c:\box\fileGl.txt")
	w file
	Do file.Open("AWS")
	Do file.WriteLine(nId_" "_str1_" "_"<"_str2_">")
	Do file.Close()
	q  1 
}
Нужно, чтобы создавался новый файл, а в цикле дописывался.
И сам цикл тоже не могу правильно задать :( Помогите, пожалуйста.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852374
2acid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот тут основные функции, Ваш случай $Order
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852404
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2acidвот тут основные функции, Ваш случай $Order
Спасибо, я там уже смотрела. И если честно, то с моим плохим английским не оч. поняла.

Цикл сделала. Осталось только, как правильно определить начальное значение и конечное. Какое условие должно стоять.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852462
2acid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ostika
Осталось только, как правильно определить начальное значение и конечное. Какое условие должно стоять.

начало
Код: plaintext
1.
2.
SET s=$ORDER(^client(""))
WRITE s
конец
Код: plaintext
1.
2.
SET s=$ORDER(^client(""),- 1 )
WRITE s
В документации на $Order, раздел "Start and End for a Search"
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852497
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2acid , спасибо, сделала :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
ClassMethod WrFileGlC() As %String
{
	Set file=##class(%File).%New("c:\box\fileGl1.txt")
	w file
	Do file.Open("N")
	Do file.Close()
	Set nId=$ORDER(^Book(""))
	Set nEnd=$ORDER(^Book(""),- 1 )
	do {
	Set str1=$G(^Book(nId,"Author"))
	Set str2=$G(^Book(nId,"Name"))
	Do file.Open("AWS")
	Do file.WriteLine(nId_" "_str1_" "_"<"_str2_">")
	Do file.Close()
	Set nId=$O(^Book(nId))
	} while nId<=nEnd
	q  1 
}
Первый раз сработал, на второй и т.д. вылезла ошибка на терминале:

W ##CLASS(Test.dop).WrFileGlC()
^
<CLASS EDITED>^Test.dop.1
LIBRARY 2e1>w ##class(Test.dop).WrFileGlC()

W ##CLASS(Test.dop).WrFileGlC()
^
<CLASS EDITED>^Test.dop.1

Что здесь не так???
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852759
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, все исправили, все работает :) Хотя скоро появятся новые вопросы
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852803
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ostika
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
ClassMethod WrFileGlC() As %String
{
	Set file=##class(%File).%New("c:\box\fileGl1.txt")
	w file
	Do file.Open("N")
	Do file.Close()
	Set nId=$ORDER(^Book(""))
	Set nEnd=$ORDER(^Book(""),- 1 )
	do {
	Set str1=$G(^Book(nId,"Author"))
	Set str2=$G(^Book(nId,"Name"))
	Do file.Open("AWS")
	Do file.WriteLine(nId_" "_str1_" "_"<"_str2_">")
	Do file.Close()
	Set nId=$O(^Book(nId))
	} while nId<=nEnd
	q  1 
}

Открывать файл на каждой итерации цикла не стоит, это существенно тормозит процесс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ClassMethod WrFileGlC() As %String
{
	Set file=##class(%File).%New("c:\box\fileGl1.txt")
	w file
	Do file.Open("NWS")
	Set nId=""
	f {
		Set nId=$ORDER(^Book(nId))
		Quit:(nId="")
		Set str1=$G(^Book(nId,"Author"))
		Set str2=$G(^Book(nId,"Name"))
		Do file.WriteLine(nId_" "_str1_" "_"<"_str2_">")
	}
	Do file.Close()
	Kill file
	q  1 
}
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36852818
Ostika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Turk спасибо, и правда быстрее :)
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36853627
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторXecute и косвенности тупо подгружается интерпретирующий модуль. Со
всеми вытекающими "вкусностями" оной подгрузки, выгрузки и выполнения.

P.S. Что же касается "0.00003" и прочих цифирь... когда Вы будете обрабатывать
данные миллионами строк, Вы поймете, что значит "оптимизация вычислительных операций".

Ну вы напугали ежа голым задом :-)
У нас как раз эти ваши миллионы строк, и я как раз очень серьезное количество времени потратил на анализ быстродействия и оптимизацию программ. И вот что я вам скажу:
- не нужно оптимизировать заранее. Как правило узкое место не там, где изначально кажется. Нужно запускать профилировщик и смотреть, что то место, которое вы так старательно оптимизировали, и без оптимизации работало неплохо.
- все упирается в деньги, как быстродействия, так и время разработки. Грубо, с ростом количества данных требуется замена сервера или доработка программы. И если замена сервера будет стоить миллион рублей, а доработка программы сто тысяч, то это имеет огромный смысл. Но если вы эти потратите эти деньги на оптимизацию программы, которая без оптимизации работает один час в месяц, то это все вряд ли оправдано (но бывает по разному).
- я встречал много попыток оптимизации по принципу "вот мы обрабатываем миллион строк медленно, а вот теперь чуточку быстрее". В большинстве случаем нужно сводить задачу к "нельзя ли улучшить алгоритм, чтобы не обрабатывать миллион строк?" - и это дает гораздо больший эффект.
- в тех задачах, где я разбирался (обработать миллионы строк), большая часть времени идет на доступ к данным, а не на их обработку. И именно доступ и выборку данных имеет большой смысл оптимизировать.

Ваш подход имеет смысл только в одном случае - когда нужно сделать десятки миллионов операций с небольшим набором данных. В этом случае да, нужно думать о оптимизации элементарных операций. Но что-то мне кажется, что такая задача не является типичной для СУБД, и я бы даже подумал, чтобы такие задачи решать не в байткоде, как в каше, а, например, в C++.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36853635
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С другой стороны, я понимаю ваше беспокойство, и в чем-то даже согласен - сейчас об оптимизации думают слишком поздно, и иногда бывает уже слишком тяжело что-то улучшать.

Мне на самом деле интересны ваши сообщения, так как, по-моему, на уровне операций и оптимизации операций вы действительно знаете больше меня. И если у вас есть какие-то исследования на эту тему, мне было бы интересно их прочитать.

Но с чем я не согласен, так это вашим подходом - "оптимизация во всем", причем похоже это что-то из разряда внутреннего культа, а не целесообразности. Да, я понимаю, что операция косвенности немножко медленнее, чем прямое обращение, но в подавляющем большинстве случаем этим можно пренебречь.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36856775
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.
- в тех задачах, где я разбирался (обработать миллионы строк), большая часть времени идет на доступ к данным, а не на их обработку. И именно доступ и выборку данных имеет большой смысл оптимизировать.

Простите, Вы серьезно собираетесь говорить об "оптимизации доступа к данным", пользуясь
объектами и псевдо-SQL? Вы хоть раз видели, как выглядит код в .T? Сколько там Xecute,
сколько там @ и насколько многоуровневые там вложения?

Блок А.Н.
Ваш подход имеет смысл только в одном случае - когда нужно сделать десятки миллионов операций с небольшим набором данных. В этом случае да, нужно думать о оптимизации элементарных операций. Но что-то мне кажется, что такая задача не является типичной для СУБД, и я бы даже подумал, чтобы такие задачи решать не в байткоде, как в каше, а, например, в C++.
Извините, но Вы не правы. Не думаю, что чтение данных в Вашем случае НАСТОЛЬКО затратно,
что Вам уже просто наплевать на последующее быстро/медленно-действие. А насчет C++ и прочих
ассемблеров мы уже проходили, замучаетесь гонять данные, быстрее все-равно не получится.

P.S. Насчет сравнений... все относительно конечно. Раньше задача работала в среднем 5-10
минут и это было нормально. Сейчас она работает 10-15 секунд и мне говорят "Эээ, Сергей Геннадьевич, что-то тормозит ваша задачка".
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36856796
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.С другой стороны, я понимаю ваше беспокойство, и в чем-то даже согласен - сейчас об оптимизации думают слишком поздно, и иногда бывает уже слишком тяжело что-то улучшать.

Нет, сейчас об оптимизации программного продукта не думают вообще. Так принято.
Так будет и дальше. Проще оптимизировать технику.

Блок А.Н.
Мне на самом деле интересны ваши сообщения, так как, по-моему, на уровне операций и оптимизации операций вы действительно знаете больше меня. И если у вас есть какие-то исследования на эту тему, мне было бы интересно их прочитать.

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

Блок А.Н.
Но с чем я не согласен, так это вашим подходом - "оптимизация во всем", причем похоже это что-то из разряда внутреннего культа, а не целесообразности. Да, я понимаю, что операция косвенности немножко медленнее, чем прямое обращение, но в подавляющем большинстве случаем этим можно пренебречь.
И опять нет. Для меня это просто "правила хорошего тона". И пренебречь ими следует только
тогда, когда речь идет об интерактивности. В моменты обработки данных такие пренебрежения
недопустимы. Потому как они имеют свойство умножаться. Впрочем, как уже говорилось, это
сугубо мое личное мнение.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36857327
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Вы хоть раз видели, как выглядит код в .T? "
Сергей Геннадьевич, пожалуйста, поделитесь знанием или ссылками хотя бы.

P.S. Требования к скорости разработки будут только возрастать, а люди являются самой затратной и проблемной частью :(
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36857660
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei Obrastsov
Простите, Вы серьезно собираетесь говорить об "оптимизации доступа к данным", пользуясь
объектами и псевдо-SQL? Вы хоть раз видели, как выглядит код в .T? Сколько там Xecute,
сколько там @ и насколько многоуровневые там вложения?
...
Не думаю, что чтение данных в Вашем случае НАСТОЛЬКО затратно,
что Вам уже просто наплевать на последующее быстро/медленно-действие.

[quot Sergei Obrastsov]
А насчет C++ и прочих
ассемблеров мы уже проходили, замучаетесь гонять данные, быстрее все-равно не получится.


От объектов в массовой обработке данных категорически отказались, а SQL вполне используем.
Да, я видел int-код, и когда каше еще не умела показывать план запросов, по нему разбирался, что именно происходит (брр).
Так вот, несмотря на свою страшность, int-код sql-запроса вполне конкурирует с прямым доступом по скорости, более того, иногда немного быстрее (программист тоже человек).

Правда тут надо смотреть внимательно, не все запросы каше делает оптимально, очень плохо делаются вложенные запросы, некоторые агрегатные, типа найти минимум по индексированному полю - тут надо смотреть индивидуально.

И да, затратно именно обращение к данным. У нас так как объем данных сотни Гб, а кэш 8 гб сделали совсем недавно, а до этого было 2Гб - данные кэшируются слабо.

И разработка на прямом доступе там, где это не требуется - для меня не является хорошим тоном, так как такую программу сложнее понять, в ней легче сделать ошибки, она не учитывает новые индексы и изменившуюся структуру класса, ее сложнее дорабатывать.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36859235
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Так вот, несмотря на свою страшность, int-код sql-запроса вполне конкурирует с прямым доступом по скорости, более того, иногда немного быстрее (программист тоже человек).

Это Вы так пошутили. Я понимаю, смешно.

Блок А.Н.
Правда тут надо смотреть внимательно, не все запросы каше делает оптимально, очень плохо делаются вложенные запросы, некоторые агрегатные, типа найти минимум по индексированному полю - тут надо смотреть индивидуально.

Извините, ну никогда стандартизированный движок, тратящий время еще и на осмысливание
запроса, не будет быстрее прямого доступа. Это Вы уж загнули.

Блок А.Н.
И да, затратно именно обращение к данным. У нас так как объем данных сотни Гб, а кэш 8 гб сделали совсем недавно, а до этого было 2Гб - данные кэшируются слабо.

Общий объем данных далеко не критерий. Вопрос в операционном объеме. Я слабо себе представляю, для чего может понадобиться такой гигантский кэш. Разве что тысячи пользователей
делают гигантские выборки.

Блок А.Н.
И разработка на прямом доступе там, где это не требуется - для меня не является хорошим тоном, так как такую программу сложнее понять, в ней легче сделать ошибки, она не учитывает новые индексы и изменившуюся структуру класса, ее сложнее дорабатывать.
Давайте определимся, мы говорим о скорости работы программы или о скорости ее понимания?
Что толку от идеально понятной программы, если она еле ползает? И зачем кому-то ковырять
программу, если она и так работает?
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36859243
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартный движек даже в динамик sql думает один раз, а потом работает, я так понимаю.
Тем более в embed-sql.

У нас около полумиллиона договоров пересчитывают пеню, причем пеня пересчитывает за весь период (так как ставка рефинансиования может поменяться задним числом), на каждом договоре могут быть сотни строк в 4х таблицах, причем эти таблицы перевезаны крест-накрест.
Всего объем задействованных данных ориентировочно 150-200Гб.
Это только один из запускаемых расчетов ночью.

Даже 8 Гб кэша это мизер для таких задач. Изменить структуру данных пока не представляется возможным из-за большого количества программ.

Непосредственно рядом сидит команда разработчиков, которая делает доработки по требованию заказчика, причем частично меняя старый функционал и частично создавая новый. Обновления делаются каждый день, так что вопрос понимаемости старых программ и возможности их доработки стоит очень остро.

Если у вас задачи математического плана - поднять 1 гб данных в 2гб кэш и пересчитать, причем алгоритмы трудоемкие, то у вас будут другие подходы к оптимизации, это понятно.
...
Рейтинг: 0 / 0
Программное чтение / запись в глобал
    #36859251
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint"Вы хоть раз видели, как выглядит код в .T? "
Сергей Геннадьевич, пожалуйста, поделитесь знанием или ссылками хотя бы.

Да пожалуйста, наслаждайтесь. Cinema.Film.T1 из SAMPLES:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
%delete(%rowid,%check)  n %d,%e,%l,%oper,%s,sn,sqlcode,subs s %oper="DELETE" s sqlcode= 0 
 s %ROWID=%rowid s %d( 1 )=%rowid s %e( 1 )=%rowid s %l=$c( 0 )
        k:'$tl %0CacheLock IF '$a(%check, 2 ) { n %ls IF $i(%0CacheLock("Cinema.Film"), 1 )> 1000  {
 l +^CinemaooFilmD:$zu( 115 , 4 ) l:$t -^CinemaooFilmD s %ls=$s($t: 2 , 1 : 0 )} ELSE  { l +^CinemaooFilmD(
%d( 1 )):$zu( 115 , 4 ) s %ls=$t} s:%ls= 2  $e(%check, 2 )=$c( 1 ) s:%ls= 1  $e(%l, 1 , 1 )=$c( 1 ) i '%ls s QLCODE=
-110 s %msg="Unable to acquire lock for "_%oper_" of table 'Cinema.Film' on row with RowID = '"_$g(%d
(1))_"'" q
} IF $zu(115,1)=1 { TS } ELSE  { IF '$tl { IF $zu( 115 , 1 )= 2  { TS }}} s $zt="%ETrap"
        d getold i sqlcode s SQLCODE=- 106  g %EExit
        i '$a(%check) i '%0snrc d  i sqlcode s SQLCODE=sqlcode g %EExit
        . n %fk,%k,%p,%t,%z s %k="" s %p("%1")="%d(1)," s %p("IDKEY")="%d(1),"
        . f  q:sqlcode< 0   s %k=$o(^mdd( 9 ,"Cinema.Film",%k)) q:%k=""  s %t="" f
s %t=$o(^mdd( 9 ,"Cinema.Film",%k,%t)) q:%t=""  s %fk="" f  s %fk=$o(^mdd( 9 ,"Cinem
a.Film",%k,%t,%fk), 1 ,%z) q:%fk=""  i @("$$"_%z_"("_%p(%k)_",%k)") s sqlcode=- 124 
 q
        k ^CinemaooFilmD(%d( 1 ))
        s sn( 1 )=%e( 7 ) s:sn( 1 ) sn( 1 )=-1e14 s sn( 2 )=%d( 1 ) k ^CinemaooFilmI("Ticket
sSoldIndex",sn( 1 ),sn( 2 ))
        s sn( 1 )=" "_$s(%e( 8 ):"",'($zstrip(%e(8),">W")=""):$zcvt($zstrip(%e(8),">
W"),"u"),1:$c(0)) s sn(2)=%d(1) k ^CinemaooFilmI("TitleIndex",sn(1),sn(2))
        d gunlock i $zu(115,1)=1 TC
        s SQLCODE=0 q  q
%insert(%d,%check,%inssel,%vco) n %l,%n,%oper,%s,sqlcode,sn,subs,icol s %oper="I
NSERT" s sqlcode=0 s %l=$c(0,0,0) IF $d(%d(1)) { IF '%d( 1 ) { s SQLCODE=- 111  s %m
sg="INSERT of Default Only RowID Field 'ID' not allowed" q ""} k %d( 1 )} IF '$a(%
check) { IF '$$FieldValidate() { s SQLCODE=sqlcode q ""}} d Normalize
        s:'$d(%d(5)) %d(5)=1 s:'$d(%d( 7 )) %d( 7 )= 0 
        i '$a(%check) d  i sqlcode<0 s SQLCODE=sqlcode q ""
        . i '($g(%vco)="") d @%vco q:sqlcode< 0 
        . d:$g(%d( 8 )) %nBuild:'$d(%n) d:$g(%d(8)) missing($lg(%n,9))
        s %d(1)=$i(^CinemaooFilmD,1)
        f icol=7,9,8 s:'$d(%d(icol)) %d(icol)=""
        k:'$tl %0CacheLock IF '$a(%check, 2 ) { n %ls IF $i(%0CacheLock("Cinema.Fi
lm"), 1 )> 1000  { l +^CinemaooFilmD:$zu( 115 , 4 ) l:$t -^CinemaooFilmD s %ls=$s($t: 2 , 1 
: 0 )} ELSE  { l +^CinemaooFilmD(%d( 1 )):$zu( 115 , 4 ) s %ls=$t} s:%ls= 2  $e(%check, 2 )=
$c( 1 ) s:%ls= 1  $e(%l, 1 , 1 )=$c( 1 ) i '%ls s SQLCODE=-110 s %msg="Unable to acquire l
ock for "_%oper_" of table 'Cinema.Film' on row with RowID = '"_$g(%d(1))_"'" q
""} IF $zu(115,1)=1 { TS } ELSE  { IF '$tl { IF $zu( 115 , 1 )= 2  { TS }}} s $zt="%ET
rap"
        s ^CinemaooFilmD(%d( 1 ))=$lb($g(%d( 3 )))_$lb($g(%d( 5 )))_$lb(%d( 7 ))_$lb(%d(
 8 ))_$lb($g(%d( 2 )))_$lb($g(%d( 4 )))_$lb($g(%d( 6 )))_$lb(%d( 9 ))
        IF '$a(%check,3) { s sn(1)=%d(7) s:sn(1) sn(1)=-1e14 s sn(2)=%d(1) s ^Ci
nemaooFilmI("TicketsSoldIndex",sn(1),sn(2))=%d(9)
        s sn(1)=" "_$s(%d(8):"",'($zstrip(%d( 8 ),">W")=""):$zcvt($zstrip(%d( 8 ),">
W"),"u"), 1 :$c( 0 )) s sn( 2 )=%d( 1 ) s ^CinemaooFilmI("TitleIndex",sn( 1 ),sn( 2 ))=%d( 9 )
}
        d gunlock i $zu( 115 , 1 )= 1  TC
        s SQLCODE= 0  q %d( 1 ) q
%update(%rowid,%check,%d,%vco)  n %e,%l,%n,%oper,%s,icol,s,sn,sqlcode,subs,t s %
oper="UPDATE" s sqlcode= 0  s %ROWID=%rowid s $e(%e, 1 )=$c( 0 ) s %l=$c( 0 , 0 , 0 ) i '$a(
%check) i '$$FieldValidate() s SQLCODE=sqlcode q
        d Normalize i $d(%d( 1 )) i '(%d(1)=%rowid) s SQLCODE=-107 s %msg="UPDATE
of RowID Field 'ID' not allowed" q
        f icol=2:1:9 s $e(%e,icol)=$c($d(%d(icol)))
        s %d(1)=%rowid s %e(1)=%rowid
        k:'$tl %0CacheLock IF '$a(%check,2) { n %ls IF $i(%0CacheLock("Cinema.Fi
lm"),1)>1000 { l +^CinemaooFilmD:$zu(115,4) l:$t -^CinemaooFilmD s %ls=$s($t:2,1
:0)} ELSE  { l +^CinemaooFilmD(%d(1)):$zu(115,4) s %ls=$t} s:%ls=2 $e(%check,2)=
$c(1) s:%ls=1 $e(%l,1,1)=$c(1) i '%ls s SQLCODE=- 110  s %msg="Unable to acquire l
ock for "_%oper_" of table 'Cinema.Film' on row with RowID = '"_$g(%d(1))_"'" q
} IF $zu( 115 , 1 )= 1  { TS } ELSE  { IF '$tl { IF $zu(115,1)=2 { TS }}} s $zt="%ETra
p"
        IF $g(%vco)="" { d getold IF sqlcode { s SQLCODE=-109 g %EExit} FOR icol
=7,9,8 { s:'$d(%d(icol)) %d(icol)=%e(icol) s:%d(icol)=%e(icol) $e(%e,icol)=$c( 0 )
 }} ELSE  { d getoldall IF sqlcode { s SQLCODE=- 109  g %EExit} FOR icol= 1 , 2 , 3 , 4 , 5 
, 6 , 7 , 8 , 9  { s:'$d(%d(icol)) %d(icol)=%e(icol) s:%d(icol)=%e(icol) $e(%e,icol)=$c(
0) }}
        d:'$a(%check)  i sqlcode s SQLCODE=sqlcode g %EExit
        . i '($g(%vco)="") d @%vco q:sqlcode<0
        . i $a(%e,8) i $g(%d(8)) d:'$d(%n) %nBuild d missing($lg(%n, 9 ))
        . q:sqlcode
        s:$s($a(%e, 2 ): 1 ,$a(%e, 3 ): 1 ,$a(%e, 4 ): 1 ,$a(%e, 5 ): 1 ,$a(%e, 6 ): 1 ,$a(%e, 7 ): 1 ,$
a(%e, 8 ): 1 , 1 :$a(%e, 9 )) s=$g(^CinemaooFilmD(%d( 1 ))) s:$s($a(%e, 2 ): 1 ,$a(%e, 3 ): 1 ,$a(
%e, 4 ): 1 ,$a(%e, 5 ): 1 ,$a(%e, 6 ): 1 ,$a(%e, 7 ): 1 ,$a(%e, 8 ): 1 , 1 :$a(%e, 9 )) ^CinemaooFilmD(%
d( 1 ))=$lb($s($a(%e, 3 ):%d( 3 ), 1 :$lg(s, 1 )))_$lb($s($a(%e, 5 ):%d( 5 ), 1 :$lg(s, 2 )))_$lb(
$s($a(%e, 7 ):%d( 7 ), 1 :$lg(s, 3 )))_$lb($s($a(%e, 8 ):%d( 8 ), 1 :$lg(s, 4 )))_$lb($s($a(%e, 2 
):%d( 2 ), 1 :$lg(s, 5 )))_$lb($s($a(%e, 4 ):%d( 4 ), 1 :$lg(s, 6 )))_$lb($s($a(%e, 6 ):%d( 6 ), 1 :
$lg(s, 7 )))_$lb($s($a(%e, 9 ):%d( 9 ), 1 :$lg(s, 8 )))
        IF '$a(%check,3) { IF $a(%e,7) { s sn(1)=%e(7) s:sn(1) sn(1)=-1e14 s sn(
2)=%d(1) k ^CinemaooFilmI("TicketsSoldIndex",sn(1),sn(2))}
        IF $s('$a(%e, 7 ):''$a(%e, 9 ), 1 : 1 ) { s sn( 1 )=%d( 7 ) s:sn( 1 ) sn( 1 )=-1e14 s sn
( 2 )=%d( 1 ) s ^CinemaooFilmI("TicketsSoldIndex",sn( 1 ),sn( 2 ))=%d( 9 )}
        IF $a(%e, 8 ) { s sn( 1 )=" "_$s(%e( 8 ):"",'($zstrip(%e(8),">W")=""):$zcvt($z
strip(%e(8),">W"),"u"),1:$c(0)) s sn(2)=%d(1) k ^CinemaooFilmI("TitleIndex",sn(1
),sn(2))}
        IF $s('$a(%e, 8 ):''$a(%e, 9 ), 1 : 1 ) { s sn( 1 )=" "_$s(%d( 8 ):"",'($zstrip(%d(8
),">W")=""):$zcvt($zstrip(%d(8),">W"),"u"),1:$c(0)) s sn(2)=%d(1) s ^CinemaooFil
mI("TitleIndex",sn(1),sn(2))=%d(9)}}
        d gunlock i $zu(115,1)=1 TC
        s SQLCODE=0 q  q
%1(%p1) q $d(^CinemaooFilmD(%p1)) q
IDKEY(%p1)      q $d(^CinemaooFilmD(%p1)) q
%PurgeIndices(indices,%sc)      s %sc=##class(Cinema.Film).%PurgeIndices(indices
) q  q
%BuildIndices(indices,%sc)      s %sc=##class(Cinema.Film).%BuildIndices(indices
) q  q
%CheckUniqueIndices(indices,ok) n d,g,n,o s d=0
        s ok=1 q  q
%AcquireLock(%rowid,s)  n %d s %d(1)=%rowid IF $g(s) { l +^CinemaooFilmD(%d(1))#
"S":$zu(115,4) q $t} l +^CinemaooFilmD(%d(1)):$zu(115,4) q $t q
%ReleaseLock(%rowid,s,i)        n %d s %d(1)=%rowid IF '$g(i) { IF '$g(s) { l -^
CinemaooFilmD(%d(1)) q }} ELSE  { IF $g(i) { IF '$g(s) { l -^CinemaooFilmD(%d( 1 )
)#"I" q }} ELSE  { IF '$g(i) { IF $g(s) { l -^CinemaooFilmD(%d(1))#"S" q }} ELSE
  { l -^CinemaooFilmD(%d(1))#"IS" q }}} q
%getlock(%rowid,%s)     k:'$tl %0CacheLock IF $i(%0CacheLock("Cinema.Film"), 1 )> 1 
 000  { l +^CinemaooFilmD:$zu( 115 , 4 ) l:$t -^CinemaooFilmD q $s($t: 2 , 1 : 0 )} q:$$%Acq
uireLock(%rowid,$g(%s))  1  q  0 
gunlock l:$a(%l) -^CinemaooFilmD(%d( 1 ))
        q  q
missing(fname)  s sqlcode=- 108  s %msg="'"_fname_"' is a required field" q  q
ulerror(cname)  s sqlcode=- 110  s %msg="Unable to obtain lock to "_$s(%oper="DELE
TE":"maintain", 1 :"check")_" uniqueness of constraint '"_cname_"'" q
getold  i '$d(^CinemaooFilmD(%d(1))) s sqlcode=100 q
        n s s s=$g(^CinemaooFilmD(%d(1))) s %e(7)=$lg(s,3) s %e(9)=$lg(s,8) s %e
(8)=$lg(s,4)
        q
getoldall       i '$d(^CinemaooFilmD(%d( 1 ))) s sqlcode= 100  q
        n s s s=$g(^CinemaooFilmD(%d( 1 ))) s %e( 2 )=$lg(s, 5 ) s %e( 3 )=$lg(s, 1 ) s %e
( 4 )=$lg(s, 6 ) s %e( 5 )=$lg(s, 2 ) s %e( 6 )=$lg(s, 7 ) s %e( 7 )=$lg(s, 3 ) s %e( 8 )=$lg(s, 4 )
 s %e( 9 )=$lg(s, 8 )
        q
%nBuild s %n=$c( 1 , 4 , 1 )_"ID"_$c( 10 , 1 )_"Category"_$c( 13 , 1 )_"Description"_$c( 8 , 1 )_"
Length"_$c( 12 , 1 )_"PlayingNow"_$c( 8 , 1 )_"Rating"_$c( 13 , 1 )_"TicketsSold"_$c( 7 , 1 )_"T
itle"_$c( 14 , 1 )_"x__classname"
        q  q
FieldValidate() n %f
        FOR %f= 2 , 4 , 7  { i '($g(%d(%f))="") i '$isvalidnum(%d(%f), 0 ) d invalid(%f+
 1 ,$g(%d(%f))) q  } IF '$g(%d(5)) { IF '$s($isvalidnum(%d( 5 ), 0 , 0 , 2 ):'(+%d(5)=2),1
:0) { d invalid(6,%d(5))}} IF '$g(%d( 6 )) { IF %d( 6 )[","!'((",G,PG,PG-13,R,"[((",
"_%d(6)_",")))) { d invalid(7,%d(6))}} q 'sqlcode q
invalid(ficol,val) PUBLIC {     s:$l($g(val))> 40  val=$e(val, 1 , 40 )_"..." d:'$d(%n
) %nBuild s %msg="Field '"_$lg(%n,ficol)_"' "_($s('($g(val)=""):" (value "_$s(va
l="":"(NULL)", 1 :"'"_val_"'")_")", 1 :""))_" failed validation" s sqlcode=$s(%oper=
"INSERT":- 104 , 1 :- 105 ) q  q  }
Normalize       n %f
        s:'$g(%d(3)) %d(3)=$e(%d(3),1,300) FOR %f=6,8 { s:'($g(%d(%f))="") %d(%f
)=$e(%d(%f), 1 , 50 ) } FOR %f= 2 , 4 , 5 , 7  { s:'($g(%d(%f))="") %d(%f)=%d(%f)\1 } q
%ETrap  s $zt="" s SQLCODE=-415 s %msg="Error occuring during "_%oper_" in 'Cine
ma.Film':  $ZE="_$ze g %EExit
%EExit  d gunlock IF $zu(115,1)=1 { IF $tl=1 { TRO } ELSE  { TC }} q:%oper="INSE
RT" "" q  q
%QuickInsert(d,%nolock="0",pkey="0",parentpkey="0")
        s:%nolock=2 %nolock=0 s:'$d(%0snrc) %0snrc=+$g(^%SYS("sql","sys","no fil
er referential checks"))
        s %ROWID=$$%insert^Cinema.Film.T1(.d,$c( 0 )_$c(%nolock= 1 )_$c( 0 )) s %ROWCO
UNT='SQLCODE s %qrc=SQLCODE k d q  q
%QuickUpdate(%rowid,d,%nolock="0",pkey="0")
        s:%nolock=2 %nolock=0 s:'$d(%0snrc) %0snrc=+$g(^%SYS("sql","sys","no fil
er referential checks"))
        d %update^Cinema.Film.T1(%rowid,$c( 0 )_$c(%nolock= 1 )_$c( 0 ),.d) s %ROWCOUN
T='SQLCODE s:SQLCODE=100 SQLCODE=0 s %qrc=SQLCODE k d q  q
%QuickDelete(%rowid,%nolock="0",pkey="0")
        s:%nolock=2 %nolock=0 s:'$d(%0snrc) %0snrc=+$g(^%SYS("sql","sys","no fil
er referential checks"))
        d %delete^Cinema.Film.T1(%rowid,$c( 0 )_$c(%nolock= 1 )_$c( 0 ))
        IF SQLCODE=- 106  { s %qrc= 0  s %ROWCOUNT= 0 } ELSE  { IF SQLCODE< 0  { s %qrc=
-SQLCODE s %ROWCOUNT= 0 } ELSE  { s %ROWCOUNT= 1  s %qrc=SQLCODE}} q  q
%QuickLoad(%rowid,%nolock="0",pkey="0")
        n d,i,il,subs,t d Newqout^%qserver("") s:%nolock= 2  %nolock= 1 
        IF %nolock= 0  { IF '$$%AcquireLock^Cinema.Film.T1(%rowid) { s %qrc=114 s
%msg="Unable to acquire exclusive lock on table Cinema.Film for RowID value: "_%
rowid s %ROWCOUNT=0 q } s:$zu(115,2) il=$zu(115,2,0)}
        n s,ul s ul=0 s d(1)=%rowid IF $zu(115,2)=1 { l +^CinemaooFilmD(d(1))#"S
":$zu(115,4) IF $t { s ul=1} ELSE  { s %qrc=114 s %msg="Unable to acquire shared
 lock on table Cinema.Film for RowID value: "_%rowid s %ROWCOUNT=0 q }}
        IF '$d(^CinemaooFilmD(d( 1 )),s) { s SQLCODE= 100  s %qrc= 100  IF %nolock= 0  {
 d %ReleaseLock^Cinema.Film.T1(%rowid, 0 , 1 ) d:$g(il) $zu( 115 , 2 ,il)}} ELSE  { s SQ
LCODE= 0 
        IF %nolock= 0  { IF $zu( 115 , 1 )= 1  { TS } ELSE  { IF '$tl { IF $zu(115,1)=2
{ TS }}}} s d(2)=$lg(s,5) s d(3)=$lg(s,1) s d(4)=$lg(s,6) s d(5)=$lg(s,2) s d(6)
=$lg(s,7) s d(7)=$lg(s,3) s d(8)=$lg(s,4) s d(9)=$lg(s,8)}
        i SQLCODE s %ROWCOUNT=0 s:SQLCODE<0 SQLCODE=-SQLCODE l:ul -^CinemaooFilm
D(d(1))#"SI" s %qrc=SQLCODE q
        s i=-1 FOR  { s i=$o(d(i)) q:i=""  d Addqout^%qserver($lb(d(i))) } s %qrc=0
 s %ROWCOUNT=1 l:ul -^CinemaooFilmD(d(1))#"SI" IF %nolock=0 { d %ReleaseLock^Cinema.Film.T1(
%rowid,0,0) d:$g(il) $zu(115,2,il)} q  q
SQLUPPER(v,l) PUBLIC {  q $e(" "_$s(v="":"",'($zstrip(v,">W")=""):$zcvt($zstrip(
v,">W"),"u"), 1 :$c( 0 )), 1 ,$g(l, 32767 )) q  }
ALPHAUP(v,r) PUBLIC {   q $zcvt($zstrip(v,"*P","",",?"_$g(r)),"u") q  }
STRING(v,l) PUBLIC {    q $e(" "_$s(v="":"",'($zstrip(v,"*P","",",")=""):$zcvt($
zstrip(v,"*P","",","),"u"),1:$c(0)),1,$g(l,32767)) q  }
SQLSTRING(v,l) PUBLIC { q $e(" "_$s(v="":"",'($zstrip(v,">W")=""):$zstrip(v,">W"
), 1 :$c( 0 )), 1 ,$g(l, 32767 )) q  }
UPPER(v) PUBLIC {       q $zcvt(v,"u") q  }

Я прошу прощения, не могу вспомнить в каких структурах видел Xecute.
Буду ковырять дальше.

doublefint
P.S. Требования к скорости разработки будут только возрастать, а люди являются самой затратной и проблемной частью :(
Судя по тому, что я наблюдаю, скорость разработки как раз падает. А что люди? Когда
они видят, что на всех уровнях к качеству ПО относятся все хуже, они начинают делать
соответствующие выводы. Отсюда мы имеем то, что есть: разработка идет медленнее,
программы работают медленнее, объемы хранимых данных бессмысленно растут.
...
Рейтинг: 0 / 0
58 сообщений из 58, показаны все 3 страниц
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Программное чтение / запись в глобал
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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