![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL по выбору одновременной работы с приложениями [FireBird 1.5]
DelphiN! © (2007-12-06 15:13:00)Есть таблица с логом все запущенных на компьютерах приложениях
Computer_ Application_ Time_
K1 Word 01.12.2007 14:07:01
K34 Excel 01.12.2007 14:09:00
K1 Excel 01.12.2007 14:09:00
K2 Word 01.12.2007 14:08:00
K3 Word 01.12.2007 15:00:00
K1 CALC 01.12.2007 14:15:00
K34 notepad 01.12.2007 14:12:00
K3 mspaint 01.12.2007 15:13:15
K2 Access 01.12.2007 14:30:00
Нужно вывести из этой таблицы количество одновременнозапущенных на разных компьютерах копий приложений
В результате мы должны получить :
Application_ Count_
Word 2
Excel 2
Access 0
mspaint 0
calc 0
notepad 0
Второй день мучаюсь никак не могу сообразить, как это сделать :(
DelphiN! (2007-12-07 08:59:00) [1]
> ЮЮ © (07.12.07 08:21) [16]
Сейчас мне нужна всего лишь статистика максимального количества одновременно запущенных программ.
У программы занимающейся распределения кличей проблем нет. Так как при запуске нового приложения она освобождает все занятые данным компьютером ключи(если комп. до этого перезагрузили и ключ не освободился) и запускает новое приложение через себя выдавая перед запуском ему ключ, дожидается его завершения и освобождает ключ
Думкин (2007-12-07 08:36:00) [2]
> ЮЮ © (07.12.07 08:21) [16]
У них бизнес правило: Включил приложение работай. Отвлекся на другое - дубиной по башке.
ЮЮ (2007-12-07 08:21:00) [3]> А когда его закроют в лог добавится событие о запуске другого
> приложения, так как в логе информация с активного заголовка
> приложения на клиенте и если его закроют то активный заголовок
> поменяется на какой либо другой
Активный заголовок поменяется, наверное, и когда я просто переключусь в другое приложение, а не закрою текущее, но ключик-то повторно использовать ещё нельзя.
DelphiN! (2007-12-07 08:20:00) [4]
> ЮЮ © (07.12.07 08:16) [14]
DelphiN! (07.12.07 08:13) [13]
ЮЮ (2007-12-07 08:16:00) [5]> Если приложение будет запущено всю ночь то и ключик оно
> будет держать всю ночь и до тех пор, пока его не закроют.
Нет. Приложение аккуратно закрыли в 17.00, комп выключили и ушли. Но в лог ничего не поступит.
Назавтра в 10.00 запустят его (или другое) и только тогда появится запись в логе.
DelphiN! (2007-12-07 08:13:00) [6]
> пока его не закроют.
А когда его закроют в лог добавится событие о запуске другого приложения, так как в логе информация с активного заголовка приложения на клиенте и если его закроют то активный заголовок поменяется на какой либо другой
DelphiN! (2007-12-07 08:09:00) [7]
>
> Т.е. на каждом компьютере может быть одновременно загружено
> только одно приложение?
> И приложение будет числиться за компьютером всю ночь, пока
> назавтра не запустят другое приложение? А если не запустят,
> то ключик так и "помрёт"?
Да, одновременно на компьютере может быть запущено только одно из приложений. Если приложение будет запущено всю ночь то и ключик оно будет держать всю ночь и до тех пор, пока его не закроют.
ЮЮ (2007-12-07 07:53:00) [8]> Время окончания работы приложения - это время запуска следующего
> приложения на том же компьютере
Т.е. на каждом компьютере может быть одновременно загружено только одно приложение?
И приложение будет числиться за компьютером всю ночь, пока назавтра не запустят другое приложение? А если не запустят, то ключик так и "помрёт"?
> Нужно вывести из этой таблицы количество одновременно запущенных
> на разных компьютерах копий приложений
Это, похоже, задача не для SQL, а для тупого перевора на клиенте всех записей за период нв клиента с инкриментом/декриментом значений испольхуемых приложений и анализа этих изменяющихся во времени функций.
DelphiN! (2007-12-07 07:18:00) [9]
> Johnmen © (06
Время окончания работы приложения - это время запуска следующего приложения на том же компьютере
> Palladin © (06.12.07 15:32) [7]
>
> или так
Нужно вывести количество копий приложения(каждого приложения) запущенного одновременно на разных компьютерах в определённый промежуток времени.
Вообще, конечная задача - вывести максимальное количество одновременно запущенных копий программы на разных компьютерах за определённый период, для последующей закупки определённого числа лицензий на каждую из программ.
Лицензий необходимо купить столько, сколько максимально много программ может быть запущенно одновременно, так как программы сетевые то ни у одной копии программы запущенной в данный момент не может быть повторяющегося ключа.
Ключи будет распределять программа по распределению лицензий перед запуском приложения
ЮЮ (2007-12-07 03:50:00) [10]> [8] Johnmen © (06.12.07 15:33)
>
> > DelphiN! © (06.12.07 15:13)
>
> Кстати вообще лог неправильный, т.к. нет окончания.
Очевидно, по завершении приложения соответствующая запись из таблицы удаляется. Очень эффективно при зависании винды и выдергивании вилки из розетки :)
Johnmen (2007-12-06 15:33:00) [11]
> DelphiN! © (06.12.07 15:13)
Кстати вообще лог неправильный, т.к. нет окончания.
Palladin (2007-12-06 15:32:00) [12]или так
select Application_,Count(*)-1 From log Group by Application_
Palladin (2007-12-06 15:31:00) [13]
select Computer_,Applicaton_ from log
Var
pvt:TStringList;
s:String;
n:Integer;
...
While Not q.Eof Do
Begin
s:=q.Fields[0].AsString+#9+q.Fields[1].AsString;
n:=pvt.IndexOf(s);
If n=-1 Then pvt.AddObject(s,TObject(0)) Else pvt.Objects[n]:=pvt.Objects[n]+1;
q.Next;
End;
...
For i:=0 to pvt.Count-1 Do Memo1.Lines.Add(pvt[i]+#9+IntToStr(Integer(pvt.Objects[i])));
Anatoly Podgoretsky (2007-12-06 15:29:00) [14]Чего думать обычный Count+Group by
Palladin (2007-12-06 15:28:00) [15]хотя суть алгоритма не меняется, к ключу имени добавляется ключ машины...
Palladin (2007-12-06 15:27:00) [16]блин... не правильно условие задачи прочитал...
Palladin (2007-12-06 15:26:00) [17]бедняжка
Var
src:TStringList;
pvt:TStringList;
s:String;
n:Integer;
...
For i:=0 to src.Count-1 Do
Begin
n:=Pos(#9,src[i]);
s:=Copy(src[i],n+1,Length(src[i]));
n:=Pos(#9,s);
s:=Copy(s,1,n-1);
n:=pvt.IndexOf(s);
If n=-1 Then pvt.AddObject(s,TObject(1)) Else pvt.Objects[n]:=pvt.Objects[n]+1;
End;
...
For i:=0 to pvt.Count-1 Do Memo1.Lines.Add(pvt[i]+#9+IntToStr(Integer(pvt.Objects[i])));
работать будет еще быстее если сделатьpvt.Sorted:=True;
Johnmen (2007-12-06 15:25:00) [18]Самое простое - написать ХП.
Одним запросом - это надо подумать...