| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 из постгресовой базы в конечной таблице акксесса не фигурируют, зато фигурируют поля, которые нужно будет заполнять вручную, дополняя автоматически предоставленные данные. Иногда эти автоматические данные будут обновляться - какой-то из боксов может отключиться или переехать. Вот, собсно. Основная проблема в ДНК в том, что Акссесс я вижу второй раз в жизни, да и к базам до сих пор у меня было исключительно потребительское отншнение, так что совершенно не представляю, с чего начать... В голову приходит только связать имеющиеся таблицы запросом, но полученные данные надо как-то хранить... Посоветуйте, пожалуйста, с чего начать или где почитать что-нибудь умное на эту тему... У меня есть учебник про Акссесс, но что-то я там ничего подходящего не могу найти :-( |
| Автор: hildi 15.4.2009, 14:14 |
| Спасибо! Первые 4 пункта уже выполнены, я как раз на пятом и застряла. У меня вообще общие знания про базы есть, но именно что общие, пользовательские такие, без навыков написания скриптов и пр. Еще тут обнаружилось, что в качестве primary key в постгресовских таблицах выступает связка двух полей. Нужно в этих таблицах заводить отдельное поле с id, или Акссесс сам разберется? Вообще, он при связывании таблиц выделяет эти поля жирненьким... |
| Автор: Akina 15.4.2009, 15:23 | ||
Ну Аксесс не полный болван, всё-таки... что можно получить по структуре, он получил. В том числе и все индексы - ведь клиентская часть подсистемы обеспечения целостности-то на нём, как-никак... потому и выделил. Тогда теперь точные структуры таблиц (исходных, конечной) и точную постановку задачи - в студию. |
| Автор: 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 папы-девайса в таблице дитя-девайса). Остальными связями я изобразила, какие поля исходных таблиц куда копируются. Синим выделены поля в конечной таблице должны впоследствии заполняться вручную. Вот. Может быть, вы насыплете мне хороших ключевых слов по теме на каком-нить человеческом языке, особенно русском? А то я даже погуглить по-человечески не могу, а немецких учебников в сети нет, копирайты, блин. Моя благодарность и так уже предельно безгранична, а будет вообще того. Несопоставима с реальностью |
| Автор: Akina 15.4.2009, 16:05 |
Во-первых, по-новой связывающие поля исходных таблиц. Во-вторых, соответствие полей исходных таблиц и конечной таблицы. Добавлено @ 16:07 Ок, пока писАл, появился предыдущий пост. Теперь рассказывайте, что при обновлении делать с дубликатами а) полными б) частичными. |
| Автор: hildi 15.4.2009, 16:20 |
| По идее, там дубликатов быть не должно, т. е., каждый дитя-девайс случается в своей исходной таблице только один раз. Буде случается дубликат при опросе софтом девайсов, то данные в строке соотв. девайса просто обновляются. То же самое и с папа-девайсами. Так что и в конечной таблице данные в соотв. стобцах должны просто обновляться, там же еще поля для ручного заполнения, их содержимое относительно автоматически пополняемых данных надо сохранить в любом случае. |
| Автор: Akina 15.4.2009, 16:30 | ||
Давайте мыслить процессом, а не моментом. Вот вчера были получены данные и занесены в локальную таблицу. Сегодня мы получаем свежие данные, понятно, что 99% из них - дубликаты уже существующих в локальной таблице. Опять же понятно, что если есть полное совпадение всех получаемых полей - можно ничего не обновлять... а если часть полученных полей совпадает, а часть различается - что делать? обновлять? создавать новую запись? скорее всего в зависимости от того, какие именно поля различаются - тогда список полей уникальных (завести новую запись) и неуникальных (обновить)... Добавлено через 9 минут и 20 секунд И вот что... руками всё это набирать лень... Вот код:
Откройте свою БД. Перейдите на вкладку "Модули". Выберите "Создать модуль". Проверьте что в меню 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:00 |
| Спасибо Вот, собсно. Какой жуткий язык этот VBA, ни фига не понятно :-/ |
| Автор: hildi 17.4.2009, 12:26 |
| Фиг с ней уже, с актуализацией, мне бы хоть данные в базу просто запихнуть, там мало изменений происходит, в крайнем случае, их можно и руками обновлять... Скажите мне ключевое слово, пожалста, про что погуглить в такой ситуации... А то я в растерянности полной. |
| Автор: bopoha 17.4.2009, 14:08 |
| hildi, а что вы хотите сделать? Попробуйте следующие: 1. Создайте копии таблиц, как на сервере. 2. Мастером создайте формы для каждой таблицы. Может у вас поятвятся идеи. |
| Автор: hildi 17.4.2009, 14:30 | ||
| Я хочу перенести данные из двух связанных постгресовских таблиц в одну акссесовскую (задача минимум). А зачем таблицы копировать? Мастером можно формы и так ведь создать к ним... Ни фига не понимаю. Хоть намекните Пытаюсь пока к таблицам через VBA достучаться, но учебник читается мееедленно, синтаксис совсем неочевидный :-( Пример из учебника вываливает ошибку 424 object required...
|
| Автор: bopoha 17.4.2009, 15:51 | ||||||||
| 1. В какой строчке? 2. Где вы таблицу хотите открыть? Если на сервере, то нужно создавать соединение. Если локальную, то рекомендую использовать DAO.
Открываем вкладку с запросами. Создаем хранимый запрос. Тип - на добавление. Выбираем связзаные таблицы в качестве источника данных. Добавляем поля. Ну и т.д. Думаю разберетесь. Сохраняете.
Я просто до сих пор не понимаю, что вы хотите сделать. Все же рекомендую книжку сперва прочитать. Пускай и 400-500 страниц. Но лучше 2-а дня потерять и за час долететь. |
| Автор: hildi 17.4.2009, 16:42 |
| Там на первой странице все подробно вполне написано, что мне было нужно. Akina вон вроде понял, только ему, видно, надоело со мной возиться Да я уже и написала скриптик, который копирует данные из таблицы в таблицу. Хранимым запросом я пробовала, но что-то у меня там не срослось. Существующие данные менялись, а новые не добавлялись. Ну да все равно уже. Было бы у меня два дня, я бы их с удовольситвием потеряла, но у меня их нет - задание два дня назад принесли с формулировкой "нарисовать формочку", и я его взяла, наивная. Срок, как всегда - позавчера, а я сегодня в отпуск ухожу навсегда надолго. |