با سلام به همه استادان و دوستان
میگم میخام برنامه ای بنویسم که مشخصات دانشجو را دریافت کردهو آنها رو سورت میکنه
ولی مهم اینجاست که باید کلیدی ساخت تا چک کند مشخصات وارده تکراری نباشه ضمنا دیتا بیس من 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:
بازهم از اینکه وقت گزاشتین و منو قابل دونستین که جوابمو بدین ممنونم