![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всех ПРИВЕТСТВУЮ!!!!!
У меня возникло две проблемы в разроботке приложения (АРМ)! Использую бд 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
|
|||
|
|||
|
Кто-нибуть помогите!!!!!!!!!!!!!
Я не могу сделать вставку записи в таблицу Propuski, чтобы эта запись относилась к Студенту из таблицы Stud! эти таблицы связаны по полю Code_s т.е. таблица Stud главная а таблица Propuski дочерняя звязь между ними 1:М (один ко многим) т.е. студент один а пропусков у него много! Вот я и не знаю как должен выглядить Sql запрос, чтобы запись в таблице Propuski относилась к нужному студенту из таблицы Stud! Есть предположения, что нужно отталкиваться от поля Code_s, но я не знаю как преобразовать значение поля Familia (выбор производится по фамилии) в его код Code_s, а потом уже просто указать его значение в запросе! С редактированием тоже самое! Помогите очень нужно!! Скоро сдавать нароботки а я никак не могу решить эти две проблемы ![]() |
|
#3
|
|||
|
|||
|
Цитата:
Т.е. сперва в ComиoBox2 выбирается группа, в ComboBox1 - студент этой группы, а потом заполнить соответствующие поля в таблице propuski и сохранить? |
|
#4
|
|||
|
|||
|
Выложи что наработал и саму базу, если небольшая.
|
|
#5
|
|||
|
|||
|
Цитата:
Да, почти так! А в идеале еще нужна дата, которая выберается в календаре, по ней идет отбор всех записей в таблицы propuski затем эти отобранные данные опять отбираются теперь по группе (в ComboBox2 список групп из отобранного списка по дате) и идет следующий отбор по фамилии студента (в ComboBox1 список фамилий из выбранной группы и из таблицы propiski т.е. если о студенте нет записи в отобранном списке по дате, следовательно он не пропускал в этот день и его фамилия не дедолжна быть в ComboBox1 ) Последний раз редактировалось Жулик, 22.05.2008 в 21:40. |
|
#6
|
|||
|
|||
|
Вот кое что сделал.
|
|
#7
|
|||
|
|||
|
Цитата:
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
|
|||
|
|||
|
Сегодня съездил к руковолителю, убедил его, в том что в редактировании количества часов нет смысла, так что первый вопрос с предыдущего поста снимается!!!
НО остался вопрос о внесении нового пропуска в БД, т.е. о вставке записи в таблицу 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
|
|||
|
|||
|
Код:
INSERT INTO TABLE1 (..., ParentID, ...) VALUES (...,(SELECT ID FROM TABLE2 WHERE Name = 'Имя'),...) Не подойдет? Вместо строковой константы можно использовать параметр. только надо учесть, что ID второй таблицы должен быть уникален (фактически, будет лучше всего, если он будет первичным ключем), иначе запрос будет ругаться. |
|
#10
|
|||
|
|||
|
Цитата:
Подставил запрос предложениый тобой... при выполнении запроса ругается на параметр : "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
|
|||
|
|||
|
Цитата:
Код:
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
|
|||
|
|||
|
Цитата:
|
|
#13
|
|||
|
|||
|
Цитата:
MegaPiha Cпасибо тебе !! за помощь! Еще раз убеждаюсь, что бываю очень, ООчень невнимательный... Но видимо это еще не конец...опять он ругается при нажатии на кнопку выполнеия запроса...Теперь говорит "Неопознаная ошибка" и ставит курсор на стороку такого содержаниия : " ExecSQL; " Вместо ExecSQL; ставил Open; все равно ругается... ![]() Последний раз редактировалось Жулик, 24.05.2008 в 20:40. |
|
#14
|
|||
|
|||
|
Люди помогите, очень надо очень, после завтра уже отчитываться надо, а я всё не могу решить эту проблему, уйму литературы перерыл, нигде нет этого...
При на жатии на кнопку т.е. при выполнении запроса на добавление записи в таблицу происходит исключение (ошибка) такого плана, там написано :"исключение класса 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
|
|||
|
|||
|
Пробовал код, ту же ошибку пишет. Если убрать из текста 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; |