Форум: "Базы";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
Внизотрицательные числа отображаются как положительные Найти похожие ветки
← →
victor_ch (2003-08-05 10:44) [0]Добрый день Всем!!!
Столкнулся с такой проблемой: в базе данных у меня есть в каком то поле есть как отрицательные значения так и положительные, но вот при выводе значений этого поля в какой то элемент управления типа DBGrid,DBedit, итд - отрицательные значения отображаются как положительные т.е отсутствует знак "-", тип поля в базе MSSQL decimal, тип поля в Delphi TIntegerField.
Работаю через ADO компоненты, может быть в них есть какая то настройка, для правильного отображения отрицательных значений
← →
Fiend (2003-08-05 11:35) [1]а почему у тебя дробное число (decimal) представлено как целое?
и приведи запрос
← →
victor_ch (2003-08-05 11:39) [2]тип поля в Delphi я специально не назначал, Delphi это сделал сам, но я пробовал делать его и как TFloatField, не помогло та же самая ситуация
запрос простой
select * from <table>
← →
ZrenBy (2003-08-05 11:48) [3]Это глюки 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"ом
← →
sniknik (2003-08-05 11:58) [4]какого типа поле в базе? поточнее decimal(?, ?), потому как у меня с ним все нормально. покажи запрос на создание если есть.
попробуй приведение типа к интеджеру в самом mssql-е, думаю поможет
SELECT CAST (хххх AS integer) as xxxx FROM ххххх
← →
victor_ch (2003-08-05 12:08) [5]все разобрался
переделал в MSSQL тип данных с decimal на int и все нормально отображается
спасибо за советы
← →
MW8 (2003-08-07 17:13) [6]в модуле 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 уже не тот что раньше
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c