![]() |
| ||
|
|
Новости |
Поиск |
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-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.