На главную Наши проекты:
Журнал   ·   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_
  
> Добавление и изменение данных в , таблицах
    АКСЕСС/АДО
    база+проект прилагаются

    Есть 3 таблицы. Их структура:
    Таблица Организации
    Id_organizacii (счетчик)
    Nazvanie_organizacii (текстовый)

    Таблица Состав организации
    Id_organizacii (числовой)
    Id_sostava (счетчик)
    Name (текстовый)
    Surname (текстовый)

    Таблица Данные о составе
    id_data (счетчик)
    Id_sostava (числовой)
    Telefon

    Таблицы Организации и Состав организации связаны по полю Id_organizacii как
    1 ко многим, а таблица Состав организации связаны с таблицей Данные о составе по
    полю Id_sostava

    На форме у меня есть такая структура отображающая связь таблиц
    В DBLookupComboBox1 у меня отображается Названия организаций
    (берет данные из таблицы Организации).
    Выбрав из списка DBLookupComboBox1 название организации (к примеру ФСБ) чуть ниже у меня
    отображается в DBGrid1 состав данной организации. В ADOTable2 свойстве MasterSource у меня
    прописанDataSource1 а в свойстве MasterFields у меня прописан Id_organizacii.
    Связь по такому же принципу у меня и между данными из DBGrid1 и DBGrid2(в нем отображаются записи из
    таблицы Данные о составе) - т.е. в ADOTable3 в свойстве MasterSource у меня
    прописанDataSource2 а в свойстве MasterFields у меня прописан Id_sostava.

    Есть на этой же форме кнопки Добавить запись в Таблицу Организации,
    Добавить запись в Таблицу Состав организации и Добавить запись в Таблицу Данные о составе
    При нажатии на эти кнопки появляются соответствующие формы в которых есть
    Edit1(вопрос: а может использовать DBEdit1) для вписания в него новой записи в соответствющие таблицы.
    А также кнопки изменить записи

    Как заносить данные вписанные в Edit1 в соответствующий DBLookupComboBox1 или DBGrid'ы
    И как мне при нажатии кнопки Изменить открывать соответствующую формы в которой в
    Edit1 будет редактировать выделенная в DBLookupComboBox1 или DBGrid'ах запись и сохраняться изменения
    Прикреплённый файлПрикреплённый файл123.rar (29.12 Кбайт, скачиваний: 112)
      В DBLookupComboBox1 и DBGrid'ы ничего заносить не надо! они ведь ОТОБРАЖАЮТ данные, хранящиеся в таблице БД => тебе нужно заносить данные в соответствующую таблицу Access.
      ExpandedWrap disabled
        Table1.Append; //или Table1.Edit если изменение
        Table1.FieldByName('Name').Value:=Edit1.Text;
        Table1.Post;

      До открытия соответствуюшей формы присваиваешь значение в Edit1:
      ExpandedWrap disabled
        Form1.Edit1.Text:=Table1.Fields.Fields[1].AsString;
        Form1.Show;
        ExpandedWrap disabled
          ADOTable.Edit;
          ADOTable.FieldByName('Name').AsValue := Edit1.Text;
          ADOTable.FieldByName('Surname').AsValue := Edit2.Text;
          ADOTable.Post;

        либо можешь в самом гриде редактировать данные или использовать DBNavigator
          щас буду пробовать :yes:
            Спасибо - все получилось.
            Возник вопрос: в форме добавления Организации после нажатия кнопки ОК (добавляет запись в Организации)
            На кнопке я дописываю нижележащий код, чтобы добавленная организация появилась сразу в DBlookupcombobox1
            и была видна
            ExpandedWrap disabled
              form1.DBlookupcombobox1.KeyValue:=form1.ADOTable1Id_organizacii.Value;

            Но если я это пишу на Редактирование Организации, то нажав на кнопку отредактировать запись изменяется
            а в DBlookupcombobox1 остается старый вариант и приходится сначала выбрать из DBlookupcombobox1
            какую-нить другую организацию чтобы потом можно было в DBlookupcombobox1 выбрать
            отредактированную запись.
            И как при запуске программы чтобы в DBlookupcombobox1 уже была выбрана 1-ая запись из списка
            (т.е. чтобы DBlookupcombobox1 первоначально не был пуст)
            Сообщение отредактировано: кент -
              Чтобы выбиралась первая запись:
              ExpandedWrap disabled
                DBlookupСombobox1.ItemIndex:=0;
              Чтобы выбрать отредактированную запись можно попробовать программно выбрать другую запись, а затем опять эту же: (не знаю насколько это правильно!.. :whistle: )
              ExpandedWrap disabled
                tmp:=DBlookupСombobox1.ItemIndex; //этот
                DBlookupСombobox1.ItemIndex:=0;   // код
                DBlookupСombobox1.ItemIndex:=tmp; //я не проверял

              А вообще я использую обычные компоненты с вкладки Standart, а то эти DB компоненты сложно контролировать (не знаю насколько это правильно!.. :whistle: )
                а разве у DBlookupСombobox есть свойство ItemIndex???
                пишет ошибку
                Цитата

                [Error] Unit.pas(165): Undeclared identifier: 'ItemIndex'
                  Упс... :lol: Это у DBСombobox есть... :yes: Должно и DBlookupСombobox что-то похожее быть... :wacko:

                  Добавлено
                  Точно не могу сказать, но свойство ListFieldIndex не подходит в замену ItemIndex? :blink:
                    Чтобы выбиралась первая запись я сделал так:
                    ExpandedWrap disabled
                      DBLookupComboBox1.KeyValue:=1;


                    теперь осталось только
                    Цитата кент @
                    Но если я это пишу на Редактирование Организации, то нажав на кнопку отредактировать запись изменяется
                    а в DBlookupcombobox1 остается старый вариант и приходится сначала выбрать из DBlookupcombobox1
                    какую-нить другую организацию чтобы потом можно было в DBlookupcombobox1 выбрать
                    отредактированную запись.

                    щас попробую по этой технологии
                    Цитата Creat!ve @
                    tmp:=DBlookupСombobox1.ItemIndex; //этот
                    DBlookupСombobox1.ItemIndex:=0; // код
                    DBlookupСombobox1.ItemIndex:=tmp; //я не проверял
                      Если что подожди кого-нибудь из более опытных! Сегодня выходной, они, наверное, все спят еще :D ...
                        ExpandedWrap disabled
                          temp:=mainform.DBLookupComboBox1.KeyValue;
                          form1.DBLookupComboBox1.KeyValue:=0;
                          form1.DBLookupComboBox1.KeyValue:=temp;

                        сработало :yes:
                          Есть в БД таблица с типом поля Memo(ведь в нем можно хранить картинки???). И я хочу добавить в него какую-нибудь картинку
                          Для начала я открываю диалоговое окно для добавления картинки
                          ExpandedWrap disabled
                            ...
                            If OpenDialog1.Execute then
                            ...

                          а как дальше его добавлять в поле Kartinka???
                            Memo хранит Lengthy text or combinations of text and numbers (длинный текст или комбинации текста и чисел)...
                            А вот OLE Object может хранить объект (such as a Microsoft Excel spreadsheet, a Microsoft Word document, graphics, sounds, or other binary data), наверное, может хранить и картинки, а как их туда сохранять... мне тоже стало интересно! :D
                              Creat!ve
                              кент
                              графические и мультимедийные данные (и не только) храняться в BLOB-field (блоб-полях)...
                              записать в них данные и прочитать их оттуда можно так
                              ExpandedWrap disabled
                                Table.Edit;
                                Table.SaveToBlobField('Graphics.bmp');
                                Table.Post;

                              ExpandedWrap disabled
                                Table.LoadFromBlobField('Graphics.bmp');
                                dron-s,
                                пишу вот так
                                ExpandedWrap disabled
                                  form1.AdoTable3.Append;
                                  form1.AdoTable3.FieldByName('Picture').SaveToBlobField('Graphics.bmp');
                                  form1.AdoTable3.Post;

                                ругается на SaveToBlobField - типа нет такого свойства
                                у поля Picture тип OLE Object
                                  ну так как насчет вышеизложенного :huh:
                                    Так нет такого свойства у TField
                                      Цитата Anatoly Podgoretsky @
                                      Так нет такого свойства у TField

                                      Так есть или нет :wacko: ???

                                      так тоже не проходит :wall:
                                      ExpandedWrap disabled
                                        form.AdoTable1.fieldbyname('Picture') As TBlobField).loadfromfile(OpenDialog1.FileName);
                                        Цитата кент @
                                        Цитата Anatoly Podgoretsky @
                                        Так нет такого свойства у TField

                                        Так есть или нет :wacko: ???[/CODE]

                                        Я что не четко, двусмысленно написал?
                                          а как же теперь сохранять картинки в поле таблицы БД Аксесса :wacko:
                                            Цитата кент @
                                            а как же теперь сохранять картинки в поле таблицы БД Аксесса

                                            Заглянуть в FAQ.
                                              Цитата Bas @
                                              Заглянуть в FAQ.

                                              я там смотрел. Вроде нету или плохо смотрел :wall:
                                              Bas, буду очень благодарен за ссылку :yes:
                                                Попробуй так:
                                                ExpandedWrap disabled
                                                  (table1.fieldbyname('ddd') as TBlobField).loadfromfile('dddss');
                                                  Creat!ve, я это уже пробовал
                                                  Цитата кент @
                                                  form.AdoTable1.fieldbyname('Picture') As TBlobField).loadfromfile(OpenDialog1.FileName);
                                                    Странно... :blink:

                                                    Добавлено
                                                    Ты уверен, что не работает??? :blink:
                                                    У меня вот эти строчки ошибок не выдают:
                                                    ExpandedWrap disabled
                                                      if OpenDialog1.Execute then
                                                       begin
                                                          ADOTable1.Append;
                                                          (ADOTable1.FieldByName('pict') as TBlobField).LoadFromFile(OpenDialog1.FileName);
                                                          ADOTable1.Post;
                                                       end;
                                                      Цитата Creat!ve @
                                                      Ты уверен, что не работает???

                                                      А ты в какой СУБД проверял - У меня Аксес 2003
                                                      и вылаются ошибки
                                                      Цитата

                                                      [Error] Unit.pas(119): Undeclared identifier: 'TBlobField'
                                                      [Error] Unit.pas(119): Undeclared identifier: 'LoadFromFile'


                                                      Добавлено
                                                      Bas, а можно ссылку из FAQ :wub:
                                                        Люди - отзовитесь кто знает :'(
                                                          Ошибка "Undeclared identifier:" означает, что ты не включил в uses нужные модули
                                                            Цитата Anatoly Podgoretsky @
                                                            Ошибка "Undeclared identifier:" означает, что ты не включил в uses нужные модули

                                                            А какие нужно подключить модули если не секрет
                                                              Цитата Anatoly Podgoretsky @
                                                              Ошибка "Undeclared identifier:" означает, что ты не включил в uses нужные модули

                                                              и это оказалось был DB >:(
                                                                  Цитата кент @
                                                                  Цитата Anatoly Podgoretsky @
                                                                  Ошибка "Undeclared identifier:" означает, что ты не включил в uses нужные модули

                                                                  и это оказалось был DB >:(

                                                                  Молодец, такие вопросы ты должен разрешать сам с помощью справка, как правило нужный модуль в ней указан и в крайнем случае поиском по исходникам.
                                                                    Выполняется поиск по БД посредством фильтрования AdoTable:
                                                                    ExpandedWrap disabled
                                                                      ADOTable1.Filter := 'Фамилия='+QuotedStr(Edit1.Text);
                                                                      ADOTable1.Filtered:= True;

                                                                    А затем, при редактировании полей:
                                                                    ExpandedWrap disabled
                                                                      ADOTable1.Edit;
                                                                      ADOTable1.FieldByName('Фамилия').AsString:=DBEdit1.Text;
                                                                      ADOTable1.post

                                                                    Возникает ошибка:
                                                                    "BOF или EOF имеет значение True, либо текущая запись удалена. Для выполнения операции требуется текущая запись."

                                                                    В чём дело? И как избавиться от ошибки?
                                                                      Выбрось ADOTable на свалку, а вместо него используй ADOQuery.
                                                                        С AdoQuery не работает поиск, и при редактировании опять ошибка, но уже другая:
                                                                        "AdoQuery1: Cannot perform this operation on a closed dataset"
                                                                          Цитата Expected } @
                                                                          С AdoQuery не работает поиск

                                                                          то есть?
                                                                          Цитата Expected } @
                                                                          "AdoQuery1: Cannot perform this operation on a closed dataset"

                                                                          а перед выполнение операции проверяли AdoQuery1.Active = true ?
                                                                            Цитата
                                                                            а перед выполнение операции проверяли AdoQuery1.Active = true ?

                                                                            Появляется сообщение "Missing SQL property"
                                                                              Expected } а запрос заполнили? свойство SQL. Или компутер сам должен догадатся какой запрос надо выполнять?
                                                                                А что там должно быть указано?
                                                                                  Запрос для получения данных. Читать что такое SQL и в частности про SELECT, INSERT, UPDATE, DELETE. Так же смотреть сюда Базы данных с нуля
                                                                                  Сообщение отредактировано: Paul_K -
                                                                                    Хочю еще раз повторить, чтобы человек не наделал ошибок в будущем:
                                                                                    ADOTable выкинь, используй SQL запросы.
                                                                                    Такой же совет сам получил лет 5 назад, кады начинал постигать азы работы с БД :)
                                                                                      Цитата Expected } @
                                                                                      Появляется сообщение "Missing SQL property"

                                                                                      напиши так
                                                                                      ExpandedWrap disabled
                                                                                        AdoQuery1.SQL.Clear;
                                                                                        AdoQuery1.SQL.Add('Select * from твоя_таблица where поле=занчение');
                                                                                        AdoQuery1.Active := true;
                                                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                                      0 пользователей:


                                                                                      Рейтинг@Mail.ru
                                                                                      [ Script execution time: 0,1105 ]   [ 17 queries used ]   [ Generated: 19.03.24, 04:56 GMT ]