Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

И снова значения по умолчанию. [D7, IB6.x]


Страницы:   1 2

SHD ©   (2006-05-10 16:14:00) 

Значит есть у поля стоит галочка not null и задано значение по умолчанию на сервере.
Если я вызываю метод insert, то дельфя не запрашивает это поле с сервера а оставляет его пустым.
И самое интересное если я его не трогаю (оставляю пустым) и вызываю метод post, то выдаётся ошибка типа null незя.

Вопрос: а как при вызове метода insert запросить данный с сервера которые заданы по умолчанию?


Sergey13   (2006-05-12 09:49:00) [1]

2[33] SHD ©   (12.05.06 09:25)
ИМХО, ты изобретаешь велосипед. Флаг в руки.


SHD   (2006-05-12 09:25:00) [2]

> Sergey13 ©   (11.05.06 14:52) [32]

SHD ©   (11.05.06 14:50) [31]
Невнимателен ты ;)


Sergey13   (2006-05-11 14:52:00) [3]

2[31] SHD ©   (11.05.06 14:50)
> сам с этойтаблички подставил.

А чем плохо, что он со своейподставляет?


SHD   (2006-05-11 14:50:00) [4]

>>Sergey13 ©   (11.05.06 14:46) [30]

Какой механизм????
Я предложил что бы сервер, если получит значение NULL, или вообще ничего не получит сам с этой таблички подставил.
Я то написал только то что на стороне клиента происходит, а их может быть много и они могут быть разные. ;)

Невнимателен ты ;)


Sergey13   (2006-05-11 14:46:00) [5]

2[29] SHD ©   (11.05.06 14:38)
>Если кто хочет может ещё и тригер дописать что бы сервак тоже самое делал, но вроде kaif его писал уже.
Ты предлагаешь заменить механизм сервера своим? А смысл? Он и так то-же самое делает наверняка.


SHD   (2006-05-11 14:38:00) [6]

В общем всё более менее понятно.
Если кому интересно как я решил это табличкой значение по умолчанию вот коды:

Таблица значений по умолчанию
/* Таблица: MY_DEF_VALUE */
CREATE TABLE MY_DEF_VALUE (
   TABLE_NAME DM_META_NAME NOT NULL COLLATE WIN1251,
   FIELD_NAME DM_META_NAME NOT NULL COLLATE WIN1251,
   DEFAULT_VALUE VARCHAR (50) CHARACTER SET WIN1251 COLLATE WIN1251);
/* Primary keys definition */
ALTER TABLE MY_DEF_VALUE ADD CONSTRAINT PK_MY_DEF_VALUE PRIMARY KEY (TABLE_NAME, FIELD_NAME);

в проге есть компонент, который связывается с таблицей MY_DEF_VALUE
TB_MyDefValues: TIBTable;

При активации проги
procedure TFR_Main.FormActivate(Sender: TObject);
begin
 FR_DM.TB_MyDefValues.Open;
end;

Функция для внесения данных
procedure SetDefaultValiues(DT: TIBDataSet; TableName: string);
var
 i                 : integer;
begin
 for i := 0 to DT.FieldCount - 1 do begin
   if FR_Dm.TB_MyDefValues.Locate(
     'TABLE_NAME;FIELD_NAME',
     VarArrayOf([TableName, DT.Fields.Fields[i].FieldName]),
     []) then begin
     DT.Fields.Fields[i].Value := FR_DM.TB_MyDefValues.FieldValues['DEFAULT_VALUE'];
   end;
 end;
end;

И собственно сам вызов функции
procedure TFR_DM.DT_PolesNewRecord(DataSet: TDataSet);
begin
 SetDefaultValiues(DT_POLES, 'POLES');
end;

Если кто хочет может ещё и тригер дописать что бы сервак тоже самое делал, но вроде kaif его писал уже.


kaif   (2006-05-11 14:05:00) [7]

2 SHD ©   (11.05.06 09:29) [23]
1)  Ты всё же не написал как при вызове метода insert в dataset сразу писать эти значения по умолчанию (ведь пользователь наверное желает их видеть и если нужно то изменить). Запрашивать их с БД... Ой как нехорошо куча лишнего кода и компонентов появляется.


Я бы запросил все такие значения при первом коннекте к базе и дальше держал бы их в некотором массиве или ассоциированном списке. А в событие AfterInsert датасета прописал бы присвоения вроде:

  DataSet.FieldByName(<поле>).AsInteger := <значение>

2) >Нверно я бы завел некоторую таблицу, в которой хранил бы все значения по умолчанию для разных случаев
Чем хуже вариант работать с системной таблицой и эти значения брать оттуда


Такое решение я нахожу ничем не хуже и вполне элегантным (брать из одного места - системной таблицы). Единственное, я не помню, но по-моему команда ALTER COLUMN не позволяет изменять значение DEFAULT. Хотя если ты готов непосредственно работать с системной таблицей, то ты можешь редактировать это значение прямо в ней, если вдруг понадобится его изменить. Я обычно избегаю модифицировать системные таблицы (прямо или косвенно) в транзакциях юзеров, даже привилегированных. Хотя ясного представления, почему избегаю, у меня нет. Просто избегаю и все тут. :)

3) Как на счёт использование компонентов FIBPlus.
Я не работал с ними - не знаю. Знаю, что у них много стороннников. Возможно тебе стоит их изучить в любом случае.


Виталий Панасенко   (2006-05-11 11:37:00) [8]


> sniknik ©   (11.05.06 08:56) [22]
> лучше по 15 баксов с милиона человек, чем милион с одного.
> ..
>
> или они лично тебе на заказ за 15$ написали, исходники отдали
> и клятвенно обещали нигде больше не использовать, и никому
> не продавать? (т.е. удовлетворились только твоими 15-ю долларами)
> ой сомневаюсь... ;о))
>
> p.s. 15$ с милиона копий, это очень хорошая деньга.

Странно, но такое еще есть в IBObjects от J.Warton...А FIBPlus признаны во всем мире одним (если НЕ) лучших комопнент доступа. Не для конкретной СУБД, а как продукт. Да и вообще, мне это нужно - я ж не виноват, что тебе это НЕ нужно..:-)). Не хочешь - не пользуйся.


Sergey13   (2006-05-11 11:28:00) [9]

2 [25] SHD ©   (11.05.06 11:19)
ИМХО, барахолку развел ты сам, не желая писать код и ища некие волшебные методы для автоматизма. Все наводки тебе уже давали и не раз.


SHD   (2006-05-11 11:19:00) [10]

Я не запрещал вообще то, просто тут развели непонятно барахолку какую то, а если по делу, то форум для этого то и создан.
Так что пиши, буду только рад.


Anatoly Podgoretsky   (2006-05-11 09:55:00) [11]

SHD ©   (11.05.06 09:29) [23]
Жалко, что другим отвечать запрещено.


SHD   (2006-05-11 09:29:00) [12]

> kaif ©   (10.05.06 20:24) [19]
Огромной спасибо за такой исчерпывающий ответ. К тебе 3 вопроса.

1)  Ты всё же не написал как при вызове метода insert в dataset сразу писать эти значения по умолчанию (ведь пользователь наверное желает их видеть и если нужно то изменить). Запрашивать их с БД... Ой как нехорошо куча лишнего кода и компонентов появляется.

2) >Нверно я бы завел некоторую таблицу, в которой хранил бы все значения по умолчанию для разных случаев
Чем хуже вариант работать с системной таблицой и эти значения брать оттуда

3) Как на счёт использование компонентов FIBPlus.


sniknik   (2006-05-11 08:56:00) [13]

лучше по 15 баксов с милиона человек, чем милион с одного...

или они лично тебе на заказ за 15$ написали, исходники отдали и клятвенно обещали нигде больше не использовать, и никому не продавать? (т.е. удовлетворились только твоими 15-ю долларами)
ой сомневаюсь... ;о))

p.s. 15$ с милиона копий, это очень хорошая деньга.


Виталий Панасенко   (2006-05-11 08:43:00) [14]


> sniknik ©   (10.05.06 17:38) [16]
> Виталий Панасенко   (10.05.06 17:25) [14]
> > Зачем-то люди это делали?
> деньгу надеялись на этом "сшибить"? не прав?

Если 15 баксов считать деньгой. точнее, 75 грн.:-)


kaif   (2006-05-10 20:26:00) [15]

Описка:
Поле F 2not null и имеет default значение.


kaif   (2006-05-10 20:24:00) [16]

SHD ©   (10.05.06 16:14)  
И самое интересное если я его не трогаю (оставляю пустым) и вызываю метод post, то выдаётся ошибка типа null незя.


Так не должно быть.
Если так происходит, это означает, что метод post вызывает неверный текст SQL-запроса.
Поясню.
Допустим, есть таблица T, в которой имеются два поля: F1 и F2.
Поле F1 not null и имеет default значение.
Команда
 INSERT INTO T(F1,F2) VALUES (:F1,:F2)
вызовет именно ту ошибку, о которой ты говоришь. Так как в параметр F2 будет передано значение null и сервер будет ругаться.

А вот команда
 INSERT INTO T(F1) VALUES (:F1)
не вызовет такой ошибки, сервер сам подставит в поле F2 значение по умоланию.

Однако... напрашивается нескромный вопрос
А что делать, если мне нужно иногда вставить введенное пользователем значение, а если тот не ввел, то только тогда использовать значение по умолчанию?
Согласитесь, что это и есть та ситуация, о которой спрашивает автор вопроса.
Ответ один - использовать такое присвоение в триггере BEFORE INSERT.
Что вроде этого:
 IF (NEW.F2 IS NULL) THEN
    F2 = <значение по умолчанию>;

Нверно я бы завел некоторую таблицу, в которой хранил бы все значения по умолчанию для разных случаев, а в триггерах прописал бы SQL-запрос к этой таблице. Что-то вроде:
 IF (NEW.F2 IS NULL) THEN
    F2 = SELECT DEF_VALUE FROM MY_DEF_VALUES
           WHERE TABLE_NAME = 'T' AND FIELD_NAME = F2;

Но зачем тогда вообще DEFAULT в определениях полей?
Я лично отношусь к этому следующим образом: DEFAULT в определении полей существует не для организации бизнес-логики, а исключительно для технических целей. Например, я иногда делаю для всех INTEGER NOT NULL полей DEFAULT равным нулю. Это упрощает жизнь в некоторых случаях.
Но я не стал бы таким жеским образом прописывать начальные значения для бизнес-логики.
 
Такие значения я обычно либо держу на клиенте, либо прописываю в триггерах (что-то вроде того, что я показал).

С уважением.


SHD   (2006-05-10 17:51:00) [17]

IBTable1 связана с RDB$fields

 IBTable1.Open;
 IBTable1.Locate('RDB$FIELD_NAME', 'RDB$145', []);

 DT_Poles.FieldByName('U').AsInteger :=
   IBTable1.FieldByName('RDB$DEFAULT_VALUE').AsInteger;

Ошибка поля не соответствуют. Ну ес-но 'RDB$DEFAULT_VALUE' типа BLOB
И что делать?


SHD   (2006-05-10 17:42:00) [18]

Вот пытаюсь сейчас с системных взять значения


sniknik   (2006-05-10 17:38:00) [19]

Виталий Панасенко   (10.05.06 17:25) [14]
> Зачем-то люди это делали?
деньгу надеялись на этом "сшибить"? не прав?

SHD ©   (10.05.06 17:26) [15]
> И каждый раз всем клиентам менять дефаулт?
зачем? ты вообще читаеш о чем говорят?

явно же указали, что есть возможность прочитать значения назначенные дефаултными с сервера, с системных таблиц. (я про это не в курсе, не спец по IB)
читай также, и назначай в подстановочные на клиенте соответственные значения.

> Так что в итоге то? Так ни к чему и не пришли?
почему не пришли, пришли. пришли к выводу - "зря в ветку влез" ;) читал же предыдущую, предполагал, что будет... имхо.


SHD   (2006-05-10 17:26:00) [20]

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

> > При добавлении записи сразу это значение появляется, как то же они это сделали
> перечитали запись/рекордсет после вставки.
В том то и дело что до вставки.

Так что в итоге то? Так ни к чему и не пришли?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо