Найдено 22 результата

WildFrag
Чт 19 дек 2013 13:06
Форум: Universal Data Access Components
Тема: Поддержка Ehlib
Ответы: 5
Просмотры: 6773

Re: Поддержка Ehlib

А я как раз заглянул внутрь, вообще ничего общего :)
В принципе не трагедия, я сам для пятерки написал, но все равно спасибо.
WildFrag
Чт 19 дек 2013 11:48
Форум: Universal Data Access Components
Тема: Поддержка Ehlib
Ответы: 5
Просмотры: 6773

Re: Поддержка Ehlib

Я так понял это код для Ehlib версии 6?
WildFrag
Ср 18 дек 2013 11:51
Форум: Universal Data Access Components
Тема: Поддержка Ehlib
Ответы: 5
Просмотры: 6773

Поддержка Ehlib

Столкнулся я с задачей поддержки Ehlib грида. Там есть функции локальной сортировки и фильтрации которые просто обожают мои пользователи. С сортировкой проблем нет, а вот с фильтрацией есть вопрос и хочется уточнить как проще всего решить данную проблему.
Смысл в том что при клике на заголовке 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;
Возможен такой подход в unidac или сканирование датасета единственный путь?
WildFrag
Вт 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.

Код: Выделить всё

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
WildFrag
Вс 12 май 2013 10:40
Форум: Universal Data Access Components
Тема: CRUD на хранимках
Ответы: 16
Просмотры: 14202

Re: CRUD на хранимках

Андрей, спасибо за пример

Реализация на OUT параметрах в принципе неплоха если делаешь проект с нуля.
У нас к сожалению сложилась ситуация когда хочется перевести клиента с Ado+Ehlib на Unidac+DevEx(Grid), не трогая весь функционал работающий на хранимках.
Есть ли возможность обработать курсор, возвращенный с сервера при процедуре вставки в БД?
Т.е именно в той реализации которую я показал?
WildFrag
Вт 30 апр 2013 12:48
Форум: Universal Data Access Components
Тема: CRUD на хранимках
Ответы: 16
Просмотры: 14202

Re: CRUD на хранимках

Конкретно сейчас MSSQL 2008.

Набросал примерчик 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
А вот так выглядит INSERT, пример не совсем реальный, просто для понимания принципа

Код: Выделить всё

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
WildFrag
Пн 29 апр 2013 11:46
Форум: Universal Data Access Components
Тема: CRUD на хранимках
Ответы: 16
Просмотры: 14202

CRUD на хранимках

Подскажите пожалуйста, я пытаюсь сделать так чтобы набор данных полностью работал через ХП.
Я создал хранимку для Insert, она вставляет значение в таблицу с автоинкрементом, а последней строкой возвращает только что вставленную строку полностью, вместе с ключевым полем и всеми остальными полями, посути таже команда что используется для SELECT но возвращается только одна строка.
Я бы хотел использовать эти возвращенные данные для того чтобы обновить на клиенте датасет в который я вставил данные, так как фактически мне придет не только значение ключевого поля, но и еще рад полей которые автоматически рассчитались на сервере.
Как я могу это сделать?