View Full Version : سوال: وروداطلاعات یکسان برای گروهی ازدانش آموزان
amirkazem
چهارشنبه 29 بهمن 1393, 23:12 عصر
باسلام
دربرنامه ای که داریم ازطریق فرمهایی یک سری اطلاعات ازقبیل: پرداخت کرایه سرویسف شهریه، ثبت غیبت و...رابرای افراد(ازطریق جستجووانتخاب فردموردنظرازدی بی گرید) واردمی کنیم.
گاهی اوقات اطلاعاتی که قراراست واردشودبرای تعدادی ازافرادیکسان هستش.(مثلاًدرتاریخ1393/11/30 تعداد3دانش آموزازیک کلاس غایب هستند)می خواهیم ازطریق کوئری(Adoquery)که ایجادکرده ایم و تمام دانش آموزان یک کلاس در(DBGride) نمایش داده شده اند.مثلاًهمان غیبت تاریخ93/11/30 رابرای 3فردموردنظرواردکنیم.
ابتداسه دانش آموزانتخاب شوندوسپس درفرم مربوطه مثلاً تاریخ غیبت وعلّت غیبت وداشتن یانداشتن گواهی برای همان سه نفرثبت شود.(فقط به منظورسرعت درکارها)
دوستان محبتی بفرماییدوراهنمایی کنید.
جام توفقیتان لبریزباد!
lastmory
پنج شنبه 30 بهمن 1393, 14:01 عصر
سلام از تکنیک insert , select استفاده کن
یوسف زالی
پنج شنبه 30 بهمن 1393, 15:10 عصر
سلام.
برای کار شما، اطلاعاتی که دادید کافی نیست، مثلا DBMS شما چیه؟ اس کیو ال سرور یا اکسس یا ..
در ضمن، اطلاعات مورد نظر دقیقا برابر هستند یا فقط در فیلدهایی اشتراک دارند، و این که جدول مورد نظر داره insert می شه یا update و ...
من یکی از روشها رو در اس کیو ال توضیح می دم؛
شما اول سریال هایی که انتخاب کردید رو در رشته ای به فرم '(120) ,(234) ,(55) ,(80)' می ریزید. این رشته رو به فرم زیر در کوئری استفاده می کنید:
INSERT INTO TBL1(serial, time)
SELECT i, GETDATE()
FROM (SELECT * FROM (VALUES(10), (20), (30), (40)) X(i))X
اون قسمت اعداد در حقیقت همون رشته ای هست که شما الان ساختید.
روش کار دقیقا مرتبط هست با کاری که شما می خواهید انجام بدهید.
روشهای دیگه ای وجود داره مثل XML و روشهای مشابه دیگه.
amirkazem
پنج شنبه 30 بهمن 1393, 23:31 عصر
جناب You see
ضمن تشکرمجدد؛ به عرض برسونم DBMS برنامه اکسس هستش.
اطلاعاتی که می خواهیم واردکنیم به این صورت هست.مثلاً:
درتاریخ 1393/11/30 چندین دانش آموز به دلیل بیماری درمدرسه حاضرنبوده اندوغیبت دارند.ضمناً همه هم گواهی پزشکی دارند.چون جدول غیبت شامل فیلدهای:
1.کدملی(ازجدول استیودنت)
2.تاریخ غیبت
3.علّت غیبت
4.گواهی (دارد،ندارد)
می باشند.حالااگرازطریق یک(Adoquery)لیست تمام دانش آموزان راتهیه کرده ایم ونکته اینجاست که می خواهیم ازلیست کلی دانش آموزان فقط همان سه نفر(که ممکن است متوالی هم نباشند(پشت سرهم نباشند))راانتخاب کرده وفیلدهای فرم غیبت رایکبارپرکنیم که برای تمام نفراتی که انتخاب کرده ایم، اطلاعات یکسانی واردشود.(برای هرسه نفرغیبت ثبت شود)
امیدوارم منظورراخوب رسونده باشم.
ممنون میشم اگربیشترراهنمایی بفرمایید.
یوسف زالی
جمعه 01 اسفند 1393, 00:21 صبح
insert into TBL
select Code, '1393/11/30', 1, 1
from Students
where Code in (150, 273, 8, 11, 79, 13)
amirkazem
جمعه 01 اسفند 1393, 22:45 عصر
جناب You See
لطفاًتصویرضمیمه راملاحظه بفرمایید، توضیحاتی که درتاپیکهای قبلی دادم رامشاهده می فرمایید.
برروی تصویرتعدادی رکوردرا رنگی کرده ام.(رنگ زرد).باکدی که شمافرمودید؛چطوری میتونیم همزمان کدمربوطه راجراکنیم؟
لطفاًراهنمایی بفرمایید.(بایک بارپرکردن فرم، غیبت برای چهارنفرثبت شود)
یوسف زالی
شنبه 02 اسفند 1393, 11:33 صبح
فکر کردم متوجه شدید.
ببینید،
با یک حلقه روی DBGrid می تونید SelectedItems ها رو در بیارید، با استفاده از بوک مارک.
uses StrUtils
.
.
var
Qry: string;
.
.
Qry := '';
for i := 0 to DBGrid.SelectedRows.Count -1 do
begin
YourDataSet.Bookmark := DBGrid.SelectedRows[i];
Qry := Qry + IfThen(i = 0, '', ', ') + YourDataSet.FieldValues['StudentSerial'];
.
.
end;
.
.
Qry :=
'insert into AbsentTbl(Code, Date, Reason, HasMedicalDoc) ' +
'select StudentSerial, ' + QuotedStr(AbsentMask) + ', ' +
QuotedStr(ReasonEdit) + ', ' + IfThen(HasMedicalCheck, '1 ', '0 ') +
'from StudentTbl where StudentSerial in (' + Qry + ')';
hp1361
شنبه 02 اسفند 1393, 17:43 عصر
سلام
برنامه شما برنامه ای با هزاران کلاینت نیست که بهتر باشه تمام اطلاعات در قالب یک کوئری به بانک فرستاده بشه و در اونجا ذخیره بشه!
یه حلقه بنویسید که به تعداد رکوردهای انتخاب شده تکرار بشه. درون حلقه هربار اطلاعات مربوط به یک رکورد رو در بانک ذخیره کنید. مثلا 4 تا رکورد(دانش آموز) انتخاب شده اند پس درون یک حلقه که 4 بار تکرار میشه هر بار غیبتی برای دانش آموزی که کد دانش آموزیش از DBGrid واکشی میشه در دیتابیس ذخیره میشه(تکرار یک موضوع برای 4 نفر)
موفق باشیم
amirkazem
شنبه 02 اسفند 1393, 21:39 عصر
باسلام ضمن تشکرازراهنمایی های بی منّت شمادوستان گرامی؛
جنابhp1361به عرض برسونم درسته برنامه دارای هزاران کلاینت نیست.امّایک اصل مهم درمدیریت مدارس مطرح هستش وانهم مدیریت مناسب زمان هست.باوجودحجم بسیارزیادکارهای تقریباً غیرضروری درآموزش وپرورش(بخشنامه های آب دوغ خیاری وجواب دادن اجباری به آنها) دیگروقتی برای پرداختن به اصل کارمدیریت که همان اداره مدرسه وسرپرستی دانش آموزان ورسیدن به امورآموزشی آناهست، نمی ماند.به همین جهت اصراربنده براین هستش که ثبت اموری ازقبیل(غیبت، شهریه، امورآموزشی و...) ازطریق لیست کلاس واردشودتاحداکثرصرفه جویی درزمان انجام گیرد.
درهرصورت ازمحبت همه دوستان بسیارممنونم وبازهم نیازمندارشادشماعزیزان هستم.
:خجالت::تشویق:
hp1361
شنبه 02 اسفند 1393, 22:00 عصر
سلام
از نظر میزان زمان صرف شده برای اضافه نمودن اطلاعات در قالب یک کوئری و در قالب 4 کوئری تفاوت آنچنانی کاربر حس نخواهد کرد. میشه گفت اصلا تفاوتی نمیبینه!
صحبت من منافاتی با روش کاری که شما در نظر دارید نداره. صرفاً میگه کدهاتون چطور نوشته بشه.
موفق باشیم
amirkazem
شنبه 02 اسفند 1393, 22:43 عصر
فکر کردم متوجه شدید.
ببینید،
با یک حلقه روی DBGrid می تونید SelectedItems ها رو در بیارید، با استفاده از بوک مارک.
uses StrUtils
.
.
var
Qry: string;
.
.
Qry := '';
for i := 0 to DBGrid.SelectedRows.Count -1 do
begin
YourDataSet.Bookmark := DBGrid.SelectedRows[i];
Qry := Qry + IfThen(i = 0, '', ', ') + YourDataSet.FieldValues['StudentSerial'];
.
.
end;
.
.
Qry :=
'insert into AbsentTbl(Code, Date, Reason, HasMedicalDoc) ' +
'select StudentSerial, ' + QuotedStr(AbsentMask) + ', ' +
QuotedStr(ReasonEdit) + ', ' + IfThen(HasMedicalCheck, '1 ', '0 ') +
'from StudentTbl where StudentSerial in (' + Qry + ')';
سلام. باعرض معذرت.ببخشیداگرسوالم ابتدایی هستش.چون مبتدی هستم مجبوراًبپرسم.
ببخشیداین کدهاکه زحمت کشیدید رو در رویداد دکمه ذخیره واردکردم ولی کمی خطامیگیره.
( دقیقاً دراین قسمت ومخصوصاً این دونقطه. .( Qry: string;..)) میشه بفرماییددقیقاً کجاودرچه رویدادی بایدبنویسیم؟
ممنون
hadisalahi2
یک شنبه 03 اسفند 1393, 09:24 صبح
اگه کامل وارد کردی که بایدم خطا بگیره ، چون :
uses StrUtils
باید توی هیدر یونیتت بنویسی همونجایی که کلمه Uses هستش
اون دو تا نقطه ها رو هم نباید بزاری ، چون اونا یعنی اگه کدی داری این قسمتها میتونی اضافه کنی
Qry := 'insert into AbsentTbl(Code, Date, Reason, HasMedicalDoc) ' +
'select StudentSerial, ' + QuotedStr(AbsentMask) + ', ' +
QuotedStr(ReasonEdit) + ', ' + IfThen(HasMedicalCheck, '1 ', '0 ') +
'from StudentTbl where StudentSerial in (' + Qry + ')';
این کدها رو هم باید بریزی توی خاصیت Text یک Adoquery اینطوری:
Adoquery1.close;
Adoquery1.sql.text=qry;
Adoquery1.ExecSQL
amirkazem
دوشنبه 04 اسفند 1393, 21:22 عصر
جناب hadisalahi2باسلام مجدد
خدمتتون عرض کنم طبق فرمایش شماکدهای نوشته شده توسط آقای you seeرادرهیدر( usses unit )فرم کپی کرده ونقطه هاراهم حذف کردم ولی بازهم برنامه خطامی دهد.(عکس ضمیمه)ضمناً خاصیت (Multiselect) دی بی گریدراهم trueکرده ام ولی درهنگام کاربابرنامه (کلیک برروی رکوردهای دی بی گرید)فقط یک رکوردانتخاب می شود.مگراینکه دکمه(ctrl)راپایین نگهداریم.آن وقت مولتی سلکت انجام می شود.
ضمناً عرض می کنم وقتی چندیم رکوردازدی بی گریدانتخاب شدند؛ بایددرجدل غیبت که فیلدهای زیرراداردبنابه گفته شماوآقای yousee غیبت همان روزبرای رکوردهای انتخابی ثبت گردد.(حلقه که فرمودید)
جدول غیبت دارای فیلدهای:
1.cod_melli
2.date(تاریخ غیبت)
3.Day(ایام هفته)
4.dalil
5.gavahi
ضمناً جدول غیبت باجدول استیودنت بافیلدکلیدی(melli_code)ازجدول استیودنت وفیلد(cod_melli)ازجدول غیبت باهم ارتباط دارند.
محبت بفرماییداگرامکان دارد، باملاحظه تصویرضمیمه مساعدت نماییدتامشکل به لطف شمادوستان حل شود.
آرزومندتوفیق برای شمادوستان بزرگوارهستم
یوسف زالی
دوشنبه 04 اسفند 1393, 23:17 عصر
خب آخه عزیز من این begin - end ش کو؟
دیگه مبانی رو خودت انجام بده دیگه.
همین طوری که تو شیکم برنامه نمی شه کپی پیست کرد.
بعد اون AbsentMask رو من مثال نوشتم، همون طوری کپی پیست؟؟
:متعجب:
amirkazem
شنبه 16 اسفند 1393, 23:41 عصر
باسلام
باتشکرمجددازهمه دوستانی که دراین تاپیک باصبروحوصله بنده حقیرراراهنمایی فرمودند؛ به عرض برسونم باراهنمایی یکی ازدوستان بسیارخوبم جناب مهندس قره جانلو، برای درج اطلاعات یکسان برای گروهی ازدانش آموزان به روش ذیل عمل کردیم:
1.ابتدایک (Stringgride)روی فرم گذاشتیم.
2.سپس بااستفاده ازکدزیر:
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=ADOQuery2['melli_code'];StringGrid1.Cells[1,StringGrid1.RowCount-1]:=ADOQuery2['f_name'];StringGrid1.Cells[2,StringGrid1.RowCount-1]:=ADOQuery2['l_name'];StringGrid1.Cells[3,StringGrid1.RowCount-1]:=ADOQuery2['fa_name'];StringGrid1.RowCount:=StringGrid1.RowCount+1;
دانش آموزان منتخب از(DbGride)رابه ( grideString)انتقال دادیم.
3.وبااستفاده ازکدزیر:
procedure TForm40.Image1Click(Sender: TObject);var I: Integer;beginfor I := 1 to StringGrid1.RowCount-2 do begin ADOQuery3.SQL.Clear; ADOQuery3.SQL.add('INSERT INTO gheybat(cod_melli,tarikh,[day],dalil,gavahi) VALUES('+ QuotedStr(StringGrid1.Cells[0,i]) +','+ QuotedStr(SolarDatePicker1.Text)+ ','+ QuotedStr(DBComboBox1.Text)+','+ QuotedStr(Edit3.text) +','+ QuotedStr(RadioGroup1.Items[RadioGroup1.ItemIndex])+')'); ADOQuery3.ExecSQL; end; if (ADOQuery3.RowsAffected>0) then ShowMessage('غیبت دانش آموزان انتخابی ثبت شد');end;
غیبت دانش آموزان منتخب رادرجدول غیبت ثبت کردیم.
بارهاهم تست کردیم وبسیارخوب ومفیدهم کارکرد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.