Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запросом получить список наименьших значений из некольких полей / 10 сообщений из 10, страница 1 из 1
11.05.2012, 22:08
    #37790170
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
Задаю вопрос сюда, хотя надо для VBA.
Таблица price.dbf с несколькими столбцами (полями), в них числовые данные, например:

Код: plaintext
1.
2.
3.
4.
5.
6.
price1	price2	price3	price4
1	2	3	4
2	6	4	0
0	3	1	3
1	4	3	4
3	4	0	3
0	0	0	0
Нужно запросом получить массив с одним столбцом наименьших чисел в каждой строке, больших нуля (либо 0, если все числа - нули). А именно, результат должен быть таким:

least
1
2
1
1
3
0

Если бы было только 2 поля, то всё получается. Что-то примерно такое (код для VBA):

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
strCnnString = "Driver={Microsoft Visual FoxPro Driver};DriverID=277;UID=;PWD=;" & _
"SourceDB=" & DirPath & ";;SourceType=DBF;Exclusive=No;" & _
"BackgroundFetch=Yes;Collate=RUSSIAN;Null=Yes;Deleted=Yes;"
cnn.Open strCnnString
Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient
sqlString = "SELECT  iif(price1<=0,price2,iif(price2<=0,price1,iif(price1<price2,price1,price2))) FROM price"
Set rst = cnn.Execute(sqlString)
Data = rst.GetRows


Но конструкция из iif для четырёх полей уже не воспринимается: вылетает ошибка "SQL expression is too complex"

Есть ли функция типа НАИМЕНЬШИЙ(список данных) в Excel, но для SQL-запроса?
Вроде как есть что-то типа LEAST(dat1, ...), но для ORACLE и в sql-запросе не работает.

Ещё плохой нюанс: структура таблицы такая, что работает только {Microsoft Visual FoxPro Driver}, а в нём на VBA не работают ни UNION, ни вложеные SELECT. Только JOIN.
...
Рейтинг: 0 / 0
12.05.2012, 05:21
    #37790323
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
А что, Provider=vfpoledb;Data Source=DirPath не помогает разве?
В нем же и UNION ALL, и подзапросы в FROM есть...
Попробуйте...
...
Рейтинг: 0 / 0
12.05.2012, 09:09
    #37790394
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
AndreTM,

1. На одном компьютере на строке
Код: vbnet
1.
oConnection.Open cConnection

появляется ошибка
Run-time error '3706'
Не удаётся найти указанного поставщика. Вероятно, он установлен неправильно

Хотя в References стоят галки на Microsoft ActiveX Data Objects 2.8 Library и Microsoft ActiveX Data Objects Recordset 2.8 Library
Что-то надо ещё подключать?

2. На другом компе ошибки '3706' не появляется (и, кстати, в References галки именно только там же, что и на первом компьютере), но появляется ошибка "Syntax error". Что-то не так в строке запроса. Если строку запроса переделать на простую, то всё работает.
...
Рейтинг: 0 / 0
12.05.2012, 09:26
    #37790419
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
А там референсы и не нужны: вообще-то, в коде - позднее связывание...
Для начала - убрать надо все неопределившиеся связи с библиотеками;
затем - что там с синтаксисом? - я ведь тестировал "на ходу", но только на 32-bit системах... вполне вероятно, что под W2k8 x64 код может повести себя непредсказуемо - именно из-за провайдера , которого там изначально немА...
...
Рейтинг: 0 / 0
12.05.2012, 13:47
    #37790984
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
Да уж... :-)
Позднее связывание, неопределившиеся связи с библиотеками...
Я, наверное, зря полез в это: я совсем в этом не понимаю. Использую sql-запросы только в макросах Excel. По ходу дела пришлось овладеть минимальным уровнем языка запросов, а вот в "провайдерах" и прочем не разбираюсь: просто на этом форуме дали мне некую рабочую схему, её и использую, немного изменяя только строку запроса.

Наверное, придётся через sql-запрос брать все 4 поля с ценами и создать отдельную процедуру уже в VBA для обработки полученного массива на предмет поиска наименьших цен по каждой строке.

AndreTM, большое спасибо за желание помочь.
...
Рейтинг: 0 / 0
12.05.2012, 16:21
    #37791314
novichok_86
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
tolikt,

Проверено в Visual FoxPro 9.0 SP1 - работает

SELECT c3.min_price FROM (SELECT c1.rn,NVL(c2.mnpr,0) as min_price FROM (SELECT p1.rn,MIN(p1.pr) as mnpr FROM (SELECT price_1 as pr,RECNO() as rn FROM price UNION ALL SELECT price_2 as pr,RECNO() as rn FROM price UNION ALL SELECT price_3 as pr,RECNO() as rn FROM price UNION ALL SELECT price_4 as pr,RECNO() as rn FROM price ORDER BY rn) p1 GROUP BY p1.rn) c1 LEFT JOIN (SELECT p1.rn,MIN(p1.pr) as mnpr FROM (SELECT price_1 as pr,RECNO() as rn FROM price UNION ALL SELECT price_2 as pr,RECNO() as rn FROM price UNION ALL SELECT price_3 as pr,RECNO() as rn FROM price UNION ALL SELECT price_4 as pr,RECNO() as rn FROM price ORDER BY rn) p1 WHERE p1.pr#0 GROUP BY p1.rn) c2 ON c2.rn=c1.rn) c3
...
Рейтинг: 0 / 0
12.05.2012, 19:17
    #37791557
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
toliktЕсть ли функция типа НАИМЕНЬШИЙ(список данных) в Excel, но для SQL-запроса?
Насколько я знаю, такого нет. Точнее, есть, но не совсем то, что Вам нужно.

Ведь Вам и функция НАИМЕНЬШИЙ() не очень-то подойдет. Вы будете вынуждены вызывать ее дважды. Сначала для первого наименьшего, и если он 0, то искать второе наименьшее.

В общем случае, запрос, вероятно, сконструировать можно. Только очень уж он громоздкий получится. Для примера попробуйте "расшифровать" то, что привел novichok_86 . Ну, один раз Вы в этой "каше" разберетесь, а когда через месяц придется что-то подправить сможете вспомнить "кто на ком стоял"

Думаю, значительно более простым решением будет написать макрос в Excel. Т.е. из таблицы DBF делается выборка "как есть", а уже в макросе Excel выполняется поиск минимального не нулевого значения.
...
Рейтинг: 0 / 0
12.05.2012, 20:48
    #37791619
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
Увы, строка от novichok_86 тоже не работает... А Visual FoxPro 9.0 SP1 только для этого устанавливать, думаю, не очень целесообразно....
До совсем непонятного RECNO() так и не дошёл... Но выяснил, что ошибка syntax error происходит из-за того, что не работают вложенные SELECT. Даже простенькая строка запроса SELECT pr1 FROM (SELECT price1 AS pr1 FROM price).
Зато выяснил, что работает UNION. Уже хорошо: использую где-нибудь в другой задаче.

В общем, как я и предполагал и как посоветовал ВладимирМ, лучше всего наименьшую цену вычислять средствами VBA в уже полученном sql-запросом массиве. Тем более, что алгоритм очевидный.

Спасибо всем.
...
Рейтинг: 0 / 0
13.05.2012, 09:28
    #37791872
neznajka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
Если считаете, что UNION может вам пригодиться в другой задаче, тогда и RECNO() тоже может когда-нибудь пригодиться - эта штуковина просто выдаёт номер записи, а в запросе от novichok_86 применяется для сортировки в ORDER BY ...
Успехов!
...
Рейтинг: 0 / 0
13.05.2012, 14:32
    #37792088
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросом получить список наименьших значений из некольких полей
Сам FoxPro устанавливать не надо. Просто есть два драйвера для работы с таблицами FoxPro.

Один - это драйвер ODBC. Именно его Вы и использовали. Но этот драйвер последний раз обновлялся для версии VFP6. Поэтому и не поддерживает вложенные запросы. Они на тот момент не поддерживались в FoxPro.

Другой - это драйвер OLE DB (ADO). Он был разработан для версии VFP9. Поддерживает вложенные запросы. Только при его использовании для создания соединения будет работать запрос novichok_86 (хотя сам запрос избыточный).

Оба драйвера можно бесплатно скачать с сайта MicroSoft.

Просто для Вашей задачи - это слишком сложное (избыточное) решение. В данном случае значительно проще сделать обработку уже полученной выборки на стороне Excel через макросы.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запросом получить список наименьших значений из некольких полей / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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