IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Access front-end + Postgres back-end... kak? (http://www.imho.ws/showthread.php?t=137039)

7enych 15.12.2008 17:20

Access front-end + Postgres back-end... kak?
 
Мне надо сделать не большую программу (клиенты,продукты, заказы и тд.) и она должна быть написанна в 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/tuto...ith-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

Цитата:

Сообщение от 7enych (Сообщение 1617125)
просто хотелось бы спрятать все проверки в базу данных а не коде реализовывать.

Очень правильное решение, бесспорно.


Цитата:

Сообщение от 7enych (Сообщение 1617125)
вот "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

Цитата:

Сообщение от 7enych (Сообщение 1617264)
это "rule", оно относится к "view".

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


Цитата:

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

Сделайте 2 запроса - первым проверьте, выберите ID, а вторым, если не выбралось, вставьте.

Цитата:

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

Да что он все апдейтит это понятно, запрос из триггера:
Код:

UPDATE client SET id_cli = new.id_cli, name = new.name, phone =...
отрабатывает единожда или для каждой строки? Вот в чем вопрос-то.


Часовой пояс GMT +4, время: 13:12.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.