Форум по Delphi программированию

 



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 09.07.2020, 18:18
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 137
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

И то, и другое можно использовать. Попадание в диапазон - всего два условия (если >= началу диапазона AND если <= концу диапазона), так что вполне можно использовать фильтрацию, это будет проще. Только не забудьте о приведении запятой к точке в числах.
Ответить с цитированием
  #17  
Старый 10.07.2020, 10:57
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 110
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Попробую через sql
При работе с Adoquery1 , содержимое таблицы можно увидеть только по созданию формы?

Последний раз редактировалось Maks19, 10.07.2020 в 14:08.
Ответить с цитированием
  #18  
Старый 10.07.2020, 20:15
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 137
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Для того, чтобы увидеть содержимое датасета (Query или Table), необходимо через DataSource подключить компонент визуализации (DBGrid, например). Разумеется, первое, что должно быть создано, - это форма.
Ответить с цитированием
  #19  
Старый 11.07.2020, 08:56
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 110
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Я имел в виду ,что данные таблицы не видно если не запустить форму это при query в отличие от table. Так ли это?
Ответить с цитированием
  #20  
Старый 11.07.2020, 22:51
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 137
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Данные датасетов, если они созданы и активированы, видны из любой точки приложения, даже если формы, на которых они расположены, не видны. Тут главное - что датасеты есть и активированы, а где конкретно лежат - не важно. Вот, например, из моей программы, пример такого доступа:
Код:
GlobalTempatesFilter := fm_templates.q_KeyWords.Filter;
GlobalTempatesFiltered := fm_templates.q_KeyWords.Filtered; // получение данных (свойств датасета) из другого окна.
......
fm_templates.q_KeyWords.Filter := 'Naimen LIKE "%' + trim(eCopyNameOfKomp.SelText) + '%"'; // Фильтрация датасета q_KeyWords, расположенного в другом окне.
fm_templates.q_KeyWords.Filtered := true;

Последний раз редактировалось Guaho, 11.07.2020 в 22:54.
Ответить с цитированием
  #21  
Старый 16.07.2020, 17:31
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 110
Версия Delphi: Delphi7
Репутация: 10
Хорошо

Не понятно ,как работает код?

Код:
lambda =1.3
If (lambda>1.2) and (lambda<1.6) then
begin
Adoquery1.close;
Adoquery1.sql.clear;
Adoquery1.sql.add('select lambda from table);
Adoquerty1.sql.add(where lambda>"1.2" and lambda<"1.6" ');
for i:=0 to 8 do 
begin
c[i ]:=strtofloat(adotable1.fieldbyname('cy').asstring);

end;
Даже если в таблице в поле lambda нет записей >1.2 и <1.6 то все равно происходит sql запрос. Или не так нужно делать?
Ответить с цитированием
  #22  
Старый 16.07.2020, 20:17
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 137
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

1. Датасет закрывать отдельной командой (Adoquery1.close) не нужно, он автоматически закроется сам, как только начнёте его изменять (та же команда clear это и сделает).
2. Имя таблицы - "table" - выбрано неудачно, может оказаться ключевым словом! Назовите хотя бы MyTable. А лучше - чтобы название отображало суть. По этой же причине названия типа "Adoquery1" являются неудачными, т.к. ничего не говорят о том, что это за датасет. Вам же самому неудобно будет с этим работать. Даже если проект небольшой с несколькими датасетами - уже будет непонятка, постоянные воспоминания, что есть что. Лучше не лениться и сразу давать внятные имена, и не только датасетам, а всем компонентам, к которым обращаетесь программно.
3. Что-то я не увидел команды открытия датасета (Adoquery1.Open). Без этого никакого доступа к данным не будет.
4. Числа не нужно брать в кавычки! В этом случае выражение "1.2" воспринимается как строка, и сравнение "больше/меньше" теряет всякий смысл.
5. Непонятно, зачем в приведённом фрагменте первый if, если то же самое условие отрабатывается в запросе.
6. SQL-запрос будет выполняться, даже если в таблице нет ни одной записи. Главное, чтоб сам запрос не содержал синтаксических ошибок.
7. Непонятен смысл цикла в конце фрагмента. Зачем заносить в массив данные, которые есть в датасете, если можно их брать из датасета?
8. Также совершенно неверно всунуто преобразование типов в 10-й строке. Поле "cy" какого типа у Вас? Если Float, тогда и пишите adotable1.fieldbyname('cy').AsFloat. А подобные преобразования типов ни к чему, это прямой путь к багам, да и рискуете поймать исключение.

Последний раз редактировалось Guaho, 16.07.2020 в 20:28.
Ответить с цитированием
  #23  
Старый 18.07.2020, 15:26
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 110
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Числа не нужно брать в кавычки! В этом случае выражение "1.2" воспринимается как строка, и сравнение "больше/меньше" теряет всякий смысл.
Если в этом поле хранятся строковые данные то как записать условие?
Цитата:
можно их брать из датасета?
Как их взять из датасета?
Цитата:
Непонятно, зачем в приведённом фрагменте первый if, если то же самое условие отрабатывается в запросе.
Каким образом поставить условие ,что если 0,7<lambda<1,2 то произвести интерполяцию с записями (для тех записей чьи lambda равны 0,7 и тех чьи 1,2 )?

Последний раз редактировалось Maks19, 18.07.2020 в 16:07.
Ответить с цитированием
  #24  
Старый 18.07.2020, 22:05
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 137
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

1. Я ж написал, что сравнение "больше/меньше" для типа String не имеет смысла. SQL-запрос (или фильтрация датасета, без разницы) выполнится, но на выходе получите фигню, т.е. не то, что запрашивали. Вам нужно преобразовать тип поля с числами во Float, и далее с этим полем работать, как с числовым.
2. Как взять данные из датасета? Да это было уже:
Код:
MyQuery.FieldByName('NameOfMyField').AsFloat;
Будет взято значение из текущей записи. Изменить положение курсора, указывающего на запись, можно методами датасета First. Prior, Next, Last.
3. Ну, во-первых, если стоит задача "если 0,7<lambda<1,2 то произвести интерполяцию с записями (для тех записей чьи lambda равны 0,7 и тех чьи 1,2 )", то ничего не выйдет, потому что первое условие исключает второе, т.к. отсекает значения на краях диапазона. Надо так: "если 0,7 <= lambda <= 1,2".
Во-вторых, я не уверен, что правильно Вас понимаю. Ведь оба условия вообще-то сводятся к одному - нужно найти записи, у которых lambda = 0,7 или lambda = 1,2. В первом условии тоже фигурирует lambda, но оно относится к этой самой таблице или к другой? Если к этой самой, то первое условие не нужно, достаточно второго. Вы, конечно, можете сделать запрос с двумя условиями, но результат будет тот же самый, если оставить только второе.
Если же это разные таблицы, тогда надо смотреть структуру, как там оно у Вас сделано, какой тип связи между таблицами (как раз по названию темы)))). Быть может, понадобится вложенный SQL-запрос, но не факт.

Последний раз редактировалось Guaho, 18.07.2020 в 22:08.
Ответить с цитированием
  #25  
Старый 20.07.2020, 20:37
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 110
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
3. Ну, во-первых, если стоит задача "если 0,7<lambda<1,2 то произвести интерполяцию с записями (для тех записей чьи lambda равны 0,7 и тех чьи 1,2 )", то ничего не выйдет, потому что первое условие исключает второе, т.к. отсекает значения на краях диапазона. Надо так: "если 0,7 <= lambda <= 1,2".
Была идея, сначала искать lambda и если нужное lambda не найдено , то производить интерполяцию между теми lambda куда попадает заданное lambda. Может так и не правильно.
Цитата:
Во-вторых, я не уверен, что правильно Вас понимаю. Ведь оба условия вообще-то сводятся к одному - нужно найти записи, у которых lambda = 0,7 или lambda = 1,2. В первом условии тоже фигурирует lambda, но оно относится к этой самой таблице или к другой?
Пока у меня все все храниться в одной таблице. Возможно, что оптимальнее надо разбить на несколько.
Цитата:
Ведь оба условия вообще-то сводятся к одному - нужно найти записи, у которых lambda = 0,7 или lambda = 1,2.
Да. Но если lambda равно 0,9 то, нужно произвести интерполяцию.

Последний раз редактировалось Maks19, 20.07.2020 в 21:04.
Ответить с цитированием
  #26  
Старый 20.07.2020, 22:12
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 137
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Код:
          try
            InputLambda1 := StrToFloat(eLambda1.Text);
            InputLambda2 := StrToFloat(eLambda2.Text);
          except
            ShowMessae('Введены нечисловые данные!');
          end;
      SLam1 := FloatToStr(InputLambda1);
      SLam1 := StringReplace(SLam1, ',', '.', []);
      SLam2 := FloatToStr(InputLambda2);
      SLam2 := StringReplace(SLam2, ',', '.', []);
MyTable.Filter := '(lambda > ' + SLam1 + ') AND (lambda < ' + SLam2 + ')';
MyTable.Filtered := True;
Этот код надо повесть на обработчики OnChange Edit-ов eLambda1 и 2, в которые пользователь вводит границы диапазона.
Здесь сначала введённые числа преобразуются во Float, это необходимо для проверки правильности ввода. Затем - обратно в String, причём возможная запятая в числах заменяется на точку. А далее - фильтрация датасета. В результате получите набор данных, в котором lambda попадает в заданный диапазон.
Ну а далее -
Код:
if MyTable.RecordCount > 0 then
begin
MyTable.First;
for i := 1 to MyTable.RecordCount do
MyResult := MyTable.FieldByName('lambda').AsFloat;
... тут далее анализ числа в MyResult, интерполяция и любые другие действия, что пожелаете.
MyTable.Next;
end;
Всё. Ничего сложного. Да, и не забудьте, что поле lambda обязательно должно быть типа Float.

Последний раз редактировалось Guaho, 20.07.2020 в 22:21.
Ответить с цитированием
  #27  
Старый 22.07.2020, 21:11
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 110
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Я хотел отметить, что интервалы не вводятся в поля, а заданные. А вот lambda задается.
Цитата:
Код:
if MyTable.RecordCount > 0 then
begin
MyTable.First;
for i := 1 to MyTable.RecordCount do
MyResult := MyTable.FieldByName('lambda').AsFloat;
... тут далее анализ числа в MyResult, интерполяция и любые другие действия, что пожелаете.
MyTable.Next;
end;
Тут идет перебор по всем записям , а что записывается в MyResult? Я так понимаю,что одно значение, не массив. А как вернуть массив значений из поля cy, соответствующий записям попадающих в заданный интервал по полю lambda?
так ?
Код:
if MyTable.RecordCount > 0 then
begin
MyTable.First;
for i := 1 to 8 do
 MyResult[i]:=MyTable.FieldByName('Cy').AsFloat;  
MyTable.Next;
end;

Последний раз редактировалось Maks19, 22.07.2020 в 21:30.
Ответить с цитированием
  #28  
Старый 23.07.2020, 00:50
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 137
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Не знаю Ваших задач, но мне непонятно, зачем всенепременно копировать данные из датасета в массив, если датасет сам и есть массив нужных записей? Для какой-то хитрой математической обработки, которую удобнее делать в массиве? Ну может быть...
В приведённом Вами коде значение из поля "Cy" пишется в массив, как Вам и нужно. Если надо читать из других полей, читайте аналогично (MyTable.FieldByName('Другое_поле').AsFloat).
Вернуть массив значений из поля "cy" можно, последовательно перебирая записи датасета и записывая их в массив - всё, как в приведённом Вами примере (см. последний блок кода).
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2020

ВКонтакте   Facebook   Twitter