Отображение данных после сохранения записей

ularsoft
Дата: 16.09.2019 05:56:11
Здравствуйте, уважаемые форумчане!
Помогите решить проблему с отображением данных в гриде.
На главной форме (fmMain) программы использую DBGrid, TQuery, TDataSource. База данных MDB. В свойстве TQuery, SQL (select * from CashDok). Создал другую форму (fmChange1) для ввода новых записей в таблице CashDok.
procedure TfmChange1.Button1Click(Sender: TObject);
begin
  Sum := 0;
  Bal := 0;
  if (Edit1.Text <> null) and (Edit2.Text <> null) then
  begin
    Sum := StrtoFloat(Edit2.text) * StrtoFloat(Edit1.Text);

    dm.qCash.close;
    dm.qCash.sql.Clear;
    dm.qCash.sql.Add('insert into CashDok (cDate,cKod,cName,cCurs,cSum,cOper,cDiscount,TotalSum) values (:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8)');
    dm.qCash.ParamByName('p1').Value:=DateTimeToStr(Now); //Дата и время
    dm.qCash.ParamByName('p2').Value:=0; //Код валюты
    dm.qCash.ParamByName('p3').Value:=dxButtonEdit1.Text; //Обозначение валюты
    dm.qCash.ParamByName('p4').Value:=Edit1.Text; // Курс валюты
    dm.qCash.ParamByName('p5').Value:=Edit2.Text; // Сумма
    dm.qCash.ParamByName('p6').Value:='Покупка'; // Операция
    dm.qCash.ParamByName('p7').Value:=Edit3.Text; //Скидка
    dm.qCash.ParamByName('p8').Value:=Sum; // Сумма после обмена, т.е. Сумма * Курс
    dm.qCash.Prepare;
    dm.qCash.ExecSQL;
    fmChange1.Close;

    Bal := StrtoFloat(Edit4.Text) - StrtoFloat(Edit2.Text);
    Edit5.Text := FloatToStr(Round(Bal*100)/100); //FloatToStr(Bal);
    dm.qSprVal.close;
    dm.qSprVal.sql.Clear;
    dm.qSprVal.sql.Add('update SprVal set vBalance = '''+ Edit5.Text +''' where vOboz = '''+ dxButtonEdit1.Text+'''');
    dm.qSprVal.Prepare;
    dm.qSprVal.ExecSQL;

  end
    else
    ShowMessage('Не все поля заполнены');
end;


После нажатия кнопки "Сохранить", новая запись сохраняется в таблице CashDok, но на главной форме в гриде таблица закрывается, соответственно не отображаются записи.
Использую следующее, но ни как не помогает.
    dm.qCash.Refresh;
или
    fmMain.DBGridEh1.Refresh;
или
    dm.qCash.Active:=True;

Что я делаю не правильно. Помогите. Заранее благодарен.
ёёёёё
Дата: 16.09.2019 08:14:17
ularsoft,

как называется компонент TQuery, к которой привязан грид главной формы?
wadman
Дата: 16.09.2019 08:14:59
ularsoft
    dm.qCash.close;
    dm.qCash.sql.Clear;
    dm.qCash.sql.Add('insert into CashDok (cDate,cKod,cName,cCurs,cSum,cOper,cDiscount,TotalSum) values (:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8)');

ularsoft
    dm.qCash.Refresh;
или
    fmMain.DBGridEh1.Refresh;
или
    dm.qCash.Active:=True;

Один и тот же запрос для грида и вставки?
DimaBr
Дата: 16.09.2019 08:20:30
В модуле редактирования создайте функцию, которая будет создавать форму редактирования, заполнять предварительными значениями, показывать её, и возвращать результат. Сам Query-редактирования путь будет в форме, а не в DataModule, когда таких форм будет много, ваша DataModule отсанется не захламлённым
function fmChange1Show(TheInsert: boolean; Другие параметры): integer;
begin
  Result := -1;
  with TfmChange1.Create(Application) do begin
    // занести данные в контролы
    if TheInsert then begin
      Edit1.Text := 'какое то значение';
    end;
    if ShowModal = 1 then begin
      // произвести изменения в базе
      if TheInsert
        then Query.SQL.Text := 'insert into CashDok (cDate,cKod,cName,cCurs,cSum,cOper,cDiscount,TotalSum) values (:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8) return @@identity' 
        else Query.SQL.Text := 'update CashDok set cDate = :p1 where Id = :Id';
      Query.Prepare;
      Query.ParamByName('p1').Value := DateTimeToStr(Now); //Дата и время
       ...
      Query.ExecSQL;
      if TheInsert 
        then Result := Query.ParamByName('@RETURN_VALUE').Value // возвращаем Id новой строки
        else Result := Id;
      Free;
    end;
  end;
end; 



// в форме с гридом
procedure TMainFrm.ButtonUpdateClick(Sender: TObject);
var Id: integer;
begin
  Id := fmChange1Show(Sender=ButtonUpdate,.....); // вызываем форму редактирования
  if Id >= 0 then begin// данные успешно вставлены/изменены
    ShowAction.Execute; // перечитываем данные грида
    DatasetShow.Locate('Id',Id,[]); // позиционируем курсор на новой/изменённой записи
  end;
end;
ularsoft
Дата: 16.09.2019 10:34:00
wadman
ularsoft
    dm.qCash.close;
    dm.qCash.sql.Clear;
    dm.qCash.sql.Add('insert into CashDok (cDate,cKod,cName,cCurs,cSum,cOper,cDiscount,TotalSum) values (:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8)');

ularsoft
    dm.qCash.Refresh;
или
    fmMain.DBGridEh1.Refresh;
или
    dm.qCash.Active:=True;

Один и тот же запрос для грида и вставки?
Да, один и тот же.
ёёёёё
Дата: 16.09.2019 11:30:02
ularsoft
wadman
пропущено...

пропущено...

Один и тот же запрос для грида и вставки?
Да, один и тот же.

Надо книжку почитать.
goldmi45
Дата: 16.09.2019 13:49:42
ularsoft
Да, один и тот же.

Если вы используете один компонент для просмотра (select * from CashDok) и вставки (insert into CashDok), то изменив SQL с просмотра на вставку и выполнив его, необходимо SQL опять заменить на просмотр (select* from CashDok).
А лучше использовать разные компоненты для просмотра и вставки.
ularsoft
Дата: 16.09.2019 14:22:55
goldmi45
А лучше использовать разные компоненты для просмотра и вставки.
Н-р, какие?
goldmi45
Дата: 16.09.2019 14:30:38
ularsoft
goldmi45
А лучше использовать разные компоненты для просмотра и вставки.
Н-р, какие?

Имеется в виду, разные TQuery на вставку и на отображение.
ularsoft
Дата: 16.09.2019 14:53:18
goldmi45
ularsoft
пропущено...
Н-р, какие?

Имеется в виду, разные TQuery на вставку и на отображение.
Так и сделал dm.qCashMain для просмотра и dm.qCash для вставки. Все равно грид не обновляется в гл меню.