21.07.2003, 13:47 | #1 |
Участник
|
Очень хочется "прыгать" по записям
Здравтсвуйте всем.
Как-нибудь можно перепрыгивать к конкретной записи в таблице, что-то типа метода MoveTo(int)? /************************************/ InventTable Table1; ; select * from Table1 order by ItemName; MoveTo(100); //Вот такое надо |
|
21.07.2003, 14:01 | #2 |
Moderator
|
В принципе, наверное, можно через while select сделать. Что-то у меня такое ощущение, что по быстродействию это будет эквиваленто всем остальным способам, если конечно же такие найдутся.
|
|
21.07.2003, 14:04 | #3 |
Moderator
|
А вообще, как правило такие вопросы свидетельствуют о неправильной постановке задачи. Что требуется сделать в общем случае ?
|
|
21.07.2003, 14:16 | #4 |
Moderator
|
Да, еще:
вот так Вашу задачу можно было бы выполнить в T-SQL: select (select count(*) from table as table2 where table2.id<=table.id) as rank , id,description from table as table1 having rank = 100 order by id То же способ не идеальный, так как join таблицы саму на себя никогда не был хороши решением, но при небольщом количестве записей в таблице все-таки получше, чем курсор. Остается только переложить этот запрос на X++ Или можно воспользоваться классами Connection, Statement, ResultSet. Они позволят выполнить этот запрос к БД напрямую, без преобразования sql выражения. Вот кстати еще один метод решения этой задачи в T-SQL: select count (table2.id) as rank, table1.id, table1.description from table as table1 inner join table as table2 on tree1.id >= table2.id group by table1.id, table1.description having rank = 100 order by rank Хотя, может кто-то предложит решение этой задачи более Аксаптовсими методами |
|
21.07.2003, 14:34 | #5 |
Участник
|
Если я скажу, что хочу реализовать бинарный поиск на темповой таблице и сравнить по скорости со стандартным селектом. Что с того будет?
На практике сталкивался со случаем, когда такой подход приносил ощутимые результаты, но это было на С++ && ADO, а вот здесь не знаю даже с какой стороны подступиться-знаний маловато |
|
21.07.2003, 14:56 | #6 |
Moderator
|
Цитата:
Если я скажу, что хочу реализовать бинарный поиск на темповой таблице и сравнить по скорости со стандартным селектом.
Немного оффтопа - однажды я попробовал переписать Аксаптовскую функцию посика подстроки в строке, так как стандартный вариант не удовлетворял меня по быстродействию. Для этого я потратил кучу своего времени реализовал на X++ алгоритм Бойера - Мура. Оказывается зря - мой вариант работал раз в 10 медленнее стандартного варианта. И это при том, что данный алгоритм считается одним из лучших. Все дело в том, что Аксапта интерпретирует X++ и он никогда не будет работать быстрее, чем нативный код. Мой алгоритм был написан на X++, а стандартный вариант был реализован в системном классе. Переписав свой алгоритм на C++, реализовав его в виде dll и вызвов его из Аксапты я все таки получил незначительный выигрыш перед Аксаптовским вариантом. Но вывод, который я сделал - бесполезно придумывать хорошие алгоритмы, пока они написаны на X++ они всегда будут уступать в быстродействии коду, реализованному в виде системных классов и функций. Цитата:
Что с того будет?
|
|
21.07.2003, 15:50 | #7 |
Участник
|
Спасибо.
Я уже и забыл, что он интерпретируемый 3 раза Сделал, чтобы вывод отчета в Excel был в несколько раз быстрее чем стандртный отчет, хотел еще время формирования уменьшить... Ну, и .... с этим X++ . Напишу полностью на C++, все равно отчет в Excel выводится. |
|
21.07.2003, 16:12 | #8 |
Moderator
|
Цитата:
Напишу полностью на C++, все равно отчет в Excel выводится.
В таком случае тебе никто не мешает воспользоваться не Аксаптовскими средствами. Например, Crystal Reports - ускоряет разработку отчетов в несколько раз и не требует программистов, хорошо знающих Аксапту. |
|
21.07.2003, 20:24 | #9 |
Участник
|
Re: Очень хочется "прыгать" по записям
Добавлю.
Цитата:
Изначально опубликовано Diman
Как-нибудь можно перепрыгивать к конкретной записи в таблице, что-то типа метода MoveTo(int)? С точки зрения Аксапты коркретной записью является запись с заданным RecID. Поэтому в Аксапте позиционирование на "конкретную" запись делается следующим образом: Код: select * from Table where table.RecID = myRecID Почему-то мне кажется, что вопрос не к аксапте, а вообще к технологии баз данных и к SQL'ям. Стоит почитать о деревьях и бинарном поиске на www.sql.ru Например, http://sdm.viptop.ru/articles/sqltrees.html http://www.sql.ru/articles/mssql/010...eesInSQL.shtml http://www.osp.ru/win2000/sql/2001/05/970.htm |
|
22.07.2003, 09:52 | #10 |
Moderator
|
Цитата:
Возможности спозиционироваться в таблице на запись с определенным номером нет. И это правильно, если подумать.
|
|
22.07.2003, 10:23 | #11 |
Участник
|
Цитата:
Поэтому в Аксапте позиционирование на "конкретную" запись делается следующим образом: select * from Table where table.RecID = myRecID
Это скорее не позиционирование, а выборка конкретной записи. А позиционирование я делаю примерно так. PHP код:
|
|
22.07.2003, 11:30 | #12 |
Участник
|
Это позиционирование на 23 сверху запись?
Не знал. Век живи - век учись. |
|
22.07.2003, 11:49 | #13 |
Участник
|
Это позиционирование на запись у которой RecId == 23
Ты же в своём примере откуда-то берёшь переменную myRecID. Но у тебя получается выборка конкретной записи, а у меня перемещение(позиционирование) на неё. |
|
22.07.2003, 11:50 | #14 |
Moderator
|
Цитата:
Это позиционирование на 23 сверху запись?
Цитата:
Век живи - век учись.
p.s. Прошу прощения. Опоздал. |
|
22.07.2003, 19:32 | #15 |
Участник
|
Yuri Safronov, а... позиционирование в форме... я думал про позиционирование в выборке... Спасибо.
Андре. Нет не проверил. Ввожу. Извините. Постараюсь исправиться |
|
22.07.2003, 19:50 | #16 |
Moderator
|
Цитата:
Нет не проверил. Ввожу. Извините. Постараюсь исправиться
|
|
22.07.2003, 20:08 | #17 |
Участник
|
ок
|
|
12.08.2003, 15:16 | #18 |
Пенсионер
|
Цитата:
Изначально опубликовано Diman
Сделал, чтобы вывод отчета в Excel был в несколько раз быстрее чем стандртный отчет... |
|
13.08.2003, 10:12 | #19 |
Участник
|
2 blokva:
Дело в том, что вывод с использованием автоматизации реализуется через маршаллинг/демаршаллинг, а это удовольствие не из дешевых. А вот операция с файлами проходит намного быстрее. Вот примерный алгоритм: 1. Создать ASCII файл например при помощи класса AsciiIo. (Если надо с форматированием я использую *.htm формат) 2. Создать экземпляр MS Excel через COM 3. А вот теперь можно открыть файл и навести окончательный лоск на листе используя автоматизацию. Вроде все. PS Только вот рекоммендую сначала ознакомиться с форматом *.htm файлов, которые генерит Office. И определиться с версиями Office у пользователей. |
|