Форум: "Базы";
Текущий архив: 2008.01.06;
Скачать: [xml.tar.bz2];
Внизlocate в базах IB Найти похожие ветки
← →
Егоров А.Н. (2007-08-28 13:11) [0]Господа мастера, подскажите в чем дело?
Есть таблица (pFIBDataSet_POST_SERIA) в базе данных IB. В ней Fields[0] - автоинскриментное (Integer).
// Выполняю поиск записи:
pFIBDataSet_POST_SERIA.Locate("NNOPER;SERIA_B",VarArrayOf([34,"Лампы"]),[loCaseI nsensitive,loCaseInsensitive]);
// Проверяю, найдена ли запись
if (pFIBDataSet_POST_SERIA.Fields[1].Value=34) and (pFIBDataSet_POST_SERIA.Fields[2].Value="Лампы") then
// Запись найдена, пытаюсь считать значение Fields[0] myID_SERIA:=pFIBDataSet_POST_SERIA.Fields[0].Value;
и в итоге получаю null.
Хотя, если открыть pFIBDataSet_POST_SERIA в GRID, то все поля и записи видны, и поле Fields[0] имеет значения.
← →
turbouser © (2007-08-28 13:48) [1]
> Егоров А.Н. (28.08.07 13:11)
> // Проверяю, найдена ли запись
Зачем? Locate - это функция, возвращает true если запись найдена.
> myID_SERIA:=pFIBDataSet_POST_SERIA.Fields[0].Value;
myID_SERIA - какой тип данных?
ИМХО, лучше использовать явно Fields[0].As_тип_данных_
← →
Егоров А.Н. (2007-08-28 14:07) [2]Проверяю, потому что некоторых вариантов нет, и тогда уже другая история.
myID_SERIA - тип Integer
если использую pFIBDataSet_POST_SERIA.Fields[0].AsInteger, то имею 0 вместо null, хотя записи в этом поле 1, 2, 3 и т.д.
← →
Сергей М. © (2007-08-28 14:13) [3]
> Проверяю, потому что некоторых вариантов нет
if Locate(...) then
.. вариант есть ..
else
.. другая история ..
← →
Егоров А.Н. (2007-08-28 14:19) [4]Сергей М.
> Проверяю, потому что некоторых вариантов нет
Вопрос не в IF ...
А в том что, я не могу считать правильное значение в pFIBDataSet_POST_SERIA.Fields[0]. При том,что оно там есть и равно 3,
pFIBDataSet_POST_SERIA.Fields[0].Value выдает null, а
pFIBDataSet_POST_SERIA.Fields[0].AsInteger соответственно 0.
А как обрабатывать IF я в курсе.
← →
Сергей М. © (2007-08-28 14:24) [5]
> При том,что оно там есть и равно 3
Мож оно там и есть (тебе виднее), но только не в той записи, которая удовлетворяет указанным тобой Locate-условиям.
Иными словами, бессмысленно читать значение поля заведомо не найденной записи. А вот найдена она или не найдена - об этом как раз тебе тот самый IF и скажет.
← →
Сергей М. © (2007-08-28 14:31) [6]
> Егоров А.Н.
В таблице POST_SERIA есть комбинированный индекс по полям NNOPER, SERIA_B ?
Это весьма важно ..
← →
Егоров А.Н. (2007-08-28 14:42) [7]> В таблице POST_SERIA есть комбинированный индекс по полям NNOPER, SERIA_B ?
Это весьма важно ..
Да, такой индекс есть.
> А вот найдена она или не найдена - об этом как раз тебе тот самый IF и скажет.
Вот он мне и сказал, что запись найдена, и если посмотреть в отладчике, то поля pFIBDataSet_POST_SERIA.Fields[1].Value=34, а pFIBDataSet_POST_SERIA.Fields[2].Value="Лампы", только pFIBDataSet_POST_SERIA.Fields[0].Value=null ?
← →
Сергей М. © (2007-08-28 14:46) [8]
> Вот он мне и сказал, что запись найдена
Судя по коду, ты и не спрашивал.. Как же он тебе мог "сказать" ?
← →
Johnmen © (2007-08-28 14:49) [9]Приводи запрос.
И имей в виду, что в IB/FB нет автоинкрементных полей.
← →
Johnmen © (2007-08-28 14:50) [10]И что означает
[loCaseI nsensitive,loCaseInsensitive]
как параметр ф-ии локейт?
← →
Сергей М. © (2007-08-28 14:57) [11]
> Да, такой индекс есть
Подозреваю, что локейт-опция loCaseInsensistive при этом может не дать результата из-за регистрозависимости самого индекса, который, согласно справке, должен быть задействован в дан.случае.
← →
Johnmen © (2007-08-28 15:02) [12]
> Сергей М. © (28.08.07 14:57) [11]
Да находится у него всё. см.[7]
Он не может понять, почему значение первого поля у найденной записи null.
← →
Сергей М. © (2007-08-28 15:09) [13]
> Johnmen © (28.08.07 15:02) [12]
Ну если Locate таки возвратил True, то тогда остается одно - в допотопной (или не самой свежей) версии FIBPlus некорректно работает сам метод Locate.
В Тырнете мне попадались жалобы на его работу, правда там речь шла о локейте и кириллице в режиме ioCaseInsensitive.
← →
sdts (2007-08-28 15:11) [14]
> Хотя, если открыть pFIBDataSet_POST_SERIA в GRID, то все
> поля и записи видны, и поле Fields[0] имеет значения.
как предположение: Fields[0] не то что думаете (в гриде и Fields[0])
может попробовать FieldByName?
← →
Егоров А.Н. (2007-08-28 15:21) [15]> Johnmen
> И что означает [loCaseI nsensitive,loCaseInsensitive] как параметр ф-ии локейт?
На самом деле в коде [loCaseInsensitive,loCaseInsensitive] - без пробела, это я когда копировал и вставлял, он появился. А означает этот параметр, что оба поля должны найтись по полному (а не частичному) совпадению.
Что касается кода, то весь он достаточно большой, а не срабатывающий участок приведен в первоначальном запросе.
Не пойму, что пытается выяснить для себя Сергей М. (я ведь не приводил весь код, а только то что меня интересует), но я абсолютно ответственно заявляю, что запись находится. И можно проверить значения полей NNOPER и SERIA_B, а они в таблице уникальны. Т.е.
pFIBDataSet_POST_SERIA.Locate("NNOPER;SERIA_B",VarArrayOf([34,"Лампы"]),[loCaseI nsensitive,loCaseInsensitive]);
if (pFIBDataSet_POST_SERIA.Fields[1].Value=34) and (pFIBDataSet_POST_SERIA.Fields[2].Value="Лампы") then
begin
myNNOPER:=pFIBDataSet_POST_SERIA.Fields[1].Value; // имеем 34
mySERIA_B:=pFIBDataSet_POST_SERIA.Fields[2].Value; // имеем "Лампы"
myID_SERIA:=pFIBDataSet_POST_SERIA.Fields[0].Value; // null вместо 3
end
else
begin
.....
end;
Поверьте, что с переменными и их типом все у меня в норме, не новичок, а вот с null не могу понять.
Может это как-то связано с тем, что первое поле - первичный ключ?
> поле ID_SERIA не автоикриментное, но есть тригер и генератор, который задает для новой записи новое целое значение 1, 2, 3, 4 и т.д.
← →
Johnmen © (2007-08-28 15:25) [16]
> Егоров А.Н. (28.08.07 15:21) [15]
1. Ещё раз - приводи текст запроса. Иначе дальше разбираться бессмысленно.
2.
> А означает этот параметр, что оба поля должны найтись по
> полному (а не частичному) совпадению.
Где такое в хелпе написано???
← →
Сергей М. © (2007-08-28 15:29) [17]
> абсолютно ответственно заявляю, что запись находится
Если так, то либо [13] либо [1, 14], третьего не дано
← →
Егоров А.Н. (2007-08-28 15:29) [18]> sdts
> может попробовать FieldByName?
Пробовал, и даже добавлял в pFIBDataSet_POST_SERIA все поля и пробовал pFIBDataSet_POST_SERIAID_SERIA.Value, правда вместо null значение определилось как 0.
← →
RomanH © (2007-08-29 14:04) [19]
> Егоров А.Н.
Вы наверное это используете для контестного поиска записи в Gride.
Если да, то советовал бы использовать какой нибудь продвинутый
DBGrid, к примеру EhLib. Кторый это очень удобно делает.
Не знаю в тему написал или нет...
← →
Deniz © (2007-08-30 07:35) [20]Мы таки текст запроса увидим?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.01.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c