![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Как правильно создать таблицы и установить связи м/у ними для хранения данных. Т. е данные в таблицах должны храниться и по значениям вводимых данных браться нужные значения и этих таблиц.
Физически таблицы с данными имеют такой вид, столбцы alfa, Cy, Сx,Cm,Cn,Cp 0 значения 1 значения .. 8 значения таблицы отличаются друг от друга параметром который вводится в исходные данные , а по исходным данным должны определиться нужная таблица со своими alfa, Cy, Сx,Cm,Cn,Cp |
|
#2
|
||||
|
||||
|
Связи разные бывают... Какие именно нужны? И очень расплывчато поставлен вопрос в целом.
|
|
#3
|
|||
|
|||
|
Допустим есть таблица (она во вложении). Как осуществить поиск по заданным полям lambda и kappa и осуществить выбор значений из полей Cx, Cy,Cp (они заполнены все значениями)? Т. е выбор значений Cx, Cy,Cp для каждого (т. е для 0,5,10,15,20,25,30,35,40) из поля alfa.
Возможно таблицу нужно разбить на несколько? Главное извлечь нужные данные. Последний раз редактировалось Maks19, 04.07.2020 в 01:29. |
|
#4
|
||||
|
||||
|
Метод Locate в помощь для поиска. Может искать сразу по нескольким полям. Также можно использовать св-во Filter, или делать SQL-запрос по заданным условиям.
Код:
MyTable.Locate('lambda; kappa; alfa', VarArrayOf([VarLambda, VarKappa, VarAlfa]), [loCaseInsensitive]);Если нужно искать данные по одним полям, а извлекать данные из других - сначала находите нужную запись Locat-ом, затем, т.к. курсор-указатель в таблице установился на нужную Вам запись, получаете нужные данные: Код:
VarCx := MyTable.FieldByName('Cx').AsFloat;Последний раз редактировалось Guaho, 06.07.2020 в 20:45. |
|
#5
|
|||
|
|||
|
Записал такой код, но в массив записывается числа вообще не
из таблицы. Код:
ADOTAble1.First;
while AdoTable1.Locate('lambda',lambda,[]) and AdoTable1.Locate('kappa',lkappa,[])
do begin
for i:=0 to 8 do
begin
c[i]:=AdoTAble1.FieldByName('cy').Asstring;
Adotable1.Next;
end;
end;
|
|
#6
|
||||
|
||||
|
Команда "while" здесь ни к чему абсолютно. Она Вам и делает чудеса. Метод Locate возвращает true, если запись найдена. На это и нужно опираться:
Код:
if AdoTable1.Locate... then ... Последний раз редактировалось Guaho, 06.07.2020 в 23:54. |
|
#7
|
|||
|
|||
|
Пока понятно, что
Код:
If adotable1.Locate('lambda',lambda),[])
Последний раз редактировалось Maks19, 07.07.2020 в 09:24. |
|
#8
|
||||
|
||||
|
Это смотря как искать, в смысле какого типа у Вас переменная lambda. Если float (double то есть), то тогда надо предварительно запятые заменять на точки:
Код:
S_lambda:= FloatToStr(lambda); S_lambda:= StringReplace(S_lambda, ',', '.', []); S_lambda := StrToFloat(S_S_lambda); Кроме того, с Float-числами могут быть казусы вроде 4 = 3,99999999999, из-за чего существующее в таблице значение может быть НЕ найдено. Например, я в своей программе с этим столкнулся, поэтому пришлось усложнить SQL-запрос (с использованием допустимого отклонения), чтобы данные в любом случае находились. Последний раз редактировалось Guaho, 07.07.2020 в 09:25. |
|
#9
|
|||
|
|||
|
У переменной lambda тип real. С real не будет искать?
|
|
#10
|
||||
|
||||
|
Real - это тот же Double (Float), только вид сбоку. Механизм базы данных использует в качестве разделителя ЧИСЕЛ точку, а не запятую, поэтому нужно сделать замену запятой на точку. Можете попробовать по-другому (это ТОЛЬКО для случаев, когда потребуется поиск с точным совпадением, а не варианты с "больше/меньше"): сделайте переменную Slambda типа String, запишите туда искомое значение, и ищите:
Код:
If adotable1.Locate('lambda', Slambda),[]) then ...Последний раз редактировалось Guaho, 07.07.2020 в 10:26. |
|
#11
|
|||
|
|||
|
Locate возвращает true,но
по такому коду выдает нули. Код:
begin
c[i]:=AdoTAble1.FieldByName('cy').Asstring |
|
#12
|
||||
|
||||
|
Locate возвращает true - значит запись найдена. Почему возвращаются нули - ищите. Для контроля того, что происходит, даже без дебага, можно использовать ShowMessage либо запись событий в самодельный лог (Memo).
|
|
#13
|
|||
|
|||
|
Цитата:
Код:
for i: =0 to 8 do
c[i ]:=adotable1.fieldbyname('cy').asstring;
Последний раз редактировалось Maks19, 07.07.2020 в 15:12. |
|
#14
|
|||
|
|||
|
Вроде выводит
Последний раз редактировалось Maks19, 07.07.2020 в 15:27. |
|
#15
|
|||
|
|||
|
Цитата:
|