powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
25 сообщений из 102, страница 4 из 5
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712198
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladwadmanпропущено...

Одна функция с тремя параметрами: тип операции, две id.
Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.
Это ничего не меняет. Тип операции, старый ид, новый ид.
Уж по операции то сумеешь определить, что к чему?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712270
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmansvnvladпропущено...

Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.
Это ничего не меняет. Тип операции, старый ид, новый ид.
Уж по операции то сумеешь определить, что к чему?
Ну да, можно же присвоить в зависимости от типа.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712533
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladЧерез каждые 90 секунд форма обновляется, чтобы отобразить изменения, если они, возможно, сделаны другим сетевым пользователем ... период заморозки составляет до 10 секунд при плохом соединении.
Так вот - можно ли как-то сделать сам процесс перечитывания данных из базы в Thread-е, а уже их отображение - в основном потоке? Думаю, это бы значительно улучшило дружественность программы к пользователям.
Ну, капитан Очевидность задал бы вопрос: "Что будет, если 10 пользователей при плохом соединении будут постоянно перечитывать данные?"
Как-то процесс перечитывания можно сделать так:
Соединение с БД и все запросы должны создаваться и выполняться в самом Thread, можно всё что нужно для TTread вынести в отдельный TDataModule и при чтении создавать и разрушать его. Внутри TThread после загрузки всех наборов данных, копируем их содержимое (см. метод Synchronize) в какие-нибудь наборы данных в памяти (TMemDataSet, TClientDataset и т.п.), которые работают в основном потоке и показываются в гридах.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712539
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbКак-то процесс перечитывания можно сделать так:
Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712544
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanroschinspbКак-то процесс перечитывания можно сделать так:
Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
Можно еще завести спец. поле в которое автоматически заносить текущую дату при любом изменении и читать только те записи в которых значение этого поля больше времени последнего чтения. Но чето подозреваю это слишком сложно...
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712545
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbwadmanпропущено...

Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
Можно еще завести спец. поле в которое автоматически заносить текущую дату при любом изменении и читать только те записи в которых значение этого поля больше времени последнего чтения. Но чето подозреваю это слишком сложно...
Сам догадался?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712546
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbНо чето подозреваю это слишком сложно...
Не совсем. Триггеры, доп.условие в where да обновление измененных записей в памяти.
Еще решить, что делать в конфликтных ситуациях.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712726
MinGW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvladСегодня опять не перерисовывается. Так что нужны они.
Нет. Значит проблема в каком-то другом месте.
Может например у вас "1" выполняется 5 секунд, а "2" и "3" выполняются мгновенно? Тогда ProgressBar показывает вполне корректно.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712903
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanroschinspbНо чето подозреваю это слишком сложно...
Не совсем Сложно в контексте Сегодня опять не перерисовывается
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713232
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinGWsvnvladСегодня опять не перерисовывается. Так что нужны они.
Нет. Значит проблема в каком-то другом месте.
Может например у вас "1" выполняется 5 секунд, а "2" и "3" выполняются мгновенно? Тогда ProgressBar показывает вполне корректно.
Нет, всё равномерно выполняется. Сейчас сделал в треде, все нормально работает, только осталась в конце ближе к уничтожению треда какая-то ошибка доступа 5 вылазит. Но по данным все записывается четко.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713233
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanroschinspbКак-то процесс перечитывания можно сделать так:
Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
Там есть такая проверка. Просто само обновление сеток очень долго идет. Даже когда вручную нажимаешь кнопку обновить.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713488
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста, что не так: возникает ошибка Access Violation. Ошибка доступа 5. При работе деструктора на строке
FfmProgress.Free;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  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;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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;



Код: pascal
1.
2.
3.
4.
5.
destructor TChangeOwnerThread.Destroy;
begin
  FfmProgress.Free;  // на этом месте возникает ошибка
  inherited;
end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713510
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Код: pascal
1.
2.
    procedure InitBars;
    procedure UpdateBarPositions;


Там что?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713565
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
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;, то окошко так и остается висеть на экране.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713569
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

а если в конструктор потока передавать уже созданную форму?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713571
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladДа, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.
Просто закрывай окно, а в событии OnClose выставь action := caFree.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713597
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45svnvlad,

а если в конструктор потока передавать уже созданную форму?
То же самое.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713605
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmansvnvladДа, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.
Просто закрывай окно, а в событии OnClose выставь action := caFree.
Теперь нормально. А почему так? Видимое окно нельзя освобождать?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713607
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladgoldmi45svnvlad,

а если в конструктор потока передавать уже созданную форму?
То же самое.
Ну и в деструкторе потока не убивать форму, а уничтожать в главном потоке в событии OnTerminate потока....
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713610
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladПодскажите пожалуйста, что не так: возникает ошибка Access Violation. Ошибка доступа 5. При работе деструктора на строке
FfmProgress.Free;
Ну давай думать. Эта строчка у тебя в деструкторе. Деструктор вызывается при уничтожении потока. Уничтожение потока при FreeOnTerminate = true происходит в самом потоке. Итого, операции с формой в левом потоке. Что говорится по этому поводу в VCL?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713617
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladwadmanпропущено...

Просто закрывай окно, а в событии OnClose выставь action := caFree.
Теперь нормально. А почему так? Видимое окно нельзя освобождать?
Потому что поток еще "работает" с окном.

Поменяй эти две строки местами.
svnvlad
Код: pascal
1.
2.
3.
4.
5.
destructor TChangeOwnerThread.Destroy;
begin
  FfmProgress.Free;  // на этом месте возникает ошибка
  inherited;
end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713633
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerУничтожение потока при FreeOnTerminate = true происходит в самом потоке.
Этот момент упустил из виду. В общем, с caFree тогда единственный из простых вариант.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713721
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем получилось красиво. Если интересно,
в главной форме:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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;



Класс потока:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
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;

.....
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713804
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

портянки стоит в спойлер прятать. :)
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713810
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladВ общем получилось красиво. Если интересно,


Мой совет - убрать восклицательные знаки из сообщений.
...
Рейтинг: 0 / 0
25 сообщений из 102, страница 4 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]