|
выборка последнего движения
|
|||
---|---|---|---|
#18+
АлексейОно ... 4 секунды против 13-ти ... я выбрал scan. SCAN-то зачем? Если стоит задача отображения в Grid, то можно использовать SET RELATION. Без дополнительного SET SKIP TO получится связь один-к-одному. Дело в том, что в FoxPro можно настроить связь по частичному совпадению ключа. По первым символам. Надо только "сконструировать" специфический индекс. Итак, основная связь осуществляется по значению поля postn, но в пределах одного и того же значения поля postn надо упорядочить записи по убыванию значения поля dper. Т.е. первой должна быть запись с максимальным значением dper. Если dper - это дата, то проще "перевести" ее в число. Поскольку разница двух перменных типа Date - это количество дней, то если вычесть dper из некоторой, заведомо большой даты, то и получим упорядочивание по убыванию. Затем переводим полученное число в строку. Если поле postn типа Integer, то получаем такое выражение индекса Код: plaintext 1. 2.
Теперь остается настроить связь Код: plaintext 1. 2.
Разумеется, чтобы работал поиск по частичному совпадению ключа должна быть выполнена настройка SET EXACT OFF Но, поскольку это настройка по умолчанию, то проблем быть не должно. Функция BINTOC() использована для уменьшения длины ключа. Для перевода в символьное представление можно использовать и STR(). Но, поскольку в данном случае, удалять ведущие пробелы нельзя, то ключ получится больше по размеру. А значит, бОльшего размера будет индексный файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2008, 14:51 |
|
выборка последнего движения
|
|||
---|---|---|---|
#18+
ВладимирМФункция BINTOC() использована для уменьшения длины ключа. Добавлю что BINTOC() нельзя использовать при SET COLLATE "RUSSIAN", только при "MACHINE" ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2008, 14:59 |
|
выборка последнего движения
|
|||
---|---|---|---|
#18+
ВладимирМSCAN-то зачем? :-) ну это я образно сказал. конечно именно так и сделано : индекс чтобы нужная запись была сверху, отношение во вторую таблицу, и даже не scan а replace all ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2008, 15:48 |
|
выборка последнего движения
|
|||
---|---|---|---|
#18+
АлексейОВладимирМSCAN-то зачем? :-) ну это я образно сказал. конечно именно так и сделано : индекс чтобы нужная запись была сверху, отношение во вторую таблицу, и даже не scan а replace all Все-равно не понятно. Зачем выполнять модификацию? Разве факта настроенной связи недостаточно? Почему нельзя отобразить информацию напрямую из связанной таблицы без "перекачки" по REPLACE? Если же нужна именно модификация, то почему нельзя наложить фильтр (не все же записи модифицируются), чтобы ограничить изменяемые записи и уйти от сканирования всей таблицы? Собственно, что необходимо сделать-то? Какова решаемая задача, а не выбранный способ решения? Для чего изначально планировался запрос, описанный в начале темы? Что с этой выборкой потом происходило? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2008, 15:58 |
|
выборка последнего движения
|
|||
---|---|---|---|
#18+
ВладимирМ, я прекрасно понимаю где в моем решении неоптимальности, но они обусловлены неким глобальным решением. впрочем мы это с Вами обсуждали здесь повторюсь, что для целей высокой скорости разработки прикладных приложений я стараюсь реализовывать многое не столько с точки зрения оптимальности под конкретный случай а с точки зрения "черных ящиков" под многие случаи. и поэтому в данном случае эта выборка: курсор по которому пользователь хочет выбирать этих сотрудников используя как фильтры, частичные поиски так и "поиски глазами". а для прикладного программиста это выглядит как обычная таблица - ну просто для быстроты разработки программистом невысокой квалификации. еще один довод: когда всетаки дело дойдет до SQL то переписать выборку на select будет всетаки проще чем искоренять файл-серверные решения из прикладной программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2008, 16:29 |
|
выборка последнего движения
|
|||
---|---|---|---|
#18+
Ну, дело хозяйское. Хотя должен заметить, что приложение, изначально написанное как файл-серверное, просто так перевести в клиент-серверное не получится. И термин "проще" здесь не уместен. Это принципиально другая идеология построения приложения. Поэтому, писать файл-серверное приложение исходя из предположения, что когда-нибудь в будущем оно будет переписано на клиент-серверное и поэтому следует писать вот так, а не так - не имеет смысла. Переписано будет ВСЕ! Весь модуль работы с данными. Не факт, что и интерфейс останется неизменным. Простой довод: в клиент-серверном приложении никто не будет тащить на клиента 40 тысяч записей. Это слишком долго. Значит, все ваши рассуждения о пользе SQL в данном случае теряют смысл. Не будет в клиент-серверной технолгии подобного решения в принципе. Задача будет решена другими способами. Принципиально другими. Кроме того, "универсальные" решения хороши в теории. На практике все-таки реализуют "коллекции" частных решений. Иерархии классов. Поэтому, опять же, решать задачу "в общем случае", исходя из предположения, что частное решение можно будет приспособить и для решения других задач особого смысла не имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2008, 17:34 |
|
|
start [/forum/topic.php?fid=41&gotonew=1&tid=1586911]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
10ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 391ms |
total: | 556ms |
0 / 0 |