Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2008, 14:07   #1
XPAiN
Форумчанин
 
Аватар для XPAiN
 
Регистрация: 31.10.2007
Сообщений: 108
Печаль SQL процедура вместо перебора записей

Доброго времени суток.
Суть моей проблемы такова: имеется база Access и ADO.
Имеется поле в котором хранится номер дома. Данные получаю туда из другой базы (на которую я не могу повлиять и что то там изменить). Добрые разработчики той базы сделали его текстовым. В общем пользователь вбивает туда, что его душе угодно (слова, буквы).
Мне нужно отделить цифры если они идут в начале в отдельное поле. Написал следующую процедуру:
Код:
procedure TFrm_convert.Button4Click(Sender: TObject);
var str,str1:string;
i,j:integer;
begin

For j:=1 to DataModule1.Flat.RecordCount do
begin

str:=DataModule1.Flat.fieldByName('Home_number').AsString;
str1:='';
For i:=1 to length(str) do
if str[i] in ['1','2','3','4','5','6','7','8','9','0'] then
str1:=str1+str[i]
else break;

DataModule1.Flat.Edit;

if str1='' then DataModule1.Flat.fieldByName('Home_number_filter').AsInteger:=0
else DataModule1.Flat.fieldByName('Home_number_filter').AsInteger:=strtoint(str1);
DataModule1.Flat.Post;

DataModule1.Flat.Next;
end;

end;

Но эта процедура не устраивает по скорости работы, т.к. записей в базе около 14 000. Возможно ли написать какой-либо подобный SQL запрос?
delphi is my world
XPAiN вне форума Ответить с цитированием
Старый 08.09.2008, 23:12   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

а если номер дома 3А 4-Б или еще что

можно попробовать переписать вот так
k:=0;
For i:=1 to length(str) do
if str[i] in ['1','2','3','4','5','6','7','8','9' ,'0'] then
k:=k+1 //Inc(k); вместо многократного копирования строк считаем число цифр
else break; //закончить цикл как только не цифра
s:=copy(s,1,k); //копирование строки только один раз
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.09.2008 в 23:20.
evg_m вне форума Ответить с цитированием
Старый 09.09.2008, 11:13   #3
XPAiN
Форумчанин
 
Аватар для XPAiN
 
Регистрация: 31.10.2007
Сообщений: 108
По умолчанию

Нужно все откинуть кроме числа, остаток я потом переписываю в коментарий.

evg_m за идею спасибо
delphi is my world
XPAiN вне форума Ответить с цитированием
Старый 09.09.2008, 21:39   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Все верно, только если вспомнить определение множества, то строка
if str[i] in ['1','2','3','4','5','6','7','8','9' ,'0'] then
запишется как
if str[i] in ['0'..'9'] then
Правда, так короче?
mihali4 вне форума Ответить с цитированием
Старый 11.09.2008, 12:51   #5
XPAiN
Форумчанин
 
Аватар для XPAiN
 
Регистрация: 31.10.2007
Сообщений: 108
По умолчанию

Спасибо вы действительно правы
delphi is my world
XPAiN вне форума Ответить с цитированием
Старый 11.09.2008, 13:59   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я бы ещё проверил, может чуть-чуть быстрее (ВНИМАНИЕ! НЕ ФАКТ! ТРЕБУЕТ ПРОВЕРКИ!) будет, если использовать не операции с множеством, а банальное сравнение:
if (str[i]>='0') and (str[i]<'9') then ...

и ещё. посмотрел я вчера в поиске на SQL.ru
бедненький SQL у Вашего Access'а... на Oracle действительно можно было состряпать запрос по получению начальных цифр из поля.
Кстати, не знаю, насколько это будет эффективно, но в Access можно написать свою функцию, которую можно использовать в SQL запросах... и последнее, если возможно с точки зрения задачи, я бы добавил в таблицу ещё два поля, куда и записал разделённые данные... а потом в запросе брал эти поля...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм перебора (Delphi) Air Помощь студентам 11 20.07.2008 20:28
Метод перебора для нахождения решения "Судоку" ДЖО Помощь студентам 23 04.06.2008 22:29
Вместо фильмов слайд-шоу )= Лайка Свободное общение 10 17.05.2008 15:19
вместо шрифтов рисуются иероглифы Sharley Общие вопросы Delphi 4 27.04.2008 18:41
ссылка вместо текста!!! Abbatik Помощь студентам 7 09.02.2008 13:29