(изменено: , 29 сентября 2017 12:16:14)

Тема: Переходна новый разработчикотчетов

Добрый день!
1. При формировании шаблона отчета в Open office возможно ли шаблон предварительно сохранить в файл (исходный шаблон в microsoft office) и загрузить его в open office? Если да, то это не работает. 
2. В какой области формировать расчет с помещением данных в таблицу mdb с дальнейшим отображением данных из этой таблицы в теле отчета

111

Спасибо сказали: comerc101

Re: Переходна новый разработчикотчетов

1. При формировании шаблона отчета в Open office возможно ли шаблон предварительно сохранить в файл (исходный шаблон в microsoft office) и загрузить его в open office? Если да, то это не работает.

МЫ обычно делаем так (так как сейчас ведем отчеты в обеих системах).
Проектируем в MS Office. Когда отчет готов, создаем набор данных для Open Office, копируем в него данные из отчета для MS, Открываем бланк в Open Office Calc, вызываем команду сохранить как и сохраняем в тот же файл но меняем формат, получаем готовый отчет в Open Office Calc - но надо его просмотреть, там не все конвертится без ошибок, как минимум надо проверить имена, и с пробелами в именах проблемы бывают в Open Office (их лучше убрать если есть).

2. В какой области формировать расчет с помещением данных в таблицу mdb с дальнейшим отображением данных из этой таблицы в теле отчета

А подробнее? Видится такой способ
1. Создаем обработчик на начало отчета https://help.technologics.ru/7.1/TCSHelp/_708.htm
2. В нем создаем таблицу через вызов TCSRpt.RptFunc.ExecuteDirectSQL
3. Тем же методом вставляем данные в эту таблицу
4. Пользуемся это таблицей

для реентерабельности процесса грохаем таблицу в начала либо проверяем если есть - код пропускаем.

Спасибо сказали: comerc101

Re: Переходна новый разработчикотчетов

Сам шаблон отчета (таблицы и её поля из шаблона в шаблон копируются?)

Re: Переходна новый разработчикотчетов

Если не ошибаюсь, таблицы что выгружает репортер он сам и создает заново. Те что не его не трогает.

Ну или подробней расскажите что вы пытаетесь реализовать. Я так понял тут как раз вопрос по работе с внешней БД возникает?

Re: Переходна новый разработчикотчетов

Есть шаблон типа Документы (данные в MS Access) мне надо самым оптимальным способом  перевести его на open office вместе с шаблоном и бланками.

Re: Переходна новый разработчикотчетов

https://help.technologics.ru/7.1/TCSHelp/_733.htm

Re: Переходна новый разработчикотчетов

Добрый день! Есть много функций которые обращаются к внешней базе данных. Вот одна из них. Как данная функция должна выглядеть в новом reporterе типа excel

Public Function dengi(Isd, dopisd, ms) As String
'расчет расценки в зависимости от разряда, коефф. берется из таблицы mssql и умножается на Тшт
Dim p2, P3, P31, D
    Dim tsh, KOEF
Dim DatConct As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim Rs1 As ADODB.Recordset
    p2 = Isd.Fields(2)
    P3 = Isd.Fields(3)
    P31 = Isd.Fields(31)
    Set DatConct = New ADODB.Connection
    Set Rs = New ADODB.Recordset
    Set Rs1 = New ADODB.Recordset
DatConct.Open "Provider=SQLOLEDB.1;Password=va11sy;Persist Security Info=True;User ID=sa;Initial Catalog=INDUSTRICS_ADDITIONAL;Data Source=TECHNOLOGICS"
    tsh = 0
Rs.Open "SELECT P5 FROM TechnoParameters_RptSheet WHERE P2=" & p2 & "AND P3=" & P3 & "AND p4 = 'TCS_OB_TS'", Application.CurrentProject.Connection, adOpenDynamic, adLockOptimistic

If Not Rs.EOF Then
    tsh = Rs.Fields(0)
    End If
    KOEF = 0
If Not IsNull(P31) Then
‘ обращение к внешней базе данных
Rs1.Open "SELECT TARIF_KOEF FROM CATEGORY WHERE CATEGORY_NOTE=" & P31, DatConct
If Not Rs1.EOF Then
    KOEF = Rs1.Fields(0)
    End If
End If
D = Round(KOEF * tsh + 0.000005, 3)
If D = 0 Then
dengi = ""
Else
dengi = CStr(D)
End If
  End Function

Re: Переходна новый разработчикотчетов

Шаблон отчета - Доп. настройки - Функции
Перед формированием отчета создадим соединение с внешней базой данных и набор данных через который будим выполнять запросы.

'Эта процедура выполняется один раз перед формированием отчета
Sub TCSRpt_Begin()
  'создаем соединение с БД
  Dim con 'as ADODB.Connection
  Set con = CreateObject("ADODB.Connection")
  con.Open "Provider=SQLOLEDB.1;Password=va11sy;Persist Security Info=True;User ID=sa;Initial Catalog=INDUSTRICS_ADDITIONAL;Data Source=TECHNOLOGICS"

  'создаем источник данных и связываем его с базой данных
  Dim rs 'as ADODB.Recordset
  Set rs = CreateObject("ADODB.Recordset")
  Set rs.ActiveConnection = con

  'сохраним ссылки на объекты для дальнейшего использования
  Set TCSRpt.RptFunc.UserValue("Connection") = con
  Set TCSRpt.RptFunc.UserValue("Recordset") = rs

  'добавим запрос (лучше добавить запрос на вкладке "Именованные объекты")
  'Возможно стоит присоединить таблицу "TechnoParameters_RptSheet" к главному запросу через JOIN
  call TCSRpt.RptFunc.AddRptRecordSet("TechnoParameters", "SELECT P5 FROM TechnoParameters_RptSheet WHERE P2=[p2] AND P3=[P3] AND p4 = 'TCS_OB_TS'")
End Sub

Function dengi() 'As String
  const adStateOpen = 1
  'расчет расценки в зависимости от разряда, коефф. берется из таблицы mssql и умножается на Тшт
  Dim p2, P3, P31, D
  Dim tsh, KOEF
  Dim DatConct 'As ADODB.Connection
  Dim Rs 'As IReporterRecordSet
  Dim Rs1 'As ADODB.Recordset

  'получаем значения из основного источника данный
  p2 = TCSRpt.RptFunc.MainRptRecordSet.FieldByIndex(2).AsVariant
  P3 = TCSRpt.RptFunc.MainRptRecordSet.FieldByIndex(3).AsVariant
  P31 = TCSRpt.RptFunc.MainRptRecordSet.FieldByIndex(31).AsVariant

  tsh = 0

  'открываем набор данных
  'Если присоединить таблицу "TechnoParameters_RptSheet" к главному запросу, то этот набор не понадобится
  set Rs = TCSRpt.RptFunc.OpenRptRecordSetEx("TechnoParameters", array("P2", "P3"), array(P2, P3))

  If Not Rs.IsEof Then
    tsh = Rs.FieldByIndex(0).AsSafeFloat
  End If
  KOEF = 0
  If Not IsNull(P31) Then
    ' обращение к внешней базе данных
    Set Rs1 = TCSRpt.RptFunc.UserValue("Recordset")
    'закрываем если открыт
    If (Rs1.State And adStateOpen) = adStateOpen Then Rs1.Close
    ' открываем набор данных
    Rs1.Open "SELECT TARIF_KOEF FROM CATEGORY WHERE CATEGORY_NOTE=" & P31

    If Not Rs1.EOF Then
      KOEF = Rs1.Fields(0)
    End If
  End If
  D = Round(KOEF * tsh + 0.000005, 3)
  If D = 0 Then
    dengi = ""
  Else
    dengi = CStr(D)
  End If
End Function

Re: Переходна новый разработчикотчетов

Вариант 2
Перед формированием отчета копируем необходимые данные в базу репортера и используем их как данные репортера.

Sub TCSRpt_Begin()
  'создаем соединение с БД
  Dim con 'as ADODB.Connection
  Set con = CreateObject("ADODB.Connection")
  con.Open "Provider=SQLOLEDB.1;Password=va11sy;Persist Security Info=True;User ID=sa;Initial Catalog=INDUSTRICS_ADDITIONAL;Data Source=TECHNOLOGICS"

  'создаем источник данных и связываем его с базой данных
  Dim rs 'as ADODB.Recordset
  Set rs = CreateObject("ADODB.Recordset")
  Set rs.ActiveConnection = con

  ' создаем таблицу в базе репортера
  call TCSRpt.RptFunc.ExecuteDirectSQL("CREATE TABLE CATEGORY (TARIF_KOEF NUMBER, CATEGORY_NOTE CHAR) ")

  'открываем набор данных
  rs.Open "SELECT TARIF_KOEF, CATEGORY_NOTE FROM CATEGORY"
  'копируем данные
  do while not rs.Eof
    call TCSRpt.RptFunc.ExecuteDirectSQL("INSERT INTO CATEGORY(TARIF_KOEF, CATEGORY_NOTE) values (" & rs.Fields(0).Value & "," & rs.Fields(1).Value & ")" )
    rs.Next
  loop
End Sub

Re: Переходна новый разработчикотчетов

Спасибо, еще вопрос
1) Ш&НомерСтрокиНаЛисте умерло? Теперь только через функцию?
2) ТипКласса и Класс обязательные ALIAS в пространстве Источника данных?

Re: Переходна новый разработчикотчетов

3)Можно ли в функциях использовать результаты из раздела запросы и если можно, то какой синтаксис?
4)Как отлаживать источники данных, функции, запросы? В 4 я делала так: специально в источнике данных в имени таблицы делала ошибку вследствие чего происходила выгрузка данных в Access там я на выгруженных данных и отрабатывала все запросы какие мне надо, а здесь как? Протокол дал ошибку синтаксиса и что дальше..........?

(изменено: Виктор Бебякин, 6 октября 2017 05:45:33)

Re: Переходна новый разработчикотчетов

1) Ш&НомерСтрокиНаЛисте умерло? Теперь только через функцию?

Служебное слово "$НомерСтрокиНаЛисте" используется в любой ячейки области "ЗаполнениеСоставаКарты"
https://help.technologics.ru/7.1/TCSHelp/_729.htm

2) ТипКласса и Класс обязательные ALIAS в пространстве Источника данных?

Зависит от вида шаблона
https://help.technologics.ru/7.1/TCSHelp/_720.htm

3)Можно ли в функциях использовать результаты из раздела запросы и если можно, то какой синтаксис?

TCSRpt.RptFunc.GetNamedValue("<ИмяОбъекта>") 
TCSRpt.RptFunc.GetNamedValueEx("<ИмяОбъекта>",  <Имена параметров>, <ЗначенияПарамтеров>)

https://help.technologics.ru/7.1/TCSAPI … lue_13.htm
https://help.technologics.ru/7.1/TCSAPI … eEx_13.htm

4)Как отлаживать источники данных, функции, запросы? В 4 я делала так: специально в источнике данных в имени таблицы делала ошибку вследствие чего происходила выгрузка данных в Access там я на выгруженных данных и отрабатывала все запросы какие мне надо, а здесь как? Протокол дал ошибку синтаксиса и что дальше..........?

Запустить отчет, найти в журнале  отчета путь к базе данных, открыть базу в Access и отлаживайте как раньше.
Отлаженный запрос записываете в именованный объект и при необходимости редактируется бланк, после чего можно выполнить отчет прямо из модуля построения отчетов на выгруженных данных.
Если на вкладке "Доп. Настройки - SQL команды" есть SQL запросы, например создание индексов (CREATE INDEX), то в журнале отчета будут ошибки с текстом: "индекс уже существует". Это происходит потому что SQL команды выполняются каждый раз перед формированием отчета а при повторном запуске база не выгружается. Если это мешает, то на время отладки можно удалить SQL команды. После того как отчет будет отлажен, необходимо выполнить его с выгрузкой данных и убедиться что нет ошибок.

Re: Переходна новый разработчикотчетов

Спасибо.

Re: Переходна новый разработчикотчетов

Еще вопрос
переменная T = "Select.......длинныйзапрс"
затем Rs4.open T - не воспринимается
Какой синтаксис в этом случае? Может скобки или.......

Re: Переходна новый разработчикотчетов

А что за ошибка?
Возможно не установлено соединение, свойство ActiveConnection
смотрите справку:
https://docs.microsoft.com/ru-ru/sql/ad … -recordset

Re: Переходна новый разработчикотчетов

В новой версии TechnologiCS у нового построителя отчетов будут функции по работе с внешними базами данных (ms access, ms sql). То есть будет возможность получать данные из внешних бд намного проще чем в приведенных примерах.
Насколько я знаю у вас сейчас только идет переход на новую версию, возможно вам имеет смысл опробовать сразу новый функционал. Если есть интерес, обратитесь к нашим специалистам.

Re: Переходна новый разработчикотчетов

1)С предыдущим вопросом разобралась

2)$НомерСтрокиНаЛисте - так работает, а как сделать склйку с текстовым символом?
 
3) Конечно интерес использовать новые функции по работе с внешними БД  есть т.к. какой смысл  переписывать всё по несколько раз. 

4)А пока ещё вопрос - игнорируются группировки. Кому файлик?

Re: Переходна новый разработчикотчетов

2)$НомерСтрокиНаЛисте - так работает, а как сделать склйку с текстовым символом?

На вкладке Доп.Настройки - Именованные объекты, необходимо создать переменную (имя не имеет значения) например "StrCat" с текстом:

s1 & s2 & s3


INPUT
s1=;
s2=;
s3=;

В бланке отчета использовать эту переменную для соединения строк, например так:

?StrCat(s1=№ ;s2=$НомерСтрокиНаЛисте;s3=A;)
Результат: № 123A
или
?StrCat(s1=N;s2=$НомерСтрокиНаЛисте;)
Результат: N123
или
?StrCat(s1=%0;s2=$НомерСтрокиНаЛисте;)
Результат: <значение из поля источника данных><номер строки>

Эту переменную можно использовать для объединения любых данных отчета.
Можно уменьшить число параметров и передавать только текст который необходимо приклеить к номеру строки, тогда текст переменной будет выглядеть так:

p & s2 & s


INPUT
p=;
s2=$НомерСтрокиНаЛисте;
s=;

где p - префикс, s - суффикс.

Re: Переходна новый разработчикотчетов

В нашей демо базе смотрите отчет Технологические документы (НД)(Excel)


Функция

Function GetPrintLiteraNum( Litera )

 If CStr(Litera)="" Then Litera = " "     
 Num = CStr( TCSRpt.RptFunc.ListRowNumber )
 if Num<10 Then Num = "0" + CStr(Num)
 If TCSRpt.RptFunc.RowBreakNumber=0 then 
   GetPrintLiteraNum = CStr(Litera) + CStr(Num)
 Else
  GetPrintLiteraNum = " " + CStr(Num)
 End If   
End Function   

Именованный объект

GetPrintLiteraNum( Par1 )


INPUT
Par1=

В бланке используется как {+}?PrintLiteraNum(Par1=А) и т.д.

Re: Переходна новый разработчикотчетов

4)А пока ещё вопрос - игнорируются группировки. Кому файлик?
Какой файлик?

Для использования группировки необходимо:
В бланке для шаблона строки задать "$НачалоГруппы_<имя группы>", "$СменаГруппы_<имя группы>" или "$КонецГруппы_<имя группы>"
Группу необходимо указать в источнике данных а также в параметрах бланка (параметр "Группа")
https://help.technologics.ru/7.1/TCSHelp/_712.htm

Re: Переходна новый разработчикотчетов

Вот....в параметрах бланка еще надо указать - так все получилось.
Склейку с использованием функции  GetPrintLiteraNum( Litera ) тоже использовала, но показалось не очень удобным.
Спасибо.

Re: Переходна новый разработчикотчетов

Что-то со скоростью выполнения отчетов происходит непонятное.
В 4.7.1 расцех. ведомость на групп. СП из 11 строк формируется 10 сек., В 7.1 на эту же СП со старым RPT 45 сек, с новым RPT 51 сек.
В 4.7.1 расцех. ведомость на групп. СП из 45 строк формируется 23 сек., В 7.1 на эту же СП со старым RPT 1 мин 25 сек, с новым RPT 5 мин 30 сек.
Ещё вот что попробовала - сначала из заполнения состава карты удалила вызов всех функций - на новом RPT скорость не изменилась, потом удалила еще и вызов всех запросов из штампа бланка - скорость не изменилась - значит дело не в функциях, запросах, переменных, а в чем....?
Excel 2015. Удаленный доступ на скорость не влияет - тоже попробовала.
Что может быть не так?

Re: Переходна новый разработчикотчетов

Отчет ваш получили, разбираемся.

В 4.7.1 расцех. ведомость на групп. СП из 45 строк формируется 23 сек., В 7.1 на эту же СП со старым RPT 1 мин 25 сек,

Вот это довольно странный результат с учетом того что старый репортер не изменялся.

Конечно сам TechnologiCS сильно переработан по сравнению с 4.7.1, может это скорость отчета изменило. У вас там к тому же очень много запросов напрямую в БД нашу (а их все надо проверять так как БД у нас за это время сильно изменилась).

Из за того что отчет специфичный (у вас там работа идет по переработке и похоже не завершенная еще), будет работать только на вашей БД, много прямых запросов - разобраться с ним сложно. Но рекомендации по новому репортеру подготовим по вашему примеру.

Re: Переходна новый разработчикотчетов

В области ЗаполнениеСоставаКарты есть строки которые  не используются. Их желательно исключить из области или объединить по горизонтали, чтобы не замедляли формирование отчета.

Для склеивания строк использовать '&' (s = s & <число> & <строка> & <переменная>)
Если использовать '+' то результат может быть не тем что ожидается, например:

  Dim a, b, с
  a = "1"
  b = 2
  c = a + b ' c = 3 а не "12"

И еще, [null + <значение> = <ошибка>], а [null & <значение> = <значение>]

Спасибо сказали: Дмитрий Гамий1

Re: Переходна новый разработчикотчетов

Спасибо за советы. Вот что я предполагаю, сильное снижение скорости идет на этапе формирования листов excel. Я еще попробовала отчет другого типа - там вообще все рассчитывается в implement-е, и расчет прошел нормально по скорости, а листы формировались аж 12 мин. Так вот бланк, шаблон и т.д. разрабатывалось в MS Off 2003, а результат формируется в MS Off 2015 - наверное идет преобразование форматов.  Пересохранила бланк в формате .xlsm, а он у меня не подгружается....может с этим что-то ?