Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2008, 16:53
Жулик Жулик вне форума
Прохожий
 
Регистрация: 16.04.2008
Сообщения: 21
Репутация: 5
Вопрос Вставка и изменение записей в бд Access через ADO

Всех ПРИВЕТСТВУЮ!!!!!

У меня возникло две проблемы в разроботке приложения (АРМ)!
Использую бд Access через ADO т.е. заросы SQL в ADOQuery.
И так о проблемах:
1. Я не могу организовать вставку записи в таблицу БД...
Имеются две таблицы : stud (Code_s, Familia, Ima, Ochestvo, Gruppa...)
и вторая таблица propuski (Code_s, Data, Vid_propuska, Kol_vo_chas) Они связаны по полю Code_s.
Как сделать так, чтобы новая запись в таблице propuski при вставке относилась к выбранному студенту из таблице stud, студента т.е фамилию выбираю из ComboBox1 и, чтобы в ComboBox1 отображались студенты группы, выбранной в ComboBox2 т.е. фамилии студентов определённой (выбранной) группы.???

2. А вторая проблема заключается в редактированнии записи таблицы propuski.
Необходимо, в выкидном списке (ComboBox1) выбрать дату пропуска, затем в другом ComboBox выбрать группу, а в третьем ComboBox выбрать фамилию студента(относящегося к выбранной группе), а потом уже в редактируемые поля Kol_vo_chas (Edit1) и Vid_propuska (ComboBox) ввести новые значения...

Для меня сложность в том, что работа происходит с двумя таблицами, а не с одной!

Можно примеры приложений, как это сделать?
Сам пытался, не получиется уже второй день мучаюсь!

Кто может? прошу ПОМОЩИ!!!! И буду рад любой помощи!!!

Последний раз редактировалось Жулик, 22.05.2008 в 19:25.
Ответить с цитированием
  #2  
Старый 22.05.2008, 20:13
Жулик Жулик вне форума
Прохожий
 
Регистрация: 16.04.2008
Сообщения: 21
Репутация: 5
Сообщение

Кто-нибуть помогите!!!!!!!!!!!!!

Я не могу сделать вставку записи в таблицу Propuski, чтобы эта запись относилась к Студенту из таблицы Stud! эти таблицы связаны по полю Code_s т.е. таблица Stud главная а таблица Propuski дочерняя звязь между ними 1:М (один ко многим) т.е. студент один а пропусков у него много!

Вот я и не знаю как должен выглядить Sql запрос, чтобы запись в таблице Propuski относилась к нужному студенту из таблицы Stud!

Есть предположения, что нужно отталкиваться от поля Code_s, но я не знаю как преобразовать значение поля Familia (выбор производится по фамилии) в его код Code_s, а потом уже просто указать его значение в запросе!

С редактированием тоже самое!

Помогите очень нужно!! Скоро сдавать нароботки а я никак не могу решить эти две проблемы
Ответить с цитированием
  #3  
Старый 22.05.2008, 20:58
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Сообщения: 227
Версия Delphi: Delphi 7
Репутация: 30
По умолчанию

Цитата:
Сообщение от Жулик
Всех ПРИВЕТСТВУЮ!!!!!

У меня возникло две проблемы в разроботке приложения (АРМ)!
Использую бд Access через ADO т.е. заросы SQL в ADOQuery.
И так о проблемах:
1. Я не могу организовать вставку записи в таблицу БД...
Имеются две таблицы : stud (Code_s, Familia, Ima, Ochestvo, Gruppa...)
и вторая таблица propuski (Code_s, Data, Vid_propuska, Kol_vo_chas) Они связаны по полю Code_s.
Как сделать так, чтобы новая запись в таблице propuski при вставке относилась к выбранному студенту из таблице stud, студента т.е фамилию выбираю из ComboBox1 и, чтобы в ComboBox1 отображались студенты группы, выбранной в ComboBox2 т.е. фамилии студентов определённой (выбранной) группы.???


Т.е. сперва в ComиoBox2 выбирается группа, в ComboBox1 - студент этой группы, а потом заполнить соответствующие поля в таблице propuski и сохранить?
Ответить с цитированием
  #4  
Старый 22.05.2008, 21:00
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Сообщения: 227
Версия Delphi: Delphi 7
Репутация: 30
По умолчанию

Выложи что наработал и саму базу, если небольшая.
Ответить с цитированием
  #5  
Старый 22.05.2008, 21:38
Жулик Жулик вне форума
Прохожий
 
Регистрация: 16.04.2008
Сообщения: 21
Репутация: 5
По умолчанию

Цитата:
Сообщение от MegaPiha
Т.е. сперва в ComиoBox2 выбирается группа, в ComboBox1 - студент этой группы, а потом заполнить соответствующие поля в таблице propuski и сохранить?

Да, почти так!
А в идеале еще нужна дата, которая выберается в календаре, по ней идет отбор всех записей в таблицы propuski затем эти отобранные данные опять отбираются теперь по группе (в ComboBox2 список групп из отобранного списка по дате) и идет следующий отбор по фамилии студента (в ComboBox1 список фамилий из выбранной группы и из таблицы propiski т.е. если о студенте нет записи в отобранном списке по дате, следовательно он не пропускал в этот день и его фамилия не дедолжна быть в ComboBox1 )
Вложения
Тип файла: zip База.zip (40.2 Кбайт, 26 просмотров)

Последний раз редактировалось Жулик, 22.05.2008 в 21:40.
Ответить с цитированием
  #6  
Старый 22.05.2008, 23:10
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Сообщения: 227
Версия Delphi: Delphi 7
Репутация: 30
По умолчанию

Вот кое что сделал.
Вложения
Тип файла: zip 4.ZIP (44.0 Кбайт, 86 просмотров)
Ответить с цитированием
  #7  
Старый 23.05.2008, 08:27
Жулик Жулик вне форума
Прохожий
 
Регистрация: 16.04.2008
Сообщения: 21
Репутация: 5
По умолчанию

Цитата:
Сообщение от MegaPiha
Вот кое что сделал.

MegaPiha Спасибо тебе огромное!!!!

У меня опять вопросы!

1. Он приметивен но всё же, я доисываю код, надо что бы в таблицу заносилось количество пропусков из Edit1, делаю через Параметр...но он ругается "Ошибка синтаксиса(пропушен оператр) в выражении запроса SET p.Kol_vo_chas = :?"

Код:
with ADOQuery4 do begin
       Close;
       SQL.Clear;
       SQL.Add('UPDATE propuski p, stud s');
       SQL.Add('SET p.Vid_propuska = :v');
       SQL.Add('SET p.Kol_vo_chas = :k');
       SQL.Add('WHERE s.code_s = p.code_s');
       SQL.Add('AND s.Gruppa  = :g');
       SQL.Add('AND p.Data    = :d');
       SQL.Add('AND s.Familia = :f');
       Parameters.ParseSQL(SQL.Text,true);
       Parameters.ParamByName('v').Value:= ComboBox3.Text;       //вид пропуска
       Parameters.ParamByName('f').Value:= ComboBox1.Text;       //фамилия
       Parameters.ParamByName('g').Value:= ComboBox2.Text;       //группа
       Parameters.ParamByName('d').Value:= DateTimePicker1.Date; //дата
       Parameters.ParamByName('k').Value:= Edit1.Text; //количеставо часов


И тотже вопрос, на первом посте:

Объясните или покажите, как при вставке новой записи в таблицу сделать так чтобы эта запись относилась к записе в другой таблице...
Выбор по фамилии а не по Cod_s вот это у меня вызывает затруднение...

Хелпп!
Ответить с цитированием
  #8  
Старый 23.05.2008, 19:51
Жулик Жулик вне форума
Прохожий
 
Регистрация: 16.04.2008
Сообщения: 21
Репутация: 5
Восклицание Поправка

Сегодня съездил к руковолителю, убедил его, в том что в редактировании количества часов нет смысла, так что первый вопрос с предыдущего поста снимается!!!

НО остался вопрос о внесении нового пропуска в БД, т.е. о вставке записи в таблицу Propuski, что бы этот пропуск относился к студенту из таблицы stud.
Для наглядности опишу, то как это должно выглядить, (форму создал и пытался сам написать запрос,но увы безуспешно)
Значит выбираем дату из DateTimePicker1,
потом выбираем группу в ComboBox2 из таблицы grupp,
далее из ComboBox1 выбираем студента (в списке ComboBox1 только студенты из выбранной в ComboBox2 группы "таблицы grupp и stud связаны связью 1:м по полю Gruppa"),
затем в ComboBox3 выбираем вид пропуска (ComboBox3 уже заполнен тремя строками из инспектора объектов по свойству items),
и в Edit1 указывается количество часов пропущенных студентом.

Повторюсь, я не могу сделать так, что бы в поле code_s из тыблицы propuski присваивалось значение из таблицы stud одноимённого поля code_s, выбор то в ComboBox1 производится по полю Familia а не по полю cod_s. Таблицы Stud и Propuski связаны по полю code_s (1:М)

Третий день уже мучаюсь над этой проблемой , пытался отвлечься-решал другие поставленные передомной задачи этого проекта, но мне эта проблема покоя не дает!

Прошу кто знает как это сделать, ПАЖАЛУЙСТА ПОМОГИТЕ!!!! Уже сил нет и головную боль зароботал а время то идет...
Ответить с цитированием
  #9  
Старый 23.05.2008, 20:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,075
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
INSERT INTO TABLE1 (..., ParentID, ...) 
VALUES (...,(SELECT ID FROM TABLE2 WHERE Name = 'Имя'),...)

Не подойдет?
Вместо строковой константы можно использовать параметр.

только надо учесть, что ID второй таблицы должен быть уникален (фактически, будет лучше всего, если он будет первичным ключем), иначе запрос будет ругаться.
Ответить с цитированием
  #10  
Старый 23.05.2008, 21:41
Жулик Жулик вне форума
Прохожий
 
Регистрация: 16.04.2008
Сообщения: 21
Репутация: 5
По умолчанию

Цитата:
Сообщение от lmikle
Не подойдет?
Вместо строковой константы можно использовать параметр.

только надо учесть, что ID второй таблицы должен быть уникален (фактически, будет лучше всего, если он будет первичным ключем), иначе запрос будет ругаться.

Подставил запрос предложениый тобой...

при выполнении запроса ругается на параметр :
"ADOQuery4:Parameter 'f' not found"

не могу понять что ему не нравится

Если что вот код:
Код:
procedure TForm4.FormCreate(Sender: TObject);
begin

    with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('ORDER BY s.familia');
         Open;
     end;


     with ADOQuery2 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT Familia FROM stud');
         SQL.Add('ORDER BY Familia');
         Open;
     end;
     ADOQuery2.First;
     While not ADOQuery2.Eof do begin
        ComboBox1.Items.Add(ADOQuery2.Fields[0].AsString);
        ADOQuery2.Next;
     end;
     
//---------------------------------------
     
     with ADOQuery3 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT Gruppa FROM grupp');
         SQL.Add('ORDER BY Gruppa');
         Open;
     end;
     ADOQuery3.First;
     While not ADOQuery3.Eof do begin
        ComboBox2.Items.Add(ADOQuery3.Fields[0].AsString);
        ADOQuery3.Next;
     end;


end;


procedure TForm4.Button1Click(Sender: TObject);
begin
  with ADOQuery4 do begin
       Close;
       SQL.Clear;
       SQL.Add('INSERT INTO propuski ( code_s, Data, Vid_propuska, Kol_vo_chas )');
       SQL.Add('VALUES  ( (SELECT Code_s FROM stud WHERE Familia = f ), :d, :v, :k)');

      
       Parameters.ParseSQL(SQL.Text,true);
       Parameters.ParamByName('v').Value:= ComboBox3.Text;         //вид пропуска
       Parameters.ParamByName('d').Value:= DateTimePicker1.Date;   //дата
       Parameters.ParamByName('k').Value:= Edit1.Text;             //количеставо часов
       Parameters.ParamByName('f').Value:= ComboBox1.Text;          //фамилия
       ExecSQL;

  end;

     with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('AND p.Data    = :d');
         SQL.Add('AND s.familia = :f');
         SQL.Add('ORDER BY s.familia');
         Parameters.ParseSQL(SQL.Text,true);
         Parameters.ParamByName('d').Value:= DateTimePicker1.Date;
         Parameters.ParamByName('f').Value:= ComboBox1.Text;
         Open;
     end;
     
end;

procedure TForm4.ComboBox1Enter(Sender: TObject);    //фамилия
  Var i:integer;
begin
   With ADOQuery5 do begin
       Close;
       SQL.Clear;
       SQL.Add('SELECT DISTINCT familia FROM stud');
       SQL.Add('WHERE Gruppa  LIKE '+quotedStr(ComboBox2.Text));
       SQL.Add('ORDER by familia');
       Open;
   end;
   ADOQuery5.First;
   ComboBox1.Items.Clear;
   While not ADOQuery5.eof do        //Заполняем ComboBox1
   begin
      ComboBox1.Items.Add(ADOQuery5.Fields[0].AsString);
      ADOQuery5.Next;
   end;

end;

procedure TForm4.Button2Click(Sender: TObject);   //показ всех пропусков
Var i:integer;
begin
   with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('ORDER BY s.familia, p.Date');
         Open;
     end;

end;

procedure TForm4.DateTimePicker1CloseUp(Sender: TObject);  //календарь

begin
   with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('AND p.Data    = :d');
         SQL.Add('ORDER BY s.familia');
         Parameters.ParseSQL(SQL.Text,true);
         Parameters.ParamByName('d').Value:= DateTimePicker1.Date;
         Open;
     end;

end;

Кто знает в чем ошибка, помогите Пажалуйста!

Последний раз редактировалось Жулик, 23.05.2008 в 21:46.
Ответить с цитированием
  #11  
Старый 24.05.2008, 09:47
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Сообщения: 227
Версия Delphi: Delphi 7
Репутация: 30
По умолчанию

Цитата:
Сообщение от Жулик
MegaPiha Спасибо тебе огромное!!!!

У меня опять вопросы!

1. Он приметивен но всё же, я доисываю код, надо что бы в таблицу заносилось количество пропусков из Edit1, делаю через Параметр...но он ругается "Ошибка синтаксиса(пропушен оператр) в выражении запроса SET p.Kol_vo_chas = :?"

Код:
with ADOQuery4 do begin
       Close;
       SQL.Clear;
       SQL.Add('UPDATE propuski p, stud s');
       SQL.Add('SET p.Vid_propuska = :v');
       SQL.Add('SET p.Kol_vo_chas = :k');
       SQL.Add('WHERE s.code_s = p.code_s');
       SQL.Add('AND s.Gruppa  = :g');
       SQL.Add('AND p.Data    = :d');
       SQL.Add('AND s.Familia = :f');
       Parameters.ParseSQL(SQL.Text,true);
       Parameters.ParamByName('v').Value:= ComboBox3.Text;       //вид пропуска
       Parameters.ParamByName('f').Value:= ComboBox1.Text;       //фамилия
       Parameters.ParamByName('g').Value:= ComboBox2.Text;       //группа
       Parameters.ParamByName('d').Value:= DateTimePicker1.Date; //дата
       Parameters.ParamByName('k').Value:= Edit1.Text; //количеставо часов


И тотже вопрос, на первом посте:

Объясните или покажите, как при вставке новой записи в таблицу сделать так чтобы эта запись относилась к записе в другой таблице...
Выбор по фамилии а не по Cod_s вот это у меня вызывает затруднение...

Хелпп!
Там SET не надо использовать два раза.
Код:
       SQL.Add('UPDATE propuski p, stud s');
       SQL.Add('SET p.Vid_propuska = :v ,');
       SQL.Add('p.Kol_vo_chas = :k');
       SQL.Add('WHERE s.code_s = p.code_s');
....
Ответить с цитированием
  #12  
Старый 24.05.2008, 09:48
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Сообщения: 227
Версия Delphi: Delphi 7
Репутация: 30
По умолчанию

Цитата:
Сообщение от Жулик
Подставил запрос предложениый тобой...

при выполнении запроса ругается на параметр :
"ADOQuery4:Parameter 'f' not found"

не могу понять что ему не нравится

Если что вот код:
Код:
procedure TForm4.FormCreate(Sender: TObject);
begin

    with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('ORDER BY s.familia');
         Open;
     end;


     with ADOQuery2 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT Familia FROM stud');
         SQL.Add('ORDER BY Familia');
         Open;
     end;
     ADOQuery2.First;
     While not ADOQuery2.Eof do begin
        ComboBox1.Items.Add(ADOQuery2.Fields[0].AsString);
        ADOQuery2.Next;
     end;
     
//---------------------------------------
     
     with ADOQuery3 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT Gruppa FROM grupp');
         SQL.Add('ORDER BY Gruppa');
         Open;
     end;
     ADOQuery3.First;
     While not ADOQuery3.Eof do begin
        ComboBox2.Items.Add(ADOQuery3.Fields[0].AsString);
        ADOQuery3.Next;
     end;


end;


procedure TForm4.Button1Click(Sender: TObject);
begin
  with ADOQuery4 do begin
       Close;
       SQL.Clear;
       SQL.Add('INSERT INTO propuski ( code_s, Data, Vid_propuska, Kol_vo_chas )');
       SQL.Add('VALUES  ( (SELECT Code_s FROM stud WHERE Familia = f ), :d, :v, :k)');

      
       Parameters.ParseSQL(SQL.Text,true);
       Parameters.ParamByName('v').Value:= ComboBox3.Text;         //вид пропуска
       Parameters.ParamByName('d').Value:= DateTimePicker1.Date;   //дата
       Parameters.ParamByName('k').Value:= Edit1.Text;             //количеставо часов
       Parameters.ParamByName('f').Value:= ComboBox1.Text;          //фамилия
       ExecSQL;

  end;

     with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('AND p.Data    = :d');
         SQL.Add('AND s.familia = :f');
         SQL.Add('ORDER BY s.familia');
         Parameters.ParseSQL(SQL.Text,true);
         Parameters.ParamByName('d').Value:= DateTimePicker1.Date;
         Parameters.ParamByName('f').Value:= ComboBox1.Text;
         Open;
     end;
     
end;

procedure TForm4.ComboBox1Enter(Sender: TObject);    //фамилия
  Var i:integer;
begin
   With ADOQuery5 do begin
       Close;
       SQL.Clear;
       SQL.Add('SELECT DISTINCT familia FROM stud');
       SQL.Add('WHERE Gruppa  LIKE '+quotedStr(ComboBox2.Text));
       SQL.Add('ORDER by familia');
       Open;
   end;
   ADOQuery5.First;
   ComboBox1.Items.Clear;
   While not ADOQuery5.eof do        //Заполняем ComboBox1
   begin
      ComboBox1.Items.Add(ADOQuery5.Fields[0].AsString);
      ADOQuery5.Next;
   end;

end;

procedure TForm4.Button2Click(Sender: TObject);   //показ всех пропусков
Var i:integer;
begin
   with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('ORDER BY s.familia, p.Date');
         Open;
     end;

end;

procedure TForm4.DateTimePicker1CloseUp(Sender: TObject);  //календарь

begin
   with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('AND p.Data    = :d');
         SQL.Add('ORDER BY s.familia');
         Parameters.ParseSQL(SQL.Text,true);
         Parameters.ParamByName('d').Value:= DateTimePicker1.Date;
         Open;
     end;

end;

Кто знает в чем ошибка, помогите Пажалуйста!
Двоеточие перед f не поставил
Ответить с цитированием
  #13  
Старый 24.05.2008, 10:52
Жулик Жулик вне форума
Прохожий
 
Регистрация: 16.04.2008
Сообщения: 21
Репутация: 5
По умолчанию

Цитата:
Сообщение от MegaPiha
Там SET не надо использовать два раза.

Двоеточие перед f не поставил

MegaPiha Cпасибо тебе !! за помощь!

Еще раз убеждаюсь, что бываю очень, ООчень невнимательный...

Но видимо это еще не конец...опять он ругается при нажатии на кнопку выполнеия запроса...Теперь говорит "Неопознаная ошибка" и ставит курсор на стороку такого содержаниия : " ExecSQL; "

Вместо ExecSQL; ставил Open; все равно ругается...

Последний раз редактировалось Жулик, 24.05.2008 в 20:40.
Ответить с цитированием
  #14  
Старый 24.05.2008, 22:30
Жулик Жулик вне форума
Прохожий
 
Регистрация: 16.04.2008
Сообщения: 21
Репутация: 5
Сообщение

Люди помогите, очень надо очень, после завтра уже отчитываться надо, а я всё не могу решить эту проблему, уйму литературы перерыл, нигде нет этого...

При на жатии на кнопку т.е. при выполнении запроса на добавление записи в таблицу происходит исключение (ошибка) такого плана, там написано :"исключение класса EOleException с сообщением 'Неопознаная ошибка'"

Вот полный код, жирным и красным цветом выделено место положения курсора при ошибке:

Код:
procedure TForm4.FormCreate(Sender: TObject);
begin

    with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('ORDER BY s.familia');
         Open;
     end;


     with ADOQuery2 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT Familia FROM stud');
         SQL.Add('ORDER BY Familia');
         Open;
     end;
     ADOQuery2.First;
     While not ADOQuery2.Eof do begin
        ComboBox1.Items.Add(ADOQuery2.Fields[0].AsString);
        ADOQuery2.Next;
     end;
     
//---------------------------------------
     
     with ADOQuery3 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT Gruppa FROM grupp');
         SQL.Add('ORDER BY Gruppa');
         Open;
     end;
     ADOQuery3.First;
     While not ADOQuery3.Eof do begin
        ComboBox2.Items.Add(ADOQuery3.Fields[0].AsString);
        ADOQuery3.Next;
     end;


end;


procedure TForm4.Button1Click(Sender: TObject);
begin
  with ADOQuery4 do begin
       Close;
       SQL.Clear;
       SQL.Add('INSERT INTO propuski ( code_s, Data, Vid_propuska, Kol_vo_chas )');
       SQL.Add('VALUES  ( (SELECT Code_s FROM stud WHERE Familia = :f ), :d, :v, :k)');

      
       Parameters.ParseSQL(SQL.Text,true);
       Parameters.ParamByName('v').Value:= ComboBox3.Text;         //вид пропуска
       Parameters.ParamByName('d').Value:= DateTimePicker1.Date;   //дата
       Parameters.ParamByName('k').Value:= Edit1.Text;             //количеставо часов
       Parameters.ParamByName('f').Value:= ComboBox1.Text;          //фамилия
       ExecSQL;

  end;

     with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('AND p.Data    = :d');
         SQL.Add('AND s.familia = :f');
         SQL.Add('ORDER BY s.familia');
         Parameters.ParseSQL(SQL.Text,true);
         Parameters.ParamByName('d').Value:= DateTimePicker1.Date;
         Parameters.ParamByName('f').Value:= ComboBox1.Text;
         Open;
     end;
     
end;

procedure TForm4.ComboBox1Enter(Sender: TObject);    //фамилия
  Var i:integer;
begin
   With ADOQuery5 do begin
       Close;
       SQL.Clear;
       SQL.Add('SELECT DISTINCT familia FROM stud');
       SQL.Add('WHERE Gruppa  LIKE '+quotedStr(ComboBox2.Text));
       SQL.Add('ORDER by familia');
       Open;
   end;
   ADOQuery5.First;
   ComboBox1.Items.Clear;
   While not ADOQuery5.eof do        //Заполняем ComboBox1
   begin
      ComboBox1.Items.Add(ADOQuery5.Fields[0].AsString);
      ADOQuery5.Next;
   end;

end;

procedure TForm4.Button2Click(Sender: TObject);   //показ всех пропусков
Var i:integer;
begin
   with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('ORDER BY s.familia, p.Date');
         Open;
     end;

end;

procedure TForm4.DateTimePicker1CloseUp(Sender: TObject);  //календарь

begin
   with ADOQuery1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT p.data, s.code_s, p.Code_p, s.Gruppa, s.Familia, s.Ima, s.Ochestvo, p.vid_Propuska, p.Kol_vo_chas' );
         SQL.Add('FROM stud s, propuski p');
         SQL.Add('WHERE s.code_s = p.code_s');
         SQL.Add('AND p.Data    = :d');
         SQL.Add('ORDER BY s.familia');
         Parameters.ParseSQL(SQL.Text,true);
         Parameters.ParamByName('d').Value:= DateTimePicker1.Date;
         Open;
     end;

end;

Может кто сталкивался с такой проблемой, прошу подскажите пажалуйста!

Последний раз редактировалось Жулик, 24.05.2008 в 22:36.
Ответить с цитированием
  #15  
Старый 24.05.2008, 22:37
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Сообщения: 227
Версия Delphi: Delphi 7
Репутация: 30
По умолчанию

Пробовал код, ту же ошибку пишет. Если убрать из текста Select и заменить числом то все нормально. Не догоняю в чем дело. Единственное могу предложить добавлять запись не через запрос, а простым путем.

Код:
var s:integer;
begin
s:=StrToInt(edit1.Text);
 With form1 do begin
    ADOTable3.insert;
    ADOTable1.Locate('familia',comboBox1.Text,[]);
    ADOTable3.FieldByName('Code_s').AsInteger:=Form1.ADOTable1.fieldByName('Code_s').AsInteger;
    ADOTable3.FieldByName('Data').AsDateTime:=DateTimePicker1.Date;
    ADOTable3.FieldByName('Vid_Propuska').AsString := ComboBox3.Text;
    ADOTable3.FieldByName('Kol_vo_chas').AsInteger := S;
    ADOTable3.Post;
Переменную s использую, т.к. по необъяснимым для меня причинам вылетает ошибка если StrToInt(edit1.Text) вставить сразу в строку записи значения в поле kol_vo_chas.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter