Помогите разобраться с БД

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.Учебный курс"
kiskus
4/6/2007, 2:30:41 PM
MyForm.pas(73): Missing operator or semicolon
забыл поставить закрывающие точку с запятой

в message box два раза кликни на сообшение об ошибке
в окне кода подсветится строка с ошибкой

в implementaion
напиши Uses Unit2; - имя датамодуля
madfallos
4/6/2007, 4:26:31 PM
пасиб за совет 0096.gif
madfallos
4/15/2007, 1:03:28 PM
и снова вопрос:
как создать связь один ко многим в 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 установлена.
madfallos
4/19/2007, 8:00:56 PM
и снова проблемы :)
как отфильтровать таблицу по полю, но только данные в это поле вводятся так: из комбобокса на 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.
Не забывайте производить приведение типа данных в выражении фильтра
Выражение всегда строка.












madfallos
4/24/2007, 4:09:57 PM
пасиб, я попробовал через SQL...параметрический запрос...и получилось :)
но все равно спасибо
madfallos
5/9/2007, 5:33:34 PM
И снова проблема…
Имеем две формы, на одной стоит куча 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 помощь
















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
че за дела??? это же не поле а параметр
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 параметров.
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 не помню точно), либо делается в самом компоненте извлечение параметров из запроса.