Home » Выгрузка данных для верстки

Выгрузка данных для верстки

Запустите в MS Access наше приложение баз данных, в главном окне базы выберите объект Модули и двойным щелчком на  модуле Main войдите в режим редактирования модуля.
Добавьте строки программного кода, чтобы готовый модуль у вас выглядел следующим образом:

Option Compare Database
Option Explicit
Public NomerRub As Double
Public NomerVip As Double
Public Function NRub() As Double
NRub = NomerRub
End Function
Public Function NVip()
NVip = NomerVip
End Function

Здесь добавленные строки выделены красным цветом. Таким образом, добавлена одна переменная NomerVip и одна функция NVip(). Переменная NomerVip — это порядковый номер вашего издания, номер выпуска. Функция NVip() нам потребуется для выборки из базы всех объявлений, которые будут публиковаться в конкретном номере.
Сохраним изменения и выйдем из редактора программного кода.

В главном окне базы данных выберем объект Запросы и двойным кликом запустим процедуру <Создание запроса в режиме конструктора>.
В окне Добавление таблицы выберем таблицу Publish и двойным кликом отправим её в окно запроса. Больше никаких таблиц нам не надо, закрываем окно Добавление таблицы (рис. 44).

Рис. 44. Создание запроса для отбора данных по объявлениям в конкретный номер

Рис. 44. Создание запроса для отбора данных по объявлениям в конкретный номер

Перетащите мышью все поля из таблицы Publish в поля запроса, как показано на рис. 45.

Рис. 45. Заполнение полей запроса

Рис. 45. Заполнение полей запроса

В поле запроса Nom впишите функцию NVip().
В полях Rub и SubRub установите сортировку по возрастанию (рис. 46).

Рис. 46. Задание сортировки

Рис. 46. Задание сортировки

Сохраните запрос с именем _Publish и закройте окно построителя запросов.

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

Перейдите в главном окне программы к объекту Формы, выделите форму Output и нажмите вверху окна кнопку Конструктор, чтобы загрузить форму в режиме Конструктора.

Выделим на форме кнопку Продолжить, нажмем правую кнопку мыши и из меню выберем Обработка событий, затем Программы. Загрузится редактор программного кода, в котором уже будут строчки Private Sub КнопкаПродолжить_Click() и End Sub

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

Private Sub КнопкаПродолжить_Click() ‘ Эта строка у вас уже есть, ее копировать не надо
Dim db As Database
Dim rs As DAO.Recordset
Dim rst As DAO.Recordset
Dim rsset As DAO.Recordset
Dim td As TableDef
Dim q As QueryDef
Dim str As String ‘ строка
Dim Rb As String
Dim SRb As String
Dim fs  ‘ для работы с файловой системой
Dim f   ‘ для работы с файловой системой

Set db = CurrentDb ‘ ссылка на текущую базу данных

‘Проверка, заполнена ли таблица со стилями Индизайна для верстки
Set td = db.TableDefs(«IndesignTagSet»)
Set rsset = td.OpenRecordset(dbOpenSnapshot)
rsset.MoveFirst
If rsset!Styles = «» Or IsNull(rsset!Styles) Then
MsgBox («Не заполнена таблица стилей Индизайна»)
Exit Sub
End If

‘Проверка: правильно ли введен номер выпуска.
‘Если в поле ничего не введено – выводим сообщение
‘и завершаем работу

If IsNull(Me!Поле0) Then
MsgBox («Не введен номер выпуска»)
Exit Sub
End If

‘ Присваиваем глобальной переменной введенный номер выпуска
NomerVip = Me![Поле0]

‘ Открываем рекордсет на основании сделанного и сохраненного ранее запроса
Set q = db.QueryDefs(«_Publish») ‘ссылка на сохраненный в базе запрос
Set rst = q.OpenRecordset ‘ открываем рекордсет
Set rs = rst.OpenRecordset

‘ Проверка на число записей в выпуске
If rs.RecordCount = 0 Then
MsgBox («В таблице публикаций нет записей с таким номером выпуска»)
Exit Sub
End If

‘ Контроль заполнения полей с рубриками и подрубриками
rs.MoveFirst
Do Until rs.EOF
If rs!Rub = «» Or IsNull(rs!Rub) Then
MsgBox («Есть незаполненное поле рубрики, продолжение невозможно»)
Exit Sub
End If
If rs!SubRub = «» Or IsNull(rs!SubRub) Then
MsgBox («Есть незаполненное поле подрубрики, продолжение невозможно»)
Exit Sub
End If
rs.MoveNext
Loop

‘Записываем в файл заголовок тэгового файла
‘ Инициализируем файловую систему
Set fs = CreateObject(«Scripting.FileSystemObject»)
‘Создаем текстовый файл для вывода информации.
‘Для простоты мы не используем стандартные диалоги
‘файловой системы, а вводим имя файла и путь прямо здесь.
‘если вам не подходят имя и путь, введите свои.

Set f = fs.CreateTextFile(«d:\ToIndesign.txt», True, True)

‘———–Запись в файл заголовка тэгового файла (стилей)———————
str = rsset!Styles & vbNewLine
f.write str

‘———– Запись в файл табличных данных —————–
rs.MoveFirst
Rb = rs!Rub
SRb = rs!SubRub
i = 0

‘ цикл по рекордсету пока не достигнем его конца
Do Until rs.EOF
If rs!Rub = Rb Then
If rs!SubRub = SRb Then
Select Case i
Case 0
str = «<ParaStyle:Rubrica>» & Rb & vbNewLine
f.write str
‘запись в файл
i = 1
rs.MovePrevious
Case 1
str = «<ParaStyle:Subrubrica>» & SRb & vbNewLine
f.write str
‘запись в файл
i = 2
rs.MovePrevious
Case 2

‘ Если публикация текстовая (в базе параметр – TypePub)
If rs!TypePub = «ТекстБ» Or rs!TypePub = «ТекстПл» Or rs!TypePub = «ТекстПлВыд» Then
str = «<ParaStyle:Text>»
If Not IsNull(rs!BText) Then
str = str & «<CharStyle:StartBold>» & rs!BText & «<CharStyle:>» & » »
End If
If Not IsNull(rs!Text) Then
str = str & rs!Text & » »
End If
If Not IsNull(rs!Tel) Then
str = str & «» & «<CharStyle:Tel>» & rs!Tel & «<CharStyle:>»
End If
str = str & vbNewLine
f.write str
Else
‘ графическая публикация (рекламный блок)
str = «<ParaStyle:Text>» & «РЕКЛАМА № » & rs!Id & «, расположение » & rs!Place & vbNewLine
f.write str
End If
End Select
Else
SRb = rs!SubRub
i = 1
rs.MovePrevious
End If
Else
Rb = rs!Rub
SRb = rs!SubRub
i = 0

rs.MovePrevious
End If
rs.MoveNext
str = «»
Loop

‘———————————————
f.Close
Set f = Nothing
Set fs = Nothing
Set rs = Nothing
Set rst = Nothing
Set db = Nothing
MsgBox («Готово! Результат в файле d:\ToIndesign.txt»)
DoCmd.Close

End Sub ‘Эта строка у вас уже есть, ее копировать не надо

Сохраняем программный код, выходим,  на этом конец нашей работе. В базу теперь можно не только вводить данные, но и делать выгрузку их для Индизайна.

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

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

<< Предыдущая страница Следующая страница >>

Скачать пример

19 Comments »

  • Olivka said:

    Очень полезная тема, хотелось бы продолжение )

  • soulexpert said:

    Поддерживаю. Хотелось бы продолжение.

  • rdomino said:

    А что насчет графических элементов? Например, в рубриках добавить либо импортированый рисунок, либо графическое оформление Индизайн. На первой страничке было сказано, что с графикой…

  • admin (author) said:

    Тэгированный текст Индизайна не позволяет вставлять графику. Но никто не мешает прописать в тэгированном файле «путь к картинке» в нужном месте и потом запустить скрипт, который эту картинку вставит на полосу. Таких скриптов уже достаточно много разработано.

  • rdomino said:

    Я только вникаю во все, но заметил, что тег. текст не позволяет этого. Нашел лишь Индиз сниппет – .idms для графических элементов в индизе. Порылся в скриптинге, там можно написать, чтобы вставляло графику и тд, вопрос в том как в том же Access прописать запуск нужного скрипта, который в свою очередь вставлял бы графику, например, в шабку рубрики? И по возможности, если вам известен какой-нибдуь уже готовый скрипт на вставку, можете подсказать)

  • admin (author) said:

    Скрипт в данной ситуации надо запускать из индизайна после того, как загружен тэгированный текст на полосы. В тегированном тексте должны быть ссылки на графику, примерно в таком виде:
    текст текст текст
    [c :\tmp\картинка1.tif]
    текст текст текст
    [c :\tmp\картинка2.tif]
    Скрипт должен найти эти строки и заменить картинками. Из разработанных для этого скриптов есть ImportTG, place-n-Fit,также ищите на нашем сайте nrvs с названием «Замена текста с маршрутом к рисунку на сам рисунок»
    В Access также можно запускать скрипт, но об этом разговор еще впереди.

  • rdomino said:

    А можно непосредственно в Индизайне в скриптах на VBA работать с БД?
    т.е. скрипт написанный на VBA открывает БД (dbf или там cvs) и работать с ней как в том же Word или Access ?

  • iv-mi said:

    Пробовал наоборот: из Aссess запускал сценарий VBA в результате которого данные базы из разных таблиц выбирались, сортировались и затем верстались в Индизайне. Из Индизайна тоже наверное можно. Только не знаю как.

  • rdomino said:

    Да Access все понятно, и тот же Word с макросом на VBA верстки и компоновки сразу, а индиз же поддерживает VBA интересно если тот же код из Word Засунуть туда где открытие базы и переработка, он будет идти на индизи вот в чем вопрос, чтобы исключить верстку в accesse и прочих сторонних прогах, а сразу в индизе в скрипте чтобы делалось.

  • iv-mi said:

    Чтобы запустить скрипт VBA из Access и иметь дело с Индизайном надо к Access подключить библиотеку функций Индизайна. Именно это я и проделывал. У меня сначала шла обработка данных базы а затем скрипт обращался к Индизайну и там выполнял верстку используя функции [не Access а] самого Индизайна.
    Если вы хотите из индизайна открывать базу, то надо библиотеки функций базы подключить к индизайновскому скрипту. Мне это делать не доводилось.

  • rdomino said:

    2 iv-mi
    Ммм, в вашем ответе открылся другой взгляд на вопрос. Значит можно в Access выполнять функции Индизайна. Это вплане тех функций скриптов? (java, vba) или в плане тех – программных кодов индизайна?) (т.е. рисование допустим объектов, создание оглавления)

    Да даже сам этот факт уже рождает кучу идей. Я сделал обработу базы в Access, а верстку через скрипт в Индизе. Получается можно это объединить сразу в Access все. Можете подсказать как?

    Хотя, есть другой путь решения, из Access через VBA прописать выполнение скрипта в Индизайне. (тоже хочу узнать как прописать запуск скрипта)

  • iv-mi said:

    Да, в Ассеss можно выполнять ф-ции индизайна, думаю и в других базах тоже. В основном это касается VBA, хотя можно извернуться и выполнить код Javascript. Для этого подключаем библиотеку индизайна к Access. И потом например на кнопочку в форме приложения баз данных вешаем программный код скрипта Индизайна. Ну там открыть индизайн, задать страницы, добавить текстовый фрейм, в нем создать таблицу, и заполнить её данными с таблицы Ассess, затем подгрузить в индизайн свой портрет и на нем поставить пять звезд. То есть получается единая среда программирования Access+Indesign. В ней можно использовать код как для Ассеss так и для индизайна, применяя любые функции обеих программ. Но только запуск задачи должен выполняться из Ассess. А чтобы из индизайна обращаться к базе и проделать то же самое, надо к индизайну (в скрипте) прицепить библиотеку ф-ций Access. Но как я говорил уже, этот вопрос не копал.
    Библиотека функций индизайна прицепляется к Access так. В редакторе программного кода Access надо выбрать пункт меню Tools, затем Reference и поставить галочку напротив пункта Adobe Indesign XX Type Librery (XX – версия индизайна).
    Выполнить один скрипт VBA из другого можно при помощи ф-ции DoScript. Это в ответ на ваш последний вопрос. На сайте Adobe выложены демонстрационные скрипты VBA и там есть пример. А можете просто скопировать ваш индизайновский скрипт в скрипт обработки Access, в конец. Должно всё работать. При условии подключения библиотеки индизайна.

  • North said:

    Здравствуйте, подскажите пожалуйста, как сортировать выгрузку объявлений по алфавиту?
    Спасибо!

  • iv-mi said:

    В данном конкретном примере сортировка производится (если правильно помню) в запросе _Publish.

    Set q = db.QueryDefs(«_Publish») ‘ссылка на сохраненный в базе запрос

    Скачайте готовый к использованию пример в конце этого материала и посмотрите этот запрос.

  • North said:

    iv-mi, спасибо за помощь, Publish посмотрю …
    Есть еще вопрос, здесь говорилось о верстке таблиц из базы, у меня газета в среднем 4000-5000 тысяч объявлений и 400-500 макетов, реально ли автоматизировать выгрузку, сейчас работаю в QuarkXPress и уходит по 4 часа на верстку – жизни и сил нет… Хочу перейти на InDesign в надежде на облегчение работы.

    Спасибо.

  • admin (author) said:

    4-5 миллионов объявлений и 4 часа верстки – это немного.

  • North said:

    Так у меня 4-5 тысяч… если бы 4-5 миллионов, – другое дело)

  • admin (author) said:

    Да, переходите на Индизайн. Но чтобы хорошо потом кататься прийдейся и саночки повозить. Вы готовы?

  • North said:

    Конечно, я макет уже потихоньку переделываю.

Leave your response!

You must be logged in to post a comment.