AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.07.2003, 13:47   #1  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
Очень хочется "прыгать" по записям
Здравтсвуйте всем.
Как-нибудь можно перепрыгивать к конкретной записи в таблице, что-то типа метода MoveTo(int)?
/************************************/
InventTable Table1;
;
select * from Table1 order by ItemName;
MoveTo(100); //Вот такое надо
Старый 21.07.2003, 14:01   #2  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
В принципе, наверное, можно через while select сделать. Что-то у меня такое ощущение, что по быстродействию это будет эквиваленто всем остальным способам, если конечно же такие найдутся.
Старый 21.07.2003, 14:04   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
А вообще, как правило такие вопросы свидетельствуют о неправильной постановке задачи. Что требуется сделать в общем случае ?
Старый 21.07.2003, 14:16   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Да, еще:


вот так Вашу задачу можно было бы выполнить в 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  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
Если я скажу, что хочу реализовать бинарный поиск на темповой таблице и сравнить по скорости со стандартным селектом. Что с того будет?
На практике сталкивался со случаем, когда такой подход приносил ощутимые результаты, но это было на С++ && ADO, а вот здесь не знаю даже с какой стороны подступиться-знаний маловато
Старый 21.07.2003, 14:56   #6  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Если я скажу, что хочу реализовать бинарный поиск на темповой таблице и сравнить по скорости со стандартным селектом.
Хм.. Интересная идея.

Немного оффтопа - однажды я попробовал переписать Аксаптовскую функцию посика подстроки в строке, так как стандартный вариант не удовлетворял меня по быстродействию. Для этого я потратил кучу своего времени реализовал на X++ алгоритм Бойера - Мура. Оказывается зря - мой вариант работал раз в 10 медленнее стандартного варианта. И это при том, что данный алгоритм считается одним из лучших.
Все дело в том, что Аксапта интерпретирует X++ и он никогда не будет работать быстрее, чем нативный код. Мой алгоритм был написан на X++, а стандартный вариант был реализован в системном классе.
Переписав свой алгоритм на C++, реализовав его в виде dll и вызвов его из Аксапты я все таки получил незначительный выигрыш перед Аксаптовским вариантом. Но вывод, который я сделал - бесполезно придумывать хорошие алгоритмы, пока они написаны на X++ они всегда будут уступать в быстродействии коду, реализованному в виде системных классов и функций.


Цитата:
Что с того будет?
Ну, например, зная, что это временные таблицы я не стал бы приводить sql запросы, так как все равно Вы не сможете воспользоваться Statement.
Старый 21.07.2003, 15:50   #7  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
Спасибо.
Я уже и забыл, что он интерпретируемый 3 раза
Сделал, чтобы вывод отчета в Excel был в несколько раз быстрее чем стандртный отчет, хотел еще время формирования уменьшить...
Ну, и .... с этим X++ .
Напишу полностью на C++, все равно отчет в Excel выводится.
Старый 21.07.2003, 16:12   #8  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Напишу полностью на C++, все равно отчет в Excel выводится.
Если ты работаешь со стороны клиента, то ты в принципе не должен заботиться о переносе своего решения на другие версии СУБД и Аксапты.
В таком случае тебе никто не мешает воспользоваться не Аксаптовскими средствами. Например, Crystal Reports - ускоряет разработку отчетов в несколько раз и не требует программистов, хорошо знающих Аксапту.
Старый 21.07.2003, 20:24   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
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  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Возможности спозиционироваться в таблице на запись с определенным номером нет. И это правильно, если подумать.
Как правило, такие вопросы возникают, когда люди хотят реализовать постраничный вывод результатов запроса. Например, в форумах.
Старый 22.07.2003, 10:23   #11  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Регистрация: 21.08.2002
Адрес: Москва
Цитата:
Поэтому в Аксапте позиционирование на "конкретную" запись делается следующим образом: select * from Table where table.RecID = myRecID
2mazzy
Это скорее не позиционирование, а выборка конкретной записи.
А позиционирование я делаю примерно так.

PHP код:
Common common;
int iRecId=23;
;

common.RecId iRecId;

DataSource1_ds.findRecordcommon ); 
__________________
yurisafronov@mail.ru
skype: y.safronov
Старый 22.07.2003, 11:30   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Это позиционирование на 23 сверху запись?
Не знал.

Век живи - век учись.
Старый 22.07.2003, 11:49   #13  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Регистрация: 21.08.2002
Адрес: Москва
Это позиционирование на запись у которой RecId == 23
Ты же в своём примере откуда-то берёшь переменную myRecID.
Но у тебя получается выборка конкретной записи, а у меня перемещение(позиционирование) на неё.
__________________
yurisafronov@mail.ru
skype: y.safronov
Старый 22.07.2003, 11:50   #14  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Это позиционирование на 23 сверху запись?
Нет. Это позиционирование на запись у которой recId = 23.

Цитата:
Век живи - век учись.
Ты и правду в это поверил ? Или людей в заблуждение вводишь ?

p.s. Прошу прощения. Опоздал.
Старый 22.07.2003, 19:32   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Yuri Safronov, а... позиционирование в форме... я думал про позиционирование в выборке... Спасибо.

Андре. Нет не проверил. Ввожу. Извините. Постараюсь исправиться
Старый 22.07.2003, 19:50   #16  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Нет не проверил. Ввожу. Извините. Постараюсь исправиться
Mazzy - никаких наездов . Кстати, я написал "поверил", а не "проверил". По-моему в данном варианте мое сообщение звучит более дружелюбно.
Старый 22.07.2003, 20:08   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
ок
Старый 12.08.2003, 15:16   #18  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цитата:
Изначально опубликовано Diman
Сделал, чтобы вывод отчета в Excel был в несколько раз быстрее чем стандртный отчет...
Если не секрет, как это тебе удалось?
Старый 13.08.2003, 10:12   #19  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
2 blokva:
Дело в том, что вывод с использованием автоматизации реализуется через маршаллинг/демаршаллинг, а это удовольствие не из дешевых. А вот операция с файлами проходит намного быстрее.

Вот примерный алгоритм:
1. Создать ASCII файл например при помощи класса AsciiIo. (Если надо с форматированием я использую *.htm формат)
2. Создать экземпляр MS Excel через COM
3. А вот теперь можно открыть файл и навести окончательный лоск на листе используя автоматизацию.
Вроде все.

PS Только вот рекоммендую сначала ознакомиться с форматом *.htm файлов, которые генерит Office. И определиться с версиями Office у пользователей.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
"BinData" против "Файл на дискe" ATimTim DAX: Программирование 8 08.12.2004 18:20
Очень хочется проводить отборочную по фикс. курсу.... Hamster DAX: Функционал 6 27.09.2004 14:19
Журнал переноса->Строки->Поле "Количество" . Нужен "0" по умолчанию вместо ATimTim DAX: Функционал 5 26.06.2004 12:17
Как сбросить флаг "Используется" в форме "Складской журнал" ATimTim DAX: Функционал 1 24.06.2004 19:19
"LIKE" и "OR" в "qbds" @x DAX: Программирование 14 20.01.2004 13:20
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:28.