PDA

View Full Version : سوال: فیلتر کردن داده ها برای گزارش گیری -Quick Report



Narges-s
جمعه 20 شهریور 1388, 13:16 عصر
سلام

من برای گزارش گیری توی برنامه ام یه مشکلی دارم.

برنامه ی من در مورد حقوق و دستمزد هستش.

من میخوام وقتی کاربر میخود گزارش مربوط به پرسنل رو دریافت کنه با وارد کردن شماره پرسنلی گزارش مربوط به اون کارمند خاص با شماره پرسنلی ای که وارد کرده رو مشاهده کنه.

خودم از EOF استفاده کردم، اما اونجوری تمام کارمندا رو نشون میده . من میخوام فقط کارمندی رو که کاربر کدش رو وارد میکنه نمایش بده . میتونید بگید من توی آن کلیک دکمه ی گزارش گیری چی بنویسم که گزارش نمایش داده شده اونجوری که گفتم باشه؟ :ناراحت:

majid_ramak
جمعه 20 شهریور 1388, 13:24 عصر
سلام

من میخوام وقتی کاربر میخود گزارش مربوط به پرسنل رو دریافت کنه با وارد کردن شماره پرسنلی گزارش مربوط به اون کارمند خاص با شماره پرسنلی ای که وارد کرده رو مشاهده کنه.

با استفاده از دستورات Select دیتا بیس میخواید در خود فرم برنامتون این کارو انجام بدین یا از Component ها گزارش گیری استفاده می کنید؟

AbiriAmir
جمعه 20 شهریور 1388, 13:26 عصر
شما باید اول بگویید که از چه ابزار گزارشگیری و چه ابزاری برای دیتابیس استفاده میکنید ولی من یه نمونه رو براتون مثال میزنم

فرض منید شما از AdoQuery استفاده کردید.
حالا یه کوئری بگیرید ( با Select ) و بر اساس اون کوئری گزارش بگیرید

Narges-s
جمعه 20 شهریور 1388, 13:31 عصر
با استفاده از دستورات Select دیتا بیس میخواید این کارو انجام بدین یا از Component ها گزارش گیری استفاده می کنید؟

نمیدونم . راستش من زیاد با گزارش گیری کار نکردم . در حد یه گزارش گیری ساده بلدم این کارو . ولی الان میخوام با اجرای پروژه ام وقتی کاربر میخواد گزارش یه کارمند رو ببینه با وارد کردن شماره پرسنلی اون کارمند، فقط گزارش مربوط به اون کارمند رو ببینه! من نمیدونم چجوری باید به برنامه ام بفهمونم که فقط گزارش مربوط به کارمندی که شماره پرسنلیش وارد شده رو نمایش بده!

کامپننت های گزارش گیری اگه منظورتون همون Quick Report هستش من از اونا استفاده کردم واسه نمایش گزارش.

هر راهی که شما پیشنهاد کنین قبوله :افسرده:

AbiriAmir
جمعه 20 شهریور 1388, 13:36 عصر
با چه ابزاری؟
Quick Report
Fast Report
Rave Report
.
.
.

کدومش؟
اگه نمیدونید یه عکس از قسمت گزارشتون اینجا آپلود کنین

AbiriAmir
جمعه 20 شهریور 1388, 13:37 عصر
اصلا شما با کدام ابزار به دیتابیستون متصل شدین؟

ADO
BDE

؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Narges-s
جمعه 20 شهریور 1388, 13:41 عصر
با چه ابزاری؟
Quick Report
Fast Report
Rave Report
.
.
.

کدومش؟
اگه نمیدونید یه عکس از قسمت گزارشتون اینجا آپلود کنین

همونطور که گفتم از QuickReport استفاده میکنم و از ADO هم برای ارتباط با DataBase کمک میگیرم :متفکر:

AbiriAmir
جمعه 20 شهریور 1388, 13:45 عصر
درسته
ببخشید

اون قسمت که نوشته بودید کوییک ریپورت رو ندیدم

به هر حال

AdoTable یا AdoQuery ؟؟؟

از کدومش استفاده میکنید؟

majid_ramak
جمعه 20 شهریور 1388, 13:52 عصر
می تونید یک Select جدید برای Query بنویسید به این شکل:
برای مثال میخواین اطلاعات مربوط به یک کارمند که با کد 6 ذخیره شده رو فراخوانی کنید:



SELECT * FROM PERSONEL
WHERE CODE = 6

و اگر کد در DBEdit وارد میکنید به این شکل بنویسید:


'SELECT * FROM PERSONEL ' +
' WHERE CODE = ' + QuotedStr(DBEdit1.Text)

AbiriAmir
جمعه 20 شهریور 1388, 13:56 عصر
جناب majid_ramak
دلیل سوال من این بود که کوئری شما فقط در AdoQuery هست نه AdoTable و اگر ایشون از AdoQuery چیزی بلد نباشن بدتر سردرگم میشن

AbiriAmir
جمعه 20 شهریور 1388, 14:10 عصر
پس بزارین یه توضیحی بدم
وقتی که خاصیت DataSet مربوط به QuickRep1 رو بر روی AdoQuery1 قرار میدین معنیش اینه که گزارش از کوئری گرفته شده توسط AdoQuery1 گرفته میشود
پس اگر واقعا با AdoQuery کار میکنید و با دستور Select آشنایی دارین میدونین که با اجرای این دستور همه رکوردها پنهان شده و فقط رکورد(های) مورد نظر معلوم میشن
پسحاصل کوئری شما فقط همان نتیجه ای که میخواین هست و گزارش فقط از اون گرفته میشه

اگر هم با دستورات sql آشنایی ندارین من قبلا یه مقاله راجع به اون تو همین سایت گزاشتم
یه جست و جو در پست های من بدین تو کل سایت پیداش میکنین
فکر کنم تو بخش پایگاه داده اسکیوال سرور بود
البته اگه خواستین سرچ کنین باید اسم قبلی من یعنی abiriamir رو سرچ کنین

موفق باشید

Narges-s
جمعه 20 شهریور 1388, 14:15 عصر
درسته
ببخشید

اون قسمت که نوشته بودید کوییک ریپورت رو ندیدم

به هر حال

AdoTable یا AdoQuery ؟؟؟

از کدومش استفاده میکنید؟

من از ADOQuery استفاده میکنم. من چون در مورد این پروژه ام زیاد سوال کردم یادم میره که باید هر دفعه اطلاعات رو کامل بدم . ببخشید:چشمک:

Narges-s
جمعه 20 شهریور 1388, 14:27 عصر
می تونید یک Select جدید برای Query بنویسید به این شکل:
برای مثال میخواین اطلاعات مربوط به یک کارمند که با کد 6 ذخیره شده رو فراخوانی کنید:



SELECT * FROM PERSONEL
WHERE CODE = 6

و اگر کد در DBEdit وارد میکنید به این شکل بنویسید:


'SELECT * FROM PERSONEL ' +
' WHERE CODE = ' + QuotedStr(DBEdit1.Text)


ببخشید من الان دقیقا متوجه نشدم اینو باید کجا بنویسم؟ یعنی اگه اینو بنویسم با کلیک رو گزارش گیری، QuickReport رو در حالی نشون میده که فقط اطلاعات اون کارمند خاص درش نمایش داده بشه؟

Narges-s
جمعه 20 شهریور 1388, 14:30 عصر
پس بزارین یه توضیحی بدم
وقتی که خاصیت DataSet مربوط به QuickRep1 رو بر روی AdoQuery1 قرار میدین ...

بدجوری وقتم کمه :ناراحت:

majid_ramak
جمعه 20 شهریور 1388, 14:37 عصر
ببخشید من الان دقیقا متوجه نشدم اینو باید کجا بنویسم؟ یعنی اگه اینو بنویسم با کلیک رو گزارش گیری، QuickReport رو در حالی نشون میده که فقط اطلاعات اون کارمند خاص درش نمایش داده بشه؟
قبال از اینکه فرم گزارش گیری تون باز بشه این کد رو باید به این شکل بنویسید:

with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Text:= 'SELECT * FROM PERSONEL ' +
' WHERE CODE = ' + QuotedStr(DBEdit1.Text);
Open;
end;

کار این کد اینه که در Table پرسنل جستجو میکنه و تمام اطلاعات شخصی که کد داخل DBEdit به اون اختصاص داده شده رو براتون میاره.
شما میتونید این کار رو بر اساس هر فیلدی که دارین انجام بدین.
حالا این کد رو در Button که فرم گزارشتون رو باز میکنه بنویسید (قبل از دستور باز شدن فرم گزارش)

grand_ceasare
جمعه 20 شهریور 1388, 14:46 عصر
فکر کنم open و close رو جا انداختی دوست عزیز

AbiriAmir
شنبه 21 شهریور 1388, 12:25 عصر
ببخشید من الان دقیقا متوجه نشدم اینو باید کجا بنویسم؟ یعنی اگه اینو بنویسم با کلیک رو گزارش گیری، QuickReport رو در حالی نشون میده که فقط اطلاعات اون کارمند خاص درش نمایش داده بشه؟

حالا دیدین گفتم ممکنه سردرگم بشن؟

مطالبی که دوستان گفتن مشکل شما رو برطرف میکنن ولی شما در واقع یاد نگرفته اید.

پس فقط مشکل شما به ظاهر حل شده

پس با وجود وقت کمتون بهتره این پست رو کامل بخونین

وقتی شما با AdoQuery کار میکنید حتما تا حدودی با خاصیت sql آن آشنا هستید.
sql یک زبان جداست.
پس در زبان ویژوال بیسیک یا زبان های دیگه هم برای برقراری ارتباط با دیتابیس میتونن از دستورات اس کیو ال استفاده کنن.

خب پس وقتی زبان جداست معنیش اینه که جز کلاس های دلفی نیست و دلفی مستقیما کامپایلش نمیکنه

پس مستقیما نمیتونین در قسمت کدنویسی دلفی از اونا استفاده کنین.

پس AdoQuery یک خاصیت به اسم sql داره که کدهای اس کیو ال داخل اون قرار میگیرن.

تعداد دستورات اس کیو ال زیاد نیست که احتمالا شما با دستوراتی مثل select ، update ، delete آشنا هستید

پس کدهای بالا رو باید در خاصیت اس کیو ال مربوط به AdoQuery قرار بدین و بعد کوئری بگیرید

در اینجا شما با دستور select سروکار دارید چون کار شما با select انجام میشه
این دستور در واقع رکورد ها رو فیلتر میکنه

همونطوری که میدونید دستور select به صورت زیر استفاده میشه

select * from [table name] where [field name]=...

یا


select ... from table1

در ضمن من گفتم که مقاله ای راجع به این دستورات روی همین سایت گزاشتم

به هر حال

شما باید از این دستور استفاده کنید و بعد هم کوئری رو open کنید

فقط از نظر من یه چیز دیگه رو هم باید چک کنید
کد زیر به نظر من کامل تره


with AdoQuery1 do
begin
close;
sql.text := 'Select * from personal where code=:p1';
parameters.parambyname('p1').value := x;
open;
if RecordCount > 0 then
ReportForm.Show;
end;


دلیل استفاده من از پارامتر اینه که نمیدونم فیلد شما از چه نوعی هست
متغیر x هم کد مورد نظرتان هست که مهم نیست از چه نوع متغیری باشه

اگر از نوع text و امثالهم هست میتونید از کد زیر استفاده کنید:


with AdoQuery1 do
begin
close;
sql.text := 'Select * from personal where code=' + QuotedStr('کد مورد نظر'(;
open;
if RecordCount > 0 then
ReportForm.Show;
end;


اگر هم از نوع text نباشه هم میتونید تو کد اضافش کنین ( که دیگه quotestr لازم نیست) و یا دوباره از همون پارامتر استفاده کنید

راستی quotedstr رشته مورد نظر رو در single quotation میزاره
برای فهمیدن کارش کد زیر رو امتحان کنید:


showmessage(quotedstr('a');

mehdimdp
یک شنبه 22 شهریور 1388, 16:52 عصر
خب چرا به جاي اين كه اينهمه كد بنويسيد، نمياين از فيلتر استفاده كنيد؟؟؟


(table or query).filtered:=false;
(table or query).filter:='cod='+edit1.text;
(table or query).filtered:=true;

AbiriAmir
یک شنبه 22 شهریور 1388, 17:10 عصر
خب چرا به جاي اين كه اينهمه كد بنويسيد، نمياين از فيلتر استفاده كنيد؟؟؟


(table or query).filtered:=false;
(table or query).filter:='cod='+edit1.text;
(table or query).filtered:=true;



خیلی ممنون

دلیل استفاده من از select صرفا حل مشکل ایشون نبود بلکه تکمیل اطلاعات ایشون در مورد دستورات sql و نحوه استفاده از اونا هم بود

با این حال بازم ممنون

ghasemshami
چهارشنبه 01 مهر 1388, 08:19 صبح
از دستور select استفاده کن ابتدا


select * from namebank where (namefield = edit.text)

و شی های ک.ئیک ریپورت رو به این qouery وصل کن و پرینت بگیر درست میشه