19.03.2008, 16:12 | #1 |
Участник
|
В форме "Заказ Продажи Карточка" устанавливаю фильтры по SETVIEW, так, чтобы менеджер видел только свои заказы. Но когда он открывает форму, он может открыть Фильтр таблицы и там снять мой фильтр, который там написан открытым текстом.
Как запретить юзеру изменять мой фильтр или скрыть от него Фильтр таблицы? Может быть, есть какой-то другой способ? SETFILTER и SETRANGE не подходит, потому что нужен фильтр одновременно по двум полям с условием ИЛИ, вот такой по смыслу: Код: Rec."SalesPerson Code"=<Менеджер код> OR Rec."ProjectManager"=<Менеджер код> |
|
19.03.2008, 16:23 | #2 |
Участник
|
На самом деле, тут у вас сразу два вопроса:
1. Как пользователю запретить снять или скрыть от него фильтр. Ответ: воспользуйтесь функцией FILTERGROUP. 2. Как наложить сложный фильтр. А как его сейчас накладываете вы? Стандартный навиженский способ - маркировка записей. Но для него нельзя использовать FILTERGROUP. |
|
19.03.2008, 16:45 | #3 |
Участник
|
Так что, видимо, придется добавить в таблицу "Продажа Заказ" новое поле, по которому вы будете фильтровать, используя FILTERGROUP, чтобы скрыть фильтр от пользователя. Оно должно заполняться, допустим, суммой полей "SalesPerson Code" и "ProjectManager". А фильтр на него надо поставить такой:
rec.SETFILTER("Новое поле", '*%1*', USERID); |
|
19.03.2008, 17:28 | #4 |
Участник
|
Цитата:
На второй вопрос ответ - SETVIEW ('WHERE... OR...'). На первый: FILTERGROUP(n) я пробовал с разными параметрами - в любом случае фильтр, установленный по SETVIEW, виден пользователю. Вы знаете такой "n", который скрывает фильтр? |
|
19.03.2008, 17:33 | #5 |
Участник
|
Например, 2.
Надо написать в OnOpenForm конструкцию FILTERGROUP(2) SETFILTER(...) FILTERGROUP(0) |
|
19.03.2008, 17:35 | #6 |
Участник
|
Я же говорю - пробовал от 1 до 6 и - на всякий случай - 250. Не помогло.
Посмотрите моё предыдущее - отредактировал. ++ Правда, я пробовал с SETVIEW. |
|
19.03.2008, 17:44 | #7 |
Участник
|
Что-то вы удивительное пишете. Что за OR в SETVIEW? Напишите полностью, пожалуйста.
А FILTERGROUP действительно действует только на SETFILTER и SETRANGE. |
|
19.03.2008, 17:51 | #8 |
Участник
|
До 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 |
Участник
|
Ну так смысл всего, что я выше написал, в том, что OR вы бы и не смогли использовать. Такая особенность Navision. Так что если хотите накладывать сложный фильтр и при этом скрывать его от пользователя - делайте новое поле.
|
|
19.03.2008, 18:14 | #10 |
Участник
|
Да, я только что попробовал и понял, что ORа не получится. Пока сделал просто скрытие строк чужих заказов, потом подумаю. Спасибо за новое поле, в этом что-то есть
|
|
19.03.2008, 18:18 | #11 |
Участник
|
Можно триггера OnFind(), OnNext() формы переписать. Как вариант. Решайте, что будет лучше. Запись, не удовлетворяющую критериям не позволять видеть форме.
|
|
19.03.2008, 19:21 | #12 |
Участник
|
Цитата:
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 |
Участник
|
Цитата:
В-общем, по совету Milk, поставил MARK и все нужные условия с OR. Искомый эффект получен, и даже тормозит не так сильно, как я боялся (почему и не стал сразу так делать). MARKEDONLY юзер хотя и видит, но снять не может |
|
20.03.2008, 10:07 | #14 |
Участник
|
Цитата:
ПС. А я даже и не знаю, что такое SETVIEW() .. 3,7 у меня максимум. Во как. |
|
20.03.2008, 10:42 | #15 |
Участник
|
|
|
20.03.2008, 11:03 | #16 |
Участник
|
Есть хитрый способ имитровать некий аналог 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 |
Участник
|
Цитата:
Сообщение от rmv
Есть хитрый способ имитровать некий аналог OR на формах.
Пример - В списке счетов фактур нужно показывать только те записи где я менеджер ИЛИ клиент='Вася Пупкин'. Что делаем 1. На форме Объявляем две переменные record Purh. Inv Header. и при открытии накладываем фильтры PIH1.setrange("Salesperson Code", Я); PIH2.setrange("Salesperson Code", Я). 2. На OnFindRecord и OnNextRecord обманываем Нав следующим образом: |
|
20.03.2008, 11:11 | #18 |
Участник
|
|
|
20.03.2008, 11:21 | #19 |
Участник
|
|
|
20.03.2008, 11:31 | #20 |
Участник
|
|
|