Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > модификации и обновление таблицы


Автор: Elyad 24.10.2006, 07:24
После модификации таблицы и сохранения полученных данных, обновляю ее. 
Table1.Append;
Table1.Post;
Table1.Refresh;
таблица отображаемая в компоненте DBGrid - обновляется.
После чего я сново открываю эту таблицу в другом окне для чтения и таблица оказывается прежней, т.е. не обновленной. Почему? smile 

Автор: Vas 24.10.2006, 08:15
Вместо Refresh попробуй сделать 
Код

Table1.Close;
Table1.Open;

и посмотри что показывает?

Автор: Elyad 24.10.2006, 08:27
Делал я так и все равно ничего не получается.
Сама база обновляется, но при этом последующее ее открытие в новом окне выдает старую немодифицированную таблицу.

Автор: Vas 24.10.2006, 08:38
Что-то похоже на битый индекс, или у тебя сама база не переиндексирует таблицу, попробуй индексы пересоздай вручную.

Автор: Elyad 24.10.2006, 09:22
Почему  сама база не переиндексирует таблицу? Из-за чего это? И поясни, please, что я должен сделать, чтобы решить эту проблему(поподробней, please).  smile 

Автор: Vas 24.10.2006, 09:37
Цитата(Elyad @  24.10.2006,  09:22 Найти цитируемый пост)
Почему  сама база не переиндексирует таблицу?

Что за БД?

Автор: Akella 24.10.2006, 09:45
Elyad, а ты кэширование используешь? Если, то выполняй:
1. Table1.ApplyUpdates; //сохраняй кэш таблицы.
2. Table1.FlushBuffers; //(принудительное физическое сохранение данных, т.к. винда всё ещё держит данные в своём кэше).

Автор: Elyad 24.10.2006, 10:35
Спасибо за совет, я вечером попробую. smile 

Автор: SergeBS 24.10.2006, 11:20
Elyad
Скорее всего у тебя [email=http://forum.vingrad.ru/index.php?act=Help&CODE=01&HID=17]Ошибка в 17 строке[/email]. Без знания СУБД - ничего не скажешь.

Автор: Elyad 25.10.2006, 07:37
Akella
 Вчера попробовал применить ваш совет, но прога выдает ошибку (не помню  точно какую, что-то типа кэширования ни применяется).

Хочу пояснить свою проблему:
Когда я редактирую таблицу  и сохраняю сделанные изменения, то и в таблице и компоненте DBGrid все отображается правильно. Но после я создаю 2 - дочернее окно, которое также содержит Table1, DataSource1, DBGrid1 и хочу,чтобы в этом окне также отображалась  таблица с новыми изменениями, но не получается.
В новом окне пишу следующее:
Table1.Close;
Table1.DataBaseName:="Name"';
Table1.TableName:="Towns";
Table1.Open;
 и получаю старые не измененые данные. smile 

 

Автор: Akella 25.10.2006, 08:38
Вопрос такой: в какой момент ты открываешь второе окно?
Хотелось бы немного кода увидеть.
И как мне подсказали штатные телепаты нашего форума smile  у вас Paradox???

Цитата(Elyad @  25.10.2006,  07:37 Найти цитируемый пост)
то и в таблице и компоненте DBGrid

вот этого не пойму, что ты подразумаеваешь под "и в таблице"???

Автор: Elyad 25.10.2006, 09:23
Ставлю вашим телепатам оценку - 5(отлично) smile 
На счет  " и в таблице и в компоненте" поясняю:  имею ввиду, что данные действительно сохраняются в самой таблице и отображаются в компоненте.
Теперь тем кто просил "немного кода" smile 


Код

procedure TForm1.Button1Click()
var
      rxadd : TModalResult;
     h : string;
begin
           rzadd=fmadd.ShowModal;
          if    rzadd=mrOk 
              then
                    begin
                                 h:=fmadd.SpinEdit1.Text;  // сохраняем то число которое ввел пользователь
                                hh:=StrToInt(h);
                    end;
           if (h <>0)  then Table1.Append   else Table1.Cancel;
           i:=1;
           if  rzadd=mrCancel   then Table1.Cancel;

end;


procedure TForm1.DBGridKeyPress()
begin
        if Table1.State in [dsInsert]
         then 
                  if key=#13   then   
                     if MessageDlg('Сохранить добавленную запись',mtConfirmation,[mbYes,mbNo],0) <>mrYes   then Abort;
                     else 
                              begin
                                          Table1.Post;
                                           if i << hh    then
                                           begin 
                                                          Table1.Append;
                                                           i:=i+1; 
                                           end; 
                                           else DataSource1.AutoEdit1:=false;
                             end;
end;

procedure Button2click ()
var   rz : TModalResult;
begin
              rz:=fd.Show;
end;


В форме fd содержатся компоненты DBGrid, Table, DataSource
При создании формы
Table1.Close;
Table1.DataBaseName:='' NAME";
Table1.TableName:='Town';
Table1.Open;


Смысл состоит в том, что user вводит необходимое число добавлений в таблицу и добавляет, каждый раз подтверждая или отменяя сделанные изменения. А после нажатия кнопки Button2 появляется окно в котором отображена эта же таблица с сделанными изменениями.


Автор: Akella 25.10.2006, 09:42
Elyad, отредактируй сообщение и возьми код в теги "КОД".

И вот ещё
http://emanual.ru/get/668/

Добавлено @ 09:53 
Elyad, не вижу FlushBuffers.

Код

procedure TForm1.DBGridKeyPress()
begin
  if Table1.State in [dsInsert] then begin
    if (key=#13) and (MessageDlg('Сохранить добавленную запись',mtConfirmation,[mbYes,mbNo],0) <> mrYes) then Abort;
  end else begin
      Table1.Post;
      Table1.FlushBuffers;//принудительно заставляем винду сохранить данные на диск
       if i < hh    then begin 
         Table1.Append;
         Inc(i);
       end else
         DataSource1.AutoEdit1:=false;
  end;
end;

Автор: Akella 25.10.2006, 09:57
я бы на твоём месте использовал не DBGridKeyPress, а OnKeyDown

Код

procedure TForm1.DBGridKeyDown
begin
  if (Table1.State in [dsInsert]) or (Table1.State in [dsEdit]) then begin //так надёжней
    if (key=vk_return) and ((MessageBox(Application.ActiveFormHandle, 'Сохранить данные?', 'Внимание!', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) <> idYes)) then Abort;
  end else begin
      Table1.Post;
      Table1.FlushBuffers;//принудительно заставляем винду сохранить данные на диск
       if i < hh    then begin 
         Table1.Append;
         Inc(i);
       end else
         DataSource1.AutoEdit1:=false;
  end;
end;


Добавлено @ 09:58 
только я тебе на Delphi код даю

Автор: Elyad 25.10.2006, 10:13
На счет FlushBuffers я уже отмечал, что он выдает об ошибке.
Прочитав по ссылке я нашел, что для запуска приложения необходимо как min 512 байт оперативки, а у меня только 256. Может в этом проблема?
Я описал еще такую функцию:
Код

procedure  DataSourceUpdateData()
begin
           if (Table1.State in [dsInsert]) or (Table1.State in [dsEdit])   then Table1.Refresh;
 end;              


и получил такую ошибку  stack overflow. т.е. в памяти не хватает места.
Значит в этом, что ли ошибка smile  

Автор: Akella 25.10.2006, 10:37
дамую, что так нельзя

Добавлено @ 10:38 
мне кажеться, что ты реализуешь неверный подход к редактированию/добавлению данных

Добавлено @ 10:38 
Код

procedure  DataSourceUpdateData()
begin
  if (Table1.State in [dsInsert]) or (Table1.State in [dsEdit])   then Table1.Refresh;
end; 


убери

Добавлено @ 10:45 
Цитата(Elyad @  25.10.2006,  10:13 Найти цитируемый пост)
Прочитав по ссылке я нашел, что для запуска приложения необходимо как min 512 байт оперативки,

может мегабайт. и про какой приложение ты имел ввиду?

Автор: Elyad 25.10.2006, 11:05
Цитата

Can't start Paradox: not enough memory
 (Невозможно запустить систему Paradox: не хватает памяти) 
Для запуска системы на автономном компьютере требуется минимум 512 Кбайт оперативной памяти, а при запуске в сети - 640. В зависимости от типа компьютера вы можете увеличить свободную память, уменьшая размер RAM-диска или спулера печати, или завершить некоторые резидентные программы. Если ни одно из этих решений не привело к успеху, необходимо добавить плату расширения памяти в компьютер (Rampage Board, Above Board и т.д.) 


А вы считаете, что недостаток памяти не может влиять на своевременное обновление памяти? smile 

Автор: Akella 25.10.2006, 11:27
а напиши-ка нам параметры компьютера, на котором работает программа.

Автор: Elyad 25.10.2006, 11:55
Точно сказать не могу, но знаю что оперативки 256.

Автор: Akella 25.10.2006, 12:22
килобайт или мегабайт?

Добавлено @ 12:23 
Цитата(Elyad @  25.10.2006,  10:13 Найти цитируемый пост)
и получил такую ошибку  stack overflow

мне кажеться, что у тебя первичный индекс улетел в тёплые края  smile 

Автор: Elyad 25.10.2006, 14:43
Ответ 256 мегабайт. А на счет первичного индекса я сегодня вечером посмотрю. smile 

Автор: SergeBS 25.10.2006, 16:00
Elyad
1.
Код

if TDataset.State in [dsEdit, dsInsert]) then 
begin
  TDataset.Post;
  TDataset.Refresh;
end;

2. При активации 2-й формы делай у ее датасета requery. Криво, но сработает.
А правильно: иметь датамодуль и в нем 1 датасет на 1 таблицу для всех форм, которые эту таблицу используют. Т.е. RTFM.
 

Автор: Elyad 26.10.2006, 07:46
SergeBS
Спасибо за совет, сегодня попробую и этот метод smile 
А так я проблему уже решил: оказывается я открывал таблицу в новом окне при ее создании  А надо таки при каждой ее активизации. smile 
Поэтому тему закрываю!!!
Всем, кто участвовал в обсуждении этой темы ----- большое спасибо !!! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)