Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск по базе 
V
    Опции темы
NieL
Дата 5.9.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нужно сделать поиск в базе по имени поля (FieldName) и его значению (FieldValue - может быть как числовое так и строковое). Не знаю как сделать разделение если поле числовое искать как AsInteger если текстовое искать как AsString

Код

function Tdatamodule_Connection.FindByField(const FieldName,  
  FieldValue: string): Integer;  
begin  
  Result := -1;  
  if ConnectionStatus = csConnected then  
  begin  
    // cmp_Query_.SQL.Text := Format('SELECT * FROM ITEM WHERE %s = %s', [FieldName, FieldValue]);  
   cmp_Query_.Close;   
   cmp_Query_.SQL.Text := 'SELECT * FROM ITEM WHERE ' + FieldName + ' = :FieldValue';  
    if not cmp_Query_.Prepared then  
      cmp_Query_.Prepare;  
   if что-то then // может быть проверять тип поля (числовой или текстовый, и как нибудь по другому) 
     cmp_Query_.ParamByName('FieldValue').AsInteger := StrToInt(FieldValue) 
   else   
     cmp_Query_.ParamByName('FieldValue').AsString := FieldValue;  
    cmp_Query_.ExecSQL;  
    Result := cmp_Query_.RowsAffected;  
  end;  
  FSelectedByKey := False;  
end; 

PM MAIL   Вверх
Akella
Дата 5.9.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(NieL @  5.9.2008,  17:41 Найти цитируемый пост)
if что-то then //

узнавай тип поля, есть FieldType для этого, помоему
PM MAIL   Вверх
Frees
Дата 8.9.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



function Tdatamodule_Connection.FindByField(const FieldName,  
  FieldValue: Variant): Integer;  
.......
cmp_Query_.ParamByName('FieldValue').Value := FieldValue
.......... 


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
pseud
Дата 8.9.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



видимо тебе потребуется следующий код:

Код

var
  i: Integer;
  ft: TFieldType;

  with TQuery.Create(Self) do
  try
    SQL.Add('SELECT * FROM ITEM WHERE id = -1'); 
      // id = -1 - это условно. вообще, надо чтоб в запрос ничего не попало, 
      // может у тебя пройдет select first 1 или что-то типа того
    Active := True;
    ft := FieldByName(FieldName).DataType;
  finally
    Free;
  end;


  sSQL := 'SELECT * FROM ITEM WHERE ' + FieldName + ' = ';  

  case ft of:
    ftString: s := QuotedStr(FieldValue);
    ftInteger, ftSmallint: s := FieldValue;
    else
      ...
  end;

  sSQL := sSQL + s;



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Frees
Дата 8.9.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(pseud @  8.9.2008,  10:07 Найти цитируемый пост)
видимо тебе потребуется следующий код:

а зачем так сложно? разве Variant не пройдет?


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
pseud
Дата 8.9.2008, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Frees @  8.9.2008,  10:26 Найти цитируемый пост)
а зачем так сложно? разве Variant не пройдет?


не уверен, что вриант нам поможет получить 2 таких чуть разных скюля: 
field1 - number
Код

SELECT * FROM table WHERE field1 = 123

field2 - varchar
Код

SELECT * FROM table WHERE field2 = '123'


опровергни меня, если я не прав


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Frees
Дата 8.9.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

SELECT * FROM table WHERE field1 = :param


Код

cmp_Query_.ParamByName('param').Value := FieldValue


в таком случае совершенно не важно что мы в вариант ложили

Добавлено через 3 минуты и 9 секунд
Код

procedure TForm2.Button1Click(Sender: TObject);
begin
  FindByField(ComboBox1.Text, Edit1.Text);//ComboBox1.Text тут список полей разных типов

end;

function TForm2.FindByField(const FieldName: String;
  FieldValue: Variant): Integer;
begin
  Result := -1;
  if true then
  begin

   pFIBDataSet1.Close;
   pFIBDataSet1.SelectSQL.Text := 'SELECT * FROM METATABLE  WHERE ' + FieldName + ' = :FieldValue';
    if not pFIBDataSet1.Prepared then
        pFIBDataSet1.Prepare;
    pFIBDataSet1.ParamByName('FieldValue').Value := FieldValue;//тип не важен все работает
    pFIBDataSet1.Open;
    Result := pFIBDataSet1.recordCount;
  end;
end;



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
pseud
Дата 8.9.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Frees @  8.9.2008,  11:29 Найти цитируемый пост)
в таком случае совершенно не важно что мы в вариант ложили


а теперь 
- выбери в комбобоксе цифровое поле
- в едит напиши 123
и запусти поиск

у меня вылетает
Код

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EDBEngineError with message 'Type mismatch in expression.'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Frees
Дата 8.9.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(pseud @  8.9.2008,  11:56 Найти цитируемый пост)
у меня вылетает

у меня работает, дело наверно в компанентах у меня как заметил (FIB), а ты на чем проверял?


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
pseud
Дата 8.9.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Frees @  8.9.2008,  12:02 Найти цитируемый пост)
у меня работает, дело наверно в компанентах у меня как заметил (FIB), а ты на чем проверял?

Paradox - BDE


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Poseidon
Дата 8.9.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 3
Всего: 133



NieL, делай AsString всегда. Числовые данные прекрасно конвертируются в строковые.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
pseud
Дата 8.9.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



офф
блииин ну как обычно написана куча советов
а хде же результат
хде овнер сей проблемы



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


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

FAQ раздела лежит здесь!


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

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


 




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


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

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