2013-11-22 43 views
0

錯誤消息拋出'是無效的浮點值德爾福

enter image description here

` qConsulta2 := TQuery.Create(Application); 
    qConsulta2.DatabaseName := 'BaseDato'; 
    qConsulta2.SQL.Text := 'select VALOR from PARAMETRO where codigoPARAMETRO = ''IVA'' '; 
    qConsulta2.open; 
    qCompraDetalle.FieldByName('PORCENTAJE_IVA').AsFloat:=  qConsulta2.fieldbyname('valor').asfloat; 
    qConsulta2.close; 
    qConsulta2.free ` 

這把我扔進執行這個錯誤,不知道爲什麼,事先非常感謝你的時間和幫幫我。請原諒我英語不好。

+2

2013年還在使用BDE嗎?哇... –

回答

2

你的問題是與qConsulta2.fieldbyname('valor').asfloat 從我的測試你的錯誤,如果VALOR列是文本或varchar將出現在數據庫表中,它包含一個空或零長度的字符串。

我的測試涉及在MSAccess數據庫中使用VALOR_TEXT和VALOR_FLOAT列創建表。 VALOR_TEXT被定義爲文本,VALOR_FLOAT被定義爲double。我爲4個測試用例編寫代碼,2個用於說明錯誤(Case1和Case2)以及2個用於提供解決方案的錯誤(Case 3和Case4)。代碼如下所示。

procedure TForm1.Case1; 
var 
    f : double; 
begin 
    db.ExecSQL('delete from PARAMETRO'); 
    db.ExecSQL('insert into PARAMETRO (codigoPARAMETRO) values(''IVT'')'); 
// VALOR_FLOAT and VALOR_TEXT are null 
    qConsulta2.SQL.Text := 'select * from PARAMETRO'; 
    qConsulta2.Open(); 
    f := qConsulta2.FieldByName('VALOR_FLOAT').AsFloat; 
    ShowMessage('From Float '+FloatToStr(f)); 
    f := qConsulta2.FieldByName('VALOR_TEXT').AsFloat; 
    ShowMessage('From Text '+FloatToStr(f)); 
end; 

procedure TForm1.Case2; 
var 
    f : double; 
begin 
    db.ExecSQL('delete from PARAMETRO'); 
    db.ExecSQL('insert into PARAMETRO (codigoPARAMETRO,VALOR_TEXT) values(''IVT'','''')'); 
// VALOR_FLOAT is null and VALOR_TEXT is '' (zero length string) 
    qConsulta2.SQL.Text := 'select * from PARAMETRO'; 
    qConsulta2.Open(); 
    f := qConsulta2.FieldByName('VALOR_FLOAT').AsFloat; 
    ShowMessage('From Float '+FloatToStr(f)); 
    f := qConsulta2.FieldByName('VALOR_TEXT').AsFloat; 
    ShowMessage('From Text '+FloatToStr(f)); 
end; 

Case3直接適用於修復您的代碼。通過獲取數據AsVariant,NullStrictConvert := false將允許將空值轉換爲浮點數,整數或字符串,但不會出現異常。

procedure TForm1.Case3; 
var 
    f : double; 
begin 
    NullStrictConvert := false; 
    db.ExecSQL('delete from PARAMETRO'); 
    db.ExecSQL('insert into PARAMETRO (codigoPARAMETRO) values(''IVT'')'); 
// VALOR_FLOAT and VALOR_TEXT are null 
    qConsulta2.SQL.Text := 'select * from PARAMETRO'; 
    qConsulta2.Open(); 
    f := qConsulta2.FieldByName('VALOR_FLOAT').AsFloat; 
    ShowMessage('From Float '+FloatToStr(f)); 
    f := qConsulta2.FieldByName('VALOR_TEXT').AsVariant; 
    ShowMessage('From Text '+FloatToStr(f)); 
end; 

只要源列和目標列是相同類型,Case4就提供了一種避免數據轉換的方法。如果它們不是同一類型,則仍可能發生數據轉換錯誤。

procedure TForm1.Case4; 
var 
    f : double; 
begin 
    NullStrictConvert := false; 
    db.ExecSQL('delete from PARAMETRO'); 
    db.ExecSQL('insert into PARAMETRO (codigoPARAMETRO) values(''IVT'')'); 
// VALOR_FLOAT and VALOR_TEXT are null 
    qConsulta2.SQL.Text := 'select * from PARAMETRO'; 
    qConsulta2.Open(); 
    f := qConsulta2['VALOR_FLOAT']; 
    ShowMessage('From Float '+FloatToStr(f)); 
    f := qConsulta2['VALOR_TEXT']; 
    ShowMessage('From Text '+FloatToStr(f)); 
    // avoid data conversion 
    qCompraDetalle.Open(); 
    qCompraDetalle.Append; 
    qCompraDetalle['PORCENTAJE_IVA'] := qConsulta2['VALOR_TEXT']; 
    qCompraDetalle.Post; 
end; 
1

確保qConsulta2.fieldbyname('valor')。asfloat不爲空。

+2

由空,我想你的意思是'NULL'?在空的浮動字段上調用'AsFloat'將返回'0',而不是錯誤。 –

+0

rkawano如何確保不是空的? FieldByName和我在事件FormCreate DateSeparator:='/'; DecimalSeparator:=; '' LongDateFormat:='dd/mm/yyyy'; ThousandSeparator:=''; TimeSeparator:=':'; 但它一直拋出錯誤 –

+0

在您的數據庫上直接運行此查詢:SELECT * FROM Parametro WHERE Valor IS NULL或Valor =''如果任何記錄爲空,它會顯示給您。 – rkawano

1

你必須檢查你的查詢實際返回的記錄:

qConsulta2 := TQuery.Create(Application); 
try 
    qConsulta2.DatabaseName := 'BaseDato'; 
    qConsulta2.SQL.Text := 'select VALOR from PARAMETRO where codigoPARAMETRO = ''IVA'' '; 
    qConsulta2.open; 
    if not qConsulta2.EOF then 
    qCompraDetalle.FieldByName('PORCENTAJE_IVA').AsFloat:= qConsulta2.fieldbyname('valor').asfloat; 
    qConsulta2.close; 
finally 
    qConsulta2.free 
end; 

,或者如果你想確保始終有一個返回的記錄,使用SQL COALESCE命令:

qConsulta2 := TQuery.Create(Application); 
try 
    qConsulta2.DatabaseName := 'BaseDato'; 
    qConsulta2.SQL.Text := 'select COALESCE(VALOR, 0) AS valor from PARAMETRO where codigoPARAMETRO = ''IVA'' '; 
    qConsulta2.open; 
    qCompraDetalle.FieldByName('PORCENTAJE_IVA').AsFloat:= qConsulta2.fieldbyname('valor').asfloat; 
    qConsulta2.close; 
finally 
    qConsulta2.free 
end; 

UPDATE

Wild Guess在這裏,因爲你沒有提供你的數據庫的詳細信息:如果你的VALOR f ield在PARAMETRO表實際上是一個VARCHAR類型,那麼你可以有一個空字符串,而不是NULL

qConsulta2 := TQuery.Create(Application); 
try 
    qConsulta2.DatabaseName := 'BaseDato'; 
    qConsulta2.SQL.Text := 'select VALOR from PARAMETRO where codigoPARAMETRO = ''IVA'' '; 
    qConsulta2.open; 
    if qConsulta2.FieldByName('VALOR').AsString <> '' then 
    qCompraDetalle.FieldByName('PORCENTAJE_IVA').AsFloat:= qConsulta2.fieldbyname('valor').asfloat; 
    qConsulta2.close; 
finally 
    qConsulta2.free 
end; 
+0

是的,OP應該檢查空數據集,但即使它是空的,它將返回'0',而不是錯誤。 –

+0

@MarcusAdams,不,它會AV,因爲qConsulta2.fieldbyname('valor')將爲零,因爲沒有記錄集返回? – whosrdaddy

+0

我想它可能取決於你的特定'TQuery'組件的實現,但它應該只是'NULL',而不是提高AV。 –