Поиск:

Ответ в темуСоздание новой темы Создание опроса
> INSERT INTO table поля из двух других связанных та 
:(
    Опции темы
ulala
  Дата 24.10.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 28.10.2009

Репутация: нет
Всего: -1



Здравствуйте.
Клиентское приложение для больницы.
БД:
Таблица 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);
    procedure BitBtn2Click(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).AsString+, +Patient.FieldByName(ID_Patient).AsString+,'+'"'+Edit2.Text+'", "'+Edit3.Text+'", "'+ComboBox1.Text+'", "'+Memo1.Lines.Text+'", "'+Memo2.Lines.Text+'")');
ADOQuery4.ExecSQL;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);  {сформировать рецепт}
begin
ADOQuery1.Active:=False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Recept');
ADOQuery1.SQL.Add('(ID_Visit, ReceptCode, Medicaments)');
ADOQuery1.SQL.Add('VALUES(+Visit.FieldByName(ID_Visit).AsString+, '+'"'+Edit4.Text+'", "'+Memo1.Lines.Text+'")');
ADOQuery1.ExecSQL;
end;

end.

Вылетает с ошибкой Ошибка синтаксиса (пропущен оператор) в выражении запроса +Doctor.FieldByName(ID_Doctor).AsString+.
Как занести в таблицы Visit и Recept правильно и айди врача, и айди пациента и всё что доктор прописал? 

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  _______________.zip 436,09 Kb
PM MAIL   Вверх
Antimol
Дата 24.10.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 28.7.2007
Где: Украина, Киев

Репутация: 4
Всего: 4



1. В ADOConnection есть свойство LoginPrompt, которое отвечает за ввод пароля при запуске программы, поставь значение false;

2. Оно вообще компилировалось?

Код

SQL.Add('VALUES("'+Edit2.Text+'", "'+Edit3.Text+'", "'+ComboBox1.SelText+'", "'+Memo1.Lines+'", "'+Memo2.Lines+'", "'+Memo3.Lines+'");

[DCC Error] LAB8Unit1.pas(114): E2010 Incompatible types: 'string' and 'TStrings'

3. Для выполнения запросов Insert, Update, Delete я бы создал отдельный ADOQuery и выполнял все это через него, В пример: ADOQuery4 - выполнил запрос и информация о пациенте исчезла, нужно о5 выполнять запрос на выбор всех пациентов.

4. Добавить какоето сообщение что запрос выполнился/ или не выполнился

5. 
Код

INSERT INTO Visit ID_Doctor,.......

Перечень полей, которые  будут заполняться должны содержаться в скобках :

Код

INSERT INTO Visit(ID_Doctor,ID_Patient,VisitDate, VisitTime,Resultat,Symptoms,Diagnos)......


6. Что за конструкция такая интересная, может я плохо знаю SQL или забыл что то но первый раз встречаю такое:

Код

ADOQuery4.SQL.Add('INSERT INTO Visit');
ADOQuery4.SQL.Add('VisitDate, VisitTime,Resultat,Symptoms,Diagnos');
ADOQuery4.SQL.Add('VALUES("'+Edit2.Text+'", "'+Edit3.Text+'", "'+ComboBox1.SelText+'", "'+Memo1.Lines+'", "'+Memo2.Lines+'", "'+Memo3.Lines+'");
ADOQuery4.SQL.Add('WHERE (D.ID_Doctor=V.ID_Doctor) AND P.ID_Patient=V.ID_Patient');

Что за WHERE и откуда взялись талицы: D,V

7. Можно для отображения использовать ADOTable (если на нем нажать 2 раза - появится окно в котором можно добавить поля) а для того чтобы не отображать все поля в DBGrid нужно 2 раза кликнуть на него и нажать кнопку "ADD All Fields" после чего можно управлять свойствами полей, например както обозвать или отобразить его или нет.

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

Это при регистрации приема:
Код

procedure TForm1.BitBtn1Click(Sender: TObject); {зарегистрировать приём}
var
  query:string;
begin
  with ADOQuery6 do
  begin
    query:='INSERT INTO Visit(ID_Doctor,ID_Patient,VisitDate, VisitTime,Resultat,Symptoms,Diagnos)' +
         'VALUES(:ID_Doctor,:ID_Patient,:VisitDate,:VisitTime,:Resultat,:Symptoms,:Diagnos)';
    SQL.Text:=query;

    Parameters.ParamByName('ID_Doctor').Value:='ID доктора';
    Parameters.ParamByName('ID_Patient').Value:='ID пациента';
    Parameters.ParamByName('VisitDate').Value:=Edit2.Text;
    Parameters.ParamByName('VisitTime').Value:=Edit3.Text;
    Parameters.ParamByName('Resultat').Value:=ComboBox1.SelText;
    Parameters.ParamByName('Symptoms').Value:=Memo1.Text;
    Parameters.ParamByName('Diagnos').Value:=Memo2.Text;
    ExecSQL;
  end;
end;


Да, только что заметил код в архиве не соответствует коду, который размещен на странице.


строка 115:
Код

Doctor.FieldByName(ID_Doctor).AsString

Это поле из баьлицы Doctor, иначе можно было записать (это для понимания)
Код

AdoTable1.FieldByName(ID_Doctor).AsString






--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.