1

Тема: Delphi бази даних

Доброго вечора товариші

У мене виникли деякі труднощі тому я звертаюся за Вашою допомогою.


Для заповнення списку Items для CheckListBox я використовую таку процедуру:

procedure TForm1.SpeedButton22Click(Sender: TObject);
begin
   CheckListBox1.Items.Clear;
   with  ADOTable_Ganre do
      begin
         DisableControls;
         CheckListBox1.Items.BeginUpdate;
         First;
            while not Eof do
               begin
                  CheckListBox1.Items.Add(FieldByName('Ganre').AsString);
                  Next;
               end;
         CheckListBox1.Items.EndUpdate;
         EnableControls;
      end;
end;

Але як занести у базу даних (у підлеглу таблицю ) вибрані жанри із списку CheckListBox не можу збагнути
Пробував додавати дані у підлеглу таблицю наступною процедурою та нічого не виходить.

procedure TForm1 . SpeedButton1Click ( Sender :  TObject ) ; 
begin
    ADOTable_BasaGanre . Insert ;
    ADOTable_BasaGanre . FieldByName ( 'Ganre' ) . AsString : =  CheckListBox1.Items; // ??? як правильно не знаю
end;

Хто допоможе мені з цією проблемою буду дуже вдячний.

2

Re: Delphi бази даних

Використовуйте теґ code, будь ласка.
Стосовно питання, можна використовувати sql запит

INSERT INTO ім'я таблиці(список стовпців)
 VALUES (значення через запяту) 

Взяти рядок з CheckListBox можна так

CheckListBox1.Items[i];

де i номер в списку.

Подякували: leofun011

3

Re: Delphi бази даних

Додав за вас тег code. Востаннє. Наступного разу просто видалю.

4

Re: Delphi бази даних

По суті: використовуйте Data Controls. А для того, щоб відповісти на ваше питання, ви надали замало інформації - ми нічого не знаємо про ці ваші таблиці, що саме в них зберігається і т.д., окрім того, що BasaGanre(?) є підлеглою(?) відносно Ganre(?), відповідно, нічим не можемо допомогти.

Подякували: leofun01, Torbins2

5

Re: Delphi бази даних

Romanvolja
Усе залежить від того, як у вас організовані таблиці в базі даних. Які там стовпці, які у них типи, як таблиці зв'язані між собою?

6

Re: Delphi бази даних

Головна таблиця бази даних ADOTable_Video, а таблиця ADOTable_BasaGanre є підлеглою.

Поле ID таблиці ADOTable_Video має тип лічильник та зв'язане з полем ID_Video таблиці ADOTable_BasaGanre яке має числовий тип.

У таблиці ADOTable_BasaGanre є текстове поле Ganre  в яке я і хочу заносити дані із спису CheckListBox1

Таблиця ADOTable_Ganre не зв'язана із жодною. Використовую її просто для збереження жанрів.

Компонент CheckListBox1 планую використовувати для збереження декількох вибраних жанрів у таблицю ADOTable_BasaGanre.

7

Re: Delphi бази даних

Тобто у вас є таблиця ADOTable_Video, яка зберігає список відео, і таблиця ADOTable_BasaGanre, зі співвідношенням 1:N? Тоді яким чином ви збираєтеся використовувати CheckListBox для відображення цього - адже воно не дає можливості нічого дописати? Чи поле Ganre не просто текстове, а з обмеженим набором варіантів? Але ж завантажуєте ви CheckListBox1 не з цього набору, а з таблиці. Або ж CheckListBox1 буде використовуватися тільки для видалення жанрів, а для додавання буде інший елемент управління?

Як на мене, тут класичне співвідношення N:N (відео може мати багато жанрів, жанр може бути в багатьох відео), яке реалізується додатковою таблицею:
Video( ID: integer Primary Key, Name: varchar(100) )
Genre( ID: integer Primary Key, Name: varchar(20) )
Video_Genre( Video_ID: integer not null, Genre_ID: integer not null )
Але я не знаю, чи входить таке до ваших планів.

8

Re: Delphi бази даних

Romanvolja
Пропоную в таблиці Ganre створити ключове поле. А в таблиці BasaGanre тип поля Ganre замінити з текстового на числовий. Тоді у вас вийде та схема, яку описав koala. Її перевага у тому, що по-перше база займатиме трохи менше місця на диску, а по-друге ви зможете легко перейменувати якийсь жанр і це одразу ж відобразиться на усіх відео. Щоправда така схема має й свої недоліки. Наприклад, щоб подивитися список жанрів для одного фільма, вам доведеться звернутися до двох додаткових таблиць. Це можна реалізувати силами компонентів ADO на боці клієнта, або SQL запитом на боці бази даних.
SQL я вивчав по книжці Изучаем SQL, рекомендую. Хоча якщо ви використовуєте якусь хорошу тулзу для роботи зі своєю базою (типу dbForge Studio), то там напевне буде графічний редактор запитів. Створений ним запит можна скопіювати в ADOQuery.
Щоправда в ADO є свої підводні камені, якщо ви намагаєтеся використовувати Edit, Insert і т. д. Докладніше про них в перших трьох та останній статті: http://www.delphikingdom.com/asp/itemq. … itemid=128 Ну й найголовніша проблема ADO в тому, що ця технологія уже давно не розвивається і вважається мертвою. Для невеликих навчальних програмок нею іще можна користуватися. А для чогось складнішого уже варто брати FireDAC (якщо у вас Delphi XE3 чи свіжіша), UniDAC або ZeosLib. Усі вони принципово нічим від ADO не відрізняються, але мають більше налаштувань і живі.

P.S. Сподіваюся не сильно вас "загрузив".