Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2011, 17:12   #1
alTor
 
Регистрация: 28.06.2011
Сообщений: 6
По умолчанию Вывод данных из БД в edit'ы через IBQuery

Вообщем структура приложения вот такая. http://pikucha.ru/i6Hk3
Вроде бы вывести значения полей в эдиты довольно легко запросом, и на простом приложении все получаеться сам тестировал, но тут не могу понять в чем проблема, нам обязательно нужно делать с длл библой, каждая библиотека соответствует таблице в БД, и если делать через длл вылазает вот такое чудо http://pikucha.ru/i6Hkm
Вот код формы от длл библиотеки. Эта форма вызываеться с главной формы как таблица, ну и там разные манипуляции можно делать с эдитами.
Код:
unit frmTov;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, Buttons, StdCtrls, DB, IBDatabase,
  IBCustomDataSet, IBQuery;

type
  TForm6 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    TOV_ID_EDIT: TEdit;
    TOV_TIP_EDIT: TEdit;
    TOV_DATE_EDIT: TEdit;
    TOV_CENA_EDIT: TEdit;
    TOV_KOLVO_EDIT: TEdit;
    TOV_OTD_EDIT: TEdit;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    GotoButton: TSpeedButton;
    Edit7: TEdit;
    Label7: TLabel;
    UpdateButton: TSpeedButton;
    SaveButton: TSpeedButton;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBQuery1: TIBQuery;
    IBQuery1TOV_ID: TIntegerField;
    IBQuery1TOV_TIP: TIBStringField;
    IBQuery1TOV_DATE: TIBStringField;
    IBQuery1TOV_CENA: TIBStringField;
    IBQuery1TOV_KOLVO: TIntegerField;
    IBQuery1TOV_OTD: TIBStringField;
    DataSource1: TDataSource;
    SpeedButton5: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  end;

type
TTovar = class (TObject)
T_TOV_ID:integer;
T_TOV_TIP:string;
T_TOV_DATE:string;
T_TOV_CENA:string;
T_TOV_KOLVO:integer;
T_TOV_OTD:string;
procedure showdata;
procedure ReadData;
procedure ReadForm;
procedure SQLUpData;
end;
var
  Form6: TForm6;
  tovar:ttovar;
  con:boolean = false;
implementation
{$R *.dfm}


procedure TForm6.FormCreate(Sender: TObject);
begin
Tovar:=TTovar.Create;
end;

procedure TTovar.showdata;
begin
Form6.TOV_ID_EDIT.Text:=IntToStr(tovar.T_TOV_ID);
Form6.TOV_TIP_EDIT.Text:=tovar.T_TOV_TIP;
Form6.TOV_DATE_EDIT.Text:=tovar.T_TOV_DATE;
Form6.TOV_CENA_EDIT.Text:=tovar.T_TOV_CENA;
Form6.TOV_KOLVO_EDIT.Text:=IntToStr(tovar.T_TOV_KOLVO);
Form6.TOV_OTD_EDIT.Text:=tovar.T_TOV_OTD;
end;

procedure TTovar.ReadData;
begin
T_TOV_ID:=Form6.IBQuery1TOV_ID.Value;
T_TOV_TIP:=Form6.IBQuery1TOV_TIP.Value;
T_TOV_DATE:=Form6.IBQuery1TOV_DATE.Value;
T_TOV_CENA:=Form6.IBQuery1TOV_CENA.Value;
T_TOV_KOLVO:=Form6.IBQuery1TOV_KOLVO.Value;
T_TOV_OTD:=Form6.IBQuery1TOV_OTD.Value;
end;


procedure TTovar.ReadForm;
begin
Form6.TOV_ID_EDIT.Text;
Form6.TOV_TIP_EDIT.Text;
Form6.TOV_DATE_EDIT.Text;
Form6.TOV_CENA_EDIT.Text;
Form6.TOV_KOLVO_EDIT.Text;
Form6.TOV_OTD_EDIT.Text;
end;


procedure Ttovar.SQLUpData;
var SQLOld:string;
begin
Form6.IBQuery1.Active:=False;
SQLOld:=Form6.IBQuery1.SQL.Text;
Form6.IBQuery1.SQL.Text:='';
Form6.IBQuery1.SQL.Add('UPDATE Tovar');
Form6.IBQuery1.SQL.Add('SET TOV_TIP = '''+T_TOV_TIP+''',');
Form6.IBQuery1.SQL.Add('TOV_DATE = '''+T_TOV_DATE+''',');
Form6.IBQuery1.SQL.Add('TOV_CENA = '''+T_TOV_CENA+''',');
Form6.IBQuery1.SQL.Add('TOV_KOLVO = '''+IntToStr(T_TOV_KOLVO)+''',');
Form6.IBQuery1.SQL.Add('TOV_OTD = '''+T_TOV_OTD+''',');
Form6.IBQuery1.SQL.Add('WHERE (TOV_ID = '''+IntToStr(T_TOV_ID)+''');');
Form6.Label7.Caption:=Form6.IBQuery1.SQL.Text;
Form6.IBQuery1.SQL.Text:='';
Form6.IBQuery1.SQL.Text:=SQLOld;
end;

procedure TForm6.SpeedButton5Click(Sender: TObject);
begin
if not con then
begin
IBQuery1.Open;
tovar.ReadData;
SpeedButton5.Caption:='Disconnect';
con:=True;
end else
begin
IBQuery1.Close;
SpeedButton5.Caption:='Connect';
con:=False;
end;
end;


procedure TForm6.SpeedButton2Click(Sender: TObject);
//это уже 2 левых обработчика вперед назад так же не работают с процедурами
begin
if not  IBQuery1.Eof then
begin
IBQuery1.Next;
tovar.ReadData;
tovar.showdata end else
showmessage('конец записей')
end;

end.
Вот все проблемы начинаются когда подставляеш процедуру ReadData(читает данные из переменных) или ReadForm(просто чтение формы-эдитов), SQLUpData(обновление полей), ShowData(в эдиты присваиваються данные из переменных). При создании формы тоже пытался впихнуть и та же ошибка. Пробовал описывать эти процедуры в самой dll и экспортировал на эту форму. Ошибки не выдавало, но и реакции никакой нету от кнопки с обработчиком. Повторюсь все работает на обычном приложении без dll. Помогите исправить ашипку.
Снизу прикрепил весь проэкт. Заранее благодарен
Вложения
Тип файла: rar KP2011.rar (1.27 Мб, 28 просмотров)
alTor вне форума Ответить с цитированием
Старый 19.10.2011, 01:45   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Код:
procedure ShowFrmTov (AOnwer: TComponent);
var Form6:TForm6;
begin
Form6:=TFOrm6.Create(Aonwer);
Form6.ShowModal;
Form6.Free;
end;
Объявляется локальная переменная класса (помечено красным цветом), инициализируется при создании объекта, но затем в модуле идет обращение совсем к другой переменной, которая в этот момент вообще не инициализирована (значение nil).
Код:
procedure TTovar.ReadData;
begin
  T_TOV_ID:=Form6.IBQuery1TOV_ID.Value;
  T_TOV_TIP:=Form6.IBQuery1TOV_TIP.Value;
  ...
end;
Отсюда огребаем облом в виде AV.
В нашем случае создавать форму следует с использованием переменной, знакомой все остальным участникам шоу.
Здесь, в конкретном случае, для достижения цели достаточно убрать объявление локальной переменной:
Код:
procedure ShowFrmTov (AOnwer: TComponent);
///////var Form6:TForm6;
begin
...
end;
Прик вне форума Ответить с цитированием
Старый 19.10.2011, 13:37   #3
alTor
 
Регистрация: 28.06.2011
Сообщений: 6
По умолчанию

Боже, сначала не поверил в твои слова) шас проверил все заработало). Спасибо огромное, а то все упиралось в этот эрор, теперь хоть доделаю курсовик сам. Ты явно умнее нашего препода или внимательней), а то он сидел потел над моей задачей и не сделал)

Поздравляю с успешным решением.
Но это не избавляет вас от необходимости прочесть и соблюдать правила раздела.
Там доступно объясняется, что такое оверквотинг и что за это бывает.

Последний раз редактировалось mihali4; 19.10.2011 в 15:08.
alTor вне форума Ответить с цитированием
Старый 19.10.2011, 16:34   #4
alTor
 
Регистрация: 28.06.2011
Сообщений: 6
По умолчанию

Извиняюсь за оверквотинг.
У меня еще 1 проблема появилась, по форуму полазил, к моему случаю не подходит.
Ошибка: типа cannot modify read-only dataset, тема вроде тут заезженная.
у всех полей Query значение ReadOnly=False
Нужно чтобы по нажатию кнопки обновлялись данные в полях таблицы, вводить новые в edit'ы:
Код:
procedure Ttovar.SQLUpData;
//сам запрос на обвноление
var SQLOld:string;
begin
Form6.IBQuery1.Active:=False;
SQLOld:=Form6.IBQuery1.SQL.Text;//тут старый запрос присваиваеться Select * from Tovar
Form6.IBQuery1.SQL.Text:='';
Form6.IBQuery1.SQL.Add('UPDATE Tovar');
Form6.IBQuery1.SQL.Add('SET TOV_TIP = '''+T_TOV_TIP+''',');
Form6.IBQuery1.SQL.Add('TOV_DATE = '''+T_TOV_DATE+''',');
Form6.IBQuery1.SQL.Add('TOV_CENA = '''+T_TOV_CENA+''',');
Form6.IBQuery1.SQL.Add('TOV_KOLVO = '''+IntToStr(T_TOV_KOLVO)+''',');
Form6.IBQuery1.SQL.Add('TOV_OTD = '''+T_TOV_OTD+''',');
Form6.IBQuery1.SQL.Add('WHERE (TOV_ID = '''+IntToStr(T_TOV_ID)+''');');
Form6.IBQuery1.SQL.Text:='';
Form6.IBQuery1.SQL.Text:=SQLOld;
Form6.IBQuery1.Active:=True;
end;
По идее поля должны обновляться из записанных значений в переменные класа TTovar: T_TOV_TIP, DATE, KOLVO и т.д
Сделал процедуру чтоб значения вводились с edit'ов
Код:
procedure TTovar.ReadEdit;
begin
T_TOV_ID:=StrToInt(Form6.TOV_ID_EDIT.Text);
T_TOV_TIP:=Form6.TOV_TIP_EDIT.Text;
T_TOV_DATE:=Form6.TOV_DATE_EDIT.Text;
T_TOV_CENA:=FOrm6.TOV_CENA_EDIT.Text;
T_TOV_KOLVO:=StrToInt(Form6.TOV_KOLVO_EDIT.Text);
T_TOV_OTD:=Form6.TOV_OTD_EDIT.Text;
end;
Ну и сама кнопка-обработчик
Код:
procedure TForm6.BitBtn5Click(Sender: TObject);
begin
tovar.ReadForm;
tovar.ReadEdit;
tovar.SQLUpData;
end;
Подскажите последнее где ошибка)
alTor вне форума Ответить с цитированием
Старый 19.10.2011, 16:44   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

С IBQuery не знаком, но здесь что-то не то. Засунули в него запрос на обновление, а потом стерли все. А где собственно вызов метода, запускающего этот запрос? Обычно это ExecSQL. И такие вещи предпочтительно делать в разных Query
Код:
...
Form6.IBQuery1.SQL.Add('WHERE (TOV_ID = '''+IntToStr(T_TOV_ID)+''');');
Form6.IBQuery1.SQL.Text:='';
Form6.IBQuery1.SQL.Text:=SQLOld;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.10.2011, 16:59   #6
alTor
 
Регистрация: 28.06.2011
Сообщений: 6
По умолчанию

Код:
procedure TForm6.BitBtn5Click(Sender: TObject);
begin
tovar.ReadForm;
tovar.ReadEdit;
tovar.SQLUpData;
end;
В обработчике запускается процедура с запросом на обновление
alTor вне форума Ответить с цитированием
Старый 19.10.2011, 17:29   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Я про это и говорю. Запускается SQLUpData, которая по сути делает
Код:
Form6.IBQuery1.Active:=False;
SQLOld:=Form6.IBQuery1.SQL.Text;//
...
Form6.IBQuery1.SQL.Text:=SQLOld;
Form6.IBQuery1.Active:=True;
То что между этими командами впустую - никакого результата
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как просуммировать Edit'ы в зависимости от условия Gover Общие вопросы Delphi 5 24.07.2011 16:06
Как сделать вывод данных после всего ввода данных. Donatello Общие вопросы C/C++ 6 16.01.2011 16:32
XML в BLOB поле через IBQuery SiNBizkit БД в Delphi 1 08.12.2010 17:52
Delphi. Вывод данных через USB AlessOn Помощь студентам 9 02.11.2010 23:21
Фильтрация данных в DBgridEh с пощью IBQuery postaveche Помощь студентам 3 06.09.2010 21:29