![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
INSERT INTO table поля из двух других связанных таблиц
Первокурсница © (2010-10-24 14:29:00)Здравствуйте.
Клиентское приложение для больницы.
БД:
Таблица Doctor:
ID_Doctor (счётчик, первичный ключ)
D_Sname (текст)
D_Name (текст)
D_PhName (текст)
Special (текст)
D_KontPhone (текст)
KabNum (текст)
Graph (мемо)
Таблица Pаtient:
ID_Patient (счётчик, первичный ключ)
P_Sname (текст)
P_Name (текст)
P_PhName (текст)
Sity (текст)
Street (текст)
Home (текст)
Kv (текст)
birdts_year (текст)
birdts_day (текст)
P_Kont_Phone (текст)
Таблица Recept:
ReceptKey (счётчик, первичный ключ)
ID_Visit (числовой)
ReceptCode (текст)
Medicaments (мемо)
Таблица Visit:
ID_Doctor (числовой)
ID_Patient (числовой)
ID_Visit (счётчик, первичный ключ)
VisitDate (текст)
VisitTime (текст)
Resultat (текст)
Symptoms (мемо)
Diagnos (мемо)
Doctor связана с Visit (1-N) по полям ID_Doctor
Visit связана с Patient (N-1) по полям ID_Patient
Visit связана с Recept (1-N) по полям ID_Visit
В Delphi клиентское приложение которое позволяет докторам вносить в таблицу Visit (в Акцесс) данные о дате и времени приёма, симптомы заболевания и диагноз, а в таблицу Recept (в Акцесс) код рецепта и выписанное пациенту лекарство. Заносятся все эти данные с помощью Edit и Memo которые расположены на форме. Также на форме расположены две DBGrid - с фио пациентов (Patient) и фио врачей (Doctor). Врач щелкает на ячейке с фамилией пациента, затем на ячейке с фамилией врача, вносит все необходимые данные в Editы и Memo, жмёт кнопку "Зарегистрировать приём" - и данные об этом пациенте и враче и болезнях отправляются в Акцесс в таблицу Visit, жмёт кнопку "Сформировать рецепт" - и данные об этом визите и лекарства отправляются в Акцесс в таблицу Recept.
Вот программа:
unit LAB8Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, Buttons, Grids, DBGrids;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
DBGrid1: TDBGrid;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit2: TEdit;
Label8: TLabel;
Edit3: TEdit;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Edit4: TEdit;
Memo1: TMemo;
Label12: TLabel;
Memo2: TMemo;
Label13: TLabel;
Memo3: TMemo;
Label14: TLabel;
Label15: TLabel;
Memo4: TMemo;
DBGrid2: TDBGrid;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
ADOQuery2: TADOQuery;
DataSource2: TDataSource;
ADOQuery3: TADOQuery;
DataSource3: TDataSource;
ADOQuery4: TADOQuery;
DataSource4: TDataSource;
ADOQuery5: TADOQuery;
DataSource5: TDataSource;
ComboBox1: TComboBox;
procedure FormActivate(Sender: TObject);
procedure DBGrid2CellClick(Column: TColumn);
procedure DBGrid1CellClick(Column: TColumn);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
ADOQuery1.Active:=False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT D_Sname, D_Name, D_PhName, Special, D_KontPhone, KabNum,Graph');
ADOQuery1.SQL.Add('FROM Doctor');
ADOQuery1.Open;
ADOQuery1.FieldByName('Graph').Visible:=false;
ADOQuery4.Active:=False;
ADOQuery4.SQL.Clear;
ADOQuery4.SQL.Add('SELECT P_Sname, P_Name, P_PhName, birdts_year, birdts_day, Sity, Street, Home, Kv, P_Kont_Phone');
ADOQuery4.SQL.Add('FROM Patient');
ADOQuery4.Open;
ADOQuery4.FieldByName('Sity').Visible:=false;
ADOQuery4.FieldByName('Street').Visible:=false;
ADOQuery4.FieldByName('Home').Visible:=false;
ADOQuery4.FieldByName('Kv').Visible:=false;
ADOQuery4.FieldByName('P_Kont_Phone').Visible:=false;
end;
procedure TForm1.DBGrid2CellClick(Column: TColumn);
begin
Memo4.Lines.Add(ADOQuery4.FieldByName('Sity').AsString) ;
Memo4.Lines.Add(ADOQuery4.FieldByName('Street').AsString);
Memo4.Lines.Add(ADOQuery4.FieldByName('Home').AsString);
Memo4.Lines.Add(ADOQuery4.FieldByName('Kv').AsString);
Memo4.Lines.Add(ADOQuery4.FieldByName('P_Kont_Phone').AsString);
Label5.Caption:=ADOQuery4.FieldByName('P_Sname').AsString+' '+ADOQuery4.FieldByName('P_Name').AsString+' '+ADOQuery4.FieldByName('P_PhName').AsString;
end;
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
ADOQuery2.Active:=False;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('SELECT Graph');
ADOQuery2.SQL.Add('FROM Doctor');
ADOQuery2.Active:=True;
Label4.Caption:=ADOQuery1.FieldByName('D_Sname').AsString+' '+ADOQuery1.FieldByName('D_Name').AsString+' '+ADOQuery1.FieldByName('D_PhName').AsString;
Edit1.Text:=ADOQuery1.FieldByName('Graph').AsString;
end;
procedure TForm1.BitBtn1Click(Sender: TObject); {зарегистрировать приём}
begin
ADOQuery4.Active:=False;
ADOQuery4.SQL.Clear;
ADOQuery4.SQL.Add('INSERT INTO Visit');
ADOQuery4.SQL.Add('ID_Doctor, ID_Patient, VisitDate, VisitTime,Resultat,Symptoms,Diagnos');
ADOQuery4.SQL.Add('VALUES('+Doctor.FieldByName('ID_Doctor').AsInteger+', '+Patient.FieldByName('ID_Patient').AsInteger+','+'"'+Edit2.Text+'", "'+Edit3.Text+'", "'+ComboBox1.Text+'", "'+Memo1.Lines.Text+'", "'+Memo2.Lines.Text+'")');
ADOQuery4.ExecSQL;
end;
end.
На данном этапе подсвечивается Строка ADOQuery4.SQL.Add('VALUES('+Doctor.FieldByName('ID_Doctor'), ошибка "неизвестная переменная". Как занести в таблицу Visit правильно и айди врача, и айди пациента и всё что доктор прописал?
Первокурсница (2010-10-24 17:06:00) [1]Я вообще мечтала пойти учиться на юриста, но в нашем городе в этот вуз можно поступить только предварительно заплатив 254 000 рублей начальнику либо если у тебя папа хотя бы подполковник милиции или прокурор. Семья у нас нищая, папа мой алкоголик, развёлся с мамой когда я ещё пешком под стол ходила, щас живёт на украине, алиментов я ни разу не видела. ЕГЭ сдала на четвёрки, в платный вуз пойти возможности нету, на бесплатное отделение поступить смогла только на факультет программирования, там как раз требовались 4 по егэ.
З.Ы,: щас начнутся недовольные возгласы "не пытайся нас разжалобить, мы всё равно не будем тебе помогать!, врать не надо, ты на самом деле богатая и счастливая, те просто делать нефиг, вот ты и тревожишь наш покой!", хех:) Да не хотите помогать-ну и не надо, не хотите верить-ну и не верьте :)
Вы ненавидите и презираете друг друга и эта взаимная ненависть - единственное, что делает вас целым. До какого каления вас нужно довести, чтоб в других вы увидели наконец себя? Чтоб вместо "я" и "они" сказали наконец "мы"? Вам это не обьяснили в прайм-тайм по будням на главном канале?
Вам посоветовали быть уникальным и культивировать свою непохожесть, верно? Так продолжайте, будьте оригинальны, станьте чемпионом по пролежням в своем отделе, получите Оскар за лучшую имитацию оргазма, кидайте партнеров на бабки, перегрызите друг другу глотки в спорах...
Игорь Шевченко (2010-10-24 16:49:00) [2]нафиг оно тебе, это программирование ?
Первокурсница (2010-10-24 16:19:00) [3]Спасибо, хотя не знаю за что
sniknik (2010-10-24 16:16:00) [4]> то почему бы не подсказать?
во первых я подсказал, фактически носом ткнул в причину. после причины других вопросов не было, жалобы на методичку и плохого препода это не вопросы.
а вод подсказку в виде кода для копипаста... не...
не нравится твой подход к учебе.
и игнорирование моих советов тоже, я вот тебе про ADODataSet в прошлых твоих постах вроде говорил. и?... что вижу, опять ADOQuery.
был бы у тебя прогресс, и был бы вопрос который трудно объяснить, если не кодом, другое дело. а так нет, спасибо не надо (в смысле за спасибо репетиторствовать не буду).
Первокурсница (2010-10-24 16:06:00) [5]Тогда Вам надо не методичку показывать, а с преподом знакомиться,именно он у нас яростный противник параметров)
Ну раз все всё писали и Дельфи для Вас отдых то почему бы не подсказать? Я в курсе что это не дельфи код, но из этого недельфикода мне нужно выдрать поле, мне никто не объяснял как это делать, поэтому и спрашиваю у знающих людей :)
sniknik (2010-10-24 16:00:00) [6]> Вам методичку показать? :)
обязательно. то место где про запрет использования параметров.
> Скажете Дельфи+БД?
скажу что - паскаль, лисп, пролог и фокспро. лисп, пролог факультативно (за зачет), паскаль, фокспро нормально (за курсовые + экзамен).
> Врать не надо, максимум паскаль :)
на паскале базу написать посложнее будет... и ведь писали. Дельфи+БД просто отдых по сравнению с этим.
> Вы лекции писали?
были, но давали выбор (препод понимающий попался) - кто хочет самостоятельно "на компе" может использовать их время, но спрашивать с таких будут "вдвойне". я использовал.
> нам дали методичку с задачами и сказали что мин.обр. выпустило указ "80% программы на самостоятельное изучение" :)
счастье то какое нынче. а нам приходилось прогуливать, разную обязательную муру, чтобы самостоятельно позаниматься... (а по "муре" экзамены, которые никто не отменял)
> Переменная Doctor - это не переменная, а таблица базы данных.
> база это не дельфи код...
Юрий Зотов (2010-10-24 15:58:00) [7]> Первокурсница © (24.10.10 15:47) [10]
> Переменная Doctor - это не переменная, а таблица базы данных.
Которую компилятор не знает. Чему же удивляться?
Первокурсница (2010-10-24 15:47:00) [8]Вам методичку показать? :)
Вспомните что вы проходили на 1ом курсе в институте? Скажете Дельфи+БД? Врать не надо, максимум паскаль :) Вы лекции писали? А мы их не пишем, нам дали методичку с задачами и сказали что мин.обр. выпустило указ "80% программы на самостоятельное изучение" :)
Переменная Doctor - это не переменная, а таблица базы данных.
sniknik (2010-10-24 15:40:00) [9]> всё строго по методичке
врать не надо.
> Проверка показала то же самое - таблицу принимает за неизвестную переменную.
база это не дельфи код...
sniknik (2010-10-24 15:38:00) [10]> до сих пор
сколько лет? судя по тому, что уже 2 месяца вопросы задаешь уровня "ниже плинтуса".
>ADOQuery4.SQL.Add('VALUES('+ Doctor.FieldByName('ID_Doctor').AsString+
покажи объявление переменной Doctor в коде.
Первокурсница (2010-10-24 15:35:00) [11]Параметры нельзя использовать, всё строго по методичке, шаг вправо, шаг влево-расстрел. Проверка показала то же самое - таблицу принимает за неизвестную переменную.
Юрий Зотов (2010-10-24 15:25:00) [12]> Первокурсница © (24.10.10 14:54) [3]
Создайте временную форму с Memo, в этот Memo выведите получившийся текст ADOQuery4.SQL и проверьте его.
А лучше все-таки использовать параметры.
MonoLife (2010-10-24 15:20:00) [13]
> Первокурсница © (24.10.10 14:54) [3]
используйте параметры
> Первокурсница © (24.10.10 14:55) [4]
>
> На первом я пока что :(
>
до сих пор
Первокурсница (2010-10-24 14:55:00) [14]На первом я пока что :(
Первокурсница (2010-10-24 14:54:00) [15]
ADOQuery4.SQL.Add('VALUES('+Doctor.FieldByName('ID_Doctor').AsString+', '+Patient.FieldByName('ID_Patient').AsString+','+'"'+Edit2.Text+'", "'+Edit3.Text+'", "'+ComboBox1.Text+'", "'+Memo1.Lines.Text+'", "'+Memo2.Lines.Text+'")');
Та же самая ошибка, неизвестная переменная. Схему данных не я придумывала, она указана в методичке, и отклоняться от неё запрещено :(
Юрий Зотов (2010-10-24 14:53:00) [16]Кстати, очень неплохая учебная задачка, тем более для первого курса.
Или Вы уже не на первом?
:o)
Юрий Зотов (2010-10-24 14:50:00) [17]Почему в строковой конкатенации используется AsInteger? Наверное, надо использовать или AsString, или параметры.
Ну и:
> Doctor связана с Visit (1-N) по полям ID_Doctor
> Visit связана с Patient (N-1) по полям ID_Patient
К одному доктору могут прийти несколько пациентов. Один пациент может прийти к нескольким докторам. Значит, напрашивается: Doctor связана с Patient через Visit (N-N) по полям ID_Doctor и ID_Patient.
Кроме того, один пациент может прийти к одному доктору несколько раз. Это разруливается через поле ID_Visit таблицы Visit.