Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Иногда, в процессе отладки приложения при работе с наборами данных бывает необходимо отобразить содержимое набора.  Это не всегда просто сделать, особенно, если DataSet формируется динамически в коде программы. Для того, что бы упростить задачу я написал специальную функцию, которая использует систему логгирования CodeSite.

procedure SendDataSet(aDataSet: TDataSet; aFields: TStrings = nil);
var
  I: Integer;+-
  sLogFldType, sLog: string;
  bm: TBookmark;
  bln: Boolean;
begin
  if not aDataSet.Active then
    Exit;

  sLog := '';
  sLogFldType := '';

  for I := 0 to aDataSet.Fields.Count - 1 do
  begin
    if not Assigned(aFields) then
      bln := True
    else
      bln := aFields.IndexOf(aDataSet.Fields[I].FieldName) > -1;

    if bln then
    begin
      sLog := sLog + Format('%s', [aDataSet.Fields[I].FieldName]) + ' | ';
      sLogFldType := sLogFldType + GetEnumName(TypeInfo(TFieldType),
        Ord(aDataSet.Fields[I].DataType)) + ' | ';
    end;
  end;

  CodeSite.SendNote(aDataSet.Name);
  CodeSite.Send('sLog', sLog);
  CodeSite.Send('sLogFldType', sLogFldType);

  bm := aDataSet.GetBookmark;
  aDataSet.DisableControls;

  aDataSet.First;

  while not aDataSet.Eof do
  begin
    sLog := '';
    for I := 0 to aDataSet.Fields.Count - 1 do
    begin
      if not Assigned(aFields) then
      begin
        sLog := sLog + ' | ' + aDataSet.Fields[I].AsString;
      end
      else
      begin
        if aFields.IndexOf(aDataSet.Fields[I].FieldName) > -1 then
          sLog := sLog + ' | ' + aDataSet.Fields[I].AsString;
      end;
    end;

    CodeSite.Send('sLog', sLog);
    aDataSet.Next;
  end;

  try
    if aDataSet.BookmarkValid(bm) then
      aDataSet.GotoBookMark(bm); //
  finally
    aDataSet.FreeBookMark(bm);
    aDataSet.EnableControls;
  end;

end;

Ничего особо сложного здесь нет. В качестве параметров передаётся набор данных и опционально список полей.

Вызов осуществляется примерно так.

var
 sl: TStrings;
begin
      sl:= TStringList.Create;
      try
      sl.Add('RecId');
      sl.Add('DateAct');
      sl.Add('SummDolgUp');
      sl.Add('SummDolgDown');
   
      SendDataSet(DMNewCalc.adt155Rcd, sl);

      finally
       sl.Free;
      end;
end;

А результат, соответственно так:

DataSetLog

Как видите, в логе последовательно выводятся название DataSet’а, список полей, их типы и значения. При желании  значения строки можно отформатировать таким образом, что бы все однотипные значения были одинаковой ширины. На практике у меня такой необходимости не возникло, всё и так было достаточно читабельно.


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика