Тема: Базы данных. Создание связи между таблицами.

Привет.
Есть БД созданная в Accesse.
Мне нужно програмно создать таблицу. И задать связь ее с другой таблицей в этой базе.
Делаю через ADOX.
Создал таблицу.
Задал составной ключ из полей Name+Obozn.
Теперь нужно связать поле Obozn новой таблицы c таблицей Альбомы.Obozn.

...
Dim objKey As ADOX.key
...
Dim objKey As New ADOX.key
   objKey.Name = "Составной"
   objKey.Columns.Append "Name"
   objKey.Columns.Append "Obozn"
   objKey.Type = adKeyPrimary
   objKey.UpdateRule = adRICascade
   objKey.DeleteRule = adRICascade
   [b]'задаю связь Альбомы.Obozn = Имя_узлы.Obozn
   objKey.RelatedTable = "Альбомы"
   objKey.Columns.Item("Obozn").RelatedColumn = "Obozn"[/b]
   'добавляю ключ в таблицу
   objTable.Keys.Append objKey
   'добавляю таблицу в базу dbNodes
   objCatalog.Tables.Append objTable
   ...

Вот какрас жирненьким выделил место, где я предпологал будет задана связь. А фиг.
Таблица создается, все нормально, составной ключ тоже, но связи нет.
Соединение через: "Provider=Microsoft.Jet.OLEDB.4.0;"

Re: Базы данных. Создание связи между таблицами.

Напишу значения у Cataloga (objCatalog)
ActiveConnection:

 Attributes = 0
CommandTimeout = 30
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=\\Sgpsrv2\СПД\Конструкторы\Макросы\BaseNodes\dbNodes.mdb;[b]Mode=Share Deny None[/b];Extended Properties=""
ConnectionTimeout = 15
[b]CursorLocation = adUseServer[/b]
[b]IsolationLevel = adXactReadCommitted[/b]
[b]Mode = adModeShareDenyNone[/b]
Provider = "Microsoft.Jet.OLEDB.4.0"
State = 1
Version = "2.8"

Что-то мне жирьненькие не нравятся.
Так.
CursorLocation надо задать adUseClient
Mode - adModeWrite
Щас попробую.

Re: Базы данных. Создание связи между таблицами.

Не выходит. :(

Re: Базы данных. Создание связи между таблицами.

Все разобрался.
Нужно отдельный ключ под это дело создавать.

Re: Базы данных. Создание связи между таблицами.

Vildar, разберешься - объяснишь? В плане показать работающей код?

Re: Базы данных. Создание связи между таблицами.

Вообще интересно более подробно, где применяешь и в какой области (сама по себе задача).

Re: Базы данных. Создание связи между таблицами.

Алекс, конкретно эту проблему решил так:

'задаем связь Альбомы.Obozn[1]=[m]Узлы.Obozn
'где Альбомы.Obozn ключевое поле (primary key)
   Set objKey = New ADOX.key
   objKey.Name = "Связь"
   objKey.Type = adKeyForeign
   objKey.UpdateRule = adRICascade
   objKey.DeleteRule = adRICascade
   'таблица первичного ключа
   objKey.RelatedTable = "Альбомы"
   Set objColumn = New ADOX.Column
   'поле вторичного ключа
   objColumn.Name = "Obozn"
   'поле первичного ключа
   objColumn.RelatedColumn = "Obozn"
   objKey.Columns.Append objColumn
   objTable.Keys.Append objKey
   'objTable - таблица вторичного ключа

А вообще это прога - каталог(база) узлов.
Узлы - это соединения панелей. Узлы состоят из соединительных деталей (металич.изделия).
Даже не знаю как ее всю описать.
Короче она нужна для составления спецификаций.
Давай адресок, скину. В архиве всего 272 килобайта, вместе с базой :D

Re: Базы данных. Создание связи между таблицами.

То есть: имеется скажем, монтажный план стен (либо плит перекрытий), каждый стык панелей /плит/ выполняется по определенному узлу (с номером и ссылкой на лист/альбом), с определенным количеством соединительных элементов. В базе хранятся данные по номерам узлов/кол-ву деталей на узел; программа должна считывать с чертежа / подсчитывать кол. узлов и на основании этого стоить спецификацию. Я угадал?
Я когда-то нечто подобное пытался сделать, но до ума не довел. Ну и с Access не связывался, вся база в txt была.

Re: Базы данных. Создание связи между таблицами.

> AlexV
Ну ты монстр.
Я с таким трудом пытался описать ее тебе, а делать этого и не стоило оказывается :D
Мне аж страшно.
Опять же, скажи что еще ты делал. Мне, видать, от этого тоже не уйти :D

Re: Базы данных. Создание связи между таблицами.

Я так понимаю, сфера деятельности у нас кое-в чем пересекается... Вобщем, была (в принципе, и осуществилась кое в чем) такая загодумка (облегчающая проектирование конструктива проектов панельных жилых домов определенной серии). На все типы ЖБИ имеются типовые альбомы (плиты пер-я/наружка/внутрянка и т.д.), + часть марок привязана к конкретным проектам. Я на все эти изделия создал базу данных (ну, это громко сказано, txt, но тем не менее - основная инфа обо всех изделиях - марка/габариты/масса/обозначение/привязка к проекту/ну и т.д., для разных типов изделий информация разная; есть возможность программно добавлять-менять инф.). Ну и гостовские изделия тоже включил - ФБС, ФЛ-ки. При запуске программы все архивы грузятся, появляется форма. В одном комбобоксе - переключение по типам изделий. Блин, описывать сложно, на dwg.ru хоть рисунок можно прикрепить...Короче, с помощью программы можно отсортировать список нужных изделий - к примеру, плиты пер. L=...b=...с наличием отв. под вентблок - получим список всех марок, удовлетворяющих условиям поиска.

Re: Базы данных. Создание связи между таблицами.

Ну и каждую марку можно вставить в чертеж в виде 2d блока. Описания части блоков хранятся в спец. файле, ну а те что попроще - создаются программно по данным из архива (та же внутрянка). Кое-какие имеются команды для облегчения работы с блоками (вставлять можно с заранее заданным углом или указывать при вставке, блок висит на курсоре (sendcommand); есть функция - вставить по существующему блоку (щелкнул по блоку - следующий вставился с той стороны, по которой щелкнул, через заданное расстояние. Расстояние задается в одном из textbox.Довольно удобно - к примеру, наружные панели через 20 мм выбрал следующую марку и одним щелчком поставил)

Re: Базы данных. Создание связи между таблицами.

Все изделия в зависимости от типа вставляются на опр. слой, соответствие слоя типу задается в настройках.
Еще имеется функция для того, что бы зеркалить (бывает нужно создать зеркальную секцию) - ничего особенного, просто зеркало, только дополнительно все марки изделий автоматом меняются на зеркальную (если же такой нет - выделяются, что бы можно было легко заметить). Еще есть функция для прорисовки гб перегородки нужной толщины (b задается пользователем, рисуется полилинией со штриховкой). Да, есть небольшая утилитка по расстановке осей.
Ну, и "апофегеем" - создание спецификации. Вводится кол-во этажей, затем попеременно рамкой выбираются монтажные планы (фундамент-цоколь-1-типовой-последний этажи-чердак-кровля), ведется подсчет блоков (при опр. настройках - объектов Text тоже, для обработки старых чертежей). Ну и строится в Excel табличка. В подсчет включается объем газобетона (если перегородки прорисованы через программу). А по узлам и соединительным элементам - так я и не доработал.

Re: Базы данных. Создание связи между таблицами.

Еще в планах было - создание 3d модели по существующим планам. Ничего такого сложного, просто база 3d моделей ЖБИ накоплена значительная, ну и суть - прошлись по файлу, запомнили имена блоков с точками вставки, создали новый файл, ну и вставили Xrefы  точки нужной марки, получили этаж в 3d. Но до ума тоже не довел, да и не всех марок 3d в наличии есть.

Re: Базы данных. Создание связи между таблицами.

> AlexV
Ядрён-батон, как сложно-то а.
Нет я базу на жб изделия не делал еще.
У нас они сделаны блоками с атрибутами.
Есть сами схемы блоков (т.е. сама геометрия блоков,), библиотека файлов этих блоков, для вставки в чертежи монтажек. Ну и сами чертежи жб.изделий
Я только спеку жб.изделий(блоков) считаю.
А спец-цию стали в альбомах жб.изделий (по типам наружки и т.п.) пока щитают в екселе. Но альбомы составлены и пощитаны до монго прихода. А теперь в новых домах только ссылаются на те альбомы, новых изделий очень мало. Поэтому автоматизация этого процесса не так важна.
Так, о чем это мы :D
Слушай, а по шрифтам у тебя есть что нибудь. Что-то типа вставки спец символов.
Я так понимаю, нужно использовать шрифт shx в котором будут нужные спецсимволы. Я полный 0 в этом. Щас читаю у "Aka PG" на куличках, про шрифты, и ничерта не понимаю.

Re: Базы данных. Создание связи между таблицами.

> Vildar
Извини отвлекся. У нас тут сабантуй был.
Слушай, есть предложене перенести дебаты в личку dwg. Правда там тоже картинкки нельзя цеплять. Ну что-нить придумаем. Через шараманию можно. Я тебе скину пример файла монтажки. У нас есть свои особенности в них. Ок?

Re: Базы данных. Создание связи между таблицами.

O'k! В принципе, ящик есть в нике, можно через mail. По шрифтам - не занимался я этим делом.

Re: Базы данных. Создание связи между таблицами.

Написал письмо на мыло, из здешнего твоего ника.
Жду ответа с подтверждением личности :D

Re: Базы данных. Создание связи между таблицами.

Вижу что не потеме уже, но создавать таблицы и связи лучше сразу используя SQL.

Dim objKey As New ADOX.key
   objKey.Name = "Составной"
   objKey.Columns.Append "Name"
   objKey.Columns.Append "Obozn"
...

слишком много лишних телодвижений.
Все это можно свести к примеру
DB.Execute("ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY ... ")

Re: Базы данных. Создание связи между таблицами.

> SmeL
А параметры ключа тоже можно в этом запросе задавать? А связь между таблицами?
Надо попробовать.

Re: Базы данных. Создание связи между таблицами.

Через SQL можно. Как не крути весь код что был выше все равно по идеи должен превратиться SQL запросы. Вот примерчик создания таблицы и навешиванием тригера pos_row_lastupdate(), который задает автоматически значение времени последнего update.

CREATE TABLE pos_ecr_config (
  ecr_id      integer NOT NULL,
  param_id    integer NOT NULL,
  val         text NOT NULL,
  lastupdate  timestamp WITHOUT TIME ZONE,
   CONSTRAINT pos_ecr_config_pkey
    PRIMARY KEY (val, ecr_id, param_id)
)
CREATE TRIGGER last_update
  BEFORE UPDATE
  ON pos_ecr_config
  FOR EACH ROW
  EXECUTE PROCEDURE pos_row_lastupdate();

Два раза сделать Execute и готово.

А связь между таблицами?

А Вы что связывали таблицы тоже таким же способом как и создавали ключи?
вот связь 2 таблиц

sql="SELECT ps.id
     , ps.sess_id
     , ps.status
     , ps.keys_id
     , ps.siv
     , ps.skey
     , ps.modem_id
     , ps.tan
     , pr.rsa_pri
       FROM pos_sessions    AS ps
 INNER JOIN pos_rsa_keys    AS pr
    ON ps.keys_id    = pr.id
      WHERE ps.sess_id    = ?";

Не городите пока огороды, прочтите про SQL.

Re: Базы данных. Создание связи между таблицами.

> SmeL
Если б ты еще намекнул, что плохого в использовании ADOX для этого(создания связи между таблицами).
А вот в "PRIMARY KEY (val, ecr_id, param_id)", в том же коде, ведь нельзя задать каскадное удаление связанных записей?
Ну да, мне нужно разбираться с запросами SQL. Первый источник это F1 в Access'е. Нормальный источник?
зы Под созданием связи между таблицами я подразумеваю то что у Вас после CONSTRAINT прописано(в первом приведенном коде, пред.поста).
А в select(второй код, пред.поста), создается объединенная таблица (запрос) из двух, по заданной связи. Ессно такие "дела" я тоже делаю запросом Select, через ADO.Recorset.

Re: Базы данных. Создание связи между таблицами.

ADOX не использовал, но по вашему коду увидел что слишком много писанины требует ADOX.

create table tree(
id serial primary key,
fk_parent int,
spr text unique not null,
descr text,
constraint parent_fkey foreign key(fk_parent) references tree on update cascade on delete cascade
);

Попробуйте что то подобное, access-а нет подрукой

Re: Базы данных. Создание связи между таблицами.

> SmeL
Да, все правильно. В Accesse также (в справке усе есть оказывается :().
Надо будет переделать.
Спасибо за наводку.