• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

@environment - Замена для Web

  • Автор темы Kvant
  • Дата начала
K

Kvant

Приветсвую.
У меня раньше была БД, в которой выполнялся агент (по дейсвтию).

На форме - поле ввода Podr и скрытое поле PodrOld
Вот само действие (сохранить)
Нужно для изменения названия подразделения.

Код:
Var:= @If(PodrOld != "" & PodrOld != Podr; "1"; "");
@If(Var = "1"; @Environment("PodrNameOld"; PodrOld); "");

FIELD PodrOld := Podr;

FIELD SaveOptions := "1";
@Command([FileSave]);
FIELD SaveOptions := "0";

@If(Var = "1";
@Do(
@Environment("PodrNameNew"; Podr);
@Command([OpenView]; "po_polu"; ""; "1");
@Command([ToolsRunMacro]; "(Изменить подразделение)");
@Command([FileCloseWindow])); "");

Вот сам агент -
Код:
SELECT Podr = @Environment("PodrNameOld");
FIELD Podr := @Environment("PodrNameNew");


То есть - открывается вью с анкетой, записывается старое название подразделения в notes.ini, через @Environment, и присваивается новое название.

Соотвественно под Веб это не работает ибо @Environment использует notes.ini.

Вопрост такой - чем проще всего заменить данную функцию. Только Lotus Script? То есть необходимо как-то передавать в вью глобальную переменную... Куда её можно сохранять и как читать?
 
S

Sandr

поему это не работает? Все работает.. на сервере тоже есть notes.ini.
 
K

Kvant

Ммм так в том то и дело, что нет сервера. При запуске из дизайнера в браузере.
 
K

Kvant

Попробовал так:
@DbColumn("Notes" : "NoCache" ; "" : "" ; "podrazdeleniya" ; 2)
Создал в вью podrazdeleniya столбец второй со значением поля Podr
Так по идее можно прочитать.
Он возвращает список всех подразделений. Чтобы взять только первое значение пользую
@Subset(@DbColumn("Notes" : "NoCache" ; "" : "" ; "podrazdeleniya" ; 2);1)

В итоге получилось так:
Код:
SELECT Podr = @Subset(@DbColumn("Notes" : "NoCache"; "" : ""; "podrazdeleniya"; 2);1);


Вопрос 1 - как выбирать не первую(вторую....энную), а ту которая была конкретно в том подразделении?

Вопрос 2 - С выборкой уже более понятно, но вот как вставлять в саму базу значения полей?
Если тока создать новый вью и писать, например FIELD Podr := @DbColumn(из нового вью);
НО тогда как в этот вью изначально заносить данные?
 
F

fvoice

Для: Kvant
1. используйте @DbLookup
2. присваивайте результат @DbColumn полю, если подразделения уникальны то он будет возвращать одно значение, если не уникальны то подумайте над усложнением ключа для поиска.

Не понятно зачем такие трудности? переменные окружения.. агенты.. обьясните поподробнее задачу, возможно ее решение гораздо проще.
 
K

Kvant

Спасибо, fvoice. Попробую.

Задача - такая. У меня была база, сделанная под клиент Нотус. В ней были агенты. Надо переработать базу так, чтобы весь функционал работал из под браузера. В распоряжении только дизайнер, клиент и ещё можно пользоваться административным клиентом. В принципе, я думаю, можно установить и сервер.

Конкретно этот агент нужен для того, чтобы:
при изменении названия подразделения, это изменения должно быть автоматически внесено во все анкеты сотрудников этого подразделения.
при сохранении документа «Подразделение» определить, изменилось название подразделения (значение поля) в текущем сеансе по сравнению с предыдущим состоянием документа
агент, изменяющий название подразделения в анкетах сотрудников, запускается в представлении «Анкеты». Агент должен обработать все документы этого представления, чтобы среди них найти документы, название подразделения в которых соответствует его предыдущему названию в анкете

То есть он просматривает все документы в представлении, открытом для его выполнения и отбирает среди них документы, в которых название подразделения, в котором работает сотрудник, совпадает со старым названием. Если название подразделения в поле Podr анкеты сотрудника совпадает со старым название подразделения, то в поле Podr, с помощью оператора FIELD Podr := @Environment("PodrNameNew"); записывается новое название подразделения


Подразделения уникальны. Для @DbLookup нужен ключ... У меня в представлении только список подразделений в 1 колонке и всё.
В качестве ключа что использовать?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Делать через энвироменты - достаточно кривой способ.

На WebQuerySave вызываем серверного агента и делаем всё это без особых хлопот.
 
F

fvoice

<!--QuoteBegin-Kvant+30:01:2008, 13:40 -->
<span class="vbquote">(Kvant @ 30:01:2008, 13:40 )</span><!--QuoteEBegin-->В принципе, я думаю, можно установить и сервер.
[snapback]95725" rel="nofollow" target="_blank[/snapback]​
[/quote]
Вы работаете с БД локально? Только один пользователь?

Тогда может Вам просто написать скрипт, который выберет документы и изменит значение поля?
типа такого:
Код:
	Dim ws As New NotesUIWorkspace
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim curdoc As NotesDocument
Dim doc As NotesDocument	

Set curdoc = ws.CurrentDocument.Document 
If curdoc.OldPodr(0)<>curdoc.Podr(0) Then
Set dc = db.Search({SELECT Form = "Podrazdelenie" & Podr = } & curdoc.OldPodr(0),Nothing,0)
If dc.Count <> 0 Then
While Not doc Is Nothing
If Not doc.UniversalID = curdoc.UniversalID Then
doc.Podr = curdoc.Podr(0)
doc.OldPodr = curdoc.Podr(0)
Call doc.Save(True,False,True)
End If
set doc = dc.GetNextDocument(doc)
Wend
End If
curdoc.OldPodr = curdoc.Podr
End If

_________________________________

тьфу ты, забыл что все это под Веб, на работе проблемы с интернетом, пока обновится страница, забываешь о чем писать хотел..

Для: Kvant

не пойму только если у Вас нет сервера, то как Вы просматривать БД под Веб будете?
 
S

Sandr

Чесно говоря, не пойму, зачем нужна работа через браузер, если база локальная...
 
K

Kvant

Да это задание такое дали.. я ХЗ нафиг это вообще нужно :D

По поводу скрипта - а разве UI работает под веб?

Сервер могу поставить.
 
K

Kvant

Хмм а если в коде использовать не UI, а сессии? Только я не знаю как бы это закодить...
 
K

Kvant

Друг написал такой скрипт - у него работает
Код:
Dim doc As NotesDocument
Dim cdoc As NotesDocument
Dim session As New NotesSession
Dim View As NotesView
Dim db As NotesDatabase

Dim cdPodr As Variant
Dim PodrNameOld As Variant
Dim tempPodr As Variant

Set db= session.CurrentDatabase
Set cdoc = session.DocumentContext
Set View = db.GetView("po_polu")

cdPodr = cdoc.GetItemValue("Podr")	
PodrNameOld = cdoc.GetItemValue("PodrNameOld")

Set doc = View.GetFirstDocument
Messagebox "======="
While Not (doc Is Nothing)		
tempPodr = doc.GetItemValue("Podr")
If ( tempPodr ( 0 ) = PodrNameOld (0)  ) Then
doc.Podr = cdPodr ( 0 )
Call doc.Save( True, True )				
End If

Set doc = View.GetNextDocument ( doc )


Wend

Мучаюсь который час пробовал всё уже.
Просто вставляю его скрипт и работает.
Меняю имя скрипта - ничего не пашет (соответсвенно в вызове тоже меняю имя)
Просто меняю имя! Все свойства агента оставляю нетронутыми...

С его именем(changePodr)- всё обрабатывает. Меняю на (Change) не пашет...

Причём с его именем нормально происходит после агента @Command([FileCloseWindow]));

Меняю имя - выдает Document Submited (как будто новое подразделение делал)

Поразительно то, что когда в ВЫЗОВЕ указано @Command([RunAgent];"(Change)"); ТО даже если такого агента нет вызывается всё равно (changePodr)....

В Чём дело?
 
F

fvoice

Для: Kvant
Вы все-таки поставили сервер, или работаете через быстрый просмотр?

Возможно браузер грузит страницу из кеша, от этого и старые названия вызываются, попробуйте открыть в другом браузере.
 
K

Kvant

Удалил лишние файлы баз примеров.. Теперь ваще ничо не пашет xD
Работаю через быстрый просмотр.
 
F

fvoice

<!--QuoteBegin-Kvant+31:01:2008, 10:58 -->
<span class="vbquote">(Kvant @ 31:01:2008, 10:58 )</span><!--QuoteEBegin-->Удалил лигие файлы баз примеров.. Теперь ваще ничо не пашет xD
[snapback]95913" rel="nofollow" target="_blank[/snapback]​
[/quote]

Мне кажется Вы перепутали несколько баз данных, проверьте еще раз все названия в рабочей версии, а ошибки агента можно посмотреть в локальном Log.nsf (я думаю локальный Web сервер будет складывать их именно туда)
 
K

Kvant

31.01.2008 07:50:47 HTTP Web Server: Lotus Notes Exception - You are not allowed to modify environment variables. [/primer_2_9.nsf/c90d781b718fa10ac325739c004d21f9/f2353c259900e53ac32573e10006a9df?EditDocument&Seq=1]

Хотя левел прав доступа выдает 4 (редактор) (@UserAccess)
Да и не трогаю я переменные окружения...
 
F

fvoice

Для: Kvant
не пойму, Вы используете скриптовый агент, выложенный несколькими постами выше? В нем же нету обращений Environment, может запускается Ваш старый агент?
 
K

Kvant

Для: Kvant
не пойму, Вы используете скриптовый агент, выложенный несколькими постами выше? В нем же нету обращений Environment, может запускается Ваш старый агент?

Да я использую скриптовый тот, который друг написал.
Как может запускаться старый, если его уже в помине нет в базе...
 
F

fvoice

Для: Kvant
напишите в начале агента messagebox "Это я!!!", запустите, если выполняется этот агент, то в логе будет надпись "Это я!!!"
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!