Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Ehlib

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

Открыть новую тему     Написать ответ в эту тему

Chulpon

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем!
У меня вопрос Ehlib умеет сортировать по клику на титл Calculated field и lookup field? И как?  
Заранее  благодарен.

Всего записей: 85 | Зарегистр. 09-03-2009 | Отправлено: 11:06 09-03-2009
apnss

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Chulpon
 
это зависит от движка работы с базой : ADO - нет, SDAC - точно ДА (причем дополнительно ничего делать не нужно... ну развечто создания своего сервиса для сдака см. EhLib\DataService)
 
ну или работать через мемтейбл , но это  - изврат  

Всего записей: 708 | Зарегистр. 26-02-2002 | Отправлено: 18:20 09-03-2009
Chulpon

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо .
Но я исользую TibclientDataset из палитри IBX + delphi 6  Добавил USes EhlibIbx.pas но это не помогло.. потом поправил EhlibCds,pas под IbclientDataset но теперь работает фильтр и сортировка.. Но Лукап и Калкулатед полям нет.. Говорит Not Found при сортировке как быть мне? Создаю лукап и калкулатед динамически..
И Еще один вопрос  
когда я фильтр делаю по каком то полю да
там есть содержить такой значение (095)-8798-79-78. Если фильтре так напишу ((095)-8798-79-78  в гридеЕх) то ругается на Error in expression: ( в чем проблема ?
а если в апостр '(095)-8798-79-78' то нормально пашет. Но мне надо чтобы пользователь из списка выбрал (095)-8798-79-78 и автоматом фильтровал.. Автоматом я сделал. Но осталось  
2 задач решить
1) Лукап и Калкулатед
2) Error in Expression(095)-8798-79-78
Заранее огромное спасибо.

Всего записей: 85 | Зарегистр. 09-03-2009 | Отправлено: 16:54 11-03-2009
asdnsd



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста как можно реализовать через ехГрид следующее:
 
Грид отображает таблицу заказов (например), она содержит id покупателя из таблицы покупателей и цену. Как можно сделать чтобы отображался не id а ФИО из таблицы покупателей?
 
Поле в гриде указывает на Lookup поле из датасета грида.

Всего записей: 447 | Зарегистр. 21-05-2007 | Отправлено: 20:08 26-03-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Chulpon
По поводу апострофов можно попытаться самостоятельно их выставить, в том случае если их не найдено, а можно попытаться ещё доки почитать по синтаксису который используется. Если это скуль то по синтаксису скуля.
 
Добавлено:
asdnsd
У лукопа в прюнципе два поля - данные которые вы берёте и связанные данные которые показывать надо.
 
Добавлено:
asdnsd
Но это в том случае если у связного датасета имена полей ID совпадают. А так получается три.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 20:48 26-03-2009
Chulpon

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Chulpon
По поводу апострофов можно попытаться самостоятельно их выставить, в том случае если их не найдено, а можно попытаться ещё доки почитать по синтаксису который используется. Если это скуль то по синтаксису скуля.  

Как я ничего не делаю он сам автоматом фильтр делает правильно..
Даже в демо Ehlib такой ошибка выдает.
если знаешь помоги..
в исходниках ко что убрал но это не помогло

Всего записей: 85 | Зарегистр. 09-03-2009 | Отправлено: 17:32 31-03-2009
spambog1234

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
там есть содержить такой значение (095)-8798-79-78. Если фильтре так напишу ((095)-8798-79-78  в гридеЕх) то ругается на Error in expression: ( в чем проблема ?  
а если в апостр '(095)-8798-79-78' то нормально пашет. Но мне надо чтобы пользователь из списка выбрал (095)-8798-79-78 и автоматом фильтровал..  

 
Проблема в том, что скобки распознаются как выражение вида IN(value1,value2,value3) и т.д. Сам бы хотел от этого избавится. В большинстве случаев DBGridEh пытается сам распознать фильтр, но со скобками у него получается ужасно.
 

Код:
Значения в ячейке могут выглядеть как: "1", ">=1", ">1 AND <=5", "%TestStr%".  
 
Текст выражения в ячейке фильтра должен иметь следующий формат:
 
[Operator1] Operand1 [)] [AND|OR Operator2 Operand2 [)] ]
 
Где:
OperatorX - один из значений: [ = | <> | != | > | < | >= | <= | ~ | !~ | in ( ].
OperandX - число, дата, строковое выражение, либо, для оператора 'IN', - список значений, разделенных запятыми.
 
Например:
1
>=1
>1 AND <=5
~ TestStr%
!~ TestStr_
in (1,2,3,4,5,6) and >100
in (Str1,Str2,Str3)
 

 
Добавлено:
Возникла проблема, очень большие тормаза при вызове фильтра. Видимо это связано с его заполнением. В таблице порядка 20 тыщ записей, в фильре тыщи 3. Когда начинаешь разварачивать фильтр все виснет где то на минуту, приложение уходит в 100% загруз проца, видимо в ручную перебирает датасет. Никакой нагрузки в этотм моент на сервер баз данных нет, никаких запросов с DISTINCT так же не посылается. Что можно сделать?
 
Добавлено:
Забыл добавить, запрос с DISTINCT по тому же полю что и фильтр проходит меньше секунды.

Всего записей: 1 | Зарегистр. 10-04-2009 | Отправлено: 19:40 10-04-2009
Asm64D



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Люди, говорят для EhLib есть справка на русском языке, выложите пожайлуста.

Всего записей: 1312 | Зарегистр. 24-02-2008 | Отправлено: 11:53 24-04-2009
fcdobpiy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Asm64D
держи http://slil.ru/27481231

Всего записей: 410 | Зарегистр. 22-08-2005 | Отправлено: 12:22 24-04-2009
Asm64D



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
fcdobpiy
Спасибо!!!

Всего записей: 1312 | Зарегистр. 24-02-2008 | Отправлено: 12:58 24-04-2009
ViKingVT



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Кто-нить сталкивался с такой ошибкой: после запроса к БД, данные показываются в таблице, настроены автофильтры на некоторых полях. Всё работает отлично, но стоит использовать один из автофильтров, а затем сформировать новый взапрос к БД - вываливается ошибка "List index out of bounds". В чем трабл?

Всего записей: 20 | Зарегистр. 05-12-2005 | Отправлено: 09:31 14-05-2009
Cryogen2003



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Привет всем. Есть немного нестандартный вопрос, можно ли как-нибудь заставить компоненты EhLib отрисовываться несколько по другому, ну например чтобы они отрисовывались с помощью тем из DevExpress?

----------
Холодильники мы

Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 09:35 14-05-2009
Vladislav_Matvienko

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день.
 
Очень радует то, что хорошо известная библиотека ЕhLib сейчас более-менее активно развивается и поддерживается автором и хочется помочь своими "пятью копейками" в ее развитии.
 
Я использую связку TIBXDataDriver + TMemTableEh + TDBGridEh. Версия EhLib 4.4.48
 
Я попытался использовать серверную фильтрацию и сортировку, и если я правильно понял, то в текущей версии пока ее можно использовать только для простейших случаев для полей из основной таблицы. Для вычисляемых в select полей, полей на основе вложенных подзапросов, полей с алиасами т.д. в текущем виде серверная сортировка работать как я понял не будет?
 
С серверной сортировкой проблем гораздо меньше чем с фильтрацией, т.к. можно использовать порядковые номера столбцов в конструкции ORDER BY. Для выполнения серверной фильтрации нужно знать не только имя столбца в результате SQL запроса, а и само SQL выражение которое сформировало столбец.
 
В коде функции GetExpressionAsFilterString в файле DbUtilsEh при построении выражения для серверной фильтрации используется или имя поля или свойство Origin, если оно заданно, но судя по справке это свойство обычно пустое.
Help
The Origin property is only implemented for BDE-enabled datasets, which appear only in the Windows product.
 
Не знаю как при работе через ADO или FIB'ы, но по крайней мере при работе через IBX у меня всегда так.
 
Что бы решить задачу построения правильного SQL выражения для сортировки на сервере для произвольных полей я набросал на основе своего старого кода функцию, которая парсит Select SQL, вычленяя выражения для формирования полей, сопоставляет их с TField в DataSet и записывает в соответствующие TField датасета в свойство Orign выражение из SQL запроса, формирующее это поле. При разборе учитываются однострочные и многострочные комментарии, алиасы указанные через пробел или через AS, кавычки в именах полей, алиасов, строковые константы и т.д.
Таким образом появляется возможность корректно строить запросы на фильтрацию практически для любых по сложности полей, в том числе с арифметическими или строковыми операциями, функциями, с полями на основе вложенных подзапросов и т.д.
 
Проблемными являются запросы с использованием UNION, т.к. в этом случае думаю что невозможно сформировать условие сортировки на сервере - только на клиенте и запросы типа select таблица1.*, (вложенный подзапрос без явного алиаса), таблица2.* from ..., т.к. здесь проблематично сопоставить поля SQL запроса с полученными полями в DataSet.
Также нюансом является то, что если поля в DataSet создаются динамически, то присвоенные значения Orign теряются после переоткрытия.
 
Модуль uEhMyUtils.pas выкладываю у себя по адресу:
http://www.plaincad.com/EhLiB
В этой же папке проект для UnitTest работы модуля.
Эти модули можно свободно использовать, распространять и редактировать. Идеально было бы всем миром его протестировать, подоптимизировать и в идеале, возможно, включить в ehlib.
 
Алгоритм использования:
1. Сделать Open для TMemTableEh.
2. Вызвать SetFieldOrigin(lMemTable, MainSQL);
Где MainSQL по сути тот Select SQL из связанного объекта SQLDatadriver.
3. Все... Теперь серверная фильтрация и сортировка должна работать (при условии исправления функции procedure TMTEDatasetFeaturesEh.ApplyFilter(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean) как описано ниже).
 
Замечания:
1. Проверенно, работает для вычисляемых полей, полей на основе вложенных подзапросов и т.д. Я использую связку TIBXDataDriver + TMemTableEh + TDBGridEh
 
3. Для правильной работы серверной фильтрации никто не отменял наличие строки
whrere
 

Код:
/*Filter*/ (1=1)

 
в Select запросе в TIBXDataDriver;
 
и подключенного в uses модуля EhLibMTE
 
4. В функции TMTEDatasetFeaturesEh.ApplyFilter модуля EhLibMTE.pas (Build 4.4.05) нужно обязательно заменить строки начиная с
 

Код:
    end else if (DataDriver is TSQLDataDriverEh) then

 
(у меня это строка № 500), на

Код:
 
    end else if (DataDriver is TBaseSQLDataDriverEh) then
    begin
      ApplyFilterForSQLDataDriver(TCustomDBGridEh(Sender),
        TSQLDataDriverEh(DataDriver), DateValueToSQLString);
        DataSet.Close;
        DataSet.Open;
    end;
  end;
 

 
В ранних версиях модуля EhLibMTE.pas (до (Build 4.4.05) )нужно подобную замену сделать и для функции TMTEDatasetFeaturesEh.ApplySorting
 
5. После однократного применения фильтра или сортировки - все перестает работать. Да есть такая багофича связана с тем что после переоткрытия MemTable, значения Origin теряются так как Fileds пересоздается. Вариантов решения проблемы вижу два
1. Вызывать SetFieldOrigin(lMemTable, MainSQL) на событии AfterOpen для lMemTable
2. Запретить удалять столбы при переокрытии lMemTable.
Напрямую как сделать это не нашел. Использовал след. код после первого открытия MemTable:

Код:
 
type  
  _TCrackTDataSet = class(TDataSet);
...
_TCrackTDataSet(lMemTable).SetDefaultFields(false);
 

 
Вроде как все.
 
Если мои выкладки верны и я ничего глобального не упустил из виду, то модуль может быть полезен многим. Буду рад, если пригодится.
 
Жду замечаний. Может эту задачу можно решить как-то по другому, интересно узнать.
 
--
Vladislav Matvienko
http://www.PlainCAD.com - графический редактор для создания схем

Всего записей: 1 | Зарегистр. 22-10-2006 | Отправлено: 02:59 07-06-2009
fcdobpiy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladislav_Matvienko
ты бы изложил все это Дмитрию Большакову, автору ehlib. Напиши ему это письмом. Недавно с ним общался - отвечает на письма, адекватно себя ведет, обсуждает проблему. (не в пример сообществу far -) )

Всего записей: 410 | Зарегистр. 22-08-2005 | Отправлено: 07:40 08-06-2009
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Есть TDBLookupComboboxEh, как узнать, состояние. Он уже выпал или закрыт?
 
2. Вопрос по автовыпаданию списка у TDBLookupComboboxEh.  
Пользователь использует клавишу Tab или Enter лоя перемещения по компонентам ввода в окне. Когда пользователь переходит на DBLookupComboboxEh, то этот компонент должен автоматически раскрыться. Тоже самое и мышкой, если кликнуть мышкой по компоненту, то он должен сразу же раскрыться.
Как это корректно реализовать?
 
А то вот такая канитель:
На форме несколько TDBLookupComboboxEh
Когда нажимаю кнопку справа для того, чтобы список раскрылся, то список раскрывается и сразу же закрывается. Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет. Никаких событий у TDBLookupComboboxEh нет, кроме тех, что опишу ниже. Если щёлкать не по кнопке, а непосредственно по самому элементу, то такой проблемы не наблюдаю.
 
CodeGear™ RAD Studio 2007 Version 11.0.2902.10471
EhLib 4.3 Build 4.3.21 Russian version
 
При создании окна всем этим выпадающим спискам присваивается событие (процедура) DBLookupComboboxEhDropDown

Код:
 
procedure TForm1.DBLookupComboboxEhDropDown(sender: TObject);
begin
  if sender is TDBLookupComboboxEh then
    (sender as TDBLookupComboboxEh).DropDown;
end;
....
 
В событии создания формы
  for i := 0 to ComponentCount-1 do
    if (Components[i] is TDBLookupComboboxEh) then
      (Components[i] as TDBLookupComboboxEh).OnEnter    := DBLookupComboboxEhDropDown;
 


----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 13:23 12-06-2009
fcdobpiy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
X11
1.
TDBLookupComboboxEh.ListVisible  унаследовано от TDBLookupCombobox  
 
2. добавь  обработчик события OnButtonClick
что то типо этого  
if (sender as TDBLookupComboboxEh).ListVisible then Handled:=true;
 
но появится такой баг, что последующие клики мышкой по кнопке не свернут лист. но тут думаю добавишь еще один флаг для проверки

Всего записей: 410 | Зарегистр. 22-08-2005 | Отправлено: 14:18 12-06-2009
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
кошмар %) а попроще нельзя?
 

Цитата:
if (sender as TDBLookupComboboxEh).ListVisible then Handled:=true;  

а что значит Handled:=true?

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 16:39 12-06-2009
fcdobpiy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
из справки по ehlib про событие OnButtonClick

Цитата:
 Установите Handled в True если вы не хотите чтобы контрол отображал выпадающий список.  

 

Цитата:
кошмар %) а попроще нельзя?

это про 2 пункт я надеюсь ? ))
проще как мне кажется нельзя, т.к.отловить вход в объект при передаче фокуса (tab, enter) мы кроме как  в OnEnter не сможем. а встроенного свойства влияющего на это я не вижу, даже в более новом ehlib
 
да и получаются у нас ситуации
а) ничего не добавляя в обработку - клик мышкой в любую облать объекта раскрывает лист, клик по кнопке также раскрывает. а вот при передаче фокуса по tab не раскрывает
б)добавляем твой код - список раскрывается всегда, но имеем 2 бага "Когда нажимаю кнопку справа для того, чтобы список раскрылся, то список раскрывается и сразу же закрывается. Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет."
в) к твоему коду добавляем обработку события клика на кнопку (что приведен выше) - работает все , но остался один баг "Когда щёлкаешь уже по кнопке второй раз и более, то эффекта самозакрывания нет."
 

Всего записей: 410 | Зарегистр. 22-08-2005 | Отправлено: 17:02 12-06-2009 | Исправлено: fcdobpiy, 17:05 12-06-2009
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
fcdobpiy, +1 за   if TDBLookupComboboxEh(sender).ListVisible then Handled:=true;

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 18:30 12-06-2009
big big

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет!
Есть база Interbase, вывожу ее в DBGridEh, в ней есть поле COUNTRY, в котором хранятся названия стран, нужно в ячейку напротив названия страны вывести флаг соответсвующий стране в ячейке. В DBGridEh есть возможность выводить картинку из ImageList, но в ImageList картинке присваивается только числовой индекс. Может кто знает как можно проставить соответствия названия стран индексу в ImageList?
Заранее спасибо.
 
Добавлено:
Вопрос снимаю, разобрался.
Только вот новая проблема. Если ставлю ShowTextAndImage:=true, все равно выводится только картинка, что может быть?
 
Добавлено:
Еще одна проблема с фильтрацией.
Есть DBgridEh, поставил в нем STFilter, работает, фильтрует, но после того как отфильтровал, в списке для фильтрации доступно только то значение по которому уже отфильтровалось, вместо всех возможных. Кто с таким сталкивался?

Всего записей: 18 | Зарегистр. 15-06-2009 | Отправлено: 20:04 15-06-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Ehlib


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru