IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   БД и Delphi (https://www.imho.ws/showthread.php?t=97483)

SteFF 18.12.2005 23:44

БД и Delphi
 
Люди знающие подскажите!
Опыта работы с БД - вапще никакого.. ((((
Ситуация такая:
Есть три таблицы:
1) Комплектующие(kompl.db) - ID, Тип(число), ПРоизводитель(число), Модель(строка), Цена($)
2) Тип комплектующей(types.db) - ID, Название (Процессор, Мать, винт и т.д.)
3) ПРоизводитель(manuf.db) - ID, Название (ASUS, MSI и т.д.)
На форме в TreeView я выбираю типа комплектующей (Проц, мать и пр.)
Далее должен делаться запрос к базе данных, чтоб он по ТИПУ комплектующей (проц и пр.) взял её ID из базы. Этот ID присваевается переменной:
Код:

Procedure TypeSel2;
BEGIN
  With Form1 do
    With Query4 do
      begin
        Close;
        SQL.Clear;
        SQl.Add('SELECT id FROM types.db WHERE KName='+ktype);
        Open;
        DevID:=Query4.FieldValues['id'];
      end;
END;

После этого я делается еще один запрос к БД, в котором по этом ID из БД выбираются производители, которые собственно и производят такой типа комплектующих:
Код:

  With Query1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT mname FROM manuf.db WHERE id IN'+
      '(SELECT DISTINCT manuf FROM kompl.db WHERE type='+IntToStr(DevID)+')');
      Open;
    end;
  While not Query1.EOF do
    begin
//      DBComboBox1.Items.Add(Query1.FieldByName('mname').AsString);
      ComboBox1.Items.Add(Query1.FieldByName('mname').AsString);
      Query1.Next;
    end;
end;

Т.е. заполняется ComboBox
После этого я должен выбрать в этом списке желаемого производителя..
Наприм это будет ASUS
Я его выбираю. То что я выбрал присваивается переменной mnf. Делается запрос к БД и выбираются уже модели комплектующих этого производителя (этот кусок проги я еще не написал..)
И после того как я выбиру модель, он мне должен выдать цену в Edit.
ПОтом я выбираю несколько устройств, добавляя каждое из них в таблицу. И у меня по идее должно подсчитываться стоимость компа... вот..
Я решил не использовать компоненты DBCOmboBox, т.к. после выбора в нем чеголибо и щелчке вне его, то что выбрано - исчезает.. у меня лично так.
Вопщем я повис вот тут:
Код:

Procedure TypeSel2;
BEGIN
  With Form1 do
    With Query4 do
      begin
        Close;
        SQL.Clear;
        SQl.Add('SELECT id FROM types.db WHERE KName='+ktype);
        Open;
        DevID:=Query4.FieldValues['id'];
      end;
END;

Не присваивается ей то значение (ID), которе у ktype(проц, мать и пр.) в таблице types.db

AZBuka 19.12.2005 15:22

Просто не присваивается или ошибку какую-то выдает ?

К сожалению не работаю с базами DB, а вот с DBF я попробовал вот такой вариант

procedure TForm1.Button1Click(Sender: TObject);
var
PName: String;
begin
PName:=Trim(Edit1.Text);
with Form1 do
With Query1 do
begin
Close;
SQL.Clear;
SQL.Add('select id from baza where name='''+PName+'''');
Open;
Edit2.Text:=Query1.FieldValues['ID'];
end;
end;

Все работает нормально.

qnx 17.01.2006 11:36

при отладке используйте обработчик try ... except, при возникновении исключения смотрите on E:Exception строку E.Message , в ней и будет искомая причина.

SteFF 17.01.2006 11:40

Все. Сделал я эту "прогу"..
По крайней мере работает и делает то что нужно..
Но реализовал я все там не самым лучшим образом :)))
МОжно было бы сделать код намного более компактным.
Ну да и ладно.. Главное сдал ;)
:biggrin: :yees:

Yurij 06.10.2006 21:40

Народ!
У меня тоже проблем с БД.
У меня есть 4 поля. Username, Password, Время присоединения и время отсоединения.
Во 'Время присоединения' время записывается вот так:
procedure TForm4.FormActivate(Sender: TObject);
var
DateTime : TDateTime;
str : string;
begin
DateTime := Time;
str := TimeToStr(DateTime);
Label2.Caption:=str;
Form1.Table1.Edit;
Form1.Table1Время присоединения.Value:=Time;
А 'время отсоединения' не хочет корректно записываться. Т.е. для любой первой записи всё работает корректно, но когда происходит второе или н-ное присоединение,то 'время отсоединения' записывается в первое поле (первого присоединения). Никак не пойму в чём дело. Как понимаю - курсор стоит только на первом поле.Помогите плиз.
procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Table1.Edit;
Form1.Table1времяотсоединения.Value:=Time;
Form1.Table1.Post;
end;

ЕЖ 06.10.2006 21:44

Yurij
Ну так надо не Edit, а Append делать для добавления записи.

Yurij 06.10.2006 21:49

ЕЖ, если в этих процедурах я заменяю Edit на append, то прога ломается с ошибкой:*.exe raised exception class EDBEEngineError with message 'key violation' :idontnow:

ЕЖ 06.10.2006 21:56

А в таблице кроме твоих четырех полей нету какого-нибудь обязательного ключевого поля? Может ты его просто не заполняешь?

Yurij 06.10.2006 22:34

ЕЖ, не не все поля заполнены. Единственное на Username стоит KEy, но этот никак влиять не должно. Если
Form1.Table1Времяприсоединения.Value:=Time;
и
Form1.Table1времяотсоединения.Value:=Time; написать в одной процедуре, то вся информация идёт в назначенные поля(делал для отладки).

ЕЖ 06.10.2006 22:43

Я не пойму, тебе надо при каждом новом соединении добавлять новую запись с временем начала и конца? Или ты при каждом новом соединении хочешь фиксировать эту информацию в одной и той же записи?

И еще - ты говоришь что Username у тебя ключевое поле - оно у тебя первичный ключ или внешний? Кстати, какая БД?

Yurij 07.10.2006 10:56

Вложений: 1
ЕЖ,у меня зарегено несколько аля пользователей и мне надо при каждом новом соединении добавлять новую запись с временем начала и конца сессии этого юзера. К примеру у меня юзера: 1,2,3 и соответственные пароли. Как заходит 1,2,3 - то в поле Время Начало записывается соответственная запись. А в поле ...конец - информация заносится только последнего сеанса в первое поле.
На скрине третье поле-время присоединения, на четвёртом - проблемное поле со времен отсоединения.
БД Paradox, если честно какой ключ стоит не знаю - в database Desktop я его убрал - ноль на массу ;(

Yurij 08.10.2006 20:46

Ещё работая заметил такую оплошность:
У меня стоит AutoRefresh - True, чтобы показывались обновлённые данные БД. Всё бы ничего, но только при запуске программы - DbGRID показывает пустую БД. Все данные будут показаны только после первой авторизации через форму login/pass/. Есть соображения в чём дело?
P.S. сорри, этот глюк исправил


Часовой пояс GMT +4, время: 14:28.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.