با سلام به همه استادان و دوستان
میگم میخام برنامه ای بنویسم که مشخصات دانشجو را دریافت کردهو آنها رو سورت میکنه
ولی مهم اینجاست که باید کلیدی ساخت تا چک کند مشخصات وارده تکراری نباشه ضمنا دیتا بیس من paradox هست و نمیخواهیم از دکمهkey استفاده کنیم
Printable View
با سلام به همه استادان و دوستان
میگم میخام برنامه ای بنویسم که مشخصات دانشجو را دریافت کردهو آنها رو سورت میکنه
ولی مهم اینجاست که باید کلیدی ساخت تا چک کند مشخصات وارده تکراری نباشه ضمنا دیتا بیس من paradox هست و نمیخواهیم از دکمهkey استفاده کنیم
اگه اينجوري پيش برين، خودتون رو مي كشيد. بهتره به اعصابتون مسلط باشين. در ضمن كسي اينجا موظف به پاسخ به سوال شما نيست.
و اما در مورد سوالتون. خيلي بد و نا مفهوم توضيح دادين. شما نمي خواين از كليد در ديتابيستون استفاده كنيد؟ اگه اينطوريه، مي تونم دليلش رو بپرسم؟ چون طبق استاندارد و قوانين پايگاه داده، هر جدولي ميبايستي حداقل يه فيلد كليد داشته باشه. و جدولي كه فيلد كليد نداره، استاندارد نيست.
و اما اگه از طريق كد نويسي بخواين بفهميد كه آيا مشخصات دانشجو تكراري هست يا خير، بايد ابتدا توسط دستورات SQL «كه احتمالاً بلدين ديگه» مثلاً نام و نام خانوادگي دانشجو رو در بانك جستجو كنه، و سپس بيان و خاصيت RecCount رو از ADOQuery رو چك كنيد. اگه مقداري غير از صفر بود، يعني اين نام قبلاً در بانك وجود داشته.
موفق باشين
ممنون از اینکه جوابمو دادین 1.از کلید استفاده نباید کرد چون استادمون میخاد برنامه نویسی بلد شیم( بقول استادمون : اگه دست من بود مجبورتون میکردم با زبان ماشین برنامه بنویسید) 2. کوری یعنی تنبل بازی همچنین دستورات sql یعنی باید خودمون با استفاده از آرایه ها و رشته ها و خلاقیت خودمون این کار رو انجام بدیم 3.وگرنه که با چند حرکت ساده میشد برنامه رو نوشت
استادتون نگفته وقتی قراره از این جدول رکوردی حذف و یا ویرایش بشه پیغام خطا میگیرید!؟نقل قول:
از کلید استفاده نباید کرد چون استادمون میخاد برنامه نویسی بلد شیم
همونطور که romixery هم گفتند در هر جدول باید کلید اصلی وجود دااشته باشه
البته از اونجا که قبلا شرح حال استادتون رو فرمودید درخواست شما زیاد جای تعجب نداره
برای راحت تر شدن کار خودتون شماره ی دانشجویی رو به عنوان فیلد یکتا در نظر بگیرید و قبل از ورود اطلاعات جدید، شماره دانشجویی رو چک کنید
منظورتون چيه؟ مگه نميگيد كه داده ها در بانك Paradox هستش. آرايه واسه چي ميخواين؟ والا من كه نمي فهمم چي مي گين. اميدوارم استادتون حداقل فهميده باشه.کد:عنی باید خودمون با استفاده از آرایه ها و رشته ها و خلاقیت خودمون این کار رو انجام بدیم
اگه ميخواين از آرايه استفاده كنيد، يه راه اينه، «البته ببخشيد ولي بايد بگم راه ابلهانه، ولي در اين مورد خاص چاره اي نيست» كه يه ركورد تعريف كنيد. و فيلدهاي ركورد رو همانند و همنوع فيلدهاي جدول داخل ديتابيستون طراحي كنيد. سپس آرايه اي به طول محدود، از اون ركورد بگيرين. بعد تمام بانك اطلاعاتي تون رو پيمايش كنيد، و دونه دونه ديتا رو داخل آرايه و فيلدهاي متناظر اون قرار دهيد.
متد جستجو ديگه كاري نداره. مي تونيد با جستجوي خطي ساده، چك كنيد و ببينيد كه آيا نامي كه جديداً مي خواهيد به بانك اضافه كنيد، قبلاً در آرايه هست يا نه، در غير اين صورت به جدولتون و هم آرايه، اضافش كنيد.
فكر مي كنم بتونيد با اين كار به اندازه كافي حس آدم آزاري استادتون رو ارضاء كنيد.
موفق باشين.
<br />نقل قول:
<br />
ببخشید ولی استادمون گفته اینا نباید شماره دانشجوئی داشته باشند و مثلا اول باید اسمها رو چک کنه اگه تکراری داشت بره فامیلی رو چک کنه اگه باز هم تکراری بود همینطور ادامه بده تا آخر . . . اگه آخر کار معلوم شد این تکراری هست ذخیره نکنه و پیام بده همش همین بود
ببین استادمون گفته رکورد ها بصورت بالونی حرکت کنند تا مرتب بشند و قبلش هم باید چک شده باشه که تکراری نداشته باشه یعنی فقط یک تیبل باید باشهنقل قول:
فيلدهاي ركورد رو همانند و همنوع فيلدهاي جدول داخل ديتابيستون طراحي كنيد. سپس آرايه اي به طول محدود، از اون ركورد بگيرين. بعد تمام بانك اطلاعاتي تون رو پيمايش كنيد، و دونه دونه ديتا رو داخل آرايه و فيلدهاي متناظر اون قرار دهيد.
واقعاً نمي تونستين اينو توي پس اول بدين تا بيخود اينهمه تاپيك رو طولاني نكنيم؟!!!کد:بخشید ولی استادمون گفته اینا نباید شماره دانشجوئی داشته باشند و مثلا اول باید اسمها رو چک کنه اگه تکراری داشت بره فامیلی رو چک کنه اگه باز هم تکراری بود همینطور ادامه بده تا آخر
خوب حالا بگين ببينم. مي تونيد از كلاسهاي دلفي استفاده كنيد يا خير. مي تونيد اين برنامه رو به صورت بازگشتي و با استفاده از TString حل كنيد.
ببينيد دوست عزيز، به طور كلي همه محدوديتهات و امكاناتي كه مي توني داشته باشي رو بگو تا بعد از اينكه برنامه رو نوشتيم، نگي كه "نه، اينطوري نمي خواستم، بايد ا...."
موفق باشين.
سلام. خوب نيازي نيست كه از كلاسهاي دلفي استفاده كني. برنامه رو برات نوشتم. البته توجه كن، من به جاي اينكه از ديتابيس استفاده كنم، از آرايه و ركورد استفاده كردم. تا بهتر بفهمي. برات يه كلاس نوشتم:
من فرض كردم كه توي جدول ديتابيست، سه فيلد به نامهاي name , family , age وجود داره. هيچ كدومم كليد نيست.کد:TtableRec = record
fields : packed array [0..2] of string;
end;
TSearcher = class
Table : array of TtableRec;
TBLSIZE : integer;
FIELD_NUMBER : integer;
function tblfind(info : TtableRec):boolean;
function recessive(info : TtableRec; ind : integer;
const field : integer = 0): boolean;
public
constructor Create(TABLE_MAX_SIZE : integer);
function find(name , family , age : string):boolean;
procedure insert(name , family , age : string);
end;
شرح توابع كلاسها:
تابع find با گرفتن سه پارامتر نام، فاميل و سال، مي گرده و مي بينه آيا چنين فردي در جدول وجود داره يا نه. در صورت وجود داشتن، True و در غير اينصورت False رو بر مي گردونه. اين تابع كار خاصي انجام نميده، فقط شكل public تابع tblFind هست كه اون رو فراخوني مي كنه. در استاندارد كلاس نويسي، بايد به اين شكل تابع نوشت.
تابع tblFind، ليست رو پيمايش كرده و در صورتي كه نام دو دانشجو برابر بود، براي جستجوي بقيه فيلدها تابع recessive رو صدا ميزنه.
تابع recessive، كار اصلي رو انجام ميده. و دونه دونه فيلدها رو مي گرده و در صورتي كه همه فيلدها يكي بود، true و در غير اين صورت false رو بر مي گردونه.
متد insert، براي وارد كردن يك ركورد در جدول به كار ميره.
شرح متغير ها:
Table، جدول ماست كه از نوع ركورد هستش.
TBLSize، تعداد ركورد موجود در جدول هستش.
Field_Number، تعداد فيلد جدول هست. در اينجا ما سه فيلد داريم.
نحوه مقدار دهي كلاس:
متد Create اين كلاس، يه ورودي داره كه به حداكثر تعداد ركوردهاي جدولت رو مشخص مي كنه. مثلاً كد زير:
حداكثر تعداد ركوردهاي جدولت رو 10 تا ميگيره. (فضا گيري پويا)کد:ser := TSearcher.Create(10);
و اما شما چطور باهاش كار كني:
مي دونم كه شما ميخواي توي ديتابيس كار كني. پس به راحتي مي توني با استفاده از متدهاي TTable و يا ADOTable، مثل Record count يا Field از همين كلاس براي ديتابيست استفاده كني. خيلي خيلي سادست.
متن توابع رو ديگه خود تفسير كن. مشكلي داشتي بپرس:
موفق باشين.کد:var
Form1: TForm1;
ser : TSearcher;
implementation
{$R *.dfm}
{ TSearcher }
constructor TSearcher.Create(TABLE_MAX_SIZE: integer);
begin
setLength(Table , TABLE_MAX_SIZE);
TBLSIZE := 0;
FIELD_NUMBER := 3;
end;
function TSearcher.find(name, family, age: string): boolean;
var info : TtableRec;
begin
with info do
begin
fields[0] := name;
fields[1] := family;
fields[2] := age;
end;
result := tblfind(info);
end;
procedure TSearcher.insert(name, family, age: string);
begin
if (find(name , family , age)) then
begin
ShowMessage('Can`t insert item to table. Item exist already');
exit;
end;
with Table[TBLSIZE] do
begin
fields[0] := name;
fields[1] := family;
fields[2] := age;
end;
TBLSIZE := TBLSIZE + 1;
ShowMessage('Item inserted to table');
end;
function TSearcher.recessive(info: TtableRec; ind: integer;
const field: integer): boolean;
begin
result := false;
if (info.fields[field] = Table[ind].fields[field]) then
if (field = FIELD_NUMBER - 1) then
begin
result := true;
exit;
end
else
result := recessive(info , ind , field + 1);
end;
function TSearcher.tblfind(info: TtableRec): boolean;
var
ind : integer;
begin
result := false;
for ind := 0 to TBLSIZE do
begin
if (table[ind].fields[0] = info.fields[0]) then
result := recessive(info , ind);
if result then
exit;
end;
end;
میگم دمت گرم romixery جان واقعا کمک خیلی بزرگی کردی من امتحانش میکنم اگه با مشکل مواجه شدم بازهم مزاحمتون میشم:20:
میگم شرمنده ما اصلا کلاس کار نکردیم و نمیدونم متدهای ttable رو برا این کلاس چجوری باید استفاده کرد
میشه یه مثال کوچولو بزنی که این تعاریف بالا کجای برنامه و چجوری استفاده میشن:41:
آخه ما بلد شدیم یه دکمه یا چیزی مثل اون تعریف بشه بعد روی اونا تعاریف و دستورات پیاده بشن ولی کلاس رو نمیدونم چجوریه:13:
بازهم از اینکه وقت گزاشتین و منو قابل دونستین که جوابمو بدین ممنونم
اینو کجا باید بنویسمش؟؟؟نقل قول:
TtableRec = record
fields : packed array [0..2] of string;
end;
TSearcher = class
Table : array of TtableRec;
TBLSIZE : integer;
FIELD_NUMBER : integer;
function tblfind(info : TtableRec):boolean;
function recessive(info : TtableRec; ind : integer;
const field : integer = 0): boolean;
public
constructor Create(TABLE_MAX_SIZE : integer);
function find(name , family , age : string):boolean;
procedure insert(name , family , age : string);
end;
اینو باید کلید براش تعریف کرد یا فقط همین رو بنویسم کفایت میکنهنقل قول:
constructor TSearcher.Create(TABLE_MAX_SIZE: integer);
یا
ویانقل قول:
function TSearcher.find(name, family, age: string): boolean;
وهمچنین این یکی رونقل قول:
procedure TSearcher.insert(name, family, age: string);
نقل قول:
function TSearcher.recessive(info: TtableRec; ind: integer;
const field: integer): boolean;
اگه میشه یه توضیحی بدین اینا با دکمه یا چیز دیگری وصل میشه یا خودشون همینجوری کار میکنننقل قول:
function TSearcher.tblfind(info: TtableRec): boolean;
ورودیهامون چجوری باشه خوروجیمون چطوری
بازهم تشکرم
يه نمونه برنامه براتون آماده كردم. با دلفي 7 نوشتمش.
از چه كامپوننتي براي ارتباط با پايگاه داده استفاده مي كنيد. AdoConnection يا از Table خود دلفي (BDE)؟کد:http://rapidshare.com/files/331752048/Searcher.rar.html
من از table خود دلفی باید استفاده بشه (bde)
بابت برنامه هم ممنون خیلی لطف کردین
من میرم امتحانش کنم دستت درد نکنه
سلام
romixery جان میگم من چون هنوز نتونستم کلاس ها رو خوب یاد بگیرم میشه راهنمائیم کنی چطوری میتونم از این کلاس برای table و datasorce استفاده کنم (یعنی این کلاس چجوری فراخانی میشه و جوابش رو چطوری دریافت کنم
سلام. با تشکر از romixery عزیز برای کدی که قرار دادند. شما برای رفع مشکلتون نیازی نیست دقیقا این کد رو با استفاده از کلاس پیاده سازی کنید. از توابع موجود، در برنامه خودتون استفاده کنید. مثلا تابع زیر رو خودتون در برنامه ایجاد کنید و استفاده کنید:
کد:
tblfind(info: TtableRec): boolean;
var
ind : integer;
begin
result := false;
for ind := 0 to TBLSIZE do
begin
if (table[ind].fields[0] = info.fields[0]) then
result := recessive(info , ind);
if result then
exit;
end;
end;
من یه سوالی برام پش اومده
اینinfo و ind چکارند یعنی این دو متغییر وضیفشون چیه؟
فرهاد جان میترسم جداشون کنم توابع رو ؛ دیگه کار نده
من فقط میخام بدونم کجاها باید ورودی داشت و کجاها چه خوروجی میده البته اگه بشه بگین که برای استفاده با table دستورات چه تغییراتی میکنه چون خودم کمی باهاش کار کردم دیدم انگار خیلی از دستورات عوض میشه میخام بدونم همینطور هست یا نه
بازهم از همتون متشکرم
info يه ركورده كه نام، فاميل و سال فردي رو كه ميخواي توي جدولت، جستجوش كني، توش قرار داده شده. اگه به تابع find توجه كنيد، ميفهميد كه چي شده.
ind يه متغير هست كه از ركورد اول تا آخرين ركورد جدولت ميره، و دونه دونه اونها رو دستيابي مي كنه. براي مثال اگه ind=5 و [5]Table[ind]=Table يعني، ركورد ششم جدول «توجه كن كه جدول از 0 شروع ميشه. پس خانه 0، اولين خونه هست و ...»
بيشتر از اين توضيح مي خواد؟
فقط کاشکی میگفتی چطور table1 توش تعریف میشه
راسی یه سوال دیگه میگم شما برا چک کردن از علامت = استفاده میکنید اگه برا sort کردن بخوام از این توابع به کمک > یا < استفاده کنیم میشه یا نه
کسی میتونه جوابمو بده لطفا .....لطفانقل قول:
سلام
romixery جان میگم من چون هنوز نتونستم کلاس ها رو خوب یاد بگیرم میشه راهنمائیم کنی چطوری میتونم از این کلاس برای table و datasorce استفاده کنم (یعنی این کلاس چجوری فراخانی میشه و جوابش رو چطوری دریافت کنم
من خواهش میکنم در این مورد کمکم کنید باورکنید ثواب داره
قبلا عرض کردمنقل قول:
کسی میتونه جوابمو بده لطفا .....لطفا
یعنی کلاس رو کلا بیخیال بشید (با توجه به وضعیت استادتون)نقل قول:
با تشکر از romixery عزیز برای کدی که قرار دادند. شما برای رفع مشکلتون نیازی نیست دقیقا این کد رو با استفاده از کلاس پیاده سازی کنید. از توابع موجود، در برنامه خودتون استفاده کنید
کلاس رو یاد بگیرید اما نیازی به استفاده از اون برای این پروژه نیست
لطفا اگه میشه از اساتید محترم خواهش میکنم یه نظری هم رو مطلب بالایی بدین ممنون دارتون میشمنقل قول:
راسی یه سوال دیگه میگم شما برا چک کردن از علامت = استفاده میکنید اگه برا sort کردن بخوام از این توابع به کمک > یا < استفاده کنیم میشه یا نه
نقل قول:
راسی یه سوال دیگه میگم شما برا چک کردن از علامت = استفاده میکنید اگه برا sort کردن بخوام از این توابع به کمک > یا < استفاده کنیم میشه یا نه
لطفا اگه میشه از اساتید محترم خواهش میکنم یه نظری هم رو مطلب بالایی بدین ممنون دارتون میشم
میگم دیگه داره مهلتم تموم میشه کسی نمیتونه سورت کردن تو خود تیبل رو بگهنقل قول:
فرهاد جان ميگم استفاده از اين وابع نياز مند چه چيزهاي ديگري هست يعني چه چيزهايي رو بايد براش تعريف كرد؟
شکل کلی تعریف توابع در دلفی:نقل قول:
برای استفاده در رویدادهای مختلف(مثلا ButtonClick):کد:
Function MyFunc(MyVar:VarType):ResultType
begin
.
.
.
end;
کد:
procedure TForm1.Button1Click(Sender: TObject);
begin
.
.
.
MyFunc(MyVar:VarType);
.
.
.
end;
يه سوال فني. شما چقدر وقته دارين با دلفي كار مي كنيد؟ فكر نمي كردم ديگه توي اين انجمن نحوه تعريف توابع در دلفي مطرح بشه چون اينقدر آموزش و مطلب و مقاله اينجاست كه جايي براي اينجور چيزا نمي مونه. اينجا جا داره يه بار ديگه به امضاي زيباي دوستمون NoneForce عزيز رجوع كنيم:
انسانها به ١1 گروه تقسيم مي شوند. آنهايي كه باينري مي فهمند و آنهايي كه نمي فهمند و آنهايي كه نمي توانند Search كنند.
حقیقتش از اول ترم تا حالا البته اگه باور کنید من از خودم سیستم ندارم و فقط در محل کار میتونم سر سیستم بشینم و برم تو اینترنت
از طرفی هم فکنم کلا 5 یا 6 جلسه دلفی داشتیم که بالا ترین کاری که کرده بودیم این بوده یه table بسازیم و توی فرم اطلاعاتش رو نشون بدیم و عمل در و حذف رو روش انجام بدیم
ولی برای پروژه استاد فرمودند با پارادوکس باید فلان کار را بکنین و تا 30 دیماه تحویل بدین
تازه جالبش اینجاست که بچه های کلاس هیچکدوم تمیرینات قبلی رو هم انجام ندادند ولی همه بجز من این یکی رو تحویل دادند حلا چطوریشو خدا میدونه آخه از هرکدوم هم پرسیدم چطوری برنامتو نوشتی میگفت نمی دونم بالاخره با اون اطلاعاتی که داشتیم تونسیم بنویسیم
اما باور کن از این 5 یا 6 کلاس کلا 3 جلسه آموزش داشتیم
حالا باید یکم متوجه شده باشی برا چی اینقده گیج میزنم ضمنا باور نمی کنی اگه بگم تو آزمایشگاه پایگاه داده هر کی میخاست بفهمه کجا کارش ایراد اره برنامشو میداد من چک میکردم
میگم آخرش هیچکی نگفت چطوری سورتش کنم با کد نویسی
میگم یکی میتونه بهم بگه چطور میتونم یک رکورد راجابجا کنم
[romixery] جان شما چی شما نمی تونی بگی چطور با کد نویسی میشه یه رکورد را جابجا کرد یا حتی سلکت کرد
من نگفتم كه شما گيج ميزنين. هر كسي در ابتداي كار با اين مشكلات مواجه ميشه. ولي بحث سر اينه كه با يه جستجوي كوچيك، مي تونستين جواب اكثر اين سوالاتتون رو در اينترنت پيدا كنيد. چون شما تنها كسي توي دنيا نيستين كه با اين مشكل مواجه شدين. پس حتماً از ندانسته هاي ديگران، مي تونيد، جهت دانسته هاي خودتون استفاده كنيد.
و اما جواب سوالتون براي مرتب سازي جدول. ببنيند، يكي از راهها استفاده از SQL هست كه شما مي گيد نمي تونيد ازش استفاده كنيد. پس بايد راه ديگه اي رو انتخاب كرد. شما نمي تونيد ركورد هاي جدولتون در ديتابيس رو جابجا كنيد. پس نمي تونيد روي جدولي كه به بانك متصل هست، عمل مرتب سازي انجام بدين. چون شما از كامپوننت Table استفاده كردين، كارتون راحته و نيازي به كد نويسي براي مرتب سازي بر اساس فيلد خاصي نيست. چجوري؟ با استفاده از Index:
مرحله اول: ابتدا در بانك اطلاعاتيتون براي هر فيلد، يه ايندكس بسازين. اميدوارم بلد باشين اين كار رو انجام بدين.
مرحله دوم: ست كردن خاصيت IndexName از كامپوننت Table. با ست كردن اين خاصيت بر روي هر كدام از ايندكسهاي جدولتون، جدول بر اساس فيلد مورد نظر مرتب ميشه. اگه استادتون به اين گير داد بهش بگو، استاد خود همين الان برام بنويس ببينم خودت حاليته يا نه. بعد به دانشجو اينقدر گير بده..... مردم آزار
در مورد اينكه بقيه بچه ها هم چجوري اين برنامه رو نوشتن، خيلي خودت رو ازيت نكن. با 20-30 تومن، هر كسي اين برنامه رو براشون مي نويسه. اكثر دانشجوهاي ما همينجورين. دارم ميبينم.
موفق باشين
فک کنم آموزش ایندکس رو بتونم پیدا کنم میرم ببینم چی میشه
ما که پروژه رو تحویل دادیم ولی نتونستیم سورتش کنیم
خوب مباركه. البته اين موضوع حتماً خيلي مهم بوده كه براش يه پست دادين!!! اينكه مرتبش نتونستين بكنيد كه خوبه. شما دعا كنيد كه استادتون برنامه رو جايي اجرا كنه كه بانك پارادكس روش نصب باشه، و بانكهايي كه شما تعريف كردين هم داخلش باشه. وگرنه برنامتون سرشار از خطا خواهد بود ... به نظر نمياد كه شما يه برنامه نصاب براش نوشته باشين.
بلد هستم تو پورژه هایی که قبلا بوردم سرکلاس با مشکل برخورده بودم و الان بلد بودم چه طور باید باشه
راسی بقیه بچه ها رو پرسیدم همشون با کوری سورتش کرده بودن که به درد نمیخوره
ضمنا از همه شما عزیزان که خیلی کمکم کردین مخصوصا شما دوست عزیز romixery جانم خیلی خیلی ممنون البته سعی میکنم این فرم دلفی رو ترک نکنم و تا جایی که بتونم ادامش بدم چون خیلی از دلفی و بیشتر از اساتید بی ادعای این سایت خوشم اومده:10:
براش یه هلپ گزاشتمنقل قول:
شما دعا كنيد كه استادتون برنامه رو جايي اجرا كنه كه بانك پارادكس روش نصب باشه
دیدار مجدد شما خوشحالمون میکنهنقل قول:
سعی میکنم این فرم دلفی رو ترک نکنم
شاد باشید