Формирование отчета в Acess в виде таблице.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Формирование отчета в Acess в виде таблице.

Формирование отчета в Acess в виде таблице.

Ответ
Поиск в этой теме
Непрочитано 04.02.2005, 17:14 #1
Формирование отчета в Acess в виде таблице.
Mikhail
 
инженер-технолог (ГИП)
 
Санкт-Петербург
Регистрация: 11.09.2003
Сообщений: 1,144

Добрый день.
Такая проблемма.
Из Автокада делаю выборку аттрибутов в Эксель (в Acess почему то не хочет, глючно что то или Офис или Кад), потом импортирую их в Acess. Там запрос и по запросу пытаюсь создать отчет в виде спецификации, т.е. табличный и с колонтитулами.
Таблицу получилось сделать когда каждой ячейки с данными присвоил значение ТИПА ГРАНИЦЫ- СПЛОШНАЯ, тогда эти ячейки обводились и получалась таблица. Но если данные не влезают в одну строчку, то получается ерунда типа того, что или весь текст не влезает в ячейку или если перенос включить (РАСШИРЕНИЕ - ДА), то тогда некорректно изображаются остальные ячейки этой строки. Они не увеличиваются в размере и обводятся по узкому контуру, что не очень красиво.(картинка)
[ATTACH]1107526600.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Просмотров: 18541
 
Непрочитано 04.02.2005, 18:47
#2
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Думаю что здесь http://am.rusimport.ru/MSAccess/topic.aspx?ID=133 как раз решение твоей проблемы. У меня работает, глюков не замечено.
vk вне форума  
 
Непрочитано 06.02.2005, 15:22 а ежли прямиком в Акс?
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


На досуге попробовал вытащить атрибуты блоков (и еще немного) напрямую в MDB... вроде нет проблем. Если интересно, могу выложить наброски макроса.
vk вне форума  
 
Автор темы   Непрочитано 07.02.2005, 11:57
#4
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


to vk
А можно немного пояснить про VBasic... А то я как то ни в зуб ногой. Так попытался по наитию попробывать, но видать наитие не проходит
Спасибо.
p.s. Всё получилось. Действительно классная программка. Хоть что то в Аксесе научился делать. А по поводу сохранения значений аттрибтов сразу в Аксес... У меня вот такой только выбор выдает при вопросе о том в каком формате сохранять значения. (картинка)
[ATTACH]1107778117.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Автор темы   Непрочитано 07.02.2005, 17:09
#5
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Доброго времени суток.
И еще такой вопросик. Хотел в Аксесе делать спецификацию в Отчете, но вот такой вопрос:
Как сделать разные нижнии колонтитулы на первой странице (большой штамп) и на следующих страницах (малый штамп)?
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 07.02.2005, 18:52
#6
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Пожалуй, начну со второго... Разные колонтитулы сделать можно. Только программно. Например, меняя от страницы к странице видимость источника объекта "вложенный отчет". Тоесть, создать дополнительно два маленьких отчета (или рисунка) под колонтитулы и переключать их.
Другой вариант на первый взгляд проще. Создать два отчета. Один для первой, другой для последующих. При форматировании области данных в первом, помечать в таблице эту запись, а в запросе второго выводить только не помеченные. Примерно так.

А по поводу сохранения атрибутов сразу в Аксес - делал это в VBA. Посмотри эти макросы на VBА, если интересно. Сочинял в условиях АКАД2005, винда 2000sp4, MDAC 2.8, Access из OfficeXP. Делал ради интереса исключительно в познавательных целях. Немного облагородил наброски, может сгодятся. Первый создает mdb с табличкой (или только табличку), а второй заносит в табличку данные из выбираемых блоков или текстов. Можно по одному, можно кучей.

Если что не понятно, можно по аське связаться вечером.
vk вне форума  
 
Непрочитано 08.02.2005, 22:08
#7
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Набросал приблизительно "меняющийся колонтитул". Не безглючно к сожалению, обкатать надо... Полежит здесь некоторое время.
vk вне форума  
 
Автор темы   Непрочитано 09.02.2005, 09:43
#8
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


vk Спасибо большое за колонтитулы. Довольно интересно, только еще не понял как работает, но оно работает! (можно краткий инструктаж...? просто посмотрел программу, мкопировал ее к себе, но она выдает ошибку(не нравится ей что то... хотя когда меняю "ВерхнийКолонтитул" на "Нижний колонтитул" отчет запускается, но не работает как надо.))
а вот по поводу вывода аттрибутов в базу данных Аксес вот такая ситуевина (картинка).... Ошибку выдает. Может действительно, что то со связью с Аксес где то. Может в настройках что то поменять?
[ATTACH]1107931397.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 09.02.2005, 16:06
#9
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
не нравится ей что то... хотя когда меняю "ВерхнийКолонтитул" на "Нижний колонтитул"
Конечно не понравится... Там прикол такой, что размер и содержимое НИЖНЕГО определяется ДО его форматирования. Тоесть при форматировании ВЕРХНЕГО. Тоесть, "вперед" - можно, а "назад"... если только за счет глюков... Пробовать надо, но вряд ли...

По картинке... Надо проверить чтоб были подключены рефренсы. Там по тексту в двух местах есть пометки "Чтоб работало надо подключить..." Если нет версии ADO 2.8, можно попробовать другие какие есть... Это в Tools -> Refernces... Проверь чтоб там не было MISSING.
[ATTACH]1107954400.jpg[/ATTACH]
vk вне форума  
 
Непрочитано 09.02.2005, 16:10
#10
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Во переклинило то....
попробую удалить повторы
vk вне форума  
 
Непрочитано 09.02.2005, 16:11
#11
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


--
vk вне форума  
 
Непрочитано 09.02.2005, 16:14
#12
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


--
vk вне форума  
 
Непрочитано 09.02.2005, 16:19
#13
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


удалил повтор
vk вне форума  
 
Непрочитано 09.02.2005, 16:29
#14
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


удалил повтор
vk вне форума  
 
Автор темы   Непрочитано 09.02.2005, 18:11
#15
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


vk все получилось, там я просто в программе немного напортачил (был еще один блок с колонтитулом)
p.s. А столько ответов не надо было...не такой тупой
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 09.02.2005, 20:10
#16
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Да это тупит то ли сервер на котором форум работает, то ли мой пров - чудик еще тот.... сейчас попробую почистить

Кстати, попробовал немного поправить код, чтоб ручками не подбирать высоту колонтитула
Код:
[Выделить все]
Private Sub ВерхнийКолонтитул_Format(Cancel As Integer, FormatCount As Integer)
  With Me
    If .Page > 1 Then
      .StampF1.Report.Visible = False
      .StampF2.Report.Visible = True
      .НижнийКолонтитул.Height = .StampF2.Report.ОбластьДанных.Height + 200
    Else
      .StampF1.Report.Visible = True
      .StampF2.Report.Visible = False
      .НижнийКолонтитул.Height = .StampF1.Report.ОбластьДанных.Height + 200 ' не отрабатывает ??
    End If
  End With
End Sub
К сожалению полной автоматизации не удалось добиться. Все равно для первого листа нужно выставить ручками :cry:
vk вне форума  
 
Непрочитано 09.02.2005, 20:16
#17
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


во млин, опять клин...
vk вне форума  
 
Непрочитано 10.02.2005, 00:20
#18
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>>Perezz!!

Если не трудно, убери лишнее....
vk вне форума  
 
Автор темы   Непрочитано 10.02.2005, 09:22
#19
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


А по поводу АКАДА и Акссес? Никаких предложений нет?
кстати а доходчивая электронная литература бо програмированию в Аксесе, ну или на VBA, но тогда очень доходчиво есть?
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 10.02.2005, 12:17
#20
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
А по поводу АКАДА и Акссес? Никаких предложений нет?
Та глюковина что встроена в АКАД для связи с базами данных показалась мне весьма глючной и малофункциональной. Потому проще написать свое. Если свое и будет глючить - то хоть можно разобраться и устранить глюку.... Да и функционал можно сделать какой надо. (имхо конечно)

За электронную литературу ничего не скажу, сам начинал изучать Аксес еще в 97 году по бумажным книгам. Зато есть отличный форум
vk вне форума  
 
Автор темы   Непрочитано 10.02.2005, 12:50
#21
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


По Аксесу просто та же ошибка и осталась даже при подключении Reference но там у меня только 2.7 версия. Думаю особой разницы нет...
[ATTACH]1108029052.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 10.02.2005, 13:16
#22
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Внимательнее!!!!
нужно "Microsoft ActiveX Data Objects 2.8 Library"
(без Recordset )
а не "Microsoft ActiveX Data Objects Recordset ....."

PS. Обнаружил в своем коде ошибочку... :cry: исправлю
vk вне форума  
 
Непрочитано 10.02.2005, 13:30
#23
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Положил исправленную версию (адрес тот же)
vk вне форума  
 
Автор темы   Непрочитано 10.02.2005, 14:23
#24
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


>vk Три семерки это к удачи))) Срочно в казино
Спасибо.
p.s. а что это никому больше не интересно?
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 10.02.2005, 16:08
#25
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Да не игрок я...

Ну радует что прога заработала....
Следующий вопрос наверно будет про запросы, типа как сгруппировать атрибуты, когда у блока их два и более :wink:

PS а остальные смотрят, что из этого получится
vk вне форума  
 
Автор темы   Непрочитано 11.02.2005, 10:27
#26
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


так вот что я тут надумал... Можно конечно потом данную выборку в Аксесе групировать, но вот все таки я упорно гну линию, что мне нравится как офромлена выборка в АКАДе. Чем нравится:
- При выборе какие аттрибуты выбирать появляются ВСЕ возможные данные которые можно выбрать (т.е. динамически меняется от количества аттрибутов в блоке)
-можно по разному расположить таблицу. Мне приятнее, да и вроде лучше, когда с одним аттрибутом связана одна строчка в которой все его данные, а не так что данные в столбик у одного аттрибута идут.
-ну и "чисто понятные и конкретный" интерфейс для меня

А в программе выборки аттрибутов просто не знаю как это сделать по идее можно все сделать одной кнопокой если ее и программу правильно написать.
В общем какие идеи... Допустим для упрощения можно принять, что тип блока всегда один и тот же (для разных типов разнная программа) и тогда можно прописать точно столбцы которые там будут и которые надо заполнить- это касается в основном аттрибутов.
Располагать все таки наверное в строчку лучше было бы. Думаю это не проблемма просто массив данных по строке раскидать в цикле, я так понимаю.
А можно сделать чтобы таблица создавалась уже в макросе извлечения аттрибутов? Просто чтобы столбцы (их количество и названия) формировались по результату выделения блока (т.е. считывались бы допустим все параметры блока и для каждого параметра формировался бы свой столбец с аналогичным названием).
В общем это пока то что пришло днем и вечером в мою больную голову
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 11.02.2005, 12:00
#27
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Динамика - это не для простых программулек. Возможно, придется что то свое писать или искать подходящий контрол. :roll:
Цитата:
Сообщение от Mikhail
когда с одним аттрибутом связана одна строчка в которой все его данные, а не так что данные в столбик у одного аттрибута идут.
Возможно имеется в виду блок и все связанные с ним атрибуты

Цитата:
Сообщение от Mikhail
Допустим для упрощения можно принять, что тип блока всегда один и тот же (для разных типов разнная программа) и тогда можно прописать точно столбцы которые там будут и которые надо заполнить- это касается в основном аттрибутов.
Да можно, только не приведет ли оно к излишним сложносям. Сейчас структура позволит записать любое количество атрибутов в одну таблицу и при том используя один макрос. В принципе, какая разница, сколько параметров будет экспортироваться? ИМХО никакой. Потому как лишние можно просто не брать во внимание. Порядок же следования параметров не имеет совершенно никакого значения (ибо таблица является всего лишь местом хранения данных, но никак не средствои их отображения).
Да и программки однотипные будут плодиться бестолково... Мне кажется, это не есть гуд.
Цитата:
Сообщение от Mikhail
А можно сделать чтобы таблица создавалась уже в макросе извлечения аттрибутов? Просто чтобы столбцы (их количество и названия) формировались по результату выделения блока (т.е. считывались бы допустим все параметры блока и для каждого параметра формировался бы свой столбец с аналогичным названием).
Гм.... а вот ситуевина: сначала выбран блок с одним атрибутом, записан. Усе пучком. Потом выбираем блок с тремя атрибутами и....? Добавлять в таблицу столбцы? Создавать новую таблицу? Пока не представляю как удобнее, но кажется что ни так ни эдак не правильно (имхо).
vk вне форума  
 
Непрочитано 11.02.2005, 13:10
#28
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Там же в чистом Access, кажется, можно программно модифицировать таблицы (добавлять / удалять столбцы)? Как - не спрашивайте, все едино не помню
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.02.2005, 13:41
#29
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Проблема не втом чтоб добавить или удалить столбцы - это не сложно. А в том, КАК их потом обработать. Логичнее всего иметь универсальную программку, чтоб получить табличку. А отчет всегда можно сделать на основе запроса к таблице. Притом, запрос может быть встроен непосредственно в отчет.
vk вне форума  
 
Автор темы   Непрочитано 11.02.2005, 14:03
#30
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


to vk да я там опечатался
"Возможно имеется в виду блок и все связанные с ним атрибуты
потом по работе программы... почему то не хочет создавать таблицу в уже существующей БД (картинка)

по поводу добавления/удаления столбцов... У меня нпример вот такая потребность: есть схема(разводка, еще что то автокадовское) с блоками в аттрибутах которых есть инфа, которую надо использовать в спецификации (в Аксесе). Так как спецификация в принципе стандартная, то количество столбцов всегда будет одинаковое. Таким образом в макросе на кнопку повесить выбрать блоки таких то имен... потом запустить макрос VBA который используя выбранные блоки на их основе создаст таблицу1 со всеми аттрибутами которые есть (их будет одинаковое кол-во по определению блоков). потом для другой спецификации выбирается другой набор блоков и записывается в Таблицу2. и т.д.
Если в схеме что то изменилось, то просто делается новая выборка в таблицу, а старая таблица удаляется. Главное чтобы сама база данных с отчетами и запросами не стиралась. Вот такая стратегия.
[ATTACH]1108119795.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 11.02.2005, 15:30
#31
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Бегу впереди паровоза... :twisted: две лишние строки...
Должно остаться так (если опять ничего не напутал)
Код:
[Выделить все]
  ElseIf resp = vbCancel Then CreateDatabase = False
  Else
    CreateDatabase = True
  End If
  Exit Function
Да, перед созданием новой таблицы, старую надо переименовать или удалить.
vk вне форума  
 
Непрочитано 11.02.2005, 15:39
#32
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Mikhail,
Цитата:
p.s. а что это никому больше не интересно?
Мне интересно, только я ничего понять не могу

А говорить о том, где я это у себя смогу применить, вообще без понятия.
Lenich вне форума  
 
Автор темы   Непрочитано 11.02.2005, 16:13
#33
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


to vk
вроде сейчас работает и создает и дополняет, но вопрос про Альтернативное расположение информации остается Предлагаю на этом и закончить трудовую неделю Понедельник пятницы мудренее.
p.s. Все за город и предаватся прелестям зимы
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 11.02.2005, 16:39
#34
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Как? уже пятница???? Абалдеть!!!!

Про альтернативное подумаю. Честно говоря, пока нет мыслей по реализации. Но думаю, что за выходные что нибудь сочиню.

Всем приятных выходных
vk вне форума  
 
Непрочитано 11.02.2005, 21:50
#35
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Небольшое складбище сканированой в PDF литературы в том числе и по Access. За ценность и информативность ничего сказать не могу....
vk вне форума  
 
Непрочитано 13.02.2005, 21:48
#36
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Набросал приблизительно... без проверок и обработки ошибок.
Работает самостоятельно без вызова внешних функций.
Код:
[Выделить все]
Option Compare Text

' для ссылок блоков с атрибутами
'
' блоки могут иметь одинаковые атрибуты или не иметь их вовсе.
' допускается выбор блоков с разным количеством атрибутов,
' однако первым должен быть выбран блок у которого имеются
' все атрибуты (имеются в виду имена тэгов).
'
' запись всегда в новую таблицу

' требуется подключение рефренса
' "Microsoft ActiveX Data Objects 2.8 Library"
Sub SelAndWriteBlockAttrib()
  Dim fileName As String
  fileName = "C:\MyNewDB1.mdb" ' файл БД (должен существовать)
  Dim tblName As String
  tblName = "MyBlockAttrTable" ' имя таблицы (постоянная часть)
  
  Dim i, j
  ' удалить старый SelectionSet
  For Each i In ThisDrawing.SelectionSets
    If i.Name = "MySSet" Then i.Delete: Exit For
  Next
  
  ' создать SelectionSet и выбрать примитивы
  Dim ssetObj As AcadSelectionSet
  Set ssetObj = ThisDrawing.SelectionSets.Add("MySSet")
  Dim gpCode(0) As Integer
  Dim dataValue(0) As Variant
  gpCode(0) = 0
  dataValue(0) = "Insert"
  Dim groupCode As Variant, dataCode As Variant
  groupCode = gpCode
  dataCode = dataValue
  ThisDrawing.Utility.Prompt "Выбери БЛОКИ С ОДИНАКОВЫМИ ТЭГАМИ АТРИБУТОВ для экспорта в БД >"
  ssetObj.SelectOnScreen groupCode, dataCode
  
  If ssetObj.Count > 0 Then ' при наличии выбранных...
    ' открываем подключение к БД
    Dim conn As New ADODB.Connection
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & fileName
    
    ' подбор уникального имени таблицы
    Dim rstSchema As ADODB.Recordset
    Dim suff As Integer ' счетчик, суффикс имени таблицы
    suff = 0
    Set rstSchema = conn.OpenSchema(adSchemaTables)
    Do
      suff = suff + 1 ' новый суффикс
      rstSchema.MoveFirst
      rstSchema.Find "TABLE_NAME='" & tblName & suff & "'"
    Loop Until rstSchema.EOF ' повторяем, до тех пор пока не пролетаем с именем таблицы
    rstSchema.Close
    Set rstSchema = Nothing
    
    ' создание таблицы
    ' (в обязательном порядке создаются уникальный ключ и поле для имени блока)
    Dim sqlStr As String
    sqlStr = "CREATE TABLE " & tblName & suff & " (bName CHAR "
    ' тэги атрибутов первого выбранного блока будут являться именами полей таблицы
    For Each i In ssetObj(0).GetAttributes
      sqlStr = sqlStr & ", " & i.TagString & " CHAR "
    Next
    sqlStr = sqlStr & ", recID INTEGER NOT NULL CONSTRAINT key1 PRIMARY KEY );"
    conn.Execute (sqlStr)
  
    ' запись данных в таблицу
    Dim rstTbl As New ADODB.Recordset
    With rstTbl
      ' открываем рекордсет как таблицу
      .Open tblName & suff, conn, adOpenKeyset, adLockPessimistic, adCmdTable
      Dim rID As Long
      rID = 0 ' счетчик записей
      For Each i In ssetObj
        If i.HasAttributes = True Then ' блоки без атрибутов игнорируем
          rID = rID + 1
          .AddNew
          .Fields("recID") = rID
          .Fields("bName") = i.Name
          For Each j In i.GetAttributes ' для каждого атрибута
            rstTbl.Fields(j.TagString) = j.TextString
          Next
          .Update
        End If
      Next
      .Close ' готово, закрываем рекордсет
    End With
    Set rstTbl = Nothing
    conn.Close ' закрываем подключение к БД
    Set conn = Nothing
  End If
  
  Set i = Nothing
  Set j = Nothing
  Set ssetObj = Nothing
End Sub
Честно говоря, мне такой способ хранения не нравится совершенно. Удобнее хранить данные (можно и весь чертеж при желании) в одной таблице и при необходимости выдергивать нужное при помощи запроса (имхо).
vk вне форума  
 
Автор темы   Непрочитано 14.02.2005, 10:22
#37
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Цитата:
Сообщение от vk
Честно говоря, мне такой способ хранения не нравится совершенно. Удобнее хранить данные (можно и весь чертеж при желании) в одной таблице и при необходимости выдергивать нужное при помощи запроса (имхо).
Задумался над этим... Даже не знаю... по этому поводу у меня парочка вопросов.
Таблицу тогда в таком виде не сделать будет? Т.е. если разное количество аттрибутов, то они будут некорректно заполнятся в таблице? Или нет? Или надо вернутся к первому способу создания таблицы, т.е. аттрибуты в строчках? Но представление мне надо все равно в стобик, т.е. надо будет делать запрос которые будет создавать таблицу с "перевернутыми" в столбик аттрибутами. Такое возможно? (я на форуме по Аксесу вроде видел программу, но все таки засилие программ мне кажется может вызвать где то ошибку...)
И как на счет ресурсоемкости, т.е. большая таблица и к ней куча (штук 10) запросов, или просто штук 10 таблиц. Просто еще такая фишечка, что с этой базйой будут работать несколько человек проблемм с тем, что один будет делать отчет, а другой извлечет еще раз все аттрибуты и немного ему помешает, не будет?
Ксати по коду... ошибочку выдает (картинка)
з.ы. ActiveX у меня 2.7
[ATTACH]1108365747.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 14.02.2005, 13:06
#38
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


По картинке - это означает что в запросе на создание таблицы содержится ошибка и создать таблицу не удалось. К сожалению, мне отсюда не видно, что делается в недрах твоего компа.... Неплохо было бы взглянуть на значение переменной sqlStr. Почему то не всегда удается назначить полю таблицы любое "отфонарное" имя, а здесь оно берется из тэга атрибута. Может быть в этом причина, а может в чем то другом. Если в этом - то можно к имени поля какой нибудь префикс приделать.

Цитата:
ActiveX у меня 2.7
На сайте мелкомягких давно лежит 2.8, впрочем, и в 2.7 не должно быть проблем.

Цитата:
с этой базйой будут работать несколько человек проблемм с тем, что один будет делать отчет, а другой извлечет еще раз все аттрибуты и немного ему помешает, не будет?
Если не перемудрить с блокировками - то не мешает. Изначально MDB многопользовательская среда.

Цитата:
т.е. надо будет делать запрос которые будет создавать таблицу с "перевернутыми" в столбик аттрибутами. Такое возможно? (я на форуме по Аксесу вроде видел программу, но все таки засилие программ мне кажется может вызвать где то ошибку...)
Программы конечно хорошо, но не всегда приемлемо. А в Аксесе есть конструктор запросов. Во многих случаях можно создать запрос не зная языка SQL (пользуясь в основном мышкой). Хотя, лучше изучить. Не такой уж он сложный, к тому же есть описания на русском. Да и далеко не все доступно на уровне мышководства.

Цитата:
И как на счет ресурсоемкости, т.е. большая таблица и к ней куча (штук 10) запросов, или просто штук 10 таблиц.
Мдя... Похоже то на то и выходит.....
Только запрос может жить внутри отчета. Это конечно не уменьшит килобайты, но не будет плодить обилие объектов.
В общем, надо поизучать возможности.....

PS надеюсь, что глобальная задача состоит не только в красивом оформлении спецификаций :wink:
vk вне форума  
 
Автор темы   Непрочитано 14.02.2005, 13:35
#39
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Цитата:
Сообщение от vk
PS надеюсь, что глобальная задача состоит не только в красивом оформлении спецификаций :wink:
Задача как всегда глобальная... создание той единственной кнопочки при нажатии на которую ВСЕ БУДЕТ (ну или хотя бы по схеме сразу спецификация вывалится из принтера)
А по поводу значения переменной
Код:
[Выделить все]
Watch :   :   sqlStr : "CREATE TABLE MyBlockAttrTable4 (bName CHAR , ОБОЗНАЧЕНИЕ CHAR , НОМЕР CHAR , НАИМЕНОВАНИЕ_ПРИБОРА CHAR , ТИП CHAR , СРЕДА CHAR , ТЕМПЕРАТУРА CHAR , ДАВЛЕНИЕ CHAR , ДИАПОЗОН_ИЗМЕРЕНИЙ CHAR , ТИП_ПРИСОЕДИНЕНИЯ CHAR , ГАБАРИТЫ CHAR , ДИАПАЗОН_ТЕМПЕРАТУРО"
почему то тут кирилица не отобразилась...
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 14.02.2005, 14:55
#40
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Возможно дело как раз в кирилице (еще одно узкое место?). Попробуй в качестве теста тэги атрибутов латиницей сделать.
vk вне форума  
 
Автор темы   Непрочитано 14.02.2005, 15:52
#41
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


уже пробовал... все равно
Код:
[Выделить все]
"CREATE TABLE MyBlockAttrTable1 (bName CHAR , NUMBER CHAR, SERVICE CHAR, DESCRIPTION CHAR, SEEWHAT CHAR, SIZE CHAR, MATERIAL CHAR, ATTACHMENT CHAR, LOCATION CHAR, REV CHAR, recID INTEGER NOT NULL CONSTRAINT key1 PRIMARY KEY );"
хотя в анг. аттрибутах до конца дописывается (до primery key....), а когда много русских аттрибутов, то не до конца заполняется функция, она обрывается вконце где то... или может отладчик целиком не выдает?...
А еще заметил при выборе блока без аттрибутов программа прорабатывает до конца, но в таблице не заполняется ничего, ни название блока, ни ключевое поле... Может в самом представлении SQL что то не то?
а почему на SQL создание таблицы? может как в предыдущей версии типа
Код:
[Выделить все]
tbl.Columns.Append "recID", adInteger
  
  ' à çàîäíî è èíäåêñà "PrimaryKey"
  Dim inx1 As New ADOX.Index
  inx1.PrimaryKey = True
  inx1.Name = "PrimaryKey"
  inx1.Columns.Append "recID"
  tbl.Indexes.Append inx1
  Set inx1 = Nothing
  
  ' åùå ïîëÿ...
  tbl.Columns.Append "ObjName", adWChar, 25
з.ы. кирилица видно только при вставке в форум не отображается корректно.
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 14.02.2005, 17:56
#42
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Чтоб кирилица при вставке в форум корректно показывалась - нужно перед копированием переключить раскладку клавы на RU. Проблема кажись только для ХРюши и 2000 винды

Чтоб посмотреть длиииинную строку, можно воспользоваться Immediate window (по Ctrl+G). Там напечатать
Цитата:
?sqlstr
и жмакнуть Enter. Это вроде консоли....

Цитата:
почему на SQL создание таблицы?
мне показалось так проще... И еще: почему то некоторые имена полей не удается назначить... попробую сделать блок с твоими атрибутами и посмотрю.
От способа создания таблицы это скорей всего не зависит.
vk вне форума  
 
Автор темы   Непрочитано 14.02.2005, 18:30
#43
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Хм, а на простеньком блоке сработало все...
Действительно какая то заморочка с тэгами
а CHAR это сколько символов? Хм еще раз...
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 14.02.2005, 19:30
#44
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Ага, значит так. Во первых, ругается на тэг NUMBER. С этим все понятно. Делаем префикс в виде скажем подчерка "_" - и закрываем проблему. Конечно, можно любые другие символы.

Вторая проблема связана с ограничением на длину записи. Уменьшаем длину текстовых полей. В примерчике до 50 знаков сократил. Кстати, с русскими именами полей (и вобще всего) могут быть проблемы при использовании нерусской версси Аксеса. Сам не проверял и не нарывался, но не зря ж говорят.....

Код:
[Выделить все]
    ' создание таблицы
    ' (в обязательном порядке создаются уникальный ключ и поле для имени блока)
    Dim sqlStr As String
    sqlStr = "CREATE TABLE " & tblName & suff & " (bName CHAR(50) "
    ' тэги атрибутов первого выбранного блока будут являться именами полей таблицы
    For Each i In ssetObj(0).GetAttributes
      sqlStr = sqlStr & ", _" & i.TagString & " CHAR(50) "
    Next
    sqlStr = sqlStr & ",recID INTEGER NOT NULL CONSTRAINT key1 PRIMARY KEY);"
    conn.Execute (sqlStr)
и чуть дальше
Код:
[Выделить все]
          For Each j In i.GetAttributes ' для каждого атрибута
            rstTbl.Fields("_" & j.TagString) = j.TextString
          Next
PS По умолчанию CHAR - это 255 символов.
PPS Дык на то он и простенький примерчик... Вспомнил фразу из одного известного фильма: "Вы слышали когда нибудь о героически погибшем экипаже тренажера?" (было сказано при погружении подводной лодки)
vk вне форума  
 
Автор темы   Непрочитано 15.02.2005, 11:14
#45
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Спасибо
вроде все более менее, хотя с русскими аттрибутами не работает, но там наверное просто надо их упростить до одного слова (вместо МЕСТО_УСТАНОВКИ наверное просто МЕСТО) написать ну или что то подобное. В общем упрощением аттрибутов буду заниматся.
А так для общего образования интересно просто
Цитата:
Цитата:
Цитата:
т.е. надо будет делать запрос которые будет создавать таблицу с "перевернутыми" в столбик аттрибутами. Такое возможно? (я на форуме по Аксесу вроде видел программу, но все таки засилие программ мне кажется может вызвать где то ошибку...)
Программы конечно хорошо, но не всегда приемлемо. А в Аксесе есть конструктор запросов. Во многих случаях можно создать запрос не зная языка SQL (пользуясь в основном мышкой). Хотя, лучше изучить. Не такой уж он сложный, к тому же есть описания на русском. Да и далеко не все доступно на уровне мышководства.
в запросах он вроде только столбцы в стольцы может выбрать, а вот чтобы из первого варианта программы (где все в строчки писались) сделать выборку, чтобы она выглядила так как сейчас выглядит я как то не допетрил пока. Там наверное надо какой то цикл делать типа по одинаковому знакчению ObjHandle сделать одну строчку ну или как то так, но я пока не догоняю
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Автор темы   Непрочитано 15.02.2005, 12:12
#46
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


и еще одна проблемма у меня только 6 аттрибутов можно занести, при большем количестве он ругается ...
[ATTACH]1108458758.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 15.02.2005, 13:43
#47
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Mikhail
в запросах он вроде только столбцы в стольцы может выбрать, а вот чтобы из первого варианта программы (где все в строчки писались) сделать выборку, чтобы она выглядила так как сейчас выглядит я как то не допетрил пока. Там наверное надо какой то цикл делать типа по одинаковому знакчению ObjHandle сделать одну строчку ну или как то так, но я пока не догоняю
Никаких циклов. Все делается в запросе на основе группировки и связывании нескольких экземпляров таблицы (по количеству атрибутов). Конечно, замудрено получится, но вроде как надежнее должно быть.

Цитата:
и еще одна проблемма у меня только 6 аттрибутов можно занести, при большем количестве он ругается ...
Дык еще вчера писал же про CHAR(50), чтоб подсократить длину поля... или попадаются атрибуты длиннее 50 символов? В принципе можно и это ограничение обойти.....

Если же имеется в виду ограничение на длину собираемой строки... ну если она будет слиииииишком длинная (кажется больше тыщи символов, точно не знаю), то можно ее разбить на несколько и собирать уже непосредственно при Execute
vk вне форума  
 
Автор темы   Непрочитано 15.02.2005, 14:21
#48
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Цитата:
Сообщение от vk
Цитата:
и еще одна проблемма у меня только 6 аттрибутов можно занести, при большем количестве он ругается ...
Дык еще вчера писал же про CHAR(50), чтоб подсократить длину поля... или попадаются атрибуты длиннее 50 символов? В принципе можно и это ограничение обойти.....
Странно... сейчас еще раз тот же самый блок вытащил без проблемм... Наверное действительно против глюка лучшее средство перезагрузить и попробывать еще раз.
Так что сейчас все нормально
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Автор темы   Непрочитано 16.02.2005, 12:21
#49
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


А вот небольшое дополнение возможно ли сделать? просто для дальнейшей автоматизации выбор объектов было бы не плохо сделать шаблон выбора. вот тут я тему поднял с выбором одинаковых блоков http://dwg.ru/forum/viewtopic.php?t=1128&start=15, может поможет. А вообще было бы хорошо просто в саму программу просто вписать названия типов блоков, аттрибуты из которых надо внести в базу.
Просто я что то попытался в языки с ходу вникнуть, но видно так все с кандачка не дается
так что сейчас могу на вас только надеятся
Спасибо.

ДОБАВЛЕННО:
Почему тип переменной CHAR? Просто когда ставишь CHAR(50), то и соответственно ширина столбца становится 50, а это когда смотришь на отчет отражается на его виде(т.е. каждая ячейка становится равно 50 символам, что не удобно.) А поставил тип данных TEXT все стало нормально, даже подгоняется по необходимости.

А еще такой вопрос. Что надо вставить программу, что бы при создании таблицы распечатывался отчет который уже настроен на данную таблицу. Кстати а переписывать таблицу можно? Чтобы не плодились 1,2,3,...
А так уже почти почти )
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 16.02.2005, 19:16
#50
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Mikhail
А вообще было бы хорошо просто в саму программу просто вписать названия типов блоков, аттрибуты из которых надо внести в базу.
Это можно попробовать привинтить как то так
Код:
[Выделить все]
   Dim gpCode(4) As Integer, dataValue(4) As Variant
  gpCode(0) = 0
  gpCode(1) = -4
  gpCode(2) = 2
  gpCode(3) = 2
  gpCode(4) = -4
  dataValue(0) = "Insert"
  dataValue(1) = "<OR"
  dataValue(2) = "bName1"
  dataValue(3) = "bName2"
  dataValue(4) = "OR>"
  Dim groupCode As Variant, dataCode As Variant
  groupCode = gpCode
  dataCode = dataValue
'  ThisDrawing.Utility.Prompt "Выбери БЛОКИ С ОДИНАКОВЫМИ ТЭГАМИ АТРИБУТОВ для экспорта в БД >"
'  ssetObj.SelectOnScreen groupCode, dataCode
  ssetObj.Select acSelectionSetAll, groupCode, dataCode
Цитата:
Просто когда ставишь CHAR(50), то и соответственно ширина столбца становится 50, а это когда смотришь на отчет отражается на его виде(т.е. каждая ячейка становится равно 50 символам, что не удобно.)
Дык тут же задается длина поля таблицы для хранения данных, а в отчете то поля делаются для отображения данных... Мдя, а они фиксированой длины... для отчета не есть гуд.
Цитата:
А поставил тип данных TEXT все стало нормально, даже подгоняется по необходимости.
Да, так в данном случае удобнее. Наверно лучше вроде TEXT(50), чтоб Аксес не воспринимал его как MEMO (ну если придется где то делать поиск например)

Цитата:
Что надо вставить программу, что бы при создании таблицы распечатывался отчет который уже настроен на данную таблицу. Кстати а переписывать таблицу можно? Чтобы не плодились 1,2,3,...
Чтоб не плодились - можно переписывать.... Если набор полей (или набор атрибутов - уже не знаю как оно организовано то сейчас) одинаковый - то можно таблицу не удалять а просто очищать от записей запросом на удаление. Скорей всего так будет даже проще, таблицу то можно сделать один раз ручками.
А чтоб автоматом печатался - тоже можно. Даже способов куча есть... Вам какой? :wink: Можно например сделать в Аксе макрос для печати который будет запускаться автоматически при открытии интерфейсной части БД (если предполагается одновременная работа нескольких пользователей - то лучше разделить таблицы и все остальное по разным файлам). Можно попробовать то же самое сделать на VBA из-под АКАДа непосредственно (сам не пробовал, возможно это не будет надежно). Можно программно запустить БД с соотв. аргументами командной строки (предварительно формируем программно) и там уже вызывать печать то что надо (этот способ наверняка более надежен, потому как не придется делать рефренсы на библиотеки Аксеса). Можно даже ярлычек отчета вытащить на рабочий стол (у меня через такие ярлычки, тока не на десктопе конечно, одно время печатались отчеты по заданиям в шедулере).
vk вне форума  
 
Автор темы   Непрочитано 17.02.2005, 13:07
#51
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


тут ошибочка стала вылезать при очередной модификации программы есть у меня подозрение на
Код:
[Выделить все]
ssetObj.Select acSelectionSetAll, groupCode, dataCode
а может и нет.
по поводу печати... Просто ты присылал мне базу данных с макросом для Аксеса... я его тупа попытался вставить сюда, но видно как то его видоизменить надо, не только privat Sub убрать
Код:
[Выделить все]
Private Sub PrintReport_Click()
  DoCmd.OpenReport "qqq", acViewPreview
  Reports.Item("qqq")!Warning.Visible = False
  DoCmd.PrintOut
  DoCmd.Close acReport, "qqq"
End Sub
а вообще наверное интересно так... когда аттрибуты записались в таблицу, то выскакивает окошечко в АКАДе типа "распечатать или нет отчет?"
А по поводу таблицы... как проще будет или перезаписывать всю таблицу или только значения переделать. Т.е. наверное так. если таблицы нет она создается если таблица есть, то она переписывается. Думаю так оптимально... хотя пока не поработаешь пару неделек и не увидешь проблеммы, то сказать как лучше довольно трудно.
[ATTACH]1108634874.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 17.02.2005, 17:59
#52
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Mikhail
тут ошибочка стала вылезать при очередной модификации программы есть у меня подозрение на
Код:
[Выделить все]
ssetObj.Select acSelectionSetAll, groupCode, dataCode
а может и нет.
Это то что на картинке? Наверно в набор попал блок у которого отсутствуют атрибуты...

Цитата:
по поводу печати... Просто ты присылал мне базу данных с макросом для Аксеса... я его тупа попытался вставить сюда, но видно как то его видоизменить надо, не только privat Sub убрать
Угу. Если ничего не путаю, DoCmd - это объект Аксеса а не АКАДа, соответственно, к нему надо обращаться указывая конкретно приложение, а не по умолчанию. Скорей всего так, сам не пробовал. Но по любому, сначала придется из VBA-АКАДа открыть БД. Может быть, более простой способ будет посредством Shell вызывать макрос (через ярлык), который печатал бы отчет.... По крайней мере, практически это всего одна строчка в VBA (если без проверок)

Цитата:
А по поводу таблицы... как проще будет или перезаписывать всю таблицу или только значения переделать.
Большой разницы нет. Удалить все данные из таблицы - две-три строчки кода (запрос DELETE). А вот удалять таблицу или нет... если набор полей всегда одинаковый - то нафига же ее удалять-создавать каждый раз? Пусть живет
В принципе, если набор полей фиксированый, то прогу можно существенно подсократить... Кстати, ВСЕ ЛИ выбираемые блоки обязаны иметь атрибуты? Если некоторые блоки без атрибутов - то этот момент надо тоже обрабатывать.

PS Кажется уже пол-месяца тема актуальна? :wink:
vk вне форума  
 
Автор темы   Непрочитано 18.02.2005, 09:49
#53
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Цитата:
Сообщение от vk
Это то что на картинке? Наверно в набор попал блок у которого отсутствуют атрибуты...
Да вроде нет. Там я правильно понял за место
Код:
[Выделить все]
dataValue(0) = "Insert" 
  dataValue(1) = "<OR" 
  dataValue(2) = "bName1" 
  dataValue(3) = "bName2" 
  dataValue(4) = "OR>"
bName1 и bName2 написать имена двух моих блоков с одинаковыми аттрибутами? А что такое за "<OR"?
Цитата:
Большой разницы нет. Удалить все данные из таблицы - две-три строчки кода (запрос DELETE). А вот удалять таблицу или нет... если набор полей всегда одинаковый - то нафига же ее удалять-создавать каждый раз?
Я ЗА! Мне не надо бессмысленное стирание таблиц, еще скажут что я таблицененавистник
Цитата:
В принципе, если набор полей фиксированый, то прогу можно существенно подсократить... Кстати, ВСЕ ЛИ выбираемые блоки обязаны иметь атрибуты?
Да поля фиксированные для опредленных наборов блоков, т.е. я все таки наверное за то, чтобы для выделения аттрибуты с арматурой один макрос, для выделения аттрибутов с КИПом другой. Так же и таблицы. А аттрибуты имеют все выделяемые блоки. Думаю Это обрабатывать не надо. Я просто при создании самих блоков с аттрибутами прослежу за их идентичностью.
Цитата:
PS Кажется уже пол-месяца тема актуальна? :wink:
Общение с умными людьми всегда актуально Да и пока окончательного решения нет останавливатся не стоит, если конечно я еще не достал тебя ....
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 18.02.2005, 11:19
#54
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Вопрос к автору темы. Mikhail, отчёт это спецификация? Если да, то мы тут в соседней ветке http://dwg.ru/forum/viewtopic.php?t=2889
начинали, да что-то закончили на моём вопросе-опросе. Прошу участников этой темы просветить. Считывание атрибутов с чертежа (имя атрибута + количество) мы соединили с пристёжкой к ним характеристик оборудования из имеющейся базы.
Alan вне форума  
 
Автор темы   Непрочитано 18.02.2005, 12:15
#55
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Цитата:
Сообщение от Alan
Вопрос к автору темы. Mikhail, отчёт это спецификация?
Да спецификация. Вот уже 4 страницы тут понакатали Конечно можно все автоматизировать, но для начала хотя бы концептуальную так сказать разработку сделать. А потом заполнить все эти аттрибуты в схеме. А потом уже улучшать и дополнять.
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 18.02.2005, 14:12
#56
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


[quote="Mikhail"]Да вроде нет......
Цитата:
Сообщение от vk
bName1 и bName2 написать имена двух моих блоков с одинаковыми аттрибутами? А что такое за "<OR"?
Да, правильно. OR это ИЛИ по-аглицки. Вполне возможно, что получится и без него, перечислив имена блоков через запятую, как это делается в Лиспе. Однако, почему то я про это забываю постоянно.... :?
А что попало в набор и почему оно не обрабатывается... Сложно догадываться на большом расстоянии, когда под руками нет

Да, вот накорябал код в продолжение предыдущего, чтоб сразу выгонять на печать (с подтверждением). Правда таблицы не удаляю и не очищаю (а может пусть хранятся типа для истории? ). Просто выводится на принтер отчет с последней созданной таблицей.
Код:
[Выделить все]
...............................
    conn.Close ' закрываем подключение к БД
    Set conn = Nothing
  End If
  
  Set i = Nothing
  Set j = Nothing
  Set ssetObj = Nothing
  If MsgBox("Печатать будем?", vbYesNo + vbApplicationModal + vbQuestion, _
  "Таблица готова, что дальше?") = vbYes Then Call PrintReport(suff)
End Sub

Sub PrintReport(tabSuf As Integer)
  Dim fileName As String
  fileName = "C:\MyNewDB1.mdb" ' файл БД
  Dim repName As String
  repName = "MyReport1" ' имя отчета
  Dim tblName As String
  tblName = "MyBlockAttrTable" ' имя таблицы (постоянная часть)

  ' надобно прицепить рефренс "Microsoft Access 10.0 Object Library"
  Dim acsApp As New Access.Application
  With acsApp
    .OpenCurrentDatabase fileName
'    .Visible = True ' видимость Акса на экране (в принципе не нужна)
    .DoCmd.OpenReport repName, acViewDesign
    .Reports.Item(repName).RecordSource = tblName & tabSuf ' назначение таблицы-источника
    .DoCmd.OpenReport repName, acViewPreview
'    .Reports.Item(repName)!Warning.Visible = False
    .DoCmd.PrintOut
    .DoCmd.Close acReport, repName, acSaveNo ' закрыть без изменений
    .CloseCurrentDatabase
    .Quit
  End With
  Set acsApp = Nothing
  MsgBox "Получите у Printer'а листов пачку.", vbInformation, "Отправлено на печать"
End Sub
Ну это так, чтоб убедиться что работает. Если сохранять таблицы для истории - то можно в имя таблицы впихнуть имя файла чертежа. Однако, тогда обвинят в размножении таблиц. Более правильно создать еще одно поле с именем чертежа (еще более правильно - с числовым идентификатором имени чертежа) и по нему задавать условие отбора при открытии отчета. Таблица одна на все чертежи. Впрочем, это только мысли.
vk вне форума  
 
Автор темы   Непрочитано 18.02.2005, 17:00
#57
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Всё таки блоки не выделяются при написании их имен в теле программы. Т.е. ошибка та осталась. Вот пример аттрибутов название их VLVBF и VLVBLS, а название аттрибутов в картинке. При их простом выделении они в базу данных нормально записываются.

А печатается на ура Только там с 2003 Аксесом какая то заморочка он мне засранец табличку выкидывает типа "Открыть ли эту чертовски небезопасную схему?"

p.s. Удачных выходных, а я пойду машину мастеру тащить... Эх автопром и кривые руки
[ATTACH]1108735216.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 18.02.2005, 17:36
#58
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Не совсем понятно, КАК именно должен делаться выбор. Полностью автоматом ssetObj.Select acSelectionSetAll, groupCode, dataCode или ручками на экране ssetObj.SelectOnScreen groupCode, dataCode Может в этом проблема? Или же требуется оставить подсветку после автоматического выбора... Если ничто не помогает, замыль мне файлы чертежа и VBA-макроса, попробую разобраться, может какие ньюансы.....

Про "чертовски небезопасную схему" ничего сказать не могу. Может что то с настройками Акса, а может особенность 2003 версии... Сам пользую OfficeXP (вот такой вот ретроград ), так что проверить не смогу. Попробуй задать этот вопрос на форуме по Аксесу, хотя, вполне возможно, он там уже задавался (удивительно, но там умудряюсь находить ответы на 90% возникающих вопросов - все уже спрошено до нас ). Наверняка программно можно отключить вывод сообщения.
vk вне форума  
 
Автор темы   Непрочитано 18.02.2005, 18:18
#59
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


to vk
Все нормально заработало... Какой то файл глючный... теже самые блоки копирую в другой чертеж и там выборка нормально происходит... Мрак. Ладно будем боротся.
Еще раз спасибо
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Автор темы   Непрочитано 21.02.2005, 09:49
#60
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Доброго начала недели
В общем такая ситуевина... Есть блоки в файле, когда выборку их делаешь выделением, то все работает. Когда выборку их делаешь написанием их имен в теле программы, тогда не работает. (пишется та ошибка). Если эти блоки скопировать в пустой чертеж, то программа работает в любом случае. А вот если в этом новом чертеже ввести еще что то (линию, полилинию ...), то опять вылезает ошибка. Я так думаю когда имя аттрибута пишется в проге, то там что то не так и программа считывает не только эти локи, но и все примитивы... А там естественно аттрибутов нет. и поэтому ошибка.
Поможите люди добрые
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 21.02.2005, 14:36
#61
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Я так думаю когда имя аттрибута пишется в проге, то там что то не так и программа считывает не только эти локи, но и все примитивы...
А поставить после выбора точку останова (брекпойнт) и посмотреть что в наборчик попадает....? :wink:
vk вне форума  
 
Автор темы   Непрочитано 21.02.2005, 17:41
#62
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Цитата:
Сообщение от vk
А поставить после выбора точку останова (брекпойнт) и посмотреть что в наборчик попадает....? :wink:
Это слишком умно для меня, но что то сделать я умудрился. Поименно назвать все не могу, но количество полное, т.е. количество примитивов (select all) равно COUNTу выборки.
[ATTACH]1108996915.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 21.02.2005, 22:37
#63
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Ууупс!!!
оно что, проигнорировало dataValue(0) = "Insert", которое предписывало выбирать тока вставки блоков? или в чертеже больше нет ничего (во что верю с трудом)?

Попробуй сразу после выбора что то вроде этого чтоб хотя бы узнать имена примитивов и наличие атрибутов. Вывод в Immediate Window

Код:
[Выделить все]
For Each i In ssetObj
  Debug.Print i.Name & " " & i.HasAttributes
Next
А лучше перед этим типы примитивов определить, а то просто вылетит по ошибке.
Код:
[Выделить все]
For Each i In ssetObj
  Debug.Print i.ObjectName
Next
* чтоб проигнорировать вылет по ошибке, надо добавить строку
Код:
[Выделить все]
On Error Resume Next
однако, это не всегда гуд. В любом случае, проге требуется обработчик ошибок, которого на данном этапе нет.

ну и еще много чего можно посмотреть... подробности в хелпе какие свойства/методы доступны

Впрочем, можно по шагам посмотреть что в i содержится (в Watch Window), только утомительно для двух тысяч примитивов.

Гм, понаписал-то... В итоге: похоже на ошибку в определении фильтра для выбора.
vk вне форума  
 
Автор темы   Непрочитано 22.02.2005, 09:38
#64
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


Ну в принципе как и говорил он(мерзкий компутер ) выбирает все. Что документально и подтверждаю.
А что это за groupCode ? Это код команды, для обозначения типа данных?
А, что еще значит <OR?
[ATTACH]1109054314.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Автор темы   Непрочитано 22.02.2005, 14:34
#65
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


И еще вопросик. а что в этой строчке
Код:
[Выделить все]
ssetObj.Select acSelectionSetAll, groupCode, dataCode
acSelectionSetAll.... = 5? если честно не знаю , что это такое... иожет поясните?
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 22.02.2005, 19:41
#66
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
acSelectionSetAll.... = 5? если честно не знаю , что это такое...
acSelectionSetAll - имя константы
5 - значение константы

Цитата:
А что это за groupCode
это DXF группа (номер группы)

Цитата:
А, что еще значит <OR?
еще раз: OR - это ИЛИ по аглицки....
русское "блок1" ИЛИ "блок2" ИЛИ "блок17"
преобразовывается в "<OR" "блок1" "блок2" "блок17" "OR>"
с соответствующим раскладом по элементам массива

В Лиспе прокатывает такой сокращенный вариант "блок1,блок2,блок17" без OR
Попробуй, может и в VBA сработает
vk вне форума  
 
Непрочитано 22.02.2005, 23:52
#67
cadhelp

autocad
 
Регистрация: 16.12.2004
Сообщений: 5


В акаде есть ехпорт атрибутов, но он очень нудный и не всегда работает как надо.
Могу предложить свою прогу по ехпорту атрибутов в техт file или в автокад(в табличном виде). Затем техт файл мжно импортировать в любую базу (мне приходится работать практически со всемы широко используемыми)

http://dwg.ru/dwl/151
cadhelp вне форума  
 
Непрочитано 23.02.2005, 12:47
#68
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


>>Mikhail Ваш вопрос решается вполне активно с точки зрения создания новой программы. Но Вы так уж поставили задачу. М.б. прислать кусочек технологического чертежа (медицинское оборудование, но можно станки и т.п.) с полученной по нему готовой спецификацией, а не списка блоков с атрибутами? Пишите.
Alan вне форума  
 
Автор темы   Непрочитано 24.02.2005, 11:15
#69
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


>cadhelp
Спасибо. Но чем меньше ходов, тем лучше, поэтому и хочется сразу в базу данных посылать данные. А то мало ли что... Конечно это глупая причина, но как правило такое чаще всего и случается

>Alan
Был бы рад посмтреть как это у Вас сделано. Аттрибуты программно вытаскиваете? или стандартными средствами?

>vk
Я понимаю что уже достал, но все же...
Решил все таки немного погрузится в хоть какое то изучение VBA и вот что накопал... см. картинку. Если указать точки, как и просится по стилю команды, то выделение проходит нормально. Просто не всегда знаешь ту область где находится схема. Не писать же область выделение от (-10^10, -10^10; 10^10, 10^10) (например). Или иначе не обойтись?
[ATTACH]1109232945.jpg[/ATTACH]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 24.02.2005, 17:29
#70
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


>>Mikhail Я бы Вам выслал, но не знаю адреса. Пишите.
В процессе работы программы спецификации возможен ввод информации из чертежа. Из программы запускается Автокад, который считывает все блоки с атрибутами по заданному шаблону, типа как работает команда АТТЕХР (т.е. все болки удовлетворяюшие шаблону). Затем Вы можете добавить в проект (спецификацию) другое оборудование из базы. Прога сформирует выходные формы согласно ГОСТ.
Alan вне форума  
 
Непрочитано 24.02.2005, 17:35
#71
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Млин... все проблемы от моей невнимательности
Прорустил пару запятых на опциональных параметрах (
Правильно так:
Код:
[Выделить все]
ssetObj.Select acSelectionSetAll, , , groupCode, dataCode
vk вне форума  
 
Автор темы   Непрочитано 25.02.2005, 09:33
#72
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,144


to vk
Спасибо, все заработало, хотя сам до этого методом тыка попытался так написать, но почему то не работало.
Еще одна просьба... Помню говорили по поводу удаления таблиц... как бы это сделать? т.е. заменить это
Код:
[Выделить все]
' подбор уникального имени таблицы
    Dim rstSchema As ADODB.Recordset
    Dim suff As Integer ' счетчик, суффикс имени таблицы
    suff = 0
    Set rstSchema = conn.OpenSchema(adSchemaTables)
    Do
      suff = suff + 1 ' новый суффикс
      rstSchema.MoveFirst
      rstSchema.Find "TABLE_NAME='" & tblName & suff & "'"
    Loop Until rstSchema.EOF ' повторяем до тех пор пока не пролетаем с именем таблицы
    rstSchema.Close
    Set rstSchema = Nothing
на то чтобы просто если таблицы нет она бы создавалась, а если она есть, то она бы стиралась... пока такая мысль. Хотя есть еще идея формирование имени таблицы в зависимости от имени чертежа... но это пока идея такая.
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 25.02.2005, 16:01
#73
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Mikhail
Хотя есть еще идея формирование имени таблицы в зависимости от имени чертежа... но это пока идея такая.
Кажется, это лУчшая идея.

Только маленькая добавочка: имена объектов в Аксесе имеют некоторые ограничения на имена. Нельзя использовать математические знаки и не рекомендуется включать в них не латинские буквы. Чего нельзя сказать об именах допустимых Windows. Поэтому либо придется сделать парсер для поиска/замены недопустимых символов, либо пересматривать корпоративные стандарты.... Геморно?

Как один из вариантов более простого решения вижу создание дополнительной таблицы, связывающей имя чертежа с внутренним уникальным именем таблицы данных атрибутов.

Другой вариант кажется более универсальным. В дополнительной таблице каждому чертежу соответствует уникальный ID, который добавляем к записи атрибута (в самом первом варианте с одной общей таблицей). Таким образом имеем всего две таблицы: одна для имен чертежей, другая для атрибутов. Связь чертежа и атрибута через ID чертежа.
vk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Формирование отчета в Acess в виде таблице.