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

Материал из 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. Выбрав поля, нажимаем кнопку ОК в верхней части окна и возвращаемся в режим Дизайнер. Здесь, зацепив мышкой за уголок поля мы растягиваем его до нужных нам размеров. Для того, чтобы добиться более эстетического вида мы можем внести нужные нам данные в разных полях и разместить их в шаблоне так, как нам нужно. Теперь, осталось лишь сохранить изменения и выйти из шаблона. Есть, однако проблема, которая возникает при неполном заполнении листа и связана с тем, что обратная сторона заполняется при печати зеркально лицевой. В данном случае, поскольку ценники все равно заполняются с обратной стороны одинаковыми данными проблему можно решить убрав на второй транице разделения на колонки и заполнив ее одинаковыми ячейками целиком.

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

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