Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO, EXCEL и типы данных. [D7]


DmitryNekl ©   (2003-07-09 20:51:00) 

Вопрос довольно глупый, но все же надеюсь на вашу помощь.
Ситуация такая. Есть таблица в Экселе, в которой данные разных типов: и целые числа, и строки. Подключаемся к ней с помощью ADO и пытаемся выполнить запрос (объявления переменных и все лишнее я убрал):

function a(Field1, Field2, WorkSheet: string): string;
// Field - поле в Экселе, которое ищем
// WorkSheet - он и есть :)
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("SELECT DISTINCT " + Field1 + " FROM ["+ WorkSheet + "$]");
ADOQuery1.Active:=True;
ADOQuery1.ExecSQL;
ADOQuery1.First;
s:="";
For i:=0 to ADOQuery1.RecordCount-1 do
begin
s:=s + ADOQuery1.FieldByName(""+Field1+"").AsString;
ADOQuery2.SQL.Clear;
stmp:="SELECT DISTINCT "+Field2+" FROM ["+ WorkSheet + "$] WHERE "+ Field1+"="+""""+ADOQuery1.FieldByName(""+Field1+"").AsString+"""";
ADOQuery2.SQL.Add(stmp);
ADOQuery2.Active:=True;
ADOQuery2.ExecSQL;
и т.д.

Короче говоря, суть в том, что параметрами Field1 и Field2 можно управлять запросом. И хочется, чтобы эта функция работала с любыми данными.

Если данные в Экселе строковые, то все работает, как надо.
Если данные в Экселе числовые, то строка stmp:="SELECT DISTINCT "+Field2+" FROM ["+ WorkSheet + "$] WHERE "+ Field1+"="+""""+ADOQuery1.FieldByName(""+Field1+"").AsString+""""; приводит к ошибке "Несоответствие типов данных в выражении условия отбора". Если эту строку поменять на stmp:="SELECT DISTINCT "+Field2+" FROM ["+ WorkSheet + "$] WHERE "+ Field1+"="+ADOQuery1.FieldByName(""+Field1+"").AsString; (т.е. убрать кавычки), то все наоборот: с числами работает, а со строками - нет.

Вопрос: как написать универсальный запрос, который будет работать с любыми данными?

Заранее спасибо.


sniknik   (2003-07-09 22:15:00) [1]

делай приведение типа, вроде
SELECT iif(isNumber(Field1), CStr(Field1), Field1) as Field1 ...
всегда вернет строку (если конечно как говориш всего 2 типа в поле)
то же можно и в условии.

а вот универсальный для любых данных будет посложнее, но стоит ли? если нужно попробуй.


Наверх

Титульная страница Поиск, карта сайта Написать письмо