Просмотр полной версии : 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 использовал?
Да, использовал. Вроде бы соединиться через .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?
Извеняюсь за ошибку зто .mdb
С "view" разобрался... обновляются. Теперь у меня вопрос по SQL: мне надо обновлять "view" который содержит данные из 3 таблиц (клиент,адрес,страна). Все они связаны. Я создал правило (rule) для обновления, но при обновлинии инфо о клиенте мне надо добавить адрес в таблицу "адрес" только в том случае если он не существует (в таблице), а если существует то просто обновить ссылку на адрес в таблице "клиент". можно ли такое это реализовать?
Hubbitus
17.12.2008, 15:57
Если вьюха редактируема (editable) то можно просто в нее делать вставку, он сам разберется с ключами и внешними связями, которые прописаны. Ну если нет -то нет, реализовывайте логику в приложении, вставляйте что надо в нужные таблицы.
Она редактируема и я могу обновлять имя, телефон клиента, но насколко я знаю она не может проверять существует ли вставляемое значение в таблице или нет. И вот мне надо что бы она перед тем как вставить сделала проверку. Как я полагаю нужен 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 строк? Вы не хотите разве все их обработать, только одну?
"правило на 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 =...
отрабатывает единожда или для каждой строки? Вот в чем вопрос-то.
vBulletin® v3.8.5, Copyright ©2000-2024, Jelsoft Enterprises Ltd.