Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.09;
Скачать: CL | DM;

Вниз

И снова значения по умолчанию.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.04 c
2-1150877067
XTD
2006-06-21 12:04
2006.07.09
Управление приложениями с помощью DELPHI


2-1151031762
nickhilo
2006-06-23 07:02
2006.07.09
Компонент RichEdit с полноценной поддержкой формата RTF.


6-1141464906
MegaWolf510
2006-03-04 12:35
2006.07.09
Проблема с отправкой смс сообщений через com. Помогите, плиз...


15-1150179797
vidiv
2006-06-13 10:23
2006.07.09
настройка количества пропускаемых звонков RAS


2-1150475321
fast2
2006-06-16 20:28
2006.07.09
Подскажите, как "разложить" строку на части.