Создать отчет. Интерфейс IReport.

Автор Михаил88, 28.11.23, 18:11:24

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Михаил88

Когда создаю отчет с помощью интерфейса IReport и сохраняю его в *.xls файлик. Отчет успешно сохранен.
Но выяснил неприятный момент если после этого изменить свойство любого компонента и создать отчет заново отчет будет создан со старыми значениями свойств(относится только к текущему документу). Если закрыть и снова открыть компас все начинает работать корректно до того момента пока снова не создать отчет.
Получается такая ситуация, что свойства перестают обновляться в документе, по которому был создан отчет.
Если создавать отчет стандартной фукцией компаса все работатет нормально.

Как можно исправить? Самому пока не удалось найти решение, которое не подразумевало бы перезапуск компаса.
Прошу помощи в решении данного вопроса.

Небольшой пример. Запускать на активной модели сборки.
# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import gencache, Dispatch

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                            pythoncom.IID_IDispatch))

kompas_document = application.ActiveDocument
property_mng = kompas_api7_module.IPropertyMng(application)
report = property_mng.GetReport(kompas_document, kompas6_constants.ksRTPropertiesReport)
# Установить индекс текущего стиля.
report.CurrentStyleIndex = 0
# Показывать все объекты.
report.ShowAllObjects = True
# Перестроить отчет.
report.Rebuild()

report.SaveAs(r'C:\Users\User\Desktop\report\Отчет.xls')

Валерий Изранов

Михаил, а как на форуме в сообщении вставляется место для текста программы?

Михаил88


Nipal

Цитата: Валерий Изранов от 28.11.23, 18:46:22Михаил, а как на форуме в сообщении вставляется место для текста программы?
Тут
могла
быть
программа
Можно без кнопки, просто код разметки нужно читать.

Валерий Изранов


feron

Плохо что подсветки кода нет - и читабельность не айс..

[_code=python_]
[_/code_]

[_code=cpp_]
[_/code_]

Михаил88

А есть, какие нибудь мысли по теме?

Валерий Изранов

Михаил, больше года прошло как мы вместе создавали программу АгентК016.
За это время пользователей либо устраивает получение отчета, ли они так глубоко не копали.
Замечено, что перед получением отчета всем компонентам сборки нужно формально установить все нужные свойства.
Вот код программы на VB6, который работает.

Private Sub Отчет()          'Процедура создает отчет с указанным стилем
Dim Файлик As String
Dim IReportФильтр As IReportFilter
Dim IReportObjectsФильтр As IReportObjectsFilter
Dim IReportСтиль As ReportStyle
Dim IReportTableТаблица As IReportTable
Dim IReportParamПараметры As IReportParam

Dim kompas_document_1 As KompasAPI7.IKompasDocument1
Dim Отчет As KompasAPI7.IReport

Dim kompas_api_object As KompasAPI7.IKompasAPIObject
Dim IReportПроцесс As KompasAPI7.IReportProcess

Dim ИндексАктивногоСтиля As Integer
Retval = True

Call ОткрытьКомпас
If Retval = False Then GoTo bad

On Error Resume Next
Set Документ3D = Kompas7.ActiveDocument
If Документ3D Is Nothing Then
    Сообщение = «В Компасе нет открытого документа»
    GoTo bad
End If
On Error GoTo 0

Set kompas_document_1 = Документ3D
Set kompas_api_object = kompas_document_1.GetInterface(Kompas6Constants.ksObjectReportProcess)
Set IReportПроцесс = kompas_api_object
Set Отчет = СвойстваMng.GetReport(Документ3D, Kompas6Constants.ksRTPropertiesReport)        '   ksRTPropertiesReport 0 Отчет по свойствам
If Отчет Is Nothing Then
    GoTo bad
End If                                                                                                                                                                           '  ksRTEmbodimentsReport 1 Отчет по исполнениям
                                                                                                                                                                                '  2  Отчет по таблице изменяемых переменных в массиве
Отчет.CurrentStyleIndex = 1     'ИндексАктивногоСтиля       'установить Стиль отчета
                Set IReportObjectsФильтр = Отчет
                IReportObjectsФильтр.Parts = True       ' Собирать компоненты
                IReportObjectsФильтр.Bodies = False 'НЕ Собирать тела
                Set IReportСтиль = Отчет.ReportStyle(ИндексАктивногоСтиля)        '0- по умолчанию
                IReportСтиль.ColumnNumberingType = 0       '0                   1,2,3,4,5...
                IReportСтиль.DrawBottom = True       '????- true - сверху вниз (как обычно),false - отрисовка снизу вверх
                idStyle = IReportСтиль.Id
                IReportСтиль.RowsNumberingType = 0         '0 Нумерацию не использоватьI
                Set IReportParamПараметры = Отчет
                IReportParamПараметры.buildingType = 0        '0       По всем объектам
                 IReportParamПараметры.UseHyperText = False     'true - ссылками, false - обычный текст
m2:
On Error GoTo bad
Отчет.Rebuild     'Здесь отчет получается но его не видно
On Error GoTo 0
Файлик = «Актуальный отчет.xls»
Отчет.SaveAs Файлик
m1:
End If

bad:
Retval = False
Сообщение = «Ошибка»
Call ВывестиСообщение

ret:
End Sub

Михаил88

Это слишком громко звучит. Я не считаю, что я создавал программу АгентК016. Я тебе помогал решить несколько вопросов и не более.
Как этот код помогает решить мою проблемму?

Валерий Изранов

Предполагаю что программа на VB6 работает.
Тогда попытаться сравнить программу на Питоне с VB6.
Там по сути строчек то очень мало. Что то обнаружится.

Михаил88

Попробуй создай отчет, потом у одной из деталей измени свойство например наименование и создай отчет. Ты получишь отчет с новым наименованием или старым?

Я и не писал, что не работает? Я писал, что при изменение свойств и создании отчета заново значение свойства остается со старым значением.
Эта проблема решается при выполнение кода на VB6?

Михаил88

Если посмотреть в наименование то пишет все правильно.

Screenshot_1.png

В свойствах показывает неправильно и плюс само граффическое отображение тоже выглядит не верно.

Screenshot_2.png

Правильно должно выглядеть так.

Screenshot_3.png

Валерий Изранов

В первом отчете была "Камера."
Во втором отчете после переименования она стала "Огромная камера."

Отчет чувствует изменение Наименования.

Изменение наименования.png

Михаил88

А разве этот отчет содан с помощью кода, который ты высылал выше?

Валерий Изранов

Это очень мощная обработка стандартного Report Компаса.

Михаил88

Отчет создан кодом, что ты высылал выше? Мне не важно, как ты его обрабатывал дальше.
Для чистоты эксперимента создай 2 отчета кодом, что ты выслал выше.
1. Создай отчет просто со сборки.
2. Создай отчет со сборки, в которой ты изменил свойство.

Валерий Изранов

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

Валерий Изранов

Михаил, это
"Private Sub Отчет()          'Процедура создает отчет с указанным стилем"
и запустить мне ее отдельно от основной программы нет никакой возможности.

А в программе после нажатия кнопки "Отчет" действие переходит именно сюда.

Валерий Изранов

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

Михаил88

Код, что ты прислал выше не решает мою проблему.
А тебе не кажется странным, что нужно пройтись по всем вставленным компонентам получить их свойства потом эти свойства вставить в свойства этих же компонентов в сборке. Смысл такого создания отчета.
Я также могу сам пробежаться по всем компонентам и нужным мне свойствам и создать свой отчет в excel без отчета компаса.
Еще раз прочитай вопрос, который я написал выше?

Еще посмотри если у тебя свойства отображаются также, как и у меня на скринах(смотри сообщение #11) то у тебя тоже не работает.