Форум: "Базы";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
ВнизИ снова значения по умолчанию. Найти похожие ветки
← →
SHD © (2006-05-10 16:14) [0]Значит есть у поля стоит галочка not null и задано значение по умолчанию на сервере.
Если я вызываю метод insert, то дельфя не запрашивает это поле с сервера а оставляет его пустым.
И самое интересное если я его не трогаю (оставляю пустым) и вызываю метод post, то выдаётся ошибка типа null незя.
Вопрос: а как при вызове метода insert запросить данный с сервера которые заданы по умолчанию?
← →
Ega23 © (2006-05-10 16:21) [1]"метод insert" - это метод чего?
← →
SHD © (2006-05-10 16:22) [2]dataset`а
← →
Desdechado © (2006-05-10 16:29) [3]зависит от компонентов, но в общем случае никак
а ругаться будет, т.к. в датасете и в полях на клиенте не прописаны эти самые умолчания
← →
sniknik © (2006-05-10 16:30) [4]чтобы запросить значения с сервера их надо перечитать... рекордсет, или запись это уж как метод доступа позволит. само собой оно значения на клиенте не появятся.
и судя по [0], тебе не нужны значения по умолчанию на сервере, нужны "подстановочные" значения на клиенте (DefaultExpression у поля).
← →
Виталий Панасенко (2006-05-10 16:44) [5]FIBPlus это делает эелементарно для программера. Установкой одной опции у TpFIBDataSetа...Купить только нужно. Причем, не дорого для бывшего Союза...
← →
SHD © (2006-05-10 16:51) [6]Согласен в основном они нужны на клиенте, но удобнее если они будут храниться на сервере. Кстати с клиента иногда данные на вставку идут вообще без значений (даже без упоминания) этих полей... типа сервер сам должен подставить.
Так как если у поля задано
Field1 FLOAT DEFAULT 100 NOT NULL
видеть до вставки это значение?
P/S/ В менеджере SQL Manager 2005 for InterBase and Firebird и в EMS InterBase/FireBird Manager 3. При добавлении записи сразу это значение появляется, как то же они это сделали
← →
SHD © (2006-05-10 16:52) [7]>> да вот ни разу не пробывал эту тему ;( Видимо придётся.
А без этого никак?
← →
Sergey13 © (2006-05-10 16:54) [8]2[6] SHD © (10.05.06 16:51)
>Согласен в основном они нужны на клиенте, но удобнее если они будут храниться на сервере.
Одно другому не противоречит.
> При добавлении записи сразу это значение появляется, как то же они это сделали
Перечитали запись. Или предварительно прочитали системные таблицы.
← →
sniknik © (2006-05-10 16:57) [9]> Купить только нужно.
ага, купи себе фенечку которая в принципе тебе и не нужна совсем... а после будеш других "раскручивать" на аналогичную покупку, чтоб не чуствовать себя единственным "кинутым". ;о))
p.s. в ADO это тоже есть, бесплатно. ну и что?
> иногда данные на вставку идут вообще без значений
ну так, вот на случай этого "иногда" и сделай и там и там (клиенте и сервере) определение дефаултных значений. не промажеш.
> Так как если у поля задано
> Field1 FLOAT DEFAULT 100 NOT NULL
> видеть до вставки это значение?
никак, до вставки там ничего нет.
> При добавлении записи сразу это значение появляется, как то же они это сделали
перечитали запись/рекордсет после вставки.
← →
Johnmen © (2006-05-10 17:01) [10]
> sniknik © (10.05.06 16:57) [9]
Вообще-то, они до вставки определяют, выполняя запрос к соотв.системной таблице...
← →
Anatoly Podgoretsky © (2006-05-10 17:04) [11]SHD © (10.05.06 16:51) [6]
До вставки видеть не возможно, его пока еще нет, вот запишешь тогда и смотри.
← →
sniknik © (2006-05-10 17:21) [12]> Вообще-то, они до вставки определяют, выполняя запрос к соотв.системной таблице...
даже если и так, в записи то значений все одно нет, а то что определили то пойдет в разряд "подстановочных" на клиенте (и неважно откуда их взяли).
← →
Johnmen © (2006-05-10 17:25) [13]
> sniknik © (10.05.06 17:21) [12]
Само собой подставляются. Неявно. У программера иллюзия, что всё как бы автоматом...:)
← →
Виталий Панасенко (2006-05-10 17:25) [14]
> sniknik © (10.05.06 16:57) [9]
> > Купить только нужно.
> ага, купи себе фенечку которая в принципе тебе и не нужна
> совсем... а после будеш других "раскручивать" на аналогичную
> покупку, чтоб не чуствовать себя единственным "кинутым".
> ;о))
Мы об это м уже спорили. Тогда я сказал, что в Devrace все тупицы и извращенцы. По вашим словам...с msGunsом..:-)). Зачем-то люди это делали? Значит, это кому-то нужно. в FIBPLus можно даже определить RecordCount. без выборки всего НД. это можно использовать для "зебры" в DBGridEh например.. Скажете, что на.. эта зебра нужна ? Удобно смотреть.
Скажете, зачем сетку использовать ? но ее очень многие используют
← →
SHD © (2006-05-10 17:26) [15]> > иногда данные на вставку идут вообще без значений
ну так, вот на случай этого "иногда" и сделай и там и там (клиенте и сервере) > определение дефаултных значений. не промажеш.
И каждый раз всем клиентам менять дефаулт?
> > При добавлении записи сразу это значение появляется, как то же они это сделали
> перечитали запись/рекордсет после вставки.
В том то и дело что до вставки.
Так что в итоге то? Так ни к чему и не пришли?
← →
sniknik © (2006-05-10 17:38) [16]Виталий Панасенко (10.05.06 17:25) [14]
> Зачем-то люди это делали?
деньгу надеялись на этом "сшибить"? не прав?
SHD © (10.05.06 17:26) [15]
> И каждый раз всем клиентам менять дефаулт?
зачем? ты вообще читаеш о чем говорят?
явно же указали, что есть возможность прочитать значения назначенные дефаултными с сервера, с системных таблиц. (я про это не в курсе, не спец по IB)
читай также, и назначай в подстановочные на клиенте соответственные значения.
> Так что в итоге то? Так ни к чему и не пришли?
почему не пришли, пришли. пришли к выводу - "зря в ветку влез" ;) читал же предыдущую, предполагал, что будет... имхо.
← →
SHD © (2006-05-10 17:42) [17]Вот пытаюсь сейчас с системных взять значения
← →
SHD © (2006-05-10 17:51) [18]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
И что делать?
← →
kaif © (2006-05-10 20:24) [19]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 равным нулю. Это упрощает жизнь в некоторых случаях.
Но я не стал бы таким жеским образом прописывать начальные значения для бизнес-логики.
Такие значения я обычно либо держу на клиенте, либо прописываю в триггерах (что-то вроде того, что я показал).
С уважением.
← →
kaif © (2006-05-10 20:26) [20]Описка:
Поле F2 not null и имеет default значение.
← →
Виталий Панасенко (2006-05-11 08:43) [21]
> sniknik © (10.05.06 17:38) [16]
> Виталий Панасенко (10.05.06 17:25) [14]
> > Зачем-то люди это делали?
> деньгу надеялись на этом "сшибить"? не прав?
Если 15 баксов считать деньгой. точнее, 75 грн.:-)
← →
sniknik © (2006-05-11 08:56) [22]лучше по 15 баксов с милиона человек, чем милион с одного...
или они лично тебе на заказ за 15$ написали, исходники отдали и клятвенно обещали нигде больше не использовать, и никому не продавать? (т.е. удовлетворились только твоими 15-ю долларами)
ой сомневаюсь... ;о))
p.s. 15$ с милиона копий, это очень хорошая деньга.
← →
SHD © (2006-05-11 09:29) [23]> kaif © (10.05.06 20:24) [19]
Огромной спасибо за такой исчерпывающий ответ. К тебе 3 вопроса.
1) Ты всё же не написал как при вызове метода insert в dataset сразу писать эти значения по умолчанию (ведь пользователь наверное желает их видеть и если нужно то изменить). Запрашивать их с БД... Ой как нехорошо куча лишнего кода и компонентов появляется.
2) >Нверно я бы завел некоторую таблицу, в которой хранил бы все значения по умолчанию для разных случаев
Чем хуже вариант работать с системной таблицой и эти значения брать оттуда
3) Как на счёт использование компонентов FIBPlus.
← →
Anatoly Podgoretsky © (2006-05-11 09:55) [24]SHD © (11.05.06 09:29) [23]
Жалко, что другим отвечать запрещено.
← →
SHD © (2006-05-11 11:19) [25]Я не запрещал вообще то, просто тут развели непонятно барахолку какую то, а если по делу, то форум для этого то и создан.
Так что пиши, буду только рад.
← →
Sergey13 © (2006-05-11 11:28) [26]2 [25] SHD © (11.05.06 11:19)
ИМХО, барахолку развел ты сам, не желая писать код и ища некие волшебные методы для автоматизма. Все наводки тебе уже давали и не раз.
← →
Виталий Панасенко (2006-05-11 11:37) [27]
> sniknik © (11.05.06 08:56) [22]
> лучше по 15 баксов с милиона человек, чем милион с одного.
> ..
>
> или они лично тебе на заказ за 15$ написали, исходники отдали
> и клятвенно обещали нигде больше не использовать, и никому
> не продавать? (т.е. удовлетворились только твоими 15-ю долларами)
> ой сомневаюсь... ;о))
>
> p.s. 15$ с милиона копий, это очень хорошая деньга.
Странно, но такое еще есть в IBObjects от J.Warton...А FIBPlus признаны во всем мире одним (если НЕ) лучших комопнент доступа. Не для конкретной СУБД, а как продукт. Да и вообще, мне это нужно - я ж не виноват, что тебе это НЕ нужно..:-)). Не хочешь - не пользуйся.
← →
kaif © (2006-05-11 14:05) [28]2 SHD © (11.05.06 09:29) [23]
1) Ты всё же не написал как при вызове метода insert в dataset сразу писать эти значения по умолчанию (ведь пользователь наверное желает их видеть и если нужно то изменить). Запрашивать их с БД... Ой как нехорошо куча лишнего кода и компонентов появляется.
Я бы запросил все такие значения при первом коннекте к базе и дальше держал бы их в некотором массиве или ассоциированном списке. А в событие AfterInsert датасета прописал бы присвоения вроде:
DataSet.FieldByName(<поле>).AsInteger := <значение>
2) >Нверно я бы завел некоторую таблицу, в которой хранил бы все значения по умолчанию для разных случаев
Чем хуже вариант работать с системной таблицой и эти значения брать оттуда
Такое решение я нахожу ничем не хуже и вполне элегантным (брать из одного места - системной таблицы). Единственное, я не помню, но по-моему команда ALTER COLUMN не позволяет изменять значение DEFAULT. Хотя если ты готов непосредственно работать с системной таблицей, то ты можешь редактировать это значение прямо в ней, если вдруг понадобится его изменить. Я обычно избегаю модифицировать системные таблицы (прямо или косвенно) в транзакциях юзеров, даже привилегированных. Хотя ясного представления, почему избегаю, у меня нет. Просто избегаю и все тут. :)
3) Как на счёт использование компонентов FIBPlus.
Я не работал с ними - не знаю. Знаю, что у них много стороннников. Возможно тебе стоит их изучить в любом случае.
← →
SHD © (2006-05-11 14:38) [29]В общем всё более менее понятно.
Если кому интересно как я решил это табличкой значение по умолчанию вот коды:
Таблица значений по умолчанию
/* Таблица: 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 его писал уже.
← →
Sergey13 © (2006-05-11 14:46) [30]2[29] SHD © (11.05.06 14:38)
>Если кто хочет может ещё и тригер дописать что бы сервак тоже самое делал, но вроде kaif его писал уже.
Ты предлагаешь заменить механизм сервера своим? А смысл? Он и так то-же самое делает наверняка.
← →
SHD © (2006-05-11 14:50) [31]>>Sergey13 © (11.05.06 14:46) [30]
Какой механизм????
Я предложил что бы сервер, если получит значение NULL, или вообще ничего не получит сам с этой таблички подставил.
Я то написал только то что на стороне клиента происходит, а их может быть много и они могут быть разные. ;)
Невнимателен ты ;)
← →
Sergey13 © (2006-05-11 14:52) [32]2[31] SHD © (11.05.06 14:50)
> сам с этой таблички подставил.
А чем плохо, что он со своей подставляет?
← →
SHD © (2006-05-12 09:25) [33]> Sergey13 © (11.05.06 14:52) [32]
SHD © (11.05.06 14:50) [31]
Невнимателен ты ;)
← →
Sergey13 © (2006-05-12 09:49) [34]2[33] SHD © (12.05.06 09:25)
ИМХО, ты изобретаешь велосипед. Флаг в руки.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.009 c