powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по генераторам
53 сообщений из 53, показаны все 3 страниц
Вопрос по генераторам
    #32412375
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне нужно получить текущее значение генератора в ХП, делаю gen_id(name_gen,0), но есть вопрос, можно ли задать вместо name_gen входной параметр gen_id(:par,0) не проходит.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32412384
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну раз не проходит, значит нельзя. Используй EXECUTE STATEMENT...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413210
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>VF

А зачем его вообще получать ? Может не туда роешь...:)
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413363
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с использованием генератора и триггера обновляется первичный ключ, сразу после вставки нужно получить значение этого ключа (последнее, т.е. значение генератора), вот для этого используется ХП, которая и возвращает зн. генератора, можно сделать для каждой таблицы свою ХП, но вот если бы имя генератора передавать как параметр, тогда одной ХП хватило бы...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413371
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFсразу после вставки нужно получить значение этого ключа (последнее, т.е. значение генератора)
Верный способ наступить себе на яйца.
Получать нужно ДО вставки и не текущее, а ИНКРЕМЕНТНОЕ .
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413381
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно делаешь. Т.к. между твоей вставкой и твоим получением генератора кто-то другой страждущий может вставить своё... И ты получишь не то, что хотел...
Правильно так: получить очередное зн.ген-ра (будешь его знать) и потом уже вставить... :)
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413392
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так сначала делается вставка, потом делается gen_id(gen_name,0) и это всё хозяйство в рамках одной транзакции, что может и не пройти?
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413401
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Генераторам, грубо говоря, начхать, на твои рамки транзакции.
Они ВНЕ КОНТЕКСТА транзакций.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413415
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял исправлюсь...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413420
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ему ведь это скорее всего нужно для того чтобы запись обновить... В принципе если у него пару раз за 100 лет неправильное значение вернёться, то с этим жить можно

2 VF:
Если ты обновляешь записи таким макаром, то лучше заведи табличку отдельную и регистри там все обновления таблиц и посылай из триггеров событие какое-нибудь клиентам - так, мне кажется, будет вернее для многопользовательского доступа.
Можно ещё попробовать генерить имя события, а на клиенте ловить все события, парсить их и обновлять те данные, которые нужно. Но это всё теория опять же - на практике я так не пробовал делать...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413436
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gold
так работает сейчас с отдельной таблицей, но там уже было дело с неправильным значением, не есть гуд это...

вообще тогда поменяю вопрос: как встать в гриде (дельфи) после инсёрта на только что вставленную запись, вот для чего это нужно, локейт встаёт на запись на которой стояли до вставки, вот в чём проблема...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413449
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня на FIBPlus таких проблем нет - всё само правильно позиционируется.
Ты наверное на IBX работаешь. Когда-то я на них тоже работал и припоминаю что у них была такая бага. Попробуй найти более новую версию IBX...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413454
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi 7, то что в комплекте...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413474
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты ж пойми, IBX - это не BDE тебе и Locate здесь перебирает все записи. К тому же в IBX, если мне память не изменяет, нельзя полностью события скрола отключить как в FIBPlus со всякими DisableScrollEvents и т.п., т.е. если у тебя есть дочерняя таблица, то locate вобще медленно работать будет.
Я б тебе посоветовал выкинуть IBX и мигрировать на FIBPlus - они того стоят...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413478
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вся разница в том, что в FIB+ можно неявно получать очередное значение генератора и невно же вставлять. В IBX - нет такой функциональности. Посему надо получать явно очер.зн.ген.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413491
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой! А куда дели? Всегда была, а тут вдруг нету?..
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413498
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gold
если бы я был один...другие не будт переходить...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413537
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда попробуй в триггере что-то типа:
POST EVENT 'TABLE_1:'||NEW.ID;
Потом лови это на клиенте, парси и делай обновление.

Ещё, как вариант, самому поправить исходники IBX.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413563
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кого править, хлопцы?!
Или вы считаете, что проперть GeneratorField придумал Буззаджи с Востриковым?!
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413601
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Мимопроходящий
это Ты к чему???
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413615
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это я про то, что в IBX есть свойство такое, спЕцательное.
GeneratorField называется.
Которое тебе как раз и нужно пользовать.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413618
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по подробнее, если можно...
ЗЫ очень стыжусь своей некомпетентности и жуткой лени...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413622
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была в IBX бочина что после вставки текущей записью была не вставленная, а другая какая-то (то ли первая, то ли предыдущая). Ключевое поле нормально заполнялось генератором, указанным в GeneratorField, но после выполнения Post курсор почему-то перескакивал на другую запись.
Насколько я понял VF именно на это наступил... Не думаю что он не заметил существование свойства GeneratorField
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413626
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ? Да, действительно есть. Спасибо старине Джеффу :) , большому любителю багофич и просто багов...
Хотя может и работает оно там...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413638
kata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто не знает, есть ещё такой трюк

type
THack = class(TIBCustomDataSet)
end;

...

THack(taJournal).GeneratorField.Field := 'id';
THack(taJournal).GeneratorField.Generator := 'ID_GEN';

если taJournal типа TIBTable а не TIBDataSet
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32413665
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не уверен что в последних версиях эта бага осталась, но во времена CBuilder5 она точно была...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415463
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Special 2 Gold:

Ну тогда попробуй в триггере что-то типа:
POST EVENT 'TABLE_1:'||NEW.ID;
Потом лови это на клиенте, парси и делай обновление.

Ещё, как вариант, самому поправить исходники IBX.


Чем ловить эвенты будете?
Поделитесь, как подписаться заранее неизвестный эвент...

С огромнейшим уважением.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415505
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобще я же написал что это всё в теории. Я думал что если не указывать ни одного события при регистрации, то клиенту будут все события посылаться. Оказалось что это не правда - только что проверил в фибах...
В общем я не знаю как это сделать и возможно ли вобще :-/ Если кто-то знает как - пускай напишет.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415526
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gold по поводу Events
Жаль...

Я как-то долго заморачивался с этим, и не решил.

В FB как-то обещали параметризованные Events, да, видно, позабыли...

---------------------
2 All - на Devrace.com - масса примеров + доки на русском, как и когда юзать генераторы, компоненты к ним и почему хорошо получать Id записи ДО ЕЕ ФАКТИЧЕСКОГО добавления.
Да, я имею в виду FIB+ Сергея Бузаджи.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415534
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуй пойду спрошу в конференции как на любое событие подписаться... Было бы замечательно если бы такая возможность была...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415650
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
решил обновлять генератор, а потом уже обрабатывать его значение, всем спасибо
ЗЫ нужно не только для вставания на новую запись, так что ещё раз сенкс...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415713
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПожалуй пойду спрошу в конференции как на любое событие подписаться... Было бы замечательно если бы такая возможность была...

Увы, низзя этого. Пока что.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415826
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы, низзя этого. Пока что.

- Пока что? Что-то обещают девелоперы?
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415831
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот девелоп тебе и говорит
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415856
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз нельзя по событиям обновлять данные, значит обновлять и не будем
Я вот кнопки "обновить" понытыкивал во все формы - пускай обновляют что хотят и когда хотят
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415861
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верной дорогой идёте, товарищи!
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32415920
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А хорошо бы по эвентам дизейблить такие кнопки, а юзер на нах давил бы, и рефрешил датасеты... И чтобы дизэйблились они только тогода, когда другие (а не я) юзеры эвенты генерят...


"Хорошо бы, душенька, мост построить и погулять по тому мосту с государем императором", - Манилов, (Гоголь Н.В. "Мертвые души")
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32416254
sqliner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем Здрав... эээ С праз... короче.

2 Gold
>Раз нельзя по событиям обновлять данные, значит обновлять и не будем
Это вы, батенька, заблуждаетесь - можно и даже нужно.

2 mv
>А хорошо бы по эвентам дизейблить такие кнопки, а юзер на нах давил бы, и рефрешил датасеты... И чтобы дизэйблились они только тогода, когда другие (а не я) юзеры эвенты генерят...
Ин фирст: По эвентам не дизейблить а энейблить, наверное.
Ин секонд: Если ты сможешь так реагировать на эвенты, то нафиг кнопки - рефреш заинтересованные датасеты.
Ин тхирд: Еще на заре моего общения с IBase (правда не так давно это и было - отблески зари еще видно) сконструировал скелетик, фунциклирующий именно так, пользую до сейчас, проги установлены у заказчиков - и работают.

2 Всем
Кому интересно, могу эту схемку показать, заодно и обсудить. Чтобы мне не сорить тут, заявляйте - кину на мыло.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32416289
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>sqliner
> " ... могу эту схемку показать ... "
В студию
------------------------
С уважением, Denis Uskov
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32416308
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 sqliner
мне интересно, а нельзя сюда выложить?
хотя можно и на мыло shka@mail.ru
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32416352
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Ин секонд: Если ты сможешь так реагировать на эвенты, то нафиг кнопки -
>рефреш заинтересованные датасеты.

Заинтересованные датасеты могут быть неготовы к внезапному рефрешу...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32416642
sqliner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Без проблем - но во вторник... ик... ик...
А то у нас уже 23 наступило, девчонки поздравляют в полный рост, от компа тащат.

Не бейте...
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32418761
sqliner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, в общем, вы сами этого хотели (я предупреждал - это длинно).

Итак:
Скрипт

Код: plaintext
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.
SET SQL DIALECT  3 ;

SET NAMES WIN1251;

CREATE GENERATOR SPRAV1_GEN;

CREATE TABLE SPRAV1 (
    IDN     INTEGER NOT NULL,
    NAIMEN  VARCHAR( 30 ) COLLATE PXW_CYRL,
    COLICH  INTEGER
);

ALTER TABLE SPRAV1 ADD CONSTRAINT PK_SPRAV1 PRIMARY KEY (IDN);

SET TERM ^ ;

CREATE PROCEDURE SPRAV1_DEL (
    IDN INTEGER)
AS
begin
 DELETE FROM SPRAV1
  WHERE IDN = :IDN;
 POST_EVENT '001 - SPRAV CHANGED';
end
^

CREATE PROCEDURE SPRAV1_INS (
    NAIMEN VARCHAR( 30 ),
    COLICH INTEGER)
RETURNS (
    NEWIDN INTEGER)
AS
DECLARE VARIABLE VIDN INTEGER;
begin
 VIDN = gen_id(SPRAV1_GEN,  1 );
 INSERT INTO SPRAV1
  VALUES
  (
   :VIDN,
   :NAIMEN,
   :COLICH
  );
 NEWIDN = :VIDN;
 POST_EVENT '001 - SPRAV CHANGED';
end
^

CREATE PROCEDURE SPRAV1_UPD (
    IDN INTEGER,
    NAIMEN VARCHAR( 30 ),
    COLICH INTEGER)
AS
begin
 UPDATE SPRAV1
  SET
   NAIMEN = :NAIMEN,
   COLICH =:COLICH
  WHERE IDN = :IDN;
 POST_EVENT '001 - SPRAV CHANGED';
end
^

SET TERM ; ^

Клиентская программа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
program pSprav;
uses
  Forms,
  Sprav in 'Sprav.pas' {frmSprav},
  aisDM in 'aisDM.pas' {DM: TDataModule};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TfrmSprav, frmSprav);
  Application.Run;
end.


Модуль данных

Код: plaintext
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.
unit aisDM;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, IBCustomDataSet, IBQuery, IBDatabase, IBEvents, IBStoredProc;

type
  TDM = class(TDataModule)
    aisIB: TIBDatabase;
    aisTAr: TIBTransaction;  '// Читающая'
    aisTAw: TIBTransaction; '// Пишущая'
    aisEvents: TIBEvents;
    Sprav: TIBQuery;
    srcSprav: TDataSource;
    SpravIns: TIBStoredProc;
    SpravUpd: TIBStoredProc;
    SpravDel: TIBStoredProc;
    SpravIDN: TIntegerField;
    SpravNAIMEN: TIBStringField;
    SpravCOLICH: TIntegerField;
    procedure aisEventsEventAlert(Sender: TObject; EventName: String;
      EventCount: Integer; var CancelAlerts: Boolean);
    procedure aisIBAfterConnect(Sender: TObject);
    procedure aisIBBeforeDisconnect(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type Modes = (myBrowse, myDelete, myEdit, myInsert);

var
  DM: TDM;
  isEnableRefr: Boolean;

implementation

{$R *.DFM}

procedure TDM.aisIBAfterConnect(Sender: TObject);
begin
  with aisEvents do
  begin
    Events.Clear;
'// Задаешь интересующие тебя события'
    Events.Add('001 - SPRAV CHANGED');
    Registered := True;
  end;
end;

procedure TDM.aisIBBeforeDisconnect(Sender: TObject);
begin
  aisEvents.Registered := False;
end;

procedure TDM.aisEventsEventAlert(Sender: TObject; EventName: String;
  EventCount: Integer; var CancelAlerts: Boolean);
var
  actIndex, actIndexs: Integer;
  EventIndex: Integer;
begin
  EventIndex := StrToInt(copy(EventName,  0 ,  3 ));
  case EventIndex of
 1 :
    begin
'{
Вот тут как хочешь, так и крутишь :
 можешь бутоны на рефрешь энейблить,
 а можно проверить, готов ли данный экземпляр приложения к рефрешу
 и -
{}'
      if isEnableRefr then
       with Sprav do
        if Active then
      begin
        DisableControls;
        actIndex := SpravIDN.AsInteger;
        Prior;
        actIndexs := SpravIDN.AsInteger;
        Close;
        Open;
        if not Locate('IDN', actIndex, []) then
         Locate('IDN', actIndexs, []);
        EnableControls;
      end;
    end;
  end;
end;

end.


Ну и наконец форма
(Для редактирования принципиально не использую Data-aware components)

Код: plaintext
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.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
unit Sprav;

interface

uses
  aisDM,
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, DBCtrls, Buttons, Grids, DBGrids;

type
  TfrmSprav = class(TForm)
    Panel1: TPanel;
    sbtClose: TSpeedButton;
    panEdCtrl: TPanel;
    sbtCancel: TSpeedButton;
    sbtOK: TSpeedButton;
    Panel4: TPanel;
    Label999: TLabel;
    sbtNew: TSpeedButton;
    sbtEdit: TSpeedButton;
    sbtDelete: TSpeedButton;
    dbnFirms: TDBNavigator;
    dbgSprav: TDBGrid;
    sbtDisableRefresh: TSpeedButton;
    Panel2: TPanel;
    Label21: TLabel;
    panEditi: TPanel;
    edtNaimi: TEdit;
    edtColichi: TEdit;
    procedure sbtCloseClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure sbtNewClick(Sender: TObject);
    procedure sbtCancelClick(Sender: TObject);
    procedure sbtEditClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure dbgSpravDblClick(Sender: TObject);
    procedure sbtOKClick(Sender: TObject);
    procedure sbtDeleteClick(Sender: TObject);
    procedure edtNaimiEnter(Sender: TObject);
    procedure edtNaimiExit(Sender: TObject);
    procedure edtColichiKeyPress(Sender: TObject; var Key: Char);
    procedure sbtDisableRefreshClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmSprav: TfrmSprav;
  spMode: Modes;
  spIndex: Integer;

implementation

{$R *.DFM}

procedure TfrmSprav.sbtCloseClick(Sender: TObject);
begin
  Self.Close;
end;

procedure TfrmSprav.FormCreate(Sender: TObject);
var
  b: String;
begin
  Panel4.Align := alClient;
  spMode := myBrowse;
  isEnableRefr := True;
end;

procedure TfrmSprav.FormShow(Sender: TObject);
begin
  with dbgSprav do
  begin
    Align := alClient;
    SetFocus;
  end;
  with DM.Sprav do
  begin
    if Active then Close;
    Open;
  end;
end;

procedure TfrmSprav.sbtNewClick(Sender: TObject);
var
  i: Integer;
begin
'{
Из helpa по TIBEvents:
 Call CancelEvents to cancel interest in any pending InterBase events.
{}'
  DM.aisEvents.CancelEvents;
  spMode := myInsert;
  Panel1.Enabled := False;
  Panel4.Enabled := False;
  panEdCtrl.Show;
  spIndex := DM.SpravIDN.AsInteger;
  with panEditi do
  begin
    for i :=  0  to (ControlCount -  1 ) do
     if Controls[i] is TEdit then
      (Controls[i] as TEdit).Text := '';
    Show;
  end;
  edtNaimi.SetFocus;
end;

procedure TfrmSprav.sbtEditClick(Sender: TObject);
begin
  if DM.Sprav.IsEmpty then Exit;
'{
Из helpa по TIBEvents:
 Call CancelEvents to cancel interest in any pending InterBase events.
{}'
  DM.aisEvents.CancelEvents;
  spMode := myEdit;
  Panel1.Enabled := False;
  Panel4.Enabled := False;
  panEdCtrl.Show;
  spIndex := DM.SpravIDN.AsInteger;
  panEditi.Show;
  with DM do
  begin
    edtNaimi.Text := SpravNAIMEN.AsString;
    edtNaimi.SetFocus;
    edtColichi.Text := IntToStr(SpravCOLICH.AsInteger);
  end;
end;

procedure TfrmSprav.sbtDeleteClick(Sender: TObject);
begin
  if DM.Sprav.IsEmpty then
  begin
    MessageDlg('Таблица пуста.', mtInformation, [mbOK],  0 );
    Exit;
  end;
  if MessageDlg('Удалить текущую запись?', mtConfirmation, [mbYes, mbNo],  0 )
   = mrYes then
  begin
'{
Из helpa по TIBEvents:
 Call CancelEvents to cancel interest in any pending InterBase events.
{}'
    DM.aisEvents.CancelEvents;
    spMode := myDelete;
    with DM.SpravDel do
    try
      ParamByName('IDN').Value := DM.SpravIDN.AsInteger;
      DM.aisTAw.StartTransaction;
      ExecProc;
      DM.aisTAw.Commit;
    except
      DM.aisTAw.Rollback;
    end;
    with DM.Sprav do
    begin
      DisableControls;
      if RecNo >  1  then Prior;
      spIndex := DM.SpravIDN.AsInteger;
      DM.aisTAr.CommitRetaining;
      Close;
      Open;
      Locate('IDN', spIndex, []);
      EnableControls;
    end;
    spMode := myBrowse;
'{
Из helpa по TIBEvents:
Call QueueEvents to allow your application to
 start receiving event notifications.
{}'
    DM.aisEvents.QueueEvents;
  end;
end;

procedure TfrmSprav.sbtOKClick(Sender: TObject);
var
  i: Integer;
begin
  with DM do
   if spMode = myInsert then
    with SpravIns do
  begin
    ParamByName('NAIMEN').Value := Trim(edtNaimi.Text);
    ParamByName('COLICH').Value := StrToInt(Trim(edtColichi.Text));
    try
      aisTAw.StartTransaction;
      ExecProc;
      aisTAw.Commit;
      spIndex := ParamByName('NEWIDN').AsInteger;
    except
      aisTAw.Rollback;
    end;
  end
  else
   if spMode = myEdit then
    with DM.SpravUpd do
  begin
    ParamByName('IDN').Value := DM.SpravIDN.AsInteger;
    ParamByName('NAIMEN').Value := Trim(edtNaimi.Text);
    ParamByName('COLICH').Value := StrToInt(Trim(edtColichi.Text));
    try
      aisTAw.StartTransaction;
      ExecProc;
      aisTAw.Commit;
    except
      aisTAw.Rollback;
    end;
  end;
  sbtCancelClick(Sender);
end;

procedure TfrmSprav.sbtCancelClick(Sender: TObject);
begin
  Panel1.Enabled := True;
  Panel4.Enabled := True;
  if panEditi.Visible then panEditi.Hide;
  with dbgSprav do
  begin
    Options := Options + [dgAlwaysShowSelection];
    Align := alClient;
  end;
  panEdCtrl.Hide;
  with DM.Sprav do
  begin
    if not ControlsDisabled then DisableControls;
    DM.aisTAr.CommitRetaining;
    if Active then Close;
    Open;
    Locate('IDN', spIndex, []);
    EnableControls;
  end;
  spMode := myBrowse;
'{
Из helpa по TIBEvents:
Call QueueEvents to allow your application to
 start receiving event notifications.
{}'
  DM.aisEvents.QueueEvents;
  dbgSprav.SetFocus;
end;

procedure TfrmSprav.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
VK_INSERT:
    if spMode = myBrowse then sbtNewClick(Sender);
VK_RETURN:
    if spMode = myBrowse then sbtEditClick(Sender)
      else sbtOKClick(Sender);
VK_DELETE:
    if spMode = myBrowse then sbtDeleteClick(Sender);
VK_ESCAPE:
    if spMode <> myBrowse then sbtCancelClick(Sender);
  end;
end;

procedure TfrmSprav.dbgSpravDblClick(Sender: TObject);
begin
  sbtEditClick(Sender);
end;

procedure TfrmSprav.edtNaimiEnter(Sender: TObject);
begin
  if Sender.ClassNameIs('Tedit') then
   with (Sender as TEdit) do Color := $009FCDD0;
end;

procedure TfrmSprav.edtNaimiExit(Sender: TObject);
begin
  if Sender.ClassNameIs('Tedit') then
   with (Sender as TEdit) do Color := clWhite;
end;

procedure TfrmSprav.edtColichiKeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in [# 8 ,'0'..'9', '-']) then Key := # 0 ;
end;

procedure TfrmSprav.sbtDisableRefreshClick(Sender: TObject);
begin
  isEnableRefr := not sbtDisableRefresh.Down;
  if isEnableRefr then
   with DM.Sprav do
  begin
    if not ControlsDisabled then DisableControls;
    DM.aisTAr.CommitRetaining;
    if Active then Close;
    Open;
    Locate('IDN', spIndex, []);
    EnableControls;
  end;
end;

end.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32418789
kata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну и чем ты тут рисуешься?
Close-Open...
"я принципиально не пользуюсь дата-аваре компонентами" ...
Бр-р-р-р.
Весь вопрос был в том, как узнать идентификатор обновленной записи:
авторПожалуй пойду спрошу в конференции как на любое событие подписаться... Было бы замечательно если бы такая возможность была...а не как делать close-open
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32418797
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>actIndex := SpravIDN.AsInteger;
Prior;
actIndexs := SpravIDN.AsInteger;
Close;
Open;
if not Locate('IDN', actIndex, []) then Locate('IDN', actIndexs, []);


Из всего этого оставить только:
actIndex := SpravIDN.AsInteger;
Close;
Open;
Locate('IDN', actIndex, []);
потому как actIndexs может тоже уже не быть :-(

В Базе прописать процедуру для
POST_EVENT '001 - SPRAV CHANGED';
и вызывать ее(процедуру) из триггеров

Но в целом все это уже решено, у некоторых только в мозгах, и на практику по разным соображениям переносить нехочется ;-)
------------------------
С уважением, Denis Uskov
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32418813
sqliner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Denis Uskov
> Но в целом все это уже решено, у некоторых только в мозгах, и на практику по разным соображениям переносить нехочется ;-)

Да я на оригинальность и не претендовал.

Но было сказано:

Gold
>Раз нельзя по событиям обновлять данные, значит обновлять и не будем

mv
>А хорошо бы по эвентам дизейблить такие кнопки, а юзер на нах давил бы, и рефрешил датасеты... И чтобы дизэйблились они только тогода, когда другие (а не я) юзеры эвенты генерят...

Демо отвечает на оба поставленных вопроса (и не более).
А вот по поводу разных соображений было бы интересно узнать...
_____
C уважением, sqliner
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32418834
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>sqliner
>Да я на оригинальность и не претендовал.

Не хочу обидеть, но ожидалось что-то ... интереснее, в смысле идеи.

>А вот по поводу разных соображений было бы интересно узнать...
Соображения по чему? По коду есть некоторые дополнения и предложения, но ... а оно надо?
------------------------
С уважением, Denis Uskov
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32418870
sqliner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Denis Uskov

>Но в целом все это уже решено, у некоторых только в мозгах,
>и на практику по разным соображениям переносить нехочется ;-)
я вот об этих соображениях, и вовсе не в плане обид, а понять:
почему такое не стОит применять на практике.
_____
C уважением, sqliner
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32420236
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вопрос начался с генераторов :-)
Не говорю за всех, но я в большинстве случаев выбираю на клиента только 1(одну) запись, и сл-но изменения других меня не волнуют. Когда юзер захочет посмотреть другую запись, то она берется не из локального набора(locate), а с сервера. При работе Master-Detail ситуация немного меняется. Для обновления Detail стоит кнопка, и как юзер захочет пусть давит. Главное объяснить юзерам принцип работы, типа как интернет, пока обновить не нажмешь ... В целом Event'ы хорошая штука, но вот что-то не сложилось.
------------------------
С уважением, Denis Uskov
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32420786
kata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Denis Uskov
авторКогда юзер захочет посмотреть другую запись, то она берется не из локального набора(locate), а с сервера
Каким образом, если не секрет?
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32420893
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не пойму, вы поиск как делаете? Locate? А надо select ... from ... where ... и в этом случае выдается для просмотра набор записей (с разбивкой по порциям ~20). Нашел нужную запись и перезапрос на выборку именно этой одной записи для редактирования и т.д. Понимаю, что два раза гонять select не совсем то, но во-первых: почти всегда актуальная информация(если юзер не убежал пиво пить), во вторых: для первого select нет нужды выбирать все поля, только те, по которым юзер может уникально идетнифицировать запись, например для кадров ФИО+Подразделение+Таб№, а уже для редактирования всякие родственники, образования, специальности, перемещения и т.д.
------------------------
С уважением, Denis Uskov
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32420948
kata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наверно изначально мысль была
авторКогда юзер захочет отредактировать запись, то она берется не из локального набора(locate), а с сервера
?
Я редактирую в отдельной форме, там отдельный датасет.
А поиск визуально - в гриде.
...
Рейтинг: 0 / 0
Вопрос по генераторам
    #32421009
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и посмотреть тоже, не обязательно редактировать
Я же говорю: для 1 select'а достаточно <=5 полей, а для просмотра/редактирования может быть и 100
------------------------
С уважением, Denis Uskov
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по генераторам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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