|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
И то, и другое можно использовать. Попадание в диапазон - всего два условия (если >= началу диапазона AND если <= концу диапазона), так что вполне можно использовать фильтрацию, это будет проще. Только не забудьте о приведении запятой к точке в числах.
|
#17
|
|||
|
|||
Попробую через sql
При работе с Adoquery1 , содержимое таблицы можно увидеть только по созданию формы? Последний раз редактировалось Maks19, 10.07.2020 в 14:08. |
#18
|
||||
|
||||
Для того, чтобы увидеть содержимое датасета (Query или Table), необходимо через DataSource подключить компонент визуализации (DBGrid, например). Разумеется, первое, что должно быть создано, - это форма.
|
#19
|
|||
|
|||
Я имел в виду ,что данные таблицы не видно если не запустить форму это при query в отличие от table. Так ли это?
|
#20
|
||||
|
||||
Данные датасетов, если они созданы и активированы, видны из любой точки приложения, даже если формы, на которых они расположены, не видны. Тут главное - что датасеты есть и активированы, а где конкретно лежат - не важно. Вот, например, из моей программы, пример такого доступа:
Код:
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
|
|||
|
|||
Не понятно ,как работает код?
Код:
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; |
#22
|
||||
|
||||
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
|
|||
|
|||
Цитата:
Цитата:
Цитата:
Последний раз редактировалось Maks19, 18.07.2020 в 16:07. |
#24
|
||||
|
||||
1. Я ж написал, что сравнение "больше/меньше" для типа String не имеет смысла. SQL-запрос (или фильтрация датасета, без разницы) выполнится, но на выходе получите фигню, т.е. не то, что запрашивали. Вам нужно преобразовать тип поля с числами во Float, и далее с этим полем работать, как с числовым.
2. Как взять данные из датасета? Да это было уже: Код:
MyQuery.FieldByName('NameOfMyField').AsFloat; 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
|
|||
|
|||
Цитата:
Цитата:
Цитата:
Последний раз редактировалось Maks19, 20.07.2020 в 21:04. |
#26
|
||||
|
||||
Код:
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; Здесь сначала введённые числа преобразуются во 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; Последний раз редактировалось Guaho, 20.07.2020 в 22:21. |
#27
|
|||
|
|||
Я хотел отметить, что интервалы не вводятся в поля, а заданные. А вот 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
|
||||
|
||||
Не знаю Ваших задач, но мне непонятно, зачем всенепременно копировать данные из датасета в массив, если датасет сам и есть массив нужных записей? Для какой-то хитрой математической обработки, которую удобнее делать в массиве? Ну может быть...
В приведённом Вами коде значение из поля "Cy" пишется в массив, как Вам и нужно. Если надо читать из других полей, читайте аналогично (MyTable.FieldByName('Другое_поле').AsFloat). Вернуть массив значений из поля "cy" можно, последовательно перебирая записи датасета и записывая их в массив - всё, как в приведённом Вами примере (см. последний блок кода). |