:: Visual Foxpro, Foxpro for DOS
не работает функция max()
verolim
Автор

Сообщений: 3
Дата регистрации: 27.10.2018
Доброе время суток.:hi:
:sos:
Написал такой код:
SET TALK OFF
CLOSE TABLES ALL
USE 'd:\free\fox\n1.dbf'
SUM per1;
TO pp
CLOSE TABLES ALL
USE 'd:\free\fox\n1.dbf'
SUM per1;
TO pp
ma=MAX(per1,1)
LOCATE FOR n1.per1=ma
pu=ma/pp
py=pu*100
po=STR(py)
po1=LTRIM(po)
thisform.edit1.Value=po1+'%'
nu=n1.num
LOCATE FOR n1.per1=ma
IF FOUND()
thisform.edit11.Value=LTRIM(STR(n1.num))
thisform.Refresh()
ENDIF

в дебаге видно, что не ищет максимальное значение по полю per1, а просто берё что максимальное значение 1 и находит первое значение 1 в таблице.
Хотя в даном случае максимальное значение имеет 60-я запись.
Если вместо
ma=MAX(per1,1)
LOCATE FOR n1.per1=ma
пишу
ma=MAX(35,1)
LOCATE FOR n1.per1=ma
тогда всё нормально. Тоесть MAX() работает но не видит значения в поле per1 таблицы.
таблица такого вида:
CREATE TABLE 'd:\free\fox\n1.dbf' (num I, per1 I, per2 I, per3 I, per4 I, per5 I, per6 I)


num per1 per2 per3 per4 per5 per6
1 8 0 0 0 0 0
2 3 0 0 0 0 0
3 1 0 0 0 0 0
......................................
......................................
......................................
59 0 0 0 1 1 0
60 35 0 0 0 0 1



Надо найти максимальное по per1 и вывести его num.
По идее надо просто использовать ma=MAX(per1)
LOCATE FOR n1.per1=ma
nn=n1.num
Но почему-то не работает MAX(per1).

Немного поексперементировал и увидел, что ставить максимальным то число с которым сравниваеш per1.
тоесть при

ma=MAX(per1,1)
максимальным будет "1"
При
ma=MAX(per1,2)
максимальным будет "2" и так далее.

Если тип полей не Integer а Numeric[4] то вообще SUM per1 в место 64 выдаёт 99:al:
Запись такого вида
ma=MAX(n1.per1,1)
SELECT MAX(per1) FROM n1 AS "MaxPer1"
На экран выводит результат временной таблици
MaxPer1
35
Но всё равно даёт значение ma=1, а n1.num вообще не находит - в результате эта часть кода пропускается
LOCATE FOR n1.per1=ma
IF FOUND()
thisform.edit11.Value=LTRIM(STR(n1.num))
thisform.Refresh()
ENDIF

Помогите!!:sos:



Исправлено 1 раз(а). Последнее : verolim, 28.10.18 00:05
Ratings: 0 negative/0 positive
Re: не работает функция max()
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
Для начала почитайте хелп по функции Max(). Вы ее слишком переоцениваете. ;)


------------------
Ratings: 0 negative/1 positive
Re: не работает функция max()
verolim
Автор

Сообщений: 3
Дата регистрации: 27.10.2018
Sawradym
Для начала почитайте хелп по функции Max(). Вы ее слишком переоцениваете. ;)

СПАСИБО.
Ещё раз перечитал и поменял код на такой:
SET TALK OFF
CLOSE TABLES ALL
USE 'd:\free\fox\n1.dbf'
SUM per1;
TO pp
SCAN
ma=MAX(per1,1)
ENDSCAN
pu=ma/pp
py=pu*100
po=STR(py)
po1=LTRIM(po)
thisform.edit1.Value=po1+'%'
nu=n1.num
LOCATE FOR n1.per1=ma
IF FOUND()
nu=n1.num
thisform.edit11.Value=LTRIM(STR(n1.num))
thisform.Refresh()
ENDIF

Теперь возник ещё один вопрос:
А если таких максимальных значений будет несколько, то как их всех вывести на экран?
Ratings: 0 negative/0 positive
Re: не работает функция max()
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
Максимальное значение ищем так:
Select Max(Per1) From n1 Into Array ATmp
ma = ATmp(1)
Не пугайтесь, "этот" Мах() это совсем не "тот" Мах()

Не совсем понятно что значит много максимальных значений, на всякий случай список строк с Per1=ma:
Select * From n1 Where Per1=ma Into Cursor Tmp

В общем настоятельно рекомендую копать в сторону Select-SQL.


------------------




Исправлено 1 раз(а). Последнее : Sawradym, 28.10.18 00:45
Ratings: 0 negative/0 positive
Re: не работает функция max()
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
На всякий случай поиск максимума без использования SQL:
CALCULATE MAX(per1) TO ma IN n1
Ratings: 0 negative/1 positive
Re: не работает функция max()
verolim
Автор

Сообщений: 3
Дата регистрации: 27.10.2018
СПАСИБО ВСЕМ!:bodr:

Sawradym
Не совсем понятно что значит много максимальных значений, на всякий случай список строк с Per1=ma:

В общем настоятельно рекомендую копать в сторону Select-SQL.

Много - это больше одного. Например"35" - макимальное значение и есть в записях 1, 5, 10, 60.



Исправлено 2 раз(а). Последнее : verolim, 28.10.18 11:33
Ratings: 0 negative/0 positive
Re: не работает функция max()
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
verolim
Много - это больше одного. Например"35" - максимальное значение и есть в записях 1, 5, 10, 60.

Если вам нужно просто найти максимальное значение, то оно одно.
Если же вам нужно посчитать количество записей, имеющих некоторое значение, то это совсем другое.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 15 AndyNigmatec  (Гостей: 14)

© 2000-2024 Fox Club 
Яндекс.Метрика