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
причем поля обрезает именно после данных полей