Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Ehlib

Автор: alexssss1
Дата сообщения: 19.03.2010 09:13
Vladkyr, понял, спасибо. А еще такой вопрос. FetchAllOnOpen - это свойство действует только если я привязал MemTableEh к DBGrid, правильно я понял? Т.е. если я просто хочу открыть MemTableEh , сделать какой-то поиск по записям и при этом MemTableEh никак не связан с DBGrid, то FetchAllOnOpen здесь не нужен?!
Автор: Vladkyr
Дата сообщения: 19.03.2010 09:14
alexssss1
Правильно
Автор: alexssss1
Дата сообщения: 19.03.2010 09:15
Ок, выручили. буду провобать, еще раз спасибо.
Автор: ErshovSP2004
Дата сообщения: 19.03.2010 19:45
alexssss1

Цитата:
Я сейчас вышел из этой ситуации так - после каждого обновления набора данных, просто делаю перебор записей от 1-й до последней и тогда полоса прокрутки показывает реально сколько записей и кол-во, возвращаемое RecordCount (после перебора) также показывает верное значение. Но мне не нравится этот способ. Рылся в опциях компонента dbgrideh но ничего по этому поводу не нашел.

если уж архи необходимо общее кол-во записей, то фетчить весь набор данных крайне не желательно, лучше выполни ещё один SQL запрос с подсчетом кол-ва записей и условием взятым из локального фильтра. И выполняй этот запрос при изменении фильтра. Береги ресурсы.
Автор: alexssss1
Дата сообщения: 22.03.2010 08:42

Цитата:
фетчить весь набор данных крайне не желательно


почему так? в чем тогда отличие, если я делал query.open для обычного dbgrid и у меня выводились все записи, а теперь при аналогичной команде + FetchAllOnOpen - тоже самое ?
Автор: ErshovSP2004
Дата сообщения: 22.03.2010 18:06
alexssss1
потому что "query.open" это инициализация набора данных и ни одна современная БД не вернёт его весь, а лишь столько сколько запросили например при выводе в дбгриде или если жестко указано сколько записей прочитать (FetchRows)
Автор: alexssss1
Дата сообщения: 23.03.2010 10:06
Это я понимаю, но у меня в query четко указан запрос со всеми условиями, допустим выборка на 100 записей. Почему же я получаю только 40?
Автор: Odysseos
Дата сообщения: 23.03.2010 12:35
alexssss1

Вы путаете select ("отбор", если угодно), и fetch (выборку). Можно как угодно точно отфильтровать нужные записи - и в where, и в join'ах, и в first ... skip - но это не выборка записей на клиента. После выполнения select'а на клиентскую сторону не возвращается ничего - кроме статуса, случилась ошибка или нет. И только клиент может потом сказать - "перешли-ка мне первую запись из полученного набора"/"перешли-ка мне следующую запись из полученного набора". Здесь "клиент" - клиентская dll-ка, работающая с сервером на низком уровне. Ее, в свою очередь, используют более высокоуровневые "клиенты" - idapi.dll (ядро BDE) + Delphi-обертка над BDE (TTable и TQuery), dbExpress, т.н. "нативные" компоненты, а потом может быть и еще один уровень - TClientDataSet или TMemTableEh через соотв. провайдер... Как, с какими особенностями каждый из этих "стеков" выполняет fetch - надо разбираться отдельно. Какие-то могут делать всегда полный fetch, какие-то - поступать "умно", подкачивая только те строки, которые клиент реально захотел увидеть (например - по мере прокрутки scrollbar'а в сетке) - с разной степенью "умности", причем.
Автор: alexssss1
Дата сообщения: 23.03.2010 15:21
Odysseos, понятно... у меня как раз memtable связан с datasource, который ссылается на Query (dbexpress). Я делаю select в этом самом Query и если верну кол-во записей, которые получились в итоге, то query.recordcount покажет мне все 100, а memtable (который в принципе ссылается на этот самый query) только видимую часть сетки dbgrid. такое положение дел меня смутило мягко говоря, но раз так то и так. буду теперь знать.
Автор: EugeneBoss3
Дата сообщения: 26.03.2010 04:09
Знатоки, подскажите как правильно связать memtable и FIBDataset, чтобы нормально функционировала локальная сортировка?
Автор: snike555
Дата сообщения: 26.03.2010 11:33
Раньше использовал версию Ehlib 5.0.13 и у меня отлично работал следующий код (для TOracleDataSet):

Код: procedure TFrmOperJurnal.DBGridEhOperJurnalApplyFilter(Sender: TObject);
var
i : Byte;
s : String;
begin
s := '';
with DBGridEhOperJurnal do
begin
for i := 0 to Columns.Count - 1 do
with Columns[i].STFilter do
if ExpressionStr <> '' then
if ExpressionStr = '=Null' then
s := s + ' and ' + DataField + ' is null '
else if ExpressionStr = '<>Null' then
s := s + ' and ' + DataField + ' is not null '
else
s := s + ' and ' + DataField + ' = ' + if_then(IsIntNumber(VarToStr(GetOperand1)), VarToStr(GetOperand1), ''''+VarToStr(GetOperand1)+'''');
end;
O_OperJurnal.SetVariable('qFilter', s);
O_OperJurnal.Refresh;
end;
Автор: EugeneBoss3
Дата сообщения: 28.03.2010 03:57
snike555

Цитата:
O_OperJurnal.SetVariable('qFilter', s);

Код понятен, но O_OperJurnal - это что?
Автор: snike555
Дата сообщения: 28.03.2010 21:58
EugeneBoss3
O_OperJurnal - это TOracleDataSet
Автор: zakov
Дата сообщения: 02.04.2010 16:12
Народ, подскажите! Не открываются source файл в delphi 7 по щелчку мыши и нажатой CTRL на именах классов EhLib... Что у меня не так установлено... (EhLib 5.0 FS). Причем ставил одинаково, но на одной машине открываются, а на другой них...
Автор: volser
Дата сообщения: 02.04.2010 16:35
zakov
Не прописан путь к исходникам.
Автор: zakov
Дата сообщения: 02.04.2010 16:41

Цитата:
zakov
Не прописан путь к исходникам.


Прописан Tools\Enviroment Options\Library
и в Library path и в Browsing path

где еще их надо прописть (в прописанной папке содержатся соответствующие файлы *.pas)
Автор: volser
Дата сообщения: 02.04.2010 19:12
zakov
Попробуйте сделать build проекта.
Автор: zakov
Дата сообщения: 02.04.2010 21:05

Цитата:
zakov
Попробуйте сделать build проекта.


Создаю новый проект, бросаю на форму компоненты EhLib, компиляю - ничего не меняется

Добавлено:
После долгих танцев с бубном, проблема решилась переустановкой Delphi и компонентов... (так и не понял почему???)

Подскажите, как в TDBGridEh изменить цвет фона выделения???

Добавлено:
Снимаю вопрос...

procedure TformSotrs.gridExSotrsDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin
inherited;
with TDBGridEh(Sender) do begin
if gdSelected in State then
Canvas.Brush.Color := clRed;
DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;
Автор: Odysseos
Дата сообщения: 02.04.2010 23:20
zakov

Подскажите, как в TDBGridEh изменить цвет фона выделения???

Повторюсь (слегка видоизменив под ситуацию):

1. объявляем свой класс-наследник от TDBGridEhStyle (например, TMyDBGridEhStyle);
2. наследуем его метод HighlightDataCellColor;
3. в нем вызываем родительский метод, а потом проверяем состояние ячейки (также можно проверить и свойство InMultiSelect - если нужно как-то особо подсвечивать множественное выделение, а не только текщую строку) и в зависимости от этого выставляем цвет по желанию (естественно, поменять можно не только цвет - что угодно), и:


Код:
begin
Result := inherited HighlightDataCellColor(AGrid,
ACol, ARow, DataCol, DataRow,
Value, AState, InMultiSelect,
AColor, AFont
);

if Result and ([gdFocused] * AState = [gdFocused]) then
AColor := <желаемый цвет строки>;
end;
Автор: zakov
Дата сообщения: 02.04.2010 23:52
To Odysseos

Спасибо, очень доходчиво...
+1000
Автор: snike555
Дата сообщения: 08.04.2010 12:33
Если кого интересует с вопросом по обработке события фильтра мне помогли тут http://www.sql.ru/forum/actualthread.aspx?tid=747537&hl=cheese
Автор: EugeneBoss3
Дата сообщения: 20.04.2010 05:29
Коллеги, помогите разрулить ошибки в хранимых процедурах. Пытаюсь поюзать Вариант использования КЛАДР Андрея Дмитриева, но при созании базы выдает ошибку.
[more=код]
/*******************************************************************************
The next statement causes the following error:

Invalid token.
invalid request BLR at offset 356.
Procedure GET_FULLADDRESS_2 is not selectable (it does not contain a SUSPEND statement).
Error while parsing procedure GET_ADDRESS_LIST_2's BLR.
*******************************************************************************/
ALTER PROCEDURE GET_ADDRESS_LIST_2 (
SRCH_STR VARCHAR(40),
ADDRESS_TYPE SMALLINT,
MAX_COUNT SMALLINT)
RETURNS (
ADR_REG SMALLINT,
ADR_ID BIGINT,
ADR_FULLNAME VARCHAR(500))
AS
DECLARE VARIABLE CNT SMALLINT;
BEGIN
IF (:ADDRESS_TYPE IS NULL) THEN ADDRESS_TYPE = 0;
IF (MAX_COUNT IS NULL) THEN MAX_COUNT = 100;
IF ((:MAX_COUNT > 100) OR (:MAX_COUNT < 5)) THEN MAX_COUNT = 100;
CNT = 0;
FOR
SELECT A.ADDRESSREGION_ID, A.ADDRESS_ID
FROM KLADR_ADDRESS_2 A
WHERE (A.ABBREV_LEVEL < 5) AND UPPER(A.ADDRESS_NAME) LIKE :SRCH_STR
ORDER BY A.ADDRESSREGION_ID
INTO :ADR_REG, :ADR_ID
DO BEGIN
SELECT SA FROM GET_FULLADDRESS_2(:ADDRESS_TYPE, :ADR_REG, :ADR_ID)
INTO :ADR_FULLNAME;
SUSPEND;
CNT = :CNT + 1;
IF (:CNT > :MAX_COUNT) THEN EXCEPTION EXC_MANYVALUES;
END
END
;

/*******************************************************************************
The next statement causes the following error:

Invalid token.
invalid request BLR at offset 394.
Procedure GET_FULLADDRESS_20 is not selectable (it does not contain a SUSPEND statement).
Error while parsing procedure GET_ADDRESS_LIST_20's BLR.
*******************************************************************************/
ALTER PROCEDURE GET_ADDRESS_LIST_20 (
SRCH_STR VARCHAR(40),
ADDRESS_TYPE SMALLINT,
MAX_COUNT SMALLINT)
RETURNS (
ADR_REG SMALLINT,
ADR_ID BIGINT,
ADR_VERS SMALLINT,
ADR_FULLNAME VARCHAR(500))
AS
DECLARE VARIABLE CNT SMALLINT;
BEGIN
IF (:ADDRESS_TYPE IS NULL) THEN ADDRESS_TYPE = 0;
IF (MAX_COUNT IS NULL) THEN MAX_COUNT = 100;
IF ((:MAX_COUNT > 100) OR (:MAX_COUNT < 5)) THEN MAX_COUNT = 100;
CNT = 0;
FOR
SELECT A.ADDRESSREGION_ID, A.ADDRESS_ID, A.ADDRESS_VERSION
FROM KLADR_ADDRESS_20 A
WHERE (A.ABBREV_LEVEL < 5) AND UPPER(A.ADDRESS_NAME) LIKE :SRCH_STR
ORDER BY A.ADDRESSREGION_ID
INTO :ADR_REG, :ADR_ID, :ADR_VERS
DO BEGIN
SELECT SA FROM GET_FULLADDRESS_20(:ADDRESS_TYPE, :ADR_REG, :ADR_ID, :ADR_VERS)
INTO :ADR_FULLNAME;
SUSPEND;
CNT = :CNT + 1;
IF (:CNT > :MAX_COUNT) THEN EXCEPTION EXC_MANYVALUES;
END
END
;

[/more].
Автор: Odysseos
Дата сообщения: 20.04.2010 09:26
EugeneBoss3

В коде создания этих процедур (который наверняка вот такой: create procedure ... as begin end;) между begin и end вставьте suspend;.


...Для вопросов по Interbase/Firebird предусмотрена отдельная тема.
Автор: andrey1406
Дата сообщения: 22.04.2010 19:04
Здравствуйте! Подскажите пожалуйста по SpecRow у DBLookupComboboxEh.
EhLib 3.6, в ListSource использую dataset ADOQuery, плюс есть SpecRow. Проблема в том, что в списке, двигаясь курсором вверх, перед SpecRow происходит одно лишнее нажатие на кнопку. Т.е. стоим на последней записи dataset-а, жмем ‘вверх’ – ничего, жмем еще раз – попали на SpecRow. Как от этого избавится?
Или – как программно встать курсором на SpecRow?
Автор: snike555
Дата сообщения: 05.05.2010 06:21
Как для CheckBox в DBGridEh установить значения 2 и 1, а не 1 и 0?
Пробовал в KeyList прописывать
2
1
но не работает версия 5.2.89
Автор: Vladkyr
Дата сообщения: 05.05.2010 08:23
Под версией 4.5 этот вариант работает нормально. Т.е. если в KeyList прописать 2 и 1, то 2 - будут выделены, а 1 - нет.
Автор: HM47
Дата сообщения: 27.05.2010 08:31
Всем привет. Можно ли использовать нумерацию страниц при печати через компонент PrintDBGridEh, записей много нужна нумерация листов. В описании к EhLib написано что можно использовать макросы, которые позволят добавить номер текущей страницы. Но как этот макрос выглядит? и куда его вписывать? или еще как то можно включить нумерацию?
Автор: Vladkyr
Дата сообщения: 31.05.2010 13:14
Добрый день.
Никто не сталкивался с такой проблемой? При использовании TMemTableEh и удалении из DbGridEh строчек методом grdid.SelectedRows.Delete
удаляются почему-то сразу 2 строки: 1 и последняя.
Алгоритм такой:
1) Имеем DbGridEh, TMemTableEh и DataSource связывающий их.
2) В TMemTableEh создаем одно поле (не важно какое)
3) В гриде выставляем свойства dgRowSelect и dgMultiSelect в True
4) Далее добавляем в TMemTableEh несколько строк. В моем случае так:
with MemTableEh do begin
AppendRecord(['1']);
AppendRecord(['2']);
AppendRecord(['3']);
AppendRecord(['4']);
end;
5) кидаем кнопку на форму и пишем реакцию на нажатие:
DbGridEh.SelectedRows.Delete;
6) Запускаем, обязательно встаем на первую строку грида и нажимаем кнопку удаления.
7) У меня после этого убираются сразу 1 и последняя строки.
Если выделить любую другую строку (не 1-ю) - то все нормально, удаляется только выделенная.
Такое поведение у меня и на версии EhLib 5.2.84 и на 4.5.62.
У всех такое же поведение?
Автор: Ruslang
Дата сообщения: 11.06.2010 11:06
Использую DbGridEh и два PopupMenu.
Хочу чтобы при щелчке правой кнопкой мыши на заголовке таблицы выпадал первый Popup, а при щелчке правой кнопкой в самой таблице выпадал второй PopupMenu.
В самом компоненте присвоил DbGridEh.PopupMenu:=PopupMenu1;
В заголовке Columns[0] присвоил PopupMenu2.

Теперь при щелчке правой кнопкой мыши (что в заголовке, что в внутри таблицы) всегда появляется меню PopupMenu1.
Что я делаю не так?

PS. Ehlib 5.0, BDS 2006
Автор: A_V
Дата сообщения: 15.06.2010 18:44
Ruslang
Не знаток Eh'а, надо конечно в исходники глянуть, но в качестве быстрого и тупого решения можно повесить на PopupMenu1.OnPopup что-то типа того:


Код:
if ActiveControl = MyGrid then
with Mouse, MyGrid, ClientToScreen(Point(0,0)) do
if (Columns.Count > 0) and
(CursorPos.Y < Y + Columns[0].CalcRowHeight) and
(CursorPos.X < X + DataRect.Right)
then
PopupMenu2.Popup(CursorPos.X, CursorPos.Y);

Страницы: 1234567891011121314151617181920212223

Предыдущая тема: Конвертация char в ASCII код; c


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.