На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Работа со связаными таблицами , Как лучше всего организовать сабж
    Я делаю прогу с БД. Структуру БД делал в Access. Для доступа к БД использую ADO. Там есть связаные таблицы. К примеру их 3. Я их связывал программно. Сделал три отдельных цепочки ADODataSet->ADODataSource->DBGrid. Что бы реализовать связь я отображаю одну таблицу и обрабатываю событие onDataChange для DataSource связаного с этим гридом. В этом обработчике опререляю выбранную запись и для этой записи делаю SQL запрос "SELECT" что-бы отобразить соответствующие записи из второй таблицы. Такое же событие я обрабатываю и во второй таблице. Вот такая связь ручками :) . Нет ли в Дельфи какого нииь автоматизированного способа? Ведь мне придется и удалять элементы из двух первых таблиц и в связи с этим удалять связаные с ними элементы в третьей. Мне идти по моему ручному пути? Или есть что-то изящнее?

    Добавлено
    Ну а пока я иду по своему ручному пути. И реальные ошибки выскакивают. В таблице № 2 я при удалении элемента удаляю соответствующие элементы из Таблицы № 3 . Делаю я это так:

    ExpandedWrap disabled
      if(MessageBox(0,'Удалять связаные элементы?'
      ,'Удаление',MB_YESNO or MB_ICONQUESTION)=IDYES) then
      begin
      ADODataSetLL.Active:=false;
      ADODataSetLL.CommandText:='DELETE * FROM TableLineLow WHERE Name="'+sTSnum+
          '" AND NumKSO='+IntToStr(iCurBoxLV)+' AND NumKS='+IntToStr(iCurKS);
          ShowMessage(ADODataSetLL.CommandText);
       
      ADODataSetLL.Open;
      end;

    Но выскакивае ошибка исполнения:
    Цитата
    Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции.

    Не пойму какие еще несколько наборов?! Я просто хочу удалить записи. Что я неправильно делаю?
      Для исполнение команды DELETE лучше использовать:
      ADODataSetLL.ExecSQL;

      Удалять из связанных таблиц, лично я так делаю, нужно ручками, а вот связь делается следующим образом:
      Пусть в базе есть две таблицы (AdoTable1, DataSource1, ADOTable2, DataSource2). Нужно первую связать со второй, причем первая главная. У второй таблици даблклик на свойство MasterFields, там выбираешь в первом списке служебное поле второй таблицы для свящи с первой, во втором списке выбираешь поле в первом таблице, от которого зависит, что будет видно во второй и жмешь Add. Потом еще нужно поменять свойство MasterSource у второй таблицы, выбрав в нем первый сурс.
        отображение данных в подчиненном датасорсе можно сделать так, как сказал бигмак
        а удаление я бы реализовал в самой базе акцесс, выставив там свойство "Каскадное удаление" у связи между таблицами.
          А связь ведь делается программно, в Access'е только сами таблицы. Или я что-то не так понял?
            Цитата DDX @
            выставив там свойство "Каскадное удаление" у связи между таблицами.


            Цитата SexGenius @
            Но выскакивае ошибка исполнения: Цитата
            Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции.

            Кажеться копать надо в эту сторону.
              Цитата
              Кажеться копать надо в эту сторону.

              То есть? Как раз с этим сообщением все ясно: нужно не открывать,а исполнять запрос.
                Цитата BigMaK @
                нужно не открывать,а исполнять запрос

                Полу правда, посмотри исходник.
                Тогда сообщение было типа
                ExpandedWrap disabled
                  Ошибка создания дескриптора курсора
                  или
                  Error creating cursor handle
                  Цитата BigMaK @
                  А связь ведь делается программно, в Access'е только сами таблицы. Или я что-то не так понял?

                  см. первый пост

                  Цитата
                  Структуру БД делал в Access
                    Возможно я немножко запутал вас своей неправильной формулировкой. Связь таблиц в Ассесе я не делал. В нем я сделал лишь сами таблицы и не связывал их. Делал связь программно. Сейчас я понимаю что мне повезло - именно программно мне и надо делать связь, т.к. у программы будет иная логика по удалению записей. Связаные записи будут удаляться по согласию пользователя. Если пользователь ответит "нет", то в записях будут просто меняться кое какие поля (тоесть они будут связываться с другими объектами). Однако приятно что связь можно было реализовать в самом Ассесе. Это действительно будет работать? Кто-то уже делал подобное?

                    Добавлено
                    Цитата BigMaK, 01.08.2005, 20:51:54, 792457
                    Для исполнение команды DELETE лучше использовать:
                    ADODataSetLL.ExecSQL;

                    Спасибо за совет. Правда в TADODataSet я не нашел метода ExecSQL, но зато я нашел его в TADOQuery. Удаление у меня получилось :)
                    Вот может в связи со всем этим кто подскажет в нете лин где по русски будет описано назначение кажлого из компонентов по работе с БД. TQuery ? TDataSet, TDataSource, TDataTable и д.р. Очень хочется по русски про это прочитать. Ато на инглише долго разбираться в хелпе. В хелп я лезу только когда сильно припекло, а тут просто надо ликбез пройти.
                        Цитата
                        Однако приятно что связь можно было реализовать в самом Ассесе. Это действительно будет работать? Кто-то уже делал подобное?


                        я делал, действительно будет работать. только свою логику удаления связанных записей уже не реализуешь, по-моему.
                        Сообщение отредактировано: DDX -
                          Я УСё понял. Спасибо всем! я счиатю вопрос решен.
                            Цитата DDX @
                            я делал, действительно будет работать. только свою логику удаления связанных записей уже не реализуешь, по-моему.

                            Тут такая проблема. В одной части моей проги реализовывать свою логику удаления неразумно. И вот в этой части я решил связать таблицы в Ассесе. Ну вот почитал хелп, начал делать как там написано и ничего не получается. Есть таблица - Шкаф, и есть несколько таблиц Аппарат1, Аппарат2, Аппарат3 ... АппаратN. Во всех таблицах есть поле НомерШкафа. Я хочу сделать так
                            1. Чтобы при изменении НомераШкафа в таблице Шкаф автоматически менялось этоже поле в таблицах Аппаратов.
                            2. При удалении записи из таблицы Шкаф удалялись соответстующие записи в Аппаратах.

                            Читал я этот тугой Аксессовский хелп. Делал так :
                            Жму кнопку "Схема данных" и указываю нужные таблицы. Из таблицы Шкаф перетягиваю поле НомерШкафа на такое же поле в Таблице одного из аппаратов. Ставлю Птицу "Обеспечение условия целостности данных" и птицу "Каскадное обновление связанных полей " жму Ok и получаю фигу в виде ошибки "Не обнаружен уникальный индекс для адресуемого поля главной таблицы". Жму справку и получаю
                            Цитата
                            Обнаружен повторяющийся индекс в адресуемом поле главной таблицы. (Ошибка 3609)
                            При создании связи между таблицами адресуемое поле главной таблицы должно иметь уникальный индекс. Более подробное описание см. в разделах справки для объекта Index и свойства Primary.

                            И что то нифига я не пойму как же заставить это работать. Почему не работает?

                            Добавлено
                            Поле НомераШкафа индексированое во всех таблицах.
                              Тебе нужен Primary Key на таблицу шкафы и там не должно быть два одинаковых номера шкафа.
                              Цитата SexGenius @
                              Поле НомераШкафа индексированое во всех таблицах.

                              В главной таблице он должен быть еще и уникальный.
                                Цитата Bas, 29.08.2005, 12:34:25, 839968
                                и там не должно быть два одинаковых номера шкафа.

                                А как же сделать чтобы работало с повторяющимися номерами шкафа в таблице Шкафы ? У меня в таблице Шкафы они будут повторяться, так как там еще есть поле Здание. И в Аппаратах есть поле Здание.
                                Тоесть номера шкафов могут повторяться и помера зданий тоже. Но не может быть только записей с одинаковыми ка номером шкафа так и здания ?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.1051 ]   [ 16 queries used ]   [ Generated: 10.07.26, 14:24 GMT ]