Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.06;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
6-1177360433
Sergey M.
2007-04-24 00:33
2008.01.06
Delphi&Cgi


9-1163873357
Masterok
2006-11-18 21:09
2008.01.06
delphix - undeclared identifier angle


15-1196392717
Slider007
2007-11-30 06:18
2008.01.06
С днем рождения ! 30 ноября 2007 пятница


15-1196673637
ПЛОВ
2007-12-03 12:20
2008.01.06
Утилизация старой комп. техники


2-1197226685
alikon1
2007-12-09 21:58
2008.01.06
Работа с конкретной строкой в DBGrid