sal
Гость
|
|
« : 27-12-2004 08:28 » |
|
Вопрос такой. Есть грид, из которого данные заносятся в Interbase. Есть поле времени, ну допустим запишем туда 13:00. Вопрос в следующем: как сделать подстановку, чтобы по умолчанию в этом столбце грида уже было допустим 00:00 и необходимо было ввести только 4 числа, знак разделения подставился бы автоматически.
|
|
|
Записан
|
|
|
|
baldr
|
|
« Ответ #1 : 27-12-2004 12:18 » |
|
Используй TMaskEdit. Или, еще лучше, TDateTimePicker с коротким форматом времени.
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
sal
Гость
|
|
« Ответ #2 : 28-12-2004 06:25 » |
|
Ок. Уже понял. Есть еще один вопрос. Как мне сделать так, чтобы при создании новой записи/строки в таблице (Interbase) её ID создавался автоматически. К примеру, последний номер будет 58, после чего мы создаем новую запись и ей присваивается номер 59. Насколько я понял есть 2 возможности реализации. Непосредственно в Interbase через генераторы и средствами Delphi. Что лучше и как это реализовать?
|
|
|
Записан
|
|
|
|
baldr
|
|
« Ответ #3 : 28-12-2004 08:07 » |
|
Сделай поле уникальным и автоинкрементным. Это оно и есть. Настраивается когда ты создаешь таблицу.
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
sal
Гость
|
|
« Ответ #4 : 28-12-2004 08:15 » |
|
все хорошо, только где? В Interbase или Delphi?
|
|
|
Записан
|
|
|
|
baldr
|
|
« Ответ #5 : 28-12-2004 09:07 » |
|
В Interbase, если таблицу создаешь там. (Бывает, но редко, что таблицу создают запросом. Тогда, естественно, при создании указывают в Делфе)
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Oldy
|
|
« Ответ #6 : 28-12-2004 19:14 » |
|
InterBase не поддерживает автоинкрементный тип поля. Используйте генератор+триггер "before insert" на соответствующее поле. Генератор лучше тем, что работает вне контекста транзакций. Средствами Делфи можно решать только в том случае, если у вас монопольный доступ к базе данных.
|
|
« Последнее редактирование: 28-12-2004 20:06 от Oldy »
|
Записан
|
С уважением, Oldy.
|
|
|
sal
Гость
|
|
« Ответ #7 : 29-12-2004 06:08 » |
|
Спасибо за ответ. Но не могли бы вы поподробнее описать процедуру создания связки генератор+триггер
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #8 : 29-12-2004 10:02 » |
|
CREATE TABLE MyTable ( ID integer NOT NULL PRIMARY KEY NAME varchar(20) );
CREATE GENERATOR Gen_MyTable_ID;
CREATE TRIGGER MyTable_ID FOR MyTable BEFORE INSERT POSITION 0 AS BEGIN NEW.ID = GEN_ID(GEN_MyTable_ID, 1) END;
|
|
« Последнее редактирование: 29-12-2004 10:09 от Oldy »
|
Записан
|
С уважением, Oldy.
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #9 : 29-12-2004 22:44 » |
|
только при такой реализации придётся жёстко завершать транзакцию с переоткрытием таблицы (CommitRetaining не поможет), иначе новые значения ID не будут видны.
|
|
|
Записан
|
|
|
|
sal
Гость
|
|
« Ответ #10 : 30-12-2004 07:44 » |
|
Мне удалось создать тригер и генератор и всё заработало, но на уровне базы. Но есть одна большая проблема. Delphi пишет, что ключевое поле должно быть обязательно заполнено. Это и логично, так как в самой базе напротив ключевого поля стоит, что это обязательное поле. Так фишка в том, что не получится создать КЛЮЧЕВОЕ ПОЛЕ и не сделать его не ОБЯЗАТЕЛЬНЫМ. Где же истина
|
|
|
Записан
|
|
|
|
sal
Гость
|
|
« Ответ #11 : 30-12-2004 07:45 » |
|
x77, так может ты предложишь свой вариант, как это лучше реализовать.
|
|
|
Записан
|
|
|
|
sal
Гость
|
|
« Ответ #12 : 30-12-2004 08:26 » |
|
Ведь посудите сами, это просто классика жанра!!! Должен же быть какой то классический вариант.
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #13 : 30-12-2004 11:37 » |
|
Простите, но мне кажется, что вы смешали два жанра. То есть пытаетесь работать с SQL сервером навигационыым способом. Делайте вставку в таблицу SQL - запросом (для ключевого поля - NULL), а не из грида и будет вам счастье. В гриде-же, весьма возможно, нужно написать какой нибудь обработчик на изменения соответствующего поля. И тоже можно ожидать счастья.
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #14 : 31-12-2004 09:01 » |
|
sal, найди в свойствах поля Required и поставь в FALSE. должо работать. кроме того, если ты работаешь через IBX, то там для поля можно указывать генератор. при вставке у тебя будет автоматически выполнен запрос вида insert into table1 (field1, field2) values (gen_id (указанный_генератор, 1), :field2). кстати, Oldy, любое действия над таблицей в дельфях всё равно выльется в выполнение того ли иного запроса жанр смешиваем не мы, а БагЛанд, которые глючные бдешные компоненты, со воими сраными буферами, сделал предками всех прочих компонент для работы с базами данных. в т.ч. и с теми, где эта буферизация сто лет не нужна. для работы с иб я всегда ползую TIbSql, который унаследован от TComponent а не от TDataSet. есс-но, от db-aware контролов пришлось отказаться. но выйгрыш по скорости просто фантастический, + не приходится возиться с глюками гридов и прочими прелестями.
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #15 : 31-12-2004 13:15 » |
|
х77, я полностью с тобой согласен. Наверное потому, что мне по долгу службы приходится работать с таблицами в десятки миллионов записей я не связываюсь ни с гридами и с компонентами-наследниками от TDataSet. Более того, постарался о них забыть. А вот на API ни как не перелезу, больно много переделывать
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
|