Экспорт в Word - потеря части данных

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
Red_Ork
Новый участник
Сообщения: 6
Зарегистрирован: 16 сен 2008, 11:08
Откуда: Москва
Контактная информация:

Экспорт в Word - потеря части данных

Сообщение Red_Ork »

Доброго дня, дамы и господа!
Есть такая проблема:
Существует отчет в Лоции. Работает давно и исправно.
Есть шаблон в Word для него.
Нормально экспортировались данные 2 года и не было проблем, но:
Тут пользователь говорит, что в отчете Лоции все нормально, а в Word белиберда.
Начал разбираться:
1. Отчет Лоции формируется нормально.
2. Файл экспорта находит.
3. При экспорте выдает такую вот ошибку:
Изображение
4. В появившемся отчете в Word часть полей (часть нормально) остается "масками", например: $#Ispolnitel#$

Может кто сталкивался с такой проблемой?
Пробовал вводить исходные данные заново.
Пробовал переделывать отчет.
И шаблон.
На разных компах и разных пакетах Office.
Без результата.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Экспорт в Word - потеря части данных

Сообщение Александр »

Offtop- советую забыть по базовый функционал - и переписать экспорт скриптами без использования отчетов и шаблонов Лоции :wink: :wink: :wink:
Последовательность такая
Действие Party
Шаг типа Скрипт (VBScript например)
В нем подключаемся к БД под текущим юзером
Выполняем запрос на чтение нужных данных в recordset
(при желании - из recordset - бросаем данные в массив скрипта)
подключаемся к COM Word
Делаем цикл по recordset'у или массиву
записываем данные или в таблицу Word файла или в DocProperty или в закладку или в найденное место в тексте
и... все
т.е. никаких промежуточных отчетов, никаких подстановочных полей в шаблоне, никаких связок отчет-шаблон, никаких ограничениq по количеству страниц (Excel) и одновременно формируемых документов - полная свобода действий!
и что самое важное - то что в результате получается ЧИСТЫЙ файл - который можно отдать заказчику - не объясняя зачем здесь стоят комментарии, а тут группировки, а тут странные символы и т.д.

очень быстро и просто и независимо от Лоции, и данные можно читать напрямую из базы не запуская Лоцию вообще запустив скрипт например из VBA :wink: :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Red_Ork
Новый участник
Сообщения: 6
Зарегистрирован: 16 сен 2008, 11:08
Откуда: Москва
Контактная информация:

Re: Экспорт в Word - потеря части данных

Сообщение Red_Ork »

Александр писал(а): Действие Party
Шаг типа Скрипт (VBScript например)
Вас из дас? на 4.12 такого не было...
Александр писал(а):Offtop- советую забыть по базовый функционал - и переписать экспорт скриптами без использования отчетов и шаблонов Лоции :wink: :wink: :wink:
......
т.е. никаких промежуточных отчетов, никаких подстановочных полей в шаблоне, никаких связок отчет-шаблон, никаких ограничениq по количеству страниц (Excel) и одновременно формируемых документов - полная свобода действий!
и что самое важное - то что в результате получается ЧИСТЫЙ файл - который можно отдать заказчику - не объясняя зачем здесь стоят комментарии, а тут группировки, а тут странные символы и т.д.

очень быстро и просто и независимо от Лоции, и данные можно читать напрямую из базы не запуская Лоцию вообще запустив скрипт например из VBA :wink: :wink: :wink:
Здорово!
А еще переделать порядка 200 отчетов системы. Подсадить всю команду только на это, завалить все сроки и быть счастливым и довольным =)
Как вариант, но только на этом отчете.
Еще варианты будут?
Red_Ork
Новый участник
Сообщения: 6
Зарегистрирован: 16 сен 2008, 11:08
Откуда: Москва
Контактная информация:

Re: Экспорт в Word - потеря части данных

Сообщение Red_Ork »

Выяснил в чем была ошибка.
Человеческий фактор. Девчонки вбивали данные из таблиц простым копированием вместе с символом возврата каретки. Лоция выводила запросто, но при экспорте ругалась.
Ничего, все к лучшему. Начал изучать скрипты под отчеты.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Экспорт в Word - потеря части данных

Сообщение Александр »

шаг типа скрипт - это в 4.40
на какой версии скрипты появились - честно говоря не помню... вроде и в 4.30 по окончании отчета было...
можно и в отчете, мы так и начинали :wink:
отчет собирает данные
запускается скрипт
читает данные отчета в цикле
формирует все внешние документы
единственное чтобы отчет не висел на экране после отработки скрипта - нужно использовать код

Код: Выделить всё

Dim Doc
Set Doc=Application.ActiveDocument
....
тут чтение данных отчета и формирование внешних документов
....
if Not Doc Is Nothing Then
             Doc.Close
             Set Doc= Nothing
End if
но если у тебя версия которая снята с поддержки по старости.... я бы сто раз подумал со скриптами - там столько всего было...

мы успели пройти с 4.12 и зацепиться за край 4.40 как у нас кончилась поддержка - тут еще можно работать (понадобилось всего-то 1200 сообщений на форуме :wink: ), еще не идеал но уже где-то рядом :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Экспорт в Word - потеря части данных

Сообщение Александр »

пример скрипта в отчете - создать бейджи для семинара (Excel)

Код: Выделить всё

Option explicit       'требование объявления переменных
Sub rep_Vizitka
     Dim ExcApp,doc,shBadge,Count,mRow,mRowD,mValue,templName,bool,j
     'проверим запущен ли в системе Excel если да то подключимся к нему если нет откроем новый
     '(проверку на то что в системе вообще установлен Excel здесь делать не будем)
     On Error Resume Next                         'если дальше будет ошибка - учесть ее и продолжить работу
     set ExcApp = Getobject(, "Excel.Application")'попробовать подключиться к запущенному Excel   
     if Err.Number <> 0 then                      'Если оказалось что Excel еще не открыт - запустить его
         set ExcApp=CreateObject("Excel.Application")
     end if

     templName= LsRpt.GetItem(1,"Path") 
     set Doc=ExcApp.WorkBooks.Add( templName )    'создать новый файл на основе шаблона      
     set shBadge=Doc.WorkSheets("Бейдж")              'подключиться к листу

'     ExcApp.Visible=True                                               'сделать Excel видимым
     mRow=LsRpt.RowCount()                                       'прочитать количество строк в отчете Лоции
     shBadge.Activate                                                    'сделаем лист активным
                                                                                     'подсчитаем количество строк из расчета 2 на одной строке
       bool=mRow And 1                                                 'проверим четное нечетное
        If bool Then
              mRowD=(mRow+1-1)/2
                   Else
              mRowD=(mRow-1)/2
        End If

 'вставим пустые строки под таблицу и отформатируем их
         with shBadge
            .select
            .Cells(5,1).Resize(mRowD*4).EntireRow.Insert     
            .Rows("1:4").copy

             j=1
             for Count=1 to mRowD*2 step 2

                 .Cells(j,2).Value= LsRpt.GetItem(Count,"col2")          'ФИО
                 .Cells(j+1,2).Value= LsRpt.GetItem(Count,"col5")      'Должность
                 .Cells(j+2,2).Value= LsRpt.GetItem(Count,"col6")      'Компания
                 .Cells(j+3,1).Value= LsRpt.GetItem(Count,"number")

                  if Count<mRow then 
                            .Cells(j,4).Value= LsRpt.GetItem(Count+1,"col2")      'ФИО
                            .Cells(j+1,4).Value= LsRpt.GetItem(Count+1,"col5")  'Должность
                            .Cells(j+2,4).Value= LsRpt.GetItem(Count+1,"col6")  'Компания
                            .Cells(j+3,3).Value=  LsRpt.GetItem(Count+1,"number") 
                                             else
                            .Cells(j,4).Value=""
                            .Cells(j+1,4).Value=""
                            .Cells(j+2,4).Value=""
                            .Cells(j+3,3).Value= ""
                 end if
                 j=j+4 

                if mRow>2 and count<mRow-1 then  
                      .Range(.Cells(j,1),.Cells(j,1)).select
                      .paste
                      .ClearContents
                end if                
            next  
           ExcApp.CutCopyMode = False
           .Range(.Cells(4,1),.Cells(4,1)).select
         end with     

       ExcApp.Visible=True                      'сделать Excel видимым

    'отключимся от Excel (очистим память) (убъем обекты)
     if Not shOrder Is Nothing Then Set shBadje = Nothing
     if Not Doc Is Nothing Then Set Doc = Nothing
     if Not ExcApp Is Nothing Then Set ExcApp = Nothing

End Sub 
использование отчета для сбора данных - это было что-то :wink: но по бедности и это был выход в свое время, для Word тоже могу выложить - но просто скрипт из шага - поскольку отчеты для этих целей 100 лет не используем

ps
лучше не цепляться к запущенным приложениям а создавать новые COM подключения...
у нас идет постоянная ежедневная плотная работа по выпуску комплектов документов excel и word (счета, договора и т.д.) - и скрипты оправдывают себя на 100%

pps
кстати и в случае старой версии можно использовать скрипт альтернативно :wink:
сделать отчет который допустим выводит только одну колонку или число - неважно все равно использовать не будем, главное чтобы отчет запустил скрипт.. :wink:
а тут уже в скрипте пишем свои запросы и делаем что нужно - круто кстати тоже :wink: :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Red_Ork
Новый участник
Сообщения: 6
Зарегистрирован: 16 сен 2008, 11:08
Откуда: Москва
Контактная информация:

Re: Экспорт в Word - потеря части данных

Сообщение Red_Ork »

Александр, огромное спасибо!
Именно использование скрипта отчета для обработки данных меня и заинтересовало.
Переход на использование скриптов вместо классических отчетов данных Лоции будет постепенным.
Александр писал(а):кстати и в случае старой версии можно использовать скрипт альтернативно :wink:
сделать отчет который допустим выводит только одну колонку или число - неважно все равно использовать не будем, главное чтобы отчет запустил скрипт.. :wink:
а тут уже в скрипте пишем свои запросы и делаем что нужно - круто кстати тоже :wink: :wink: :wink:
Именно. Не забываем, что отчет можно выполнить и из действия 8)
Александр писал(а):использование отчета для сбора данных - это было что-то :wink: но по бедности и это был выход в свое время, для Word тоже могу выложить - но просто скрипт из шага - поскольку отчеты для этих целей 100 лет не используем
То есть сейчас данные выбираются прямо скриптом из таблиц БД? Или я не так понял?
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Экспорт в Word - потеря части данных

Сообщение Александр »

:wink: да все так
вот смотри - интересный алгоритм для твоей версии 4.12 (у нас работал в несколько ином виде в течении полутора лет)
0. Шаг действия в котором запускается отчет
1. Отчет (допустим по выделенному объекту) - выводит одну строку - 'Подождите идет формирование документа' на этом отчет отработал, висит на экране и - запускает скрипт
2. Скрипт (допустим VBScript) подключается к БД под текущим юзером - синтаксис Лоции ИЛИ что гораздо интереснее подключается к БД через ADO под админом или под юзером входящим в группу db_reader (БД) - это для скорости чтобы формировать запросы без _view. Обязательно используем модули - чтобы не писать одно и тоже по сто раз.
3. Скрипт выполняет твой запрос к БД. Запрос получается динамический (т.к. текст) или конечно ты можешь использовать вызовы любых своих функций и процедур из БД, не важно - запрос возвращает или одно значение или таблицу
4. В Скрипте обрабатываешь результат или через recordset или через массив - как нравится
4.1. Если нужно выполняешь из скрипта еще миллион запросов для сбора всех нужных тебе данных
5. Тут же формируешь сколько нужно внешних документов любых типов в любом количестве и сохраняешь их в некотором своем каталоге. Этап формирования можешь показывать .visible можешь нет
6. В конце скрипта вешаешь сообщение типа MsgBox "Формирование документов завершено" - это для того чтобы нам засечь момент окончания скрипта перед возвращением в действие по окончании работы отчета.
7. В самом конце скрипта - убиваешь отчет - он пропадает с экрана.
8. Вернулись в действие, при этом знаем что документы УЖЕ сформированы, знаем где они лежат, знаем сколько их как называются, Пути, Примечания и т.д. - мы для этого вместе с документами создавали заголовочный ini файл где были описаны все сформированные документы (Вся работа с файловой системой через WSH или как привык, не важно тоже :wink: )
9. Импортируешь в действии все созданные документы в эл. архив
10. Все в том же действии открываешь все созданные документы из эл. архива.
все :wink: :wink: :wink:

какие моменты не ясны - спрашивай

ps
кстати все написанные скрипты - естественно можно будет использовать и в 4.40, просто для совместимости лучше сразу отказаться от чтения данных собранных отчетом (или максимально сократить их количество) - и получать их напрямую своими запросами из скрипта, и в отладке легче и кода меньше

pps
сейчас у нас не более десятка отчетов и все они чисто информационные, не более того - вся обработка и анализ - только скриптами

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Экспорт в Word - потеря части данных

Сообщение Александр »

вот та же процедурка для выпуска бейджиков чисто скриптами из шага действия 4.40

Код: Выделить всё

'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'подготовить Бейджи
Sub Print_Beidg()
'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     Dim ExcApp,doc,shBadge,Count, mRowD, Path 
     Dim sql,id_aObject, Arr, i , j, Check

'прочтем данные из Лоции
     id_aObject=LsVars.GetVarValue("id_aObject")
     Check=LsVars.GetVarValue("Check")
     Path= "...\Семинары\Бейдж.xls" 

'прочтем данные из БД
    If DataBase.ADODB_Connected Then                                                                                       ' если подключиться удалось работаем иначе нет
      If DataBase.ADODB_RecordSet Then                                                                                      ' если удалось создать recordset тоже работаем
        select case check
          case 1 'докладчики и участники
            sql = "SELECT rw.description, vv1.value, vv2.value FROM lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id=tw.id left join lsdbo.attrib_value av1 on rw.id=av1.object_id and av1.attrib_id=3000000000086 left join lsdbo.value_string vv1 on av1.value_id=vv1.id and av1.attrib_id=3000000000086 left join lsdbo.attrib_value av2 on rw.id=av2.object_id and av2.attrib_id=100004068400000 left join lsdbo.value_string vv2 on av2.value_id=vv2.id and av2.attrib_id=100004068400000 where rw.id in (select id from LSDBO.Ric_Get_objChild("+cStr(id_aObject)+",'Стки,Стк') union all select id from LSDBO.Ric_Get_objChild("+cStr(id_aObject)+",'Lsts,Lst')) order by vv2.value"
          case 2 'только докладчики
            sql = "SELECT rw.description, vv1.value, vv2.value FROM lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id=tw.id left join lsdbo.attrib_value av1 on rw.id=av1.object_id and av1.attrib_id=3000000000086 left join lsdbo.value_string vv1 on av1.value_id=vv1.id and av1.attrib_id=3000000000086 left join lsdbo.attrib_value av2 on rw.id=av2.object_id and av2.attrib_id=100004068400000 left join lsdbo.value_string vv2 on av2.value_id=vv2.id and av2.attrib_id=100004068400000 where rw.id in (select id from LSDBO.Ric_Get_objChild("+cStr(id_aObject)+",'Стки,Стк')) order by vv2.value"
          case 0 'только участники
            sql = "SELECT rw.description, vv1.value, vv2.value FROM lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id=tw.id left join lsdbo.attrib_value av1 on rw.id=av1.object_id and av1.attrib_id=3000000000086 left join lsdbo.value_string vv1 on av1.value_id=vv1.id and av1.attrib_id=3000000000086 left join lsdbo.attrib_value av2 on rw.id=av2.object_id and av2.attrib_id=100004068400000 left join lsdbo.value_string vv2 on av2.value_id=vv2.id and av2.attrib_id=100004068400000 where rw.id in (select id from LSDBO.Ric_Get_objChild("+cStr(id_aObject)+",'Lsts,Lst')) order by vv2.value"
        end select  
        rs.Open sql, cn
        Arr = rs.GetRows '(Rows, Start, Fields)
        rs.Close
        Set rs = Nothing       'убить объект recordset
        Set cn = Nothing       'убить объект соединения с базой
      End if
    End If

'сформируем Excel
     set ExcApp=CreateObject("Excel.Application")
     set Doc=ExcApp.WorkBooks.Add(Path )                                                           'создать новый файл на основе шаблона      
     set shBadge=Doc.WorkSheets("Бейдж")                                                           'подключиться к листу
     shBadge.Activate                                                                                                'сделаем лист активным

'     ExcApp.Visible=True                                                                                           'сделать Excel видимым
    
    mRowD = UBound(Arr, 2) + 1                                                                               'подсчитаем количество строк из расчета 2 на одной строке
    If mRowD And 1Then                                                                                            'проверим четное нечетное
      mRowD = (mRowD + 1) / 2
    Else
      mRowD = (mRowD) / 2
    End If

 'вставим пустые строки под таблицу и отформатируем их
    with shBadge
      .Select
      If mRowD > 1 Then
        .Cells(5, 1).Resize((mRowD - 1) * 4).EntireRow.Insert
        .Rows("1:4").Copy
'        .Range(.Cells(5, 1), .Cells(5 + (mRowD * 4) - 1, 4)).Select
        j = 5
        For i = 1 To mRowD - 1
          .Rows(j).Select
          .Paste
          j = j + 4
        Next
        .Range("A4").Select
      End If
      ExcApp.CutCopyMode = False

      j = 0
      For Count = 0 To (mRowD * 2) - 1 Step 2
        .Cells(j + 1, 1).Value = Count + 1
        For i = 0 To 2 'LBound(Arr, 2) To UBound(Arr, 2) - 1
          .Cells(j + i + 1, 2).Value = Arr(i, Count)
        Next
        If Count < UBound(Arr, 2) Then 'mRowD * 2 Then
          .Cells(j + 1, 3).Value = Count + 2
          For i = 0 To 2 ' LBound(Arr, 2) To UBound(Arr, 2) - 1
            .Cells(j + i + 1, 4).Value = Arr(i, Count + 1)
          Next
        End If
        j = j + 4
      Next
    End With
    Erase Arr

    ExcApp.Visible=True                      'сделать Excel видимым

   'отключимся от Excel (очистим память) (убъем обекты)
    If Not shBadge Is Nothing Then Set shBadge = Nothing
    If Not doc Is Nothing Then Set doc = Nothing
    If Not ExcApp Is Nothing Then Set ExcApp = Nothing
End Sub 
используется общий внешний (в рамках Лоции но не отчета) модуль подключения к БД

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Red_Ork
Новый участник
Сообщения: 6
Зарегистрирован: 16 сен 2008, 11:08
Откуда: Москва
Контактная информация:

Re: Экспорт в Word - потеря части данных

Сообщение Red_Ork »

Александр писал(а): 2. Скрипт (допустим VBScript) подключается к БД под текущим юзером - синтаксис Лоции ИЛИ что гораздо интереснее подключается к БД через ADO под админом или под юзером входящим в группу db_reader (БД) - это для скорости чтобы формировать запросы без _view. Обязательно используем модули - чтобы не писать одно и тоже по сто раз.
Тогда еще вопросы:
1. Пример подключения через ADO к БД Лоции.
2. Использование модуля. Что-то не нашел (может плохо искал?) Модуль можно добавить при создании скрипта в отчете.
Можно добавить, но я не нашел, где создать.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Экспорт в Word - потеря части данных

Сообщение Александр »

я не помню как было в 4.12, сейчас смысл в том что у текущего объекта к которому привязан скрипт всегда есть модуль Global - по умолчанию. и с другой стороны ты можешь сам создать новый ('внешний') модуль там же (справа посмотри кнопка Создать) - если есть - создаешь новый модуль и потом после сохранения просто добавляешь его к проекту (кнопка Добавить)(к текущему - Отчет - и ко всем последующим) - и вызов внешних процедур делаешь из модуля Global через точку с именем подключенного модуля и именем процедуры или функции. Единственная проблема что ошибочно созданные модули до сих пор (4.40) не удаляются из системы....
но опять же не помню - есть ли это в 4.12 Если нет - все пишешь в Global - но уже не комильфо

пример модуля работы с БД (DataBase)

Код: Выделить всё

Option Explicit          'требование объявления переменных
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

' по работе с БД   http://www.script-coding.info/ADO.html
' по работе с ADO http://msdn.microsoft.com/en-us/library/ms676795%28v=VS.85%29.aspx
' по работе с VBA http://www.askit.ru/custom/vba_office/vba_office_plan.htm
'                           http://msdn.microsoft.com/ru-ru/library/2x7h1hfk%28v=VS.90%29.aspx

' функция создания и открытия подключения к базе данных
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Function ADODB_Connected
  If IsObject(cn) And TypeName(cn) = "Connection" Then
      ADODB_Connected=True
'      msgbox "Соединение уже существует"
      Exit Function
  Else
      On Error Resume Next
      set cn = CreateObject("ADODB.Connection")
'подключение под админом
'           cn.Open "Provider=SQLOLEDB;Data Source=имя сервера;Initial Catalog=наименование БД;User ID=логин админа;Password=пароль админа;"
'подключение через юзера db_reader
            cn.Open "Provider=SQLOLEDB;Data Source=имя сервера;Initial Catalog=наименование БД;User ID=логин 'быстрого' юзера;Password=пароль 'быстрого' юзера;"

'      If cn.Errors.Count = 0 And Err.Number = 0 Then (cn.Errors сработать еще не успевает поэтому уходим по Err)
      If Err.Number = 0 Then
          ADODB_Connected = True
'          msgbox "Новое соединение"
          Exit Function
        Else
        '  ShowError ("Подключение к БД")
          ShowCnError ("Подключение к БД")
          ADODB_Connected = False
          If Not cn Is Nothing Then Set cn = Nothing
        End If
  End If
End Function

' функция создания recordset
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Function ADODB_RecordSet()
  If IsObject(rs) And TypeName(rs) = "Recordset" Then
      ADODB_RecordSet = True
'      msgbox "RecordSet уже существует"
      Exit Function
  Else
       On Error Resume Next
       Set rs = CreateObject("ADODB.Recordset")
       If Err.Number = 0 Then
          ADODB_RecordSet = True
'         msgbox "Новый RecordSet"
          Exit Function
       Else
          ShowError ("Создание объекта Recordset")
          ADODB_RecordSet = False
          If Not rs Is Nothing Then Set rs = Nothing
          If Not cn Is Nothing Then Set cn = Nothing
       End If
  End If
End Function

' функция создания command и подключения к cn
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Function ADODB_Command()
  If IsObject(cmd) And TypeName(cmd) = "Command" Then
      ADODB_Command = True
'      msgbox "Command уже существует"
      Exit Function
  Else
       On Error Resume Next
       Set cmd = CreateObject("ADODB.Command")
             cmd.ActiveConnection = cn
       If Err.Number = 0 Then
          ADODB_Command = True
'         msgbox "Новый Command"
          Exit Function
       Else
          ShowError ("Создание объекта Command")
          ADODB_Command = False
          If Not cmd Is Nothing Then Set cmd = Nothing
          If Not cn Is Nothing Then Set cn = Nothing
       End If
  End If
End Function

' процедура просмотра информации о ошибках при создании объекта Connect
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub ShowCnError(Msg)
  Dim errLoop
  Dim strError
          
    strError = ""
      For Each errLoop In cn.Errors
        strError = strError & _
                       "Error #" & errLoop.Number & vbCr & _
                       "   " & errLoop.Description & vbCr & _
                       "   (Source: " & errLoop.Source & ")" & vbCr & _
                       "   (SQL State: " & errLoop.SqlState & ")" & vbCr & _
                       "   (NativeError: " & errLoop.NativeError & ")" & vbCr
        If errLoop.HelpFile = "" Then
          strError = strError & _
                       "   No Help file available" & vbCr & vbCr
        Else
          strError = strError & _
                       "   (HelpFile: " & errLoop.HelpFile & ")" & vbCr & _
                       "   (HelpContext: " & errLoop.HelpContext & ")" & vbCr & vbCr
        End If
      Next
      
     strError = strError & vbCr & vbCr & _
                        "Обратитесь к администратору системы"
                   
      MsgBox strError, vbOKOnly + vbExclamation + vbSystemModal, Msg
' cn.Errors.Clear
End Sub

' процедура просмотра информации о ошибках (объект Err)
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub ShowError(Msg)
  Dim strError
        strError = "Error #" & Err.Number & vbCr & _
                       "   " & Err.Description & vbCr & _
                       "   (Source: " & Err.Source & ")" & vbCr
        If Err.HelpFile = "" Then
          strError = strError & _
                       "   No Help file available" & vbCr & vbCr
       Else
          strError = strError & _
                       "   (HelpFile: " & Err.HelpFile & ")" & vbCr & _
                       "   (HelpContext: " & Err.HelpContext & ")" & vbCr & vbCr
        End If
    
        Err.Clear
        strError = strError & vbCr & vbCr & _
                       "Обратитесь к администратору системы"

         MsgBox strError, vbOKOnly + vbExclamation + vbSystemModal, Msg

               '        "   (Erl: " & Err.Erl & ")" & vbCr & _
               '        "   (LastDllError: " & Err.LastDllError & ")" & vbCr & vbCr &
End Sub

' процедура просмотра информации о параметрах хранимой процедуры для cmd
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub ShowCmdParameters(desc)
Dim tmp, Param
  
  tmp = desc & vbCr & vbCr
  For Each Param In cmd.Parameters
    tmp = tmp & "Name = " & Param.Name & _
                        " Attributes = " & Param.Attributes & _
                        " Direction = " & Param.Direction & _
                        " Size = " & Param.Size & _
                        " Type = " & Param.Type & _
                        " Value = " & Param.Value & vbCr
  Next
  MsgBox tmp, vbOKOnly + vbInformation + vbSystemModal, "Параметры хранимой процедуры"

End Sub

' процедура очистки/удаления всех параметров cmd
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub ClearCmdParameters()
  Dim lngX
    cmd.CommandType = DataBaseConstant.adCmdUnknown            'тип объекта - по умолчанию
    cmd.CommandText = ""                                  'имя
    For lngX = (cmd.Parameters.Count - 1) To 0 Step -1
        cmd.Parameters.Delete lngX
    Next
End Sub

' функция открытия recordset
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Function OpenRecordSet(sql)
'  On Error Resume Next
   rs.Open sql, cn
'  If Err.Number = 0 Then
   If Not rs Is Nothing Then
      If Not (rs.EOF Or rs.BOF) Then
         OpenRecordSet = True         'есть данные
         Exit Function
       Else
         OpenRecordSet = False        'пустой
         Exit Function
      End If
   Else
         OpenRecordSet = False        'recordset не существует
         Exit Function
  End If
'Else
'          MsgBox "Error: " & Err.Number
'         OpenRecordSet = False        'ошибка открытия
'End If
End Function


' функция выполнения одного запроса через объект cn (Connect)
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Function GetSingleData(Sql)
 Dim Rs, val

   Set Rs = cn.Execute(sql)
   If Rs.BOF And Rs.EOF Then
     val = vbNullString
   Else
     val = Rs.Fields(0).Value
   End If

   Set Rs = Nothing
   GetSingleData = val
End Function
в модуле Global не забудь объявить глобальные переменные типа

Код: Выделить всё

Option Explicit          'требование объявления переменных
'---------------------------------------------------------------------------------------------------------------------------
'    Глобальные переменные
'---------------------------------------------------------------------------------------------------------------------------
Public cn                            'соединение
Public rs                             'recordset
ну и т.д. все в том же духе, код может не идеальный и намеренно избыточный - но это не важно, главное рабочий :wink: :wink:
а так - можно написать все в 100 раз короче и без проверок - посмотри по ссылкам.. мне просто было удобнее так, поскольку особенно не разбираюсь в этом деле - просто хобби :wink: :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Red_Ork
Новый участник
Сообщения: 6
Зарегистрирован: 16 сен 2008, 11:08
Откуда: Москва
Контактная информация:

Re: Экспорт в Word - потеря части данных

Сообщение Red_Ork »

Александр писал(а):я не помню как было в 4.12, сейчас смысл в том что у текущего объекта к которому привязан скрипт всегда есть модуль Global - по умолчанию. и с другой стороны ты можешь сам создать новый ('внешний') модуль там же (справа посмотри кнопка Создать) - если есть - создаешь новый модуль и потом после сохранения просто добавляешь его к проекту (кнопка Добавить)(к текущему - Отчет - и ко всем последующим) - и вызов внешних процедур делаешь из модуля Global через точку с именем подключенного модуля и именем процедуры или функции. Единственная проблема что ошибочно созданные модули до сих пор (4.40) не удаляются из системы....
Ура! Нашел!
Конечно сложно было вынести меню с управлением модулями в главное дерево интерфейса Лоции. Реально нелогично.
Ну что ж! Теперь буду сидеть разбираться с отчетами и обработкой данных.
Спасибо огромное за участие :D
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Экспорт в Word - потеря части данных

Сообщение Александр »

нет ты не понимаешь во что ввязываешься :wink:
с этого момента Лоция превращается лишь в оболочку для наполнения БД - не более того
а тебе открывается весь мир объектов, которых миллионы :wink: :wink: :wink: и скоростной доступ к чтению данных
и масса прочих приятных моментов
один из которых, ну например - при наполнении БД, первоначальной регистрации информации - использование объекта regexp в скриптах для очистки от мусора Copy+Paste - это просто супер!!!!
ну и т.д. и в том же духе! но правда уже в 4.40 - где скрипты вызываются по кнопкам :wink: :wink: :wink:

единственная неприятность - нет интерфейса кроме как MsgBox, но не принципиально
зато
забываем про Лоцию напрочь - запускаем любой отладчик понимающий VBScript или jScript - и спокойно работаем где нам удобно
... в общем как-то так
рад был заронить дух свободы в душу еще одного админа :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Юрий
Активный участник
Сообщения: 239
Зарегистрирован: 13 янв 2005, 14:30
Используемое ПО: Lotsia PDM PLUS LT
Откуда: Украина, Донецк
Контактная информация:

Re: Экспорт в Word - потеря части данных

Сообщение Юрий »

Александр писал(а): ... единственная неприятность - нет интерфейса кроме как MsgBox, ...
Интерфейс можно легко создать с помощью например C#. Пишем ActiveX модуль
с интерфейсом и легко его запускаем из скрипта. :wink:
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Экспорт в Word - потеря части данных

Сообщение Александр »

в продолжении пример для Word http://www.lplm.ru/phpBB2/viewtopic.php?f=18&t=638

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Ответить