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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.11.2012, 14:02
de3epmup de3epmup вне форума
Прохожий
 
Регистрация: 20.11.2012
Сообщения: 4
Репутация: 10
По умолчанию Ошибка при выполнении фильтрации для базы данных Interbase

Уважаемые дамы и господа эксперты)
Проблема в следующем. Существует несколько форм. На одной из них находится таблицы. Подключаю БД interbase через:
IBDatabase, IBTransaction, IBTable, Datasource, DBGrid.
На других формах расположены фильтрации для каждой таблицы по отдельности.
При выполнение фильтрации для первой таблицы все работает, для оставшихся остальных выдает ошибку: access violation at address 00000000 read of address 00000000. НО все равно фильтрует.

Вот код первой рабочей фильтрации

Код:
	 	 
unit Unit_s1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, sBitBtn, sEdit, sComboBox, sGroupBox, db;
 
type
  Ts1 = class(TForm)
    sGroupBox1: TsGroupBox;
    sGroupBox2: TsGroupBox;
    sComboBox1: TsComboBox;
    sEdit1: TsEdit;
    sBitBtn1: TsBitBtn;
    sComboBox2: TsComboBox;
    sEdit2: TsEdit;
    sBitBtn2: TsBitBtn;
    sBitBtn3: TsBitBtn;
    procedure sBitBtn1Click(Sender: TObject);
    procedure sBitBtn2Click(Sender: TObject);
    procedure sBitBtn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  s1: Ts1;
 
implementation
 
uses Unit1;
 
{$R *.dfm}
 
procedure Ts1.sBitBtn1Click(Sender: TObject);
var st:string;
begin
case sComboBox1.ItemIndex of
  1: begin st:='NOMER_SKLADA'; end;
  2: begin st:='ZAVHOZ'; end;
end;
 
if st<>'Выбирете поле для поиска'  then  begin
 
if not Glv.IBTable1.Locate(st, sEdit1.Text, [loCaseInsensitive,loPartialKey]) then
    ShowMessage('Запись не найдена');
end;
end;
 
procedure Ts1.sBitBtn2Click(Sender: TObject);
begin
case sComboBox2.ItemIndex of
    1:begin
         glv.IBTable1.Filtered := False;
         glv.IBTable1.Filter:='NOMER_SKLADA'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable1.Filtered := True;
     end;
    2:
     begin
         glv.IBTable1.Filtered := False;
         glv.IBTable1.Filter:='ZAVHOZ'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable1.Filtered := True;
     end;
end;
end;
 
procedure Ts1.sBitBtn3Click(Sender: TObject);
begin
sedit2.Text:='';
Glv.IBTable1.Filtered:=true; Glv.IBTable1.Filtered:=false;
end;
 
end.




Вот одна из форм на которой вылазиет ошибка:
Код:
	  
unit Unit_s2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, sBitBtn, sEdit, sComboBox, sGroupBox, db;
 
type
  Ts2 = class(TForm)
    sGroupBox1: TsGroupBox;
    sComboBox1: TsComboBox;
    sEdit1: TsEdit;
    sBitBtn1: TsBitBtn;
    sGroupBox2: TsGroupBox;
    sComboBox2: TsComboBox;
    sEdit2: TsEdit;
    sBitBtn2: TsBitBtn;
    sBitBtn3: TsBitBtn;
    procedure sBitBtn1Click(Sender: TObject);
    procedure sBitBtn2Click(Sender: TObject);
    procedure sBitBtn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  s2: Ts2;
 
implementation
 
uses Unit1;
 
{$R *.dfm}
 
procedure Ts2.sBitBtn1Click(Sender: TObject);
var st:string;
begin
case sComboBox1.ItemIndex of
  1: begin st:='NOMEN_NOMER'; end;
  2: begin st:='NAIM'; end;
  3: begin st:='NOMER_PASPORTA'; end;
  4: begin st:='KOLLICHESTVO'; end;
  5: begin st:='CENA'; end;
  6: begin st:='SUMMA'; end;
  7: begin st:='NOMER_SKLADA'; end;
end;
 
if st<>'Выбирете поле для поиска'  then  begin
 
if not Glv.IBTable2.Locate(st, sEdit1.Text, [loCaseInsensitive,loPartialKey]) then
    ShowMessage('Запись не найдена');
end;
 
end;
 
procedure Ts2.sBitBtn2Click(Sender: TObject);
begin
case sComboBox2.ItemIndex of
   1:begin
         glv.IBTable2.Filtered := False;
         glv.IBTable2.Filter:='NOMEN_NOMER'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable2.Filtered := True;
     end;
    2:
     begin
         glv.IBTable2.Filtered := False;
         glv.IBTable2.Filter:='NAIM'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable2.Filtered := True;
     end;
     3:
     begin
         glv.IBTable2.Filtered := False;
         glv.IBTable2.Filter:='NOMER_PASPORTA'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable2.Filtered := True;
     end;
     4:
     begin
         glv.IBTable2.Filtered := False;
         glv.IBTable2.Filter:='KOLLICHESTVO'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable2.Filtered := True;
     end;
     5:
     begin
         glv.IBTable2.Filtered := False;
         glv.IBTable2.Filter:='CENA'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable2.Filtered := True;
     end;
     6:
     begin
         glv.IBTable2.Filtered := False;
         glv.IBTable2.Filter:='SUMMA'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable2.Filtered := True;
     end;
     7:
     begin
         glv.IBTable2.Filtered := False;
         glv.IBTable2.Filter:='NOMER_SKLADA'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable2.Filtered := True;
     end;
end;
 
end;
 
procedure Ts2.sBitBtn3Click(Sender: TObject);
begin
sedit2.Text:='';
Glv.IBTable2.Filtered:=true; Glv.IBTable2.Filtered:=false;
end;
 
end.
 




При трассировке было выявлено что ошибка возникает вот на этом месте:
Код:
  7:
     begin
         glv.IBTable2.Filtered := False;
         glv.IBTable2.Filter:='NOMER_SKLADA'+' LIKE '+#39+'%'+sEdit2.Text+'%'+#39;
         glv.IBTable2.Filtered := True; {от тут эта зараза вылазиет}
     end;
end;
 


Также было замечено, что такая ошибка вылазит при добавление записи в таблицу, а именно при выборе значения из DBLookupComboBox1.

Прошу помощи. ХЭЛП! Что делать?
Ответить с цитированием
  #2  
Старый 20.11.2012, 14:50
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

дык, а чё за ошибка то?
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #3  
Старый 20.11.2012, 15:01
de3epmup de3epmup вне форума
Прохожий
 
Регистрация: 20.11.2012
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Yurk@
дык, а чё за ошибка то?
в самом начале указал:
При выполнение фильтрации для первой таблицы все работает, для оставшихся остальных выдает ошибку: access violation at address 00000000 read of address 00000000. НО все равно фильтрует.
Ответить с цитированием
  #4  
Старый 20.11.2012, 18:15
de3epmup de3epmup вне форума
Прохожий
 
Регистрация: 20.11.2012
Сообщения: 4
Репутация: 10
По умолчанию

Попробовал переподключить таблицу. Вышло вот что:Field '' has no dataset. НО по-прежнему фильтрует! Как так?!
Подключал по данной инструкции:
1. Создать обычное VCL-приложение Delphi.
2. Поместить на форму компоненты из вкладки InterBase — IBDatabase и IBTransaction. Эти компоненты служат для соединения с конейнером(IBDatabase) и проведения танзакций(IBTransaction).
3. По компоненту IBDatabase формы щелкните два раза левой кнопкой мыши и появившееся окно заполните следующим образом:

В поле Database укажите путь к своему контейнеру InterBase(удобно воспользоваться кнопкой Browse, которая вызовет стандартный диалог Windows выбора файла). Флаг Login Promt отвечает за запрос логина и пароля при подключении к контейнеру(для отладки программы удобнее это отключить).
4. Затем измените свойство Connected у IBDatabase на значение true (произойдет подключение к контейнеру). В свойстве DefaultTransaction укажите компонент IBTransaction формы.
5. Компоненту IBTransaction формы в свойстве DefaultDatabase укажите свой IBDatabase. После установите свойство Active в значение true.
6. Затем установите на форме компоненты IBTable для каждой таблицы в контейнере (или сколько там вам нужно...). Задайте им свойство Database своим IBDatabase. Выберите таблицу в свойстве TableName и установите свойство Active в true.
7. Для возможности отображения таблиц при помощи компонента DBGrid(из вкладки Data Controls) создайте для каждой таблицы Datasource и укажите им соответствующие IBTable (свойство DataSet). Укажите DBGrid соответствующие Datasource.
В итоге должно получиться примерно следующее:
Примечание: при активировании таблиц возможно не будут отображаться данные в них, ничего в этом страшного нет, но, если после запуска программы они так и не появились, то вы сделали что-то не так
Ответить с цитированием
  #5  
Старый 20.11.2012, 18:58
de3epmup de3epmup вне форума
Прохожий
 
Регистрация: 20.11.2012
Сообщения: 4
Репутация: 10
По умолчанию

По всякому пробывал. Через отладчик EurekaLog выводит меня на строку с позицией 14 сразу после 'glv.'
Код:
 glv.IBTable2.Filtered := True;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter