![]() |
|
|
Регистрация | << Правила форума >> | 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; |