|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
Цитата:
|