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

Вниз

Виснет прога во время ExecSQL   Найти похожие ветки 

 
NGPOL   (2009-10-10 08:05) [0]

Уважаемые коллеги! В моей БД 5 основных таблиц. Во время работы записи за прошлые годы не очень нужны, поэтому в этих таблицах есть поле Arch(Logical), а секция WHERE всех запросов начинается с Arch = FALSE. Отправляю в "архив" и обратно я двумя процедурами:

function TfrSpEdit.Archive(TableName, FieldName, Text : string; SetArch : boolean): boolean;
var s : string;
   ok : boolean;
begin
ok:= True;
with dmAn.quArchUpdate do begin
 if Active then Close;
 try
  try
   SQL.Clear;
   SQL.Add("UPDATE " + TableName);
   if SetArch then s:="TRUE" else s:= "FALSE";
   SQL.Add("SET Arch = "+ s);
   if SetArch then SQL.Add("WHERE "+ FieldName + " BETWEEN " + QuotedStr(DateToStr(DateTimePicker1.Date)) + " AND " + QuotedStr(DateToStr(DateTimePicker2.Date)));
   ExecSQL;
  except
   ShowMessage(Text + " архивировать не удалось...");
   Ok:= False;
  end;
 finally
  if Active then Close;
 end;
end;
Result:= Ok;
end;

а это вызывающая процедура:

procedure TfrSpEdit.BitBtn3Click(Sender: TObject);
var Ini : TIniFile;
begin
Ini := TIniFile.Create(ChangeFileExt( Application.ExeName, ".INI" ));
try
  Ini.WriteDate("Archives", "FromDate", DateTimePicker1.Date);
  Ini.WriteDate("Archives", "ToDate", DateTimePicker2.Date);
  if Archive("Narkoses", "DateAn", "Журнал регистрации анестезий", True) and
     Archive("Patients", "EndDate", "Журнал движения пациентов", True) and
     Archive("Bronh", "DateBr", "Журнал регистрации бронхоскопий", True) and
     Archive("CVK", "DPost", "Журнал регистрации ЦВК", True)  and
     Archive("IK", "DatePerf", "Журнал регистрации ИК", True) then
     ShowMessage("Записи помечены как архивные и не будут участвовать в обработке...");
finally
 Ini.Free;
end;
end;

Проблема: Программа виснет после выполнения. М.б. это очень ресурсоемкая операция? Если руками набить в SQL Explorer код запроса, то он выполняется... Заметил, что первая по списку таблица, все-таки изменяется, согласно алгоритму... Подскажите, плз...


 
SQL.Text=   (2009-10-10 10:49) [1]

текст запроса будет такой:
"UPDATE ИмяТаблицыSET Arch = FALSEWHERE ИмяПоля BETWEEN СтрокаДаты1ВСоответствииСЛокалью AND СтрокаДаты2ВСоответствииСЛокалью"

ничего странного не замечаешь?


 
sniknik ©   (2009-10-10 11:42) [2]

> текст запроса будет такой:
он будет не такой, переходы на новую строку тоже считаются, а тут они есть add добавляет строками.

"СтрокаДаты1ВСоответствииСЛокалью" тоже позволяются некоторыми движками... т.е. так конечно может быть несоответствие, но оно логическое, дата может приняться не та, но сам запрос будет рабочий. (и есть судя по тому что первый отрабатывает)

> ничего странного не замечаешь?
вообще, тут куча странного, но не в этом.

первое, и главное, смысла вводить логическое поле вместо ограничений по дате нет, эффективность -1, индексы на однородных данных (всего пара значение(!!!)) работают хуже чем на не повторяющихся (дата со временем?)  или хотя бы небольшими порядками повторов (день).
т.е. вся эта бодяга делается только для того, чтобы потом хуже работало...

второе
>   except
>     ShowMessage(Text + " архивировать не удалось...");
>     Ok:= False;
>   end;
"сглатывание" реальной ошибки, автор похоже не хочет знать, что вообще происходит...
(в нормальных местах за такое увольняют... ну т.е. сначала объясняют, а если программист "не внемлет" то увольняют)

третье, сам стиль, не использование параметров, и экономия на компонентах... это совсем не то, что нужно экономить (и бессмысленно, что 1 что 5 объема программе добавят одинаково. чистых имеется в виду, без кода)... на самом деле, намного эффективнее, быстрее отработает код из 5 вызовов разных компонент (с параметрами естественно), чем то что есть. только писать придется немного больше.

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


 
Leonid Troyanovsky ©   (2009-10-10 22:52) [3]


> sniknik ©   (10.10.09 11:42) [2]

Уважаю.

--
Regards, LVT.


 
имя   (2009-10-11 02:19) [4]

Удалено модератором


 
NGPOL   (2009-10-11 21:55) [5]


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

Спасибо, конечно! Только вот меня неоткуда увольнять... У меня саавсем другая специальность. Я ж в конференцию для чайников лезу, не пойму, откуда столько негодований?! Вы б объяснили сначала, прежде чем увольнять... Эта работа мне напоминает курсовую ПЕРВОкурсника.
1.
> смысла вводить логическое поле вместо ограничений по дате
> нет, эффективность -1,

Мне  показалось, что так будет проще... Запросы-то вызываются нередко, в секцию WHERE и так приходится вставлять условия различных, сохраненных ранее фильтров, а так бы пришлось еще и эти даты "вспоминать" и встремлять их в запрос.
Объясните терпеливо, плз, если не лень: почему первый запрос отрабатывается, а на втором - виснет?


 
NGPOL   (2009-10-11 22:17) [6]


> текст запроса будет такой:
> "UPDATE ИмяТаблицыSET Arch = FALSEWHERE ИмяПоля BETWEEN
> СтрокаДаты1ВСоответствииСЛокалью AND СтрокаДаты2ВСоответствииСЛокалью"
>
> ничего странного не замечаешь?

Текст запроса получается такой:

UPDATE CVK
SET Arch = TRUE
WHERE DPost BETWEEN "01.01.2003" AND "01.01.2009"

И чего в нем странного?


 
RWolf ©   (2009-10-12 10:31) [7]

Индекс-то есть по полю Patients.EndDate? может, это от его отсутствия процесс затягивается?


 
Плохиш ©   (2009-10-12 13:52) [8]


> Объясните терпеливо, плз

sniknik © попытался, толку 0.

> если не лень

мне лень заниматься бесполезным делом. Почитай для начала чего.



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

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

Наверх





Память: 0.48 MB
Время: 0.008 c
2-1255265203
AlexDan
2009-10-11 16:46
2009.11.22
form2.memoN в rave reports..


2-1254993428
Маркабес
2009-10-08 13:17
2009.11.22
sql


2-1253824043
Незнайка
2009-09-25 00:27
2009.11.22
Quantum Grid и немецкие буквы


2-1254737942
fics)
2009-10-05 14:19
2009.11.22
Массивы


15-1253630278
TRSteep
2009-09-22 18:37
2009.11.22
Авто дописывание кода





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский