Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.56 MB
Время: 0.018 c
1-1147960648
MegaVolt
2006-05-18 17:57
2006.07.09
При разворачивании формы на весь экран ищезает прогрессбар из...


2-1150898583
vacek
2006-06-21 18:03
2006.07.09
С помощью чего можно получить доступ к не списку компонента com


1-1148647466
001
2006-05-26 16:44
2006.07.09
Копирование из Excel


4-1143884265
Malik
2006-04-01 13:37
2006.07.09
Прописание программы в автозагрузку после первого включения


3-1147340919
gaga
2006-05-11 13:48
2006.07.09
Связь таблиц если в подчиненной таблице 2 втор. ключа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский