Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проверка вводимого значения


Страницы:   1 2 3 4

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-03 14:44:00) [41]

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

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


Ega23   (2011-02-03 14:43:00) [42]

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

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

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


12   (2011-02-03 14:41:00) [43]

FK-PK ключи,

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

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

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


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

> [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 - буду очень благодарен, т.к. все же любопытно.


Ega23   (2011-02-03 14:28:00) [45]

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


Ega23   (2011-02-03 14:22:00) [46]


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


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


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

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

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


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

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


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

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


Ega23   (2011-02-03 13:42:00) [48]


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

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


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

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


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

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


Anatoly Podgoretsky   (2011-02-03 13:38:00) [49]

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

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


Anatoly Podgoretsky   (2011-02-03 13:36:00) [50]


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

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


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

> [17] Ega23 ©   (03.02.11 13:30


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

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


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

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


Ega23   (2011-02-03 13:35:00) [52]


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


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


Ega23   (2011-02-03 13:33:00) [53]


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


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


kxft78   (2011-02-03 13:31:00) [54]

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


Ega23   (2011-02-03 13:30:00) [55]


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

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


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


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

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


kxft78   (2011-02-03 13:29:00) [56]


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

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


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

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

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


kxft78   (2011-02-03 13:26:00) [58]

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


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


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


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


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

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

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

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


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо