powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / запрос iif(AND
10 сообщений из 10, страница 1 из 1
запрос iif(AND
    #37269228
anrio13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Появился вопрос по сложному запросу. Помогите пожалуйста!
необходимо из двух таблиц kadr и prof выбрать ряд полей и осуществить сложный запрос с расчетом уровня выполняемых работ человеком по формуле (Kadr.zp1/Prof.virab) с учетом разрядной сетки ,где
3,87 - 1 разряд
4,26 - второй
5.23 - третий и т д
0,39, 0,97 - разница между разрядами

Делаю такой запрос
SELECT Prof.kodprof, Prof.virab, Kadr.zp1,;
IIF(AND((Kadr.zp1)/Prof.virab>3.87,(Kadr.zp1)/Prof.virab<4.26),(((Kadr.zp1)/Prof.virab-3.87)/0.39)+1,IIF(AND((Kadr.zp1)/Prof.virab>4,26,(Kadr.zp1)/Prof.virab<5.23),(((Kadr.zp1)/Prof.virab-4.26)/0.97)+2));
FROM ;
bd!prof ;
INNER JOIN bd!kadr ;
ON Prof.kodprof = Kadr.kodprof

выдает ошибку missing Comma (,)
в чем моя ошибка?
...
Рейтинг: 0 / 0
запрос iif(AND
    #37269269
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anrio13Появился вопрос по сложному запросу. Помогите пожалуйста!
необходимо из двух таблиц kadr и prof выбрать ряд полей и осуществить сложный запрос с расчетом уровня выполняемых работ человеком по формуле (Kadr.zp1/Prof.virab) с учетом разрядной сетки ,где
3,87 - 1 разряд
4,26 - второй
5.23 - третий и т д
0,39, 0,97 - разница между разрядами

Делаю такой запрос
SELECT Prof.kodprof, Prof.virab, Kadr.zp1,;
IIF(AND((Kadr.zp1)/Prof.virab>3.87,(Kadr.zp1)/Prof.virab<4.26),(((Kadr.zp1)/Prof.virab-3.87)/0.39)+1,IIF(AND((Kadr.zp1)/Prof.virab>4,26,(Kadr.zp1)/Prof.virab<5.23),(((Kadr.zp1)/Prof.virab-4.26)/0.97)+2));
FROM ;
bd!prof ;
INNER JOIN bd!kadr ;
ON Prof.kodprof = Kadr.kodprof

выдает ошибку missing Comma (,)
в чем моя ошибка?

И далее
Возвращает одно из двух заданных значений в зависимости от величины логического выражения.


IIF(lExpression, eExpression1, eExpression2)



Параметры
lExpression
Определяет логическое выражение, для которого вычисляется функция IIF( ).

eExpression1, eExpression2
Если значение логического выражения lExpression = True (.T.), то возвращается значение eExpression1 , а выражение eExpression2 не вычисляется. Если значение логического выражения lExpression = False (.F.) или равно null (.NULL.), то возвращается значение eExpression2, а выражение eExpression1 не вычисляется.
...
Рейтинг: 0 / 0
запрос iif(AND
    #37269451
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да с iff-и все нормально.. просто откудо-то придумал функцию and(.t.,.t.)->.t.
есть оператор and .t. and .t. -> .t.
Ненужные скобки тоже не к чему.4.26 через запятую написал. Въехать в описанную задачу сложно но предположу что хотел ты хотел сделать нечто типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create cursor Prof (kodprof i,virab i)
insert into Prof values ( 1 , 20 )
insert into Prof values ( 2 , 30 )
insert into Prof values ( 3 , 40 )

create cursor Kadr (kodprof i,zp1 i)
insert into Kadr values ( 1 ,  80 )
insert into Kadr values ( 2 ,  150 )
insert into Kadr values ( 3 ,  40 )

SELECT Prof.kodprof, Prof.virab, Kadr.zp1,;
IIF(Kadr.zp1/Prof.virab> 3 . 87  AND Kadr.zp1/Prof.virab< 4 . 26 ,;
   (Kadr.zp1/Prof.virab- 3 . 87 )/ 0 . 39 + 1 ,;
   IIF(Kadr.zp1/Prof.virab> 4 . 26  AND Kadr.zp1/Prof.virab< 5 . 23 ,;
       (Kadr.zp1/Prof.virab- 4 . 26 )/ 0 . 97 + 2 ,;
        000000 . 00 ));
FROM ;
prof ;
INNER JOIN kadr ;
ON Prof.kodprof = Kadr.kodprof
естественно вместо 0 вконце вставь что надо
...
Рейтинг: 0 / 0
запрос iif(AND
    #37269507
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТАК подобные задачи не решаются. Необходима дополнительная таблица-справочник со списком разрядов и диапазоном коэффициентов

1 разряд = от 0 до 3,87
2 разряд = от 3,88 до 4,26
3 разряд = от 4,27 до 5,23
4 разряд = от 5,24 до 99999 (бесконечности)

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
* Разрядная сетка
create cursor curClass (fromValue N( 5 , 2 ), toValue N( 5 , 2 ), numClass I, Description C( 10 ))
insert into curClass values ( 0 ,  3 . 87 ,  1 , "1 разряд")
insert into curClass values ( 3 . 88 ,  4 . 26 ,  2 , "2 разряд")
insert into curClass values ( 4 . 27 ,  5 . 23 ,  3 , "3 разряд")
insert into curClass values ( 5 . 24 ,  99999 ,  4 , "4 разряд")

* Запрос
select ;
	Prof.kodprof, ;
	Prof.virab, ;
	Kadr.zp1, ;
	curClass.NumClass, ;
	curClass.Description ;
FROM bd!prof ;
INNER JOIN bd!kadr ON Prof.kodprof = Kadr.kodprof ;
inner join curClass ON round(Kadr.zp1/Prof.virab, 2 ) between curClass.fromValue and curClass.toValue
...
Рейтинг: 0 / 0
запрос iif(AND
    #37269981
anrio13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ , а можно пояснить что ознaчают некоторые функции например Round? и почему в фразе (fromValue N(5,2), toValue N(5,2) именно 5 и 2, а не 7 и 4 к примеру?
...
Рейтинг: 0 / 0
запрос iif(AND
    #37270073
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>что ознaчают некоторые функции например Round?
Округление. В хелп.
>и почему в фразе (fromValue N(5,2), toValue N(5,2) именно 5 и 2, а не 7 и 4 к примеру?
Это число с фиксированной точкой: 2 дробных разряда и 2 (=5-2-1(точка)) десятичных. В хелп. Именно столько, наверное, просто потому, что в примере нет цифр, которые бы не поместились в (5,2)
...
Рейтинг: 0 / 0
запрос iif(AND
    #37270075
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в смысле, 2 целых разряда и 2 десятичныз :)
...
Рейтинг: 0 / 0
запрос iif(AND
    #37270461
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir>и почему в фразе (fromValue N(5,2), toValue N(5,2) именно 5 и 2, а не 7 и 4 к примеру?
Это число с фиксированной точкой: 2 дробных разряда и 2 (=5-2-1(точка)) десятичных. В хелп. Именно столько, наверное, просто потому, что в примере нет цифр, которые бы не поместились в (5,2)
Ну и, кроме того, все желающие уже ознакомились с форматом записи полей в DBaseIII/IV.
N (numeric) хранится "as is", то есть не только десятичная точка присутствует в таблице, а и место под знак "-"...
...
Рейтинг: 0 / 0
запрос iif(AND
    #37270572
anrio13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин задание усложнилось(
оказалось, что надо чтобы получалось значение исходя из Prof.tip если tip=станочники, то считается по разрядам = 3.87;4.26;5.23;6.58;7.75 , а если tip=прочее, то по другим разрядам = 3.52;3.87.4.75;5.28;5.99
при этом еще в этом запросе нужно будет вводить другие формулы типа Count и SUM (ну это просто)

вопрос если создать два курсора с разрядами, то как и куда вводить условие для выбора формулы расчета????? Пока попытался понять ваши примеры, но осознать весь этот код не вышло да еще и нового пришлось добавить и естественно не пашет

автор* создаю курсор1
create cursor curClass (fromValue N(5,2), toValue N(5,2), numClass I, Description C(10))
insert into curClass values (0, 3.87, 1, "1 разряд")
insert into curClass values (3.88, 4.26, 2, "2 разряд")
insert into curClass values (4.27, 5.23, 3, "3 разряд")
insert into curClass values (5.24, 5.81, 4, "4 разряд")
insert into curClass values (5.82, 6.58, 5, "5 разряд")
insert into curClass values (6.59, 7.75, 6, "6 разряд")

* создаю курсор2
create cursor curC (fromValue N(5,2), toValue N(5,2), numC I, Description C(10))
insert into curC values (0, 3.52, 1, "1 разряд")
insert into curC values (3.53, 3.87, 2, "2 разряд")
insert into curC values (3.88, 4.75, 3, "3 разряд")
insert into curC values (4.76, 5.28, 4, "4 разряд")
insert into curC values (5.29, 5.99, 5, "5 разряд")


select ;
Prof.kodprof, ;
Prof.virab, ;
Kadr.zp1, ;
SUM(Kadr.zp1)
Prof.tip, ;
Curclass.numclass, ;
Curclass.description, ;
Curc.numc, ;
Curc.description ;
IIF(prof.tip='станочники', cursor Curclass, cursor CurC)
FROM ;
bd!prof ;
INNER JOIN bd!kadr ;
ON Prof.kodprof = Kadr.kodprof ;
INNER JOIN curClass Curclass ;
ON ROUND(Kadr.zp1/Prof.virab,2) BETWEEN Curclass.fromvalue AND Curclass.tovalue
INNER JOIN curC Curclass ;
ON ROUND(Kadr.zp1/Prof.virab,2) BETWEEN Curc.fromvalue AND Curc.tovalue




IIF(prof.tip='станочники', cursor Curclass, cursor CurC) - вот на это пишет Command Contains unnreccognized phrase/keyword
я понимаю что написано коряво, но иначе не могу понять как объявить чтобы выполнялся расчет из курсора 1 или курсора 2 при prof.tip='станочники' , возможно имена неверно задал курсоров, но без этой строки все работает

и кстати как задать с курсорами group by? ведь в формулах он нужен а без него теряется уникализация , нужно чтобы не повторялись записи с одинаковым Prof.kodprof - а тут 11111 выводит столько, сколько их есть в таблице.
...
Рейтинг: 0 / 0
запрос iif(AND
    #37271308
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо выдумывать проблемы на ровном месте. У Вас условие, что разряды зависят от типа. Другими словами, "разряд" кроме диапазона имеет еще дополнительный реквизит "тип". Ну, и заведите этот реквизит в справочник разрядов

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
* Разрядная сетка
create cursor curClass (tip C( 10 ), fromValue N( 5 , 2 ), toValue N( 5 , 2 ), numClass I, Description C( 10 ))
insert into curClass values ("станочники",  0 ,  3 . 87 ,  1 , "1 разряд")
insert into curClass values ("станочники",  3 . 88 ,  4 . 26 ,  2 , "2 разряд")
insert into curClass values ("станочники",  4 . 27 ,  5 . 23 ,  3 , "3 разряд")
insert into curClass values ("станочники",  5 . 24 ,  6 . 58 ,  4 , "4 разряд")
insert into curClass values ("станочники",  6 . 59 ,  7 . 75 ,  5 , "5 разряд")
insert into curClass values ("станочники",  7 . 76 ,  99999 ,  6 , "6 разряд")

insert into curClass values ("прочее",  0 ,  3 . 52 ,  1 , "1 разряд")
insert into curClass values ("прочее",  3 . 53 ,  3 . 87 ,  2 , "2 разряд")
insert into curClass values ("прочее",  3 . 88 ,  4 . 75 ,  3 , "3 разряд")
insert into curClass values ("прочее",  4 . 76 ,  5 . 28 ,  4 , "4 разряд")
insert into curClass values ("прочее",  5 . 29 ,  5 . 99 ,  5 , "5 разряд")
insert into curClass values ("прочее",  6 . 00 ,  99999 ,  6 , "6 разряд")


* Запрос
select ;
	Prof.kodprof, ;
	Prof.virab, ;
	Kadr.zp1, ;
	Prof.tip, ;
	curClass.NumClass, ;
	curClass.Description ;
FROM bd!prof ;
INNER JOIN bd!kadr ON Prof.kodprof = Kadr.kodprof ;
inner join curClass ON round(Kadr.zp1/Prof.virab, 2 ) between curClass.fromValue and curClass.toValue ;
		and Prof.tip = curClass.tip
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / запрос iif(AND
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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