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

Вниз

Проблема с IBTable.Locate   Найти похожие ветки 

 
supersan ©   (2003-07-21 17:33) [0]

Господа, здравствуйте. Возник вопрос (сабж). Если более конкретно, то есть след. строки кода:

DM.ibtLSTK.Locate("TIP",pk,[]);
tk:=DM.ibtLSTK.FieldByName("OMS").AsInteger;

Так вот, ента tk получает значение, к примеру, 26, хотя из таблицы должна получить, опять же к примеру, 24.
Если нужны еще какие уточнения для более точного ответа, то не стесняйтесь, пишите :-)
Собственно вопрос: как это дело исправить? Я могу, конечно, использовать IBQuery, но для этого придется перелопатить кучу (небольшую, но неприятную) кода. Можно ли обойтись меньшими затратами?


 
Sandman25 ©   (2003-07-21 17:38) [1]

Чему равен DM.ibtLSTK.FieldByName("TIP").AsInteger после поиска?
pk, который искали или нет?


 
supersan ©   (2003-07-21 17:50) [2]

Поле TIP у ibtLSTK - это pk.
А DM.ibtLSTK.FieldByName("TIP").AsInteger и равен 26, хотя должен быть равен 24.
Для примера, структура таблицы:
TIP INTEGER PK
PROFIL VARCHAR(80)
OMS INTEGER

Часть таблицы:
TIP PROFIL OMS
.................
19 ??? 24
.................
40 ??? 26
.................

Делается попытка найти OMS, соответствующий значению TIP, равному 19 (т.е. должно выдать 24), а находится 26, т.е. значение, соответствующее TIP=40
Почему?


 
Sandman25 ©   (2003-07-21 17:55) [3]

Теперь ясно, что не работает Locate.
Возможно, есть патч для IB компонент (я не в курсе).
Если нет, то придется реализовать Locate самому (First; while not Eof; Next). Это не сложно.


 
Sergey13 ©   (2003-07-21 18:25) [4]

Говорили тут как то, что IB5.х левая какая то. Проще перейти на FB.


 
supersan ©   (2003-07-22 07:11) [5]

Ага, всем спасибо, а то я уж подумал, что это у меня глюки.
Ветка закончена...


 
ЮЮ ©   (2003-07-22 07:43) [6]

>Говорили тут как то, что IB5.х левая какая то. Проще перейти на FB
>а то я уж подумал, что это у меня глюки.

IMHO, Locate выполняется на клиенте и глюки сервера тут не причем
ЗЫ.
if Locate then
...
else
<запись не найдена, но DataSet все равно куда-нибудь да указывает >


 
Anatoly Podgoretsky ©   (2003-07-22 09:21) [7]

Намекаешь, что как всегда глюки в другом месте.


 
supersan ©   (2003-07-23 16:26) [8]

2 ЮЮ © (22.07.03 07:43)
Вот и хотелось бы выяснить, куда все-таки "DataSet все равно куда-нибудь да указывает". И ладно, пусть глюки на клиенте, но как от этого избавиться? Совет Sandman25 © (21.07.03 17:55), по крайней мере, дает конкретный способ, а Ваш, извините... Дело в том, что все равно известно, что Locate точно будет указывать на какую-то запись (предметная область такая), мне просто хотелось выяснить, почему же находится не та запись, какая нужно.
2 Anatoly Podgoretsky © (22.07.03 09:21)
Нет, я вполне допускаю глюки и у себя (проверено :-)), просто хотелось локализовать место глюка (у меня или не у меня).
Итак, если уважаемые мастера отказывают в совете Sandman25 © (21.07.03 17:55), то, может, есть другое решение?


 
Johnmen ©   (2003-07-23 18:15) [9]

>supersan © (21.07.03 17:33)
> DM.ibtLSTK.Locate("TIP",pk,[]);
> tk:=DM.ibtLSTK.FieldByName("OMS").AsInteger;

Напомни еще раз, что за поле TIP, какое значение pk на момент Locate"а.


 
ЮЮ ©   (2003-07-24 03:12) [10]

>Совет Sandman25 © (21.07.03 17:55), по крайней мере, дает конкретный способ, а Ваш, извините...

А наш, извините, предлагает не надеяться на то что все в Locate указано правильно и написать
if DM.ibtLSTK.Locate("TIP",pk,[]) then
tk:=DM.ibtLSTK.FieldByName("OMS").AsInteger
else
Application.MassageBox(
( pk) >Совет Sandman25 © (21.07.03 17:55), по крайней мере, дает конкретный способ, а Ваш, извините...

А наш, извините, предлагает не надеяться на то что все в Locate указано правильно и написать
if DM.ibtLSTK.Locate("TIP",pk,[]) then
tk:=DM.ibtLSTK.FieldByName("OMS").AsInteger
else
Application.MassageBox(
"Не найдена запись с "TIP=" + InToStr(pk),
"Поиск записи", 0
);

и лишь после этого утверждать, что Locate глючит


 
supersan ©   (2003-07-24 08:40) [11]

Господа, прошу прощения за ввод в заблуждение. Все оказалось нормально. В результате упорных поисков и попыток модифицирования кода по совету Sandman25 © (21.07.03 17:55) была найдена ошибка. Все оказалось до смешного просто: в другом месте я "случайно" фильтровал "этот нехороший датасет", в результате чего в нем оказывалась всего одна запись, которая благополучно локэйтилась и выдавала "неправильный" результат. Признаю, каюсь и т.п. :-(
А если б совет ЮЮ © (24.07.03 03:12) был бы слегка пораньше, хотя бы вместо ЮЮ © (22.07.03 07:43) (т.е. сразу был бы поразвернутее), то процесс поиска глюка (МОЕГО!) занял бы чуть поменьше времени...
Спасибо всем, кто принял живое участие в обсуждении. Надеюсь на дальнейшее сотрудничество. :-)
PS: Locate все-таки работает!!!


 
ЮЮ ©   (2003-07-24 08:53) [12]

>А если б совет (24.07.03 03:12) был бы пораньше (22.07.03 07:43)

Они абсолютно идентичные :-)


 
Sandman25 ©   (2003-07-24 10:33) [13]

ЮЮ © (24.07.03 08:53)

Сравните Ваш код из ЮЮ © (24.07.03 03:12)
с кодом автора из самого первого поста. Они действительно идентичные :)
Ваш код только показал бы, что Locate не прошел, так автор и так это знал. Во всяком случае, он это узнал после supersan © (21.07.03 17:50) и Sandman25 © (21.07.03 17:55)




Страницы: 1 вся ветка

Текущий архив: 2003.08.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
14-58422
Palladin
2003-08-02 23:04
2003.08.18
А правда ли, что...


14-58488
alextov
2003-07-23 15:16
2003.08.18
Проблемы со скриптами во FreeReport 2.23


14-58445
Till
2003-08-02 12:06
2003.08.18
Lotus Notes


14-58495
Serginio
2003-08-04 16:03
2003.08.18
Несколько вопросов по СОМ


14-58482
sergio_serg
2003-07-23 16:10
2003.08.18
Работа с представлениями в BDE