Вопрос по Locate

Совместимость InterBase, Firebird, Yaffil между собой и по версиям

Модераторы: kdv, Alexey Kovyazin

Ответить
amk
Сообщения: 4
Зарегистрирован: 11 сен 2007, 04:07

Вопрос по Locate

Сообщение amk » 11 сен 2007, 04:27

У меня Yaffil 840 Delphi7. Обновила IBX на 11. Возникла проблема с Locate для IBTable - поле Char(10) передаётся с правыми концевыми пробелами. Т.е. если задать IBTable.Locate('F_Name', Trim(Edit1.Text),[]), то не находит, если длина Trim(Edit1.Text)<10.
В IBExpert в рег.инф-ции к базе стоит галочка на <Обрезать концевые пробелы для полей типа CHAR>.
До обновления всё работало. И поскольку таких Locate-ов в программе много, то вопрос:
Есть ли другой выход кроме глобальных изменений программы?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 11 сен 2007, 09:14

вообще-то IBTable - это несколько неприлично...
дальше. если столбцы у IBTablе как объекты сделаны (в FieldEditor), то можно указать чтобы концевые пробелы обрезались.

и вы не путайте базу, IBExpert и IBX.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Вопрос по Locate

Сообщение Merlin » 11 сен 2007, 12:27

amk писал(а):У меня Yaffil 840 Delphi7. Обновила IBX на 11. Возникла проблема с Locate для IBTable - поле Char(10) передаётся с правыми концевыми пробелами. Т.е. если задать IBTable.Locate('F_Name', Trim(Edit1.Text),[]), то не находит, если длина Trim(Edit1.Text)<10.
В IBExpert в рег.инф-ции к базе стоит галочка на <Обрезать концевые пробелы для полей типа CHAR>.
До обновления всё работало. И поскольку таких Locate-ов в программе много, то вопрос:
Есть ли другой выход кроме глобальных изменений программы?
Ткнуть в хелп по локейт и посмотреть - а что ж там может скрываться внутре пары загадочных символов [].

amk
Сообщения: 4
Зарегистрирован: 11 сен 2007, 04:07

Сообщение amk » 11 сен 2007, 17:39

kdv писал(а):вообще-то IBTable - это несколько неприлично...
дальше. если столбцы у IBTablе как объекты сделаны (в FieldEditor), то можно указать чтобы концевые пробелы обрезались.

и вы не путайте базу, IBExpert и IBX.
Для маленькой таблицы IBTable вполне подходит, а поля динамические. Статические поля не всегда удобны и в любом случае придётся править FixedChar для всех CHAR-полей и, видимо, не только в IBTable, но и в Query-х, и.т.д.
IBExpert указываю потому, что, не знаю, м.б. можно со стороны базы прописать как-то, чтобы обрезались правые концевые пробелы.
Или Yaffil поменять. В любом случае, спасибо за внимание.
Последний раз редактировалось amk 11 сен 2007, 17:53, всего редактировалось 1 раз.

amk
Сообщения: 4
Зарегистрирован: 11 сен 2007, 04:07

Re: Вопрос по Locate

Сообщение amk » 11 сен 2007, 17:50

Merlin писал(а):
amk писал(а):У меня Yaffil 840 Delphi7. Обновила IBX на 11. Возникла проблема с Locate для IBTable - поле Char(10) передаётся с правыми концевыми пробелами. Т.е. если задать IBTable.Locate('F_Name', Trim(Edit1.Text),[]), то не находит, если длина Trim(Edit1.Text)<10.
В IBExpert в рег.инф-ции к базе стоит галочка на <Обрезать концевые пробелы для полей типа CHAR>.
До обновления всё работало. И поскольку таких Locate-ов в программе много, то вопрос:
Есть ли другой выход кроме глобальных изменений программы?
Ткнуть в хелп по локейт и посмотреть - а что ж там может скрываться внутре пары загадочных символов [].
Частичное совпадение loPartialKey в [] не подходит. Для поиска 'ABCD' будет выбирать и 'ABCDEF', и т.д.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 11 сен 2007, 18:29

Можно, конечно, долго распространяться о том, что старые большевики с 1917 года уговаривали

а) Не пользоваться TIBTable,
б) Не пользоваться или пользоваться минимально Locate и Filter с целью ограничения выборки, а делать это переформировывая динамически запрос,

И почему. Но, наверное, бессмыссленно, ибо в данном конкретном случае, похоже, поздно. Или без толку было изначально, логическая аргументация не действовала, хотелось попроще и пооднообразней кодировать, а не сделать вещь. Как тут сказал один крендель рядушком - это всё наверное интересно, но в данный момент мне неинтересно, а интересно почему вот здесь у меня не пилиццо. Остаётся констатировать факт - Вы поставили Вашу программу в зависимость не только от сервера, но и от клиентской библиотеки доступа, в которой Джефф имеет обыкновение лёгким движением руки менять базовые вещи от версии к версии, порой через десяток версий приходя по кругу к исходной концепции. Не факт, что FixedChar поможет - в некоторых версиях он игнорировал его напрочь, в некоторых уважал на полях типа VarChar и игнорировал на Char. Могу порекомендовать откатиться на ту версию IBX, с которой работало. Или поискать среди ещё более поздних, может опять заработает. Или, например, переписать или перекрыть метод Locate и перекомпилировать IBX. Но, боюсь, что одним Locate тут не обойдётся. Следующим "преведом" будет то, что не заработают сравнения вводимых пользователем строк с полями датасетов в условных операторах программы и условиях циклов. По той же причине. Потом - что, например, в контролах редактирования курсор будет ставится на правый край и для начала редактирования придётся сначала убирать пробелы. И так далее. То есть, придётся переписать работу с филдами в IBX вообще. А тут уже можно нарваться и на конфликт с его менеджером памяти. Лет 8 назад, оказавшись в похожей ситуации при переводе программы строк эдак на 300 000 с BDE на IBX, я предпочёл написать средней интеллектуальности программулю, пропатчившую все мои *.pas-тексты на предмет взятия всех нужных обращений к чему-либо AsString в Trim() и оставления в первобытном состоянии тех, которые не нужно. Но у меня, слава богу, никогда не было редактирования в DB-Aware контролах.

amk
Сообщения: 4
Зарегистрирован: 11 сен 2007, 04:07

Сообщение amk » 15 сен 2007, 09:02

Спасибо всем, пока откатилась назад.

Ответить