PDA

View Full Version : گرفتن اطلاعات محاسبه ای از بانک



disiba
یک شنبه 01 آذر 1394, 15:05 عصر
سلام
یک جدول 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
برای حل مشکل چه پیشنهادی دارید ؟

hadisalahi2
دوشنبه 02 آذر 1394, 11:02 صبح
ربطی به کامپوننت نداره
دستورت اشتباهه

uniquery.execsql;
فکر کنم باید اینطوری عوض بشه

uniquery.Open;

در ضمن میتونی پارامتر خروجی رو در همون دستور sql تعریف کنی و نیازی به تعریف این مدلیه پارامتر نیست

select max(number) As Max1 from customer

max1 برای Query قابل شناسایی هستش

disiba
دوشنبه 02 آذر 1394, 11:18 صبح
تغییرات شما رو اعمال کردم به این صورت


query.sql.add('select max(number) as max1 from customer');
edit.text:=query.parambyname('max1').value;

ولی پیغام میده parameter max1 not found

disiba
دوشنبه 02 آذر 1394, 12:23 عصر
سوال رو به این صورت مطرح میکنم . توسط query مقدار حداکثر فیلد number رو محاسبه میکنم . این عدد بدست امده رو چطوری به برنامه فراخوانی کنم ؟

یوسف زالی
سه شنبه 03 آذر 1394, 11:22 صبح
چرا موقع خروجی از پارامتر استفاده می کنید؟مگر نباید از فیلد استفاده کنید؟!

disiba
سه شنبه 03 آذر 1394, 11:40 صبح
من فقط یک عدد نیاز دارم و اون هم ماکزیمم NUMBER است . حالت QUERY.FIELDBYNAME هم خطا میده

یوسف زالی
سه شنبه 03 آذر 1394, 15:32 عصر
ADOQuery1.FieldByName('yourfield').Value

خب چه خطایی می ده؟

disiba
سه شنبه 03 آذر 1394, 19:48 عصر
این حالت که شما نوشتید اطلاعات همه رکوردها ی فیلد رو میده که باید توی برنامه بزرگترین عدد فیلد در همه رکوردها رو بدست بیارم که نیاز به نوشتن یک حلقه است . می خوام این عمل محاسبه رو سمت سرور توسط sql انجام بدم . این عدد رو سمت سرور بدست میارم ولی چون عدد ، فیلد نیست نمیدونم چطوری به برنامه منتقل کنم .

یوسف زالی
سه شنبه 03 آذر 1394, 20:07 عصر
برای انتقال بزرگترین عدد همین کافیه.
کدتون رو کامل بگذارید بگم چکار کنید.

disiba
چهارشنبه 04 آذر 1394, 08:55 صبح
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.

ابوالفضل عباسی
چهارشنبه 04 آذر 1394, 10:58 صبح
فقط کافیه که بانکت رو 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;
ببین کدوم کارت رو راه می اندازه
موفق باشی:چشمک: دست علی همراهت

یوسف زالی
چهارشنبه 04 آذر 1394, 11:20 صبح
خب ببین وقتی داری این رو ران می کنی انتظار نداری که اس کیو ال بفهمه با چه نامی برات برگردونه:


max(number)

نمی دونم چرا در تست پارامتری درست نوشته بودی اما در اینجا نه!
در این صورت با یک نام پیش فرض مثل فیلد یک و این چیزا برمی گرده، می تونی از دسترسی ترتیبی استفاده کنی که چرته، بهترین کار اینه:


select max(number) as number

که بفهمه نام فیلد خروجی چیه.

سورت کردن هم خودش یک کاره و البته خیلی خیلی زمان بر تر از گرفتن ماکسه!!
دلیلش هم اینه که دی بی ام اس ها معمولا اطلاعات تجمیعی جداول رو هم همراه جداول ذخیره می کنند. مثلا همین مین و ماکس و کانت.

ابوالفضل عباسی
چهارشنبه 04 آذر 1394, 11:44 صبح
آقای زالی تمامی بانک های اطلاعاتی از قبیل access و sql و sqlite این سه اطلاعات تجمیعی مثل مین و ماکس و کانت رو دارند یا نه فقط Sql داره؟
اگر این ها پیشفرض بانک اطلاعاتی باشه که خیلی خوبه:متعجب:

disiba
چهارشنبه 04 آذر 1394, 12:11 عصر
جناب زالی راهنماییتون کارساز بود . مشکل حل شد . ممنون

یوسف زالی
چهارشنبه 04 آذر 1394, 12:18 عصر
اس کیو ال و اوراکل نگه می دارند. بقیه رو باید از سایت سازنده اون ببینید.
البته این طور نیست که برای هر سلکتی با هر where ای باشه، در سطح کل اطلاعات جدوله. برای این که این اطلاعات سریعتر قابل واکشی باشند.