Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с DBGrid, Поиск вхождения строки в строку в столбц 
:(
    Опции темы
Voldemar2004
Дата 1.1.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: 1
Всего: 23



Если выделить строку, то работает все нормально. Сделал поиск строки в подстроке,
пробегаем по значениям в столбце, если в строке встречается слово "ЗНАЧЕНИЕ", то
пропускаем, иначе - удаляем. Как сделать так, чтобы не надо было каждый раз выделять строку в DBGrid'e для сравнения.

Код
void __fastcall TForm1::Button5Click(TObject *Sender)
{
char str[50];

char *str1 = Table1->Fields->Fields[14]->AsString.c_str(), *str2 = "ЗНАЧЕНИЕ", *ptr;


OemToChar(str1, str1);
ptr = strstr(str1, str2);

OemToChar(ptr, str);
Table1->Next();


        if(ptr){
        ShowMessage("Совпадает - пропускаем");
        }
        else

        {
        Table1->Edit();
        Table1->Fields->Fields[14] = 0;
        Table1->Post();
        }

}



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Voldemar2004
Дата 1.1.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: 1
Всего: 23



Вот сам все сделал, но скорость.... оставляет желать лучшего даже без DBGrid. Можно как-нибудь увеличить скорость?
Код
void __fastcall TForm1::Button6Click(TObject *Sender)
{
char str[50];
char *str2 = "ЗНАЧЕНИЕ", *ptr;

for(int i=0; i<Table1->RecordCount; i++){

char *str1 = Table1->Fields->Fields[14]->AsString.c_str();

OemToChar(str1, str1);
ptr = strstr(str1, str2);

OemToChar(ptr, str);

        if(ptr){
        // другие действия
        }
        else

        {
        Table1->Edit();
        Table1->Fields->Fields[14] = 0;
        Table1->Post();
        }

Table1->Next();

}

}




--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
sexton
Дата 3.1.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sexton=Пономарь (eng)
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 5.5.2004
Где: Ульяновск

Репутация: 5
Всего: 9



А почему не ипсользовать родные функции класса AnsiString?
AnsiCompareText например.
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 3.1.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Я не совсем понял что означает эта запись???
Цитата
Код

        Table1->Edit();
        Table1->Fields->Fields[14] = 0;
        Table1->Post();


Fields[14] возвращяет тебе тип TField * (или TField точно не помню) и ты присваеваешь ему ноль..
Если тебе надо из базы удалить или обновить тогда пиши на SQL чего ради ты циклом делаешь? Используй LIKE он тебе поиск подстроки обеспечит (не забываем про %). А в остальном из вопроса мне ничего не ясно...Что именно ты удаляешь? Ты вроде UPDATE делаешь? С одной стороны ты ишешь строку с другой стороны присваеваешь тому же 14-ому полю значение int...

Вобщем если можно поподробнее...
Добавлено @ 11:41
Кстати для поиска в TTable есть функция Locate..
PM   Вверх
_hunter
Дата 3.1.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Voldemar2004
Дата 3.1.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: 1
Всего: 23



Цитата(azesmcar @ 3.1.2006, 11:40)
Если тебе надо из базы удалить или обновить тогда пиши на SQL чего ради ты циклом делаешь?
Да я хотел просто перевести код с VB на С++ Builder. На VB6 скорость раз в 100 больше, чем на С++ Builder:
Код
Private Sub cmdStart_Click()
Dim flag As Boolean

ProgressBar1.Min = 0
ProgressBar1.Max = Data1.Recordset.RecordCount - 1

Dim i As Long

For i = 0 To Data1.Recordset.RecordCount - 1

flag = True

ProgressBar1.Value = i
 
    Dim j As Long
    For j = 0 To List1.ListCount - 1
        If InStr(Data1.Recordset.Fields(14), List1.List(j)) > 0 Then flag = False
    Next j

    If flag Then
        
        Data1.Recordset.Edit
        Data1.Recordset.Fields(14) = ""
        Data1.Recordset.Update
    
    End If
    
Data1.Recordset.MoveNext

Next i

End Sub
Приведенный код удаляет из определенного столбца все значения кроме тех которые выбраны пользователем:

если в столбце "13212333 ЗНАЧЕНИЕ 324"
"4565 ДРУГОЕ 435435543"
"56345 ТРЕТЬЕ 545435555"

а надо удалить все, кроме тех, которые выбраны в ListBox'е: например в ListBox указано "ЗНАЧЕНИЕ".
Цитата(sexton @ 3.1.2006, 11:30)
А почему не ипсользовать родные функции класса AnsiString?
AnsiCompareText например.
Она:
Цитата
Compares AnsiStrings based on the current Windows locale without case sensitivity.

Unit

Sysutils

Category

string handling routines

extern PACKAGE int __fastcall AnsiCompareText(const AnsiString S1, const AnsiString S2);

Description

AnsiCompareText compares S1 to S2, without case sensitivity. The compare operation is controlled by the current Windows locale. AnsiCompareText returns a value less than 0 if S1 < S2, a value greater than 0 if S1 > S2, and returns 0 if S1 = S2.
Ладно попробую.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
azesmcar
Дата 3.1.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Ну делай так, мало ли кто что написал на Бейсике...
Код

UPDATE MY_TABLE SET FIELD_14='' WHERE FIELD_14 LIKE '%ЗНАЧЕНИЕ%'

А если циклом то примерно так будет правильней
Код

Table1->Edit();
Table1->Fields->Fields[14].AsString = ""; //тут точно не помню или так или
//Table1->Fields->Fields[14]->AsString = "";
Table1->Post();


Но не думаю что пробегаться циклом по всем полям xорошая идея...делай функцией Locate
Код

while (Locate(...))
{
   Table1->Edit();
   //...
   Table1->Post();
}

Должно быть намного быстрее
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.3253 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.