![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проверка вводимого значения
kxft78 © (2011-02-03 12:46:00)Господа подскажите, дело не хитрое но "прогуглив" пол дня так ничего и не нашел дельного.
Ситуация:
При выполнении sql скрипта (insert строки), необходимо сделать проверку на наличие содержимого поля в справочной таблице и если его там нет то обругать юзера.
сделал просто - select field from spr_table where field='edit.text'
затем
perem1:= AOQuery.FieldValues['field'];
если в запросе пусто то я соответственно получаю ошибку о невозможности присвоения строковой переменной значения null.
И все хорошо если не одно но... необходимо обругать юзера по русски и указать где он напортачил.
Пытался через try ...except наткнулся на грабли что после обработки исключения он благополучно выполняет дальнейший код, а мне это не надо!
Игорь Шевченко (2011-02-04 22:33:00) [1]И. Павел © (04.02.11 22:00) [70]
TDataSet.IsEmpty Method
Indicates whether the dataset contains no records.
Class
TDataSet
Syntax
[Delphi] function IsEmpty(): Boolean;
Description
Call IsEmpty to determine if a dataset has records. IsEmpty returns true if the dataset does not contain any records. Otherwise it returns false
TDataSet.Bof Property
Indicates whether the first record in the dataset is active.
TDataSet.Eof Property
Indicates whether a dataset is positioned at the last record.
Eof is true when an application:
Opens an empty dataset.
Calls a dataset's Last method. (Unless it is a unidirectional dataset)
Call a dataset's Next method, and the method fails because the current record is already the last row in the dataset.
Calls SetRange on an empty range or dataset.
Eof is false in all other cases.
Tip:
If both Eof and Bof are true, the dataset or range is empty.
Тебе нужен переводчик ?
И. Павел (2011-02-04 22:00:00) [2]Ну мы же уже закрыли этот вопрос. Суть была не в том, что FieldByName что-то может вернуть.
Я думал, что IsEmpty подвержен той же ошибке, что и RecordCount, но он, оказывается, ей не подвержен - и я это уже проверил: даже если RecordCount = -1 но записи есть, IsEmpty все равно дает false, т.е. работает правильно (т.к. он ничего не знает о способе определения RecordCount потомком).
Т.е. все таки изначально я был не прав. А придраться к словам можно всегда.
> IsEmpty лучше :)
Только с точки зрения простоты синтаксиса? Т.е. потому, что запись IsEmpty короче? Или есть другие причины? Если есть - тогда на IsEmpty перейду, раз он все равно безопасен.
Игорь Шевченко (2011-02-04 19:16:00) [3]Ega23 © (04.02.11 19:08) [68]
IsEmpty лучше :)
Не в этом дело, дело в том, что при Eof and Bof получится точно такое же значение.
Ega23 (2011-02-04 19:08:00) [4]
> Тебе привели ? Привели. Нехрен увиливать
Да не вопрос.
И. Павел, я приношу Вам свои извинения. Я был неправ.IsEmpty- хуже, чемEof and Bof
Игорь Шевченко (2011-02-04 19:04:00) [5]
> Приведи пример, когда я могу к TDataSet
> > обратиться через FieldByName и получить вразумительное
> значение,
> > но при этом TDataSet.IsEmpty = True.
Тебе привели ? Привели. Нехрен увиливать
Ega23 (2011-02-04 18:40:00) [6]
> Jeer © (04.02.11 16:41) [64]
selPlan.RunDate := sdsPLANS.FieldByName('PLANS_RUNDATE').AsDateTime;
А ты напиши:
if sdsPLANS.IsEmpty then
selPlan.RunDate := -1000
else
selPlan.RunDate := sdsPLANS.FieldByName('PLANS_RUNDATE').AsDateTime;
Anatoly Podgoretsky (2011-02-04 17:00:00) [7]> Jeer (04.02.2011 16:41:04) [64]
Правильно, для AsDateTime не существует нулов, он их нулем заменяет, что и
даст 30.12.1899
Никаких ошибок не будет.
Jeer (2011-02-04 16:41:00) [8]
> Ega23 © (04.02.11 15:41) [62]
> Код в студию.
Ну какой код-то ? :)
По дате:
OnScroll
selPlan.RunDate := sdsPLANS.FieldByName('PLANS_RUNDATE').AsDateTime;
OnShow
datetimePiker.Date := selPlan.Date;
Вот в пикере и вижу 1899, if sdsPLANS.IsEmpty
selPlan - объект, имеющий свойство RunDate: TDateTime
sdsPLANS: TSimpleDataset ( dbExpress )
Ega23 (2011-02-04 15:42:00) [9]Я ща даже специально 2000 MSSQL поставлю.
Ega23 (2011-02-04 15:41:00) [10]
> Не пробовал ? Попробуй и начни извиняться :)
Код в студию.
Jeer (2011-02-04 15:23:00) [11]
> Ega23 © (03.02.11 14:22) [26]
>
>
> > Т.е. этими репликами вы отрицаете, что -1 >= -1 = true?
>
>
>
> Давай так сделаем. Приведи пример, когда я могу к TDataSet
> обратиться через FieldByName и получить вразумительное значение,
> но при этом TDataSet.IsEmpty = True.
> Приведёшь пример - я извинюсь, публично.
Не пробовал ? Попробуй и начни извиняться :)
Date дает 30.12.1899
Int дает 0
и т.д.
Если что - под рукой оказались D7, MSSQL-2000, dbExpress.
Игорь Шевченко (2011-02-04 11:43:00) [12]
> Если вам несложно
RTFM:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_9016.htm
kxft78 (2011-02-04 05:10:00) [13]
> Игорь Шевченко © (03.02.11 18:13) [57]
>
>
> > перед инсертом в ТаблицаА, необходимо проверить наличие
> > содержимого edit.text в ТаблицаБ, если его там нету обругать
> > юзера и не дать сделать инсерт.
>
>
> Use MERGE, Luke
Если вам несложно покажите пожалуйста на конкретном примере как это будет выглядеть (сам триггер который бы проверял наличие значения в ТаблицеБ, и в случае его отсутствия генерировал исключение ).
Ega23 (2011-02-03 19:36:00) [14]
> Если нельзя конструировать абстрактные классы вообще, такая
> конструкция была бы невозможной.
А это не коструирование абстрактного класса, это конструирование вполне конкретного TBaseClass.
type
TMyStringList = class (TStringList)
....
end;
var
list: TstringList;
begin
list := TMyStringList.Create;
Никаких абстрактных классов. Однако ничего сверхъестественного тоже не случилось.
Игорь Шевченко (2011-02-03 18:13:00) [15]
> перед инсертом в ТаблицаА, необходимо проверить наличие
> содержимого edit.text в ТаблицаБ, если его там нету обругать
> юзера и не дать сделать инсерт.
Use MERGE, Luke
DiamondShark (2011-02-03 17:38:00) [16]type
TBase = class
constructor Create; virtual;
procedure Kuku; virtual; abstract;
end;
TBaseClass = class of TBase;
var
koo: TBase;
tkoo: TBaseClass;
begin
tkoo := GetClassRefFromFarFarAwaySource();
koo := tkoo.Create;
koo.Kuku;
Если нельзя конструировать абстрактные классы вообще, такая конструкция была бы невозможной.
Если запретить только явное конструирование абстрактных классов, такая конструкция всё равно позволит создать экземпляр абстрактного класса.
Поскольку виртуализация классовых ссылок -- необходимый инструмент, то заменить проверку абстрактности с времени компиляции на время выполнения -- очень хорошая идея, сильно экономящая сложность компилятора.
kxft78 (2011-02-03 17:37:00) [17]
> Есть подозрение, что спроектировано в корне неверно.
У меня тоже такое подозрение и было предложено вместо того чтобы вводить всякую бяку в базу и заморачиваться с проверками просто в комбобоксе дать постоянный набор значений, но руководство захотело именно так.
"Нет значения в справочнике - сообщение юзеру об этом и стоп."
Ega23 (2011-02-03 17:27:00) [18]
> перед инсертом в ТаблицаА, необходимо проверить наличие
> содержимого edit.text в ТаблицаБ, если его там нету обругать
> юзера и не дать сделать инсерт.
Есть подозрение, что спроектировано в корне неверно.
kxft78 (2011-02-03 17:26:00) [19]
> Игорь Шевченко © (03.02.11 15:51) [41]
> > СУБД oracle10g xe, наплевать можно но не хочется :) хочется
> > по уму и красиво.а теперь задачу с начала.
Задача:
Есть 2 таблицы ТаблицаА(рабочая таблицы) и ТаблицаБ(некая справочная таблица).
Есть форма с едитом, edit.text котрого инсертится в ТаблицаА.
перед инсертом в ТаблицаА, необходимо проверить наличие содержимого edit.text в ТаблицаБ, если его там нету обругать юзера и не дать сделать инсерт.
Игорь Шевченко (2011-02-03 17:14:00) [20]Ega23 © (03.02.11 17:01) [51]
> Либо строго ставить пустые заглушки на все абстрактные методы
> и жить по правилу "0 Errors, 0 Warnings, 0 Hints".
Уволят и будут правы