Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
svnvlad
wadman
пропущено...

Одна функция с тремя параметрами: тип операции, две id.

Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.

Это ничего не меняет. Тип операции, старый ид, новый ид.
Уж по операции то сумеешь определить, что к чему?
3 окт 18, 07:37    [21693625]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

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

Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.

Это ничего не меняет. Тип операции, старый ид, новый ид.
Уж по операции то сумеешь определить, что к чему?

Ну да, можно же присвоить в зависимости от типа.
3 окт 18, 10:17    [21693744]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1554
svnvlad
Через каждые 90 секунд форма обновляется, чтобы отобразить изменения, если они, возможно, сделаны другим сетевым пользователем ... период заморозки составляет до 10 секунд при плохом соединении.
Так вот - можно ли как-то сделать сам процесс перечитывания данных из базы в Thread-е, а уже их отображение - в основном потоке? Думаю, это бы значительно улучшило дружественность программы к пользователям.

Ну, капитан Очевидность задал бы вопрос: "Что будет, если 10 пользователей при плохом соединении будут постоянно перечитывать данные?"
Как-то процесс перечитывания можно сделать так:
Соединение с БД и все запросы должны создаваться и выполняться в самом Thread, можно всё что нужно для TTread вынести в отдельный TDataModule и при чтении создавать и разрушать его. Внутри TThread после загрузки всех наборов данных, копируем их содержимое (см. метод Synchronize) в какие-нибудь наборы данных в памяти (TMemDataSet, TClientDataset и т.п.), которые работают в основном потоке и показываются в гридах.
3 окт 18, 16:12    [21694269]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
roschinspb
Как-то процесс перечитывания можно сделать так:

Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
3 окт 18, 16:18    [21694282]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1554
wadman
roschinspb
Как-то процесс перечитывания можно сделать так:

Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.

Можно еще завести спец. поле в которое автоматически заносить текущую дату при любом изменении и читать только те записи в которых значение этого поля больше времени последнего чтения. Но чето подозреваю это слишком сложно...
3 окт 18, 16:29    [21694293]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
roschinspb
wadman
пропущено...

Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.

Можно еще завести спец. поле в которое автоматически заносить текущую дату при любом изменении и читать только те записи в которых значение этого поля больше времени последнего чтения. Но чето подозреваю это слишком сложно...

Сам догадался?
3 окт 18, 16:30    [21694295]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
roschinspb
Но чето подозреваю это слишком сложно...

Не совсем. Триггеры, доп.условие в where да обновление измененных записей в памяти.
Еще решить, что делать в конфликтных ситуациях.
3 окт 18, 16:32    [21694298]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
MinGW
Member

Откуда:
Сообщений: 11
svnvlad
Сегодня опять не перерисовывается. Так что нужны они.

Нет. Значит проблема в каком-то другом месте.
Может например у вас "1" выполняется 5 секунд, а "2" и "3" выполняются мгновенно? Тогда ProgressBar показывает вполне корректно.
3 окт 18, 23:18    [21694678]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1554
wadman
roschinspb
Но чето подозреваю это слишком сложно...

Не совсем
Сложно в контексте Сегодня опять не перерисовывается
4 окт 18, 12:03    [21695018]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
MinGW
svnvlad
Сегодня опять не перерисовывается. Так что нужны они.

Нет. Значит проблема в каком-то другом месте.
Может например у вас "1" выполняется 5 секунд, а "2" и "3" выполняются мгновенно? Тогда ProgressBar показывает вполне корректно.

Нет, всё равномерно выполняется. Сейчас сделал в треде, все нормально работает, только осталась в конце ближе к уничтожению треда какая-то ошибка доступа 5 вылазит. Но по данным все записывается четко.
4 окт 18, 19:24    [21695719]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
wadman
roschinspb
Как-то процесс перечитывания можно сделать так:

Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.

Там есть такая проверка. Просто само обновление сеток очень долго идет. Даже когда вручную нажимаешь кнопку обновить.
4 окт 18, 19:26    [21695720]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
Подскажите пожалуйста, что не так: возникает ошибка Access Violation. Ошибка доступа 5. При работе деструктора на строке
FfmProgress.Free;

  TChangeOwnerThread = class(TThread)
  private
    FMode: TcoMode;
    FParamType: TChangeOwnerParamType;
    Fcargo_card_id: integer;
    Fcontract_cargo_consignment_id: integer;
    Fcontract_cargo_sub_id: integer;
    Fconsignment_id: integer;
    Fret_cargo_card_id: integer;
    FfmProgress: TfmChangeOwnerProgress; // Окошко прогресс-баров
    Fnew_id: integer;
    Fret_message: string;
    ..............
    procedure InitBars;
    procedure UpdateBarPositions;
    .............
    property fmProgress: TfmChangeOwnerProgress read FfmProgress write FfmProgress;

    property Mode: TcoMode read FMode;
    property ParamType: TChangeOwnerParamType read FParamType;
    .............
    procedure Execute; override;
  public
    ..............
    constructor Create(AMode: TcoMode; AParamType: TChangeOwnerParamType;
                        const ACargoCardId: Integer; const ANewId: integer; ATermProc: TNotifyEvent);
    destructor Destroy; override;
  end;


constructor TChangeOwnerThread.Create(AMode: TcoMode; AParamType: TChangeOwnerParamType;
                        const ACargoCardId: Integer; const ANewId: integer; ATermProc: TNotifyEvent);
var
  q: TBISMySQLQuery;
begin
  inherited Create(true);
  FreeOnTerminate := true;
  OnTerminate := ATermProc;

  FMode := AMode;
  FParamType := AParamType;
  Fcargo_card_id := ACargoCardId;
  Fnew_id := ANewId;
  ......

  FfmProgress := TfmChangeOwnerProgress.Create(nil);
  FfmProgress.Show;
end;


destructor TChangeOwnerThread.Destroy;
begin
  FfmProgress.Free;  // на этом месте возникает ошибка
  inherited;
end;
5 окт 18, 12:18    [21696236]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
svnvlad
    procedure InitBars;
    procedure UpdateBarPositions;

Там что?
5 окт 18, 12:34    [21696267]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

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

procedure TChangeOwnerThread.InitBars;
begin
  if Assigned(fmProgress) then
    begin
      if fmProgress.Max1 <> FMaxContractCargoConsignment then
        fmProgress.Max1 := FMaxContractCargoConsignment;
      if fmProgress.Max2 <> FMaxContractCargoSub then
        fmProgress.Max2 := FMaxContractCargoSub;
      if fmProgress.Max3 <> FMaxCargoCard then
        fmProgress.Max3 := FMaxCargoCard;
    end;
end;

procedure TChangeOwnerThread.UpdateBarPositions;
begin
  if Assigned(fmProgress) then
    begin
      if fmProgress.Position1 <> FChangedCountContractCargoConsignment then
        fmProgress.Position1 := FChangedCountContractCargoConsignment;
      if fmProgress.Position2 <> FChangedCountContractCargoSub then
        fmProgress.Position2 := FChangedCountContractCargoSub;
      if fmProgress.Position3 <> FChangedCountCargoCard then
        fmProgress.Position3 := FChangedCountCargoCard;
    end;
end;

procedure TChangeOwnerThread.SetChangedCountCargoCard(const Value: integer);
begin
  FChangedCountCargoCard := Value;
  Synchronize(UpdateBarPositions);
end;

procedure TChangeOwnerThread.SetMaxCargoCard(const Value: integer);
begin
  FMaxCargoCard := Value;
  Synchronize(InitBars);
end;


Да, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.
5 окт 18, 13:45    [21696357]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
goldmi45
Member

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

а если в конструктор потока передавать уже созданную форму?
5 окт 18, 13:47    [21696361]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
svnvlad
Да, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.

Просто закрывай окно, а в событии OnClose выставь action := caFree.
5 окт 18, 13:51    [21696363]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
goldmi45
svnvlad,

а если в конструктор потока передавать уже созданную форму?

То же самое.
5 окт 18, 14:18    [21696402]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
wadman
svnvlad
Да, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.

Просто закрывай окно, а в событии OnClose выставь action := caFree.

Теперь нормально. А почему так? Видимое окно нельзя освобождать?
5 окт 18, 14:26    [21696411]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
goldmi45
Member

Откуда:
Сообщений: 1066
svnvlad
goldmi45
svnvlad,

а если в конструктор потока передавать уже созданную форму?

То же самое.

Ну и в деструкторе потока не убивать форму, а уничтожать в главном потоке в событии OnTerminate потока....
5 окт 18, 14:29    [21696415]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 54536
Блог
svnvlad
Подскажите пожалуйста, что не так: возникает ошибка Access Violation. Ошибка доступа 5. При работе деструктора на строке
FfmProgress.Free;

Ну давай думать. Эта строчка у тебя в деструкторе. Деструктор вызывается при уничтожении потока. Уничтожение потока при FreeOnTerminate = true происходит в самом потоке. Итого, операции с формой в левом потоке. Что говорится по этому поводу в VCL?
5 окт 18, 14:33    [21696420]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
svnvlad
wadman
пропущено...

Просто закрывай окно, а в событии OnClose выставь action := caFree.

Теперь нормально. А почему так? Видимое окно нельзя освобождать?

Потому что поток еще "работает" с окном.

Поменяй эти две строки местами.
svnvlad
destructor TChangeOwnerThread.Destroy;
begin
  FfmProgress.Free;  // на этом месте возникает ошибка
  inherited;
end;
5 окт 18, 14:43    [21696432]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
softwarer
Уничтожение потока при FreeOnTerminate = true происходит в самом потоке.

Этот момент упустил из виду. В общем, с caFree тогда единственный из простых вариант.
5 окт 18, 15:06    [21696461]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
В общем получилось красиво. Если интересно,
в главной форме:
procedure TfmCargoOutgoing.ThreadChangeOwnerTerminate(Sender: TObject);
var
  th: TChangeOwnerThread absolute Sender;
begin
  if th.ret_cargo_card_id <> 0 then
    begin
      ChangeQueryCargo; // перечитывает сетку
      placement_cargo_card_id := th.ret_cargo_card_id; // позиционирует курсор сетки на нужную запись
      ShowMessage(th.ret_message);
    end;
end;

procedure TfmCargoOutgoing.actChangeOwnerExecute(Sender: TObject);
var
  fDlg: TfmChangeOwnerParams;
  ChThread: TChangeOwnerThread;
begin
  fDlg := TfmChangeOwnerParams.Create(self);
  try
    fDlg.source_cargo_card_id := placement_cargo_card_id;
    if fDlg.ShowModal = mrOk then
      begin
        ChThread := TChangeOwnerThread.Create(coChange, fDlg.ParamType, placement_cargo_card_id, fDlg.new_id, ThreadChangeOwnerTerminate);
        try
          ChThread.Start;
        finally
        end;
      end;
  finally
    fDlg.Free;
  end;
end;


Класс потока:
type
  TcoMode = (coChange, coCancel);

  TChangeOwnerThread = class(TThread)
  private
    FMode: TcoMode;
    FParamType: TChangeOwnerParamType;
    Fcargo_card_id: integer;
    Fcontract_cargo_consignment_id: integer;
    Fcontract_cargo_sub_id: integer;
    Fconsignment_id: integer;
    Fret_cargo_card_id: integer;
    FfmProgress: TfmChangeOwnerProgress;
    Fnew_id: integer;
    Fret_message: string;
    FChangedCountContractCargoConsignment: integer;
    FChangedCountContractCargoSub: integer;
    FChangedCountCargoCard: integer;
    FMaxContractCargoConsignment: integer;
    FMaxContractCargoSub: integer;
    FMaxCargoCard: integer;
    FTotalChangedCountCargoCard: integer;
    { Private declarations }

    procedure InitBars; // вызывать через Synchronize
    procedure UpdateBarPositions; // вызывать через Synchronize
    procedure SetCargoCardId(const Value: integer);
    procedure SetChangedCountCargoCard(const Value: integer);
    procedure SetChangedCountContractCargoConsignment(const Value: integer);
    procedure SetChangedCountContractCargoSub(const Value: integer);
    procedure SetMaxCargoCard(const Value: integer);
    procedure SetMaxContractCargoConsignment(const Value: integer);
    procedure SetMaxContractCargoSub(const Value: integer);
  protected
    property fmProgress: TfmChangeOwnerProgress read FfmProgress write FfmProgress; // форма с прогресс-барами

    property Mode: TcoMode read FMode;
    property ParamType: TChangeOwnerParamType read FParamType;
    property cargo_card_id: integer read Fcargo_card_id; // текущая карточка склада, задается конструктором
    property contract_cargo_sub_id: integer read Fcontract_cargo_sub_id; // подтип груза по договору в текущей карточке склада
    property contract_cargo_consignment_id: integer read Fcontract_cargo_consignment_id; // номенклатура партии
    property consignment_id: integer read Fconsignment_id; // партия

    property new_id: integer read Fnew_id; // новый id, на который нужно поменять (карточки, подтипа, номенклатуры или партии, в зависимости от ParamType)

    // Процедуры смены собственника по уровням
    ..............
    function DoChangeOwnerContractCargoSub(AOldContractCargoSubId, ANewContractCargoSubId: integer): integer;
    ....................

    procedure Execute; override;
  public
    property ret_cargo_card_id: integer read Fret_cargo_card_id; // для возвращения на ту же позицию сетки после всех операций
    property ret_message: string read Fret_message; // возвращаемое сообщение об успехе или ошибке
    property TotalChangedCountCargoCard: integer read FTotalChangedCountCargoCard write FTotalChangedCountCargoCard; // итоговое количество измененных карточек груза

    constructor Create(AMode: TcoMode; AParamType: TChangeOwnerParamType;
                        const ACargoCardId: Integer; const ANewId: integer; ATermProc: TNotifyEvent);
    destructor Destroy; override;
  end;


implementation

........

constructor TChangeOwnerThread.Create(AMode: TcoMode; AParamType: TChangeOwnerParamType;
                        const ACargoCardId: Integer; const ANewId: integer; ATermProc: TNotifyEvent);
begin
  inherited Create(true);
  FreeOnTerminate := true;
  OnTerminate := ATermProc;

  FMode := AMode;
  FParamType := AParamType;
  Fcargo_card_id := ACargoCardId;
  Fnew_id := ANewId;
  .................

  FfmProgress := TfmChangeOwnerProgress.Create(nil);
  FfmProgress.Show;
end;

destructor TChangeOwnerThread.Destroy;
begin
  fmProgress.Close;
  inherited;
end;

.....
procedure TChangeOwnerThread.Execute;
begin
  if Mode = coChange then // Смена собственника
    begin
      case ParamType of
      ptConsignment:
        begin
          DoChangeOwnerConsignment(consignment_id, new_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              Fret_message := 'Операция смены собственника для выбранной партии произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек передано новому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена смена собственника.';
        end;
      ptContractCargoConsignment:
        begin
          MaxContractCargoConsignment := 1;
          DoChangeOwnerContractCargoConsignment(contract_cargo_consignment_id, new_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              ChangedCountContractCargoConsignment := 1;
              Fret_message := 'Операция смены собственника для выбранной номенклатуры партии произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек передано новому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена смена собственника.';
        end;
      ptContractCargoSub:
        begin
          MaxContractCargoConsignment := 1; MaxContractCargoSub := 1;
          DoChangeOwnerContractCargoSub(contract_cargo_sub_id, new_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              ChangedCountContractCargoConsignment := 1; ChangedCountContractCargoSub := 1;
              Fret_message := 'Операция смены собственника для выбранного подтипа груза произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек передано новому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена смена собственника.';
        end;
      ptCargoCard:
        begin
          MaxContractCargoConsignment := 1; MaxContractCargoSub := 1; MaxCargoCard := 1;
          Fret_cargo_card_id := DoChangeOwnerCargoCard(cargo_card_id, new_id);
          if Fret_cargo_card_id <> 0 then
            begin
              ChangedCountContractCargoConsignment := 1; ChangedCountContractCargoSub := 1; ChangedCountCargoCard := 1;
              Fret_message := 'Операция смены собственника для карточки склада произведена успешно!';
            end;
        end;
      end; //case
    end
  else // coCancel - Отмена смены собственника
    begin
      case ParamType of
      ptConsignment:
        begin
          DoCancelChangeOwnerConsignment(consignment_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              Fret_message := 'Отмена операции смены собственника для выбранной номенклатуры произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек возвращено старому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена отмена операции смены собственника.';
        end;
      ptContractCargoConsignment:
        begin
          MaxContractCargoConsignment := 1;
          DoCancelChangeOwnerContractCargoConsignment(contract_cargo_consignment_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              ChangedCountContractCargoConsignment := 1;
              Fret_message := 'Отмена операции смены собственника для выбранной номенклатуры произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек возвращено старому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена отмена операции смены собственника.';
        end;
      ptContractCargoSub:
        begin
          MaxContractCargoConsignment := 1; MaxContractCargoSub := 1;
          DoCancelChangeOwnerContractCargoSub(contract_cargo_sub_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              ChangedCountContractCargoConsignment := 1; ChangedCountContractCargoSub := 1;
              Fret_message := 'Отмена операции смены собственника для выбранного подтипа груза произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек возвращено старому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена отмена операции смены собственника.';
        end;
      ptCargoCard:
        begin
          MaxContractCargoConsignment := 1; MaxContractCargoSub := 1; MaxCargoCard := 1;
          Fret_cargo_card_id := DoCancelChangeOwnerCargoCard(cargo_card_id);
          if Fret_cargo_card_id <> 0 then
            begin
              ChangedCountContractCargoConsignment := 1; ChangedCountContractCargoSub := 1; ChangedCountCargoCard := 1;
              Fret_message := 'Отмена операции смены собственника произведена успешно!';
            end
          else
            Fret_message := 'Для данной карточки не может быть отменена смена собственника, т.к. ее собственник не менялся!';
        end;
      end; // case
    end;
end;

.....
5 окт 18, 16:34    [21696592]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
svnvlad,

портянки стоит в спойлер прятать. :)
5 окт 18, 20:02    [21696781]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
svnvlad
В общем получилось красиво. Если интересно,


Мой совет - убрать восклицательные знаки из сообщений.
5 окт 18, 20:50    [21696798]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
Все форумы / Delphi Ответить