PDA

Просмотр полной версии : Access front-end + Postgres back-end... kak?


7enych
15.12.2008, 17:20
Мне надо сделать не большую программу (клиенты,продукты, заказы и тд.) и она должна быть написанна в Access + Postgres база данных. В Access все должно быть в VBA (без макро). С VBA дел не имел, но формы,кнопки разные создавать вроде научился, БД настроил, но есть еще пара вопросов:

1.Как соединиться с Postgres используя *.adp пройект? (могу соединиться через *.mdp проект, но при создании adp не вижу сервера в списке)

2.Можно ли получить созданные представления (views) из postgres в Accesse? (при создании *.mdp проекта вижу только таблицы)

P.S. Пользую Access 2003, Postgres 8.3 и все на WinXP SP2. инет облазил толком ничего не нашел.

Заранее спасибо.

EvroStandart
16.12.2008, 11:41
ODBC использовал?

7enych
16.12.2008, 15:56
Да, использовал. Вроде бы соединиться через .mdp проект и получить "views" тоже удалось, наверно тогда в .mdp и продолжу... Только опять возник вопрос, как сделать "views" прямыми (direct), что бы при обновлении в таблице они автоматически обновляли свои данные тоже, а то данные в таблице меняю, а "view" старые показывает. И еще... как получить данные из таблиц в VBA? я использую Dlookup() для одного значения(правильно?), а если надо получить коллекцию данных из таблицы? И как по ней перемещатся? подскажите кто знает.

EvroStandart
17.12.2008, 15:08
ODBC должен вьюшки обновлять. Я правда только оракл пробовал.

Из VBA нужно делать Connection и Recordset.
http://www.everythingaccess.com/tutorials.asp?ID=VBA-Traps%3A-Working-with-Recordsets


ЗЫ.
.mdp - это вообще что? Може всётаки mdb?

7enych
17.12.2008, 15:48
Извеняюсь за ошибку зто .mdb
С "view" разобрался... обновляются. Теперь у меня вопрос по SQL: мне надо обновлять "view" который содержит данные из 3 таблиц (клиент,адрес,страна). Все они связаны. Я создал правило (rule) для обновления, но при обновлинии инфо о клиенте мне надо добавить адрес в таблицу "адрес" только в том случае если он не существует (в таблице), а если существует то просто обновить ссылку на адрес в таблице "клиент". можно ли такое это реализовать?

Hubbitus
17.12.2008, 15:57
Если вьюха редактируема (editable) то можно просто в нее делать вставку, он сам разберется с ключами и внешними связями, которые прописаны. Ну если нет -то нет, реализовывайте логику в приложении, вставляйте что надо в нужные таблицы.

7enych
17.12.2008, 16:22
Она редактируема и я могу обновлять имя, телефон клиента, но насколко я знаю она не может проверять существует ли вставляемое значение в таблице или нет. И вот мне надо что бы она перед тем как вставить сделала проверку. Как я полагаю нужен INSERT с условием.

вот "view" и правило на UPDATE :

CREATE OR REPLACE VIEW view_client AS
SELECT client.id_cli, client.name, client.phone, addresse.id_adr, adresse.str_adr, adresse.postc_adr, adresse.loc_adr, country.name_countr
FROM client
NATURAL JOIN addresse
NATURAL JOIN country;

CREATE OR REPLACE RULE "_UPDATE" AS
ON UPDATE TO view_client DO INSTEAD
//вот здесь проверка если новый адрес, добавить и вернуть ID, если уже такой имеется просто вернуть ID
UPDATE client SET id_cli = new.id_cli, name = new.name, phone = new.phone, id_adr = *тут id_adr полученный из предыдущего запроса*
WHERE client.id_cli = new.id_cli;

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

Hubbitus
17.12.2008, 16:42
просто хотелось бы спрятать все проверки в базу данных а не коде реализовывать.
Очень правильное решение, бесспорно.


вот "view" и правило на UPDATE :
"правило на UPDATE" это триггер чтоли?

Ну и если так, то действительно, там где у Вас комментарий проверить и вернуть новый ИД, там и сделайте проверку. Вроде все стройно выходит. Вопрос-то в чём именно?

А, и еще, там в триггере, вы используете просто new.*, а если за раз будет апдейтится сразу 100 строк? Вы не хотите разве все их обработать, только одну?

7enych
17.12.2008, 21:49
"правило на UPDATE" это триггер чтоли?

это "rule", оно относится к "view".

Вопрос-то в чём именно?

Вопрос такой: как выглядит такой запрос? Так как у меня условие либо делать INSERT(если адрес новый) либо SELECT(если адрес уже существует в таблице), а насколько я знаю IF в запрос не поставишь.


А, и еще, там в триггере, вы используете просто new.*, а если за раз будет апдейтится сразу 100 строк? Вы не хотите разве все их обработать, только одну?

Да вроде проблем не должно быть, по крайней мере запрос "UPDATE view_client SET phone='1234567';" проходит и апдейтит все поля всех клиентов сразу.

Hubbitus
18.12.2008, 06:03
это "rule", оно относится к "view".
http://msdn.microsoft.com/ru-ru/library/ms188064.aspx ? Так оно же вроде только для ограничений данных столбца написано...


Вопрос такой: как выглядит такой запрос? Так как у меня условие либо делать INSERT(если адрес новый) либо SELECT(если адрес уже существует в таблице), а насколько я знаю IF в запрос не поставишь.
Сделайте 2 запроса - первым проверьте, выберите ID, а вторым, если не выбралось, вставьте.

Да вроде проблем не должно быть, по крайней мере запрос "UPDATE view_client SET phone='1234567';" проходит и апдейтит все поля всех клиентов сразу.
Да что он все апдейтит это понятно, запрос из триггера:
UPDATE client SET id_cli = new.id_cli, name = new.name, phone =...
отрабатывает единожда или для каждой строки? Вот в чем вопрос-то.