Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6+Crystal Reports 9 - запуск с параметрами? / 15 сообщений из 15, страница 1 из 1
01.12.2004, 13:46:09
    #32807590
Yuri Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Всем хорошего дня!

Коллеги, если кто-то имеет успешный опыт запуск отчетов Crystall Reports 9 с параметрами из VB6, не могли бы вы поделиться секретами мастерства? Или дайте пожалуйста ссылки, где про сие безобразие можно почитать?

Пытаюсь огранизовать это через "кристаловский" Print Engine в соответствии с примерами, описанными в книжке Маклакова и Матвеева "Анализ данных. Генератор отчетов Crystall Reports.", издание БХВ-Петербург, 2003 год. Вроде все делаю так, как написано, но не работает. Ругается на модули самого "кристала" - global32.bas и crwrap.bas, якобы там не описаны всякие переменные. Ошибки у штатовцев? Кто-нибудь с этим сталкивался? Помогите. если можно...

Заранее спасибо огромное!
Юрий.

Кто знает жизнь, тот не торопится... Удачи на дорогах!
...
Рейтинг: 0 / 0
01.12.2004, 18:43:26
    #32808335
guestyyy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Кидай ссылку на примеры, смотреть надо..
...
Рейтинг: 0 / 0
02.12.2004, 14:24:03
    #32809694
Yuri Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
guestyyyКидай ссылку на примеры, смотреть надо..

Собственно говоря, код проги такой:

'#USES "C:\Program Files\CR9\crwrap.bas"
'#USES "C:\Program Files\CR9\global32.bas"

Global g_nLoc As Long 'Variable for the current language.
Global oModels As Object 'List of selected models.
Global oCurrentModel As Object 'Current model contained in the list oModells.

Sub Main
Dim nPrintJob As Integer
Dim vParamInfo As PEParameterFieldInfo
Dim CRFileName As String
Dim result%

g_nLoc = SelectedLanguage()
ErrLog=""

Set oModels = SelectedModels()
Set oCurrentModel = oModels.Get(0)

CRFileName = "c:\temp\reglament1.rpt"
If PEOpenEngine Then
nPrintJob = PEOpenPrintJob(CRFileName)
If nPrintJob = 0 Then
MsgBox("Ошибка открытия отчета")
Else
vParamInfo.StructSize = PE_SIZEOF_PARAMETER_FIELD_INFO
vParamInfo.CurrentValue = oCurrentModel.GUID
result% = PESetNthParameterField(nPrintJob, 0, vParamInfo)
result% = PEOutputToWindow(nPrintJob, CRFileName, 0, 0, 0, 0, WS_MAXIMIZE + WS_MINIZEBOX + WS_MAXIMIZEBOX + WS_SYSMENU, 0)
result% = PEStartPrintJob(nPrintJob, True)
PEClosePrintJob(nPrintJob)
End If
PECloseEngine
End If
End Sub

Но на него VB не жалуется (или не успевает). Визг и писк начинается, сразу же, когда подключаются crwrap.bas и global32.bas.

Вот, к примеру, ошибка: Row 74: Unexpected text. Смотрим crwrap.bas.
В строке написано следующее:

#If Win16 Then

'Word for DOS & WordPerfect (DLL: "uxfdoc.dll")
Global Const crUXFWordDosType% = 1
Global Const crUXFWordPerfectType% = 2

'Quattro Pro (DLL: "uxfqp.dll")
Global Const crUXFQP5Type% = 0
#End If

Что не так? Что значит символ '#', что на него плюются? И Win16 - это переменная? Но она нигде не описана...

Сорри, если вопросы дурацкие, но я в VB новичок...
Юрий.
...
Рейтинг: 0 / 0
02.12.2004, 14:59:08
    #32809810
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Код: plaintext
#If
Директива условной компиляции.

Т.е. можно написать код который будет весь компилится для двух разных версий форточек или к примеру офиса, в зависимости от установок переменных времени компиляции.

#Win16 - такая переменная и есть.

Magnus
...
Рейтинг: 0 / 0
02.12.2004, 15:28:12
    #32809913
Yuri Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Magnus23
Код: plaintext
#If
Директива условной компиляции.

Т.е. можно написать код который будет весь компилится для двух разных версий форточек или к примеру офиса, в зависимости от установок переменных времени компиляции.

#Win16 - такая переменная и есть.

Magnus

Спасибо. :) А где она задается? Я ее описываю и задаю в вызывающей процедуре?

И еще вопрос такой - на следующее описание типа

Type PETableType4
StructSize As Integer
DLLName As String * PE_DLL_NAME_LEN
DescriptiveName As String * PE_FULL_NAME_LEN
DBType As Integer
End Type
Global Const PE_SIZEOF_TABLE_TYPE4 = 644

она ругается так: Expecting a constant or function name. Относится это к строчкам DLLName и DescriptiveName. Что подразумевается под * PE_DLL_NAME_LEN etc. Авторы файла пытались изобразить комментарий?
...
Рейтинг: 0 / 0
02.12.2004, 15:47:42
    #32809970
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Задать константы можно тремя способами:
1. В свойствах проэкта. - область видимости: все публичные модули
2. Как параметр командной строки - область видимости: все публичные модули

3. В коде используя #Const - область видимости: модуль в котором обьявлена

PE_DLL_NAME_LEN - тоже константа которая по идее должна быть обьявлена где-то выше или в другом модуле. Если нету можешь по идее сам обьявить, главное чтоб была.


Magnus
...
Рейтинг: 0 / 0
02.12.2004, 16:53:41
    #32810181
Yuri Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Magnus23Задать константы можно тремя способами:
1. В свойствах проэкта. - область видимости: все публичные модули
2. Как параметр командной строки - область видимости: все публичные модули

3. В коде используя #Const - область видимости: модуль в котором обьявлена

PE_DLL_NAME_LEN - тоже константа которая по идее должна быть обьявлена где-то выше или в другом модуле. Если нету можешь по идее сам обьявить, главное чтоб была.


Magnus

Еще раз спасибо. Эта и другие константы действительно задаются в модуле global32.bas строками вида: Global Const PE_DLL_NAME_LEN = 64 и теоретически должны быть теперь видны в crwrap.bas (global32.bas я теперь поставил в командах #uses первым) , но пока все равно плюется.

Магнус, а разве строка DLLName As String * PE_DLL_NAME_LEN правильна? Как-то странно получается - тип строка умноженная на константу...
...
Рейтинг: 0 / 0
02.12.2004, 17:06:03
    #32810217
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Магнус, а разве строка DLLName As String * PE_DLL_NAME_LEN правильна? Как-то странно получается - тип строка умноженная на константу

Так обьявляются строки фиксированной длинны. Нормальное явление, правда с константами я не делал, просто значениями, но должно работать. Щас васика под рукой нет, попробуй просто поодставить значение константы.

Magnus
...
Рейтинг: 0 / 0
03.12.2004, 12:07:13
    #32811480
Yuri Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Magnus23 Магнус, а разве строка DLLName As String * PE_DLL_NAME_LEN правильна? Как-то странно получается - тип строка умноженная на константу

Так обьявляются строки фиксированной длинны. Нормальное явление, правда с константами я не делал, просто значениями, но должно работать. Щас васика под рукой нет, попробуй просто поодставить значение константы.

Magnus

Еще раз спасибо. :) Замена констант на числа помогла, скрипты наконец-то заработали. :) Правда немножко криво - главное то, что после запуска отчета Crystal Reports он не сохраняется на экране. :( То есть он формируется и тут же закрывается. Но, наверно, это уже к моей программе. Попробую выкинуть команды на закрытие окна и самого движка...
...
Рейтинг: 0 / 0
03.12.2004, 16:07:49
    #32812257
Yuri Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Собственно все заработало, наконец-то... :)) В своей книжке господа Маклаков и Матвеев сказали не то чтобы неправду, а чуть-чуть правды... Они ровным счетом ничего не написали про функцию PEGetWindowHandle(nPrintJob), которая передает управление сформированным отчетом Crystal Reports пользователю. И, естественно, ни словом не обмолвились про то, что запускать ее нужно в цикле, вместе с командой DoEvents, которая собственно ее активирует. Спасибо какому-то американцу выложившему в сеть шикарный пример программы на VB для создания, просмотра и печати отчетов. :)) Полный код моей программы теперь такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
'#USES "C:\Program Files\ARIS6\script\report\en\global32.bas"
'#USES "C:\Program Files\ARIS6\script\report\en\crwrap.bas"

Global g_nLoc As Long 'Variable for the current language.
Global oModels As Object 'List of selected models.
Global oCurrentModel As Object 'Current model contained in the list oModells.

Sub Main
  Dim nPrintJob As Integer
  Dim vParamInfo As PEParameterFieldInfo
  Dim CRFileName As String
  Dim result%
  Dim ResultL&
  
  g_nLoc = SelectedLanguage()
  ErrLog=""

  'Выбираем текущую модель
  Set oModels = SelectedModels()
  Set oCurrentModel = oModels.Get(0)
  
  'Задаем имя файла с отчетом
  CRFileName = "c:\temp\reglament1.rpt"
  'Запускаем движок Crystal Reports
  If PEOpenEngine Then
    'Открываем отчет
    nPrintJob = PEOpenPrintJob(CRFileName)
    'Если отчет не открывается, то выдаем сообщение об ошибке и выходим
    If nPrintJob = 0 Then
      MsgBox("Ошибка открытия отчета")
    Else
      'Определяем структуру параметра отчета
      vParamInfo.StructSize = PE_SIZEOF_PARAMETER_FIELD_INFO
      'Вносим в параметр отчета код текущей модели
      vParamInfo.CurrentValue = oCurrentModel.GUID
      'Передаем параметр в отчет
      result% = PESetNthParameterField(nPrintJob, 0, vParamInfo)
      'Задаем окно для вывода отчета
      result% = PEOutputToWindow(nPrintJob, "Описание модели", 0, 0, 0, 0, WS_MAXIMIZE + WS_MINIZEBOX + WS_MAXIMIZEBOX + WS_SYSMENU, 0)
      'Запускаем формирование отчета
      result% = PEStartPrintJob(nPrintJob, False)
      ResultL& = 1
      'Передаем управление сформированному отчету
      Do While ResultL& <> 0
        DoEvents
        ResultL& = PEGetWindowHandle(nPrintJob)
      Loop
      'Закрываем отчет
        PEClosePrintJob(nPrintJob)
    End If
    'Закрываем движок Crystal Reports
    PECloseEngine
  End If
End Sub
...
Рейтинг: 0 / 0
03.12.2004, 16:39:15
    #32812414
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
хм. как все запущено. В восьмерке гораздо проще было. чего это они?
Сам я с 9-м не работал...
Но по идее должен быть способ без применения АПИ, на то они и существуют готовые решения репортов, чтоб обходится без самодеятельности.
Что то они там перемудрили.

Magnus
...
Рейтинг: 0 / 0
06.12.2004, 12:57:17
    #32814256
Yuri Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Magnus23хм. как все запущено. В восьмерке гораздо проще было. чего это они?
Сам я с 9-м не работал...
Но по идее должен быть способ без применения АПИ, на то они и существуют готовые решения репортов, чтоб обходится без самодеятельности.
Что то они там перемудрили.

Magnus

Да вроде как в CR9 можно еще через ActiveX, но у нас там что-то не заработало. Этот то скрипт еле отладили - в файлах штатовцев пришлось много чего почистить, с помощью твоих советов.

Кстати, Магнус, это уже ОФФ, скажи пожалуйста, Лусада от Лиссабона далеко? И как сложно до нее добраться? А то чем черт не шутит, вдруг по весне туда в командировку пошлют...
...
Рейтинг: 0 / 0
06.12.2004, 16:04:14
    #32814784
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Лусада?
Что то не знакомое, вероятно далеко, тут в округе я все более-менее приличные города знаю.

Magnus
...
Рейтинг: 0 / 0
07.12.2004, 14:36:25
    #32816620
Yuri Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Ну вот, теперь еще и параметр разобрался как прикручивать чтобы больше не переспрашивало. Опять же спасибо штатовцам, а у Маклакова-Матвеева про сие не полслова...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
'#USES "C:\Program Files\ARIS6\script\report\en\global32.bas"
'#USES "C:\Program Files\ARIS6\script\report\en\crwrap.bas"

Global g_nLoc As Long 'Variable for the current language.
Global oModels As Object 'List of selected models.
Global oCurrentModel As Object 'Current model contained in the list oModells.
Sub Main


  Dim nPrintJob As Integer
  Dim vParamInfo As PEParameterFieldInfo
  Dim CRFileName As String
  Dim result%
  Dim ResultL&


  ' Получаем язык, на котором работает Aris
  g_nLoc = SelectedLanguage()
  ErrLog=""

  'Выбираем текущую модель
  Set oModels = SelectedModels()
  Set oCurrentModel = oModels.Get(0)
  
  'Задаем имя файла с отчетом
  CRFileName = "c:\temp\reglament1.rpt"
  'Пытаемся запустить движок CR
  If PEOpenEngine Then
    'Открываем отчет
    nPrintJob = PEOpenPrintJob(CRFileName)
    'Если отчет не открыт то nPrintJob = 0, иначе больше 0
    If nPrintJob = 0 Then
      MsgBox("Ошибка открытия отчета")
    Else
      'Определяем структуру параметра отчета
      vParamInfo.StructSize = PE_SIZEOF_PARAMETER_FIELD_INFO
      'Определяем текущее значение параметра отчета
      result% = PEGetNthParameterField(nPrintJob, 0, vParamInfo) 
      'Вносим в параметр отчета GUID текущей модели
      vParamInfo.CurrentValue = Left(oCurrentModel.GUID,36)
      'Включаем использование этого параметра без дополнительных запросов
      vParamInfo.CurrentValueSet = 1
      'Задаем параметер отчета отчету
      result% = PESetNthParameterField(nPrintJob, 0, vParamInfo)
      'Задаем окно для вывода отчета
      result% = PEOutputToWindow(nPrintJob, "Регламент модели со всеми декомпозициями", 0, 0, 0, 0, WS_MAXIMIZE + WS_MINIZEBOX + WS_MAXIMIZEBOX + WS_SYSMENU, 0)
      'Запускаем собственно сам отчет
      result% = PEStartPrintJob(nPrintJob, False)
      ResultL& = 1
      Do While ResultL& <> 0
        DoEvents
        ResultL& = PEGetWindowHandle(nPrintJob)
      Loop
      'Закрываем отчет
      PEClosePrintJob(nPrintJob)
    End If
    'Останавливаем движок CR
    PECloseEngine
  End If
End Sub

Лусада отпадает. Посмотрел планы - Мурса... Надо будет атлас мира дома посмотреть...

Кто знает жизнь, тот не торопится... Удачи на дорогах!
...
Рейтинг: 0 / 0
07.12.2004, 15:32:40
    #32816810
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6+Crystal Reports 9 - запуск с параметрами?
Неплохой код, но снова же использование API меня последнее время совсем не вдохновляет. С тех пор как столкнулся с различным оутпутом одной и той же функции на разных форточнках. Сколько корви она мне попортила.
Должен быть "чистый" способ.

Magnus
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6+Crystal Reports 9 - запуск с параметрами? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]