• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Большая работа (клиентское приложение для больницы)

  • Автор темы Guest
  • Дата начала
G

Guest

Всем Привет! :)
У меня задание создать клиентское положение для больницы. Программа сложная, трудности начались с самого начала :( Возможно вопросов будет много. Но пока что только 1.
По щелчку в DBGrid (там отображается ФИО пациентов) в Memo должен отображаться адрес и телефон этого пациента.
Вот
Код:
procedure TForm1.DBGrid2CellClick(Column: TColumn);
begin
ADOQuery5.Active:=False;
ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('SELECT * FROM Patient');
ADOQuery5.Open;
ADOQuery5.Active:=True;
Memo4.Lines.Add(ADOQuery5.FieldByName('Sity').AsString);
Memo4.Lines.Add(ADOQuery5.FieldByName('Street').AsString);
Memo4.Lines.Add(ADOQuery5.FieldByName('Home').AsString);
Memo4.Lines.Add(ADOQuery5.FieldByName('Kv').AsString);
Memo4.Lines.Add(ADOQuery5.FieldByName('P_Kont_Phone').AsString);
end;
Но у меня отображается в Memo только запись которая в акцессе в таблице первая записана. А их там 25 штук разных адресов, при каждом щелчке на другом пациенте должен отбражаться его адрес. Что делать ? :)
 
D

DarkKnight

Для начало тебе нужно реализовать реляционный подход к данным....
Тоесть у нас есть, для примера, таблица ПАЦИЕНТЫ (КОД ПАЦИЕНТА,Фио, дата рождение, ну и что-то еще), и есть вторая таблица ДОП ИНФО (КОД ПАЦИЕНТА, паспортные данные, АДРЕС, ТЕЛЕФОН)
Связь между этими двумя таблицами будет осуществлятся по полю КОД ПАЦИЕНТА, и будет она как ОДИН-К-ОДНОМУ (Каждой записи таблицы ПАЦИЕНТЫ будет соответствовать только одна запись в таблице ДОП ИНФО)

Вообщем реализуешь принцип работы как Master-Detal (ПАЦИЕНТЫ - Master, ДОП ИНФО - Detal) Как реализовывать это в DataSourcы знаешь??? Если нет напишишь я расскажу...
Вообщем когда мы это все сделаем, при перемещение по таблиц ПАЦИЕНТЫ, мы будем автоматом перемещаться по таблицы ДОП ИНФО
принцип будет такой, как только текущим стал КОД ПАЦИЕНТА, делается запрос SELECT * FROM ДОП_ИНФО WHERE ДОП_ИНФО.КОД_ПАЦИЕНТА = ПАЦИЕНТЫ.КОД_ПАЦИЕНТА (Это все за тебя уже сделают компаненты)

А насчет самого TMEMO, то будет лучше использоват TDBMEMO, которое будет связанно с вычисляемым полем типа (City + Street + Home + Kv + P_Kont_Phone)
так будет граммотнее и не так громозко.
 
G

Guest

С этим справились. Настигла ещё одна проблема. По заданию нужно заносить из Edit'ов и Memo'в в таблицу в Акцессе всё что доктор туда напишет, а также ID доктора и пациента. В БД 4 связанные таблицы (на картинке схема данных).
Как с ними работать мне никто не объяснял, погуглила, кое-что нашла, но конечно же ничего не работает. :welcome:
Вот что у меня примерно получилось:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject); {зарегистрировать приём}
begin
ADOQuery4.Active:=False;
ADOQuery4.SQL.Clear;
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');
ADOQuery4.ExecSQL;
end;
Подсвечивает
Код:
"'+Memo1.Lines+'"
, говорит "Incompatible types: 'String' and 'TStrings' ". А у меня там ещё и ComboBox... ;) Как эту процедуру правильно записать?

Добавлено: Схема данных
 

Вложения

  • shema.png
    shema.png
    6,9 КБ · Просмотры: 533
G

Guest

Архив
 

Вложения

  • _______________.rar
    338 КБ · Просмотры: 185
D

DarkKnight

Подсвечивает "'+Memo1.Lines+'", говорит "Incompatible types: 'String' and 'TStrings' ". А у меня там ещё и ComboBox... Как эту процедуру правильно записать?
Просто TMemo::Lines - это строковый массив ))) Вот у тебя и проблема, обращайся по индексу строки
Memo1.Lines[0].Text - первая строка и так далее :)

Добавлено: Щас через часик гляну архив :)
Пока могу сразу сказать в TADOConnection свойство LoginPromt - поставь в false, а то этот диалог про логин и пароль тебя докол*цензура* :)
 
G

Guest

Блин, невнимательность моя :welcome:
Сделала, запустилось, но теперь ругается "ошибка синтаксиса в инструкции INSERT INTO"
Это наверняка изза связей, вот изза этого:
Код:
ADOQuery4.SQL.Add('WHERE (D.ID_Doctor=V.ID_Doctor) AND P.ID_Patient=V.ID_Patient');
;)
 
D

DarkKnight

Напиши запрос полностью :) Прям все строки
 
G

Guest

Код:
ADOQuery4.Active:=False;
ADOQuery4.SQL.Clear;
ADOQuery4.SQL.Add('INSERT INTO Visit');
ADOQuery4.SQL.Add('VisitDate, VisitTime,Resultat,Symptoms,Diagnos');
ADOQuery4.SQL.Add('VALUES("'+Edit2.Text+'", "'+Edit3.Text+'", "'+ComboBox1.Text+'", "'+Memo1.Lines.Text+'", "'+Memo2.Lines.Text+'", "'+Memo3.Lines.Text+'")');
ADOQuery4.SQL.Add('WHERE (D.ID_Doctor=V.ID_Doctor) AND P.ID_Patient=V.ID_Patient');
ADOQuery4.ExecSQL;
Воть (-:

Добавлено:
Код:
ADOQuery4.SQL.Add('(VisitDate, VisitTime,Resultat,Symptoms,Diagnos)');
Вижу:welcome:
Новая ошибка "не совпадает число полей запроса и число результирующих полей"
 
D

DarkKnight

Использование WHERE в запроси на добавление (INSERT) - не допустимо...
Ты должна сразу в запросе указать ID_DOCTOR и ID_PATIENT, бери их из уже реализованных таблиц Доктора и Пациенты
Код:
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('+Table1->FieldByName('ID_Doctor')->AsString+','+Table2->FieldByName('ID_Patient')->AsString+','+'"'+Edit2.Text+'", "'+Edit3.Text+'", "'+ComboBox1.Text+'", "'+Memo1.Lines.Text+'", "'+Memo2.Lines.Text+'", "'+Memo3.Lines.Text+'")');
Ну как то так :)

Добавлено: Сорь, за погрешность в синтаксисе ;-) Просто на C++ пишу вот и проскакивают "->", там точка в Delphi :)

Добавлено: Ну а вообще для такого проекта я бы избегал бы запросов вообще....
Не тот формат как говориться.... Щас чайку налью и что-нить накидаю по этому примеру
P.S. Кстати пути к бд не прописывай жестко... хватит и того что ты например ее в папку DataBase которая лежит в проекте запихаешь, а в DBProvider в пути укажишь Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\DataBase\LAB8.mdb;
 
G

Guest

Я уже с чайком тут сижу:)
Да я бы и рада всё делать по правильному, но препод, препод.... :welcome: У него своё мнение на всё, старенький уже. Например он заставляет писать
Код:
ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
всегда всегда, обязательно! Аргументируя это тем что "память лучше чистится" :huh:

Добавлено:
Код:
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+'")');
Говорит "неизвестная переменная Doctor", может таблицы надо ещё как-то обозначать в запросе? ;)
 
D

DarkKnight

И правельно заставляет :)

Кстати, а почему ты не отображаешь таблицу приемы и рецепты...? Или ты не дошла еще до этого?
 
G

Guest

Не дошла, там практически такое же задание, нужно будет вносить в таблицу Recept из Edit4 и Memo3 (кстати странно что ничего не сказано про медикаменты, в Акцессе есть такое поле... наверно ошибка в задачнике, внесу ещё одно Memo). А приём (Visit) это я щас и пытаюсь делать, но пока как-то туго... :D Единственная проблема в этой лабораторке - это вот эти вот связи, ну не умею я с ними работать,на самообучении далеко не уедешь:( Ведь всё должно совпадать:: ID_Doctor с ID_Patient и ID_Visit... А то больница превратится в кладбище :mellow:
 
D

DarkKnight

Да нет, связи это только помощь в логике...
Вот смотри по твоему примеру:
1) Таблица Doctor содержит Ключевое(уникальное) поле ID_Doctor - код врача
2) Таблица Pacient содержит ключевое пол ID_Patient - код пациента
3) Таблица Visit в свою очередб содержи эти поля тоже, но они не являются уникальными, т.к.
В таблице Визит - в разных визитах может фигурировать одинаковый доктор... И у одного пациента может быть много визитов в больницу.. Отсюда и связь (один ко многим). ОДИН ДОКТОР -ОБСЛУЖИВАЕТ МНОГО ВИЗИТОВ... И ОДИН ПАЦИЕНТ - МОЖЕТ МНОГО РАЗ ХОДИТЬ В БОЛЬНИЦУ... Это реляционный подход...
4) За один визит в свою очередь можно выписать несколько рецептов (медикаментов) .. ОДИН ВИЗИТ МНОГО РЕЦЕПТОВ....

Теперь для чего это нужно....
Если удалить ПАЦИЕНТА, автоматически удалятся все ВИЗИТЫ этого ПАЦИЕНТА.. А дальше удалятся ВСЕ РЕЦЕПТЫ которые были выписаны по этим ВИЗИТАМ..
Или более нужное свойство...Изменился КОД_ДОКТОРА, с 1 на 10 к примеру.... АВТОМАТИЧЕСКИ изменится код этого доктора в таблицы ВИЗИТЫ и данные останутся целыми.....
 
D

DarkKnight

Вот, теперь к твоей задачи.... Основопологающей сущностью тут является ДОКТОР.... Все остальное уже исходит от него... И кстати именно ДОКТОР и будет по хорошему пользоваться этой программой, поэтому сначало нужно выбрать ДОКТОРА к примеру так


Добавлено: Двойное нажатие на ФИО ДОКТОРА главной формы открывает модальное окно со всей таблицей врачей...
Двойной щелчек по ДБГриду закрывает форму выбора, меня текущего врача
 

Вложения

  • 1.png
    1.png
    8,7 КБ · Просмотры: 500
  • 2.png
    2.png
    18,3 КБ · Просмотры: 382
G

Guest

Поняла, подробное объяснение:mellow:
Только вот в
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+'")');
надо как-то по другому записать импорт полей D_Doctor из Doctor и ID_Patient из Patient, а то в этой форме Дельфи их принимает за неизвестную переменную:(
 
D

DarkKnight

Подключи их к форме объявление другой формы... В делфи точно не помню как то вроде project- use ... что то там...
 
G

Guest

Это правильное решение, но запрещено мне менять интерфейс программы который указан в задачнике, одна форма, 4 мемо, 4 эдита, сколько-то там лейблов, 2 грида - и всё...шаг влево, шаг вправо - расстрел :mellow:
 
D

DarkKnight

А куда ты будешь вмещать рецепты? :)
 
G

Guest

Врач пришёл на работу, запустил это приложение, там отобразились ФИО всех врачей в DBGrid1 и ФИО всех пациентов которые в этой больнице зарегистрированы в DBGrid2.
Доктор нажимает в DBGrid1 на ячейку со своей фамилией, потом нажимает в DBGrid2 на ячейку с фамилией пацента которого он осматривает, и пишет в эдитах и мемо дату и время визита, симптомы и диагноз. Затем нажимает на кнопку "зарегистрировать приём" - и все эти данные которые он написал отправляются в Акцесс в таблицу Visit, причем ID_Doctor и ID_Pacient там должны быть именно те которые были предварительно выбраны в гридах.
Также доктор может (опять же щёлкнув предварительно нужные ячейки в гридах) записать в эдите и мемо код лекарства и название лекарства, нажать кнопку "сформировать рецепт"- и всё что он записал отправится снова в Акцесс в таблицу Recept причем опять же ID_Doctor и ID_Pacient там должны быть именно те которые были предварительно выбраны в гридах.
Вот оно как :mellow:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!