Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.01.16;
Скачать: [xml.tar.bz2];

Вниз

INSERT INTO table поля из двух других связанных таблиц   Найти похожие ветки 

 
Первокурсница ©   (2010-10-24 14:29) [0]

Здравствуйте.
Клиентское приложение для больницы.
БД:
Таблица 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 14:50) [1]

Почему в строковой конкатенации используется 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.


 
Юрий Зотов ©   (2010-10-24 14:53) [2]

Кстати, очень неплохая учебная задачка, тем более для первого курса.

Или Вы уже не на первом?
:o)


 
Первокурсница ©   (2010-10-24 14:54) [3]

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:55) [4]

На первом я пока что :(


 
MonoLife ©   (2010-10-24 15:20) [5]


> Первокурсница ©   (24.10.10 14:54) [3]

используйте параметры
> Первокурсница ©   (24.10.10 14:55) [4]
>
> На первом я пока что :(
>

до сих пор


 
Юрий Зотов ©   (2010-10-24 15:25) [6]

> Первокурсница ©   (24.10.10 14:54) [3]

Создайте временную форму с Memo, в этот Memo выведите получившийся текст ADOQuery4.SQL и проверьте его.

А лучше все-таки использовать параметры.


 
Первокурсница ©   (2010-10-24 15:35) [7]

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


 
sniknik ©   (2010-10-24 15:38) [8]

> до сих пор
сколько лет? судя по тому, что уже 2 месяца вопросы задаешь уровня "ниже плинтуса".

> ADOQuery4.SQL.Add("VALUES("+Doctor.FieldByName("ID_Doctor").AsString+
покажи объявление переменной Doctor в коде.


 
sniknik ©   (2010-10-24 15:40) [9]

> всё строго по методичке
врать не надо.

> Проверка показала то же самое - таблицу принимает за неизвестную переменную.
база это не дельфи код...


 
Первокурсница ©   (2010-10-24 15:47) [10]

Вам методичку показать? :)
Вспомните что вы проходили на 1ом курсе в институте? Скажете Дельфи+БД? Врать не надо, максимум паскаль :) Вы лекции писали? А мы их не пишем, нам дали методичку с задачами и сказали что мин.обр. выпустило указ "80% программы на самостоятельное изучение" :)
Переменная Doctor - это не переменная, а таблица базы данных.


 
Юрий Зотов ©   (2010-10-24 15:58) [11]

> Первокурсница ©   (24.10.10 15:47) [10]

> Переменная Doctor - это не переменная, а таблица базы данных.

Которую компилятор не знает. Чему же удивляться?


 
sniknik ©   (2010-10-24 16:00) [12]

> Вам методичку показать? :)
обязательно. то место где про запрет использования параметров.

> Скажете Дельфи+БД?
скажу что - паскаль, лисп, пролог и фокспро. лисп, пролог факультативно (за зачет), паскаль, фокспро нормально (за курсовые + экзамен).

> Врать не надо, максимум паскаль :)
на паскале базу написать посложнее будет... и ведь писали. Дельфи+БД просто отдых по сравнению с этим.

> Вы лекции писали?
были, но давали выбор (препод понимающий попался) - кто хочет самостоятельно "на компе" может использовать их время, но спрашивать с таких будут "вдвойне". я использовал.

> нам дали методичку с задачами и сказали что мин.обр. выпустило указ "80% программы на самостоятельное изучение" :)
счастье то какое нынче. а нам приходилось прогуливать, разную обязательную муру, чтобы самостоятельно позаниматься... (а по "муре" экзамены, которые никто не отменял)

> Переменная Doctor - это не переменная, а таблица базы данных.
> база это не дельфи код...


 
Первокурсница ©   (2010-10-24 16:06) [13]

Тогда Вам надо  не методичку показывать, а с преподом знакомиться,именно он у нас яростный противник параметров)
Ну раз все всё писали и Дельфи для Вас отдых то почему бы не подсказать? Я в курсе что это не дельфи код, но из этого недельфикода мне нужно выдрать поле, мне никто не объяснял как это делать, поэтому и спрашиваю у знающих людей :)


 
sniknik ©   (2010-10-24 16:16) [14]

> то почему бы не подсказать?
во первых я подсказал, фактически носом ткнул в причину. после причины других вопросов не было, жалобы на методичку и плохого препода это не вопросы.

а вод подсказку в виде кода для копипаста... не...
не нравится твой подход к учебе.
и игнорирование моих советов тоже, я вот тебе про ADODataSet в прошлых твоих постах вроде говорил. и?... что вижу, опять ADOQuery.
был бы у тебя прогресс, и был бы вопрос который трудно объяснить, если не кодом, другое дело. а так нет, спасибо не надо (в смысле за спасибо репетиторствовать не буду).


 
Первокурсница ©   (2010-10-24 16:19) [15]

Спасибо, хотя не знаю за что


 
Игорь Шевченко ©   (2010-10-24 16:49) [16]

нафиг оно тебе, это программирование ?


 
Первокурсница ©   (2010-10-24 17:06) [17]

Я вообще мечтала пойти учиться на юриста, но в нашем городе  в этот вуз можно поступить только предварительно заплатив 254 000 рублей начальнику либо если у тебя папа хотя бы подполковник милиции или прокурор. Семья у нас нищая, папа мой алкоголик, развёлся с мамой когда я ещё пешком под стол ходила, щас живёт на украине, алиментов я ни разу не видела. ЕГЭ сдала на четвёрки, в платный вуз пойти возможности нету, на бесплатное отделение поступить смогла только на факультет программирования, там как раз требовались 4 по егэ.

З.Ы,: щас начнутся недовольные возгласы "не пытайся нас разжалобить, мы всё равно не будем тебе помогать!, врать не надо, ты на самом деле богатая и счастливая, те просто делать нефиг, вот ты и тревожишь наш покой!", хех:) Да не хотите помогать-ну и не надо, не хотите верить-ну и не верьте :)
Вы ненавидите и презираете друг друга и эта взаимная ненависть - единственное, что делает вас целым. До какого каления вас нужно довести, чтоб в других вы увидели наконец себя? Чтоб вместо "я" и "они" сказали наконец "мы"? Вам это не обьяснили в прайм-тайм по будням на главном канале?
Вам посоветовали быть уникальным и культивировать свою непохожесть, верно? Так продолжайте, будьте оригинальны, станьте чемпионом по пролежням в своем отделе, получите Оскар за лучшую имитацию оргазма, кидайте партнеров на бабки, перегрызите друг другу глотки в спорах...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.005 c
2-1287986449
Irisss
2010-10-25 10:00
2011.01.16
Компилятор игнорирует Breakpoint


2-1287467671
ixen
2010-10-19 09:54
2011.01.16
Подскажите как написать триггер...


2-1287417521
кроссман
2010-10-18 19:58
2011.01.16
Выделить строку в listbox


15-1285581726
Baks
2010-09-27 14:02
2011.01.16
Как определить русифицирована windows или нет?


15-1285872027
Сергей М.
2010-09-30 22:40
2011.01.16
qooXdoo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский