Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.10.2010, 22:08
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
Печаль Большая работа (клиентское приложение для больницы), много вопросов

Всем Привет!
У меня задание создать клиентское положение для больницы. Программа сложная, трудности начались с самого началаВозможно вопросов будет много. Но пока что только 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 штук разных адресов, при каждом щелчке на другом пациенте должен отбражаться его адрес. Что делать ?
Ответить с цитированием
  #2  
Старый 23.10.2010, 22:37
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1. Ну мне кажется вы уже с запросом наврали.
Код:
ADOQuery5.SQL.Add('SELECT * FROM Patient');
Так вы получите всех пациентов, а вам наверняка нужно по какому-то критерию это делать иначе на клик в любой ячейке вашего грида вы будете получать один и тот-же набор пациентов.
2.
Код:
ADOQuery5.Open;
ADOQuery5.Active:=True;
Это две аналогичные комманды, оставьте какую-то одну.
3.
Код:
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);
Таким кодом вы будете получать только значение одной текущей записи, а для получения всех записей надо по полученным данным пробежаться:
Код:
while not ADOQuery5.Eof
do begin
    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)
    ADOQuery5.Next;
    end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 23.10.2010, 23:00
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

Код:
procedure TForm1.DBGrid2CellClick(Column: TColumn);
begin
ADOQuery5.Active:=False;
ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('SELECT Sity, Street, Home, Kv, P_Kont_Phone');
ADOQuery5.SQL.Add('FROM Patient');
ADOQuery5.Active:=True;
while not ADOQuery5.Eof
do begin
Memo4.Clear;
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);
ADOQuery5.Next;
end;
end;
Теперь в Memo выводится последняя запись и больше никаких
Ответить с цитированием
  #4  
Старый 23.10.2010, 23:12
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну сделайте так:
Код:
...
ADOQuery5.First;
while not ADOQuery5.Eof
do begin
...

ПС:
Код:
ADOQuery5.Active:=False;
ADOQuery5.Close;
Это тоже 2 аналогичные комманды, выберите одну.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 23.10.2010 в 23:14.
Ответить с цитированием
  #5  
Старый 23.10.2010, 23:19
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

Тоже не помогло но спасибо за отклик
Ответить с цитированием
  #6  
Старый 23.10.2010, 23:47
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

А может можно сделать так чтобы в DBGrid не все поля отражались которые мы выбираем с помощью ADOQuery? Потому что если в ADOQuery (в том который связан с DBGrid )писать select sity, street и всё остальное то всё переключается и отображается в Memo нормально. Но сказано по заданию в DBGrid не включать эти поля, так можно их можно как-либо скрыть?
Ответить с цитированием
  #7  
Старый 24.10.2010, 00:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
А может можно сделать так чтобы в DBGrid не все поля отражались которые мы выбираем с помощью ADOQuery?
Можно. Правой кнопкой мыши на гриде и там в локальном меню Columns editor.
Далее через главное меню или через локальное меню открышегося окна выбрать Add all fields из списка.
Теперь, в сформировавашемся списке, можно либо совсем удалить ненужные поля, либо выставить для них свойство Visible в False

Цитата:
Тоже не помогло
А вот это странно, если вы сделали все правильно, то обязательно должно получится.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 24.10.2010 в 00:42.
Ответить с цитированием
  #8  
Старый 24.10.2010, 00:49
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А ни фига. Ибо мемо перед каждой записью-то очищается А после последней - нет, вот она и остаётся
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #9  
Старый 24.10.2010, 00:57
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Фу черт, а слона-то я и не увидел. Бездумно скопировал весь блок в цикл. Стыдно мне ужасно.
Так попробуйте:
Код:
Memo4.Clear;
while not ADOQuery5.Eof
do begin
Memo4.Lines.Add(ADOQuery5.FieldByName('Sity').AsString) ;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 24.10.2010, 12:47
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

С этим справились. Настигла ещё одна проблема. По заданию нужно заносить из Edit'ов и Memo'в в таблицу в Акцессе всё что доктор туда напишет, а также ID доктора и пациента. В БД 4 связанные таблицы (на картинке схема данных).
Как с ними работать мне никто не объяснял, погуглила, кое-что нашла, но конечно же ничего не работает.
Вот что у меня примерно получилось:
Код:
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... Как эту процедуру правильно записать?
Вложения
Тип файла: rar shema.rar (20.0 Кбайт, 4 просмотров)
Ответить с цитированием
  #11  
Старый 24.10.2010, 12:55
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Memo1.Lines.Text?
ComboBox1.Text?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #12  
Старый 24.10.2010, 13:04
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

Сделала, запустилось, но теперь ругается "ошибка синтаксиса в инструкции INSERT INTO"
Это наверняка изза связей, вот изза этого:
Код:
ADOQuery4.SQL.Add('WHERE (D.ID_Doctor=V.ID_Doctor) AND P.ID_Patient=V.ID_Patient');
Ответить с цитированием
  #13  
Старый 24.10.2010, 16:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1. Количество перечисленных полей в запросе меньше чем количество значений для них.
2. В ограничении используются алиасы D,V,P которые непонятно откуда взялись.
3. Воспользуйтесь параметрами в запросе.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #14  
Старый 24.10.2010, 17:18
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

Код:
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;
Это две основные процедуры. В данный момент Ошибка синтаксиса (пропущен оператор) в выражении запроса +Doctor.FieldByName(ID_Doctor).AsString+

Сама программа-то заключается в следующем:
Врач пришёл на работу, запустил это приложение, там отобразились ФИО всех врачей в DBGrid1 и ФИО всех пациентов которые в этой больнице зарегистрированы в DBGrid2.
Доктор нажимает в DBGrid1 на ячейку со своей фамилией, потом нажимает в DBGrid2 на ячейку с фамилией пацента которого он осматривает, и пишет в эдитах и мемо дату и время визита, симптомы и диагноз. Затем нажимает на кнопку "зарегистрировать приём" - и все эти данные которые он написал отправляются в Акцесс в таблицу Visit, причем ID_Doctor и ID_Pacient там должны быть именно те которые были предварительно выбраны в гридах.
Также доктор может (опять же щёлкнув предварительно нужные ячейки в гридах) записать в эдите и мемо код лекарства и название лекарства, нажать кнопку "сформировать рецепт"- и всё что он записал отправится снова в Акцесс в таблицу Recept причем опять же ID_Doctor и ID_Pacient там должны быть именно те которые были предварительно выбраны в гридах.
Вот оно как
Ответить с цитированием
  #15  
Старый 24.10.2010, 17:28
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Задача в общем-то несложная.
Есть такое соображение:
Где-то я читал или слышал, что рецепт должен быть обязательно написан от руки и на латинском языке.
Не знаю, верно это или нет, но проверьте на всякий случай.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter