Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
Здравствуйте, уважаемые форумчане!
Помогите решить проблему с отображением данных в гриде.
На главной форме (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 сен 19, 05:56    [21971302]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ёёёёё
Member

Откуда:
Сообщений: 973
ularsoft,

как называется компонент TQuery, к которой привязан грид главной формы?
16 сен 19, 08:14    [21971325]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25934
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 сен 19, 08:14    [21971326]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
DimaBr
Member

Откуда:
Сообщений: 11285
В модуле редактирования создайте функцию, которая будет создавать форму редактирования, заполнять предварительными значениями, показывать её, и возвращать результат. Сам 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;
16 сен 19, 08:20    [21971328]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
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 сен 19, 10:34    [21971390]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ёёёёё
Member

Откуда:
Сообщений: 973
ularsoft
wadman
пропущено...

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

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

Надо книжку почитать.
16 сен 19, 11:30    [21971430]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
goldmi45
Member

Откуда:
Сообщений: 1184
ularsoft
Да, один и тот же.

Если вы используете один компонент для просмотра (select * from CashDok) и вставки (insert into CashDok), то изменив SQL с просмотра на вставку и выполнив его, необходимо SQL опять заменить на просмотр (select* from CashDok).
А лучше использовать разные компоненты для просмотра и вставки.
16 сен 19, 13:49    [21971580]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
goldmi45
А лучше использовать разные компоненты для просмотра и вставки.
Н-р, какие?
16 сен 19, 14:22    [21971636]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
goldmi45
Member

Откуда:
Сообщений: 1184
ularsoft
goldmi45
А лучше использовать разные компоненты для просмотра и вставки.
Н-р, какие?

Имеется в виду, разные TQuery на вставку и на отображение.
16 сен 19, 14:30    [21971654]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
goldmi45
ularsoft
пропущено...
Н-р, какие?

Имеется в виду, разные TQuery на вставку и на отображение.
Так и сделал dm.qCashMain для просмотра и dm.qCash для вставки. Все равно грид не обновляется в гл меню.
16 сен 19, 14:53    [21971691]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
goldmi45
Member

Откуда:
Сообщений: 1184
ularsoft
goldmi45
пропущено...

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

После вставки записи, набор данных должен быть перечитан. Т.е. выполнена операция Close-Open. Refresh обновляет существующие (ранее считанные) данные.
16 сен 19, 15:36    [21971728]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ёёёёё
Member

Откуда:
Сообщений: 973
goldmi45
ularsoft
пропущено...
Так и сделал dm.qCashMain для просмотра и dm.qCash для вставки. Все равно грид не обновляется в гл меню.

После вставки записи, набор данных должен быть перечитан. Т.е. выполнена операция Close-Open. Refresh обновляет существующие (ранее считанные) данные.

Это с чего такое нездоровое мнение?
16 сен 19, 16:23    [21971790]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
didgik
Member

Откуда:
Сообщений: 855
ёёёёё
goldmi45
пропущено...

После вставки записи, набор данных должен быть перечитан. Т.е. выполнена операция Close-Open. Refresh обновляет существующие (ранее считанные) данные.

Это с чего такое нездоровое мнение?

Это здоровое мнение. Вариантов кроме Close-Open я тоже не знаю.

ularsoft, и вообще выполняй запрос через Connect.Execute() или как там у тебя. А потом Close-Open у qCash.
16 сен 19, 16:38    [21971805]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
didgik
Member

Откуда:
Сообщений: 855
Потом через Locate надо вернуть курсор на свое место если был апдейт. И еще, желательно, вернуть строчку в гриде на свое место, но это пока не знаю как.
16 сен 19, 16:41    [21971808]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
didgik
ularsoft, и вообще выполняй запрос через Connect.Execute() или как там у тебя. А потом Close-Open у qCash.
Сделал как вы сказали Close-Open и все хорошо,т.е.
    dm.qCash.Close;
    dm.qCash.SQL.Clear;
    dm.qCash.SQL.Add('select * from CashDok');
    dm.qCash.Open;
17 сен 19, 07:04    [21972088]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ёёёёё
Member

Откуда:
Сообщений: 973
ularsoft
didgik
ularsoft, и вообще выполняй запрос через Connect.Execute() или как там у тебя. А потом Close-Open у qCash.
Сделал как вы сказали Close-Open и все хорошо,т.е.
    dm.qCash.Close;
    dm.qCash.SQL.Clear;
    dm.qCash.SQL.Add('select * from CashDok');
    dm.qCash.Open;

Два красавца...
17 сен 19, 07:27    [21972093]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
ёёёёё
Два красавца...
А че? Работает же...
17 сен 19, 08:33    [21972121]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
Ребята, теперь возникла другая проблема :(
Имеется справочник валют (таблица - SprVal) с остатками:
v_kod vOboz vName vBalance
840USDДоллары США41000
978EURЕвро60000
643RUBРоссийские рубли150000
При обмене одной валюты на другую, н-р, доллары США на Российские рубли, остаток (доллары США) увеличивается, остаток (Российские рубли) уменьшается.
Увеличение по первой валюте делаю следующим образом:
    Bal := StrtoFloat(Edit4.Text) + StrtoFloat(Edit2.Text);
    Edit5.Text := FloatToStr(Round(Bal*100)/100);
    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;
Где Edit4.Text - Остаток, Edit2.Text - Сумма. Как сделать уменьшение по второй валюте? Подскажите пожалуйста.
17 сен 19, 11:28    [21972309]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
Если клиент продает 100 долларов, покупает рубли, то остаток (доллары) 41000+100=41100, остаток (рубли) 150000-6383=143617, курс доллара к рублю по ЦБ РФ 63,83.
17 сен 19, 11:44    [21972338]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
DimaBr
Member

Откуда:
Сообщений: 11285
Не правильная постановка задачи.
Должно быть
1. Справочник валют
2. Начальное сальдо по валютам
3. Операции движения.

Конечное сальдо вычисляется как начальное+операции
17 сен 19, 13:41    [21972512]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
didgik
Member

Откуда:
Сообщений: 855
ёёёёё
ularsoft
пропущено...
Сделал как вы сказали Close-Open и все хорошо,т.е.
    dm.qCash.Close;
    dm.qCash.SQL.Clear;
    dm.qCash.SQL.Add('select * from CashDok');
    dm.qCash.Open;

Два красавца...

Я то что не так сказал?
17 сен 19, 13:44    [21972514]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ёёёёё
Member

Откуда:
Сообщений: 973
didgik,

код рабочий, все отлично!
17 сен 19, 14:07    [21972539]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
didgik
ёёёёё
пропущено...

Два красавца...

Я то что не так сказал?
Все хорошо. Не переживайте.
17 сен 19, 14:24    [21972566]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
ularsoft
Member

Откуда:
Сообщений: 288
DimaBr
Не правильная постановка задачи.
Должно быть
1. Справочник валют
2. Начальное сальдо по валютам
3. Операции движения.

Конечное сальдо вычисляется как начальное+операции
Все это у меня есть.
Справочник валют (таблица - SprVal) с остатками:
v_kod vOboz vName vBalance
840USDДоллары США41000
978EURЕвро60000
643RUBРоссийские рубли150000
Начальное сальдо по валютам:
iDate iKod iOboz iName iSum iKom
17.09.2019 08:58:56840USDДоллары США41000Приход
17.09.2019 09:55:24840EURЕвро60000Приход
17.09.2019 11:39:36643RUBРоссийские рубли150000Приход
Операции движения:
cDate cKod cName cCurs cSum cOper cDiscount TotalSum
17.09.2019 12:05:09840Доллары США63.83500Покупка031915
17.09.2019 14:25:17840Доллары США63.83500Покупка031915
17.09.2019 16:10:58978Евро70.75400Покупка028300
Может я не правильно делаю? Помогите пожалуйста.
17 сен 19, 14:38    [21972583]     Ответить | Цитировать Сообщить модератору
 Re: Отображение данных после сохранения записей  [new]
didgik
Member

Откуда:
Сообщений: 855
ёёёёё
didgik,

код рабочий, все отлично!

Нет! А чо я сделал то?

Скажи уж, как надо то, не томи.
17 сен 19, 14:45    [21972593]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить