|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка при выполнении фильтрации для базы данных 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
|
||||
|
||||
дык, а чё за ошибка то?
Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#3
|
|||
|
|||
Цитата:
При выполнение фильтрации для первой таблицы все работает, для оставшихся остальных выдает ошибку: access violation at address 00000000 read of address 00000000. НО все равно фильтрует. |
#4
|
|||
|
|||
Попробовал переподключить таблицу. Вышло вот что: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
|
|||
|
|||
По всякому пробывал. Через отладчик EurekaLog выводит меня на строку с позицией 14 сразу после 'glv.'
Код:
glv.IBTable2.Filtered := True; |