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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 25.06.2019, 23:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Можно и через TTable сделать, установить сортировку и фильтрацию. Но проще через TQuery.
Ответить с цитированием
  #17  
Старый 26.06.2019, 00:56
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

В запросе
Выбор из таблицы SrcTable. Что такое SrcTable?
SELECT * FROM SrcTable
отбираются поле id равные :PID.
:PID это индексное первое поле в таблице Project ?
WHERE PROJECT_ID = :PID
И сортируются в порядке возрастания?
ORDER BY ID ASC

В каком обработчике писать этот запрос ?
Ответить с цитированием
  #18  
Старый 26.06.2019, 06:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

SrcTable - имя таблицы из которой производится выборка
:PID - параметр. Сюда надо будет "положить" ID из таблицы проектов
И да, сортировка по возрастанию по полю ID

В том, в котором выбирается проект. Выбрал проект - положи его ID в параметр и выполни запрос.
Ответить с цитированием
  #19  
Старый 26.06.2019, 23:36
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Я так передавал имя проекта в табл 1 и одновременно поиском делал текущим.
Код:
if  not (ComboBox1.Text='') then
 begin
 if not Table1.Locate('Projname',ComboBox1.Text,[]) then
 begin
 Table1.Insert;
 Table1.FieldByName('Projname').AsString:=ComboBox1.Text;
Form1.Caption:=Table1.FieldByName('Projname').AsString;
  Table1.Post;

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

Я хотел подключить dbgrid к query1,т.е чтобы в dbgrid отобразились поля ,как при компоненте table, а у меня вышло сообщение query1:no sql statement available
Ответить с цитированием
  #21  
Старый 28.06.2019, 05:20
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну тебе же говорят - нету запроса. Надо ввести запрос, что бы DBGrid смог его выполнить и получить имена колонок.
Ответить с цитированием
  #22  
Старый 28.06.2019, 07:33
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Я вот так написал :
Код:
Query1.Close;
  Query1.SQL.Clear;
 Query1.SQL.Add ('SELECT*FROM TableRezult.db');
Query1.SQL.Add ('WHERE Table1.RecNo=:PID');
 Query1.SQL.Add('ORDER BY ID ASC');
   Query1.Open;

lmikle: пользуемся тегами для оформления кода. последнее предупреждение.

Но строчка Query1.SQL.Add ('WHERE Table1.RecNo=:PID')
вызывает ошибку. Pid этот параметр так и записывать? И куда он передается?
RecNo я хотел вернуть номер id у таблицы 1.

Последний раз редактировалось lmikle, 28.06.2019 в 19:41.
Ответить с цитированием
  #23  
Старый 28.06.2019, 19:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вызывает ошибку, т.к. в запросе нет такой таблицы "Table1". Более того, тут этот префикс просто не нужен, т.к. левая часть, имя поля, предполягает именно поле таблицы, из которой производится быборка.
А парамет PID заполняется перед ВЫПОЛНЕНИЕМ запроса через специальное св-во.
Код:
...
Query1.ParamByName('PID').AsInteger := Table1.FieldByName('ID').AsInteger;
Query1.Open;
...

PS. Ну вот ответь на вопрос - ЗАЧЕМ?
ЗАЧЕМ ты хочешь использовать БД ничего не понимая и не зная в этой области. Чем тебе обычный файл не угодил? Написать сериализацию/десериализацию для подобной структуры занимает макс. 1 час. Более того, ты ее все-равно будешь писать, только в извращенном виде заполнения БД данными, которые не очень-то подходят для хранения в БД (точнее их структура не ложится на БД, имеется в виду обычные, так сказать классические, реляционные БД).
Ответить с цитированием
  #24  
Старый 28.06.2019, 20:58
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle

PS. Ну вот ответь на вопрос - ЗАЧЕМ?
ЗАЧЕМ ты хочешь использовать БД ничего не понимая и не зная в этой области. Чем тебе обычный файл не угодил?
Угодил. Я и использованием файлов не совсем представляю, как сделать. Не понятно сколько файлов использовать? Как сделать чтобы при удалении 1 одного проекта, удалялись связанные с ним исходные данные и результаты, т .е их как из связать?
С базами хотел разобраться. Как хранить данные в базе.
Ответить с цитированием
  #25  
Старый 29.06.2019, 03:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

Проект это любое не повторяющееся буквенное или числовое значение.
Ввод данных происходит через 11 Edit и еще три edit (12,13,14) становятся активные по checkbox, если не активный то edit 12, 13,14 равны 0.
Выходные данные массив 6x19 числовые данные. Т. е нужно сохранить все данные после закрытия окна программы, чтобы данные не исчезали. Привязка исходных данных и результатов должна быть к проекту. Т .е одному проекту свой набор исх. данных и результатов. При выборе (переходе от одного проекта к другому) в полях ввода editax также должны меняться исх. данные, т. е перешел к другому проекту в editax должны отобразиться соответствующие данные.
Ответить с цитированием
  #27  
Старый 29.06.2019, 18:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот класс для хранения всего этого добра в одном файле:
Код:
unit Unit2;

interface

uses
  Classes, SysUtils;

type
  TModel = class
  private
    procedure Init;
  public
    PrjName : String;
    Results : Array[1..6,1..19] Of Integer;
    Sources : Array[1..14] Of Integer;
    Enabled_12_14 : Boolean;

    constructor Create;
    constructor Load(AStream : TStream); overload;
    constructor Load(AFileName : String); overload;
    destructor Destroy; override;

    procedure LoadFRomFile(AFileName : String);
    procedure SaveToFile(AFileName : String);

    procedure LoadFromStream(AStream : TStream);
    procedure SaveToStream(AStream : TStream);
  end;

implementation

procedure TModel.Init;
var
  I, J : Integer;
begin
  PrjName := '';
  For I := Low(Sources) To High(Sources) Do
    Sources[i] := 0;
  For I := Low(Results) To High(Results) Do
    For J := Low(Results[i]) To High(Results[i]) Do
      Results[I,J] := 0;
  Enabled_12_14 := False;
end;

constructor TModel.Create;
begin
  inherited;
  Init;
end;

constructor TModel.Load(AStream : TStream);
begin
  inherited Create;
  Init;
  LoadFromStream(AStream);
end;

constructor TModel.Load(AFileName : String);
begin
  inherited Create;
  Init;
  LoadFromFile(AFileName);
end;

destructor TModel.Destroy;
begin
  inherited;
end;

procedure TModel.LoadFRomFile(AFileName : String);
var
  AStream : TFileStream;
begin
  AStream := TFileStream.Create(AFileName, fmOpenRead);
  Try
    LoadFromStream(AStream);
  Finally
    AStream.Free;
  End;
end;

procedure TModel.SaveToFile(AFileName : String);
var
  AStream : TFileStream;
begin
  AStream := TFileStream.Create(AFileName, fmCreate);
  Try
    SaveToStream(AStream);
  Finally
    AStream.Free;
  End;
end;

procedure TModel.LoadFromStream(AStream : TStream);
var
  I, J : Integer;
begin
  // Read project name
  AStream.ReadBuffer(I,SizeOf(Integer));
  SetLength(PrjName,I);
  AStream.ReadBuffer(PrjName[1],I*SizeOf(Char));

  // Read source data
  For I := Low(Sources) To High(Sources) Do
    AStream.ReadBuffer(Sources[i],SizeOf(Integer));
  AStream.ReadBuffer(Enabled_12_14,SizeOf(Boolean));

  // Read results
  For I := Low(Results) To High(Results) Do
    For J := Low(Results[i]) To High(Results[i]) Do
      AStream.ReadBuffer(Results[I,J],SizeOf(Integer));
end;

procedure TModel.SaveToStream(AStream : TStream);
var
  I, J : Integer;
begin
  // Write project name
  I := Length(PrjName);
  AStream.WriteBuffer(I,SizeOf(Integer));
  AStream.WriteBuffer(PrjName[1],I*SizeOf(Char));

  // Write source data
  For I := Low(Sources) To High(Sources) Do
    AStream.WriteBuffer(Sources[i],SizeOf(Integer));
  AStream.WriteBuffer(Enabled_12_14,SizeOf(Boolean));

  // Write results
  For I := Low(Results) To High(Results) Do
    For J := Low(Results[i]) To High(Results[i]) Do
      AStream.WriteBuffer(Results[I,J],SizeOf(Integer));
end;

end.
Ты не сказал какой тип данных, соотв. я для простоты поставил Integer.

Аот пример использования из программы:
Код:
uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
var
  I : Integer;
begin
  With TModel.Create Do
    begin
      PrjName := 'Project1';
      For I := Low(Sources) To High(Sources) Do
        Sources[i] := Random(10);
      SaveToFile('c:\work\projects\prj1.dat');
      Free;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  With TModel.Load('c:\work\projects\prj1.dat') Do
    begin
      ShowMessage(PrjName);
      Free;
    end;
end;

Код работы с компонентами сам напишешь.

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

Код:
With TModel.Create Do
    begin
      PrjName := 'Project1';
      For I := Low(Sources) To High(Sources) Do
        Sources[i] := Random(10);
      SaveToFile('c:\work\projects\prj1.dat');
      Free;
Подскажите в этом коде что делается?
Ответить с цитированием
  #29  
Старый 01.07.2019, 00:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

в этом коде создается новый объект для хранения данных, заполняется случайными значениями, потом сохраняется в файл и в конце удаляется.
Построчно:
1. Создание объекта
3-5. Заполняем поля объекта какими-то данными. Тебе тут надо будет вставить заполнение из разных компонентов (Edit, CheckBox, etc)
6. сохранение в файл
7. удаление объекта, он нам больше не нужен.
Ответить с цитированием
  #30  
Старый 02.07.2019, 12:46
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 119
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Вот так у меня происходит ввод данных
Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
 if Edit1.Text<>'' then Dmin:=strtofloat(Edit1.Text);
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
if Edit2.Text<>'' then lnas:=strtofloat(Edit2.Text);
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
if Edit3.Text<>'' then lm:=strtofloat(Edit3.Text);
end;

procedure TForm1.Edit4Change(Sender: TObject);
begin
if Edit4.Text<>'' then v0:=strtofloat(Edit4.Text);
end;

procedure TForm1.Edit5Change(Sender: TObject);
begin
if Edit5.Text<>'' then p1:=strtofloat(Edit5.Text);
end;

procedure TForm1.Edit6Change(Sender: TObject);
begin
 if Edit6.Text<>'' then Dv:=strtofloat(Edit6.Text);
end;


procedure TForm1.Edit8Change(Sender: TObject);
begin
if Edit8.Text<>'' then ro:=strtofloat(Edit8.Text);
end;

procedure TForm1.Edit9Change(Sender: TObject);
begin
if Edit9.Text<>'' then psi1:=strtofloat(Edit9.Text);
end;
procedure TForm1.Edit10Change(Sender: TObject);
begin
 if Edit10.Text<>'' then vz:=strtofloat(Edit10.Text);
end;

procedure TForm1.Edit11Change(Sender: TObject);
begin
if Edit11.Text<>'' then p2:=strtofloat(Edit11.Text);
end;
procedure TForm1.Edit12Change(Sender: TObject);
begin
 if Edit12.Text<>'' then psi2:=strtofloat(Edit12.Text);
end;
procedure TForm1.Edit13Change(Sender: TObject);
begin
 if Edit13.Text<>'' then bst:=strtofloat(Edit13.Text);
end;
procedure TForm1.Edit14Change(Sender: TObject);
begin
if Edit14.Text<>'' then hst:=strtofloat(Edit14.Text);
end;
procedure TForm1.Edit15Change(Sender: TObject);
begin
if Edit15.Text<>'' then bst1:=strtofloat(Edit15.Text);
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin

if CheckBox1.Checked then
begin
GroupBox1.Visible:=True;
hst:=strtofloat(Edit14.Text);
bst1:=strtofloat(Edit15.Text);
end
else
begin

GroupBox1.Visible:=False;
 hst:=0;
 bst1:=0;
end;
end;

По созданию формы записаны выражения
Код:
Dmin:=strtofloat(Edit1.Text);
lnas:=strtofloat(Edit2.Text);
lm:=strtofloat(Edit3.Text);
v0:=strtofloat(Edit4.Text);
vz:=strtofloat(Edit10.Text);
p1:=strtofloat(Edit5.Text);
p2:=strtofloat(Edit11.Text);
Dv:=strtofloat(Edit6.Text);

ro:=strtofloat(Edit8.Text);
psi1:=strtofloat(Edit9.Text);
psi2:=strtofloat(Edit12.Text);
bst:=strtofloat(Edit13.Text);
hst:=strtofloat(Edit14.Text);
bst1:=strtofloat(Edit15.Text);
GroupBox1.Visible:=False;

тут передача данных в цикле

Код:
For I := Low(Sources) To High(Sources) Do
   Sources[i] := Random(10);

А мне как передавать исходные данные?

Последний раз редактировалось Maks19, 02.07.2019 в 13:59.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter