Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1197264514
Александр Семак
2007-12-10 08:28
2008.01.06
Создание объекта с динамическим классом


2-1197035679
copron
2007-12-07 16:54
2008.01.06
шрифты


2-1197120040
dim
2007-12-08 16:20
2008.01.06
Ввод в поле TEdit1


15-1196685094
ArtemESC
2007-12-03 15:31
2008.01.06
Новая больная идея!!!


2-1197042910
Zheksik
2007-12-07 18:55
2008.01.06
Почему 0.20 <= 0.20 ложь???





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