1 (изменено: Антон Мороков, 21-01-2014 14:48:44)

Тема: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Добрый день!
На предприятии работал TechnologiCS 6.2.0.0 (15918) все было ОК.
После обновления до TechnologiCS 6.3.0.0(19094) стала появляется следующая череда ошибок при формировании сводной ведомости.
Подскажите пожалуйста возможный вариант решения данной проблемы...
По электронной почте могу выслать экспортированный отчет.
http://forum.technologics.ru/misc.php?action=pun_attachment&item=694

Post's attachments

error9997700.jpg 53.32 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

2 (изменено: , 21-01-2014 14:44:12)

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Далее:
http://forum.technologics.ru/misc.php?action=pun_attachment&item=695

Далее:
http://forum.technologics.ru/misc.php?action=pun_attachment&item=696


Далее:
http://forum.technologics.ru/misc.php?action=pun_attachment&item=697

Post's attachments

error0020.jpg 96.13 Кб, файл не был скачан. 

error0021.jpg 133.96 Кб, файл не был скачан. 

error0022.jpg 84.11 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Ну, несмотря на то, что для построения отчетов в TechnologiCS 6.3.0 не требуется установленного MS Access`а, для обработки данных с помощью области "Выполнить" MS Access нужен. При этом необходимо провести настройку MS Access, как это делалось для прежних версий TechnologiCS.

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Любопытные ошибки, хотя не вижу связи между ними.

несмотря на то, что для построения отчетов в TechnologiCS 6.3.0 не требуется установленного MS Access`а

Это только для нового построителя отчетов. В старом построителе отчетов все осталось по прежнему.


Вообще судя по ошибке  - репортер у них работает нормально, проблема в коде написанном на VBA Access (тот что они сами разрабатывали или взяли откуда-то).
С обновлением на 6.3 это вряд ли связано.

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Похоже что не хватает ссылки на библиотеку.
В редакторе макроса: главное меню - инструменты(Tools) - Ссылки(References)
добавить ссылку на библиотеку "Microsoft ActivX Data Object ...".
Или заменить тип "ADODB.Command" на "Object", тогда будет работать без ссылки на библиотеку (если она установлена в системе).

Спасибо сказали: Антон Мороков1

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Виктор Бебякин пишет:

Похоже что не хватает ссылки на библиотеку.
В редакторе макроса: главное меню - инструменты(Tools) - Ссылки(References)
добавить ссылку на библиотеку "Microsoft ActivX Data Object ...".

Вроде что то такое добавляли... Ссылку... вспомнить бы на какую библиотеку... 
Но даже если и так, то куда она (ссылка) могла пропасть? Она же не могла исчезнуть из за смены версии.

Виктор Бебякин пишет:

Или заменить тип "ADODB.Command" на "Object", тогда будет работать без ссылки на библиотеку


Что значит заменить? Просто текст ADODB.Command заменить на Object ? Если так , то выдается синтаксическая ошибка кода.

7 (изменено: Антон Мороков, 22-01-2014 10:41:21)

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Дмитрий Гамий пишет:

Ну, несмотря на то, что для построения отчетов в TechnologiCS 6.3.0 не требуется установленного MS Access`а, для обработки данных с помощью области "Выполнить" MS Access нужен. При этом необходимо провести настройку MS Access, как это делалось для прежних версий TechnologiCS.

Речь про настройку безопастности (макросы) ? Нее, тут все настроено уже 10 раз.

Олег Зырянов пишет:

Вообще судя по ошибке  - репортер у них работает нормально, проблема в коде написанном на VBA Access (тот что они сами разрабатывали или взяли откуда-то).

Мне тоже так кажется.
А взаимосвязь есть между ошибками.
Макрос не выполняется по каким то причинам, а он в свою очередь создает вспомогательную таблицу в БД Акссеса, в запросе эта таблица фигурирует, а т.к. макрос не отработал, таблицы - нет, соответственно и запрос не корректный , вот он и пишет что не могу выполнить запрос - объект закрыт т.е. таблицы нет.


Только нужно понять почему макрос перестал работать после обновления на 6.3.

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Только нужно понять почему макрос перестал работать после обновления на 6.3.

Наиболее вероятно что он и раньше не работал. Отчет скорей всего работает на каких то машинах, и не работает на других (и раньше и сейчас).
Либо кто-то отчет поправил/перезалил (пользователи случаем при переходе например не имеют привычки все отчеты перезаливать?)

Ссылка необходимо на библиотеку ADO (Microsoft ActiveX DataObject Libtary).

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Олег Зырянов пишет:

Только нужно понять почему макрос перестал работать после обновления на 6.3.

Наиболее вероятно что он и раньше не работал. Отчет скорей всего работает на каких то машинах, и не работает на других (и раньше и сейчас).
Либо кто-то отчет поправил/перезалил (пользователи случаем при переходе например не имеют привычки все отчеты перезаливать?)

Ссылка необходимо на библиотеку ADO (Microsoft ActiveX DataObject Libtary).

Отчет всегда и везде работал.

Проблема найдена и устранена. Спасибо Виктору за наводящую мысль о библиотеке!

Дейстительно дело было в ней, галочка напротив Microsoft ActiveX DataObject Libtary 2.6 была сброшена.
Почему она сбросилась остается загадкой.

Спасибо! Вопрос решен.

10 (изменено: Антон Мороков, 27-01-2015 12:55:25)

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Проблема опять "всплыла".
Формирую отчет, опять пишет ошибка вызова процедуры.
При попытке обращения к таблице созданной процедурой, таблица попросту не создается.... Процедура не отработала, таблицы нет, и ошибка. В ручном режиме запрос выполняется без проблем , таблица появляется.
Открываю Панель разработчика - Tools - References
Галка напротив Microsoft ActivX Data Object 2.6 Library сброшена.
Пытаюсь открыть бланк отчета на редактирование и установить эту галку и сохранить, но изменения не сохраняются.
Если выполнить отчет без Report, и установить галочку , а потом запустить макрос Start, то эффекта нет, как буд то галки нет.

Также пробовал вариант заменить тип "ADODB.Command" на "Object" в процедуре, но при выполнении ругается на синтаксис Set ADOCommand = New ADODB.Command, пишет что New Object не может быть ....

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

По возможности просто перепишите код на позднее связывание, то есть чтобы не было всяких там New ADODB.Command а было все типа CreateObject( "ADODB.Command " ) - то есть все объекты будут Object. Тогда не потребуются ссылки на статические библиотеки и скорей всего запускаться будет проще (потому как библиотеки то эти в системе есть, просто ссылки на них при создании отчета пропадают почему-то). Либо новый репортер использовать, там мы сделали все требуемые функции для работы чтобы не было необходимости работать с VBA.

12 (изменено: Антон Мороков, 27-01-2015 13:49:45)

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

А как будет правильно, так: Set ADOCommand = CreateObject ?
Хотя там наверное не только это, там надо полностью избавляться от ADO ?

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

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

Можно так писать

Set ADOCommand = CreateObject("ADODB.Command")

при это просто типизация вся исчезнет.

Можно кстати попробовать либу подключить в коде первым делом.

14 (изменено: , 27-01-2015 14:31:17)

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Типа того

Sub LoadLibrary()
    Dim ref As Reference
    HasADO = False
 
    For Each ref In References
        If ref.Name = "ADODB" Then HasADO = True
    Next
    If Not HasADO Then
        On Error Resume Next
        References.AddFromGuid "{00000206-0000-0010-8000-00AA006D2EA4}", 2, 6
    End If
End Sub

Для версии 2.8 будет по другому

References.AddFromGuid "{2A75196C-D9EB-4129-B803-931327F72D5C}", 2,  8

хотя в примерах все версии подряд подключают игноря все ошибки.

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Ошибка при выполнении
http://forum.technologics.ru/misc.php?action=pun_attachment&item=814

Post's attachments

111111.jpg 98.75 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

поправил (с кавычками ошибка была). Но все равно гляньте версию что на машине то установлена.

17 (изменено: Антон Мороков, 27-01-2015 14:47:20)

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

По моему не помогло... (
http://forum.technologics.ru/misc.php?action=pun_attachment&item=815

Олег Зырянов пишет:

поправил (с кавычками ошибка была). Но все равно гляньте версию что на машине то установлена.

На машине куча библиотек с версии 2.0 до 2.8

версии с 2.0 до 2.8
http://forum.technologics.ru/misc.php?action=pun_attachment&item=816

Post's attachments

22222.jpg 107.16 Кб, файл не был скачан. 

3333333.jpg 90.98 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Ничего не понятно.  На одних картинках Access, на других Excel. Что происходит? Подключение то  как раз похоже сработало, хотя с версиями нюанс возможен. Брать надо последнюю.

19 (изменено: Антон Мороков, 27-01-2015 15:01:22)

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Подключил библиотеку 2.8 все равно тебе грабли

Option Compare Database

Public TCS As CSDN.TCS
Public TCSApp As CSDN.Tcs_Application

' Процедура для получения наименования классификатора номенклатуры
Public Sub PrepareData()

    LoadLibrary

' 1. Создание таблицы нужной структуры
    CreateKlassifTable

' 2. Подсоединиться к TechnologiCS API
    ConnectToTcs
    If Not TCSApp Is Nothing Then
    
' 3. Получаем и записываем классификатор
    WriteData

    End If ' If Not TCSApp Is Nothing
 
' 4. Обновляем БД
    CurrentDb.TableDefs.Refresh
    
' 5. Освободить объекты TechnologiCS API
    FreeTcsConnection
End Sub

' --------------------------------------------------------------------------------------

Sub LoadLibrary()
    Dim ref As Reference
    HasADO = False
  
    For Each ref In References
        If ref.Name = "ADODB" Then HasADO = True
    Next
    If Not HasADO Then
        On Error Resume Next
        References.AddFromGuid "{2A75196C-D9EB-4129-B803-931327F72D5C}", 2, 8
    End If
End Sub


' Процедура создания таблицы и занесение в нее идентификаторов СТД и М из RptSheet
Private Sub CreateKlassifTable()
    Const CreateQuery As String = "CREATE TABLE KlassifData (Klassif_ID int, Klassif string)"
 Const InsertQuery As String = "INSERT INTO KlassifData (Klassif_ID) SELECT P4 FROM RptSheet Where P24='СТД' or 'М'"
    
    Dim ADOCommand As ADODB.Command
    
    Debug.Print "Создаётся таблица KlassifData (с ID стандартных изделий) ..."
    
    Set ADOCommand = New ADODB.Command
    If Not ADOCommand Is Nothing Then
 ADOCommand.ActiveConnection = CurrentProject.AccessConnection  !Ошибка тут возникает!
        ADOCommand.CommandText = CreateQuery
        On Error Resume Next
        ADOCommand.Execute
        On Error GoTo 0
 ADOCommand.CommandText = InsertQuery
        On Error Resume Next
        ADOCommand.Execute
        On Error GoTo 0
    End If ' If Not ADOCommand Is Nothing
    Set ADOCommand = Nothing
    Debug.Print ""
End Sub

' *****************************************************************************

' Процедура соединения c текущим сеансом TechnologiCS API
Private Sub ConnectToTcs()

    Debug.Print "Подключение к текущему сеансу TechnologiCS API ..."
    Debug.Print ""
    If TCS Is Nothing Then
        Set TCS = New CSDN.TCS
    End If ' If TCS Is Nothing
    
    If Not TCS Is Nothing Then
        Set TCSApp = TCS.LoginCurrent
    End If ' If Not TCS Is Nothing Then
    
End Sub

' *****************************************************************************

' Процедура считывания ID, получение и запись классификатора
Private Sub WriteData()
    Const Query As String = "SELECT Klassif_ID FROM KlassifData"
    Dim ADORec As ADODB.Recordset ' Набор данных с идентификаторами
    Dim ID As Long ' Обрабатываемый идентификатор
    Dim ClassifName As String ' Наименование узла классификатора
    
    ' Создаём набор данных
    Set ADORec = New ADODB.Recordset
    
    ' Открываем набор данных
    ADORec.Open Query, CurrentProject.AccessConnection
 
    ' Позиционируемся на первой записи в наборе
    ADORec.MoveFirst
    ' В цикле пока не будет достигнута последняя запись
    Do While Not ADORec.EOF
        ' Получаем идентификатор
        ID = ADORec!Klassif_ID.Value
        ' Получаем наименование классификатора
        ClassifName = GetClassifName(ID)
        
        ' Записывем название классификатора
        Call WriteClassifName(ID, ClassifName)
        
        ' переходим на следующую запись
        ADORec.MoveNext
    Loop
  
    ' Закрываем и освобождаем набор данных
    ADORec.Close
    Set ADORec = Nothing
End Sub

' *****************************************************************************
    
' Процедура загрузки данных о классификаторах
Function GetClassifName(ID As Long) As String
    Dim SingleNmk As CSDN.ISingleNomenclature
    
    ' Получаем экземпляр (единственную запись) номенклатуры по идентификатору
    Set SingleNmk = TCSApp.SingleNmkFromId(ID)
    
    ' Проверяем, не пустой ли обект
    If Not SingleNmk Is Nothing Then
        ' Запоминаем именованный экземпляр
        SingleNmk.UserModuleName = SingleNmk.UniqueUserModuleName
        
        ' Получаем название узла классификатора номенклатуры
        ' Это же и значение, возвращаемое функцией
        GetClassifName = SingleNmk.Properties("CLASSIF_NAME").DisplayText
        
        ' Удаляем именованный экземпляр номенклатуры - если этого не делать,
        ' при большом количестве обрабатываемой номенклатуры память, используемая
        ' TCS API будет непомерно расти
        TCSApp.DeleteModuleByUserModuleName (SingleNmk.UserModuleName)
    End If
    Set SingleNmk = Nothing
    
End Function

' *****************************************************************************

' Процедура записи классификатора в БД
Private Sub WriteClassifName(ID, ClassifName)
Const UpdateQuery = "UPDATE KlassifData SET Klassif= '%ClassifName%' WHERE Klassif_ID = %ID%"
    
    Dim ADOCommand As ADODB.Command
    
    Dim Query As String
    
    Set ADOCommand = New ADODB.Command
    If Not ADOCommand Is Nothing Then
 
        Query = Replace(UpdateQuery, "%ClassifName%", ClassifName)
        Query = Replace(Query, "%ID%", CStr(ID))
        ADOCommand.ActiveConnection = CurrentProject.AccessConnection
        ADOCommand.CommandText = Query
        On Error Resume Next
        ADOCommand.Execute
        On Error GoTo 0
    End If ' If Not ADOCommand Is Nothing
    Set ADOCommand = Nothing
 End Sub
' *****************************************************************************
    
Private Function IsTableExist(ATableName As String) As Boolean
    Dim I As Integer    ' Счётчик цикла
    Dim R As Boolean    ' Временное значение результата
    
    R = False
    
    
    CurrentDb.TableDefs.Refresh
    For I = 0 To CurrentDb.TableDefs.Count
        If CurrentDb.TableDefs(I).Name = ATableName Then
            R = True
            Exit For
        End If '
    
    Next ' I
    
    IsTableExist = R

End Function ' IsTableExist(ATableName As String)

' *****************************************************************************

' Процедура освобождения объектов TechnologiCS API
Private Sub FreeTcsConnection()
    Set TCSApp = Nothing
    Set TCS = Nothing
End Sub

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Возможно правильно возникает. И подключение либы теперь как раз сработало.

Читайте хелп (кто отчет разрабатывал?). Там есть два свойства у Access и они могут меняться в зависимости от созданного подключения. В данном случае что-то такое и происходит.

Re: Ошибка при формировании отчета после перехода с 6.2 на 6.3

Кстати вроде есть такой простой метод (нюансов незнаю, надо хелп читать). Но почему не используется он?

CurrentDb.Execute