Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.05.15;
Скачать: [xml.tar.bz2];

Вниз

проверка вводимого значения   Найти похожие ветки 

 
kxft78 ©   (2011-02-03 12:46) [0]

Господа подскажите, дело не хитрое но "прогуглив" пол дня так ничего и не нашел дельного.
Ситуация:
При выполнении sql скрипта (insert строки), необходимо сделать проверку на наличие содержимого поля в справочной таблице и если его там нет то обругать юзера.
сделал просто - select field from spr_table where field="edit.text"
затем
perem1:= AOQuery.FieldValues["field"];
если в запросе пусто то я соответственно получаю ошибку о невозможности присвоения  строковой переменной значения null.
И все хорошо если не одно но... необходимо обругать юзера по русски и указать где он напортачил.
Пытался через try ...except наткнулся на грабли что после обработки исключения он благополучно выполняет дальнейший код, а мне это не надо!


 
Сергей М. ©   (2011-02-03 12:51) [1]

try
..
except
 on e:ESomeKnownException do begin
   raise EMyExceprion.Create("Юзер, ты тупорылый !");    
 end;
end;


 
И. Павел ©   (2011-02-03 12:52) [2]

if AOQuery.bof and AOQuery.eof then ShowMessage("Ах ты гад! Ты что только что ввел!?");


 
Anatoly Podgoretsky ©   (2011-02-03 13:03) [3]

IsNull/IsEmpty


 
kxft78 ©   (2011-02-03 13:06) [4]

все не то.
Мне необходимо чтобы после обругания юзера дальнейший код не выполнялся...


 
И. Павел ©   (2011-02-03 13:07) [5]

if AOQuery.bof and AOQuery.eof then
begin
 ShowMessage("Ах ты гад! Ты что только что ввел!? Теперь все вводи заново!");
 Abort;
end;


 
kxft78 ©   (2011-02-03 13:10) [6]

Сергей М твой пример работает как надо, спасибо!
чет я совсем плохой стал....


 
И. Павел ©   (2011-02-03 13:11) [7]

А блоки перехвата ошибок в коде, где есть abort стройте так, чтобы исключение EAbort ими не обрабатывалось:

except
 on EAbort do abort;
 on Exception do
...


 
Ega23 ©   (2011-02-03 13:11) [8]


> if AOQuery.bof and AOQuery.eof

Это называется DataSet.IsEmpty


> все не то.
> Мне необходимо чтобы после обругания юзера дальнейший код
> не выполнялся...


Если делать идеально, то все проверки должны происходить в одной транзакции со вставкой. Ибо никто не даёт гарантии, что ты проверил 6 полей из 10, проверяешь 7-е, а Вася Пупкин в это время не обновляет 1-е.

Я в таких случаях стараюсь логику на сторону СУБД вынести и хранимку пишу.


 
И. Павел ©   (2011-02-03 13:13) [9]

> Это называется DataSet.IsEmpty

Нет. IsEmpty работает не так, и поэтому не исключено, что может не работать вместе с RecordCount.


 
Ega23 ©   (2011-02-03 13:18) [10]


>  IsEmpty работает не так, и поэтому не исключено, что может
> не работать вместе с RecordCount

Гы, ну тебя за язык никто не тянул, давай объясняй, чего не так в

function TDataSet.IsEmpty: Boolean;
begin
 Result := FActiveRecord >= FRecordCount;
end;

и как оно может работать "не так" вместе с RecordCount.


 
kxft78 ©   (2011-02-03 13:22) [11]

И. Павел тоже спасибо, сижу выбирая как бы лучше сделать, мне кажется решение Сергея более правильно чтоли. Или в моем случае все равно? а проверяю я перед инсертом всей строки целиком, так что ситуации с Пупкиным я думаю не будет :)


 
И. Павел ©   (2011-02-03 13:24) [12]

> Гы, ну тебя за язык никто не тянул, давай объясняй, чего
> не так в

И вас за язык тоже никто не тянул (хотя последнее время у меня складывается обратное впечатление):

>The number of rows indicated might be less than the total number of rows in a table.
>This can happen when the rows retrieved as a recordset
>for a dataset component are a conditional subset of the table.


Например RecordCount = -1 и тогда для того, чтобы база была не пустой, FactiveRecord должен быть меньше или равен -2.


 
Ega23 ©   (2011-02-03 13:26) [13]


> а проверяю я перед инсертом всей строки целиком, так что
> ситуации с Пупкиным я думаю не будет :)


Время между проверкой и инсертом есть? Есть.
Принцип ACID кто-то уже отменил? Нет.
Вероятность "влезания" между проверкой и инсертом есть? Есть.
"Я думаю не будет" - доверительный источник информации? Ну тут каждый ССЗБ.
По уму всё делается в рамках единой транзакции.


 
kxft78 ©   (2011-02-03 13:26) [14]

Смотрю нешуточный спор разгорелся :)
Может под шумок подскажет кто идею как проверку такую сделать совсем уж красиво на уровне субд, триггер например :)


 
И. Павел ©   (2011-02-03 13:27) [15]

> мне кажется решение Сергея более правильно чтоли

Пожалуй, так и есть. ИМХО ошибки удобно выводить наружу, а не подчищать в месте возникновения, чтобы при желании однотипно обрабатывать: например, если у вас таких блоков будет несколько.


 
kxft78 ©   (2011-02-03 13:29) [16]


>
> Время между проверкой и инсертом есть? Есть.
> Принцип ACID кто-то уже отменил? Нет.
> Вероятность "влезания" между проверкой и инсертом есть?
> Есть.
> "Я думаю не будет" - доверительный источник информации?
> Ну тут каждый ССЗБ.
> По уму всё делается в рамках единой транзакции.
>

Полностью согласен, но с таблицей работает на инсерт работает 5 юзеров, согласитесь вероятность такого ничтожно мала....


 
Ega23 ©   (2011-02-03 13:30) [17]


> Например RecordCount = -1

Это не "например". Читай и переводи внимательно.


> должен быть меньше или равен -2.


должен быть меньше или равен -1, учи арифметику.

Вся эта свистопляска с RecordCount - это сколько данных получено на данный момент. У тебя "подсос" данных может идти по-факту.
Но если ты (в текущий момент) получил 0 записей, то и ActiveRecord чему равно будет?


 
kxft78 ©   (2011-02-03 13:31) [18]

Ega23 я новичок, не ругайте сильно, лучше подскажите примерчик где подсмотреть в котором все по уму сделано  ;)


 
Ega23 ©   (2011-02-03 13:33) [19]


> Полностью согласен, но с таблицей работает на инсерт работает
> 5 юзеров, согласитесь вероятность такого ничтожно мала..


Это всё зависит от ТЗ. Если мала - ну значит мала. Если можно наплевать - ну и хорошо. В изначальном вопросе ТЗ не было озвучено.
Вариантов решений - море (зависит от используемой СУБД).
Триггер, хранимая процедура, блокировка таблицы.


 
Ega23 ©   (2011-02-03 13:35) [20]


> Ega23 я новичок, не ругайте сильно, лучше подскажите примерчик
> где подсмотреть в котором все по уму сделано  ;)


Да к тебе претензий нет никаких.
Что касаемо примерчика, то сначала тебе нужно СУБД указать.


 
И. Павел ©   (2011-02-03 13:35) [21]

> [17] Ega23 ©   (03.02.11 13:30


> должен быть меньше или равен -1, учи арифметику.

IsEmpty = -1 >= -1 = true - т.е. база пустая. Кому арифметику нужно учить?
По поводу ситуации, когда RecordCount = -1: они бывают. Не верите - экспериментируйте с курсором и т.д. Мне сейчас лень новый проект создавать и что-то доказывать...


> Ega23 я новичок, не ругайте сильно, лучше подскажите примерчик
> где подсмотреть в котором все по уму сделано  ;)

Боюсь что ничто (пожалуй, на всякий случай, чтобы опять не возник спор, уточню: кроме кода Ega32) не совершенно в этом мире...


 
Anatoly Podgoretsky ©   (2011-02-03 13:36) [22]


> Нет. IsEmpty работает не так

Именно так и работает, только он и нафиг нужен, для проверки пустых значений.


 
Anatoly Podgoretsky ©   (2011-02-03 13:38) [23]

> Ega23  (03.02.2011 13:30:17)  [17]

Джентельмен верит на слово, у тут мне поперла карта.


 
Ega23 ©   (2011-02-03 13:42) [24]


> IsEmpty = -1 >= -1 = true - т.е. база пустая. Кому арифметику
> нужно учить?

Не база пустая, а рекордсет в данный момент - пуст. Нету там никаких записей.
По какой причине - без разницы. Может у него вообще не было подключения к источнику данных. Может текст запроса select * from sysobjects where 0=1
Нету на клиенте записей. Нету.


> По поводу ситуации, когда RecordCount = -1: они бывают.

А я это где-то отрицал?


> Боюсь что ничто не совершенно в этом мире...

Пересадка рук позволит выйти из депрессии.


 
И. Павел ©   (2011-02-03 13:56) [25]

> Пересадка рук позволит выйти из депрессии.

Ну я же уточнил, что вы - исключение :)


> учи арифметику.

> Не база пустая, а рекордсет в данный момент - пуст. Нету
> там никаких записей.


> А я это где-то отрицал?

Т.е. этими репликами вы отрицаете, что -1 >= -1 = true?


 
Ega23 ©   (2011-02-03 14:22) [26]


> Т.е. этими репликами вы отрицаете, что -1 >= -1 = true?


Давай так сделаем. Приведи пример, когда я могу к TDataSet обратиться через FieldByName и получить вразумительное значение, но при этом TDataSet.IsEmpty = True.
Приведёшь пример - я извинюсь, публично.


 
Ega23 ©   (2011-02-03 14:28) [27]

З.Ы. (вдогонку)
приватное поле TDataSet.FRecordCount и свойство TDataSet.RecordCount с виртуальным геттером GetRecordCount - разные вещи. Если чё.


 
И. Павел ©   (2011-02-03 14:40) [28]

> [26] Ega23 ©   (03.02.11 14:22)

Ну сомневаюсь я в том факте, что IsEmpty будет на 100% работать при RecordCount = -1. Ведь тогда или FActiveRecord должен быть <= -2, либо FRecordCount не быть равным RecordCount. Я тоже раньше использовал IsEmpty а потом решил перестраховаться, чтобы не искать в случае чего ошибку в таком неожиданном месте. Может быть IsEmpty всегда будет работать правильно (чем более что [22]), но (eof) and (bof) уж точно не подведет. Короче я не знаю, как ведет себя FRecordCount, а протрассировать до этой функции в Delphi7 не получается.

По поводу поисков - нет ни желания ни времени. Вот если бы альтернативы IsEmpty не было, тогда стоило бы в ней полностью разбираться.

В общем, я больше спорить не хочу. В моем текущем проекте хватает геморроя без IsEmpty а время я уже потратил много.

PS: но если кто-нибудь мне объяснит, в чем секрет IsEmpty и почему она работает (и всегда ли работает?) при RecordCount = -1 и ActiveRecord = 0 - буду очень благодарен, т.к. все же любопытно.


 
12 ©   (2011-02-03 14:41) [29]

FK-PK ключи,

> необходимо сделать проверку на наличие содержимого поля
> в справочной таблице и если его там нет то обругать

и СУБД сделает за тебя
останется только ловить нарушение соотв. constrat`a

если конечн осекретная СУБД поддерживает такое


 
Ega23 ©   (2011-02-03 14:43) [30]

З.З.Ы.
ИМХО, DB.pas вообще образец корявости в, казалось бы, вылизанном коде. Всё-таки описание абстрактных классов, должно быть хорошо выверено.
Ан нет, встречаем перлы типа

procedure TDataLink.UpdateRange;
var
 Min, Max: Integer;
begin
 Min := DataSet.FActiveRecord - FBufferCount + 1;
 .....
end;

Оно поняно, что так можно в рамках одного юнита. Но как хитрых потомков того же DataLink писать - вот тут большой затык.


 
И. Павел ©   (2011-02-03 14:44) [31]

> [27] Ega23 ©   (03.02.11 14:28)

А это действительно аргумент.
Но т.к. по FRecordCount документации нет. Остается либо штудировать код, либо гадать, когда он отстает от свойства. Если кто-нибудь найдет - пишите, т.к. интересно.


 
И. Павел ©   (2011-02-03 14:48) [32]

> с виртуальным геттером

Выходит, что FRecordCount знает, сколько записей, а потомок, пеализовавший GetRecordCount - нет. Тогда зачем они его переопределили?...


 
Ega23 ©   (2011-02-03 14:51) [33]


> либо FRecordCount не быть равным RecordCount.


Вот. Наконец-то.
Смотрим внимательно:


 TDataSet = class(TComponent, IProviderSupport)
 private
   FFields: TFields;
   .....
   FRecordCount: Integer;


т.е. - приватное поле.

 TDataSet = class(TComponent, IProviderSupport)
 public
   ......
   property RecordCount: Integer read GetRecordCount;

Публичное read-only свойство с геттером.


 TDataSet = class(TComponent, IProviderSupport)
 protected
   ......
   function GetRecordCount: Integer; virtual;

протектед-геттер.

ну и наконец:
function TDataSet.GetRecordCount: Longint;
begin
 Result := -1;
end;


И функции IsEmpty глубоко начхать, каким макаром в ADODB перекрыт GetRecordCount и какое значение он вернул.


 
Ega23 ©   (2011-02-03 15:00) [34]


> Выходит, что FRecordCount знает, сколько записей, а потомок,
>  пеализовавший GetRecordCount - нет. Тогда зачем они его
> переопределили?...


А это потому, что вот так вот DB.pas написан.
FRecordCount - исключительно внутренний счётчик базового TDataSet.

Есть и ещё перлы. Например - DataSet.DisableControls/DataSet.EnableControls
Всё честно, по DisableControls события не передаются всем TDataSource, которые подключены к НД. А вот по EnableControls - идёт DataChanged.
Но нет никакой гарантии, что за это время НД могли изменить. Добавить туда записей, модифицировать, что-то удалить. Переоткрыть, в конце-концов.
Для DBEdit - не беда, берём активную запись и отображаем.
Для DBGrid - отображаем ровно то, что есть на экране, на остальное наплевать.
А вот для TDBTree - уже ой. Тебе всю иерархию знать надо, мало ли, ты ветки местами поменял. И считай приходится заново перестраивать.
ИМХО, уже только этой причины было достаточно для отсутствия "стандартного" TDBTreeView.


 
И. Павел ©   (2011-02-03 15:01) [35]

> TDataSet = class(TComponent, IProviderSupport)
> private
>   FFields: TFields;
>   .....
>   FRecordCount: Integer;


Он приватный :) И, похоже, именно для того, чтобы его не тронули не умеющие определять число строк потомки.
Похоже, что вы правы. Не удивительно, что в справке про IsEmpty нет такого же предостережения, как про RecordCount. Борландовцы как то умудрились реализовать IsEmpty на самом низком уровне!


 
kxft78 ©   (2011-02-03 15:04) [36]

Выходил не надолго
> Это всё зависит от ТЗ. Если мала - ну значит мала. Если
> можно наплевать - ну и хорошо. В изначальном вопросе ТЗ
> не было озвучено.Вариантов решений - море (зависит от используемой
> СУБД).Триггер, хранимая процедура, блокировка таблицы.

СУБД oracle10g xe, наплевать можно но не хочется :) хочется по уму и красиво.
надо проверить вводимое значение на совпадением со значением в некой таблице, если его там нет то обматерить и не дать сделать insert.
Вероятно правильней всего в такой ситуации будет использовать триггер before update?
Накидаете грамотный и красивый пример на plsql + отлов в дельфях - будет ОГРОМНОЕ ВАМ СПАСИБО :)


 
Ega23 ©   (2011-02-03 15:07) [37]


> И, похоже, именно для того, чтобы его не тронули не умеющие
> определять число строк потомки.


Да, но при этом в том же DB.pas:
procedure TDataLink.UpdateRange;
var
 Min, Max: Integer;
begin
 Min := DataSet.FActiveRecord - FBufferCount + 1;
 if Min < 0 then Min := 0;
 Max := DataSet.FRecordCount - FBufferCount;
 ...


В общем, я бы не рекомендовал DB.pas как образцово-показательный код.  :)


 
Ega23 ©   (2011-02-03 15:09) [38]


> триггер before update?

Скорее, before insert


> Накидаете грамотный и красивый пример на plsql + отлов в
> дельфях


Не силён в Оракле. Может там есть какое-нибудь изящное решение.
Для MSSQL я бы хранимку написал.


 
kxft78 ©   (2011-02-03 15:12) [39]

Пардон ошибся, before insert конечно.
Есть гуру оракла? :)


 
Anatoly Podgoretsky ©   (2011-02-03 15:38) [40]

> Ega23  (03.02.2011 14:51:33)  [33]

Это виртуальный метод, могбы быть даже абстрактным, его перекрытие в
наследнике обязательно.


 
Игорь Шевченко ©   (2011-02-03 15:51) [41]


> СУБД oracle10g xe, наплевать можно но не хочется :) хочется
> по уму и красиво.


а теперь задачу с начала.


 
Ega23 ©   (2011-02-03 15:53) [42]


>  его перекрытие в наследнике обязательно.


Вот тут недавно (месяца 2 назад) с Максом заспорил. По-поводу нужности абстрактных методов в Delphi.
Delphi допускает создание абстрактных классов (TStrings, например). Вот, собственно, вопрос: если допускается создание, то для чего нужна директива abstract? Почему нельзя обойтись просто виртуальным методом?
Взять тот же TDataLink c его ActiveChanged, RecordChangd, UpdateData.
Собственно, вполне возможно, что какая-то Высшая Цель преследовалась.
В самом DB.pas RecordCount только в одном месте используется.


 
Игорь Шевченко ©   (2011-02-03 15:55) [43]


>  Почему нельзя обойтись просто виртуальным методом?


чтобы получить Abstract Error при выполнении и Warning при компиляции


 
Anatoly Podgoretsky ©   (2011-02-03 16:01) [44]

> Ega23  (03.02.2011 15:53:42)  [42]

Обойтись можно, но многое теряется, кой о чем сказал ИШ, и кроме того, тогда
придется делать хотя бы пустую реализацию, кой где в коде такое есть, видимо
остатки от древних времен.


 
Ega23 ©   (2011-02-03 16:05) [45]


> чтобы получить Abstract Error при выполнении и Warning при
> компиляции


Не, это понятно.
Я может несколько сумбурно выразился.
Смысл в другом: зачем тогда вообще позволять создавать абстрактный класс?
Макс хороший пример привёл, чуть ли не от самого Борланда (источник не помню). Где как раз показано, довольно наглядно, для чего эта лазейка оставлена.

Собственно, это я к высказыванию
> его перекрытие в наследнике обязательно.
Может и не обязательно. Надо очень внимательно код ковырять, в том же ADODB например.


 
Игорь Шевченко ©   (2011-02-03 16:22) [46]


> Смысл в другом: зачем тогда вообще позволять создавать абстрактный
> класс?


для полиморфизма ?


 
Ega23 ©   (2011-02-03 16:32) [47]


> для полиморфизма ?

А какой тут полиморфизм? Ну вот я написал:
var
 strings: TStrings;
begin
 strings := TStrings.Create;


Где тут полиморфизм?
Я могу понять, когда strings := TStringList.Create;
Я могу понять, когда коллекция TMyObjectClass = class of TMyObject и явно класс задавать при создании.


 
Anatoly Podgoretsky ©   (2011-02-03 16:36) [48]

> Ega23  (03.02.2011 16:05:45)  [45]

Тут надо вспоминать историю, когда не было абстрактных методов, то
программистам приходилось это эмулировать (примеры можно найти в RTL Турбо
Паскаль), что бы получить ошибку в рантайм.
На самом деле абстрактыне методы не вредят ничему, а позволяют просто
создать тот же виртуальный метод, но без реализации и как бонус сообщения и
предупреждение, очень полезное было нововведение.

Если ты против самого создания класса с абстрактными методами, ну решили не
усложнять компилятор, учивая возможно создания индирект. Да и не мешает это,
если вызовешь такой метод без реализации то получишь внятную ошибку. За это
и боролись в Турбо Паскале, но не было поддержки на уровне компилятора и
системы.


 
Ega23 ©   (2011-02-03 16:39) [49]


> Если ты против самого создания класса с абстрактными методами


Да я не то чтобы против. Просто непонятно было, зачем. Для чего идёт warning про компиляции, а не ошибка.
Вот Макс тогда хороший пример привёл, с "биологическим деревом классов". Наглядно, так сказать, демонстрировалось, в чём удобство.


 
Игорь Шевченко ©   (2011-02-03 16:51) [50]


> Где тут полиморфизм?


тут нет полиморфизма


 
Ega23 ©   (2011-02-03 17:01) [51]


> тут нет полиморфизма

Дык вот и я о том же. Либо строго ставить пустые заглушки на все абстрактные методы и жить по правилу "0 Errors, 0 Warnings, 0 Hints".
Либо на свой страх и риск создавать абстрактный класс, у которого перекыто 5 из 5000 абстрактных методов и быть твёрдо уверенным, что твой код никогда не вызовет ни одного абстрактного метода (кроме перекрытых).


 
Игорь Шевченко ©   (2011-02-03 17:14) [52]

Ega23 ©   (03.02.11 17:01) [51]


> Либо строго ставить пустые заглушки на все абстрактные методы
> и жить по правилу "0 Errors, 0 Warnings, 0 Hints".


Уволят и будут правы


 
kxft78 ©   (2011-02-03 17:26) [53]


> Игорь Шевченко ©   (03.02.11 15:51) [41]
> > СУБД oracle10g xe, наплевать можно но не хочется :) хочется
> > по уму и красиво.а теперь задачу с начала.

Задача:
Есть 2 таблицы ТаблицаА(рабочая таблицы) и ТаблицаБ(некая справочная таблица).
Есть форма с едитом, edit.text котрого инсертится в ТаблицаА.
перед инсертом в  ТаблицаА, необходимо проверить наличие содержимого edit.text в ТаблицаБ, если его там нету обругать юзера и не дать сделать инсерт.


 
Ega23 ©   (2011-02-03 17:27) [54]


> перед инсертом в  ТаблицаА, необходимо проверить наличие
> содержимого edit.text в ТаблицаБ, если его там нету обругать
> юзера и не дать сделать инсерт.


Есть подозрение, что спроектировано в корне неверно.


 
kxft78 ©   (2011-02-03 17:37) [55]


> Есть подозрение, что спроектировано в корне неверно.

У меня тоже такое подозрение и было предложено вместо того чтобы вводить всякую бяку в базу и заморачиваться с проверками просто в комбобоксе дать постоянный набор значений, но руководство захотело именно так.
"Нет значения в справочнике - сообщение юзеру об этом и стоп."


 
DiamondShark ©   (2011-02-03 17:38) [56]

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;

Если нельзя конструировать абстрактные классы вообще, такая конструкция была бы невозможной.
Если запретить только явное конструирование абстрактных классов, такая конструкция всё равно позволит создать экземпляр абстрактного класса.

Поскольку виртуализация классовых ссылок -- необходимый инструмент, то заменить проверку абстрактности с времени компиляции на время выполнения -- очень хорошая идея, сильно экономящая сложность компилятора.


 
Игорь Шевченко ©   (2011-02-03 18:13) [57]


> перед инсертом в  ТаблицаА, необходимо проверить наличие
> содержимого edit.text в ТаблицаБ, если его там нету обругать
> юзера и не дать сделать инсерт.


Use MERGE, Luke


 
Ega23 ©   (2011-02-03 19:36) [58]


> Если нельзя конструировать абстрактные классы вообще, такая
> конструкция была бы невозможной.


А это не коструирование абстрактного класса, это конструирование вполне конкретного TBaseClass.

type
 TMyStringList = class (TStringList)
 ....
 end;

var
 list: TstringList;
begin
 list := TMyStringList.Create;

Никаких абстрактных классов. Однако ничего сверхъестественного тоже не случилось.


 
kxft78 ©   (2011-02-04 05:10) [59]


> Игорь Шевченко ©   (03.02.11 18:13) [57]
>
>
> > перед инсертом в  ТаблицаА, необходимо проверить наличие
> > содержимого edit.text в ТаблицаБ, если его там нету обругать
> > юзера и не дать сделать инсерт.
>
>
> Use MERGE, Luke


Если вам несложно покажите пожалуйста на конкретном примере как это будет выглядеть (сам триггер который бы проверял наличие значения в ТаблицеБ, и в случае его отсутствия генерировал исключение ).


 
Игорь Шевченко ©   (2011-02-04 11:43) [60]


> Если вам несложно


RTFM:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_9016.htm


 
Jeer ©   (2011-02-04 15:23) [61]


> 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.


 
Ega23 ©   (2011-02-04 15:41) [62]


> Не пробовал ? Попробуй и начни извиняться :)


Код в студию.


 
Ega23 ©   (2011-02-04 15:42) [63]

Я ща даже специально 2000 MSSQL поставлю.


 
Jeer ©   (2011-02-04 16:41) [64]


> 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 )


 
Anatoly Podgoretsky ©   (2011-02-04 17:00) [65]

> Jeer  (04.02.2011 16:41:04)  [64]

Правильно, для AsDateTime не существует нулов, он их нулем заменяет, что и
даст 30.12.1899
Никаких ошибок не будет.


 
Ega23 ©   (2011-02-04 18:40) [66]


> 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;


 
Игорь Шевченко ©   (2011-02-04 19:04) [67]


>  Приведи пример, когда я могу к TDataSet
> > обратиться через FieldByName и получить вразумительное
> значение,
> >  но при этом TDataSet.IsEmpty = True.


Тебе привели ? Привели. Нехрен увиливать


 
Ega23 ©   (2011-02-04 19:08) [68]


> Тебе привели ? Привели. Нехрен увиливать


Да не вопрос.
И. Павел, я приношу Вам свои извинения. Я был неправ. IsEmpty - хуже, чем Eof and Bof


 
Игорь Шевченко ©   (2011-02-04 19:16) [69]

Ega23 ©   (04.02.11 19:08) [68]

IsEmpty лучше :)

Не в этом дело, дело в том, что при Eof and Bof получится точно такое же значение.


 
И. Павел ©   (2011-02-04 22:00) [70]

Ну мы же уже закрыли этот вопрос. Суть была не в том, что FieldByName что-то может вернуть.
Я думал, что IsEmpty подвержен той же ошибке, что и RecordCount, но он, оказывается, ей не подвержен - и я это уже проверил: даже если RecordCount = -1 но записи есть, IsEmpty все равно дает false, т.е. работает правильно (т.к. он ничего не знает о способе определения RecordCount потомком).
Т.е. все таки изначально я был не прав. А придраться к словам можно всегда.


> IsEmpty лучше :)


Только с точки зрения простоты синтаксиса? Т.е. потому, что запись IsEmpty короче? Или есть другие причины? Если есть - тогда на IsEmpty перейду, раз он все равно безопасен.


 
Игорь Шевченко ©   (2011-02-04 22:33) [71]

И. Павел ©   (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.


Тебе нужен переводчик ?



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.05.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.67 MB
Время: 0.017 c
2-1296861219
Oleg_teacher
2011-02-05 02:13
2011.05.15
Отображение данных на форме!


1-1253268899
Tirael
2009-09-18 14:14
2011.05.15
подскажите алгоритм поиска оптимального размещения


15-1296108365
NkzAlex
2011-01-27 09:06
2011.05.15
Этика работника


2-1296928775
new_user
2011-02-05 20:59
2011.05.15
TWebBrowser


2-1297255354
young_delphi_coder
2011-02-09 15:42
2011.05.15
проверить наличие разделителя в строке пути





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский