Экспорт в Word - потеря части данных
-
- Новый участник
- Сообщения: 6
- Зарегистрирован: 16 сен 2008, 11:08
- Откуда: Москва
- Контактная информация:
Экспорт в Word - потеря части данных
Доброго дня, дамы и господа!
Есть такая проблема:
Существует отчет в Лоции. Работает давно и исправно.
Есть шаблон в Word для него.
Нормально экспортировались данные 2 года и не было проблем, но:
Тут пользователь говорит, что в отчете Лоции все нормально, а в Word белиберда.
Начал разбираться:
1. Отчет Лоции формируется нормально.
2. Файл экспорта находит.
3. При экспорте выдает такую вот ошибку:
4. В появившемся отчете в Word часть полей (часть нормально) остается "масками", например: $#Ispolnitel#$
Может кто сталкивался с такой проблемой?
Пробовал вводить исходные данные заново.
Пробовал переделывать отчет.
И шаблон.
На разных компах и разных пакетах Office.
Без результата.
Есть такая проблема:
Существует отчет в Лоции. Работает давно и исправно.
Есть шаблон в 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- советую забыть по базовый функционал - и переписать экспорт скриптами без использования отчетов и шаблонов Лоции
Последовательность такая
Действие Party
Шаг типа Скрипт (VBScript например)
В нем подключаемся к БД под текущим юзером
Выполняем запрос на чтение нужных данных в recordset
(при желании - из recordset - бросаем данные в массив скрипта)
подключаемся к COM Word
Делаем цикл по recordset'у или массиву
записываем данные или в таблицу Word файла или в DocProperty или в закладку или в найденное место в тексте
и... все
т.е. никаких промежуточных отчетов, никаких подстановочных полей в шаблоне, никаких связок отчет-шаблон, никаких ограничениq по количеству страниц (Excel) и одновременно формируемых документов - полная свобода действий!
и что самое важное - то что в результате получается ЧИСТЫЙ файл - который можно отдать заказчику - не объясняя зачем здесь стоят комментарии, а тут группировки, а тут странные символы и т.д.
очень быстро и просто и независимо от Лоции, и данные можно читать напрямую из базы не запуская Лоцию вообще запустив скрипт например из VBA
Последовательность такая
Действие Party
Шаг типа Скрипт (VBScript например)
В нем подключаемся к БД под текущим юзером
Выполняем запрос на чтение нужных данных в recordset
(при желании - из recordset - бросаем данные в массив скрипта)
подключаемся к COM Word
Делаем цикл по recordset'у или массиву
записываем данные или в таблицу Word файла или в DocProperty или в закладку или в найденное место в тексте
и... все
т.е. никаких промежуточных отчетов, никаких подстановочных полей в шаблоне, никаких связок отчет-шаблон, никаких ограничениq по количеству страниц (Excel) и одновременно формируемых документов - полная свобода действий!
и что самое важное - то что в результате получается ЧИСТЫЙ файл - который можно отдать заказчику - не объясняя зачем здесь стоят комментарии, а тут группировки, а тут странные символы и т.д.
очень быстро и просто и независимо от Лоции, и данные можно читать напрямую из базы не запуская Лоцию вообще запустив скрипт например из VBA
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 6
- Зарегистрирован: 16 сен 2008, 11:08
- Откуда: Москва
- Контактная информация:
Re: Экспорт в Word - потеря части данных
Вас из дас? на 4.12 такого не было...Александр писал(а): Действие Party
Шаг типа Скрипт (VBScript например)
Здорово!Александр писал(а):Offtop- советую забыть по базовый функционал - и переписать экспорт скриптами без использования отчетов и шаблонов Лоции
......
т.е. никаких промежуточных отчетов, никаких подстановочных полей в шаблоне, никаких связок отчет-шаблон, никаких ограничениq по количеству страниц (Excel) и одновременно формируемых документов - полная свобода действий!
и что самое важное - то что в результате получается ЧИСТЫЙ файл - который можно отдать заказчику - не объясняя зачем здесь стоят комментарии, а тут группировки, а тут странные символы и т.д.
очень быстро и просто и независимо от Лоции, и данные можно читать напрямую из базы не запуская Лоцию вообще запустив скрипт например из VBA
А еще переделать порядка 200 отчетов системы. Подсадить всю команду только на это, завалить все сроки и быть счастливым и довольным =)
Как вариант, но только на этом отчете.
Еще варианты будут?
-
- Новый участник
- Сообщения: 6
- Зарегистрирован: 16 сен 2008, 11:08
- Откуда: Москва
- Контактная информация:
Re: Экспорт в Word - потеря части данных
Выяснил в чем была ошибка.
Человеческий фактор. Девчонки вбивали данные из таблиц простым копированием вместе с символом возврата каретки. Лоция выводила запросто, но при экспорте ругалась.
Ничего, все к лучшему. Начал изучать скрипты под отчеты.
Человеческий фактор. Девчонки вбивали данные из таблиц простым копированием вместе с символом возврата каретки. Лоция выводила запросто, но при экспорте ругалась.
Ничего, все к лучшему. Начал изучать скрипты под отчеты.
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Экспорт в Word - потеря части данных
шаг типа скрипт - это в 4.40
на какой версии скрипты появились - честно говоря не помню... вроде и в 4.30 по окончании отчета было...
можно и в отчете, мы так и начинали
отчет собирает данные
запускается скрипт
читает данные отчета в цикле
формирует все внешние документы
единственное чтобы отчет не висел на экране после отработки скрипта - нужно использовать кодно если у тебя версия которая снята с поддержки по старости.... я бы сто раз подумал со скриптами - там столько всего было...
мы успели пройти с 4.12 и зацепиться за край 4.40 как у нас кончилась поддержка - тут еще можно работать (понадобилось всего-то 1200 сообщений на форуме ), еще не идеал но уже где-то рядом
на какой версии скрипты появились - честно говоря не помню... вроде и в 4.30 по окончании отчета было...
можно и в отчете, мы так и начинали
отчет собирает данные
запускается скрипт
читает данные отчета в цикле
формирует все внешние документы
единственное чтобы отчет не висел на экране после отработки скрипта - нужно использовать код
Код: Выделить всё
Dim Doc
Set Doc=Application.ActiveDocument
....
тут чтение данных отчета и формирование внешних документов
....
if Not Doc Is Nothing Then
Doc.Close
Set Doc= Nothing
End if
мы успели пройти с 4.12 и зацепиться за край 4.40 как у нас кончилась поддержка - тут еще можно работать (понадобилось всего-то 1200 сообщений на форуме ), еще не идеал но уже где-то рядом
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Экспорт в Word - потеря части данных
пример скрипта в отчете - создать бейджи для семинара (Excel)
использование отчета для сбора данных - это было что-то но по бедности и это был выход в свое время, для Word тоже могу выложить - но просто скрипт из шага - поскольку отчеты для этих целей 100 лет не используем
ps
лучше не цепляться к запущенным приложениям а создавать новые COM подключения...
у нас идет постоянная ежедневная плотная работа по выпуску комплектов документов excel и word (счета, договора и т.д.) - и скрипты оправдывают себя на 100%
pps
кстати и в случае старой версии можно использовать скрипт альтернативно
сделать отчет который допустим выводит только одну колонку или число - неважно все равно использовать не будем, главное чтобы отчет запустил скрипт..
а тут уже в скрипте пишем свои запросы и делаем что нужно - круто кстати тоже
Код: Выделить всё
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
ps
лучше не цепляться к запущенным приложениям а создавать новые COM подключения...
у нас идет постоянная ежедневная плотная работа по выпуску комплектов документов excel и word (счета, договора и т.д.) - и скрипты оправдывают себя на 100%
pps
кстати и в случае старой версии можно использовать скрипт альтернативно
сделать отчет который допустим выводит только одну колонку или число - неважно все равно использовать не будем, главное чтобы отчет запустил скрипт..
а тут уже в скрипте пишем свои запросы и делаем что нужно - круто кстати тоже
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 6
- Зарегистрирован: 16 сен 2008, 11:08
- Откуда: Москва
- Контактная информация:
Re: Экспорт в Word - потеря части данных
Александр, огромное спасибо!
Именно использование скрипта отчета для обработки данных меня и заинтересовало.
Переход на использование скриптов вместо классических отчетов данных Лоции будет постепенным.
Именно использование скрипта отчета для обработки данных меня и заинтересовало.
Переход на использование скриптов вместо классических отчетов данных Лоции будет постепенным.
Именно. Не забываем, что отчет можно выполнить и из действияАлександр писал(а):кстати и в случае старой версии можно использовать скрипт альтернативно
сделать отчет который допустим выводит только одну колонку или число - неважно все равно использовать не будем, главное чтобы отчет запустил скрипт..
а тут уже в скрипте пишем свои запросы и делаем что нужно - круто кстати тоже
То есть сейчас данные выбираются прямо скриптом из таблиц БД? Или я не так понял?Александр писал(а):использование отчета для сбора данных - это было что-то но по бедности и это был выход в свое время, для Word тоже могу выложить - но просто скрипт из шага - поскольку отчеты для этих целей 100 лет не используем
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Экспорт в Word - потеря части данных
да все так
вот смотри - интересный алгоритм для твоей версии 4.12 (у нас работал в несколько ином виде в течении полутора лет)
0. Шаг действия в котором запускается отчет
1. Отчет (допустим по выделенному объекту) - выводит одну строку - 'Подождите идет формирование документа' на этом отчет отработал, висит на экране и - запускает скрипт
2. Скрипт (допустим VBScript) подключается к БД под текущим юзером - синтаксис Лоции ИЛИ что гораздо интереснее подключается к БД через ADO под админом или под юзером входящим в группу db_reader (БД) - это для скорости чтобы формировать запросы без _view. Обязательно используем модули - чтобы не писать одно и тоже по сто раз.
3. Скрипт выполняет твой запрос к БД. Запрос получается динамический (т.к. текст) или конечно ты можешь использовать вызовы любых своих функций и процедур из БД, не важно - запрос возвращает или одно значение или таблицу
4. В Скрипте обрабатываешь результат или через recordset или через массив - как нравится
4.1. Если нужно выполняешь из скрипта еще миллион запросов для сбора всех нужных тебе данных
5. Тут же формируешь сколько нужно внешних документов любых типов в любом количестве и сохраняешь их в некотором своем каталоге. Этап формирования можешь показывать .visible можешь нет
6. В конце скрипта вешаешь сообщение типа MsgBox "Формирование документов завершено" - это для того чтобы нам засечь момент окончания скрипта перед возвращением в действие по окончании работы отчета.
7. В самом конце скрипта - убиваешь отчет - он пропадает с экрана.
8. Вернулись в действие, при этом знаем что документы УЖЕ сформированы, знаем где они лежат, знаем сколько их как называются, Пути, Примечания и т.д. - мы для этого вместе с документами создавали заголовочный ini файл где были описаны все сформированные документы (Вся работа с файловой системой через WSH или как привык, не важно тоже )
9. Импортируешь в действии все созданные документы в эл. архив
10. Все в том же действии открываешь все созданные документы из эл. архива.
все
какие моменты не ясны - спрашивай
ps
кстати все написанные скрипты - естественно можно будет использовать и в 4.40, просто для совместимости лучше сразу отказаться от чтения данных собранных отчетом (или максимально сократить их количество) - и получать их напрямую своими запросами из скрипта, и в отладке легче и кода меньше
pps
сейчас у нас не более десятка отчетов и все они чисто информационные, не более того - вся обработка и анализ - только скриптами
вот смотри - интересный алгоритм для твоей версии 4.12 (у нас работал в несколько ином виде в течении полутора лет)
0. Шаг действия в котором запускается отчет
1. Отчет (допустим по выделенному объекту) - выводит одну строку - 'Подождите идет формирование документа' на этом отчет отработал, висит на экране и - запускает скрипт
2. Скрипт (допустим VBScript) подключается к БД под текущим юзером - синтаксис Лоции ИЛИ что гораздо интереснее подключается к БД через ADO под админом или под юзером входящим в группу db_reader (БД) - это для скорости чтобы формировать запросы без _view. Обязательно используем модули - чтобы не писать одно и тоже по сто раз.
3. Скрипт выполняет твой запрос к БД. Запрос получается динамический (т.к. текст) или конечно ты можешь использовать вызовы любых своих функций и процедур из БД, не важно - запрос возвращает или одно значение или таблицу
4. В Скрипте обрабатываешь результат или через recordset или через массив - как нравится
4.1. Если нужно выполняешь из скрипта еще миллион запросов для сбора всех нужных тебе данных
5. Тут же формируешь сколько нужно внешних документов любых типов в любом количестве и сохраняешь их в некотором своем каталоге. Этап формирования можешь показывать .visible можешь нет
6. В конце скрипта вешаешь сообщение типа MsgBox "Формирование документов завершено" - это для того чтобы нам засечь момент окончания скрипта перед возвращением в действие по окончании работы отчета.
7. В самом конце скрипта - убиваешь отчет - он пропадает с экрана.
8. Вернулись в действие, при этом знаем что документы УЖЕ сформированы, знаем где они лежат, знаем сколько их как называются, Пути, Примечания и т.д. - мы для этого вместе с документами создавали заголовочный ini файл где были описаны все сформированные документы (Вся работа с файловой системой через WSH или как привык, не важно тоже )
9. Импортируешь в действии все созданные документы в эл. архив
10. Все в том же действии открываешь все созданные документы из эл. архива.
все
какие моменты не ясны - спрашивай
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)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 6
- Зарегистрирован: 16 сен 2008, 11:08
- Откуда: Москва
- Контактная информация:
Re: Экспорт в Word - потеря части данных
Тогда еще вопросы:Александр писал(а): 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)в модуле Global не забудь объявить глобальные переменные типа
ну и т.д. все в том же духе, код может не идеальный и намеренно избыточный - но это не важно, главное рабочий
а так - можно написать все в 100 раз короче и без проверок - посмотри по ссылкам.. мне просто было удобнее так, поскольку особенно не разбираюсь в этом деле - просто хобби
но опять же не помню - есть ли это в 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
Код: Выделить всё
Option Explicit 'требование объявления переменных
'---------------------------------------------------------------------------------------------------------------------------
' Глобальные переменные
'---------------------------------------------------------------------------------------------------------------------------
Public cn 'соединение
Public rs 'recordset
а так - можно написать все в 100 раз короче и без проверок - посмотри по ссылкам.. мне просто было удобнее так, поскольку особенно не разбираюсь в этом деле - просто хобби
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 6
- Зарегистрирован: 16 сен 2008, 11:08
- Откуда: Москва
- Контактная информация:
Re: Экспорт в Word - потеря части данных
Ура! Нашел!Александр писал(а):я не помню как было в 4.12, сейчас смысл в том что у текущего объекта к которому привязан скрипт всегда есть модуль Global - по умолчанию. и с другой стороны ты можешь сам создать новый ('внешний') модуль там же (справа посмотри кнопка Создать) - если есть - создаешь новый модуль и потом после сохранения просто добавляешь его к проекту (кнопка Добавить)(к текущему - Отчет - и ко всем последующим) - и вызов внешних процедур делаешь из модуля Global через точку с именем подключенного модуля и именем процедуры или функции. Единственная проблема что ошибочно созданные модули до сих пор (4.40) не удаляются из системы....
Конечно сложно было вынести меню с управлением модулями в главное дерево интерфейса Лоции. Реально нелогично.
Ну что ж! Теперь буду сидеть разбираться с отчетами и обработкой данных.
Спасибо огромное за участие
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Экспорт в Word - потеря части данных
нет ты не понимаешь во что ввязываешься
с этого момента Лоция превращается лишь в оболочку для наполнения БД - не более того
а тебе открывается весь мир объектов, которых миллионы и скоростной доступ к чтению данных
и масса прочих приятных моментов
один из которых, ну например - при наполнении БД, первоначальной регистрации информации - использование объекта regexp в скриптах для очистки от мусора Copy+Paste - это просто супер!!!!
ну и т.д. и в том же духе! но правда уже в 4.40 - где скрипты вызываются по кнопкам
единственная неприятность - нет интерфейса кроме как MsgBox, но не принципиально
зато
забываем про Лоцию напрочь - запускаем любой отладчик понимающий VBScript или jScript - и спокойно работаем где нам удобно
... в общем как-то так
рад был заронить дух свободы в душу еще одного админа
с этого момента Лоция превращается лишь в оболочку для наполнения БД - не более того
а тебе открывается весь мир объектов, которых миллионы и скоростной доступ к чтению данных
и масса прочих приятных моментов
один из которых, ну например - при наполнении БД, первоначальной регистрации информации - использование объекта regexp в скриптах для очистки от мусора Copy+Paste - это просто супер!!!!
ну и т.д. и в том же духе! но правда уже в 4.40 - где скрипты вызываются по кнопкам
единственная неприятность - нет интерфейса кроме как MsgBox, но не принципиально
зато
забываем про Лоцию напрочь - запускаем любой отладчик понимающий VBScript или jScript - и спокойно работаем где нам удобно
... в общем как-то так
рад был заронить дух свободы в душу еще одного админа
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Активный участник
- Сообщения: 239
- Зарегистрирован: 13 янв 2005, 14:30
- Используемое ПО: Lotsia PDM PLUS LT
- Откуда: Украина, Донецк
- Контактная информация:
Re: Экспорт в Word - потеря части данных
Интерфейс можно легко создать с помощью например C#. Пишем ActiveX модульАлександр писал(а): ... единственная неприятность - нет интерфейса кроме как MsgBox, ...
с интерфейсом и легко его запускаем из скрипта.
- Александр
- Активный участник
- Сообщения: 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)
Уровень администрирования - Альтернативный