![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
отрицательные числа отображаются как положительные
victor_ch © (2003-08-05 10:44:00)
Добрый день Всем!!!
Столкнулся с такой проблемой: в базе данных у меня есть в каком то поле есть как отрицательные значения так и положительные, но вот при выводе значений этого поля в какой то элемент управления типа DBGrid,DBedit, итд - отрицательные значения отображаются как положительные т.е отсутствует знак "-", тип поля в базе MSSQL decimal, тип поля в Delphi TIntegerField.
Работаю через ADO компоненты, может быть в них есть какая то настройка, для правильного отображения отрицательных значений
MW8 (2003-08-07 17:13:00) [1]
в модуле adodb.pas есть ошибки что касается этой проблемы
она связана с работой с Variant
function TCustomADODataSet.GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean;
...
procedure VarToBuffer;
...
у них так
ftLargeInt: LargeInt(Buffer^) := Decimal(Data).Lo64;
а надо так
ftLargeInt:
if Decimal(Data).sign > 0 then
LargeInt(Buffer^) := -1*Decimal(Data).Lo64
else
LargeInt(Buffer^) := Decimal(Data).Lo64;
...
procedure TCustomADODataSet.SetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean);
...
procedure BufferToVar(var Data: OleVariant);
...
ftLargeInt:
begin
TVarData(Data).VType := VT_DECIMAL;
у них так
Decimal(Data).Lo64 := Int64(Buffer^);
а надо так
if LargeInt(Buffer^) < 0 then
begin
Decimal(Data).sign := 128;
Decimal(Data).Lo64 := -1*LargeInt(Buffer^);
end
else
Decimal(Data).Lo64 := LargeInt(Buffer^);
end;
для Delphi 7 достаточно
для Delphi 5, 6 возможно аналогично надо сделать для ftInteger
вообще там не только это
к сожалению Borland уже не тот что раньше
victor_ch (2003-08-05 12:08:00) [2]
все разобрался
переделал в MSSQL тип данных с decimal на int и все нормально отображается
спасибо за советы
sniknik (2003-08-05 11:58:00) [3]
какого типа поле в базе? поточнее decimal(?, ?), потому как у меня с ним все нормально. покажи запрос на создание если есть.
попробуй приведение типа к интеджеру в самом mssql-е, думаю поможет
SELECT CAST (хххх AS integer) as xxxx FROM ххххх
ZrenBy (2003-08-05 11:48:00) [4]
Это глюки Delphi
Попробуйте сделать следующее
// ADOQuery1.SQL.Text := "select A_ID, A_VL from TBL_A";
// [int] A_ID = 1;
// [bigint] A_VL = -1234567890987654321
Panel1.Caption := ADOQuery1.Fields[1].Value;
// имеем 1234567890987654321
Panel2.Caption := IntToStr( VarAsType(ADOQuery1.Fields[1].Value,varInt64) );
// имеем -1318314831
ADOQuery1.UpdateCursorPos;
Panel3.Caption := ADOQuery1.Recordset.Fields[1].Value;
// имеем -1234567890987654321
Я в подобных случаях работаю напрямую с RecordSet"ом
victor_ch (2003-08-05 11:39:00) [5]
тип поля в Delphi я специально не назначал, Delphi это сделал сам, но я пробовал делать его и как TFloatField, не помогло та же самая ситуация
запрос простой
select * from <table>
Fiend (2003-08-05 11:35:00) [6]
а почему у тебя дробное число (decimal) представлено как целое?
и приведи запрос