![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DataSet.Fields.Fields[i].Required [D7, MSSQL]
jonny210 © (2005-06-30 21:24:00)Помогите плз. Нужно при добавлении/обновлении записи узнать все ли required поля заполнены.
DataSet.Fields.Fields[i].Required всегда false. Что я делаю не так???
evvcom (2005-07-01 13:13:00) [1]
> В таком случае смысл Cached Updates как бы исчезает.
Согласен. Но без Cached Updates в давние времена я так и не смог заставить работать TStoredProc с TUpdateSQL. Недавно этот вопрос поднимался, в обсуждении участвовал кто-то из мастеров, уже не помню, кто именно, и я еще раз убедился, что без Cached Updates эта связка работать не будет.
jonny210 (2005-07-01 12:41:00) [2]Спасибо Slym ©!!! Его код работает 100%
Anatoly Podgoretsky (2005-07-01 11:31:00) [3]evvcom © (01.07.05 10:55) [7]
В таком случае смысл Cached Updates как бы исчезает.
Desdechado (2005-07-01 11:04:00) [4]автор так и не понял, что надо указать компоненты доступа, несмотря на мою недвусмысленную подсказку
Ega23 (2005-07-01 10:57:00) [5]С умом надо использовать абсолютно ВСЁ.
"Иначе всё у нас пойдёт через ж..." (с) ДМБ
evvcom (2005-07-01 10:55:00) [6]
> Вот ещё одно косвенное подтверждение вредности всяческих
> ApplyUpdates
Эти ApplyUpdates тоже с умом надо использовать. Если делается пользовательский ввод, то есть смысл ApplyUpdates делать сразу при посте.
Ega23 (2005-07-01 10:48:00) [7]Вот ещё одно косвенное подтверждение вредности всяческих ApplyUpdates
evvcom (2005-07-01 10:24:00) [8]
> Slym © (01.07.05 08:52) [4]
См. [3]. Это будет работать только с таблицами, причем я не проверял всю логику работы этого метода. Если же работать с хранимками, запросами или вьюхами, то работать не будет.
Slym (2005-07-01 08:52:00) [9]
procedure TDM.ValidateTable(DataSet: TDataSet;const AName:string='');
var
Name:string;
Strings:TStringList;
DS:TADODataSet;
i:integer;
s:string;
begin
if AName<>'' then Name:=AName else Name:=DataSet.Name;
Strings:=TStringList.Create;
try
DS:=TADODataSet.Create(nil);
try
Conn.OpenSchema(siColumns,EmptyParam,EmptyParam,DS);
for i:=0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[i].IsNull and not DataSet.Fields[i].ReadOnly then
begin
if not DS.Locate('TABLE_NAME;COLUMN_NAME',VarArrayOf([Name,DataSet.Fields[i].FieldName]),[]) then
Continue;
if DS.FieldByName('IS_NULLABLE').AsBoolean then Continue;
s:=DS.FieldByName('DESCRIPTION').AsString;
if Length(s)>0 then
Strings.Add('"'+s+'"');
end;
end;
finally
DS.Free;
end;
if Strings.Count>0 then
begin
Strings.Insert(0,'Не заполнены обязательные поля:');
Application.MessageBox(Strings.GetText,'Ошибка!',MB_ICONERROR);
Abort;
end;
finally
Strings.Free;
end;
end;
procedure TDM.TableBeforePost(DataSet: TDataSet);
begin
ValidateTable(DataSet);
end;
evvcom (2005-07-01 08:42:00) [10]Если DataSet какой-нибудь Table, то еще можно как-то вытянуть обязательность заполнения полей из системных таблиц. Если же это какой-нибудь Query или StoredProc, да и если Table, но фактически подцепляющий вьюху, то надо что-то мудрить на сервере, чтобы это как-то определять.
Jonny210 (2005-06-30 21:52:00) [11]> Desdechado © (30.06.05 21:30) [1]
>
> в dbExpress-компонентах это можно проверить через указание
> SQLDataSet.GetMetadata:=True
У DataSet'а такого свойства нет. (((
Desdechado (2005-06-30 21:30:00) [12]в dbExpress-компонентах это можно проверить через указание
SQLDataSet.GetMetadata:=True