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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2012, 10:03   #1
KoliyR
Пользователь
 
Регистрация: 01.09.2009
Сообщений: 55
По умолчанию

изменения в таблицах в реальном времени

Никак не могу разобраться с курсорами и обновлением данных в реальном времени.
У меня на форме главная и подчиненная таблицы.
Когда я в главной таблице добавляю или изменяю значения, то в подчиненной их как-буд-то и нет.
Все таблицы открываются сразу после старта программы и так остаются работать.
В случае close и open ADOTable изменения вносятся ..., но хочется обойтись без этого

update и refrech не получаются

Подскажите кто как работает с табл. в реальном времени?

Прикладываю свою наработку - можно увидеть
зайти в меню ввод - показаний
там когда вводишь котельную, то при вводе показаний значения новой котельной не прописываются
он еще не знает что она вписана ..., внесенные изменения еще только в dataseteНовая папка.rar
Обучение, задания по Делфи http://KoliyR.tk

Последний раз редактировалось Stilet; 29.01.2012 в 10:57.
KoliyR вне форума Ответить с цитированием
Старый 28.01.2012, 16:20   #2
alexiz
Пользователь
 
Регистрация: 19.08.2010
Сообщений: 54
По умолчанию

Цитата:
Сообщение от KoliyR Посмотреть сообщение
зайти в меню ввод - показаний
Зашел.. и вижу - это что две разные таблицы или запрос из двух таблиц?
В любом случае, чтобы данные измененные или добавленные в Мастер-таблице отразились в таблице Detail её нужно обновить. Если это Access, то только закрыть-открыть.
Ваша благодарность может быть материальной:
WM R103871054215, WM Z710411027344, ЯндД: 410011167596676
alexiz вне форума Ответить с цитированием
Старый 28.01.2012, 18:23   #3
KoliyR
Пользователь
 
Регистрация: 01.09.2009
Сообщений: 55
По умолчанию

Две разные таблицы.

Неужели все так плохо
У меня в программе много таких таблиц и программно их отключать-включать не хочется ..., возникает некая путаница
Обучение, задания по Делфи http://KoliyR.tk
KoliyR вне форума Ответить с цитированием
Старый 28.01.2012, 19:04   #4
alexiz
Пользователь
 
Регистрация: 19.08.2010
Сообщений: 54
По умолчанию

Цитата:
Сообщение от KoliyR Посмотреть сообщение
Две разные таблицы.

Неужели все так плохо
У меня в программе много таких таблиц и программно их отключать-включать не хочется ..., возникает некая путаница
Ну, не все так плохо. У Вас есть еще возможность использовать событие AfterPost MasterDataseta. Напишите там что должно происходить с таблицей Detail после изменения данных в мастере..
Ваша благодарность может быть материальной:
WM R103871054215, WM Z710411027344, ЯндД: 410011167596676
alexiz вне форума Ответить с цитированием
Старый 28.01.2012, 19:23   #5
KoliyR
Пользователь
 
Регистрация: 01.09.2009
Сообщений: 55
По умолчанию

Что-то не могу сообразить

Главная табл. имеет события и соответственно обработку:
Код:
procedure TDataModule3.ADOTKatPoDogNewRecord(DataSet: TDataSet);
begin
ADOTKatPoDog.FieldByName('Договор').AsString:=Form1.memo1.lines[Form1.ListBox1.itemindex];
end;
т.е. при создании новой строки у нас часть данных уже занесена ...


подчиненная таблица имеет следующие события
Код:
procedure TDataModule3.ADOTRealCalcFields(DataSet: TDataSet);
const pristavka: array [0..10] of string =  ('1','10','100','1000','10000','100000','1000000','10000000','100000000','1000000000','10000000000');
var a,b:Currency;
begin
a:=ADOTReal.FieldByName('Предыдущее_показание_счетчика').AsCurrency;
b:=ADOTReal.FieldByName('Показание_счетчика').AsCurrency;
if a > b then b:=strtoCurr(pristavka[length(Currtostr(a))-length(Currtostr(b))]+Currtostr(b));
ADOTReal.FieldByName('Расход').AsCurrency:=b-a;
ADOTReal.FieldByName('Сумма').AsCurrency:=ADOTReal.FieldByName('Расход').AsCurrency*ADOTReal.FieldByName('Тариф').AsCurrency/1000;
end;

procedure TDataModule3.ADOTRealNewRecord(DataSet: TDataSet);
begin
//ADOTKatPoDog.Post;
ADOTReal.FieldByName('Котельная').AsString:=ADOTKatPoDog.FieldByName('Котельная').AsString;
ADOTReal.FieldByName('Дата').AsString:=datetostr(Unit1.Form1.DateTimePicker1.Date);
ADOQMax.Close;
ADOQMax.Parameters.ParamByName('per1').Value:=ADOTKatPoDog.FieldByName('Котельная').AsString;
ADOQMax.Open; //ADOQMax.Close;
if  not ADOQMax.Eof then ADOTReal.FieldByName('Предыдущее_показание_счетчика').AsString:=ADOQMax.Fields[2].AsString;
ADOQuery1.Close;
ADOQuery1.Parameters.ParamByName('per1').Value:='01.01.'+inttostr(yearof(form1.DateTimePicker1.Date));
ADOQuery1.Parameters.ParamByName('rep2').Value:='01.01.'+inttostr(yearof(form1.DateTimePicker1.Date)+1);
ADOQuery1.Open;
if  not ADOQuery1.Eof then ADOTReal.FieldByName('Номер_счета-фактуры').AsString:=inttostr(strtoint(ADOQuery1.Fields[1].AsString)+1);
ADOQuery1.Close;
end;

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.


Сейчас идет хороших нет,
кроме как грубого отключения всех компонент ADO и заново их открытие,

Соответственно эту операцию можно прописать в событие AfterPost, - задача только восстановить курсор

Ужасно все это звучит
Обучение, задания по Делфи http://KoliyR.tk

Последний раз редактировалось Stilet; 29.01.2012 в 11:03.
KoliyR вне форума Ответить с цитированием
Старый 28.01.2012, 20:23   #6
alexiz
Пользователь
 
Регистрация: 19.08.2010
Сообщений: 54
По умолчанию

Цитата:
Сообщение от KoliyR Посмотреть сообщение
Ужасно все это звучит
Что за пессимизм! И где Ваш AfterPost?

Если Вам нужно как то изменить детальныe данные после изменения Мастера, то так и сделайте. В главной таблице меняется тариф, а в подчиненной должна измениться сумма, если я правильно понял..

Код:
procedure TDataModule1.ADOTKatPoDogAfterPost(DataSet: TDataSet);
begin
   if not ADOTReal.EOF then
   begin
     ADOTReal.Edit;
     ADOTReal.FieldByName('Тариф').Value := Dataset.FieldByName('Тариф').Value;
     ADOTReal.Post;
   end;
end;
Ваша благодарность может быть материальной:
WM R103871054215, WM Z710411027344, ЯндД: 410011167596676
alexiz вне форума Ответить с цитированием
Старый 28.01.2012, 20:40   #7
KoliyR
Пользователь
 
Регистрация: 01.09.2009
Сообщений: 55
По умолчанию

В том-то и дело, что нового значения в главной таблице еще нет.,
Оно будет доступно только после закрытия и открытия подчиненной таблицы.
Перерасчета мне делать никакого не надо ...,
В моем примере при добавлении строки должно название котельной (ключевое поле) прописываться в показания.

Смысл заключается в том, что все показания принадлежат выбранной в главной таблице котельной.
Соответственно записи мы добавляем для нее.
А ее, хоть мы и ввели в подчиненной таблице при открытии программы еще не было и соответственно сейчас еще нет.
строчка
ADOTReal.FieldByName('Котельная').A sString:=ADOTKatPoDog.FieldByName(' Котельная').AsString;
становится бессмысленной

Уважаемые эксперты осталось несколько часов актуальности моего вопроса ..., - завтра защита.
Сейчас решение только закрытие-открытие компонент ...
Код:
ADOConnection1.Close;
ADOConnection1.Open;
DataModule2.ADOTBank.Open;
DataModule2.ADOTVedomstvo.Open;
DataModule2.ADOTGRS.Open;
DataModule2.ADOTDogTech.Open;
DataModule2.ADOTDogTransp.Open;
DataModule2.ADOTZapUslug.Open;
DataModule2.ADOTUsluga.Open;
DataModule2.ADOTNamObsl.Open;
DataModule2.ADOTOplTech.Open;
DataModule2.ADOTOrg.Open;
DataModule2.ADOTVidOplat.Open;
DataModule2.ADOTOplTrans.Open;
DataModule2.ADOTKatPoDog.Open;
DataModule2.ADOTKat.Open;
DataModule3.ADOTReal.Open;
DataModule2.ADOTRealiz.Open;
DataModule2.ADOTSchet.Open;
DataModule3.ADOTKatPoDog.Open;
DataModule3.ADOTKat.Open;
DataModule4.ADOTOrg.Open;
DataModule4.ADODogov.Open;
DataModule4.ADOTUslug.Open;
DataModule4.ADOTZapUsl.Open;
DataModule4.ADOTNameObsl.Open;
DataModule5.ADOTTechOpl.Open;
DataModule5.ADOTTrOpl.Open;
DataModule5.ADOTSDogTech.Open;
DataModule5.ADOTPokazS4.Open;
DataModule5.ADOTTrOplMes.Open;;

остается задача сохранения курсора в таблицах ))

Но как вы видите - все это ужасно.
Очень жду предложения решения задачи.

Вот что получается ...,
Код:
procedure TForm1.Button7Click(Sender: TObject);
var
pD1,pD3:integer;
begin
if DBGrid1.DataSource.DataSet<>nil then pD1:=DBGrid1.DataSource.DataSet.RecNo;
if DBGrid3.DataSource.DataSet<>nil then pD3:=DBGrid3.DataSource.DataSet.RecNo;
ADOConnection1.Close;
ADOConnection1.Open;
DataModule2.ADOTBank.Open;
DataModule2.ADOTVedomstvo.Open;
DataModule2.ADOTGRS.Open;
DataModule2.ADOTDogTech.Open;
DataModule2.ADOTDogTransp.Open;
DataModule2.ADOTZapUslug.Open;
DataModule2.ADOTUsluga.Open;
DataModule2.ADOTNamObsl.Open;
DataModule2.ADOTOplTech.Open;
DataModule2.ADOTOrg.Open;
DataModule2.ADOTVidOplat.Open;
DataModule2.ADOTOplTrans.Open;
DataModule2.ADOTKatPoDog.Open;
DataModule2.ADOTKat.Open;
DataModule3.ADOTReal.Open;
DataModule2.ADOTRealiz.Open;
DataModule2.ADOTSchet.Open;
DataModule3.ADOTKatPoDog.Open;
DataModule3.ADOTKat.Open;
DataModule4.ADOTOrg.Open;
DataModule4.ADODogov.Open;
DataModule4.ADOTUslug.Open;
DataModule4.ADOTZapUsl.Open;
DataModule4.ADOTNameObsl.Open;
DataModule5.ADOTTechOpl.Open;
DataModule5.ADOTTrOpl.Open;
DataModule5.ADOTSDogTech.Open;
DataModule5.ADOTPokazS4.Open;
DataModule5.ADOTTrOplMes.Open;;
if DBGrid1.DataSource.DataSet<>nil then DBGrid1.DataSource.DataSet.RecNo:=pD1;
if DBGrid3.DataSource.DataSet<>nil then DBGrid3.DataSource.DataSet.RecNo:=pD3;
end;
А если пересмотреть условия ..., можно конечно ускорить процесс перехода по таблицам , но - все плохо
Обучение, задания по Делфи http://KoliyR.tk

Последний раз редактировалось Stilet; 29.01.2012 в 11:10.
KoliyR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строку из одного DataSet в другой DataSet Abbath1349 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 22.05.2011 19:26
ADO.NET: Команды SQL при работе с DataSet PousheeITancuushee Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 24.09.2010 22:25
Из DataSet работающего по циклу в DataSet maroder22 БД в Delphi 1 05.09.2010 23:22
ADO DataSet в Access Antoha_Gad БД в Delphi 7 28.10.2009 09:45
Delphi 7. Ошибка "ADODataSet1: Cannot perform this operation on a closed dataset" Vind Помощь студентам 6 20.04.2009 22:47