Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Пытаюсь сделать небольшую утилиту для экспорта данных из классов в файл-скрипт с sql запросами, а также для последующего импорта из данного скрипта в базу. Возникли следующие вопросы (попытки поиска по форуму и в документации оказались малоуспешны): 1. Как можно выполнить COS-код из .NET ? Или как из .NET обратиться к методам системных классов Cache для которых не удается сгенерировать соответствующие объекты через CacheNetWizard ? Используемый .NET CacheProvider как-то странно документирован, описывается только малая часть классов и их свойств/методов (в основном про простую работу с объектами и запросами). Очень хотелось бы из .NET получить дерево классов БД (как в утилите CacheNetWizard): 2. Как получить список Namespace'ов на сервере? 3. Как получить список pakages внутри определенного Namespace? 4. Как получить список классов внутри определенного pakage ? 5. Есть несколько взаимосвязанных по relationship классов. Насколько я понимаю внутри этой связи используются ObjID таблиц. При удалении/добавлении записей в таблицы ObjID меняются. Как грамотно сохранить связи между объектами? Возможно есть способ принудительно изменения значений ObjID? Или можно сделать связь на основе значений других идентификаторов сущностей. 6. Как из ClassMethod сделанного на COS можно вернуть результат-запроса в виде набора из нескольких строк (также как это возврщает Query)? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 14:56 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
И еще в догонку :) 7. Как в .NET с помощью Managed Provider'а работать с системными классами, например с %Directory.ClassDefinition ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 15:21 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
при попытке сгенерировать соответствующий proxie-класс для %Directory.ClassDefinition происходит ошибка Код: plaintext 8. Возможно ли создавать proxie-классы для классов системной библиотеки (%классов) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 15:24 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Советую Вам сделать набор собственных классов Cache' для реализации функционала Вашей утилиты. А потом уже сделать proxy этого класса в .Net. Посмотрите документ про API по конфигурированию Cache'. Вадим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 15:50 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Я имел в виду, вызывать системные классы из кода Ваших классов Cache'. Вадим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 15:52 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
авторСоветую Вам сделать набор собственных классов Cache' для реализации функционала Вашей утилиты. А потом уже сделать proxy этого класса в .Net. Пока так и приходиться делать. Просто мне кажется странным отсутствие возможности вызывать напрямую из .NET системные классы. авторПосмотрите документ про API по конфигурированию Cache'. Посмотрел, спасибо. Но описанное там не помогает решить проблему с получением списка namespace'ов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 17:40 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Нашел ответ на вопрос AndreyBark6. Как из ClassMethod сделанного на COS можно вернуть результат-запроса в виде набора из нескольких строк (также как это возврщает Query)? ответ называется User-Written Class Queries решение выглядит приблизительно так Код: 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. Нормально вроде компилируется, но при выполнении этого запроса почему-то происходит подвисание. Так что ответ на вопрос 6 можно считать не полным :) Ответ на вопрос AndreyBark2. Как получить список Namespace'ов на сервере? вроде бы такой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Продолжается поиск (и ожидание :)) ответов на оставльные вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 17:48 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Andrey Bark Нормально вроде компилируется, но при выполнении этого запроса почему-то происходит подвисание. Подвисает? У меня выдаёт ошибку при выполнении. Код: plaintext 1. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 18:05 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Получить список namespace-ов: рылась в документации нашла команду do ^%CD. На запрос надо ввести "?". вот пример из терминала DELTA>d ^%CD Namespace: ? '?' for help. '@' (at-sign) to edit the default, the last namespace name attempted. Edit the line just as if it were a line of code. <RETURN> will leave you in the current namespace. Here are the defined namespaces: %CACHELIB %SYS DELTA DELTA2 DEV DOCBOOK EASTLINE KZ PITER SAMPLES SBARRO USER Может, поможет...)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 18:10 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#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. Кто переменную N за собой таскать будет ? Вполне вероятно что она всегда при вызове фетча пустая - вот вам и бесконечный цикл. Для передачи между этими тремя процедурами данных используйте qHandle! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 18:20 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Александр КобловRow должен быть списком, т.е. set Row=$LB(n) После исправления вроде нормально работает. Спасибо, COS у меня в стадии изучения, поэтому правильнописание хромает. LenRoverрылась в документации нашла команду do ^%CD. На запрос надо ввести "?". Спасибо. Это практически то что нужно. Осталорсь только перекинуть эти данные в .NET :) PtnКто переменную N за собой таскать будет ? Вполне вероятно что она всегда при вызове фетча пустая - вот вам и бесконечный цикл. Для передачи между этими тремя процедурами данных используйте qHandle! Огромное спасибо. После чтения доков по Cache у меня почему то сложилось твердое (и видимо неправильное) убеждения что все переменные он делает глобально-надолго-видимыми, если им не делать new и close. После исправления по вашему совету, подвисать перестало, но к сожалению в результате выполнения запроса в программу приходит пустой ResultSet. Помогите, пожалуйста, довести до победного конца :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 18:35 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Я бы так подправил: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 18:41 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Вот 100% рабочий кусок, но рабоает только в консоли Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Осталось правильно переделать в запрос, чтобы получить результаты в .NET. Вот это пока не получается :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 18:42 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#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. Большое спасибо товарищам Александр Коблов и Ptn Вопросы 2 и 6 закрыты. Остались вопросы 1, 3-5, 7, 8 Еще немного, еще чуть-чуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 18:49 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Andrey Bark1) Как можно выполнить COS-код из .NET ? Если небольшой кусок, то xecute. Ещё можете посмотреть в области DocBook класс DocBook.Utils метод ExecuteCOS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 15:50 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Александр КобловЕсли небольшой кусок, то xecute. Ещё можете посмотреть в области DocBook класс DocBook.Utils метод ExecuteCOS Спасибо за ответ. Но дело в том, что команда xecute - это команда COS. А надо выполнить произволный COS-код из среды C#.NET. пока получается получить доступ только к своим классам посредстом сгенерированных для них прокси-классов. А как выполнить произволный COS-код из кода C# пока остается загадкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 02:07 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Может я что-то не понял, но что мешает создать метод в классе с параметром этого метода -- строка на COS. типа Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 12:13 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Александр КобловМожет я что-то не понял, но что мешает создать метод в классе с параметром этого метода -- строка на COS. типа Код: plaintext 1. 2. 3. Все правильно, это просто я не сообразил о чем речь. Хорошее решение, но оставется проблема взаимосвязанного исполнения блоков COS-кода. Т.к. судя по документации xecute выполняет только одну строку COS-кода. И что особенно неприятно Код: plaintext т.е. как я понимаю к переменным инициализированным в предыдущем запуске xecute не будет доступа в последующих запусках xecute. Что с этим можно сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 13:09 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Ставьте ProcedureBlock=0 в параметрах вызывающего метода и все будет видеть. Правда про new не забудьте тогда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 13:13 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Спасибо. Вопрос Andrey Bark1. Как можно выполнить COS-код из .NET ? можно считать закрытым. Хотя решение не идеально и позволяет выполнять только небольшие куски кода, скорее даже одиночные команды. Но это лучше чем ничто. Поиметь более прямой доступ из C#.NET к системным классам Cache, кроме как создавать свои промежуточные Cache-классы, а потом и прокси для них, видимо невозможно. Ладно утремся :) Остались вопросы 3-5, 7, 8 С благодарностью за полученные ответы предвкушаю последующие :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2007, 03:10 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
3,4 Наверняка есть классы в пакете %Dictionary, которые вам помогут. Но лично мне удобней ползать по глобалам ^oddDEF, ^oddCOM 5 не понял, что вы имеет в виду. Возможно вы путаете ID и OREF объекта? OREF меняется при каждом открытии объекта и идентифицирует его только в пределах процесса. ID постоянен (его кажется вообще нельзя изменить легальным методами) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2007, 07:49 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.3,4 Наверняка есть классы в пакете %Dictionary, которые вам помогут. Но лично мне удобней ползать по глобалам ^oddDEF, ^oddCOM Спасибо за наводку, почитаю. Блок А.Н.5 не понял, что вы имеет в виду. Возможно вы путаете ID и OREF объекта? OREF меняется при каждом открытии объекта и идентифицирует его только в пределах процесса. ID постоянен (его кажется вообще нельзя изменить легальным методами) Речь именно про ID. Представим что у нас в базе лежат данные для двух связанных по релатионшипу класов. Мы экспортируем эти данные в какой-либо файл, вместе со значениями полей ID. После этого пользователь продолжает работать с базой. И внутренние значения ID продолжают расти. После этого нам нужно загрузить в базу ранее сохраненные данные, но так чтобы сязи между ними не потерялись. Но при их добавлении они получат уже новые значения ID. При этом Cache не позволяет (насколько я понял) принудительно задавать/изменять значения поля ID. Встает вопрос: Как грамотно сохранить связи между объектами? И как их потом загружать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2007, 10:27 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
>Как грамотно Грамотно так не делать :-) А если уж так делать, то тщательно продумывать протокол выгрузки-загрузки-сихнхронизации. Если вы выгружате данные в виде глобалов, то они назад закачиваются в точно таком же виде, с теми же идешиками. Но это чревато, приведу пришедшие в голову примеры: 1.Запись индексирована по полю А, при выгрузке индекс выгружаете вместе с данными. Запись в базе изменяется, создается новая индексная запись, а старая удаляется. Если вы восстановите глобал поверх новых данных, то у вас будет одна запись данных, и две индексные записи с разными индексироваными значениями. 2. Класс А имеет поле АА, указывающее на класс Б, класс Б имеет поле ББ, указывающее на класс А. Сохраняем данные класса А в глобал, меняем данные классов А и Б, и восстанавливаем класс А. Что имеем в ссылках - непонятно. А с учетом того, что они могут быть индексированы - вообще ужас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2007, 11:55 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Да, не закончил, если не хотите заморачиваться с восстановлением целостности данных, то выгрузка-загрузка оправдана только при удалении предыдущих данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2007, 12:00 |
|
||
|
Вопросы по доступу к метаданным
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Грамотно так не делать :-) А если уж так делать, то тщательно продумывать протокол выгрузки-загрузки-сихнхронизации. Пока, приходиться перед загрузкой удалять глобалы с данными и индексами для загружаемых классов. Блок А.Н.Если вы выгружате данные в виде глобалов, то они назад закачиваются в точно таком же виде, с теми же идешиками. Нет, данные выгружаются в подобие sql-скрипта. Точнее планируется так сделать. Осталось решить задачу по сохранению информации о связях. Можно сохранить например существующие значения ID, и значения ссылающихся полей (ссылки на ID). Но при импорте из этого скрипта возникает проблема восстановления связей (поскольку ID не обязательно идут по порядку и могут, в общем случае, быть разрежены). Блок А.Н.Но это чревато, приведу пришедшие в голову примеры: 1. ... 2. ... Честно говоря, вообще не хочу с импортом глобалов целиком связываться. Блок А.Н.Да, не закончил, если не хотите заморачиваться с восстановлением целостности данных, то выгрузка-загрузка оправдана только при удалении предыдущих данных. Пока так и делаю. Но не знаю как связи восстановить и загрузке в чистую базу. PS: обсуждение очень способствует пониманию проблемы, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2007, 13:11 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=34767262&tid=1559231]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 260ms |
| total: | 383ms |

| 0 / 0 |
