Страница 1 из 1

Вопрос по Locate

Добавлено: 11 сен 2007, 04: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-ов в программе много, то вопрос:
Есть ли другой выход кроме глобальных изменений программы?

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

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

Re: Вопрос по Locate

Добавлено: 11 сен 2007, 12:27
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-ов в программе много, то вопрос:
Есть ли другой выход кроме глобальных изменений программы?
Ткнуть в хелп по локейт и посмотреть - а что ж там может скрываться внутре пары загадочных символов [].

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

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

Re: Вопрос по Locate

Добавлено: 11 сен 2007, 17:50
amk
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', и т.д.

Добавлено: 11 сен 2007, 18:29
Merlin
Можно, конечно, долго распространяться о том, что старые большевики с 1917 года уговаривали

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

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

Добавлено: 15 сен 2007, 09:02
amk
Спасибо всем, пока откатилась назад.