понедельник, 20 июля 2009 г.

АБС Б2. Ограничили доступ?

Думаю вы замечали что разработчики в своем продукте Б2 прибегали к довольно интересным "пользовательским фильтрам" для отображения необходимых данных при переходе на другую форму. Такой трюк заставил обратить на себя внимание и отпечатался где-то далеко в памяти. После того как мои права ограничили я сразу вспомнил о подзапросах разработчиков.

Документация.
Изучение мануалов дало понять что никаких ограничений не существует в формировании "пользовательского фильтра", кроме ограничения - фантазии и знания азов SQL.

Пример.
Заглянем на форму "счета\аналитические счета". Обычная форма, вывод данных согласно выданных прав - просмотр одного отделения. Форма по-умолчанию смотрит на вьювер VAACCOUNT, который загружает данные с VIntAAccount. В последнем вьювере идет проверка прав и соответствующий вывод данных. Немножко меняем, точнее удаляем из него проверки, и получаем чистый запрос - возвращающий информацию о всех счетах - экранируем его скобочками, полученный результат указан ниже. Теперь мы готовы к проверке - нажимаем F7 и приступаем к редактированию "пользовательского фильтра".

Рис. 1 - редактор пользовательского фильтра.

В редакторе выбираем операцию "одно из", указываем совершенно любое "поле" и в "значение" вставляем запрос который у нас получился:
0) union (SELECT a.ID, a.accountno, a.description, b.ID baccountid, SUBSTR (b.NAME, 1, 25) baccountsname, b.activepassive_a090 activepassive, c.ID contragentid, c.sname contragentsname, c.nickname contragentnickname, c.contragrankid contragrankid, contragrank.sname contragranksname, a.lockremark, cur.ID currencyid, cur.sname currencysname, a.dateopen, a.datelastmove, a.dateclose, DECODE (SIGN (a.summabegin), -1, -a.summabegin, 0) summabeginactive, DECODE (SIGN (a.summabegin), 1, a.summabegin, 0) summabeginpassive, DECODE (SIGN (a.summanow), -1, -a.summanow, 0) summanowactive, DECODE (SIGN (a.summanow), 1, a.summanow, 0) summanowpassive, a.debet, a.credit, DECODE (SIGN (a.summanowvirtual), -1, -a.summanowvirtual, 0) summanowvirtualactive, DECODE (SIGN (a.summanowvirtual), 1, a.summanowvirtual,0) summanowvirtualpassive, astate.ID accountstateid, astate.sname accountstatesname, a.parentbaccountid, a.accountlimit, a.OPERATOR, a.summabegin,a.summanow, a.accountpassport, ABS (a.summabegin) abssummabegin, ABS (a.summanow) abssummanow, a.isparent, a.activatedate, a.auth_actionid auth_actionid, DECODE (NVL (a.auth_actionid, 0), 1, 'Добавление', 2, 'Изменение', 3, 'Удаление', 'нет' ) auth_action_name, a.approvedby approvedby, a.approveddate approveddate, a.modifiedby modifiedby, a.toboid, tobo.sname tobosname, a.special, a.siteid, a.BeginCloseDate, to_date(null) arcdate, substr(a.accountno, 6) accountcode FROM aaccount a, baccount b, contragent c, contragrank, currency cur, accountstate astate, tobo WHERE a.baccountid = b.ID AND a.contragentid = c.ID AND a.currencyid = cur.ID AND a.accountstateid = astate.ID AND c.contragrankid = contragrank.ID AND tobo.ID = a.toboid AND c.siteid = a.siteid AND tobo.siteid = a.siteid and a.accountstateid != 2
Замечания.
Для корректной работы "пользовательских sql-запросов" необходимо проверить, чтобы сортировка полей была выключена.

Домашнее задание.
1. Кто знает способ корректно обрабатывать сортировки, о которых я написал в замечании, прошу сообщить в комментария, думаю это будет полезно для всех.
2. Пишите запросы которые вас выручили в трудную минуту.

4 комментария:

  1. Просмотреть депозиты физических лиц:
    0) union (select id, inputdate, dealdate, closedate, dealstate, dealno, description, operator, dealtypeid, changeno, startdate, expectedclosedate, parentid, dealtypesname, contragentid, contragentsname, contragentnickname, subtypeno, dealchangeid, clientname, clientpatronymicname, clientlastname, clientpassportno, clientpassportissuedate, contragentidentifycode, individualdeposittypeid, term, termmeasure, interestrepaymenttype, autoprolong, currencyid, currencysname, valuedate, maturitydate, amount, restamount, principalaccountid, principalaccountno, principalaccountdescription, deposittypedescription, subtypesname, origmaturitydate, prolongationcount, methodcountid, accountgrowthid, accruedamount, repaidamount, lastinterestdate, previnterestdate, interesttypeid, methodcountsname, accountgrowthno, accountgrowthdescription, interesttypesname, virtaccruedamount, repaidmode, repaidday, cr_bankid, cr_bankname, cr_accountno, cr_contragentsname, cr_identifycode, cr_countryid, advanceaccountid, advanceaccountno, advanceaccountdescription, toboid, tobosname, advanceamount, roundbase, previousmaturitydate, canreplenish, maxreplamount, maxreplpercent, minreplenishmentamount, restamountminsum, replenishmentusage, repayperiod, firstrepaydate, cr_countrysname, needtoverify, termid, repaytocorr, defconditionsdiffmask, lastprolongdate, isblocked, blockreason, capitalizedtorepay, transferprincipalaccid, maturityaction, transferprincipalaccno, transferprincipalaccdescr, transferdealid, transfdealno, transfdealtype, generaldelivery, lastrepaydate, discountaccountid, discountaccno, amortizedamount, amortizedtill, useeffectiverate, premiumaccountid, premiumaccountno, accruedtill, siteid, currentrate, sourceaccountid, sourceaccountno, sourceaccountdescription, cr_bankcardid, cr_cardnumber, cr_card_codeword_assigned, cr_card_isregistered from vindividualdepositall where dealstate in(0, 1, 3)

    ОтветитьУдалить
  2. Извини, друг , но CS уже работает над решением этого бага...

    ОтветитьУдалить
  3. мда, читал но как-то полезности вообще нет...
    есть намного интересные "штуки" в б2.. а это песочница....
    Спасибо автору, улыбнуло ;)

    ОтветитьУдалить
  4. могли бы и поделиться своими "штуками" ))) действительно интересно чего интересного еще можно там сделать!? ))

    ОтветитьУдалить