Помогите разобраться с БД
madfallos
Специалист
4/4/2007, 11:23:48 PM
Начал писать базу на Delphi 7
вот первая форма:
unit MyForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MyModule, ComCtrls, StdCtrls, Mask, DBCtrls, Grids, DBGrids,
ExtCtrls;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
TabSheet6: TTabSheet;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
DBEdit4: TDBEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
DBMemo1: TDBMemo;
Label6: TLabel;
DBCheckBox1: TDBCheckBox;
DBCheckBox2: TDBCheckBox;
DBEdit5: TDBEdit;
DBEdit6: TDBEdit;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
TabSheet7: TTabSheet;
Button1: TButton;
DBComboBox1: TDBComboBox;
DBComboBox2: TDBComboBox;
DBComboBox3: TDBComboBox;
DBNavigator1: TDBNavigator;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
tab:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.Disp.Insert;
tab:=tab+1;
DataModule2.Disp.Fields.AsInteger:=tab;
DataModule2.Disp.Fields.AsString:=DBEdit1.text;
DataModule2.Disp.Fields.AsString:=DBEdit2.text;
DataModule2.Disp.Fields.AsInteger:=StrToInt(DBEdit3.text);
DataModule2.Disp.Fields.AsInteger:=StrToInt(DBEdit4.text);
DataModule2.Disp.Fields.AsInteger:=StrToInt(DBEdit5.text);
DataModule2.Disp.Fields.AsBoolean:=DBCheckBox2.checked;
DataModule2.Disp.Fields.AsBoolean:=DBCheckBox1.checked;
DataModule2.Disp.Fields.AsInteger:=StrToInt(DBEdit6.text);
if DBMemo1.lines.Count > 0 then
begin
TBlobField(DataModule2.Disp.Fields).BlobType:=ftMemo;
TBlobField(DataModule2.Disp.Fields).Assign(DBMemo1.Lines);
end;
DataModule2.Disp.Post;
end;
end.
Вот такие ошибки выдает при компиляции:
MyForm.pas(73): Undeclared identifier: 'TBlobField'
MyForm.pas(73): Missing operator or semicolon
MyForm.pas(74): Missing operator or semicolon
MyProject.dpr(6): Could not compile used unit 'MyForm.pas'
подскажите что делать, плизззз?
ЗЫ: в пограммировании я почти чайник, и пишу по книге Бобровского "Delphi7.Учебный курс"
вот первая форма:
unit MyForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MyModule, ComCtrls, StdCtrls, Mask, DBCtrls, Grids, DBGrids,
ExtCtrls;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
TabSheet6: TTabSheet;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
DBEdit4: TDBEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
DBMemo1: TDBMemo;
Label6: TLabel;
DBCheckBox1: TDBCheckBox;
DBCheckBox2: TDBCheckBox;
DBEdit5: TDBEdit;
DBEdit6: TDBEdit;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
TabSheet7: TTabSheet;
Button1: TButton;
DBComboBox1: TDBComboBox;
DBComboBox2: TDBComboBox;
DBComboBox3: TDBComboBox;
DBNavigator1: TDBNavigator;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
tab:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.Disp.Insert;
tab:=tab+1;
DataModule2.Disp.Fields.AsInteger:=tab;
DataModule2.Disp.Fields.AsString:=DBEdit1.text;
DataModule2.Disp.Fields.AsString:=DBEdit2.text;
DataModule2.Disp.Fields.AsInteger:=StrToInt(DBEdit3.text);
DataModule2.Disp.Fields.AsInteger:=StrToInt(DBEdit4.text);
DataModule2.Disp.Fields.AsInteger:=StrToInt(DBEdit5.text);
DataModule2.Disp.Fields.AsBoolean:=DBCheckBox2.checked;
DataModule2.Disp.Fields.AsBoolean:=DBCheckBox1.checked;
DataModule2.Disp.Fields.AsInteger:=StrToInt(DBEdit6.text);
if DBMemo1.lines.Count > 0 then
begin
TBlobField(DataModule2.Disp.Fields).BlobType:=ftMemo;
TBlobField(DataModule2.Disp.Fields).Assign(DBMemo1.Lines);
end;
DataModule2.Disp.Post;
end;
end.
Вот такие ошибки выдает при компиляции:
MyForm.pas(73): Undeclared identifier: 'TBlobField'
MyForm.pas(73): Missing operator or semicolon
MyForm.pas(74): Missing operator or semicolon
MyProject.dpr(6): Could not compile used unit 'MyForm.pas'
подскажите что делать, плизззз?
ЗЫ: в пограммировании я почти чайник, и пишу по книге Бобровского "Delphi7.Учебный курс"
kiskus
Новичок
4/6/2007, 2:30:41 PM
MyForm.pas(73): Missing operator or semicolon
забыл поставить закрывающие точку с запятой
в message box два раза кликни на сообшение об ошибке
в окне кода подсветится строка с ошибкой
в implementaion
напиши Uses Unit2; - имя датамодуля
забыл поставить закрывающие точку с запятой
в message box два раза кликни на сообшение об ошибке
в окне кода подсветится строка с ошибкой
в implementaion
напиши Uses Unit2; - имя датамодуля
madfallos
Специалист
4/6/2007, 4:26:31 PM
пасиб за совет
madfallos
Специалист
4/15/2007, 1:03:28 PM
и снова вопрос:
как создать связь один ко многим в Paradox?
есть главная таблица с ключевым полем "табельный номер", и есть еще одна таблица (в ней тоже есть поле "табельный номер"), несколько записей которой должны соответствовать одной записи в главной таблице.
ЗЫ: ни в одной книге не написано как это сделать (прям по шагам) :(((
как создать связь один ко многим в Paradox?
есть главная таблица с ключевым полем "табельный номер", и есть еще одна таблица (в ней тоже есть поле "табельный номер"), несколько записей которой должны соответствовать одной записи в главной таблице.
ЗЫ: ни в одной книге не написано как это сделать (прям по шагам) :(((
kiskus
Новичок
4/16/2007, 4:33:51 PM
Подчиненная таблица должна быть проиндексирована по полю
по которому будет вестись связь с главной таблицей.
Далее:
1.На форме или в датамодуле создаем компоненты (для примера) Table1 и
table 2
table1-мастер, прописываем названия дата базы и имя таблицы
table2-подчиненная таблица, прописываем названия дата базы и имя таблицы
кидаем 2 datasource и прописываем каждый к своей таблице
2.открываем окно objekt Tree viev
3.в окне кодировщика переходим на закладку (diagram),
должна быть открыта страница или формы или датамодуля
4.из окна Tree viev мышкой тянем на окно кодировщика название мастер таблицы, в окне кодировщика должен появиться прямоугольник с названием вашей мастер таблицы.То же делаем и для подчиненной таблицы
5.нажимаем кнопку master/detail connektor в верхней части окна около "глаза"
мышкой целимся в главную таблицу, курсор будет крестиком, нажимаем левую клавишу мыши и тянем на подчинённую таблицу
откроется окно Field link desinger.
В правой части указываем мастер поле в левой части указываем название подчиненного поля, вернее индекса Жмем Add потом OK
Всё связь Master - detail установлена.
по которому будет вестись связь с главной таблицей.
Далее:
1.На форме или в датамодуле создаем компоненты (для примера) Table1 и
table 2
table1-мастер, прописываем названия дата базы и имя таблицы
table2-подчиненная таблица, прописываем названия дата базы и имя таблицы
кидаем 2 datasource и прописываем каждый к своей таблице
2.открываем окно objekt Tree viev
3.в окне кодировщика переходим на закладку (diagram),
должна быть открыта страница или формы или датамодуля
4.из окна Tree viev мышкой тянем на окно кодировщика название мастер таблицы, в окне кодировщика должен появиться прямоугольник с названием вашей мастер таблицы.То же делаем и для подчиненной таблицы
5.нажимаем кнопку master/detail connektor в верхней части окна около "глаза"
мышкой целимся в главную таблицу, курсор будет крестиком, нажимаем левую клавишу мыши и тянем на подчинённую таблицу
откроется окно Field link desinger.
В правой части указываем мастер поле в левой части указываем название подчиненного поля, вернее индекса Жмем Add потом OK
Всё связь Master - detail установлена.
madfallos
Специалист
4/19/2007, 8:00:56 PM
и снова проблемы :)
как отфильтровать таблицу по полю, но только данные в это поле вводятся так: из комбобокса на 1 форме в переменную, затем по кнопке на другой форме из переменной в поле...ну и соответственно фильтр надо поставить на переменную...т.к. она меняться будет в последующем..но так чето не получается...
как отфильтровать таблицу по полю, но только данные в это поле вводятся так: из комбобокса на 1 форме в переменную, затем по кнопке на другой форме из переменной в поле...ну и соответственно фильтр надо поставить на переменную...т.к. она меняться будет в последующем..но так чето не получается...
kiskus
Новичок
4/19/2007, 9:46:32 PM
Фильтр в БД применяется при открытии таблиц.
Непонятно, куда ставится фильтр, или на значеня поля, или на переменную при вводе.
Непонятно, куда ставится фильтр, или на значеня поля, или на переменную при вводе.
madfallos
Специалист
4/20/2007, 11:11:27 AM
фильтр нужно сделать по полю, данные в которое вводятся из переменной, юзер набирает в форме число, оно уходит в переменную, затем при нажатии кнопки "Сохранить запись" на другой форме эта переменная записывается в текущую запись в нужное поле главной таблицы и я вычитал, что в датамодуле в свойстве Filter нужной таблицы надо писать <имя поля>=1, а мне надо <имя поля>=peremennaya...что собственно не получается...делфя понимает что это не переменная, а слово "peremennaya", находящееся в записях поля..и естессно не находит ничего, выдает ошибки, т.к. там цифры... как быть?
kiskus
Новичок
4/23/2007, 4:34:52 PM
Саммый простой способ отследить на уровне приложения то ,что вводит пользователь.
Пример:
Если через переменную и переменная цифра то
case PEREMM {переменная} of
1..100:begin
//делаем что то в диапазоне 1..100
end;
100,110,120:begin
//делаем что то при совпадении 100,110,120
end;
else
//делаем что то при несовпадении
end;
Фильтр на таблицу:
Фильтр срабатывает только при открытии таблицы
Table1.Close;
Table1.Filter:='Название поля =' + QuotedStr)
Table1.Filtered:=True;
Table1.Open
Таблица будет отфильтрована по полю -"Название поля" и значению
переменной PEREMM.
Не забывайте производить приведение типа данных в выражении фильтра
Выражение всегда строка.
Пример:
Если через переменную и переменная цифра то
case PEREMM {переменная} of
1..100:begin
//делаем что то в диапазоне 1..100
end;
100,110,120:begin
//делаем что то при совпадении 100,110,120
end;
else
//делаем что то при несовпадении
end;
Фильтр на таблицу:
Фильтр срабатывает только при открытии таблицы
Table1.Close;
Table1.Filter:='Название поля =' + QuotedStr)
Table1.Filtered:=True;
Table1.Open
Таблица будет отфильтрована по полю -"Название поля" и значению
переменной PEREMM.
Не забывайте производить приведение типа данных в выражении фильтра
Выражение всегда строка.
madfallos
Специалист
4/24/2007, 4:09:57 PM
пасиб, я попробовал через SQL...параметрический запрос...и получилось :)
но все равно спасибо
но все равно спасибо
madfallos
Специалист
5/9/2007, 5:33:34 PM
И снова проблема…
Имеем две формы, на одной стоит куча Edit’ов и прочей мелочи для ввода данных в базу, на второй – DBGrid, привязанный к той же базе для общего просмотра (точнее привязана к SQL-запросу), как сделать, чтобы при клике на одной из записей в таблице во второй форме выходила первая форма для ее редактирования.
Имеем две формы, на одной стоит куча Edit’ов и прочей мелочи для ввода данных в базу, на второй – DBGrid, привязанный к той же базе для общего просмотра (точнее привязана к SQL-запросу), как сделать, чтобы при клике на одной из записей в таблице во второй форме выходила первая форма для ее редактирования.
kiskus
Новичок
5/10/2007, 1:12:02 PM
Нужно отработать событие DbGrida - onDblClick
madfallos
Специалист
5/10/2007, 6:26:03 PM
а как попасть на нужную запись?
kiskus
Новичок
5/10/2007, 9:07:22 PM
Попасть на нужную запись можно методом поиска в Бд
пример:
Table1 - таблица с основной Бд
Query1 - таблица запроса
Метод Locate:
table1.locate('Поле поиска',переменная с данными для поиска,);
возвращает true в случае успеха.
Table1.Locate('Поле поиска',Query1.FieldValues,);
Если поле поиска индексировано, то используется индекс.
Работает быстро только на маленьких таблицах. Можно искать в Query.
Метод Goto Key:
Самый быстрый индексный поиск
table1.IndexName:='Индекс поля';
Table1.SetKey;
Table1.FieldByName('Имя поля поиска').AsString:=Query1.FieldValues;
Table1.GotoKey;
Поле для поиска должно быть проиндексировано.
Таблицы открыты.
Table1.FieldByName('Имя поля поиска').AsString <- тип данных поля поиска
типы данных полей должны совпадать.
F1 помощь
пример:
Table1 - таблица с основной Бд
Query1 - таблица запроса
Метод Locate:
table1.locate('Поле поиска',переменная с данными для поиска,);
возвращает true в случае успеха.
Table1.Locate('Поле поиска',Query1.FieldValues,);
Если поле поиска индексировано, то используется индекс.
Работает быстро только на маленьких таблицах. Можно искать в Query.
Метод Goto Key:
Самый быстрый индексный поиск
table1.IndexName:='Индекс поля';
Table1.SetKey;
Table1.FieldByName('Имя поля поиска').AsString:=Query1.FieldValues;
Table1.GotoKey;
Поле для поиска должно быть проиндексировано.
Таблицы открыты.
Table1.FieldByName('Имя поля поиска').AsString <- тип данных поля поиска
типы данных полей должны совпадать.
F1 помощь
madfallos
Специалист
5/13/2007, 9:15:52 PM
Интересует еще один вопрос:
При попытке удалить запись из главной таблице выходит сообщение о том, что в подчиненной таблице есть связанные с ней (главной записью) записи и соответственно ничего не получается :(((, как удалить запись из главной таблицы вместе с записями подчиненной???
При попытке удалить запись из главной таблице выходит сообщение о том, что в подчиненной таблице есть связанные с ней (главной записью) записи и соответственно ничего не получается :(((, как удалить запись из главной таблицы вместе с записями подчиненной???
kiskus
Новичок
5/14/2007, 5:53:57 PM
Закрыть подчиненную таблицу и удалить запись в главной
madfallos
Специалист
5/21/2007, 9:50:23 PM
проблема такая: создал параметрический запрос который выбирает диапазон дат
CODE SELECT Adres, Dom, Pojar, Facticheski, Data_CUS, Data_pojar
FROM "Disp.DB" Disp
WHERE Pojar = TRUE and Data_CUS>=:data1 and Data_CUS<=:data2
в коде написал
CODE with Query1 do
begin
close;
query1.ParamByName('data1').Value:=strtodatetime(MaskEdit1.Text+' '+ComboBox1.text);
query1.ParamByName('data2').Value:=strtodatetime(MaskEdit2.Text+' '+ComboBox2.text);
open;
end;
и при попытке сделать запрос активным в инспекторе выдает ошибку Disp: Field 'data1' not found
че за дела??? это же не поле а параметр
CODE SELECT Adres, Dom, Pojar, Facticheski, Data_CUS, Data_pojar
FROM "Disp.DB" Disp
WHERE Pojar = TRUE and Data_CUS>=:data1 and Data_CUS<=:data2
в коде написал
CODE with Query1 do
begin
close;
query1.ParamByName('data1').Value:=strtodatetime(MaskEdit1.Text+' '+ComboBox1.text);
query1.ParamByName('data2').Value:=strtodatetime(MaskEdit2.Text+' '+ComboBox2.text);
open;
end;
и при попытке сделать запрос активным в инспекторе выдает ошибку Disp: Field 'data1' not found
че за дела??? это же не поле а параметр
shurakrkn
Новичок
5/23/2007, 2:40:15 PM
(madfallos @ 21.05.2007 - время: 17:50) проблема такая: создал параметрический запрос который выбирает диапазон дат
CODE SELECT Adres, Dom, Pojar, Facticheski, Data_CUS, Data_pojar
FROM "Disp.DB" Disp
WHERE Pojar = TRUE and Data_CUS>=:data1 and Data_CUS<=:data2
в коде написал
CODE with Query1 do
begin
close;
query1.ParamByName('data1').Value:=strtodatetime(MaskEdit1.Text+' '+ComboBox1.text);
query1.ParamByName('data2').Value:=strtodatetime(MaskEdit2.Text+' '+ComboBox2.text);
open;
end;
и при попытке сделать запрос активным в инспекторе выдает ошибку Disp: Field 'data1' not found
че за дела??? это же не поле а параметр
либо попробуй заглавными буквами указать имя параметров, либо ты не сделал fetch параметров.
CODE SELECT Adres, Dom, Pojar, Facticheski, Data_CUS, Data_pojar
FROM "Disp.DB" Disp
WHERE Pojar = TRUE and Data_CUS>=:data1 and Data_CUS<=:data2
в коде написал
CODE with Query1 do
begin
close;
query1.ParamByName('data1').Value:=strtodatetime(MaskEdit1.Text+' '+ComboBox1.text);
query1.ParamByName('data2').Value:=strtodatetime(MaskEdit2.Text+' '+ComboBox2.text);
open;
end;
и при попытке сделать запрос активным в инспекторе выдает ошибку Disp: Field 'data1' not found
че за дела??? это же не поле а параметр
либо попробуй заглавными буквами указать имя параметров, либо ты не сделал fetch параметров.
kiskus
Новичок
5/24/2007, 1:05:14 PM
SELECT Adres, Dom, Pojar, Facticheski, Data_CUS, Data_pojar
FROM "Disp.DB" Disp
WHERE (Pojar = TRUE) and (Data_CUS>=QuotedStr(MaskEdit1.Text+' '+ComboBox1.text))and (Data_CUS<=QuotedStr(MaskEdit2.Text+' '+ComboBox2.text))
shurakrkn
Новичок
5/24/2007, 3:10:23 PM
(kiskus @ 24.05.2007 - время: 09:05) SELECT Adres, Dom, Pojar, Facticheski, Data_CUS, Data_pojar
FROM "Disp.DB" Disp
WHERE (Pojar = TRUE) and (Data_CUS>=QuotedStr(MaskEdit1.Text+' '+ComboBox1.text))and (Data_CUS<=QuotedStr(MaskEdit2.Text+' '+ComboBox2.text))
ну блин вы даете, это каждый раз переписывать запрос? А если он захочет из других едитов инициализировать запрос, ему что, нужно формировать руками каждый раз? Нужон либо вызов fetchparam (или fetchparams не помню точно), либо делается в самом компоненте извлечение параметров из запроса.
FROM "Disp.DB" Disp
WHERE (Pojar = TRUE) and (Data_CUS>=QuotedStr(MaskEdit1.Text+' '+ComboBox1.text))and (Data_CUS<=QuotedStr(MaskEdit2.Text+' '+ComboBox2.text))
ну блин вы даете, это каждый раз переписывать запрос? А если он захочет из других едитов инициализировать запрос, ему что, нужно формировать руками каждый раз? Нужон либо вызов fetchparam (или fetchparams не помню точно), либо делается в самом компоненте извлечение параметров из запроса.