Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Поиск МАХ значения из переменных  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 211
Потребовалось перебор 25 переменных на предмет поиска МАХ-симального значения.
Раньше было 3 переменных и поступал просто
 Set MAXperemen=Peremen1
 
if Peremen2>MAXperemen {Set MAXperemen=Peremen2}
 
if Peremen3>MAXperemen {Set MAXperemen=Peremen3}
Меня такое решение устраивало.
Сейчас - явно получается огород по такой схеме.

Чую жабрами, что можно сделать что то типа
Find MAX from(Peremen1,Peremen2,Peremen3,...,Peremen25)
С SQL запросами из БД не работал. Работаю напрямую с глобалами.
PeremenХ расположены в оперативной памяти, но берутся из Глобалов (разных).
То есть вытаскиваю их из разных БД и затем уже сравниваю.
По ходу выполнения кода, сравнения происходит с частично повторяющимеся выборками (PeremenХ), потому и сидят они в Оперативке.
21 окт 16, 10:51    [19807758]     Ответить | Цитировать Сообщить модератору
 Re: Поиск МАХ значения из переменных  [new]
DirksDR
Member

Откуда: Пермь
Сообщений: 340
О-О-О,

Сделай массив переменных:
Parray("Peremen1")=...
Parray("Peremen2")=...
...
и считай максимум в цикле по массиву.
21 окт 16, 10:56    [19807800]     Ответить | Цитировать Сообщить модератору
 Re: Поиск МАХ значения из переменных  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 211
DirksDR,

С тем же успехом можно создать список
(Peremen1,Peremen2,Peremen3....)

и в виде цикла вытаскивать поочерёдно значения по порядку и сравнивать с МАХ.

Но есть что либо попроще. Типа сразу выбрать МАХ из таких то переменных
21 окт 16, 11:01    [19807837]     Ответить | Цитировать Сообщить модератору
 Re: Поиск МАХ значения из переменных  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 211
а Cache уже сам из переменных делает массив или список и сам их между собою сравнивает.
Ну что то типа встроенной функции.
.
21 окт 16, 11:02    [19807846]     Ответить | Цитировать Сообщить модератору
 Re: Поиск МАХ значения из переменных  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 211
Вот, нашёл. Только стоило написать на форум.
Совсем мозг усох.

К сообщению приложен файл. Размер - 53Kb
21 окт 16, 11:27    [19808001]     Ответить | Цитировать Сообщить модератору
 Re: Поиск МАХ значения из переменных  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 945
О-О-О,
+ А почудить? :)
ClassMethod max(args...) {
  
for i=1:1:args {  max(+$g(args(i))) = }
  
i=""max=$o(max(i),-1, iQ $lb(maxi)
}
ClassMethod testMax() {
  
a1=2, a2=3.6, a3=5, a4=-4
  
#; s max="" for var=a1,a2,a3,a4 s:var>max max=var
  
max = ..max(a1,a2,a3,a4)
  
zw max
}
21 окт 16, 13:40    [19809051]     Ответить | Цитировать Сообщить модератору
 Re: Поиск МАХ значения из переменных  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3120
Блог
О-О-О,

Выбирайте на свой вкус:
Include %qadctabinc

Class tmp.testMax Abstract ]
{

ClassMethod test()
{
  
&sql(select GREATEST(2,3.6,5,-4) into :max)
  
"1)",?3,max,!

  
&sql(select max(ainto :max from (select union select 1.6 union select 3.6 union select -1))
  
"2)",?3,max,!
  
  
v=2,3.6,5,-4 $$$SetMax(max,v)
  
"3)",?3,max,!
  
  
"4)",?3,$ZMAX(1,2.6,3,-4),!
}

}


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

 ; implementation of ^%ZLANGF00
 ; custom functions for ObjectScript
 
QUIT
 
ZMAX(par...) public {
 
max=+par(1) i=2:1:par I $D(par(i)) S:par(i)>max max=+par(i)
 
max
}
21 окт 16, 16:20    [19810060]     Ответить | Цитировать Сообщить модератору
 Re: Поиск МАХ значения из переменных  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1569
servit
&sql(select GREATEST(2,3.6,5,-4) into :max)
при всём уважении, это напоминает ответ из анекдота: "Где вы находитесь? - В самолёте". Вы ведь прекрасно знаете, какой примерно код при этом
+ генерируется.
  ;---&sql(select GREATEST(2,3.6,5,-4) into :max)
   ;--- ** SQL PUBLIC Variables: %ROWCOUNT, %ROWID, %msg, SQLCODE, max
 
Do %0Ao
 
q
%0AmBx1 %mmmsqld(6)=$s(1]]%mmmsqld(6):1,1:"")
 
q
%0Ao 
 
%mmmsqlc,%mmmsqld,%mmmsqlE,%mmmsqll,%mmmsqln,%mmmsqlp,%mmmsqlR,%mmmsqls,%mmmsqlt,%mmmsqlZ,%mmmsqlEOO s $zt="%0Aerr" d:$zu(115,15) $system.ECP.Sync()
 
%mmmsqld(1)=2,%mmmsqld(1)=$s($isvalidnum(%mmmsqld(1)):+%mmmsqld(1),1:%mmmsqld(1)),%mmmsqld(2)=3.6,%mmmsqld(2)=$s($isvalidnum(%mmmsqld(2)):+%mmmsqld(2),1:%mmmsqld(2)),%mmmsqld(3)=5,%mmmsqld(3)=$s($isvalidnum(%mmmsqld(3)):+%mmmsqld(3),1:%mmmsqld(3)),%mmmsqld(4)=-4,%mmmsqld(4)=$s($isvalidnum(%mmmsqld(4)):+%mmmsqld(4),1:%mmmsqld(4))
 
%mmmsqld(5)=$S($zu(115,12)=-1:0,$zu(115,12)>0:$zu(115,12),1:$zu(35,4))
 
if %mmmsqld(5)>1 
      
new StatsParams set StatsParams=4, StatsParams(1)=2, StatsParams(2)=3.6, StatsParams(3)=5, StatsParams(4)=-4
      
do ##class(%SYS.PTools.SQLStats).Init("USER",$zn,"A",.StatsParams)
  
}
 
SQLCODE=100
 
max=$$GREATEST^%qarfunc(%mmmsqld(1),%mmmsqld(2),%mmmsqld(3),%mmmsqld(4))
 
; asl MOD# 2
 
d:%mmmsqld(5)=3 ##class(%SYS.PTools.SQLStats).Start("USER",$zn,"A",2)
 
%mmmsqld(6)=""
%0AmBk1 %0AmBx1
 
%mmmsqld(6)="" %0AmBdun
 
d:%mmmsqld(5)=3 ##class(%SYS.PTools.SQLStats).Stop("USER",$zn,"A","2,1")
 
SQLCODE=0 %0Ac
 
%0AmBk1
%0AmBdun 
d:%mmmsqld(5)=3 ##class(%SYS.PTools.SQLStats).Stop("USER",$zn,"A",2)
%0AmAdun 
%0Ac 
%ROWCOUNT='SQLCODE
 
d:$g(%mmmsqld(5))>1 ##class(%SYS.PTools.SQLStats).Report("USER",$zn,"A",%ROWCOUNT)
 
q
%0Aerr s $zt="" SQLRunTimeError^%apiSQL($ze,.SQLCODE,.%msg)
 
%0Ac
21 окт 16, 17:23    [19810407]     Ответить | Цитировать Сообщить модератору
 Re: Поиск МАХ значения из переменных  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3120
Блог
О-О-О,

Если в функцию нужно передать переменные вида

Parray(1)=Peremen1
Parray(2)=Peremen2
...

, а не вида

(Peremen1,Peremen2,Peremen3....)

, то можно воспользоваться готовыми заготовками из LANGFxx.inc, например:
%ZLANGF00.mac
#include LANGFdsm
 
; implementation of ^%ZLANGF00
 ; custom functions for ObjectScript
 
QUIT
tmp.testMax.cls
Class tmp.testMax Abstract ]
{

ClassMethod test()
{
  
;...

  
par=4
  
par(1)=2
  
par(2)=3.6
  
par(3)=5
  
par(4)=-4

  
"5)",?3,$$%max^%ZLANGF00(.par),!
}

}
PS: там же есть и %min.
24 окт 16, 08:47    [19814236]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить