Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / запрос iif(AND / 10 сообщений из 10, страница 1 из 1
19.05.2011, 13:26
    #37269228
anrio13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
Появился вопрос по сложному запросу. Помогите пожалуйста!
необходимо из двух таблиц 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
19.05.2011, 13:43
    #37269269
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
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
19.05.2011, 14:47
    #37269451
rock-n-roll
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
да с 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
19.05.2011, 15:03
    #37269507
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
ТАК подобные задачи не решаются. Необходима дополнительная таблица-справочник со списком разрядов и диапазоном коэффициентов

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
19.05.2011, 17:30
    #37269981
anrio13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
ВладимирМ , а можно пояснить что ознaчают некоторые функции например Round? и почему в фразе (fromValue N(5,2), toValue N(5,2) именно 5 и 2, а не 7 и 4 к примеру?
...
Рейтинг: 0 / 0
19.05.2011, 18:03
    #37270073
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
>что ознaчают некоторые функции например Round?
Округление. В хелп.
>и почему в фразе (fromValue N(5,2), toValue N(5,2) именно 5 и 2, а не 7 и 4 к примеру?
Это число с фиксированной точкой: 2 дробных разряда и 2 (=5-2-1(точка)) десятичных. В хелп. Именно столько, наверное, просто потому, что в примере нет цифр, которые бы не поместились в (5,2)
...
Рейтинг: 0 / 0
19.05.2011, 18:03
    #37270075
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
в смысле, 2 целых разряда и 2 десятичныз :)
...
Рейтинг: 0 / 0
19.05.2011, 21:54
    #37270461
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
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
20.05.2011, 00:20
    #37270572
anrio13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
Блин задание усложнилось(
оказалось, что надо чтобы получалось значение исходя из 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
20.05.2011, 13:00
    #37271308
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос iif(AND
Не надо выдумывать проблемы на ровном месте. У Вас условие, что разряды зависят от типа. Другими словами, "разряд" кроме диапазона имеет еще дополнительный реквизит "тип". Ну, и заведите этот реквизит в справочник разрядов

Код: 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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / запрос iif(AND / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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