haci aliyev
haci aliyev

Reputation: 97

Calc field doesn't post

Hi I want to post calc field(cemi) to table (sql). when I calc all field the last field doesn't post on sql table. because last field (cemi) type fkcalc how can I post fkcalc type field to sql table Thanks in advance!

procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin    
  ADOQuery1.FieldValues['cemi']:=
    ((ADOQuery1.FieldValues['boyuk1'] + ADOQuery1.FieldValues['boyuk2'] + 
    ADOQuery1.FieldValues['boyuk3'])*0.35)+((ADOQuery1.FieldValues['kicik1'] +  
    ADOQuery1.FieldValues['kicik2'])*0.25) +(ADOQuery1.FieldValues['qara1']*0.30);
end;

Upvotes: 2

Views: 148

Answers (1)

MartynA
MartynA

Reputation: 30715

I'm not quite sure what you mean by

the last field doesn't post on sql table

If the "last field" you are referring to is your "Cemi" one and that is a column which is in the table on your SQL Server, it will not get posted back there if you have defined it as a calculated field in your AdoQuery1 in the Object Inspector. Fields with a FieldKind of fkCalculated are local to the AdoQuery.

Just assigning a value to the calculated field is sufficient to "post" it locally to the AdoQuery, as I imagine you know. What you want to do to debug your problem (because readers like me cannot debug it fr you) is to more easily see what value, if any, is being assigned to it.

From that point of view, your code is suffering from "premature optimisation" which will make it difficult for you to see what is going wrong. Try this instead:

In your ADOQuery1CalcFields, declare a local variable for each of the fields you are accessing, including the calculated one. Choose the variable types to suit the fields:

var
  Boyuk1 : Double;  // or Integer, etc
  [...]
  Cemi : Double;

Assign values to the local variables, using the AsXXXX (type) of the fields:

Cemi := 0;
if not AdoQuery1.FieldByName('Boyuk1').IsNull then
  Cemi := Cemi + AdoQuery1.FieldByName('Boyuk1').AsFloat;
[etc]

That way, at least you'll be able to see the point at which the calculation goes wrong (if it does).

I've used FieldByName().AsFloat, rather than FieldValues[], because FieldValues[] is a Variant, which can be Null, and you don't want that when you are assigning values to it which mat themselves be variants.

Also

  • Check that AutoCalcFields is set to True for AdoQuery1.

  • Put a debugger breakpoint on the first line of ADOQuery1CalcFields. Compile and run and check that the breakpoint hits - if it doesn't, there's your answer. Single-step the debugger through each line of the procedure, and, after the final line, use Ctrl-F7 to evaluate the value of AdoQuery1.FieldByName('Cemi').AsFloat.

Upvotes: 4

Related Questions