[Решено] Получение данных из Com объекта в tmemdataset

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[Решено] Получение данных из Com объекта в tmemdataset

Сообщение rellai2 » 01.11.2016 16:25:10

Получаю данный из ком объекта:
function GetRecordSet(----): Recordset21; safecall;
я так понимаю что в лазарусе его напрямую не загрузить?
поэтому написал процедурку

Код: Выделить всё
procedure TfMain.RecordsetToDataSet(rs: OleVariant; var Dataset : TMemDataset);
var
  i,m : Integer;
  nRecords, nColumns : Integer;
  tmpvar : variant;
  fType: TFieldType;
  size : integer;
begin
  nRecords := -1;
  nColumns := -1;
  nColumns := rs.Fields.Count-1;
  nRecords := rs.RecordCount-1;
  Dataset.FieldDefs.Clear;
  Dataset.Fields.Clear;
  rs.MoveFirst;
  for m := 0 to nColumns do
  begin
    tmpvar := rs.fields(m).value;
    case VarType(tmpvar) of
        varEmpty     : fType := ftVariant;
        varNull      : fType := ftVariant;
        varSmallInt  : fType := ftSmallint;
        varInteger   : fType := ftInteger;
        varSingle    : fType := ftInteger;
        varDouble    : fType := ftLargeint;
        varCurrency  : fType := ftCurrency;
        varDate      : fType := ftDateTime;
        varOleStr    : fType := ftString;
        varBoolean   : fType := ftBoolean;
        varVariant   : fType := ftVariant;
        varUnknown   : fType := ftVariant;
        varByte      : fType := ftVarBytes;
        varWord      : fType := ftInteger;
        varLongWord  : fType := ftLargeint;
        varInt64     : fType := ftLargeint;
        varString    : fType := ftString;
        varAny       : fType := ftVariant;
        vardecimal   :
        begin
          if rs.fields(m).NumericScale = 0 then
            fType := ftInteger
          else
            fType := ftFloat
        end
    end;

    if fType = ftString then
      size :=  rs.fields(m).DefinedSize
    else
      size := 0;
    Dataset.FieldDefs.Add(rs.fields(m).Name, fType, size, false, m);
  end;

  dataset.CreateTable;
  dataset.Active:=true;
  for i := 0 to nRecords do
  begin
    dataset.Append;
    for m := 0 to nColumns do
    begin
      tmpvar := rs.fields(m).value;
      try
      if  Dataset.FieldDefs[m].DataType in [ftInteger,ftLargeint,ftSmallint] then
        Dataset.Fields[m].AsInteger:= tmpvar
      else if Dataset.FieldDefs[m].DataType in [ftFloat, ftCurrency] then
        Dataset.Fields[m].AsFloat:= tmpvar
      else if Dataset.FieldDefs[m].DataType in [ftDate, ftDateTime] then
        Dataset.Fields[m].AsDateTime:= tmpvar
      else if Dataset.FieldDefs[m].DataType in [ftString] then
      begin
       Dataset.Fields[m].AsString:=  tmpvar;
      else
       Dataset.Fields[m].AsVariant:= tmpvar;
      except
      end;
    end;
    rs.MoveNext;
  end;

end;


она берет данные из рекордсета и загружает в TMemDataSet
только данные загружаются как то криво:::
1) получаю данные в формате
vardecimal и если у него знаков после запятой 0 то тип делаю ftInteger....и получаю в данных вместо "9021" непонятные "45150961"
далее работаю со строками..
беру строку столбец(varOleStr) и забиваю ее в ftstring а он отображает только первые 3 символа по всем строкам. при этом размер поля устанавливается верно - 50 (это первый столбец где символы все на английском)
второй столбец символы на русском и английском отображает 26 символов.... (всего в нем указано 150) (когда делаю showmessage(tmpvar) отображается все отлично, когда делаю showmessage(Dataset.Fields[m].AsString) - то 3 символа)
далее беру и указываю размер столбца * 17 и на выходе получаю в первом столбце все так же 3 буквы во втором строка целиком влезает....

куда копать совсем непонятно...

Добавлено спустя 1 час 22 минуты 49 секунд:
Какая то ерунда c tmemdataset - в поле ничего не записываю, а данные все равно появляются в нем.
изменил тип поля с integer на bcd - вместо трех символов стало отображаться 7
причем поля обрезает именно после данных полей
Последний раз редактировалось rellai2 02.11.2016 13:06:00, всего редактировалось 1 раз.
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Получение данных из Com объекта в tmemdataset

Сообщение serbod » 01.11.2016 18:58:32

TMemDataset штука стремная и тормозная. Для отображения готовых данных лучше напиши свой датасет или воспользуйся виртуальным датасетом (TSnapVirtualDataset, например).
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Получение данных из Com объекта в tmemdataset

Сообщение rellai2 » 01.11.2016 19:08:38

TSnapVirtualDataset под delphi же только....?
можно ли как нить еще вопрос этот решить?
может можно причитать recordset напрямую? или еще варианты есть?

Добавлено спустя 15 часов 25 минут 29 секунд:
Заменил на TRXMemoryData стало все отлично отображаться, глюки ушли.
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: [Решено] Получение данных из Com объекта в tmemdataset

Сообщение alexs » 02.11.2016 15:27:46

rellai2 писал(а):Заменил на TRXMemoryData стало все отлично отображаться, глюки ушли.

А разве TRXMemoryData умеет поля с типом Variant?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4054
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: [Решено] Получение данных из Com объекта в tmemdataset

Сообщение rellai2 » 02.11.2016 15:35:48

по у меня факту нет полей variant я так просто описал их все...
можно удалить ни на что не повлияет
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru