Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
Про "М" можно рассуждать долго и интересно... В Каше же, судя по всему, за последние несколько лет мало что поменялось. Нормально писать на нем можно, - если досконально знаешь документацию и имеешь замечательную память, чтобы в нужный момент вспомнить, что в описании такого-то класса действительно есть приписка мелким шрифтом - "При перегреве издает неприятные запахи" - если он куплен, оплачивается саппорт (замечательный на мой взгляд), и самое главное - используешь только очень простые решения, и достаточно проверенные решения. Шаг в сторону карается закапыванием в огромной яме с дерьмом документации и отладки. Есть огромный ангар с инструментами и материалами, но когда нужно сколотить табуретку, выясняется, что или молоток оказался пластилиновым, или доски - фарфоровые... Я прилагаю неимоверные усилия, чтобы не использовать непроверенные инструменты (и другим не давать), но вот вчера "вступил"... В расчетном свойстве экземпляра одного из классов нужно было собрать набор значений расчетных свойств экземпляров других классов. А оно - то собирается, то нет... Там с этими расчетными свойствами вообще-то песня и неприятностей много (не программу пишешь, а по болоту по кочкам прыгаешь), но тут уж совсем все плохо стало - все перепробовал... в тех объектах, откуда собираем, свойства есть, а в том, куда собираем, нет... падла. Сделал примерчик для саппорта - "по мотивам"... но отправлять не буду - лучше НЕ БУДУ использовать разрекламированный ими же ("пользуйте!", "быстрее!", "активно развивается!"... бл*), %ResultSet.SQL в расчетных полях... Примерчик такой: Код: 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. В каком-то из вариантов можно получить ошибку "<UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1" От жеж спасибо! Что бы я делал, не увидь эту ашипку... ума не приложу... В общем, "не ходите дети, в Африку гулять..." Неправ-то м.б. и я - пропустил что-то в документации опять... Но такие моменты очень разочаровывают в Каше. Cache for Windows (x86-32) 2009.1.2 (Build 602) Tue Oct 20 2009 10:02:03 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 14:08 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
Можете интерпретировать то что просходит? А то пока навскидку непонятно, разбираться голова после рабочего дня пухлая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 14:29 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
kolesov, Я по-прежнему люблю (можно сказать обожаю) Каше! Код должен выглядеть красиво, и надо иметь возможность его тестировать. Метод класса, спрятанный в параметрах свойства выглядит некрасиво и работает также. Попробуйте так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Теперь имеем возможность писать тесты на метод GetDesc(), да и выглядит получше ;) P.S.: Любите Кашу, она вкусная и полезная! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 14:51 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Можете интерпретировать то что просходит? А то пока навскидку непонятно, разбираться голова после рабочего дня пухлая. При попытке из расчетного свойства, использующего %ResultSet.SQL, считать некое расчетное свойство, также использующее в своем расчете %ResultSet.SQL происходит зацикливание (или ошибка, зависит от того, выбирается ли что-то еще кроме расчетного свойства в первом запросе) Лечится заменой %ResultSet.SQL(нерабочее свойство Desc1) на %DynamicQuery:SQL (вполне себе рабочее Desc2). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 15:08 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
doublefint Код должен выглядеть красиво, и надо иметь возможность его тестировать. Метод класса, спрятанный в параметрах свойства выглядит некрасиво и работает также. Вот на мой взгляд обойтись без метода в данном случае - вполне красиво... аскетично как-то ;) Кроме того, как показал опыт, со временем между свойством и его расчетом может быть что-то вставлено (другой метод или другое свойство или много их), что испортит читабельность... Если в коде расчета 5-10 строк, мне удобнее и симпатишнее так ;) в смысле, было удобнее... Но похоже, придется делать так, как Вы и сказали... иначе неприятности ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 15:14 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
kolesov, 5-10 строк это, вообще-то, рекомендуемый размер кода метода. К тому же, Вы используете внутри сложный объект, каждый вызов которого может вызвать ошибку. Да и по смыслу там спрятан метод класса - обработка множества экземпляров класса. Надо выносить в метод, иначе выйдет боком. "вполне красиво... аскетично как-то" будет потом выглядеть так: Код: plaintext 1. 2. 3. 4. "со временем между свойством и его расчетом может быть что-то вставлено (другой метод или другое свойство или много их), что испортит читабельность..." - не может быть! Поменяем реализацию метода :) Так не только "красивше" и компактней, но и соответствует некоторым принципам кодирования, например: "однажды и только однажды","test first" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 15:40 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
Если будет время, перечитайте начало топика и улыбнитесь. Хотя, как я иногда Вас понимаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 15:45 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
да тут еще читабельность кода с вычисиляемыми полями улучшается если заменить s {Desc}= val на s {*}= val эти команды для поля Desc равнозначны но во втором случае удобнее, видно сразу что этому полю идет присваивание такого то значения, а в перовм случае можно и ошибиться с названием поля и обращение к методам класса по-моему лучше заменить на ##class({%%CLASSNAME}) потому как объекта там все равно нету, этот код используется для SQL а там не используются объекты _________________________________ Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 15:55 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
DAiMor, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 17:16 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
А весь код внутри описания поля специально сделан ? Ничего хорошего из этого не выйдет... Нужно вызывать метод класса и передовать туда параметры. А так галиматся какая то кто объявляет и следить за переменными непонятно. Понадобиться код изменить - придется перекомпилировать ВСЕ классы и программы где есть SQL с выборкой этих полей. Плюс у вас Execute() отсутствует насколько мне видно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 18:45 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
kolesovВот на мой взгляд обойтись без метода в данном случае - вполне красиво... аскетично как-то ;) Потом возьмите любой другой класс или программу - и вставьте туда Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 18:48 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
"Плюс у вас Execute() отсутствует насколько мне видно" А там %ResultSet.SQL, ему не надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2010, 19:22 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
PtnПонадобиться код изменить - придется перекомпилировать ВСЕ классы и программы где есть SQL с выборкой этих полей. Видимо, это и происходит - время от времени в компиляцию какого-то малозначительного класса "цепляется" компиляция тучи, с виду несвязанных с ним, классов. В общем-то, коллеги, вы меня убедили... Однако отношения к Каше не поменялось - формально я ничего не нарушал. В документации нет условия, что Каше работает, только если код "красивый". Программирование для меня - работа, а не хобби. И относиться к нему как к фэн-шую (с соответствующими затратами времени), ой как неохота. Лучше больше внимания уделять семье, друзьям... пиву, в конце концов ;) Работа должна быть на втором месте... И не мешать жить. Я так думаю. Всем спасибо - много нового узнал и понял. Серьезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2010, 03:24 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
kolesovОднако отношения к Каше не поменялось - формально я ничего не нарушал. В документации нет условия, что Каше работает, только если код "красивый". А условия что Каше легко и просто обязуется выполнять и компилировать любой код были ? В SqlComputeCode вообще всё не очень просто - в ранних версиях там было что то вроде ограничения на объем кода. Лично у меня не получалось написать длинное выражение. doublefintА там %ResultSet.SQL, ему не надо Хм... видать какой то новый класс - обладает какой либо фишкой ? А то лично я не вижу смысла смешивать похожие классы с разным набором методов - тут %ResultSet.SQL за ним сразу обычный %ResultSet ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2010, 07:17 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
PtnХм... видать какой то новый класс - обладает какой либо фишкой ? А то лично я не вижу смысла смешивать похожие классы с разным набором методов - тут %ResultSet.SQL за ним сразу обычный %ResultSet IS развивают объектную прослойку. Сам удивился, когда не нашел Execute. Просто %ResultSet-а в документации Cache2k9 нет, а этот %ResultSet.SQL - c кэшированием, берет SQL и проверяет его наличие в кэше. Старый код работает по-прежнему Код: plaintext 1. 2. 3. 4. 5. 6. 7. kolesovИ относиться к нему как к фэн-шую (с соответствующими затратами времени), ой как неохота. Ну это как ООП, или переход с реляционных СУБД на Сache - просто смена способа мышления. Сначала тяжело, потом не понимаешь как можно по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2010, 11:08 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
doublefintПросто %ResultSet-а в документации Cache2k9 нетРади интереса гляньте в Cache2k9: [Documentation] > [Development Guides] > [Using Caché SQL] > [Using Dynamic SQL] Налицо параллельное описание обоих ResultSet'ов. Вот новички удивятся, читая такое... при том, что внятного описания различий сходу не найти (только из анализа Documatic'а что-то немного проясняется). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2010, 11:42 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
doublefint Код должен выглядеть красиво, и надо иметь возможность его тестировать. Метод класса, спрятанный в параметрах свойства выглядит некрасиво и работает также. Попробуйте так: ... Теперь имеем возможность писать тесты на метод GetDesc(), да и выглядит получше ;) P.S.: Любите Кашу, она вкусная и полезная! :) Код: 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. Переписал, запускаю в терминале: >d ##class(a.test).test() sql: SELECT Desc1 FROM a.test WHERE ID = 1 sql1: SELECT p FROM a.test WHERE ID = 1 data1: sdfsd ОШИБКА #5540: SQLCODE: -400 Сообщение: Unexpected error occurred: <UNDEFINED>%0Afirst+6^RS.CacheSql190.1 *%objcsd(2,1)1 Если поменять s var = 2 , то все ок. Мало того, что все-равно не работает... Обратите внимание, насколько стало лучше отлаживать (я про сообщение об ошибке ;) И кстати, ..Get..({ID}) ведь и не работало никогда в SqlComputeCode... нужно все-таки класс указывать... а я Вам поверил - опять 20 минут развлечений с ошибкой <Метод или свойство 'GetDesc' не существует в данном классе> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 07:32 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
Продолжим: Код: 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. 0 rs: 1@RS.CacheSql266 2 rs: 2@RS.CacheSql267 3 4 desc: testData ОШИБКА #5540: SQLCODE: -400 Сообщение: Unexpected error occurred: <UNDEFINED>%0Afirst+6^RS.CacheSql266.1 *%objcsd(11,1)1 Т.о. В шаг 1 мы не попали! Хотя резалтсеты разные, очень похоже на то, что вызов метода %Next() второго как-то портит первый - это одной RS.CacheSql260.1 известно, но она - RS.CacheSql260.1 .OBJ !!! Со всеми проистекающими. Вывод: В местах, где при использовании %ResultSet.SQL необходимо получить в него расчетное свойство, также использующее %ResultSet.SQL нас ждут неприятности. Сравниваем с презентацией ИС (kudinov-perfomnace-management.ppt, адрес точно не помню, но с их сайта): kudinov-perfomnace-management.pptСтарый класс – %Library.ResultSet. Новый класс – %ResultSet.SQL %ResultSet.SQL значительно быстрее %Library.ResultSet, сравнимо со встроенным SQL. %ResultSet.SQL постоянно совершенствуется. Ввели в заблуждение? Я этот %ResultSet.SQL много где использовать успел... в т.ч. во многих расчетных свойствах... (далее текст отсутствует) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 08:47 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
Напишу-ка я все же в саппорт ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 08:53 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
DAiMOR, kolesov, Прошу прощения и посыпаю себе голову пеплом за Код: plaintext 1. Код: plaintext 1. kolesov, я, измученный чувством вины, переписал Ваш пример так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 13:13 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
doublefintПравильно будет так Код: plaintext 1. Как показал опыт, не всегда - если класс унаследован, и свойство считается для предка, вы получите не реальный расчет (для конкретного потомка), а расчет для предка - с его нулевой, или довольно скудной, логикой. doublefint///Возникает вопрос зачем вообще использовать ResultSet если есть четкое указание ID ///может лучше $zobjclassmethod ? "В реале" это было два класса - верхний перебирал несколько экземпляров нижних и собирал их описания. Здесь пример компактный просто - понятно, что он бестолковый... т.к. он - демонстрация баги doublefint///Здесь нет вычисляемого имени поля, можно использовать встроенный SQL ///но из-за прямого ID может лучше все таки $zobjclassmethod ? Т.о. есть 3 варианта - два из них я привел, вы добавили третий... Я же не говорю, что нечто нельзя сделать - я говорю, что это нечто нельзя сделать с помощью разрекламированного %ResultSet.SQL. Все, кроме него, проклятого, безусловно, будет работать ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 13:31 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
и свойство считается для предка правильно читать "свойство считается в контексте предка" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 13:33 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
Если Вам подходит, можно воспользоваться LIST вместо цикла: Код: plaintext В версии 2010.1 появился новый класс %SQL.Statement для работы с динамическими запросами. Как пишут на англоязычном форуме - скорость до 3-ёх раз выше, чем у %ResultSet. Во Владивосток по транссибу теперь можно совершить виртуальное путешествие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 19:05 |
|
||
|
Кто там еще любит Каше? <UNDEFINED>%0AmBuncommitted+1^RS.CacheSql494.1 *%objcsd(2,11)1
|
|||
|---|---|---|---|
|
#18+
Начиная, с 2010.1 рекомендация - использовать %SQL.Statement. Из документации по Dynamic SQL: "%SQL.Statement methods are the preferred way to executes a Dynamic SQL query. You can also use the %ResultSet.SQL class or the %Library.ResultSet class to query the database." %ResultSet.SQL быстрее %Library.ResultSet (особенно при переборе большого числа записей результата) начиная с версии 5.2. Но абсолютных чудес не бывает, для всех динамических запросов при первом выполнении необходима компиляция запроса, т.е. накладные расходы. Поэтому стоит динамические запросы использовать только тогда, когда это необходимо, и не забывать про передачу параметров, чтобы для плодить серию запросов ... Ошибок при выполнении кода в любом случае быть не должно, поэтому в случае нахождения какой-то проблемы стоит завести ее в WRC. Также можно написать на support@intersystems.ru, support@intersystems.com. В этом случае просьба указывать название вашей организации в ключе (поле CustomerName) , т.к. не всегда по русскому названию очевидно ее написание латинскими буквами или привычное для вас наименование вашей организации может не совпадать с ее наименованием для InterSystems (холдинги, группы компаний... ) Но лучше сразу ввести в WRC, т.к. это официальный путь решения проблем заказчиков InterSystems, у вас есть возможность установить приоритет проблемы, нет вероятности, что письмо попадет в спам... Если у вас нет WRC аккаунта, напишите заявку на support@intersystems.ru с указанием организации, фамилии и имени пользователя, контактного телефона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 13:59 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=36472785&tid=1558196]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
139ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 475ms |

| 0 / 0 |
