Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Опять TQuery.


Автор: NiJazz 5.4.2004, 07:48
Код
with dmCrmMain.qrPhones do
 begin
   SQL.Clear;
   SQL.Add('select * from Phones where OrgName = "');
   SQL.Add(edOrgName.Text + '"');
   Open;
   First;
   while not Eof do begin
     cbPhones.Items.Add(FieldByName('Phone').AsString);
     Next;
   end;
   cbPhones.ItemIndex := 0;
 end;

Выдаётся ошибка: "Table is not indexed". Таблица Paradox 7. В Database Desctop'e я точно таблицу Phones проиндексировал. В чём может быть дело?

Автор: NiJazz 5.4.2004, 08:37
Я добавил поле Id в таблицу типа +- (автоинкремент) как первичный ключ. Теперь ошибки нет. Только зачем это надо было? Я не силён в БД. sad.gif

Коли это вопрос почти решён, то теперь скажу о другой поблеме...
Есть опять Tquery и в нём выполняется тот же самый запрос:
Код
with dmCrmMain.qrPhones do
begin
  SQL.Clear;
  SQL.Add('select * from Phones where OrgName = "');
  SQL.Add(edOrgName.Text + '"');
  Open;
  First;
  while not Eof do begin
    cbPhones.Items.Add(FieldByName('Phone').AsString);
    Next;
  end;
  cbPhones.ItemIndex := 0;
end;

Но теперь проблема заключается том, что получаются пустые таблицы. Проверял: eof не работает, а RecordCount = 0. В чём может быть дело?



Добавлено @ 08:38
Забыл сказать, что в таблице точно есть записи. Это проверял, делая запрос ручками.

Автор: NiJazz 5.4.2004, 09:26
Код
with dmCrmMain.qrPhones do
 begin
   SQL.Clear;
   SQL.Add('select * from Phones where OrgName = "'+edOrgName.Text+'"');
   Open;
   First;
   while not Eof do begin
     cbPhones.Items.Add(FieldByName('Phone').AsString);
     Next;
   end;
   cbPhones.ItemIndex := 0;
 end;

Если написать весь запрос в одну строку, то всё работает. Странно...
Какой-то монолог получился. smile.gif

Автор: Serggggg 5.4.2004, 10:02
Попробуй выловить ShowMessage'м сам текст запроса Query1.SQL.Text. Возможно, в синтаксисе есть ошибка. Кстати, чтобы не путаться с кавычками, можно при построении строки в запросе использовать #39 - это CHAR-код одинарной кавычки.
Можешь также попробовать задать выборку через цикл For:
Query1.First;
For i:=0 to Query1.RecordCount-1 do begin
cbPhones.Items.Add(FieldByName('Phone').AsString);
Query1.Next;
end;

Автор: Akella 5.4.2004, 11:01
Попробуй использовать функцию QuotedStr или QuotedString() вместо двойных кавычек. Эта функция сама все сделает, как надо, я ею всегда пользуюсь и никогда нет путаницы, особенног если много параметров.

SQL.ADD('SELECT * FROM Phones Where OrgName = '+QuotedStr(edOrgName.Text));


или используй Params

QUERY1.Params[0]:=edOrgName.Text;
или
Query1.ParamByName('pOrg').AsString := edOrgName.Text

SQL.ADD('SELECT * FROM Phones WHERE OrgName = :pOrg')

Автор: p0s0l 5.4.2004, 12:49
Цитата
Если написать весь запрос в одну строку, то всё работает. Странно...

Еще бы.
Ведь ты не пишешь так:
Select * From Table1 Where id > 123
456
если тебе надо получить записи с id > 123456 ?

И WHERE ты не разбиваешь на WHE RE ???

В данном случае при посылке запроса получилось так:
select * from Phones where OrgName = "_<имя организации>"
Т.е. после " вставлятся разделитель #13#10 - перевод строки и каретки...
Писал бы так:
Код
 SQL.Clear;
 SQL.Add('select * from Phones where OrgName = ');
 SQL.Add('"' + edOrgName.Text + '"');

И всё было бы ок...
Цитата
Какой-то монолог получился

Еще бы, сам за 1,5 часа всё решил. Ведь мы тут не реактивы...

Автор: NiJazz 5.4.2004, 17:16
p0s0l
#13#10 - эти символы то же значат, что и chr(13) и chr(10)?
Цитата
Еще бы, сам за 1,5 часа всё решил. Ведь мы тут не реактивы...

smile.gif

Автор: x77 5.4.2004, 19:25
NiJazz, угу, то и значат smile.gif и со второй таблицей у тебя та же проблема.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)