Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CASE и SELECT не дружат? Vfoxpo7 / 11 сообщений из 11, страница 1 из 1
09.10.2007, 15:03
    #34857117
DmitryOrlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
Pаранее извиняюсь если вопрос покажется тупым. Vfoxpo7, нечасто приходится работать с ним.
Делаю запрос, вот кусок:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT ;
  	MAIN.DATAOPER, MAIN.NNDOC, MAIN.SUMMA, ;
  	CASE ;
        WHEN LEFT(MAIN.DT_SCHET, 2 )='60' THEN  1  ;
        WHEN LEFT(MAIN.DT_SCHET, 2 )='76' THEN  1  ;
        ELSE  0  ;
        END ;
        AS cVidDD ;
  	from main ;
  	WHERE MAIN.DT_SCHET=cSchet AND MAIN.dt_code = cAnalit AND MAIN.dataoper >= dbp AND MAIN.dataoper <= dep;
  	and main.task<>"MF"
Не выходит каменный цветок, при сохранении ругается что команда содержит неправильные команды/слова.
Может как-то по другому сделать?
...
Рейтинг: 0 / 0
09.10.2007, 15:20
    #34857212
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
Вместо case надо использовать iif(,,)
...
Рейтинг: 0 / 0
09.10.2007, 15:21
    #34857219
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
Код: plaintext
1.
2.
3.
CASE ;
        WHEN LEFT(MAIN.DT_SCHET, 2 )='60' THEN  1  ;
        WHEN LEFT(MAIN.DT_SCHET, 2 )='76' THEN  1  ;

у лисы такого нет

есть в 9-й версии
ф-я icase
...
Рейтинг: 0 / 0
09.10.2007, 15:21
    #34857220
bn+-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
А если попробовать iif() вместо case
...
Рейтинг: 0 / 0
09.10.2007, 15:25
    #34857237
mvictor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
а разве vfp поддерживает CASE ?
...
Рейтинг: 0 / 0
09.10.2007, 16:52
    #34857678
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
Разумеется, команды Select-SQL имеет некий стандарт. Но при использовании этих команд в различных средах программирования в процессе "перевода" или адаптации к тому или иному языку возникают диалекты. Некоторые особенности и ограничения, налагаемые на команды Select-SQL той или иной средой программирования.

Так вот, в FoxPro подобная конструкция синтаксически не корректная. Для VFP7 следует писать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT ;
	MAIN.DATAOPER, MAIN.NNDOC, MAIN.SUMMA, ;
	IIF(LEFT(MAIN.DT_SCHET, 2 )='60',  1 , IIF(LEFT(MAIN.DT_SCHET, 2 )='76',  1 ,  0 ) ) as cVidDD ;
from main ;
WHERE MAIN.DT_SCHET=cSchet AND ;
	MAIN.dt_code = cAnalit AND ;
	MAIN.dataoper >= dbp AND ;
	MAIN.dataoper <= dep AND ;
	main.task<>"MF"

Причем, в случае настройки по умолчанию SET ANSI OFF можно даже не выделять первые 2 символа по LEFT(), поскольку сравнение и так будет идти до истечения символов в самой короткой строке сравнения

Собственно команда DO CASE...ENDCASE в FoxPro тоже есть, но внутри команд Select-SQL ее использование недопустимо.
...
Рейтинг: 0 / 0
09.10.2007, 17:28
    #34857856
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
не помню, есть ли в 7-ке inlist
если есть, то вот так будет лучше
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT ;
	MAIN.DATAOPER, MAIN.NNDOC, MAIN.SUMMA, ;
	IIF(inlist(LEFT(MAIN.DT_SCHET, 2 ),'60','76'),  1 ,  0 ) as cVidDD ;
from main ;
WHERE MAIN.DT_SCHET=cSchet AND ;
	MAIN.dt_code = cAnalit AND ;
	MAIN.dataoper >= dbp AND ;
	MAIN.dataoper <= dep AND ;
	main.task<>"MF"
...
Рейтинг: 0 / 0
09.10.2007, 17:32
    #34857870
CASE и SELECT не дружат? Vfoxpo7
Inlist существует с ДОС-овых времен.
...
Рейтинг: 0 / 0
09.10.2007, 17:36
    #34857877
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
Inlist() был уже в FP2.x, только надо уточнить, это опечатка или действительно надо в двух случаях 1. Кроме того, у функции Inlist() не может быть больше 24 параметров.
...
Рейтинг: 0 / 0
09.10.2007, 20:31
    #34858351
Игорь2004
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
В Вашем конкретном примере проще использовать INLIST().

Но такая функция есть (для всех версий FoxPro, включая DOS )
ICASE() «непосредственный» CASE условный переход

Вы можете загрузить русскую версию библиотеки по адресу
ftp://ftp-developpez.com/nikiforov/udfs/st_denis_russian.zip
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ;
  	MAIN.DATAOPER, MAIN.NNDOC, MAIN.SUMMA, ;
  	ICASE(LEFT(MAIN.DT_SCHET, 2 )='60',  1 , LEFT(MAIN.DT_SCHET, 2 )='76',  1 ,  0 ) ;
           AS cVidDD ;
  	from main ;
  	WHERE MAIN.DT_SCHET=cSchet AND MAIN.dt_code = cAnalit AND MAIN.dataoper >= dbp AND MAIN.dataoper <= dep;
  	and main.task<>"MF"

ICASE() Функция определенная пользователем, «непосредственный» CASE условный переход
Соответствует встроенной функции Visual FoxPro 9.0, за исключением количества принимаемых параметров, в данной функции максимальное количество принимаемых параметров равняется 25, тогда как в Visual FoxPro 9.0 оно равняется 100.

ICASE( lCondition1, eResult1 [, lCondition2, eResult2] ... [, eOtherwiseResult])
Тип возвращаемого значения зависит от того, какой рездультат будет возвращен фукцией eResult1, eResult4, eResult3 и т.д.

Параметры
lCondition оцениваемое логическое выражение, если lCondition ложно (.F.), ICASE() оценивает следующее логическое условие и возвращает соответствующий eResult для первого встреченного истинного условия (.T.).
Если lCondition оценивается как (.NULL.), функция считает условие lCondition ложью (.F.).
eResult результат возвращаемый фукцией, если условие lCondition истинно (.T.).
eOtherwiseResult результат возвращаемый фукцией, если все условия lCondition ложны (.F.).
Если параметр eOtherwiseResult не передан и если все условия lCondition ложны (.F.) функция возвращает (.NULL.).
...
Рейтинг: 0 / 0
10.10.2007, 00:49
    #34858745
DmitryOrlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CASE и SELECT не дружат? Vfoxpo7
ВладимирМ
Код: plaintext
1.
	IIF(LEFT(MAIN.DT_SCHET, 2 )='60',  1 , IIF(LEFT(MAIN.DT_SCHET, 2 )='76',  1 ,  0 ) ) as cVidDD ;

Как говаривал С.С. Горбунков - "на его месте должен был быть я". Затмение какое-то видать на мозги напало. Конечно же, это самый что ни на есть простой способ решить проблему.

прошелмимо
Код: plaintext
1.
	IIF(inlist(LEFT(MAIN.DT_SCHET, 2 ),'60','76'),  1 ,  0 ) as cVidDD ;

Вот этот вариант понравился, он наглядный, в скобках трудно запутаться. Его и взял.

Игорь2004Вы можете загрузить русскую версию библиотеки по адресу
Спасибо, хороший вариант, но я не смогу эту библиотеку прилинковать потому, что движок не мой, я к нему только источники данных правлю.

Спасибо, други, выручили очень.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CASE и SELECT не дружат? Vfoxpo7 / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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