powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CASE и SELECT не дружат? Vfoxpo7
11 сообщений из 11, страница 1 из 1
CASE и SELECT не дружат? Vfoxpo7
    #34857117
DmitryOrlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
CASE и SELECT не дружат? Vfoxpo7
    #34857212
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вместо case надо использовать iif(,,)
...
Рейтинг: 0 / 0
CASE и SELECT не дружат? Vfoxpo7
    #34857219
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
CASE и SELECT не дружат? Vfoxpo7
    #34857220
bn+-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если попробовать iif() вместо case
...
Рейтинг: 0 / 0
CASE и SELECT не дружат? Vfoxpo7
    #34857237
mvictor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а разве vfp поддерживает CASE ?
...
Рейтинг: 0 / 0
CASE и SELECT не дружат? Vfoxpo7
    #34857678
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумеется, команды 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
CASE и SELECT не дружат? Vfoxpo7
    #34857856
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не помню, есть ли в 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
CASE и SELECT не дружат? Vfoxpo7
    #34857870
Inlist существует с ДОС-овых времен.
...
Рейтинг: 0 / 0
CASE и SELECT не дружат? Vfoxpo7
    #34857877
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Inlist() был уже в FP2.x, только надо уточнить, это опечатка или действительно надо в двух случаях 1. Кроме того, у функции Inlist() не может быть больше 24 параметров.
...
Рейтинг: 0 / 0
CASE и SELECT не дружат? Vfoxpo7
    #34858351
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Вашем конкретном примере проще использовать 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
CASE и SELECT не дружат? Vfoxpo7
    #34858745
DmitryOrlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Код: 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
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CASE и SELECT не дружат? Vfoxpo7
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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