گرفتن اطلاعات محاسبه ای از بانک
سلام
یک جدول sql دارم که یک فیلد عدد صحیح به نام number داره . میخوام بزرگترین عدد رو به دست بیارم . از کامپوننت uniquery استفاده کردم . کد من به صورت زیر است
uniquery.close;
UniQuery.Close;
UniQuery.SQL.Clear;
uniquery.sql.add('declare @maxnum int');
UniQuery.SQL.Add('select @maxnum=max(number) from customer');
uniquery.execsql;
edit.text:=uniquery.parambyname('@maxnum').value;
هنگام اجرا پیام خطای زیر داده میشود
parameter @maxnum not found
برای حل مشکل چه پیشنهادی دارید ؟
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
ربطی به کامپوننت نداره
دستورت اشتباهه
uniquery.execsql;
فکر کنم باید اینطوری عوض بشه
uniquery.Open;
در ضمن میتونی پارامتر خروجی رو در همون دستور sql تعریف کنی و نیازی به تعریف این مدلیه پارامتر نیست
select max(number) As Max1 from customer
max1 برای Query قابل شناسایی هستش
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
تغییرات شما رو اعمال کردم به این صورت
query.sql.add('select max(number) as max1 from customer');
edit.text:=query.parambyname('max1').value;
ولی پیغام میده parameter max1 not found
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
سوال رو به این صورت مطرح میکنم . توسط query مقدار حداکثر فیلد number رو محاسبه میکنم . این عدد بدست امده رو چطوری به برنامه فراخوانی کنم ؟
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
چرا موقع خروجی از پارامتر استفاده می کنید؟مگر نباید از فیلد استفاده کنید؟!
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
من فقط یک عدد نیاز دارم و اون هم ماکزیمم NUMBER است . حالت QUERY.FIELDBYNAME هم خطا میده
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
ADOQuery1.FieldByName('yourfield').Value
خب چه خطایی می ده؟
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
این حالت که شما نوشتید اطلاعات همه رکوردها ی فیلد رو میده که باید توی برنامه بزرگترین عدد فیلد در همه رکوردها رو بدست بیارم که نیاز به نوشتن یک حلقه است . می خوام این عمل محاسبه رو سمت سرور توسط sql انجام بدم . این عدد رو سمت سرور بدست میارم ولی چون عدد ، فیلد نیست نمیدونم چطوری به برنامه منتقل کنم .
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
برای انتقال بزرگترین عدد همین کافیه.
کدتون رو کامل بگذارید بگم چکار کنید.
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
unit Unit1dataentry;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, AdvPanel, AdvSmoothLabel, DBAdvSmoothLabel, StdCtrls, Mask,
DBCtrlsEh, DB, MemDS, DBAccess, Uni, MainUnit, AdvGlassButton, DBCtrls, ADODB,
Buttons;
type
TForm1dataentry = class(TForm)
AdvPanel1: TAdvPanel;
Label4: TLabel;
Edit1daftar2: TEdit;
UniQuery1dataentry: TUniQuery;
UniConnection1: TUniConnection;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1dataentry: TForm1dataentry;
implementation
{$R *.dfm}
///////////////////////////////////////////////////////////////////
// Database : D_assess ( SQL Server )
// Table : landbak
// Field : Number int
//////////////////////////////////////////////////////////////////
procedure TForm1dataentry.FormCreate(Sender: TObject);
var
vv:variant;
begin
UniQuery1dataentry.Close;
UniQuery1dataentry.SQL.Clear;
UniQuery1dataentry.SQL.Add('select max(number) from landbak');
UniQuery1dataentry.Open;
edit1daftar2.text:=UniQuery1dataentry.FieldByName( 'number').AsString;
end;
end.
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
فقط کافیه که بانکت رو Sort کنی براساس فیلد number این طوری آخرین رکورد جدول بزرگترین عدد هست برای خوندش این کار رو بکن:
uniQuery1.close; uniQuery1.SQl.Text:='select number From Table1 Sort by Number';
uniQuery1.open;
uniQuery1.last;
i:=uniQuery1.Field[0].asinteger;
اما دقیقا نمیدونم که Sort by Number یا Sort:=Number
یا اصلا از کد زیر هم میتونی استفاده کنی:
uniQuery1.close; uniQuery1.SQl.Text:='select number From Table1';
uniQuery1.open;
uniQuery1.Sort:='Number';
uniQuery1.last;
i:=uniQuery1.Field[0].asinteger;
ببین کدوم کارت رو راه می اندازه
موفق باشی:چشمک: دست علی همراهت
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
خب ببین وقتی داری این رو ران می کنی انتظار نداری که اس کیو ال بفهمه با چه نامی برات برگردونه:
max(number)
نمی دونم چرا در تست پارامتری درست نوشته بودی اما در اینجا نه!
در این صورت با یک نام پیش فرض مثل فیلد یک و این چیزا برمی گرده، می تونی از دسترسی ترتیبی استفاده کنی که چرته، بهترین کار اینه:
select max(number) as number
که بفهمه نام فیلد خروجی چیه.
سورت کردن هم خودش یک کاره و البته خیلی خیلی زمان بر تر از گرفتن ماکسه!!
دلیلش هم اینه که دی بی ام اس ها معمولا اطلاعات تجمیعی جداول رو هم همراه جداول ذخیره می کنند. مثلا همین مین و ماکس و کانت.
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
آقای زالی تمامی بانک های اطلاعاتی از قبیل access و sql و sqlite این سه اطلاعات تجمیعی مثل مین و ماکس و کانت رو دارند یا نه فقط Sql داره؟
اگر این ها پیشفرض بانک اطلاعاتی باشه که خیلی خوبه:متعجب:
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
جناب زالی راهنماییتون کارساز بود . مشکل حل شد . ممنون
نقل قول: گرفتن اطلاعات محاسبه ای از بانک
اس کیو ال و اوراکل نگه می دارند. بقیه رو باید از سایت سازنده اون ببینید.
البته این طور نیست که برای هر سلکتی با هر where ای باشه، در سطح کل اطلاعات جدوله. برای این که این اطلاعات سریعتر قابل واکشی باشند.