powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Программное чтение / запись в глобал
8 сообщений из 58, страница 3 из 3
Программное чтение / запись в глобал
    #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
8 сообщений из 58, страница 3 из 3
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Программное чтение / запись в глобал
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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