Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Сведение данных Access+Postgres


Автор: hildi 15.4.2009, 13:23
Спасите-помогите кто чем может, пожалуйста! 
Передо мной поставили следующую задачу:

Есть две таблицы в Postgres, в которые автоматически грузятся данные про какие-то провайдерские девайсы, назовем их BigBox (папа) и SmallBox (дитя, их подключается по несколько штук к папе) соответственно. В качестве первичных ключей в обеих таблицах используются ID девайсов. В таблице SmallBox есть еще поле с ID папы-BigBox.

Нужно завести отдельную таблицу в Access, куда будут грузиться данные о SmallBox'ах и о стоящих над ними BigBox'ах, где-то в таком виде:
SmallBox, SB ID, SB Region, SB Start Date, SB End Date, BigBox, BB ID, [Some manually filled Fields]
Primary keys из постгресовой базы в конечной таблице акксесса не фигурируют, зато фигурируют поля, которые нужно будет заполнять вручную, дополняя автоматически предоставленные данные.

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

Вот, собсно.

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

Посоветуйте, пожалуйста, с чего начать или где почитать что-нибудь умное на эту тему... У меня есть учебник про Акссесс, но что-то я там ничего подходящего не могу найти :-(

Автор: Akina 15.4.2009, 13:57
Начать надо с чтения встроенной справки. Откройте оглавление и прочтите сперва "Начало работы в Microsoft Access для пользователей, не имеющих навыков работы с базами данных", потом прочие "Начала". Учебник опять же... 

Что надо для решения конкретной задачи.
1) Иметь или установить ODBC-драйверы для доступа к Postgres
2) Создать новую БД в Аксессе
3) Связать таблицы Postgers с базой данных (Таблицы - Импорт-Связь с таблицами)
4) Создать таблицу для получения результата.
5) НаписАть запрос, который извлекает данные из связанных таблиц и помещает результат в конечную таблицу (новые - добавляет, существующие - обновляет).
6) Выполнять запрос каждый раз при изменении данных.

Добавлено через 47 секунд
Цитата(hildi @  15.4.2009,  14:23 Найти цитируемый пост)
Акссесс я вижу второй раз в жизни, да и к базам до сих пор у меня было исключительно потребительское отншнение

Это твои проблемы... но при наличии желания ты быстро преодолеешь их.

Добавлено через 2 минуты и 23 секунды
PS. Наибольшие трудности имхо вызовет п. 5. Когда первые 4 будут выполнены - милости просим. С конкретными вопросами.

Автор: hildi 15.4.2009, 14:14
Спасибо!
Первые 4 пункта уже выполнены, я как раз на пятом и застряла. У меня вообще общие знания про базы есть, но именно что общие, пользовательские такие, без навыков написания скриптов и пр.

Еще тут обнаружилось, что в качестве primary key в постгресовских таблицах выступает связка двух полей. Нужно в этих таблицах заводить отдельное поле с id, или Акссесс сам разберется? Вообще, он при связывании таблиц выделяет эти поля жирненьким...

Автор: Akina 15.4.2009, 15:23
Цитата(hildi @  15.4.2009,  15:14 Найти цитируемый пост)
обнаружилось, что в качестве primary key в постгресовских таблицах выступает связка двух полей. Нужно в этих таблицах заводить отдельное поле с id, или Акссесс сам разберется? Вообще, он при связывании таблиц выделяет эти поля жирненьким...

Ну Аксесс не полный болван, всё-таки... что можно получить по структуре, он получил. В том числе и все индексы - ведь клиентская часть подсистемы обеспечения целостности-то на нём, как-никак... потому и выделил.

Цитата(hildi @  15.4.2009,  15:14 Найти цитируемый пост)
как раз на пятом и застряла. 

Тогда теперь точные структуры таблиц (исходных, конечной) и точную постановку задачи - в студию.

Автор: hildi 15.4.2009, 15:51
Если я правильно поняла про структуры таблиц, то вот они, структуры. Projekte - конечная таблица в акссессе, public_uebk - постгресовская таблица с исходными данными о родительских BigBox'ах, public_bbk, соответственно - с данными о SmallBox'ах.
Zahl - число, значит, как оно в акссессе есть. Datum/Uhrzeit = date/time. 

Может быть, что-то еще нужно указать?

Автор: hildi 15.4.2009, 16:01
А постановка задачи следующая:

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

В общем, поля public_uebk.region и public_uebk.a_bk_netzelem_id (ID папы-девайса) связаны с public_bbk.region и public_bbk.id_uebk(поле с ID папы-девайса в таблице дитя-девайса).

Остальными связями я изобразила, какие поля исходных таблиц куда копируются.

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

Вот.

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

Автор: Akina 15.4.2009, 16:05
Цитата(hildi @  15.4.2009,  16:51 Найти цитируемый пост)
Может быть, что-то еще нужно указать?

Во-первых, по-новой связывающие поля исходных таблиц.
Во-вторых, соответствие полей исходных таблиц и конечной таблицы.

Добавлено @ 16:07
Ок, пока писАл, появился предыдущий пост.

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

Автор: hildi 15.4.2009, 16:20
По идее, там дубликатов быть не должно, т. е., каждый дитя-девайс случается в своей исходной таблице только один раз. Буде случается дубликат при опросе софтом девайсов, то данные в строке соотв. девайса просто обновляются. То же самое и с папа-девайсами.

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

Автор: Akina 15.4.2009, 16:30
Цитата(hildi @  15.4.2009,  17:20 Найти цитируемый пост)
По идее, там дубликатов быть не должно

Давайте мыслить процессом, а не моментом.
Вот вчера были получены данные и занесены в локальную таблицу. Сегодня мы получаем свежие данные, понятно, что 99% из них - дубликаты уже существующих в локальной таблице. Опять же понятно, что если есть полное совпадение всех получаемых полей - можно ничего не обновлять... а если часть полученных полей совпадает, а часть различается - что делать? обновлять? создавать новую запись? скорее всего в зависимости от того, какие именно поля различаются - тогда список полей уникальных (завести новую запись) и неуникальных (обновить)...

Добавлено через 9 минут и 20 секунд
И вот что... руками всё это набирать лень... Вот код:
Код

Option Compare Database
Option Explicit

Sub SaveTableStructures()
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim idx As DAO.index
Dim ff As Long

ff = FreeFile
Open "\structure.txt" For Output As #ff
Set dbs = CurrentDb
For Each tdf In dbs.TableDefs
    If Left(tdf.Name, 4) <> "MSys" Then
        Print #ff, "TableName="; tdf.Name
        Print #ff,
        For Each fld In tdf.Fields
            Print #ff, "  FieldName="; fld.Name
            Print #ff, "  FieldType="; fld.Type
            Print #ff, "  FieldSize="; fld.Size
            If fld.DefaultValue <> "" Then Print #ff, "  FieldDefaultValue="; fld.DefaultValue
            Print #ff, "  FieldAllowZeroLength="; fld.AllowZeroLength
            Print #ff, "  FieldRequired="; fld.Required
            If fld.ValidationRule <> "" Then Print #ff, "  FieldValidationRule="; fld.ValidationRule
            If fld.ValidationText <> "" Then Print #ff, "  FieldValidationText="; fld.ValidationText
            Print #ff,
        Next
        For Each idx In tdf.Indexes
            Print #ff, "    IndexName="; idx.Name
            Print #ff, "    IndexUnique="; idx.Unique
            Print #ff, "    IndexPrimary="; idx.Primary
            Print #ff, "    IndexRequired="; idx.Required
            Print #ff, "    IndexIgnoreNulls="; idx.IgnoreNulls
            Print #ff, "    IndexClustered="; idx.Clustered
            Print #ff, "    IndexDistinctCount="; idx.DistinctCount
            Print #ff, "    IndexForeign="; idx.Foreign
            For Each fld In idx.Fields
                Print #ff, "      IndexField="; fld.Name
            Next
            Print #ff,
        Next
    End If
Next
Close #ff
End Sub

Откройте свою БД. Перейдите на вкладку "Модули". Выберите "Создать модуль". Проверьте что в меню Tools-References есть галка на "Microsoft DAO 3.6 Object Library", если нет - поставьте. Сотрите всё, что в окне текста модуля появится. Скопируйте туда этот код. Сохраните модуль (File-Save). Поставьте курсор в строку "Sub SaveTableStructures()". Выберите Run - Run Sub/Userform. По завершении работы (1-2 сек) закройте базу (при следующем запуске модуль можно будет удалить). Заархивируйте созданный в корне диска файл structure.txt и приложите к сообщению.

Автор: hildi 15.4.2009, 16:41
Ага, понимаю.

В любом случае, связки полей public_uebk.region и public_uebk.a_bk_netzelem_id (ID папы-девайса) и public_bbk.region и public_bbk.a_bk_netzelem_id (дитя) остаются уникальными и неизменными. Если дитя отключается или превращается в папу, то оно удаляется из исходной таблицы, и, в случае превращения в папу, появляется в таблице пап со своей уникальной идентификационной связкой.
В этом случае дитя должно быть удалено и из конечной таблицы.
Остальные данные могут изменяться.

Получается, надо добавить в конечную таблицу поле для однозначной идентификации дитя-девайсов по связке public_bbk.region и public_bbk.a_bk_netzelem_id?

Автор: Akina 15.4.2009, 16:50
Цитата(hildi @  15.4.2009,  17:41 Найти цитируемый пост)
Получается, надо добавить в конечную таблицу поле для однозначной идентификации дитя-девайсов по связке public_bbk.region и public_bbk.a_bk_netzelem_id? 

Нет, это должно проверяться в запросе. Вернее, запросах - потому как запросы на добавление, обновление и удаление - это три разных выполняющихся один за другим запроса.

Автор: hildi 15.4.2009, 17:00
Спасибо smile
Вот, собсно. 
Какой жуткий язык этот VBA, ни фига не понятно :-/

Автор: hildi 17.4.2009, 12:26
Фиг с ней уже, с актуализацией, мне бы хоть данные в базу просто запихнуть, там мало изменений происходит, в крайнем случае, их можно и руками обновлять...

Скажите мне ключевое слово, пожалста, про что погуглить в такой ситуации... А то я в растерянности полной.

Автор: bopoha 17.4.2009, 14:08
hildi, а что вы хотите сделать?

Попробуйте следующие:
1. Создайте копии таблиц, как на сервере.
2. Мастером создайте формы для каждой таблицы. Может у вас поятвятся идеи. 

Автор: hildi 17.4.2009, 14:30
Я хочу перенести данные из двух связанных постгресовских таблиц в одну акссесовскую (задача минимум).
А зачем таблицы копировать? Мастером можно формы и так ведь создать к ним... Ни фига не понимаю. Хоть намекните smile

Пытаюсь пока к таблицам через  VBA достучаться, но учебник читается мееедленно, синтаксис совсем неочевидный :-(

Пример из учебника вываливает ошибку 424 object required...

Код


Private Sub NeuerSatz_Click()

    Dim rs As New ADODB.Recordset
    
    rs.Open "projekte", CurrentProjekt.Connection
    
    MsgBox (rs![ubk])

    
End Sub



Автор: bopoha 17.4.2009, 15:51
1. В какой строчке?
2. Где вы таблицу хотите открыть? Если на сервере, то нужно создавать соединение. Если локальную, то рекомендую использовать DAO.
Код

Dim rst As DAO.Recordset

Set rst = CurrentDb.OpenRecordset("...", dbOpenDynaSet)

if Not rst.EOF Then
    msgbox rst("...")
End if 

rst.Close



Цитата(hildi @  17.4.2009,  14:30 Найти цитируемый пост)
Я хочу перенести данные из двух связанных постгресовских таблиц в одну акссесовскую (задача минимум).

Открываем вкладку с запросами. Создаем хранимый запрос. Тип - на добавление. Выбираем связзаные таблицы в качестве источника данных. Добавляем поля. Ну и т.д. Думаю разберетесь. Сохраняете.
Код

CurrentDb.Execute "имя_запроса"


Цитата(hildi @  17.4.2009,  14:30 Найти цитируемый пост)
А зачем таблицы копировать? Мастером можно формы и так ведь создать к ним... Ни фига не понимаю. Хоть намекните

Я просто до сих пор не понимаю, что вы хотите сделать.

Все же рекомендую книжку сперва прочитать. Пускай и 400-500 страниц. Но лучше 2-а дня потерять и за час долететь.

Автор: hildi 17.4.2009, 16:42
Там на первой странице все подробно вполне написано, что мне было нужно. Akina вон вроде понял, только ему, видно, надоело со мной возиться smile А вы не понимаете, зато советы исправно даете. Как бы вас того, скомпоновать? smile

Да я уже и написала скриптик, который копирует данные из таблицы в таблицу. Хранимым запросом я пробовала, но что-то у меня там не срослось. Существующие данные менялись, а новые не добавлялись. Ну да все равно уже.

Было бы у меня два дня, я бы их с удовольситвием потеряла, но у меня их нет - задание два дня назад принесли с формулировкой "нарисовать формочку", и я его взяла, наивная. Срок, как всегда - позавчера, а я сегодня в отпуск ухожу навсегда надолго.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)