powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выборка последнего движения
6 сообщений из 31, страница 2 из 2
выборка последнего движения
    #35739905
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейОно ... 4 секунды против 13-ти ... я выбрал scan.
SCAN-то зачем? Если стоит задача отображения в Grid, то можно использовать SET RELATION. Без дополнительного SET SKIP TO получится связь один-к-одному.

Дело в том, что в FoxPro можно настроить связь по частичному совпадению ключа. По первым символам. Надо только "сконструировать" специфический индекс.

Итак, основная связь осуществляется по значению поля postn, но в пределах одного и того же значения поля postn надо упорядочить записи по убыванию значения поля dper. Т.е. первой должна быть запись с максимальным значением dper.

Если dper - это дата, то проще "перевести" ее в число. Поскольку разница двух перменных типа Date - это количество дней, то если вычесть dper из некоторой, заведомо большой даты, то и получим упорядочивание по убыванию. Затем переводим полученное число в строку.

Если поле postn типа Integer, то получаем такое выражение индекса

Код: plaintext
1.
2.
select k2
INDEX ON  BINTOC(postn) + BINTOC({^ 2100 - 01 - 01 } - dper)

Теперь остается настроить связь

Код: plaintext
1.
2.
select k1
SET RELATION TO BintoC(postn) INTO k2

Разумеется, чтобы работал поиск по частичному совпадению ключа должна быть выполнена настройка

SET EXACT OFF

Но, поскольку это настройка по умолчанию, то проблем быть не должно.

Функция BINTOC() использована для уменьшения длины ключа. Для перевода в символьное представление можно использовать и STR(). Но, поскольку в данном случае, удалять ведущие пробелы нельзя, то ключ получится больше по размеру. А значит, бОльшего размера будет индексный файл.
...
Рейтинг: 0 / 0
выборка последнего движения
    #35739922
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМФункция BINTOC() использована для уменьшения длины ключа.
Добавлю что BINTOC() нельзя использовать при SET COLLATE "RUSSIAN", только при "MACHINE"
...
Рейтинг: 0 / 0
выборка последнего движения
    #35740048
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМSCAN-то зачем? :-)
ну это я образно сказал.
конечно именно так и сделано : индекс чтобы нужная запись была сверху, отношение во вторую таблицу, и даже не scan а replace all
...
Рейтинг: 0 / 0
выборка последнего движения
    #35740078
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейОВладимирМSCAN-то зачем? :-)
ну это я образно сказал.
конечно именно так и сделано : индекс чтобы нужная запись была сверху, отношение во вторую таблицу, и даже не scan а replace all
Все-равно не понятно. Зачем выполнять модификацию? Разве факта настроенной связи недостаточно? Почему нельзя отобразить информацию напрямую из связанной таблицы без "перекачки" по REPLACE?

Если же нужна именно модификация, то почему нельзя наложить фильтр (не все же записи модифицируются), чтобы ограничить изменяемые записи и уйти от сканирования всей таблицы?

Собственно, что необходимо сделать-то? Какова решаемая задача, а не выбранный способ решения? Для чего изначально планировался запрос, описанный в начале темы? Что с этой выборкой потом происходило?
...
Рейтинг: 0 / 0
выборка последнего движения
    #35740159
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, я прекрасно понимаю где в моем решении неоптимальности, но они обусловлены неким глобальным решением. впрочем мы это с Вами обсуждали здесь
повторюсь, что для целей высокой скорости разработки прикладных приложений я стараюсь реализовывать многое не столько с точки зрения оптимальности под конкретный случай а с точки зрения "черных ящиков" под многие случаи. и поэтому в данном случае эта выборка: курсор по которому пользователь хочет выбирать этих сотрудников используя как фильтры, частичные поиски так и "поиски глазами". а для прикладного программиста это выглядит как обычная таблица - ну просто для быстроты разработки программистом невысокой квалификации.
еще один довод: когда всетаки дело дойдет до SQL то переписать выборку на select будет всетаки проще чем искоренять файл-серверные решения из прикладной программы.
...
Рейтинг: 0 / 0
выборка последнего движения
    #35740340
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, дело хозяйское.

Хотя должен заметить, что приложение, изначально написанное как файл-серверное, просто так перевести в клиент-серверное не получится. И термин "проще" здесь не уместен. Это принципиально другая идеология построения приложения.

Поэтому, писать файл-серверное приложение исходя из предположения, что когда-нибудь в будущем оно будет переписано на клиент-серверное и поэтому следует писать вот так, а не так - не имеет смысла. Переписано будет ВСЕ! Весь модуль работы с данными. Не факт, что и интерфейс останется неизменным.

Простой довод: в клиент-серверном приложении никто не будет тащить на клиента 40 тысяч записей. Это слишком долго.

Значит, все ваши рассуждения о пользе SQL в данном случае теряют смысл. Не будет в клиент-серверной технолгии подобного решения в принципе. Задача будет решена другими способами. Принципиально другими.

Кроме того, "универсальные" решения хороши в теории. На практике все-таки реализуют "коллекции" частных решений. Иерархии классов. Поэтому, опять же, решать задачу "в общем случае", исходя из предположения, что частное решение можно будет приспособить и для решения других задач особого смысла не имеет.
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выборка последнего движения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]