![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
И снова значения по умолчанию. [D7, IB6.x]
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]> > иногда данные на вставку идут вообще без значений
ну так, вот на случай этого "иногда" и сделай и там и там (клиенте и сервере) > определение дефаултных значений. не промажеш.
И каждый раз всем клиентам менять дефаулт?
> > При добавлении записи сразу это значение появляется, как то же они это сделали
> перечитали запись/рекордсет после вставки.
В том то и дело что до вставки.
Так что в итоге то? Так ни к чему и не пришли?