powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Мощь FPD VS Delphi
4 сообщений из 4, страница 1 из 1
Мощь FPD VS Delphi
    #33424383
Vladimir_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 2 таблицы, table и realiz
из таблицы realiz берутся значения для поиска, поиск ведется по таблице table
m.ngg - временная переменная

Есть у меня на Фоксе такая конструкция
Код: plaintext
1.
2.
3.
4.
5.
select table
LOCATE FOR B_NDOG = realiz.B_NDOG AND;
	             B_NGG  = M.NGG           AND;
   	             IIF(B_D12= 0 ,B_D11=realiz.B_D1,BETWEEN(realiz.B_D1,B_D11,B_D12)) AND;
	             IIF(B_D22= 0 ,B_D12=realiz.B_D2,BETWEEN(realiz.B_D2,B_D21,B_D22)) AND;
	             IIF(B_S2= 0 ,B_S1=realiz.B_S,BETWEEN(realiz.B_S,B_S1,B_S2))

Выполняется она довольно быстро

А в Делфи такая
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
que.Close;
que.SQL.clear;
que.sql.add(' select * from table.dbf ');
que.sql.add(' where b_ndog="'+query1.FieldByName('b_ndog').AsString+'"');
que.SQL.add(' and b_ngg="'+mngg+'" ');
que.sql.add(' and (b_d1='+query1.FieldByName('b_d1').AsString+' or ('+query1.FieldByName('b_d1').AsString+'>=b_d1 and '+query1.FieldByName('b_d1').AsString+' <=b_d12)) ');
que.sql.add(' and (b_d2='+query1.FieldByName('b_d2').AsString+' or ('+query1.FieldByName('b_d2').AsString+'>=b_d2 and '+query1.FieldByName('b_d2').AsString+' <=b_d22)) ');
que.sql.add(' and (b_s1='+query1.FieldByName('b_s').AsString+'  or ('+query1.FieldByName('b_s').AsString+' >=b_s1 and '+query1.FieldByName('b_s').AsString+'  <=b_s12)) ');
que.Open;

Выдает она результаты такие же как и фоксовская, но меня такой запрос настораживает. Да и работает заметно медленнее.

Вопрос. Можно ли в Делфи написать условие такое же как в Фоксе с помощью Locate, либо с помощью SQL?
...
Рейтинг: 0 / 0
Мощь FPD VS Delphi
    #33424465
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, ведь это один-в-один переведенный код. Т.е. вместо конструкции

IIF(B_D12=0,B_D11=realiz.B_D1,BETWEEN(realiz.B_D1,B_D11,B_D12))

Написали

B_D11=realiz.B_D1 OR (realiz.B_D1 >= B_D11 AND realiz.B_D1 <= B_D12)

Если поле realiz.B_D1 и значение B_D11 не могут принимать отрицательные значения, то эти конструкции тождественны.

В Delphi я не силен, но вообще-то, это все несколько избыточно. Если B_D12 - это некая переменная, значение которой вычисляется собственно в Delphi, то почему не сделать явно:

Код: plaintext
1.
2.
3.
4.
IF (B_D12= 0 )
que.sql.add(' and b_d1='+query1.FieldByName('b_d1').AsString);
ELSE
que.sql.add(' and '+query1.FieldByName('b_d1').AsString+'>=b_d1 and '+query1.FieldByName('b_d1').AsString+'<=b_d12 ');

Синтаксис конструкции IF сам подправишь.

Ты же, по сути, формируешь строку SQL-запроса. Ну, и не записывай лишнее.
...
Рейтинг: 0 / 0
Мощь FPD VS Delphi
    #33424475
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поторопился. Оказывается, B_D12 - это поле таблицы. Тогда конструкция с IF - не проходит...
...
Рейтинг: 0 / 0
Мощь FPD VS Delphi
    #33425353
Volokola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По моему Locate и Select "идеологически" разные команды. Locate находит в таблице первую запись, удовлетворяющей условию и остановливается на ней. Select возвращает все записи с таким условием( в данном случае одна), перелапачивая всю таблицу(если нет индекса). Поэтому отрабатывает дольше.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Мощь FPD VS Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]