А я как раз заглянул внутрь, вообще ничего общего
В принципе не трагедия, я сам для пятерки написал, но все равно спасибо.
Найдено 22 результата
- Чт 19 дек 2013 13:06
- Форум: Universal Data Access Components
- Тема: Поддержка Ehlib
- Ответы: 5
- Просмотры: 6773
- Чт 19 дек 2013 11:48
- Форум: Universal Data Access Components
- Тема: Поддержка Ehlib
- Ответы: 5
- Просмотры: 6773
Re: Поддержка Ehlib
Я так понял это код для Ehlib версии 6?
- Ср 18 дек 2013 11:51
- Форум: Universal Data Access Components
- Тема: Поддержка Ehlib
- Ответы: 5
- Просмотры: 6773
Поддержка Ehlib
Столкнулся я с задачей поддержки Ehlib грида. Там есть функции локальной сортировки и фильтрации которые просто обожают мои пользователи. С сортировкой проблем нет, а вот с фильтрацией есть вопрос и хочется уточнить как проще всего решить данную проблему.
Смысл в том что при клике на заголовке Ehlib строит по датасету список значений полей и делает визуальный фильтр как в Экселе с возможностью выбора нескольких значений. Вот у меня и возник вопрос как проще всего заполнить значениями этот фильтр. Понятно что я могу сделать букмарк, отключить у датасета все обработчики и в цикле пробежаться по всему датасету, но может есть способ красивее, Anydac ну или FireDac делает это через обращение к внутреннему источнику данных что-то типа
Возможен такой подход в unidac или сканирование датасета единственный путь?
Смысл в том что при клике на заголовке Ehlib строит по датасету список значений полей и делает визуальный фильтр как в Экселе с возможностью выбора нескольких значений. Вот у меня и возник вопрос как проще всего заполнить значениями этот фильтр. Понятно что я могу сделать букмарк, отключить у датасета все обработчики и в цикле пробежаться по всему датасету, но может есть способ красивее, Anydac ну или FireDac делает это через обращение к внутреннему источнику данных что-то типа
Код: Выделить всё
procedure TADDatasetFeaturesEh.FillSTFilterListDataValues(AGrid: TCustomDBGridEh;
AColumn: TColumnEh; AItems: TStrings);
Var
oDS: TADAdaptedDataSet;
oField: TField;
oData: TStringList;
i: Integer;
oCol: TADDatSColumn;
begin
oDS := AGrid.DataSource.DataSet as TADAdaptedDataSet;
if bFilterWithValues and (AColumn.STFilter.ListSource = nil) and (not oDS.IsEmpty) then begin
oField := oDS.FindField(AColumn.FieldName);
if oField <> nil then begin
oCol := oDS.GetFieldColumn(oField);
if oCol <> nil then begin
oData := TStringList.Create;
oData.CaseSensitive := True;
oData.Sorted := True;
oData.Duplicates := dupIgnore;
try
for i := 0 to oDS.Table.Rows.Count - 1 do
oData.Add(VarToStr(oDS.Table.Rows[i].ValueI[oCol.Index]));
oData.Sort;
AItems.AddObject('-', PopupListboxItemEhLine);
AItems.AddStrings(oData);
finally
oData.Free;
end;
end;
end;
end;
end;
- Вт 14 май 2013 06:32
- Форум: Universal Data Access Components
- Тема: CRUD на хранимках
- Ответы: 16
- Просмотры: 14202
Re: CRUD на хранимках
Это скорее фишка именно Ehlib
там существует свой собственный memtable и драйвера доступа к разным БД, посути драйвер представляет собой TUpdateSQL. Причем довольно гибкий, например можно сказать что delete или update возвращают датасет, а не просто делают exec команды написанной в DeleteSQL и UpdateSQL. Для перехвата датасета возвращаемого с сервера при этих операциях есть эвент в котором я получаю датасет, возвращенный с сервера при выполнении команды update и т.д.
Поэтому я могу из возвращенного датасета спокойно поправить memtable без реального его редактирования. Вот пример вставки договора, обратно отваливается датасет из которого я использую автоинкрементарное поле dogovor_id и рассчитанное на сервере hourcost.
Мне очень нравится данный подход, гибкость того что я могу сделать просто великолепная.
Единственная проблема это то что драйвер по сути транслирует все команды в ADO, а затем загружает результат выполнения в memtable. Это влечет за собой проблемы при банальном селекте, сначала в памяти создается TADOQuery, он открывается, а затем все копируется из TADOQuery->MemTable. И вот эта операция копирования ой какая не быстрая, я столкнулся с тем что у меня датасет на 10к записей с сервера загружается за 10сек, а затем еще 40с копируется в memtable
там существует свой собственный memtable и драйвера доступа к разным БД, посути драйвер представляет собой TUpdateSQL. Причем довольно гибкий, например можно сказать что delete или update возвращают датасет, а не просто делают exec команды написанной в DeleteSQL и UpdateSQL. Для перехвата датасета возвращаемого с сервера при этих операциях есть эвент в котором я получаю датасет, возвращенный с сервера при выполнении команды update и т.д.
Поэтому я могу из возвращенного датасета спокойно поправить memtable без реального его редактирования. Вот пример вставки договора, обратно отваливается датасет из которого я использую автоинкрементарное поле dogovor_id и рассчитанное на сервере hourcost.
Код: Выделить всё
procedure TDM.drvDogGetBackUpdatedValues(DataDriver: TADODataDriverEh;
MemRec: TMemoryRecordEh; Command: TADOCommandEh; ResDataSet: TDataSet);
begin
if Assigned(ResDataSet) then
begin
MemRec.DataValues['dogovor_id', dvvValueEh]:= ResDataSet.FieldByName('dogovor_id').Value;
MemRec.DataValues['hourcost', dvvValueEh]:= ResDataSet.FieldByName('hourcost').Value;
end;
end;
Единственная проблема это то что драйвер по сути транслирует все команды в ADO, а затем загружает результат выполнения в memtable. Это влечет за собой проблемы при банальном селекте, сначала в памяти создается TADOQuery, он открывается, а затем все копируется из TADOQuery->MemTable. И вот эта операция копирования ой какая не быстрая, я столкнулся с тем что у меня датасет на 10к записей с сервера загружается за 10сек, а затем еще 40с копируется в memtable
- Вс 12 май 2013 10:40
- Форум: Universal Data Access Components
- Тема: CRUD на хранимках
- Ответы: 16
- Просмотры: 14202
Re: CRUD на хранимках
Андрей, спасибо за пример
Реализация на OUT параметрах в принципе неплоха если делаешь проект с нуля.
У нас к сожалению сложилась ситуация когда хочется перевести клиента с Ado+Ehlib на Unidac+DevEx(Grid), не трогая весь функционал работающий на хранимках.
Есть ли возможность обработать курсор, возвращенный с сервера при процедуре вставки в БД?
Т.е именно в той реализации которую я показал?
Реализация на OUT параметрах в принципе неплоха если делаешь проект с нуля.
У нас к сожалению сложилась ситуация когда хочется перевести клиента с Ado+Ehlib на Unidac+DevEx(Grid), не трогая весь функционал работающий на хранимках.
Есть ли возможность обработать курсор, возвращенный с сервера при процедуре вставки в БД?
Т.е именно в той реализации которую я показал?
- Вт 30 апр 2013 12:48
- Форум: Universal Data Access Components
- Тема: CRUD на хранимках
- Ответы: 16
- Просмотры: 14202
Re: CRUD на хранимках
Конкретно сейчас MSSQL 2008.
Набросал примерчик SELECT
А вот так выглядит INSERT, пример не совсем реальный, просто для понимания принципа
Набросал примерчик SELECT
Код: Выделить всё
CREATE PROCEDURE [dbo].[SchetSelect] (
@KOD INT
)
AS
BEGIN
SELECT
Schet.Kod,
KodBaseLPU,
God,
Mes,
NSchet,
DSchet,
SummaVyst,
VidPom,
CASE VidPom
WHEN 1 THEN 'стац'
WHEN 2 THEN 'д.стац'
WHEN 3 THEN 'пол'
WHEN 4 THEN 'стом'
WHEN 5 THEN 'с.п.'
ELSE '-'
END as VidPomName,
Dict_Ref_BaseLPU.Naim
FROM
Schet
JOIN Dict_Ref_BaseLPU ON
Dict_Ref_BaseLPU.Kod = Schet.KodBaseLPU
WHERE
((@KOD is NULL) OR
(Schet.Kod=@KOD))
END
Код: Выделить всё
CREATE PROCEDURE [dbo].[InsertSchet] (
@NSchet nvarchar(20),
@SummaVyst numeric(15, 2)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @KOD int
select @KOD=MAX(Kod)+1 from Schet
INSERT INTO Schet (
Kod,
KodBaseLPU,
God,
Mes,
NSchet,
DSchet,
SummaVyst,
VidPom )
VALUES (
@KOD,
1,
CONVERT(int, YEAR(GETDATE())),
CONVERT(int, MONTH(GETDATE())),
@NSchet,
GETDATE(),
@SummaVyst,
3)
exec dbo.SchetSelect @KOD
END
- Пн 29 апр 2013 11:46
- Форум: Universal Data Access Components
- Тема: CRUD на хранимках
- Ответы: 16
- Просмотры: 14202
CRUD на хранимках
Подскажите пожалуйста, я пытаюсь сделать так чтобы набор данных полностью работал через ХП.
Я создал хранимку для Insert, она вставляет значение в таблицу с автоинкрементом, а последней строкой возвращает только что вставленную строку полностью, вместе с ключевым полем и всеми остальными полями, посути таже команда что используется для SELECT но возвращается только одна строка.
Я бы хотел использовать эти возвращенные данные для того чтобы обновить на клиенте датасет в который я вставил данные, так как фактически мне придет не только значение ключевого поля, но и еще рад полей которые автоматически рассчитались на сервере.
Как я могу это сделать?
Я создал хранимку для Insert, она вставляет значение в таблицу с автоинкрементом, а последней строкой возвращает только что вставленную строку полностью, вместе с ключевым полем и всеми остальными полями, посути таже команда что используется для SELECT но возвращается только одна строка.
Я бы хотел использовать эти возвращенные данные для того чтобы обновить на клиенте датасет в который я вставил данные, так как фактически мне придет не только значение ключевого поля, но и еще рад полей которые автоматически рассчитались на сервере.
Как я могу это сделать?