AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
NAV
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.03.2008, 16:12   #1  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
В форме "Заказ Продажи Карточка" устанавливаю фильтры по SETVIEW, так, чтобы менеджер видел только свои заказы. Но когда он открывает форму, он может открыть Фильтр таблицы и там снять мой фильтр, который там написан открытым текстом.
Как запретить юзеру изменять мой фильтр или скрыть от него Фильтр таблицы? Может быть, есть какой-то другой способ? SETFILTER и SETRANGE не подходит, потому что нужен фильтр одновременно по двум полям с условием ИЛИ, вот такой по смыслу:
Код:
Rec."SalesPerson Code"=<Менеджер код> OR Rec."ProjectManager"=<Менеджер код>
Старый 19.03.2008, 16:23   #2  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
На самом деле, тут у вас сразу два вопроса:
1. Как пользователю запретить снять или скрыть от него фильтр. Ответ: воспользуйтесь функцией FILTERGROUP.
2. Как наложить сложный фильтр. А как его сейчас накладываете вы? Стандартный навиженский способ - маркировка записей. Но для него нельзя использовать FILTERGROUP.
Старый 19.03.2008, 16:45   #3  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Так что, видимо, придется добавить в таблицу "Продажа Заказ" новое поле, по которому вы будете фильтровать, используя FILTERGROUP, чтобы скрыть фильтр от пользователя. Оно должно заполняться, допустим, суммой полей "SalesPerson Code" и "ProjectManager". А фильтр на него надо поставить такой:
rec.SETFILTER("Новое поле", '*%1*', USERID);
Старый 19.03.2008, 17:28   #4  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
Цитата:
Сообщение от Milk Посмотреть сообщение
На самом деле, тут у вас сразу два вопроса:
1. Как пользователю запретить снять или скрыть от него фильтр. Ответ: воспользуйтесь функцией FILTERGROUP.
2. Как наложить сложный фильтр. А как его сейчас накладываете вы? ...
Спасибо, немного полегчало Но не до конца.

На второй вопрос ответ - SETVIEW ('WHERE... OR...').
На первый: FILTERGROUP(n) я пробовал с разными параметрами - в любом случае фильтр, установленный по SETVIEW, виден пользователю. Вы знаете такой "n", который скрывает фильтр?
Старый 19.03.2008, 17:33   #5  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Например, 2.
Надо написать в OnOpenForm конструкцию
FILTERGROUP(2)
SETFILTER(...)
FILTERGROUP(0)
Старый 19.03.2008, 17:35   #6  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
Я же говорю - пробовал от 1 до 6 и - на всякий случай - 250. Не помогло.
Посмотрите моё предыдущее - отредактировал.
++ Правда, я пробовал с SETVIEW.
Старый 19.03.2008, 17:44   #7  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Что-то вы удивительное пишете. Что за OR в SETVIEW? Напишите полностью, пожалуйста.
А FILTERGROUP действительно действует только на SETFILTER и SETRANGE.
Старый 19.03.2008, 17:51   #8  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
До OR я, честно говоря, не дошёл. Сначала поставил вот такой простой:
Код:
IF CurrForm.LANGUAGE = 1049 THEN			// АВЧ Микрософт MUST ...!!!
  Rec.SETVIEW ('WHERE(Менеджер=FILTER(CHEREP))')
ELSE
  SETVIEW ('WHERE(SalesPerson Code=FILTER(CHEREP))');
Старый 19.03.2008, 17:59   #9  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Ну так смысл всего, что я выше написал, в том, что OR вы бы и не смогли использовать. Такая особенность Navision. Так что если хотите накладывать сложный фильтр и при этом скрывать его от пользователя - делайте новое поле.
Старый 19.03.2008, 18:14   #10  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
Да, я только что попробовал и понял, что ORа не получится. Пока сделал просто скрытие строк чужих заказов, потом подумаю. Спасибо за новое поле, в этом что-то есть
Старый 19.03.2008, 18:18   #11  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Можно триггера OnFind(), OnNext() формы переписать. Как вариант. Решайте, что будет лучше. Запись, не удовлетворяющую критериям не позволять видеть форме.
Старый 19.03.2008, 19:21   #12  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от Alex Che Посмотреть сообщение
До OR я, честно говоря, не дошёл. Сначала поставил вот такой простой:
Код:
IF CurrForm.LANGUAGE = 1049 THEN			// АВЧ Микрософт MUST ...!!!
  Rec.SETVIEW ('WHERE(Менеджер=FILTER(CHEREP))')
ELSE
  SETVIEW ('WHERE(SalesPerson Code=FILTER(CHEREP))');
1. Поссмотрите внимательно приверы в коде по поводу FILTERGROUP (Record). Мне немного непонятно КАК пользователи могу снять "невидимый" для системы фильтр? И тут OR тоже можно сделать... правда прийдется в таком случае делать запрос к базе и проверять наличие записей. Но в такой случае программерства многовато получится (если это родная БД).

2. SETTABLEVIEW (Dataport Form & Report) = Use this function to apply the Table View on the current record as the table view for the form, report or dataport.

3. Прописать код на OnOpenForm
Старый 20.03.2008, 09:47   #13  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
Цитата:
Сообщение от RedFox Посмотреть сообщение
1. Поссмотрите внимательно приверы в коде по поводу FILTERGROUP (Record). Мне немного непонятно КАК пользователи могу снять "невидимый" для системы фильтр?
В том-то и дело, что какой FILTERGROUP ни поставь, пользователи видят и могут снять фильтр SETVIEW.

В-общем, по совету Milk, поставил MARK и все нужные условия с OR. Искомый эффект получен, и даже тормозит не так сильно, как я боялся (почему и не стал сразу так делать).

MARKEDONLY юзер хотя и видит, но снять не может
Старый 20.03.2008, 10:07   #14  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Alex Che Посмотреть сообщение
В том-то и дело, что какой FILTERGROUP ни поставь, пользователи видят и могут снять фильтр SETVIEW.
Вам говорят про фильтры, установленные SETFILTER(). Мы, я и Билл Гейтс, гарантируем, что фильтры установленные в любой фильтргруппе, отличной от нуля, пользователь не снимет.
ПС. А я даже и не знаю, что такое SETVIEW() .. 3,7 у меня максимум. Во как.
Старый 20.03.2008, 10:42   #15  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
Цитата:
Сообщение от romeo Посмотреть сообщение
ПС. А я даже и не знаю, что такое SETVIEW() .. 3,7 у меня максимум. Во как.
У меня тоже
Старый 20.03.2008, 11:03   #16  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Есть хитрый способ имитровать некий аналог OR на формах.
Пример - В списке счетов фактур нужно показывать только те записи где я менеджер ИЛИ клиент='Вася Пупкин'.
Что делаем
1. На форме Объявляем две переменные record Purh. Inv Header. и при открытии накладываем фильтры PIH1.setrange("Salesperson Code", Я); PIH2.setrange("Salesperson Code", Я).
2. На OnFindRecord и OnNextRecord обманываем Нав следующим образом:

[codebox]OnFindRecord:
PIH1:=rec;
PIH2:=rec;
Found1:=PIH1.find(which);
Found2:=PIH1.find(which);
if not(Found1) and not(Found2) then exit(false);
if Found1 and Found2 then begin
if PIH1."No."<PIH2."No." then
rec:=PIH1;
else
rec:=PIH2;
end
else begin
if Found1 then
rec:=found1
else
rec:=found2;
end;
exit(true)[/codebox]
Аналогичным образом (работая с двумя наборами и сравнивая) - пишем код на OnNextRecord.

В приведенном примере не учитываются фильтры наложенные на форму и выбранный ключ - эти проблемы решаются достаточно просто.
Старый 20.03.2008, 11:11   #17  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
Цитата:
Сообщение от rmv Посмотреть сообщение
Есть хитрый способ имитровать некий аналог OR на формах.
Пример - В списке счетов фактур нужно показывать только те записи где я менеджер ИЛИ клиент='Вася Пупкин'.
Что делаем
1. На форме Объявляем две переменные record Purh. Inv Header. и при открытии накладываем фильтры PIH1.setrange("Salesperson Code", Я); PIH2.setrange("Salesperson Code", Я).
2. На OnFindRecord и OnNextRecord обманываем Нав следующим образом:
Интересный вариант, хотя слишком [за]умный А он работает при прокрутке назад?
Старый 20.03.2008, 11:11   #18  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Цитата:
Сообщение от Alex Che Посмотреть сообщение
MARKEDONLY юзер хотя и видит, но снять не может
Юзер может нажать кнопочку "Показать все"
Старый 20.03.2008, 11:21   #19  
Alex Che is offline
Alex Che
Участник
 
74 / 10 (1) +
Регистрация: 04.04.2006
Цитата:
Сообщение от Milk Посмотреть сообщение
Юзер может нажать кнопочку "Показать все"
Ох, ё-о-о...
Старый 20.03.2008, 11:31   #20  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от Alex Che Посмотреть сообщение
Интересный вариант, хотя слишком [за]умный А он работает при прокрутке назад?
А самому проверить слабо?
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:46.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.