View Full Version : ايجاد فيلد محاسباتي در query در زمان اجرا
سعید صابری
چهارشنبه 18 آذر 1388, 10:48 صبح
سلام
من با كد زير مي خوام يك فيلد محاسباتي در زمان اجراي برنامه بسازم اما براي بار اول فقط دو تا فيلد number مي سازه و براي دوم كليك مي كنم ارور access vilation in address 000 ميده البته گاهي اوقات ارورهاي هم تغيير مي كنه msquery missing name و اينجور ارورها.
دوستان لطف كنيد راهنمايي كنيد كجاي كدم مشكل داره؟
var
Id:TField;
begin
id:=TIntegerField.Create(msquery2);
Id.FieldKind:=fkCalculated;
Id.FieldName:='Number';
id.Visible:=True;
id.ReadOnly:=false;
.
.
.
MSQuery2.Active:=False;
MSQuery2.Fields.Clear;
MSQuery2.SQL.Clear;
MSQuery2.SQL.Add('select * from a');
id.DataSet:=MSQuery2;
MSQuery2.Open;
MSQuery2.FieldDefs.Update;
Hadi_Fayyaz
چهارشنبه 18 آذر 1388, 13:52 عصر
سلام دوست عزيز
من منظور شما رو درست متوجه نشدم يعني نميدونم منظور شما از فيلد محاسباتي تو Query چيه و چه كار ميخوايد بكنيد ولي اگه ميخوايد يه فيلد محاسباتي تو نتيجه Query داشته باشيد چرا از خود دستور SQL استفاده نميكنيد
Select a.*,0 as number From a
سعید صابری
چهارشنبه 18 آذر 1388, 20:19 عصر
من توي رويداد Oncalcfield كد زير نوشتم ولي فيلدي كه تعريف كرديم هيچ گونه تغييري نمي كنه فقط مقدارش صفر مي ممونه
MSQuery2.FieldByName('number').AsInteger:=MSQuery2 .RecNo
Hadi_Fayyaz
چهارشنبه 18 آذر 1388, 21:10 عصر
سلام دوست عزيز
من نميدونم شما چه اسراري داريد كه RecNo رو توي نتيجه Query بياريد درصورتي كه فكر نميكنم نيازي به اين كار باشه.
اما تا جايي كه من ميدونم يه فيلد محاسباتي رو نميشه مقدار بهش داد بلكه مقدار فيلد محاسباتي در زمان ايجاد اون فيلد محاسبه ميشه مثلا تو دستور SQL كه من براتون گذاشتم به جاي اون عدد 0 شما هر محاسبه ديگه اي ميتونيد بگذاريد و نتيجش هم توي فيلد محاسباتي شما ديده ميشه اما در مورد اينكه RecNo رو توي نتيجه محاسبه تون داشته باشيد متاسفانه نظري ندارم شايد دوستان ديگه بتونن كمك كنند.
سعید صابری
پنج شنبه 19 آذر 1388, 08:32 صبح
سلام دوست عزيز
من نميدونم شما چه اسراري داريد كه RecNo رو توي نتيجه Query بياريد درصورتي كه فكر نميكنم نيازي به اين كار باشه.
دليلش اينه كه من query مستقيم پرينت مي گير. بخاطر همين نياز به شمار دريف دارم.
با روش ما كه ور رفتم. بخاطر اين نميشد فيلد در زمان اجر مقداردهي كرد كه آن فيلد readonly است. وقتي مشكل readonly حل كردم حالا رويداد oncalcfield اتفاق نمي افته كه شماره رديف بزاره. يعني فقط يه بار شماره رديف ميزاره بار دوم ديگه همون صفر ميزاره.
دوستان ميشه راهنمايي كنيد چرا رويداد oncalcfield زماني كه در حالت اجرا query تغيير ميديم اتفاق نمي افته؟
Hadi_Fayyaz
یک شنبه 22 آذر 1388, 10:51 صبح
سلام دوست عزيز
دليلش اينه كه من query مستقيم پرينت مي گير. بخاطر همين نياز به شمار دريف دارم
ميشه بگيد چطور مستقيم از Query پرينت ميگيريد.
وقتي مشكل readonly حل كردم
لطف كنيد بگيد چطور مشكل ReadOnly فيلد محاسباتي رو حل كرديد
ممنون ميشم
سعید صابری
یک شنبه 22 آذر 1388, 12:25 عصر
به اين 2 دليل ميگم مستقيم كه يكي از dbgrideh استفاده مي كنم كه ديگه نياز به طراحي نداره
2- كوئري مي فرستم به يك Cross در فست(توي مثال خود فست هست)
اما فقط خواندني فيلد
adoQuery2.FieldByName('xxxx').ReadOnly:=False;
Hadi_Fayyaz
یک شنبه 22 آذر 1388, 22:16 عصر
خوب دوست عزيز با اطلاعاتي كه به من دادي حالا يه مثال برات ميگذارم
اميد وارم مشكلت رو حل كنه زحمت ADOConnection و برقراري ارتباطاتش رو خودت بكش
شاد باشي:لبخندساده:
SQLMAN
پنج شنبه 26 آذر 1388, 20:09 عصر
سلام
من هم کاری شبیه به این می خوام انجام بدم
می خوام فیلد محاسباتی اضافه کنم با نام مثلا fx
و فیلدهای اصلی هم باشه ، یکی از فیلدهای اصلی f1 هست حالا می خوام در رویداد oncalcfield
fx := f1 + 10
هر کار می کنم خطا می ده،یا fx اضافه میشه f1 نمیاد یا برعکس و یا f1 عدد خیلی بزرگ نشون می ده
procedure TForm1.Button1Click(Sender: TObject);
var
a,b : TIntegerField;
begin
a := TIntegerField.Create(Self);
a.FieldName := 'fx';
a.DataSet := ADOTable1;
a.SetFieldType(ftInteger);
a.FieldKind := fkCalculated;
b := TIntegerField.Create(Self);
b.FieldName := 'f1';
b.DataSet := ADOTable1;
b.SetFieldType(ftInteger);
b.FieldKind := fkData;
with ADOTable1 do
begin
Active := False;
FieldDefs.Clear;
FieldDefs.Add('f1',ftInteger,0,false);
FieldDefs.Add('fx',ftString,10,false);
ADOTable1.Active := True;
end;
//ADOTable1.Fields.Add('f1');
end;
procedure TForm1.ADOTable1CalcFields(DataSet: TDataSet);
begin
ADOTable1.FieldByName('fx').AsInteger := ADOTable1.FieldByName('f1').AsInteger + 5;
end;ممنون میشم راهنمایی بفرمایید
سعید صابری
پنج شنبه 26 آذر 1388, 20:37 عصر
دوست عزيز شما بالا فيلد از نوع عدد(integer) تعريف كرديد. بعد ميخواهيد مقدار رشته (string) بهش اضافه كنيد؟
ADOTable1.FieldByName('fx').AsString := '9';//IntToStr(ADOTable1.FieldByName('f1').AsInteger + 5);
اينجا (http://barnamenevis.org/forum/showthread.php?t=192352&page=4)يه سر بزن پست آخر يك مثال گذاشتم.
مشكلي بود در خدمتيم
SQLMAN
پنج شنبه 26 آذر 1388, 22:00 عصر
ممنون که تذکر دادید ،من توی همون پست اصلاح کردم
ولی اشکال من به این دلیل نیست،
اصلا من نمی خوام فیلد شماره ردیف اضافه کنم
بعلاوه می خوام فیلدهای اصلی را هم در زمان اجرا اضافه کنم
سعید صابری
جمعه 27 آذر 1388, 09:06 صبح
ممنون که تذکر دادید ،من توی همون پست اصلاح کردم
ولی اشکال من به این دلیل نیست،
اصلا من نمی خوام فیلد شماره ردیف اضافه کنم
بعلاوه می خوام فیلدهای اصلی را هم در زمان اجرا اضافه کنم
خب در همون مثال همه فيلدها در زمان اجرا اضافه ميشدند. وقتي فيلدهاي محاسباتي و فيلدهاي اصلي اضافه كردي از اين كد استفاده كن.
for i := 0 to adoquery1.FieldDefList.Count - 1 do
with adoquery1.FieldDefList[i] do
if (DataType <> ftUnknown) and not (DataType in ObjectFieldTypes) then
CreateField(adoquery1, nil, adoquery1.FieldDefList.Strings[i]);
adoquery1.Open;
SQLMAN
شنبه 28 آذر 1388, 11:51 صبح
مرسی از راهنمایی شما
1-اگر بخوام فیلدهای اصلی را به انتخاب کاربر اضافه کنم، برای بار دوم خطا می ده
با چه دستوری باید فیلدها را کامل پاک کنم و دوباره اضافه کنم؟
2-اگر مثلا 10 فیلد اصلی باشه باید واسه همشون متغیر تعریف کنم و create کنم؟!
سعید صابری
شنبه 28 آذر 1388, 14:23 عصر
مرسی از راهنمایی شما
1-اگر بخوام فیلدهای اصلی را به انتخاب کاربر اضافه کنم، برای بار دوم خطا می ده
با چه دستوری باید فیلدها را کامل پاک کنم و دوباره اضافه کنم؟
2-اگر مثلا 10 فیلد اصلی باشه باید واسه همشون متغیر تعریف کنم و create کنم؟!
اتفاقا من از اين كد كه استفاده مي كنم انتخاب فيلد به عهده كاربر است.حتما فيلدهاي كوئري را پاك نمي كني
ADOTable1.Fields.Clear;
براي فيلدهاي اصليت متغير نياز نيست. فقط براي فيلدهاي محاسباتي بايد متغير تعريف كني اگه مي خواهي فيلد زيادي تعريف كني پيشنهاد اينه از آرايه استفاده كني
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.