Форум: "Потрепаться";
Текущий архив: 2003.08.18;
Скачать: [xml.tar.bz2];
ВнизПроблема с 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c