powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / требуется Ведущий разработчик Cache (Москва)
76 сообщений из 76, показаны все 4 страниц
требуется Ведущий разработчик Cache (Москва)
    #35394814
hr_letograf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Компания ЛЕТОГРАФ (www.letograf.ru) в связи с расширением приглашает Ведущего разработчика приложений для СУБД Cache (3 вакансии).

Требования:
• опыт разработки программного обеспечения на Cache Object Script не менее 2-3 лет;
• технический английский язык;
• знание основ динамического HTML и JavaScript;
• знание основ XML/XSD/XSLT;
• владение объектно-ориентированной методологией разработки программного обеспечения;
• навыки документирования выполняемых работ.

Дополнительными преимуществами являются:

• опыт программирования на C/С++, Java;
• опыт разработки WEB-приложений;
• опыт разработки приложений для Microsoft на Visual Basic;
• знание основ реляционных баз данных и SQL;
• знание основ UML и опыт работы с Rational Rose;
• опыт работы со средствами сканирования и распознавания (ABBY FineReader, ABBY FormReader, ABBY RecognitionServer);
• знание базовых современных требований к системам электронного документооборота.

Основные обязанности:

• разработка программного кода (классы и программы Cache) на языке Cache Object Script, реализующего функциональность системы ЛЕТОГРАФ;
• разработка программного кода на JavaScript, реализующего различные динамические эффекты в просмотрищике;
• локализация и исправление обнаруженных ошибок в работе системы;
• написание технической документации - технические задания на новые составные части системы ЛЕТОГРАФ: функциональные модули, компоненты, типы данных, подсистемы;
• оперативное руководство небольшой группой разработчиков.


Условия:

Зарплата 60 000 - 90 000, белая, соцпакет.
Местоположение офиса - м. Красносельская.
Перспективы роста (компания динамично развивается).
Для иногородних: оказание помощи при переезде.
Отсутсвие российского гражданства соискателя (при наличии разрешения на работу) не является препятствием.
Вместе с резюме прошу присылать образцы Ваших кодов на Cache Object Script по адресу: hr@letograf.ru


Рассмотрим также кандидатов на роль рядового разработчика (опыт работы на Cache Object Script от 1 года).
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35394900
Фотография С0ВЕСТЬ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
млин и сюда уже лезут, имейте совесть!

... и все-таки я тебя загрызу... ©
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35395312
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hr_letografЗарплата 60 000 - 90 000, белая, соцпакет.
Так вы готовы платить 90 т.р.? Или все как в прошлый раз?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35396772
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
совестьмлин и сюда уже лезут, имейте совесть!По Cache не так уж много вакансий (мягко говоря), так что, думаю, завсегдатаи не в обиде :)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35404805
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaТак вы готовы платить 90 т.р.? Или все как в прошлый раз?
А что в прошлый раз?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35405537
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78А что в прошлый раз?
Выяснилось что это только начисляемые суммы, т.е. на руки вы получите менее 80 т.р... Но и этого платить никто не собирается т.к. "у нас с таким желанием работают за 50 т.р."...
Потом скажут что их Каше (кунгфу) лучше твоего. И как ты с такими слабыми познаниями решил на такие суммы замахиваться...

Короче Масква-Динама.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35405969
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaВыяснилось что это только начисляемые суммы, т.е. на руки вы получите менее 80 т.рДык в моду входят белые зарплаты, особливо в первопрестольной, и становится нормой указывать з/п gross (по-нашему - "грязными"). Пора привыкать :)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35406088
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovПора привыкать :)
Устанеш привыкать ко всем маркетинговым ходам... Но суть у них одна - ввести в заблуждение.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35408632
hr_letograf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa u78А что в прошлый раз?
Выяснилось что это только начисляемые суммы, т.е. на руки вы получите менее 80 т.р... Но и этого платить никто не собирается т.к. "у нас с таким желанием работают за 50 т.р."...
Потом скажут что их Каше (кунгфу) лучше твоего. И как ты с такими слабыми познаниями решил на такие суммы замахиваться...

Короче Масква-Динама.

Насколько я помню, Сергей, Ваши коды оказались настолько слабы, что Вы даже не были приглашены на собеседование. Фраза "у нас с таким желанием работают за 50 т.р." - переврана. на самом деле было сказано, что с таким качеством кодов мы готовы платить не выше 50 000 рублей.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35408654
hr_letograf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Alexey MaslovПора привыкать :)
Устанеш привыкать ко всем маркетинговым ходам... Но суть у них одна - ввести в заблуждение.
Что касается сути, то она такова: есть рынок труда. Есть работодатель, есть потребность в специалистах, есть субъективаня оценка работодателя - его мнение о том, сколько могут стоить конкретные навыки конкретного специалиста. По-моему, для взослого человека это должно быть очевидно.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35409056
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hr_letografВаши коды оказались настолько слабы
Вот, вот... Только как же я тогда (по вашим же словам) стал самым главным претендентом на вакансию?
Как это вы говорили по телефону?
- У вас приоритет даже не №1... А №0! Ваше резюме лежит прямо выше всех в папке...

Все "проблемы" как раз начались после того как я назвал сумму в 90 т.р. :-В

Ну да ладно... Не хотите и ненадо.
Хотя интересно былобы посмотреть на ваши "крутые" коды, увидев которые, вы сразу же готовы платить хотябы 80 т.р.
Это уже так... Чисто спортивное любопытство.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35410458
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что вообще означает "слабый" код? Как я понимаю может быть плохой стиль программирования, неправильная реализация или не выполнение тестового задания. Как по куску кода, выдернутого из контекста можно сказать, что он "слабый"???
А какой код тогда "сильный"? И как код может быть сильнее/слабее другого кода? Кто ставит этот диагноз?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35410479
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Socratdv
+1000
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35410534
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SocratdvКто ставит этот диагноз?
Если я правильно понял, это делает один из начальников отделов.

Если кто не поленится и найдет их первое объявление - там они и других соискателей обвинили в "слобости" и "стяжательстве".
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35411536
hr_letograf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стыдно, Сергей. Облажались и врёте беззастенчиво, как маленький. Ваши зарплатные притязания я выяснила у Вас ДО того, как запросила образцы кодов, - во время первой же телефонной беседы. Ни про какую стопку резюме я никогда не говорила - стопки резюме на позицию "разработчик Cache" просто не бывает, слишком редки такие специалисты, которые к тому же ищут работу. Так что и приоритета у вас на тот момет быть не могло - если только не говорить о приоритете по сравнению с множеством меры ноль.

Давайте я выложу здесь те ваши коды, что вы присылали, а компетентные участики дискуссии посмотрят, что значит "слабые", и скажут, стОят ли они 90 тысяч рублей. В сочетании с Вашим резюме (без указания реального имени и места работы, чтобы ненароком не подставить перед работодателем). А то наговаривать-то из-под ника оно, конечно, весело. А за слова отвечать?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35411541
hr_letograf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa SocratdvКто ставит этот диагноз?
Если я правильно понял, это делает один из начальников отделов.

Если кто не поленится и найдет их первое объявление - там они и других соискателей обвинили в "слобости" и "стяжательстве".
цитату в студию. не поленитесь уж, мистер Честность.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35411646
hr_letograf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SocratdvА что вообще означает "слабый" код? Как я понимаю может быть плохой стиль программирования, неправильная реализация или не выполнение тестового задания. Как по куску кода, выдернутого из контекста можно сказать, что он "слабый"???
А какой код тогда "сильный"? И как код может быть сильнее/слабее другого кода? Кто ставит этот диагноз?
Диагноз ставит руководитель проекта. Код может быть "слабый" и даже "беспомощный". Если Вы программист со стажем, сравните свои коды студенческих лет (когда Вы только начинали осваивать эту профессию) с тем, что пишете сейчас, и полУчите (скорее всео) как раз оценку: "слабый" код. Откуда вы знаете, что "кусок кода был выдернут из контекста"? Откуда Вы знаете, какой именно объем был прислан на оценку и сколько там было контекста? откуда Вы знаете, что не было тестового задания?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35411666
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hr_letograf образцы кодов

Да не обидется автор.

Похоже у Вас на предприятии существует некий стандарт программирования на Cache, Ensemble.
И это очень хорошо, это правильно. Если это действительно так, то я Вам очень завидую.

Меня тоже давно интересует стандарт предприятия (СТП) по программированию на Cache.
Собрав опыт многих программистов, хочу узаконить СТП у себя, а я так понимаю тут есть Уважаемые люди с Богатым опытом.

Если есть добрые люди и готовы откликнуться по этому вопросу - буду благодарен. Только не в этой теме. Всяких "тащусиков" просьба не беспокоить. Вопрос конкретный.

Еще раз извиняюсь перед автором.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35411746
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hr_letografДавайте я выложу здесь те ваши коды
Выкладывайте конечно, никаких препятствия в этом я не вижу...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35412124
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2hr_letograf
А можно выложить то, что Вы считаете "слабым" кодом, и "сильный" код(достойный 90 000). Чтоб соискатели сразу видели, на какой уровень ориентироваться.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35413499
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hr_letograf SocratdvА что вообще означает "слабый" код? Как я понимаю может быть плохой стиль программирования, неправильная реализация или не выполнение тестового задания. Как по куску кода, выдернутого из контекста можно сказать, что он "слабый"???
А какой код тогда "сильный"? И как код может быть сильнее/слабее другого кода? Кто ставит этот диагноз?
Диагноз ставит руководитель проекта. Код может быть "слабый" и даже "беспомощный". Если Вы программист со стажем, сравните свои коды студенческих лет (когда Вы только начинали осваивать эту профессию) с тем, что пишете сейчас, и полУчите (скорее всео) как раз оценку: "слабый" код.
Опять же повторюсь - я не могу вообразить себе "слабый" код, т.к. эти два понятия у меня ни как не вяжутся в голове. Я понимаю, если определение "слабый" приписывается кодеру (программисту), исходя из его умственных и профессиональных качеств. Но сравнивая два абсолютно разных кода, если они всецело выполняют поставленную перед ними задачу, сказать, что один код "слабее" другого я не могу. Опять же - может быть плохой или не соответствующий Вашим стандартам стиль программирования, но выносить вердикт программисту из-за такой ерунды как минимум глупо. Так же может быть неправильная реализация, но тут нельзя однозначно судить по коду, не зная ситуации вцелом, т.к. эта вещь очень субъективная и по куску кода очень сложно определить уровнь профессионализма кодера. Как мне кажется, самый оптимальный способ выяснить на сколько хорош программист - это результат выполнения тестого задания, где можно довольно-таки хорошо проверить его умственный способности и выявить познания языка или каких-нибудь специфических вещей.
hr_letografОткуда вы знаете, что "кусок кода был выдернут из контекста"? Откуда Вы знаете, какой именно объем был прислан на оценку и сколько там было контекста? откуда Вы знаете, что не было тестового задания?
Заметьте - я ни где до этого не утверждал, что тестового задания не было, а про код я высказался исходя из Ваших же слов. До этого шла речь только о "слабости" кода, присланного тов. Сергеем.
Если Вы принимаете решение об уровне программиста только исходя из присланного им кода, то я бы не советовал соискателям с хорошим уровнем профессиональных качеств обращаться в Вашу компанию, т.к. это решение будет заведомо субъективно. Если же ситуация не такая, то проясните её, пожалуйста. Да и код, присланный Сергеем, было бы не плохо выложить чтобы не быть голословными.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35414039
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не ручаюсь за точность... Т.к. компьютер был у меня заменен и истории переписки не осталось... Но посылал вроде это

Код: 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.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
 // Диапазон страниц
#define pgline  3 
 
LIST(ClsName,GlbName,N) ; * Просмотр класса *
 ; ClsName - имя класса
 ; GlbName - имя глобала с данными
 ; N       - количество строк на странице
 n task,prop,page,index,typfnd,fndtyp,set,data,slvtyp,fldtyp
 s set=$$Set^sysNAME
 s:$g(ClsName)="" ClsName=@set@("Class")
 s:$g(GlbName)="" GlbName=$$Temp^sysNAME()
 s N=$g(N, 10 )
 s task=@set@("Task")
 s data=$na(@GlbName@("Data"))
 s page=$$Page
 s index=$g(%request.Data("Index", 1 ))
 s typfnd=$g(%request.Data("TypFindSet", 1 ), 0 )
 s slvtyp=$$SlvTyp
 s fldtyp=$$FldTyp
 s ocls=##class(%Dictionary.ClassDefinition).%OpenId(ClsName)
 d BEGHTML
 d NAMECLS
 &html<<input type='hidden' name='Page' value='#(page)#'>>
 s prop=$na(@GlbName@("Fld"))
 d INDLIST
 if '$g(@GlbName@("Start")) {
	 d SEARCH
 }
 d FINDLIST
 d FINDTYP
 d ocls.%Close()
 d LSTPG
 d BUTTON
 d TABLE
 d LSTPG
 d ENDHTML
 q
FldTyp() ; Это заполнение из справочника
 n val
 s val=$g(%request.Data("fldname",1))
 q:val="" 0
 q 1
SlvTyp() ; Это просмотр справочника
 n val
 s val=$g(%request.Data("clsname",1))
 q:val="" 0
 q 1
BUTTON
 &html<<table>>
 &html<<tr>>
 &html<<td><input type='button' value='Добавить запись' onclick='Add()'>>
 d EXIT
 &html<</table>>
 q
EXIT
 n gl,url
 s gl=$$Exit^sysNAME()
 s url=$g(@gl)
 q:url=""
 &html<<td><input type='button' value='Выход' onclick='Exit("#(url)#")'>>
 q
LSTPG ; Список страниц
 n max,p1,p2,i
 s max=$o(@data@(""),-1)
 s p1=page-$$$pgline
 s:p1<1 p1=1
 s p2=page+$$$pgline
 s:p2>max p2=max
 &html<<table cellpadding="2" cellspacing="0" border="0">>
 &html<<tr>>
 &html<<td><div class='tbl_st0'>Страницы:>
 d:p1>1 BEGPG
 d:page>1 LEFTPG
 for i=p1:1:p2 {
	 d NUMPAGE
 }
 d:page<max RIGHTPG
 d:p2<max ENDPG
 &html<</table>>
 q
RIGHTPG ; Следующая
 &html<<td><div class='tbl_st3'><a href='javascript:GoPg(#(page+ 1 )#)' class='link1' style='text-decoration:none;'><strong>След</strong></a></div>>
 q
LEFTPG ; Предыдущая страница
 &html<<td><div class='tbl_st3'><a href='javascript:GoPg(#(page- 1 )#)' class='link1' style='text-decoration:none;'><strong>Пред</strong></a></div>>
 q
BEGPG ; Первая страница
 &html<<td><div class='tbl_st1'><a href='javascript:GoPg( 1 )' class='link1'>1</a></div>>
 q
ENDPG ; Последняя страница
 &html<<td><div class='tbl_st1'><a href=# class='link1'>#(max)#</a></div>>
 q
NUMPAGE ; Очередной номер
 if i=page {
	 d SETPG
 } else {
	 d NMPG
 }
 q
NMPG ; Очередная страница
 &html<<td><div class='tbl_st1'><a href='javascript:GoPg(#(i)#)' class='link1'>#(i)#</a></div>>
 q
SETPG ; Текущая страница
 &html<<td><div class='tbl_st8'><strong>#(i)#</strong></div>>
 q
Page() ; Номер страницы
 n val
 s val=$g(%request.Data("Page",1))
 q:val="" 1
 q:'$d(@data@(val))  1 
 q val
FINDTYP ; Тип поиска
 &html<<table cellpadding="2" cellspacing="0" border="0">>
 &html<<tr>>
 &html<<td style='border:dotted;border-width:1px;border-left:none;border-right:none;border-color:#000;' colspan="3">>
 &html<<table cellpadding="2" cellspacing="0" border="0">>
 &html<<tr>>
 &html<<td>[Равно>
 &html<<td><input type='radio' name='TypFind' value='0'#($$Val( 0 ))#>]>
 if fndtyp= 1  {
	 d STRTYP
 } elseif fndtyp= 2  {
	 d NUMTYP 
 }
 &html<<td align="right"><a href='javascript:Find()' ><img src="/prt/img/search.gif" border="0"></a>>
 &html<<td align="right"><a href='javascript:Stop()' ><img src="/prt/img/stop.gif" border="0"></a>>
 &html<<td align="right"><a href='javascript:LoadPg()' ><img src="/prt/img/refresh.gif" border="0"></a>>
 &html<</table>>
 &html<</table>>
 &html<<input type='hidden' name='TypFindSet' value='#(typfnd)#'>>
 q
NUMTYP ; Поиск строки
 &html<<td>[Больше>
 &html<<td><input type='radio' name='TypFind' value='3'#($$Val( 3 ))#>]>
 &html<<td>[Меньше>
 &html<<td><input type='radio' name='TypFind' value='4'#($$Val( 4 ))#>]>
 q
STRTYP ; Поиск строки
 &html<<td>[Начинается>
 &html<<td><input type='radio' name='TypFind' value='1'#($$Val( 1 ))#>]>
 &html<<td>[Содержит>
 &html<<td><input type='radio' name='TypFind' value='2'#($$Val( 2 ))#>]>
 q
Val(Typ) ; Значение для типа
 q:Typ=typfnd " checked"
 q ""
NAMECLS
 &html<<table cellpadding="2" cellspacing="0" border="0" width="100%">>
 &html<<tr class="data">>
 &html<<td class='headerdata' width="%100"><strong>#(ocls.Description)#</strong>>
 &html<</table>>
 q
ENDHTML ; Окончательный текст html
 &html<<td width="3" background="/prt/img/framebar-right-middle.gif">>
 &html<<tr>>
 &html<<td width="3" height="6" background="/prt/img/framebar-left-bottom.gif">>
 &html<<td height="6" background="/prt/img/framebar-middle-bottom.gif">>
 &html<<td width="3" height="6" background="/prt/img/framebar-right-bottom.gif">>
 &html<</table>>
 q
BEGHTML ; Начальный текст html
 &html<<table width="100%"  border="0" cellspacing="0" cellpadding="0" align="center">>
 &html<<tr>>
 &html<<td width="3" height="6" background="/prt/img/framebar-left-top.gif">>
 &html<<td height="6" background="/prt/img/framebar-middle-top.gif">>
 &html<<td width="3" height="6" background="/prt/img/framebar-right-top.gif">>
 &html<<tr>>
 &html<<td width="3" background="/prt/img/framebar-left-middle.gif">>
 &html<<td valign="top" class="maintablebody">>
 q
SEARCH ; Выполнить поиск
 n sql,exe
 s sql=$$SqlStr
 s exe=$$Execute
 s @GlbName@("sql")=sql
 s @GlbName@("exe")=exe
 j FIND(sql,exe,GlbName,N)
 q
SqlStr()
 n sql,cls
 s cls=$$ClsSql^sysNAME(ClsName)
 s sql="Select * From "_cls
 d WHERE
 d ORDERBY
 q sql
WHERE
 n i,d,first,rlt
 s first= 1 
 s rlt=$$Rlt^sysNAME()
 s d=""
 s i=$o(@rlt@(""))
 while i'="" {
	 d RFLD
	 s i=$o(@rlt@(i))
 }
 s i=$o(@prop@(0,""))
 while i'="" {
	 d WFLD
	 s i=$o(@prop@( 0 ,i))
 }
 q
RFLD ; Очередное свойство в реляции
 n val
 d:first WFIRST
 s val=@rlt@(i)
 s sql=sql_d_i_"="_val
 s d=" and "
 q
WFLD ; Очередное свойство
 n opr,val,fld,cls
 s fld=@prop@( 0 ,i)
 s cls=$g(@prop@( 0 ,i,"Class"))
 s val=$$Value
 q:val=""
 d:first WFIRST
 s opr=$$Opr
 s sql=sql_d_fld_opr_"?"
 s d=" and "
 q
Opr() ; Вычислить операцию
 q:typfnd= 0  "="
 q:typfnd= 1  " like "
 q:typfnd= 2  " like "
 q:typfnd= 3  ">"
 q:typfnd= 3  "<"
 q ""
Value() ; Вычислить значение
 n val
 s val=$g(%request.Data(fld, 1 ))
 q:val="" ""
 q:cls="" val
 s val=$$Code^sysFNC(val,cls)
 q val
WFIRST ; Первое условие
 s sql=sql_" where "
 s first= 0 
 q
ORDERBY ; Сортировка
 n i,d
 s sql=sql_" order by "
 s d=""
 s i=$o(@prop@( 0 ,""))
 while i'="" {
	 d OFLD
	 s i=$o(@prop@(0,i))
 }
 q
OFLD ; Очередное свойство
 n val
 s val=@prop@(0,i)
 s sql=sql_d_val
 s d=","
 q
Execute() ; Execute с параметрами
 n str,d,j
 s str="s ok=o.Execute("
 s i=$o(@prop@(0,""))
 s d=""
 while i'="" {
	 d EFLD
	 s i=$o(@prop@( 0 ,i))
 }
 s str=str_")"
 q str
EFLD ; Очередное свойство
 n val,cls
 s val=@prop@( 0 ,i)
 s val=$g(%request.Data(val, 1 ))
 q:val=""
 s cls=$g(@prop@( 0 ,i,"Class"))
 s:cls'="" val=$$Code^sysFNC(val,cls)
 q:val=""
 s:typfnd=1 val=val_"%"
 s:typfnd=2 val="%"_val_"%"
 s @GlbName@(0,i)=val
 s val="@GlbName@(0,"_i_")"
 s str=str_d_val
 s d=","
 q
FIND(Sql,Execute,GlbName,N) ; Поиск значений
 n data,o,sql,ok,i,prop,brk,value
 s @GlbName@("Start")=1
 s data=$na(@GlbName@("Data"))
 k @data
 s prop=$na(@GlbName@("Fld"))
 s o=##class(%ResultSet).%New("%DynamicQuery:SQL")
 s ok=o.Prepare(Sql)
 x Execute
 s brk=0
 while o.Next()!brk {
	 d FLINE
 }
 d o.Close()
 s @GlbName@("Stop")=1
 q
FLINE ; Очередная сторока
 n pg,lin,val
 s i=$i(@data)
 s pg=(i\N)+1
 s lin=$i(@data@(pg))
 s val=o.Get("ID")
 s @data@(pg,lin,"ID")=val
 d FTYPE()
 d FTYPE(1)
 if $$Break {
	 k:'$g(@GlbName@("Start")) @GlbName
	 s brk= 1 
 }
 q
Break() ; Прервать поиск
 q:'$g(@GlbName@("Start")) 1
 q:$g(@GlbName@("Break")) 1
 q 0
FTYPE(Typ) ; Очередной тип полей
 n j
 s Typ=$g(Typ,0)
 s j=$o(@prop@(Typ,""))
 while j'="" {
	 d LFLD
	 s j=$o(@prop@(Typ,j))
 }
 q
LFLD ; Очередное свойство
 n fld,val,cls
 s fld=@prop@(Typ,j)
 s cls=$g(@prop@(Typ,j,"Class"))
 s val=o.Get(fld)
 s:cls'="" val=$$String^sysFNC(val,cls)
 s @data@(pg,lin,fld)=val
 q
TABLE ; Собствено таблица
 &html<<table cellspacing="0" cellpadding="0" border="0" class="tabledata">>
 d TITLE
 d DATA
 &html<</table>>
 q
DATA ; Вывод даных
 n i
 &html<<tbody>>
 s i=$o(@data@(page,""))
 while i'="" {
	 d LINE
	 s i=$o(@data@(page,i))
 }
 q
LINE ; Очередная строка
 n typ,id
 s typ="chet_row"
 s:i# 2  typ="nechet_row"
 &html<<tr class="#(typ)#">>
 d DATTYPE()
 d DATTYPE( 1 )
 s id=@data@(page,i,"ID")
 if fldtyp {
	 d SETFLD
 } else {
	 d BTN
 }
 q
SETFLD ; Для заполнения поля
 n val
 s val=@data@(page,i,"Name")
 &html<<td class='tbl_st6'><a href='javascript:SetFld("#(val)#")' title="Удалить запись"><img src="/prt/img/check.gif" border="0"></img></a>>
 q
BTN ; Стандартные кнопки управления
 &html<<td class='tbl_st6'><a href='javascript:Browse(#(id)#)' title="Удалить запись"><img src="/prt/img/check.gif" border="0"></img></a>>
 &html<<td class='tbl_st6'><a href='javascript:Edit(#(id)#)' title="Редактировать запись"><img src="/prt/img/edit_button.png" border="0"></img></a>>
 &html<<td class='tbl_st6'><a href='javascript:Del(#(id)#)' title="Удалить запись"><img src="/prt/img/delete_button.png" border="0"></img></a>>
 q
DATTYPE(Typ) ; Очередной тип полей
 n j
 s Typ=$g(Typ, 0 )
 s j=$o(@prop@(Typ,""))
 while j'="" {
	 d DFLD
	 s j=$o(@prop@(Typ,j))
 }
 q
DFLD ; Очередное поле
 n val,fld
 s fld=@prop@(Typ,j)
 s val=@data@(page,i,fld)
 s:val="" val="<br>"
 &html<<td class='tbl_st6'>#(val)#>
 q
TITLE ; Шапка таблицы
 n val
 &html<<thead>>
 &html<<tr>>
 d TITTYPE()
 d TITTYPE(1)
 s val="colspan='3'"
 s:fldtyp val=""
 &html<<th class='tbl_st6' #(val)#><strong>Служебная</strong>>
 q
TITTYPE(Typ) ; Очередной тип полей
 n i
 s Typ=$g(Typ,0)
 s i=$o(@prop@(Typ,""))
 while i'="" {
	 d TFLD
	 s i=$o(@prop@(Typ,i))
 }
 q
TFLD ; Очередной столбец
 n val
 s val=@prop@(Typ,i,"Tit")
 &html<<th class='tbl_st4'><strong>#(val)#</strong>>
 q
FINDLIST ; Список полей участвующих в поиске
 n i,val
 q:'$d(@prop)
 &html<<table>>
 &html<<tr>>
 s i=$o(@prop@(0,""))
 while i'="" {
	 d FNDFLD
	 s i=$o(@prop@( 0 ,i))
 }
 &html<</table>>
 q
FNDFLD ; Очередное поисковое поле
 n fld,val,cls
 s fld=@prop@( 0 ,i)
 &html<<td>#(@prop@( 0 ,i,"Tit"))#>
 s val=$g(%request.Data(fld, 1 ))
 s cls=$g(@prop@( 0 ,i,"Class"))
 if cls'="" {
	 d FLDCLS
	 q
 }
 &html<<td><input type='text' name='#(fld)#' value='#(val)#'>>
 q
FLDCLS
 &html<<td><input type='text' onchange='String(this,"#(cls)#")' name='#(fld)#' value='#(val)#'>>
 &html<<td><input type='button' onclick='Slv("#(fld)#","#(cls)#")' value='...' title='Выбрать значение из справочника'>>
 q
INDLIST ; Список индексов
 n i,n,insl,first
 s n=ocls.Indices.Count()
 q:n=0
 s first=1
 for i=1:1:n {
	 d IND
 }
 &html<</select>>
 &html<<td><a href='javascript:NewInd()' title="Выбрать индекс"><img src="/prt/img/browse.gif" border="0"></img></a>>
 &html<<td>>
 d INFO
 &html<</table>>
 &html<<input type='hidden' name='Index' value='#(index)#'>>
 q
INFO ; Информация о поиске
 n rec,pg,inf
 &html<<table cellspacing="0" cellpadding="0">>
 &html<<tr>>
 s rec=1
 s pg=1
 s inf=$$Inf
 s:inf'="" inf="<i> "_inf_"</i>"
 &html<<td><div class='results'>Записей: <strong>#(rec)#</strong>, страниц: <strong>#(pg)#</strong>.#(inf)#</div>>
 &html<</table>>
 q
Inf()
 q:$g(@GlbName@("Break")) "Поиск прпрерван..."
 q:'$g(@GlbName@("Stop")) "Поиск продолжается..."
 q ""
IND ; Очередной индекс
 n nam,val,typ
 s nam=ocls.Indices.GetAt(i).Name
 q:$l(nam,"Index")=2
 d:first FIRSTIN
 s val=ocls.Indices.GetAt(i).Description 
 s:val="" val="Нет названия ("_nam_")"
 s typ=""
 d:nam=index INDSLCT
 &html<<option value='#(nam)#'#(typ)#>#(val)#>
 q
INDSLCT ; Информация по выбраному индексу
 n fld,j
 s typ=" selected"
 s fld=ocls.Indices.GetAt(i).Properties 
 for j=1:1:$l(fld,",") {
	 d IFLD($p(fld,",",j),j)
 }
 d ADDFLD
 q
ADDFLD ; Добавочные поля
 n o,i
 s o=##class(%ResultSet).%New("sys.AddFld:ListFld")
 d o.Execute(task,ClsName,nam)
 while o.Next() {
	 d IFLD(o.Get("Name"),$i(i),1)
 }
 d o.Close()
 q
IFLD(Fld,Pos,Typ) ; Очередное свойство
 n o,id,val,i
 s Typ=$g(Typ,0)
 s @prop@(Typ,Pos)=Fld
 s id=ClsName_"||"_Fld
 s o=##class(%Dictionary.CompiledProperty).%OpenId(id)
 s val=o.Description
 s:val="" val=Fld
 s @prop@(Typ,Pos,"Tit")=val
 s val=o.Type
 s @prop@(Typ,Pos,"Typ")=val
 s val=##class(sys.FldCls).GetCls(task,ClsName,nam)
 s:val'="" @prop@(Typ,Pos,"Class")=val
 d o.%Close()
 q:Typ'=0 0
 q:Pos'= 1   0 
 d:slvtyp SLVTYP
 s fndtyp=$$FndTyp
 q
SLVTYP ; Для справочника
 n fld
 s fld="Name"
 s:Fld="Name" fld="Code"
 d IFLD(fld, 1 , 1 )
 q
FndTyp() ; Тип поиска
 n typ
 q:$d(@prop@(Typ,Pos,"Class"))  0 
 s typ=@prop@(Typ,Pos,"Typ")
 q:typ="%Library.Integer"  2 
 q:typ="%Library.Date"  2 
 q  1 
FIRSTIN ; Первый индекс
 &html<<table cellpadding="2" cellspacing="0" border="0" >>
 &html<<tr>>
 &html<<td>Индексы>
 &html<<td>>
 &html<<select name='AllInd'>>
 s first= 0 
 q:index'=""
 s index=nam
 q
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35414045
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение тестового задания я так и не нашел... Но повторяю, все мои "трудности" начались именно после озвучивания моих "притязаний".
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421914
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно что вообще 50т.р. предложили....
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421932
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код не нравится, как и 99% кода на каше, но в чем особый криминал, не вижу.

Тем более без постановки задачи вообще не могу оценить, наскольно он плох или хорош.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421933
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например сколько "стоит" такой код? (На взгляд специалиста по MSSQL :-) )
Код: 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.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
 //только для дефолтового хранения
 //d checkIndex^checkIndex("Contracts.EPhDogovor","Ab")
 //d checkClass^checkIndex("Payments.EbgPayments")
simplyRebuild(file= 0 ) //перестроить все индексы средствами каше
 d openFile(file)
 s class=$o(^oddCOM("A"))	
 while class'=""
     {s classtype=$g(^oddCOM(class,23))
      if classtype="persistent" 
          {w !,"Перестройка индесов ",class
	       x "d ##class("_class_").%BuildIndices(,1)"
          }
	  s class=$o(^oddCOM(class))	
     }
 q 
checkAll(repair=0,file=0) public
{d openFile(file)
 s class=$o(^oddCOM("A"))	
 while class'=""
     {s classtype=$g(^oddCOM(class, 23 ))
      d:classtype="persistent" checkClass(class,repair)
	  s class=$o(^oddCOM(class))	
     }
 q
} 
 //Комплексная проверка для класса
checkClass(class,repair= 0 ,file= 0 ) public
 {d openFile(file)
  s dataS=$g(^oddCOM(class,"s","Default", 24 ))	
  if dataS="" {w !,"Класс ",class," не существует или имеет нестандартное хранение" q}
  w !,"Проверка индексов для класса:",class
  
  d checkIndexExist(class,repair)
  d checkIndexCorrect(class,repair)  
  q
 }
 
 // проверяет индексные записи на корректность. Пока не проверяет доп-поля                                  
checkIndexCorrect(class,repair= 0 ,file= 0 )[storageIndex] public
 {n storageIndex
  d openFile(file)
  if $d(^oddCOM(class,"s","Default", 24 ))= 0  {w !,"Нестандартное хранение или неверный класс" q}
  s dataStorage=$g(^oddCOM(class,"s","Default", 24 )) 
  s indexStorage=^oddCOM(class,"s","Default", 25 )
  d buildStorageIndex(class)
  
  s index=$o(^oddCOM(class,"i","")) //собираем индексные поля
  while index'=""
      {s indexLength(index)=^oddCOM(class,"i",index,"I")
	   f i=1:1:indexLength(index) s indexField(index,i)=^oddCOM(class,"i",index,"I",i,23)	   
       
       //собираем дата-поля от индекса	   
	   s indexDataList=$p(^oddCOM(class,"i",index,22),"~",4)
	   s indexDataLength(index)=$l(indexDataList,",")
	   s:indexDataList'="" indexDataLength(index)=indexDataLength(index)+ 1 
 
	   s indexData(index, 1 )="%%CLASSNAME"
	   f i= 1 : 1 :indexDataLength(index) s indexData(index,i+ 1 )=$p(indexDataList,",",i)
	   
	   //удалим из списка проверки idkey
	   k:^oddCOM(class,"i",index, 5 )="key" indexLength(index),indexField(index),indexData(index)
	   s index=$o(^oddCOM(class,"i",index))
      }
   
  s indexLine=$q(@indexStorage@(""))
  while indexLine'=""
      {
	   s index=$qs(indexLine,1)
	   g:$d(indexLength(index))=0 skipRecord  //Чужой индекс, возможно от чужого класса
       s id=$qs(indexLine,2+indexLength(index))
       s existDataFlag=$d(@dataStorage@(id)) 
       if existDataFlag=0 
           {w !,indexLine," ;индекс на несуществующую запись"
            k:repair @indexLine
            w:repair " /удаляем"
            g skipRecord
           }       
       f i=1:1:indexLength(index) //проверка основных индексных полей
           {s fieldName=indexField(index,i)
            s fieldType=$lg(storageIndex(fieldName),4)
            s fieldValue(i)=$$getValue(dataStorage,id,fieldName)
	        s fieldValue(i)=$$normalizeData(fieldValue(i),fieldType)
	        if fieldValue(i)'=$qs(indexLine, 1 +i)
	            {w !,indexLine," ;в индексе ",index," неправильное поле:",fieldName,", ожидается:'",fieldValue(i),"'"
                 w:repair ", /удаляем индекс" 
                 k:repair @indexLine 
                 g skipRecord           
	            }
           }
       /**Проверка дата-полей*/
       if indexDataLength(index)= 1   //если поле данных одно, то это имя класса и хранится оно как строка
           {s fieldName=indexData(index, 1 )
            s fieldValue=$$getValue(dataStorage,id,fieldName)
            s indexDataValue=$g(@indexLine)
            s indexDataExist=$d(@indexLine)
 
            if (indexDataValue'=fieldValue)||('indexDataExist)
                {w !,indexLine," ;в индексе ",index," поле данных:",fieldName,", ожидается:'",fieldValue,"' вместо:",$case(indexDataExist, 1 :"'"_indexDataValue_"'",:"~пусто~"),""
                 w:repair ", /исправляем" 
                 s:repair @indexLine=fieldValue
                }
            g skipRecord    
           }
       f i= 1 : 1 :indexDataLength(index)  //если полей данных много, то хранятся они как список
           {s fieldName=indexData(index,i)
            s fieldValue=$$getValue(dataStorage,id,fieldName)
            s indexDataValue=$lg(@indexLine,i)
            s indexDataExist=$ld(@indexLine,i)
 
            if (indexDataValue'=fieldValue)||('indexDataExist)
                {w !,indexLine," ;в индексе ",index," поле данных:",fieldName,", ожидается:'",fieldValue,"' вместо:",$case(indexDataExist, 1 :"'"_indexDataValue_"'",:"~пусто~"),""
                 w:repair ", /исправляем" 
                 s $li(@indexLine,i)=fieldValue
                }
           }     
skipRecord  //метка типа continue
	   s indexLine=$q(@indexLine)
      }
  s res=$lb(count,countMissIndex)
  q 
 }
 /*Проверяет наличие корректных индексов для экземпляров класса*/
checkIndexExist(class,repair= 0 ,file= 0 )[storageIndex] public
 {n storageIndex
  d openFile(file)
  if $d(^oddCOM(class,"s","Default", 24 ))= 0  {w !,"Нестандартное хранение или неверный класс" q}
  s dataStorage=$g(^oddCOM(class,"s","Default", 24 )) 
  s indexStorage=^oddCOM(class,"s","Default", 25 )
  d buildStorageIndex(class)
  s classNameList=$$buildClassnameList(class)
  
  s index=$o(^oddCOM(class,"i",""))
  while index'=""
      {s indexLength(index)=^oddCOM(class,"i",index,"I")
	   f i=1:1:indexLength(index) s indexField(index,i)=^oddCOM(class,"i",index,"I",i,23)
	   
	   //удалим из списка проверки idkey
	   k:^oddCOM(class,"i",index,5)="key" indexLength(index),indexField(index)
	   s index=$o(^oddCOM(class,"i",index))
      }
  s id=$o(@dataStorage@(""))
  while id'=""
      {//если это наследованный класс, но у экземпляра не совпадающее %%CLASSNAME,
       //ставим флаг чужого класса
       s className=$$getValue(dataStorage,id,"%%CLASSNAME")
       s targetClassFlag=classNameList[className
	   s index=$o(indexLength(""))
       while (index'="")&&(targetClassFlag)
           {s indexLength=indexLength(index)
           
	        f i=1:1:indexLength
               {s fieldName=indexField(index,i)
                s fieldType=$lg(storageIndex(fieldName),4)
                s fieldValue(i)=$$getValue(dataStorage,id,fieldName)
	            s fieldValue(i)=$$normalizeData(fieldValue(i),fieldType)
               }
            s flagOK=""
            s:indexLength=1 flagOK=$d(@indexStorage@(index,fieldValue(1),id))
            s:indexLength=2 flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),id))
 	        s:indexLength=3 flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),fieldValue(3),id))
 	        s:indexLength=4 flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),fieldValue(3),fieldValue(4),id))
 	        s:indexLength=5 flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),fieldValue(3),fieldValue(4),fieldValue(5),id))
            if flagOK'= 1  
                {w !,"index=",index," для id=",id," отсутствует ("
                 f i= 1 : 1 :indexLength w indexField(index,i),"=",fieldValue(i),","
                 w "id=",id,")"
                 if repair
                     {s:indexLength= 1  @indexStorage@(index,fieldValue( 1 ),id)=""
                      s:indexLength= 2  @indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),id)=""
 	                  s:indexLength= 3  @indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),fieldValue( 3 ),id)=""
 	                  s:indexLength= 4  @indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),fieldValue( 3 ),fieldValue( 4 ),id)=""
 	                  s:indexLength= 5  @indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),fieldValue( 3 ),fieldValue( 4 ),fieldValue( 5 ),id)=""
 	                  w " /строим базовую часть"
                     } 
                } 
	        s index=$o(indexLength(index))
           }
	   s id=$o(@dataStorage@(id))
      }
  q 
 }
 /*Собирает информацию о хранении в специальную переменную storageIndex*/
buildStorageIndex(class)[storageIndex]  
 {k storageIndex
  s storage=$o(^oddCOM(class,"s","Default","D",""))
  while storage'=""
      {
       s storageType=$g(^oddCOM(class,"s","Default","D",storage,22),"listnode")
	   if storageType="listnode"
	       {s i=$o(^oddCOM(class,"s","Default","D",storage,"V",""))
		    while i'=""
               {s field=^oddCOM(class,"s","Default","D",storage,"V",i, 21 )
                s type=$g(^oddCOM(class,"a",field, 40 ))
                s subscript=$g(^oddCOM(class,"s","Default","D",storage, 23 ))
                s storageIndex(field)=$lb(i,subscript,storageType,type)
	            s i=$o(^oddCOM(class,"s","Default","D",storage,"V",i))
               }   
	       }     
	   if (storageType="subnode")||(storageType="node")
	       {s field=^oddCOM(class,"s","Default","D",storage, 21 )
            s type=$g(^oddCOM(class,"a",field, 40 ))
            s subscript=$g(^oddCOM(class,"s","Default","D",storage, 23 ))
            s storageIndex(field)=$lb(i,subscript,storageType,type)
	       }
	   s storage=$o(^oddCOM(class,"s","Default","D",storage))
      }
  q
 }
 /*Переводит данные в формат для хранения в индексах. Пока знает только %String */
normalizeData(value,type)
{q:type="%Library.String" $system.SQL.SQLUPPER(value)
 q:value="" -1e14
 
 q value
} 
 /*Выдергивает значение поля из глобала. Как раз для этого и нужнен был storageIndex*/
getValue(dataStorage,id,fieldName)[storageIndex]
{s storageOffset=$lg(storageIndex(fieldName), 1 )
 s storageSubscript=$lg(storageIndex(fieldName), 2 )
 s storageSubscript=$tr(storageSubscript,"""","")
 s storageType=$lg(storageIndex(fieldName), 3 )
 
 s:storageSubscript="" fieldValue=$g(@dataStorage@(id))
 s:storageSubscript'="" fieldValue=$g(@dataStorage@(id,storageSubscript))
 
 q:storageType="listnode" $lg(fieldValue,storageOffset)
 q fieldValue
}
 /*Строит список имен классов, которые может иметь экземпляр данного класса,
   так как при наследовании имя класса может отличаться   */
buildClassnameList(class1) 
{s classList="~"
 //если класс наследуется напрямую от %Persistent, имя класса может быть пустым
 s:$p($g(^oddCOM(class1,60)),",")="%Library.Persistent" classList=classList_"~"
 s class=$o(^oddCOM("A"))	
 while class'=""
     {//^oddCOM(class, 45 ) - Это вся цепочка наследованных классов
	  s:$f($g(^oddCOM(class, 45 )),"~"_class1_"~") classList=classList_class_"~"
	  s class=$o(^oddCOM(class))	
     }
 q classList
} 
openFile(file)
{q:file= 0 
 c file o file:"NW": 1  
 w:'$test "Файл ",file," не открыт"
 u:$test file 
}
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421941
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код cache и эстетичность находятся в разных измерениях... Им не суждено встретиться... Никогда...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421944
Ivan.Kokov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
non-alexandroКод cache и эстетичность находятся в разных измерениях... Им не суждено встретиться... Никогда...

Позвольте полюбопытствовать, как вы это поняли?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421945
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Для меня основной критерий оценки чужого кода - код хороший, если я могу легко
понять, чего там написано и как оно работает. Второй критерий - можно ли это
написать лучше.

Для кода, который пишется в нашей компании, к этому прибавляется соответствие
корпоративному стандарту на код.

И если с понятностью кода тут все хорошо, улучшить можно довольно многое ))

1. Если все равно работаем с классами, нафига еще использовать программы?
2. Зачем ходить по oddCOM напрямую, когда есть для этого интерсистемовские макросы?

> x "d ##class("_class_").%BuildIndices(,1)"
Давно уже есть $zobjclassmethod; возвращаемое методом значение нужно проверять.

Перед построением индексов нужно удалить старые через %PurgeIndices().

> s:indexLength=4
flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),fieldValue(3),fieldValue(4),id))

не лучший образец кода, однозначно ))

> w " /строим базовую часть"
Желательно, чтобы у системных утилит был режим "тихого" выполнения, с возвратом
результатов через переменную и %Status

> g skipRecord
Про goto внутри цикла все знают, да ))

И вообще, while для обхода глобали или курсора это зло. Лучше обходить через
for, тогда такие извращения не потребуются.

> s res=$lb(count,countMissIndex)
у таких методов лучше возвращать нормальный %Status, а результирующие переменные
возвращать по ссылке

> openFile(file)
> {q:file=*0*
> c file o file:"NW":*1*
> w:'$test "Файл ",file," не открыт"
> u:$test file
> }
Тоже вместо нормальной обработки ошибок через try\catch или status непонятно
что. Этим, кстати, грешат и почти все "старые" консольные утилиты Интерсистемс.

Любви.
=Сергей Шутов
ООО Димас, Хабаровск
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421962
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
logist, раз пошла такая пьянка про вторую программу - задача была в том, чтобы проверить корректность индексов без удаления текущих (ибо иногда это означает выведение из строя сервера надолго, а также не дает ответа - были ли ошибки в структуре индексов).
BuildIndices и PurgeIndices не подходят.

>1. Если все равно работаем с классами, нафига еще использовать программы?
Работаем с глобалами.Класс чтоли подразумевает единство какое-то данных и методов. Если программа работает сама по себе, то зачем ее пихать в класс? Получим то же извращение, что и в яве.

>2. Зачем ходить по oddCOM напрямую, когда есть для этого интерсистемовские макросы?
Какие?
Мне проще самому разобрать oddCOM, чем найти что-то в документации.

goto в моем случае оправдан, если бы это был однозначно зловредный оператор, его исключили бы из языка.

try catch кажется в каше 5.2 еше нет, поэтому и "грешат" этим старые утилиты :-)))

>> w " /строим базовую часть"
>Желательно, чтобы у системных утилит был режим "тихого" выполнения
В моем случае нужно как раз сообщение о том, в каком месте была ошибка в индексе.
Возраты статуса не нужны, программа не предназначена для автоматического запуска, нужен вывод в файл/терминал.
--------------------------------------------------------------
nonalexandro - я как-то посмотрел в форуме код на оракле, чуть не вырвало, да :-)

PS
А еще программирование на каше для меня скорее хобби, чем обязанность ;-)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421963
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну еще программа брошена недописанной по принципу - ну у меня работает и ладно.
Что видно по методу normalizeData

;-)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422002
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
non-alexandroСтранно что вообще 50т.р. предложили....
Покажи свой. Будет на кого равняться...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422004
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н. , если бы ты работал в моем отделе - переписывал бы код однозначно. Т.ч. все это очень спорно...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422014
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan.Kokov non-alexandroКод cache и эстетичность находятся в разных измерениях... Им не суждено встретиться... Никогда...

Позвольте полюбопытствовать, как вы это поняли?
По собственным эстетическим принципам. Разным мужчинам нравятся различные типы женщин. COS - не для меня, уж очень угловато и неотёсанно...
Ну это конечно оффтоп.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422017
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
non-alexandroCOS - не для меня, уж очень угловато и неотёсанно...
Что "не для тебя" это ладно... Но про "угловат" и "неотесан" это посмешило... На других языках буквы наверное смотрятся круглее и глаже?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422038
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa non-alexandroCOS - не для меня, уж очень угловато и неотёсанно...
Что "не для тебя" это ладно... Но про "угловат" и "неотесан" это посмешило... На других языках буквы наверное смотрятся круглее и глаже?
У языка есть понятие выразительность.
Для меня код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WebRequest := Object clone do(
	handleSocket := method(aSocket,
		aSocket streamReadNextChunk
		request := aSocket readBuffer betweenSeq("GET ", " HTTP")
		f := File with(request) 
		if(f exists, f streamTo(aSocket), aSocket streamWrite("not found"))
		aSocket close
	)
)

WebServer := Server clone do(
	setPort( 8000 )
	handleSocket := method(aSocket, 
		WebRequest clone @handleSocket(aSocket)
	)
)

WebServer start
гораздо понятнее чем тот, что используется в каше.
При этом язык, на котором написан код, мне практически не известен.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422041
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
logist
спасибо за $ZOBJCLASSMETHOD, я не знал, что так можно, действительно красивее.

Код: plaintext
1.
2.
s:indexLength= 4  
flagOK=$d(@indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),fieldValue( 3 ),fieldValue( 4 ),id))
конечно коряво написано, тем более чревато откровенными ошибками, если длина индекса больше того, что заложено в программе. А как можно лучше, при этом не извращаясь больше необходимого и не теряя в скорости?

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

----------
nonalexandro
мне кажется я пишу в стиле ближе к С и кажется довольно читаемо (форматирование поехало конечно)
Я видел коды написанные практически в стиле Int-рутин классов, вот это жесть.
А вообще язык это набор операторов - кирпичей. А чего и как вы из них построить - зависит от тех, кто строит :-)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422050
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПри этом язык, на котором написан код, мне практически не известен.
:-)

А вот меня VisualBasiс раздражает просто.
Жидкий кисель, употреблять невозможно, то что можно написать одной строкой - надо писать пятью.
Тем более начинаешь писать - просто раздражает своими выкидонами.
(Использовал в экселе - редактор атас, строку большую ему не сделай, оператор недописал и перешел на другую строку - вопит об ошибке, просто подсветить то не судьба)

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

Код: plaintext
если бы ты работал в моем отделе - переписывал бы код однозначно.  Т.ч. все это очень спорно...
Спорно, спорно...
В таких боях я гораздо чаще выигрываю, чем проигрываю.
А как бы вы например написали, то есть что по вашему не так в моем коде?

/
Какая-то большая стирка :-)
Но думаю, в любом случае от этого польза будет
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422064
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.А вот меня VisualBasiс раздражает просто...
Так что видимо каждому свое :-)
Как я вас понимаю (с)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422151
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.А как бы вы например написали, то есть что по вашему не так в моем коде?
Я только про стилистику... Например про вот этот кусок:

Код: 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.
 /*Собирает информацию о хранении в специальную переменную storageIndex*/
buildStorageIndex(class)[storageIndex]  
 {k storageIndex
  s storage=$o(^oddCOM(class,"s","Default","D",""))
  while storage'=""
      {
       s storageType=$g(^oddCOM(class,"s","Default","D",storage,22),"listnode")
	   if storageType="listnode"
	       {s i=$o(^oddCOM(class,"s","Default","D",storage,"V",""))
		    while i'=""
               {s field=^oddCOM(class,"s","Default","D",storage,"V",i, 21 )
                s type=$g(^oddCOM(class,"a",field, 40 ))
                s subscript=$g(^oddCOM(class,"s","Default","D",storage, 23 ))
                s storageIndex(field)=$lb(i,subscript,storageType,type)
	            s i=$o(^oddCOM(class,"s","Default","D",storage,"V",i))
               }   
	       }     
	   if (storageType="subnode")||(storageType="node")
	       {s field=^oddCOM(class,"s","Default","D",storage, 21 )
            s type=$g(^oddCOM(class,"a",field, 40 ))
            s subscript=$g(^oddCOM(class,"s","Default","D",storage, 23 ))
            s storageIndex(field)=$lb(i,subscript,storageType,type)
	       }
	   s storage=$o(^oddCOM(class,"s","Default","D",storage))
      }
  q
 }
- Вот это
Код: plaintext
^oddCOM(class,"s","Default","D")
Записал бы в переменную...
- Операторные скобки открываю в той же строке, что и оператор, а закрываю на уровне с оператором.
Примеры:
Код: plaintext
1.
2.
3.
4.
if a= 0  {
}
...
while b< 10  {
}
- Многострочные "куски" разбил бы на процедуры или функции...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422628
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если записать
^oddCOM(class,"s","Default","D")
в переменную, а потом работать с переменной, то теряется прозрачность кода, хуже видно, что же мы на самом деле обращаемся. Мой код несмотря на громоздкость будет читаться лучше.

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

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

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

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

В моем случае алгоритм я не вижу, как разделить алгоритм на независимые части, да и объемность его только кажущаяся. Если присмотреться, то очень большой объем занимает инициализация переменных и пухлые куски кода типа
Код: plaintext
 s:indexLength= 1 ....    s:indexLength= 2       s:indexLength= 3  
которые выполняют на самом деле один шаг алгоритма.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422694
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н. , вот видиш какие у нас "непримиримости".
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422704
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я за скобки кого хошь покусаю!
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422717
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
non-alexandroКод cache и эстетичность находятся в разных измерениях... Им не суждено встретиться... Никогда...

Не, в редакторе каше бывает вполне симпатично.
А вот на сайте да.... Страшненько. Тем более вам синтаксис непривычен.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35423515
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.
Не, в редакторе каше бывает вполне симпатично.
А вот на сайте да.... Страшненько. Тем более вам синтаксис непривычен.
С кашой работал несколько месяцев, в компании здешних завсегдатаев (кстати, привет!). К синтаксису действительно сложно привыкнуть - очень много рудиментальных вещей, тянущихся со времен, когда компы были слабыми и беспомощными :) Обязательные set do и т.п. в начале вызова метода/установке значения переменной. Если не следить, очень просто написать программу, которую никто не поймет.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35423990
Ivan.Kokov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.если записать
^oddCOM(class,"s","Default","D")
в переменную, а потом работать с переменной, то теряется прозрачность кода, хуже видно, что же мы на самом деле обращаемся. Мой код несмотря на громоздкость будет читаться лучше.

А если переменной дать вполне осмысленное имя?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424391
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант я бы написал так (писал не вдаваясь в подробности оптимизации):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
simplyRebuild(file= 0 ) //перестроить все индексы средствами каше
{
	d openFile(file)
	s class=$$$comClassNext("A")
	while class'="" {
		if $$$classIsPersistent(class) {
			w !,"Перестройка индесов ",class
			d $zobjclassmethod(class,"%BuildIndices","",1)
		}
		s class=$$$comClassNext(class)
 	}
 	q 
}

checkAll(repair=0,file=0) public 
{
	d openFile(file)
	s class=$$$comClassNext("A")
	while class'="" {
		d:$$$classIsPersistent(class) checkClass(class,repair)
		s class=$$$comClassNext(class)	
	}
	q
} 

Или такой вариант (мне он больше нравится):

Код: 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.
simplyRebuild(file= 0 ,class="A") //другой вариант
{
	d openFile(file)
 	d {
		s class=$$$comClassNext(class)
		continue:(class="")||'$$$classIsPersistent(class)
		w !,"Перестройка индесов ",class
		d $zobjclassmethod(class,"%BuildIndices","",1)
 	} while class'=""
 	q
}

checkAll(repair= 0 ,file= 0 ,class="A") public //другой вариант
{
	d openFile(file)
 	d {
	 	s class=$$$comClassNext(class)
	 	continue:(class="")||'$$$classIsPersistent(class)
	 	d checkClass(class,repair)
 	} while class'=""
	q
} 

 //Комплексная проверка для класса
checkClass(class,repair= 0 ,file= 0 ) public 
{
	d openFile(file)
	if '$$$comMemberDefined(class,$$$cCLASSstorage,$$$nameDefaultStorageNameGet) {w !,"Класс ",class," не существует или имеет нестандартное хранение" q}
	w !,"Проверка индексов для класса:",class
  
	d checkIndexExist(class,repair)
	d checkIndexCorrect(class,repair)  
	q
}
 
 // проверяет индексные записи на корректность. Пока не проверяет доп-поля                                  
checkIndexCorrect(class,repair=0,file=0)[storageIndex] public
{
	n storageIndex
	d openFile(file)
	if '$$$comMemberDefined(class,$$$cCLASSstorage,$$$nameDefaultStorageNameGet) {w !,"Нестандартное хранение или неверный класс" q}
	s dataStorage=$$$comMemberKeyGet(class,$$$cCLASSstorage,$$$nameDefaultStorageNameGet,$$$cINDEXdata)
	s indexStorage=$$$comMemberKeyGet(class,$$$cCLASSstorage,$$$nameDefaultStorageNameGet,$$$cINDEXextent)
	d buildStorageIndex(class)
	s index=$$$comMemberNext(class,$$$cCLASSindex,"") //собираем индексные поля
	while index'="" {
		//удалим из списка проверки idkey
		continue:$$$comMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXidkey)
		
		s indexLength(index)=$$$comMemberKeyNext(class,$$$cCLASSindex,index,$$$cINDEXproperty)
		f i=1:1:indexLength(index) s indexField(index,i)=$$$comSubMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXproperty,i,$$$cINDEXPROPproperty)

		//собираем дата-поля от индекса	   
		s indexDataList=$p($$$comMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXcompilationsignature),"~",4)
		s indexDataLength(index)=$l(indexDataList,",")
		s:indexDataList'="" indexDataLength(index)=indexDataLength(index)+ 1 

		s indexData(index, 1 )="%%CLASSNAME"
		f i= 1 : 1 :indexDataLength(index) s indexData(index,i+ 1 )=$p(indexDataList,",",i)

		s index=$$$comMemberNext(class,$$$cCLASSindex,index)
	}
	...
	q
 }

Мне кажется, что так более эстетично и читабельно...
А про операторы - язык такой, какой он есть! Другого не дано.. :)

ЗЫ: Для макросов подключаем инки: #Include %systemInclude
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424411
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, с макросами пожалуй лучше.

Только где найти документацию про макросы?
Без знания макросов даже читать готовый код с ними читать тяжелее.

Код: plaintext
1.
2.
3.
4.
while index'="" {
    continue:$$$comMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXidkey)
    /*****/
    s index=$$$comMemberNext(class,$$$cCLASSindex,index)
    }
- повиснет
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424440
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Только где найти документацию про макросы?
Мне как-то Жохов Николай присылал. Но у меня недавно диск погорел... И все, что нажито непомерным трудом... Все же погибло! (с) к/ф Иван Васильевич меняет профессию
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424444
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Макросы можно и самому посмотреть...
Основное - %occEnvirement, %occName, %occReference.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424450
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.
Код: plaintext
1.
2.
3.
4.
while index'="" {
    continue:$$$comMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXidkey)
    /*****/
    s index=$$$comMemberNext(class,$$$cCLASSindex,index)
    }
- повиснет

Точно повиснет... :)
Просто я обычно пишу так:
Код: plaintext
1.
2.
3.
4.
5.
d {
    s index=$$$comMemberNext(class,$$$cCLASSindex,index)
    continue:(index="")||$$$comMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXidkey)
    /*****/
    } while index'=""

А тут в спешке писал не разбираясь..
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424517
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМакросы можно и самому посмотреть...

Неа, не вариант.
Посмотрю я (допустим), но программа будет нечитаемой для других.
Далее, в inc файлах просто define, часто без комментариев, понять и найти например нужное мне
$$$comMemberKeyGet не так просто. + лишняя головная боль при поддржке/переделке.
Отсутствие документации имеет значение.

авторdo {} while
хм, блин, а я к своему стыду эту конструкцию не использовал, и даже не задумывался, есть ли она в каше '
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424709
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИМХО, Макросы лучше читаются, т.к. они имеют вполне осмысленное название. Так жу макросы лучше использовать в виду того, что при изменении функциональности ни чего менять не надо...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35426634
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaесли бы ты работал в моем отделе - переписывал бы код однозначно. Т.ч. все это очень спорно...
Я смотрю никто не обратил внимание на запуск поиска в фоновом режиме
в вашем примере, а жаль. Это что, клиент-серверная технология в отдельно
взятой программе? Полагаете, что это разумно?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35426932
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei ObrastsovЭто что, клиент-серверная технология в отдельно
взятой программе? Полагаете, что это разумно?
Какие у вас варианты?
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427019
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Sergei ObrastsovЭто что, клиент-серверная технология в отдельно
взятой программе? Полагаете, что это разумно?
Какие у вас варианты?
Для начала я бы хотел от вас услышать ответ. Вы же чем-то
руководствовались, выбирая этот вариант.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427321
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем могла провиниться "отдельно взятая программа"?
Из csp-страницы стартуется программка, в которой стартует процесс... Csp-страница снова получает управление... Вы тут какой-то "криминал" усмотрели?
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427469
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaА чем могла провиниться "отдельно взятая программа"?
Из csp-страницы стартуется программка, в которой стартует процесс... Csp-страница снова получает управление... Вы тут какой-то "криминал" усмотрели?

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

CSP должна быть CSP, а программа должна быть программой. Еще кое-что (но не много) можно программировать в Csp, но создание CSP из программы смотрится очень коряво. ИМХО.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427557
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei ObrastsovУ вас что, слишком долго поиск идет?
Может и долго... БД областная, да и запрос может быть "сложным". А в чем криминал-то?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427560
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.создание CSP из программы смотрится очень коряво. ИМХО.
Тут вообще про весь Кащей так говорили...

Как говорят американцы - есть много способов как ободрать кошку.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427568
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начало CSP-шки где-то в другом месте, половина наполнения наверняка там же,
а половина HTML содержимого вперемежку с обработкой данных в программе.
Что-то разобрать в таком случае сложно.

Наши программисты, если обработка слишком сложная/долгая отдельно делают программу подготовки именно данных, а потом эти уже подготовленные данные подхватывает CSP-шка.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427585
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Sergei ObrastsovУ вас что, слишком долго поиск идет?
Может и долго... БД областная, да и запрос может быть "сложным". А в чем криминал-то?
Тогда какой смысл торопиться отдавать пользователю страницу? Что он с ней делать будет
без полученных данных? Плохо, что вы не видите криминала. Хотя бы в том, что процесс
может и не запуститься. В том, что вы не контролируете поиск от начала до конца.
В том, что вы будете использовать непонятно откуда полученные данные, то ли это
отработавший процесс, то ли это кусок от недорезанного прошлого запроса.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427625
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei Obrastsov , столько вопросов. Но не понятна цель...
Думаю, что пора бы и ва начать приводить показывать ваши варианты решений.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427632
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Sergei Obrastsov , столько вопросов. Но не понятна цель...
Думаю, что пора бы и ва начать приводить показывать ваши варианты решений.
Решений, простите, чего? Я не работаю с классами и job использую
только для запуска постоянных фоновых задач. А цель проста, я
пытаюсь выяснить смысл использования job в вашей задаче.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427667
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei ObrastsovА цель проста, я
пытаюсь выяснить смысл использования job в вашей задаче.
Выяснили?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427682
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТогда какой смысл торопиться отдавать пользователю страницу?

Вы работаете с csp? Если нет, то вряд ли можете судить о том, чего надо или не надо отдавать пользователю.

авторЧто он с ней делать будет без полученных данных?
Вы считаете, что в веб приложении уместно ждать хотя бы минуту? Ню-ню.
Страница должна отдаваться сразу же. Другое дело, как эти данные потом поднимать в csp-страницу, как обрабатывать ошибки или ситуацию, когда пользователь двадцать раз нажмет на кнопку, но это в данном случае осталось за кадром, так что оценить сложно.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35427714
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Sergei ObrastsovА цель проста, я
пытаюсь выяснить смысл использования job в вашей задаче.
Выяснили?
Ага, выяснил.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35474120
Dmitry V. Liseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так и не понял, разработчика-то в итоге нашли?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35474179
Dmitry V. Liseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Год назад предлагали 120 тыс. на руки. Но я тогда отказался переезжать в Москву. Ко всему прочему оказалось, что в компании запрещен доступ сотрудников к Интернет. Теперь даже 90 тыс. не дают. В Москве толпы кандидатов - программистов Каше теперь бродят, готовых за еду работать?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35474180
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все не достаточно хороши... Либо "зажрались", "зазнались" т.ч. отказываются работать за 50 т.р. без вычетов...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35474226
Dmitry V. Liseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что больше денег никто особо и не предлагает? По причине отсутствия работодателей? Понятно. С рынком труда на Каше полный ахтунг. Не зря я с него соскочил.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35475101
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по разделу "Работа" в Москве за 50тр пытаются работать уже студенты.
То ли Летограф мелко плавает, то ли топик неправильный...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35475636
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛЕТОГРАФ набирает разных сотрудников с разной зарплатой.
Вот объявление: о вакансиях
Насколько я знаю, ЛЕТОГРАФ готов предложить очень хорошие условия разработчикам, если они могут решать задачи ЛЕТОГРАФ.
Подробности можно узнать в ЛЕТОГРАФ.

Ряд других партнеров также набирают в Москве сотрудников.
Как правило, представители InterSystems в курсе кадровых потребностей партнеров и заказчиков, так что если есть желание найти работу, можно обращаться. Попробуем помочь.

Еще один интересный момент - последнее время практически непрерывно идет обучение новых специалистов Cache' и Ensemble. Так что сообщество разработчиков достаточно активно растет.

Вадим
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35476450
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VadimFПопробуем помочь.
Спасибо за участие. Но ехать в столицу на заработки меньше чем за 90 т.р. "на руки" семейному человеку смысла нет...
А работодатель "сливается" уже на 50...
...
Рейтинг: 0 / 0
76 сообщений из 76, показаны все 4 страниц
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / требуется Ведущий разработчик Cache (Москва)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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