Главная
КОМПАС-CLOUD
Скачать
Цены   
Вебинары
Новости
Контакты
Решение для

  Мастер SQL-запросов

Вопрос:
Необходимо обеспечить возможность добавлять произвольный поясняющий текст и обеспечить отображение объемных по содержанию описаний параметров (за счет увеличения высоты каждой строки с параметром) в диалоговом окне запроса параметров "Параметры запроса" и "Параметры отчета" для запросных форм и отчетов.

Ответ:
Запрос параметров для запросных форм и отчетов является служебной функцией. Именно поэтому расширение соответствующего функционала не планируется. Для придания форме запроса параметров более функционального вида предлагается применять следующую технологию:
  1. для конкретного отчета или запросной формы создается вспомогательная таблица, а также табличная и экранная форма;
  2. формирование отчета или открытие запросной формы должно выполняться с помощью бизнес-процедуры;
  3. бизнес-процедура создает объект класса "табличная форма" и выполняет команду ShowSF для определенной записи этой табличной формы. Запись подлежит выбору в рамках бизнес-процедуры. Например, для разных операторов могут использоваться разные записи. При необходимости запись может быть создана бизнес-процедурой;
  4. оператор вводит или изменяет параметры отчета через интерфейс экранной формы и нажимает кнопку ОК. Для отказа от печати оператор должен нажать кнопку Отмена. Для того, чтобы из бизнес-процедуры можно было понять, какая кнопка была нажата, в таблице должно быть поле со значением по умолчанию время и установленным флажком заполнять при любом изменении. Кроме того, экранная форма должна открываться для строки, находящейся в состоянии редактирования. В этом случае если время изменилось, значит была нажата кнопка ОК. Если время не изменилось, значит была нажата кнопка Отмена;
  5. если оператор нажал кнопку ОК, бизнес процедура далее формирует отчет или открывает запросную форму с использованием параметров, введенных через экранную форму.
Именно с учетом этих рекомендаций в версии 12.86.01 предусмотрена возможность подключать бизнес-процедуру в перечень отчетов, формируемых из табличной формы.
Вопрос:
Хочу в запросах использовать ПАРАМЕТР КОНФИГУРАЦИИ ОТБОР_РМ() для ограничения доступа по отделам. Пробывал включать в Мастере Запросов через Макропараметры, появлялось сообщение "...неверен реляционный оператор". И не смог разобраться как использовать ПАРАМЕТР в Бизнес-процедуре. Как и где можно использовать данный ПАРМЕТР?

Ответ:
Функция ОТБОР_РМ (или FIZ_OTDS) возвращает SQL-предложение для отбора записей по номеру подразделения. Функция имеет параметр - имя поля, в котором хранится номер подразделения. Например, если в качестве параметра передать строку "CH_70_S.OTD", то результат будет примерно следующим:

(CH_70_S.OTD IS NULL OR
CH_70_S.OTD IN ('
','0013','2','6013','1','5','3','4','6003','6004','6005','6006','6009','6007
','6008','6010') OR CH_70_S.OTD IN ('6011','6001'))

Если оператор имеет полный доступ, функция возвращает пустую строку.

Функцию можно использовать в бизнес-процедурах для формирования текста SQL-запроса. Пример бизнес-процедуры:

s = FIZ_OTDS("CH_70_S.OTD")
if not empty(s) then
s = " and "+s
end if

q = SQL "SELECT * FROM CH_70_S WHERE CH_70_S.GM_RAS='201005'"+s
...

Также функцию можно использовать при настройке связи со справочником с помощью запросной формы - для заполнения макропараметров.

Непосредственно в мастере запросов функция не может быть использована, так как при описании запроса значение макропараметра может быть только константой и не может быть выражением. Но если при описании запроса имеются макропараметры, то при использовании этого запроса из бизнес-процедуры с помощью функций SQL или QForm одному из макропараметров может быть присвоено значение, полученное с помощью функции FIZ_OTDS. Пример такой процедуры:

mac = ListBox
s = FIZ_OTDS("CH_70_S.OTD")
if not empty(s) then
mac.Add " and "+s
else
mac.Add ""
end if

a = QForm "CH_70_S_MAC",mac,"201005"
a.ShowModal

Здесь предполагается, что запросная форма CH_70_S_MAC имеет один параметр и один макропараметр. Например, она может содержать следующий текст запроса:

SELECT * FROM CH_70_S
WHERE CH_70_S.GM_RAS=:mon
%s
Вопрос:
Можно ли, находясь в табличной форме Журнал взаиморасчетов и установив курсор на документ отгрузки, получить ID этого документа для передачи значения в качестве параметра в функцию СУМ_ДАННЫЕ?

Ответ:
Из журнала взаиморасчетов Вы проводите какой-либо документ. Предположим, что для функции СУМ_ДАННЫЕ используется запрос вида:
SELECT <поля> FROM <таблица> WHERE DOK_ID = :ID
В качестве значения параметра :ID нужно использовать ID проводимого документа. Тогда в Мастере запросов в качестве значения этого параметра нужно указать DOC@ID и не обращать внимания на сообщения о том, что такое значение не является целым числом. Функция СУМ_ДАННЫЕ интерпретирует значения параметров, указанные в мастере запросов, как формулы ЯФПК и вычисляет по этим формулам настоящие значения. В данном случае формула очень проста - получить значения элемента DOC@ID того документа, который Вы проводите. В качестве примера рекомендую рассмотреть типовую операцию СВОД и соответственно запрос Амортизация свод.CA_PROVSVOD_AM, появившуюся в версии 11.83-1. Там как раз фигурируют тип документа и ID документа
Вопрос:
Как настроить сортировку платежной ведомости "по фамилии"?

Ответ:
За порядок вывода на печать записей в платежной ведомости отвечает указание order by в запросе PIKAZ_M_VED (Печать платежной ведомости из реестра), который можно найти в Мастере запросов (запросы по зарплате). Текст запроса:
select TAB_N, AGENT as FAMALIO,N_DOG_M,SUM_D as SUM_R
from PRIKAZ_M
where TIP_D= :tip And ID_D=:ids
order by FAMALIO
Для изменения порядка вывода записей достаточно заменить имя поля, выбрав другое из списка выбираемых полей из таблицы. Например, так:
order by TAB_N
в этом случае сортировка записей в платежной ведомости будет установлена по табельным номерам.
Вопрос:
Можно ли в бизнес-процедуре сформировать запросы, которые будут выбирать даннык из Компаса и передавать в другую базу данных MS SQL?

Ответ:
Существуют определенные правила написания кросс-базовых и кросс-серверных запросов, которые можно применять в т.ч. и в бизнес-процедурах в операторе RunSQL. Бизнес-процедура может выполнить любой запрос, в том числе и переносящий данные в другую БД. Например:

INSERT INTO OtherDB.dbo.OTHER_TABLE (поля)
SELECT поля FROM MOVIE
Вопрос:
При попытке повторно скомпилировать хранимую процедуру (кнопка Создать процедуру) я получаю General SQL Error. Что делать?

Ответ:
При создании новых хранимых процедур обратите внимание на то, чтобы имя процедуры в первом предложении CREATE PROCEDURE <имя> совпадало с именем в поле ввода, которое так и называется "Имя хранимой процедуры". Несоблюдение этого условия приводит к General SQL Error.


Вернуться к главному перечню вопросов