1 (edited by baster.89 2014-11-06 05:33:30)

Topic: SQL-запрос DELETE

Приветствую.
Помогите с проблемой: при нажатии на кнопку выполняется SQL-запрос вида DELETE FROM table_name (т.е. мне необходимо,чтобы были удалены все записи из таблицы). Данная процедура проходит нормально, но если в настройках запроса указать, чтобы данные выводились в TableGrid,то после выполнения запроса ошибка "Cursor not returned from Query".
Пришлось делать две кнопки: одна удаляет записи, другая обновляет таблицу  (запрос вида SELECT column_name  FROM table_name с обновлением TableGrid).
Как реализовать, чтобы при нажатии на одну кнопку происходило сначала удаление записей и потом происходило обновление? Либо, более предпочтительно, чтоб обновились все TableGrid (их 13 штук)?
И вторая загвоздка: после выполнения скрипта выводится сообщение "Импорт завершён" (скрипт писался на примере проекта, по ведению базы стоимости валют,брался на форуме). Вопрос следующий: можно ли сделать так, чтобы это сообщение исчезло,допустим, через 30 секунд?
ПС. Проект выкладываю для свободного пользования и исправления под свои нужды. В нём ничего замудрённого нет. Хотя, можно глянуть скрипт для импортирования из *.csv

Post's attachments

Attachment icon Pacient.7z 286.65 kb, 550 downloads since 2014-11-06 

Re: SQL-запрос DELETE

наверно надо на кнопку навесить скрипт который бы обновлял таблицу после нажатия кнопки
procedura Form1_button1_OnAfterClick (Sender: string; var Cancel: boolean);

begin
Form1.TableGrid1.dbUpdate;
end;

Re: SQL-запрос DELETE

Ну и все таблицы перечислить которые нуно обновлять.

Re: SQL-запрос DELETE

Спасибо большое, моих познаний точно бы не хватило, чтобы так быстро додуматься,снова часов до 3-х ночи общался бы с гуглом smile
Теперь нормально таблицу чистит и обновляет.
Остался вопрос по поводу "исчезновения" надписи об успешном импорте... Или всё-таки реализовать через скрипт? Т.е. после того,как записи импортировались, появляется форма с сообщением об успешном импорте и потом её ручками закрывать.

ПС. Как доведу до работоспособного состояния, проект будет выложен в теме "РЕШЕБНИК. БИБЛИОТЕКА ГОТОВЫХ РЕШЕНИЙ. Исходник прилагается".

Re: SQL-запрос DELETE

не совсем понял что значит убрать сообщение "Импорт завершён" .
Это сообщение ведь не на отдельной форме выходит а в виде присовения текса надписи у компонента
Label6

ну так сделайте
на форму скрипт

procedura main_OnClick (Sender: string; var Cancel: boolean);
begin
main.Label6.Caption := '';
end;
Надпись будет висеть пока вы не кликните на форму.
Хотя я может о чем то другом думаю.

Re: SQL-запрос DELETE

либо так - гдето уже было реализвано

в начало скрипта добавтье
var
   Timer: TTimer;

в конце свой процедуры procedure main_import_OnClick (Sender: string; var Cancel: boolean );

     Timer := TTimer.Create (nil);
     Timer.OnTimer := @OnTimer;
     Timer.Interval := 10000;
     Timer.Enabled := True;
end;

и добавьте процедуру
procedure OnTimer;
begin
main.Label6.Caption := '';
end;

не уверен конечно но может поможет

Re: SQL-запрос DELETE

baster.89
Немного поправил ваш проект.

1. Для дат у вас использовался тип Текст, заменил на тип Дата


2. Не было поиска, сделал, но добавление нового пациента теперь через кнопку "Добавить пациента"


3. Неверно были настроены фильтры в TableGrid на вкладках, поправил.


4. Кнопка очистить теперь автоматически обновит все TableGrid


5. Надпись в Label Импорт завершен заменил на всплывающее сообщение.

Post's attachments

Attachment icon Pacient2.zip 19.9 kb, 566 downloads since 2014-11-06 

Dmitry.

Re: SQL-запрос DELETE

DriveSoft wrote:

baster.89
Немного поправил ваш проект.

1. Для дат у вас использовался тип Текст, заменил на тип Дата


2. Не было поиска, сделал, но добавление нового пациента теперь через кнопку "Добавить пациента"


3. Неверно были настроены фильтры в TableGrid на вкладках, поправил.


4. Кнопка очистить теперь автоматически обновит все TableGrid


5. Надпись в Label Импорт завершен заменил на всплывающее сообщение.

Спасибо за уделённое время. Потестил обработанный вами проект, одна из основных функций (а именно импорт записей из csv-файла) не хочет работать, поэтому всё же от некоторых моментов откажусь...В общем, лучше отвечу по пунктам smile
1. Если использовать тип "Дата", то ввод идёт через комбобокс. Работники организации сказали,что проще с клавиатуры ввести в обычное окошко. Поэтому всё-таки оставил тип "Текст" с маской 00.00.0000
2. "Поиск" не является необходимой функцией опять (из-за специфики работы). Но его я оставлю, т.к. всё же порой вещь полезная.
3. Фильтры хорошие smile Тоже оставляю (более практичные что ли, по сравнению с моими?)
4. С кнопкой "Очистить" разобрался путём, который указал Евгений на несколько постов выше, работает чудно (ещё раз отдельное спасибо).
5. Замена надписи на всплывающее сообщение - как раз то, что мне и хотелось увидеть. Конечно же оставляю.

Пока тестил, появилась потребность в ещё одной маленькой функции: на видимом месте должно отображаться общее количество записей (т.е. сколько всего пациентов внесено в базу) ну и соответственно данная цифра обновляется автоматически при добавлении нового пациента (будь то ручной ввод либо импорт из csv). Или в крайнем случае можно выводить данную информацию во всплывающем сообщении после нажатия  предназначенной для этого кнопки.

Извиняюсь за столь глупые вопросы, но ни в написании скриптов,ни в написании SQL-запросов не силён sad

Re: SQL-запрос DELETE

по последней потребности
возможно так решить.

procedure Main_OnShow (Sender: string; ACol, ARow: Integer);
var
   s: string;
begin
s := VarToStr( SQLExecute('SELECT count(id) FROM table ;') );
Main.Label8.Caption:= 'количество пациентов в базе-' + s;
end;

но точно по синтаксису не уверен.

Re: SQL-запрос DELETE

Чучкин Евгений wrote:

по последней потребности
возможно так решить.

procedure Main_OnShow (Sender: string; ACol, ARow: Integer);
var
   s: string;
begin
s := VarToStr( SQLExecute('SELECT count(id) FROM table ;') );
Main.Label8.Caption:= 'количество пациентов в базе-' + s;
end;

но точно по синтаксису не уверен.

Работает, но немного не так: счетчик обновляется только при перезапуске программы..
Подвесил пока на кнопку таким образом:

procedure Main_Button2_OnClick (Sender: string; ACol, ARow: Integer);
var
     s: string;
     begin
            s := VarToStr( SQLExecute('SELECT count(id) FROM pacient ;') );
            Main.Label14.Caption:= 'количество пациентов в базе-' + s;
     end;

При таком способе хоть по кнопке тыркнуть можно и количество пациентов обновится.
Спасибо за помощь smile

11 (edited by baster.89 2014-11-07 08:55:56)

Re: SQL-запрос DELETE

А нельзя эту задумку реализовать, добавив элемент "Counter"?
Пытаюсь сделать так:  в главной таблице pacient создаю поле с типом "счетчик" с начальным значением 0, а в главном окне интерфейса добавляю элемент "Counter" ну и соответственно указываю в свойствах данного элемента TableName=pacient... Если чисто теоретически, при добавлении пациента в этом элементе должна обновляться цифра? У меня оно (это самое окошко) остаётся пустым...

Re: SQL-запрос DELETE

baster.89
Этот компонент для друкого )
не совсем логичное название я ему дал.
http://myvisualdatabase.com/help_ru/com … unter.html


лучше поместите этот код в событие OnChange компонента TableGrid

Dmitry.

Re: SQL-запрос DELETE

точно на грид надо вешать - там часто обновляются данные.
Но я бы далал не по количеству пациентов зарегиних в базе а по количеству пациентов которые не выписаны из стационара.
добавть только условие в код Where дата выписки is Null (чисто условно написал)
Она более информативна в оперативном плане

14 (edited by baster.89 2014-11-11 10:22:17)

Re: SQL-запрос DELETE

В общем, сыровато у меня пока получилось, но для v.1.0 пока сойдёт, времени не хватает свободного на изучение инфы по написанию скриптов и sql-запросов (может подскажите, какие ресурсы/книги использовать для заполнения пробелов в моей голове?). smile
Некоторым может пригодиться в качестве примера (хотя всё это есть здесь на форуме, но некоторым людям может лень пользоваться поиском). Ну, порядку.
Программа предназначена для ведения реестра пациентов в отделе мед.статистики с последующей сдачей отчетности выше по лестнице власти smile
Кому интересно, в папке "Служебное" есть черновая инструкция.

Что нужно доделать:
1. Желательно переделать счётчик записей следующим образом: отображается количество пациентов только за выбранный месяц (допустим, в таблицах отображаются только те пациенты, которые поступили в октябре => счётчик выводит количество только этих пациентов).
2. В таблицу добавить столбец с нумерацией (именно не id записи, а просто номер по порядку от 1 до N, где N-последняя запись). При сортировке по ФИО/дате/полу и т.д. данный столбец остаётся в неизменном состоянии (т.е. также от 1 до N). Необходимо, чтобы этот столбец выводился в отчете в таком же виде.
3. Заменить существующий экспорт в Excel на экспорт в отчётную форму, настроенную по шаблону.
4. Думаю всё-таки вернуть "Поиск" (спрошу в отделе после тестирования, нужен ли данный функционал).
5. Настроить ввод заглавными буквами в поле ФИО (простое использование маски типа >llllllllllllllllll не нравится).
6. Что-то сделать с датами. При импорте из CSV пациентов, рожденных до 1960 года в таблице отображается некорректный год рождения (т.е. если родился в 1925-1959, то при импорте записывается 2025-2059)... (в системных настройках стоит промежуток 1930-2029). Из-за этого пришлось перейти на формат даты dd/MM/yy.
7. Отказался от Бэкапа при старте программы (вылетает ошибка о нарушении структуры скрипта, если я правильно понял, хотя при первых запусках бэкапилось всё замечательно). Так же при многократных запусках создаётся много копий БД smile По причине многократности копий отказался от бэкапа при выходе (в скрипте можно поудалять // в соответсвующих процедурах)

Пока вроде всё. Как появится время, буду добивать проект. Опять же, он предназначен для свободного пользования, если кому-то пригодится - пользуйтесь (сделан в MVDB v.1.46 beta)

Post's attachments

Attachment icon Pacient.7z 411.1 kb, 523 downloads since 2014-11-11 

Re: SQL-запрос DELETE

baster.89 wrote:

1. Желательно переделать счётчик записей следующим образом: отображается количество пациентов только за выбранный месяц (допустим, в таблицах отображаются только те пациенты, которые поступили в октябре => счётчик выводит количество только этих пациентов).

Это было бы просто сделать, используя главную форма для поиска, компонент TableGrid может иметь подвал, куда можно вывести количество найденных записей.

baster.89 wrote:

2. В таблицу добавить столбец с нумерацией (именно не id записи, а просто номер по порядку от 1 до N, где N-последняя запись). При сортировке по ФИО/дате/полу и т.д. данный столбец остаётся в неизменном состоянии (т.е. также от 1 до N).

сделал для TableGrid1 (хиругия)
в настройках компонента просто добавьте поле # для остальных компонентов TableGrid


baster.89 wrote:

5. Настроить ввод заглавными буквами в поле ФИО (простое использование маски типа >llllllllllllllllll не нравится).

сделал
redaktor.Edit1.CharCase := ecUpperCase; // преобразование текста в верхний регистр

baster.89 wrote:

6. Что-то сделать с датами. При импорте из CSV пациентов, рожденных до 1960 года в таблице отображается некорректный год рождения (т.е. если родился в 1925-1959, то при импорте записывается 2025-2059)... (в системных настройках стоит промежуток 1930-2029). Из-за этого пришлось перейти на формат даты dd/MM/yy.

в CSV файле в датах, год записан как две цифры, думаю проблема уйдет если для года использовать 4 цифры.

baster.89 wrote:

7. Отказался от Бэкапа при старте программы (вылетает ошибка о нарушении структуры скрипта, если я правильно понял, хотя при первых запусках бэкапилось всё замечательно). Так же при многократных запусках создаётся много копий БД smile По причине многократности копий отказался от бэкапа при выходе (в скрипте можно поудалять // в соответсвующих процедурах)

поправил ошибку, два раза было создано событие procedure main_OnShow



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

Post's attachments

Attachment icon Pacient2.rar 421.65 kb, 575 downloads since 2014-11-12 

Dmitry.

Re: SQL-запрос DELETE

SQL-запрос вида DELETE FROM table_name удаляет все записи таблицы. А можно ли организовать удаление в заданном интервале дат или до какой-то заданной даты?

Не боги горшки лепят!

Re: SQL-запрос DELETE

kunar80
Да, так же как и в SELECT, при использовании DELETE нужно воспользоваться ключевым словом WHERE


т.е.
DELETE FROM table_name WHERE datefield > {DateTimePicker1} AND datefield < {DateTimePicker2}

Dmitry.