Редактирование функции и шаблона на примере шаблона "ценники"

Материал из GedeminWiki
Перейти к: навигация, поиск

В процессе работы с программой пользователи зачастую сталкиваются с тем, что в связи со спецификой их деятельности, либо еще по какой-то другой причине необходимо внести определенные изменения в существующий шаблон печатной формы. Программный комплекс Гедымин создан таким образом, чтобы дать пользователю максимальную свободу во внесении подобных правок. В качестве примера мы возьмем ситуацию в которой пользователь столкнулся с необходимостью добавить на обратной стороне бланка Ценники дату и номер приходной накладной, по которой был получен данный товар.

Для того, чтобы добавить данные колонки нам нужно узнать название этих полей в документе. Для этого мы через Исследователь открываем форму просмотра документа Приходная накладная, и нажав клавишу F10 вызываем Мастер установок. Здесь мы переключаемся на закладку Колонки и видим таблицу из двух столбцов. Левый -- название колонки, правый -- поле. Сверившись, мы выясняем, что Дата -- это DOCUMENTDATE, а Номер -- NUMBER. Закрываем окно мастера установок.

Далее, для правки шаблона необходимо открыть редактор скрипт-объектов. Для этого в списке интересующих нас документов (в нашем случае это приходные накладные) мы нажимаем на значек принтера и выбираем пункт Редактор скрипт-объектов. Откроется окно редактора, где мы будем вносить все необходимые изменения. Для начала, в левой части редактора у нас открыто окно Проводник (если оно не открылось автоматически, мы можем открыть его самостоятельно, выбрав пункт Проводник в меню Окно). В проводнике мы выбираем интересующий нас пункт -- Ценники -- и открываем его двойным щелчком. В открывшемся окне, мы переключаемся на закладку Основная функция, и, чуть ниже, -- на закладку Скрипт. Просматривая исходный код выясняем, что в нем уже фигурирует поле DOCUMENTDATE, но вот поля NUMBER нет. Следовательно, мы добавляем поле NUMBER, везде вслед за полем DOCUMENTDATE по его образу и подобию. Следует учесть, это то, что свойство AsDateTime работает с типом дата, который не очень подойдет полю NUMBER, поэтому это свойство мы заменим на AsString. В общей сложности мы должны добавить в текст функции поле NUMBER шесть раз. В конечном счете, после внесения всех правок мы должны прийти к следующему виду функции:

 function RetailInv_rp_AddwBill_Order147050326_88538865(OwnerForm, CountOnQuantity)
  set gdcInvDocument = OwnerForm.gdcObject
 
  if gdcInvDocument.IsEmpty then
    call Exception.Raise("Exception", "Пустой набор данных")
  end if
 
  BaseQueryList.Clear
  set CustomerSQL = BaseQueryList.Query(BaseQueryList.Add("CustomerSQL", 0))
  CustomerSQL.SQL = _
    "select * from GD_V_company where id = " + Cstr(IBLogin.Companykey)
  CustomerSQL.Open
 
  id = gdcBaseManager.GetIDByRUIDString("147006033_63934951")
 
  set t = BaseQueryList.Query(BaseQueryList.Add("T", 0))
  t.SQL = "SELECT gr.lb, gr.rb from " & _
    "gd_goodgroup gr " & _
    "where gr.id= " + CStr(id)
  t.Open
 
  set q1 = BaseQueryList.Query(BaseQueryList.Add("GDCINVDOCUMENTLINE", 0))
  q1.SQL = " SELECT " + _
  " Z.DOCUMENTDATE, INVLINE.QUANTITY, Z.NUMBER, " + _
  " G.NAME AS GOODNAME, " + _
  " G.ALIAS AS GOODALIAS, " + _
  " V.NAME, " + _
  " CARD.USR$INV_COSTRETAILNCU AS TO_USR$INV_COSTRETAILNCU " + _
  " FROM GD_DOCUMENT Z " + _
  " LEFT JOIN USR$INV_ADDWBILLLINE INVLINE  ON ( Z.ID  =  INVLINE.DOCUMENTKEY ) " + _
  " LEFT JOIN INV_CARD CARD ON ( CARD.ID  =  INVLINE.FROMCARDKEY ) " + _
  " LEFT JOIN GD_GOOD G ON ( G.ID  =  CARD.GOODKEY ) " + _
  " LEFT JOIN GD_GOODGROUP gg on g.GROUPKEY  =  GG.ID " + _
  " LEFT JOIN GD_VALUE V ON ( G.VALUEKEY  =  V.ID ) " + _
  " LEFT JOIN AC_ACCOUNT CARD_USR$INV_ACCOUNTKEY ON  ( CARD.USR$INV_ACCOUNTKEY  =  CARD_USR$INV_ACCOUNTKEY.ID ) " + _
  " LEFT JOIN GD_DOCUMENT CARD_USR$INV_ADDLINEKEY ON ( CARD.USR$INV_ADDLINEKEY  =  CARD_USR$INV_ADDLINEKEY.ID ) " + _
  " LEFT JOIN GD_CONTACT CARD_USR$INV_PROVIDER ON ( CARD.USR$INV_PROVIDER  =  CARD_USR$INV_PROVIDER.ID ) " + _
  " WHERE not (GG.LB  >=  :lb  AND  GG.RB  <=  :rb) and  Z.PARENT  =  " + gdcInvDocument.FieldByName("id").AsString
  q1.ParamByName("LB").AsInteger=t.FieldByName("lb").Asinteger
  q1.ParamByName("rB").AsInteger=t.FieldByName("rb").Asinteger
  q1.Open
 
  set q11 = BaseQueryList.Query(BaseQueryList.Add("GDCINVDOCUMENTLINE1", 1))
  call q11.AddField("DOCUMENTDATE", "ftDate", 0, 0)
  call q11.AddField("NUMBER", "ftString", 20,0)
  call q11.AddField("GOODNAME", "ftString", 60, 0)
  call q11.AddField("GOODALIAS", "ftString", 20, 0)
  call q11.AddField("NAME", "ftString", 20, 0)
  call q11.AddField("TO_USR$INV_COSTRETAILNCU", "ftBCD", 0, 0)
  q11.Open
 
  while not q1.EOF
    if CountOnQuantity then
      for i = 0 to Int(q1.FieldByName("quantity").AsCurrency) - 1
        q11.Append
        q11.FieldByName("documentdate").AsDateTime = _
          q1.FieldByName("documentdate").AsDateTime
        q11.FieldByName("NUMBER").AsString=_
          q1.FieldByName("NUMBER").AsString
        q11.FieldByName("goodname").AsString = _
          q1.FieldByName("goodname").AsString
        q11.FieldByName("goodalias").AsString = _
          q1.FieldByName("goodalias").AsString
        q11.FieldByName("name").AsString = _
          q1.FieldByName("name").AsString
        q11.FieldByName("TO_USR$INV_COSTRETAILNCU").AsCurrency = _
          q1.FieldByName("TO_USR$INV_COSTRETAILNCU").AsCurrency
        q11.Post
      next
    else
      q11.Append
      q11.FieldByName("documentdate").AsDateTime = _
        q1.FieldByName("documentdate").AsDateTime
      q11.FieldByName("NUMBER").AsString=_
        q1.FieldByName("NUMBER").AsString
      q11.FieldByName("goodname").AsString = _
        q1.FieldByName("goodname").AsString
      q11.FieldByName("goodalias").AsString = _
        q1.FieldByName("goodalias").AsString
      q11.FieldByName("name").AsString = _
        q1.FieldByName("name").AsString
      q11.FieldByName("TO_USR$INV_COSTRETAILNCU").AsCurrency = _
        q1.FieldByName("TO_USR$INV_COSTRETAILNCU").AsCurrency
      q11.Post
    end if
    q1.Next
  wend
 
  set RetailInv_rp_AddwBill_Order147050326_88538865 = BaseQueryList
 end function

Закончив с функцией, переходим к закладке Шаблон. При открытии закладки, на ее панели инструментов присутствуют четыре кнопки. Нас интересует -- Редактировать шаблон.

Итак, перед нами шаблон печатной формы ценники. Прежде всего, поскольку мы хотим, чтобы данные по номеру и дате накладной печатались на обороте ценника, то нам необходимо добавить вторую страницу. Что мы и делаем, щелкнув правым кликом по закладке Стр. 1 и выбрав пункт добавить страницу. Теперь переключаемся на эту вторую страницу, и в инспекторе объектов указываем в строке Colums значение 3. Таким образом, мы разбиваем лист на три колонки. Перед тем, как внести непосредственно данные нужно добавить Master Data, нажав в правой части на кнопку Вставить секцию и выбрав появившемся окне соответствующий пункт. Далее, нам нужно сориентироваться по размерам ценника, чтобы его лицевая и обратная сторона совпадали между собой. Для этого на первом листе мы выделяем ценник целиком, копируем его и вставляем на вторую страницу. Теперь, у нас есть размеры ценника, но нет его заполнения. Поэтому, мы удаляем все его внутренние поля и вместо них добавляем свои. Для добавления поля, мы нажимаем в левой части окна на кнопку Вставить прямоугольник с текстом и выбираем, куда его вставить. Поле будет вставляться от положения курсора вниз и вправо. Как только мы его вставим, у нас открывается редактор текста, чтобы указать заполнение поля. Чтобы в шаблоне выводились соответствующие значения, нам нужно нажать кнопку Вставка поля БД. Открывается окно для выбора поля. В левой части этого окна мы выбираем группу -- GDCINVDOCUMENTLINE -- а в правой поле -- соответственно DOCUMENTDATE и NUMBER. Выбрав поля, нажимаем кнопку ОК в верхней части окна и возвращаемся в режим Дизайнер. Здесь, зацепив мышкой за уголок поля мы растягиваем его до нужных нам размеров. Для того, чтобы добиться более эстетического вида мы можем внести нужные нам данные в разных полях и разместить их в шаблоне так, как нам нужно.

Осталось сохранить изменения и выйти из шаблона. Есть, однако проблема, которая возникает при неполном заполнении листа и связана с тем, что обратная сторона заполняется при печати зеркально лицевой. В данном случае, поскольку ценники все равно заполняются с обратной стороны одинаковыми данными проблему можно решить убрав на второй транице разделения на колонки и заполнив ее одинаковыми ячейками целиком.

См. также

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты