• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Работа с DBGrid

  • Автор темы Artexoid
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Artexoid

Подскажите пожалуйста вот картинка:



Как сделать так чтобы при нажатии кнопки Button1 в поле Ключ в последней строке значение изменилось на 5?
 
B

Barmutik

То которое 4 изменилось на 5 ? Я правильно понял?

Код:
 TableName.Last;
TableName.Edit;
TableName.FieldByName('FieldName').AsInteger := 5;
TableName.Post;

где TableName - имф твоеё компоненты Table, которая предоставляет данные
FieldName - название поля которое скрывается за названием столбца Ключ

И не факт что получится .. есть поля значения которых нельзя изменять вручную .. например AutoIncrement Field
 
A

Artexoid

Barmutik
Во спасибо, нужная вещ!
А можно сделать что-то вроде счетчика ? тоесть при создании следущей запии в поле ключ автоматически заноситься целочисленное значение, а остальные поля я редактирую ??
 
B

Barmutik

Да ... многие так делают .. когда создаёш таблицу то указываеш e ключевого поля что оно является AutoIncrement

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

Artexoid

Barmutik
Я так понял - AutoIncrement надо в InterBase ставить при создании таблицы, но как его ставить и куда не понял :huh: !! Я тыкал его, тыкал а он пишет ошиьку и все :D :D :p . Напиши примерчик маленький маленький пожалуйста!!
 
B

Barmutik

У меня под рукой Interbase нет ... я им давно не польуюсь .. но насколько я знаю .. установить такой атирибут поля можно только при создании или при полностью пустой таблице...
 
M

Maniacosaur

Можно и не при пустой. Главное, чтобы в этом поле не было одинаковых значений. IB к сожалению тоже нет под рукой.
 
A

Artexoid

Maniacosaur
Barmutik

Ну вспомните, пожалуйста очень нужно!!! Ну хоть примерный код.
Ну:
Код:
CREATE TABLE TABLE1
(
POLE_KEY NOT NULL,
POLE_NAME VARCHAR(20),
POLE_FAM VARCHAR(20),
PRIMARY KEY(POLE_KEY)
)
Куда сдесь AutoIncrement нужно дописать ?? Ну хоть примерно ????????
 
?

????

Artexoid
Поддерживает-ли IB поля типа autoincrement?

В явном виде нет - вместо этого в IB существует другой механизм, называемый "генераторами". Генератор - некая переменная, значение которой может быть получено и увеличено на некоторое значение (дельту) при помощи встроенной функции GEN_ID. Создать генератор можно фразой:

CREATE GENERATOR MYGENERATOR;

Обычно генераторы используют в триггерах, при этом текст триггера может быть следующим:

Код:
CREATE TRIGGER TI_CLIENTS FOR CLIENTS
ACTIVE BEFORE INSERT POSITION 0
AS
 BEGIN
   IF (new.CLIENT_ID IS NULL) THEN
     CLIENT_ID = GEN_ID(MYGENERATOR, 1);
 END

Вместо значения "1" может быть использовано любое число, на которое нужно иметь приращение текущего значения генератора.

Также новое значение генератора можно получить запросом
SELECT GEN_ID(mygen, 1) from RDB$DATABASE

Механизм генераторов гарантирует что даже при конкурентном (параллельном) вызове функции GEN_ID каждому пользователю будет выдаваться уникальное значение. Последнее значение генератора всегда запоминается в БД, поэтому разработчику не нужно заботиться о "восстановлении" его максимального значения после подсоединения к БД.

Генераторы являются переменными типа integer (longint), таким образом если предположить что новое значение возвращается в среднем с интервалом в 3 секунды, значений генератора хватит приблизительно на 270 лет.

примечание: если вы воспользуетесь приведенным выше примером использования генератора в триггере, то у вас может возникнуть следующая проблема - при добавлении записей с клиентского места новые записи будут "пропадать", или будет появляться сообщение BDE "Record/Key deleted". Это связано с тем, что клиенту никаким образом не может быть передана информация об идентификаторе сформированом в триггере на сервере.

Т.е. новую запись можно будет увидеть только либо перевыполнив запрос либо переместившись в конец таблицы (если еще не произошел fetch всех записей. Для исключения такой ситуации можно создать хранимую процедуру возвращающую значение генератора (так-же как и для триггера), и вызывать эту процедуру _перед_ созданием новой записи (для Delphi - TTable.BeforePost). Вместо процедуры можно использовать приведенный выше запрос select gen_id(mygen, 1) from rdb$database.
 
B

Barmutik

Точно! Я и забыл что в Interbase всё так :huh:
 
A

Artexoid

????
Ух ты ))! Надо это попробывать! Щас я в Колелд поеду, приеду обязательно попробую спасибо!!! Надеюсь что работать будет :huh: .
 
A

Artexoid

????
Ух ты ))! Надо это попробывать! Щас я в Колелд поеду, приеду обязательно попробую спасибо!!! Надеюсь что работать будет :huh: .
 
A

Artexoid

????
Вот я попробывал этот код:
Код:
CREATE TABLE TABLE1
(
TAB_KEY INTEGER NOT NULL,
TAB_NAME VARCHAR(20),
PRIMARY KEY(TAB_KEY)
);

CREATE GENERATOR GEN_KEY;

CREATE TRIGGER TI_TABLE FOR TABLE1
ACTIVE BEFORE INSERT POSITION 0
AS 
  BEGIN
    IF (new.TAB_KEY IS NULL) THEN
       TAB_KEY = GEN_ID(GEN_KEY, 1);
  END

Ну я создал таблицу, создал генератор, попытался создать тригер, а он пишет при запуске вот такую ошибку:
_____________________
Dynamic SQL Error
-SQL error code = -206
-Column unknown_______

Что я нетак написал?? Исправь меня!
Спасибо.
 
?

????

Artexoid
Вроде в статейке глюк - должно быть new.TAB_KEY = GEN_ID(GEN_KEY, 1);
З.Ы. Можешь ещё заглянуть .
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!