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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.06.2020, 20:40
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Создание таблиц и связей

Здравствуйте! Как правильно создать таблицы и установить связи м/у ними для хранения данных. Т. е данные в таблицах должны храниться и по значениям вводимых данных браться нужные значения и этих таблиц.
Физически таблицы с данными имеют такой вид, столбцы
alfa, Cy, Сx,Cm,Cn,Cp
0 значения
1 значения
..
8 значения
таблицы отличаются друг от друга параметром который вводится в исходные данные , а по исходным данным должны определиться нужная таблица со своими alfa, Cy, Сx,Cm,Cn,Cp
Ответить с цитированием
  #2  
Старый 30.06.2020, 21:26
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 179
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Связи разные бывают... Какие именно нужны? И очень расплывчато поставлен вопрос в целом.
Ответить с цитированием
  #3  
Старый 04.07.2020, 00:54
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Допустим есть таблица (она во вложении). Как осуществить поиск по заданным полям lambda и kappa и осуществить выбор значений из полей Cx, Cy,Cp (они заполнены все значениями)? Т. е выбор значений Cx, Cy,Cp для каждого (т. е для 0,5,10,15,20,25,30,35,40) из поля alfa.
Возможно таблицу нужно разбить на несколько? Главное извлечь нужные данные.
Вложения
Тип файла: rar Книга1.rar (8.9 Кбайт, 0 просмотров)

Последний раз редактировалось Maks19, 04.07.2020 в 01:29.
Ответить с цитированием
  #4  
Старый 06.07.2020, 20:35
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 179
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Метод Locate в помощь для поиска. Может искать сразу по нескольким полям. Также можно использовать св-во Filter, или делать SQL-запрос по заданным условиям.
Код:
MyTable.Locate('lambda; kappa; alfa', VarArrayOf([VarLambda, VarKappa, VarAlfa]), [loCaseInsensitive]);
- пример поиска сразу по трём полям VarLambda, VarKappa, VarAlfa. Здесь VarLambda, VarKappa, VarAlfa - переменные, в которых задаются искомые значения.
Если нужно искать данные по одним полям, а извлекать данные из других - сначала находите нужную запись Locat-ом, затем, т.к. курсор-указатель в таблице установился на нужную Вам запись, получаете нужные данные:
Код:
VarCx := MyTable.FieldByName('Cx').AsFloat;
Locate находит первую запись, удовлетворяющую заданным условиям. А таких записей может оказаться несколько, поэтому правильнее будет использовать фильтрацию либо SQL-запрос, а потом перебирать записи полученного НД в цикле и извлекать оттуда данные.

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

Записал такой код, но в массив записывается числа вообще не
из таблицы.
Код:
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  
Старый 06.07.2020, 23:46
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 179
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Команда "while" здесь ни к чему абсолютно. Она Вам и делает чудеса. Метод Locate возвращает true, если запись найдена. На это и нужно опираться:
Код:
if AdoTable1.Locate... then ... 
Далее. Вы делаете два поиска, это не нужно и забирает дополнительное время. Правильнее искать сразу по двум полям (пример кода я приводил выше).

Последний раз редактировалось Guaho, 06.07.2020 в 23:54.
Ответить с цитированием
  #7  
Старый 07.07.2020, 09:09
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Пока понятно, что
Код:
If adotable1.Locate('lambda',lambda),[])
не находит, если lamda действительное число. Находит если целое.

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

Это смотря как искать, в смысле какого типа у Вас переменная lambda. Если float (double то есть), то тогда надо предварительно запятые заменять на точки:
Код:
S_lambda:= FloatToStr(lambda);
S_lambda:= StringReplace(S_lambda, ',', '.', []);
S_lambda := StrToFloat(S_S_lambda);
Тут ещё желательно преобразования типов заключить в защищённый блок try...
Кроме того, с Float-числами могут быть казусы вроде 4 = 3,99999999999, из-за чего существующее в таблице значение может быть НЕ найдено. Например, я в своей программе с этим столкнулся, поэтому пришлось усложнить SQL-запрос (с использованием допустимого отклонения), чтобы данные в любом случае находились.

Последний раз редактировалось Guaho, 07.07.2020 в 09:25.
Ответить с цитированием
  #9  
Старый 07.07.2020, 09:52
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

У переменной lambda тип real. С real не будет искать?
Ответить с цитированием
  #10  
Старый 07.07.2020, 10:22
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 179
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Real - это тот же Double (Float), только вид сбоку. Механизм базы данных использует в качестве разделителя ЧИСЕЛ точку, а не запятую, поэтому нужно сделать замену запятой на точку. Можете попробовать по-другому (это ТОЛЬКО для случаев, когда потребуется поиск с точным совпадением, а не варианты с "больше/меньше"): сделайте переменную Slambda типа String, запишите туда искомое значение, и ищите:
Код:
If adotable1.Locate('lambda', Slambda),[]) then ...
В этом случае никакое преобразование делать не надо, т.к. данные будут искаться как стринг.

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

Locate возвращает true,но
по такому коду выдает нули.
Код:
begin
c[i]:=AdoTAble1.FieldByName('cy').Asstring
Ответить с цитированием
  #12  
Старый 07.07.2020, 13:36
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 179
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Locate возвращает true - значит запись найдена. Почему возвращаются нули - ищите. Для контроля того, что происходит, даже без дебага, можно использовать ShowMessage либо запись событий в самодельный лог (Memo).
Ответить с цитированием
  #13  
Старый 07.07.2020, 13:49
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guaho
Locate возвращает true - значит запись найдена. Почему возвращаются нули - ищите. Для контроля того, что происходит, даже без дебага, можно использовать ShowMessage либо запись событий в самодельный лог (Memo).
Выводит,но только первый элемент массива, остальные ,нули .Что может быть не так?
Код:
for i: =0 to 8 do
c[i ]:=adotable1.fieldbyname('cy').asstring;

Последний раз редактировалось Maks19, 07.07.2020 в 15:12.
Ответить с цитированием
  #14  
Старый 07.07.2020, 15:13
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Вроде выводит

Последний раз редактировалось Maks19, 07.07.2020 в 15:27.
Ответить с цитированием
  #15  
Старый 09.07.2020, 09:48
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guaho
Метод Locate в помощь для поиска. Может искать сразу по нескольким полям. Также можно использовать св-во Filter, или делать SQL-запрос по заданным условиям.
Код:
MyTable.Locate('lambda; kappa; alfa', VarArrayOf([VarLambda, VarKappa, VarAlfa]), [loCaseInsensitive]);
- пример поиска сразу по трём полям VarLambda, VarKappa, VarAlfa. Здесь VarLambda, VarKappa, VarAlfa - переменные, в которых задаются искомые значения.
Если нужно искать данные по одним полям, а извлекать данные из других - сначала находите нужную запись Locat-ом, затем, т.к. курсор-указатель в таблице установился на нужную Вам запись, получаете нужные данные:
Код:
VarCx := MyTable.FieldByName('Cx').AsFloat;
Locate находит первую запись, удовлетворяющую заданным условиям. А таких записей может оказаться несколько, поэтому правильнее будет использовать фильтрацию либо SQL-запрос, а потом перебирать записи полученного НД в цикле и извлекать оттуда данные.
А если надо поставить условие, что если не найдена такое лямда и что если попадает а заданный интервал надо произвести определенные действия то ,что использовать SQL запрос, фильтрацию?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter