ورود

View Full Version : هم فکری برای پیاده سازی جداول برنامه



M.Ehsanifar
سه شنبه 13 آذر 1386, 20:18 عصر
سلام دوستان
من در حال نوشتن یک برنامه هستم که دو جدول اصلی داره .

جدول خریدها : شماره خرید - نام خریدار - نام کالا - تعداد کالا - قیمت کالا - قیمت کل - مصرف کننده ها (فیلدی شامل نام هرمصرف کننده + فضای خالی ) - تاریخ .
جدول اشخاص : نام .
مثال برای محتویات یک فیلد مصرف کننده ها :(علی رضا امین احسان)

من جدول های موجود رو تغییر دادم . به این صورت که فیلد مصرف کننده ها رو از جدول خرید حذف کردم و جدولی جدید به نام "خریدها و اشخاص" بوجود آوردم که به صورت مقابل باشه : نام شخص - شماره خرید (هر دوفیلد کلید باشن) و این جدول مصرف کننده بودن اشخاص رو در خرید ها نشون می ده .
مشکل من اینجاس که در روش قبلی در هر رکورد جدول می شد دید که چه کسانی مصرف کننده هستن (به طور کلی در تمام جدول) . ولی در حالت جدید فقط با یک query و قرار دادن DBGrid اون کنار جدول خرید ها می شه نشون داد که رکوردی که انتخاب شده چه مصرف کننده هایی داره .

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

متشکرم

Mohammad_Mnt
سه شنبه 13 آذر 1386, 20:48 عصر
جدول‌ها باید این طوری باشه:

جدول اشخاص:
کد (منحصربه‌فرد)، نام و نام خانوادگی

جدول کالا:
کد (منحصربه‌فرد)، نام، واحد

جدول خرید:
سریال (منحصربه‌فرد) (اگر احتمال شماره‌ی خرید تکراری وجود داره)
ش. خرید
کد خریدار
کد کالا
تعداد
قیمت
قیمت کل ( به صورت فلید محاسباتی Calculated )



حالا در مورد مصرف کننده. من نمی‌دونم که توی سیستم شما دقیقا" مصرف کننده‌ها چه کسانی هستند و رابطه‌شون با کالا چطوریه. فعلاً فرض می‌کنم که هر کالا یک سری مصرف کننده داره:
جدول مصرف کننده:
کد (منحصربه‌فرد)
نام

جدول کالا-مصرف کننده:
کد کالا
کد مصرف کننده

* توی این جدول ممکنه 10 تا رکورد با مقدار یکسان توی فیلد کد کالا داشته باشیم

توضیح بشتر بدی بهتر می‌تونم کمک کنم

SYNDROME
سه شنبه 13 آذر 1386, 21:37 عصر
در صورتی که روش دوم رو انتخاب کنم آیا می تونم وقتی دارم جدول خرید ها رو نشون می دم در هر رکور فیلدی به صورت مجازی اضافه کنم که مصرف کننده های اون خرید رو نشون بده .

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

M.Ehsanifar
سه شنبه 13 آذر 1386, 22:30 عصر
حالا در مورد مصرف کننده. من نمی‌دونم که توی سیستم شما دقیقا" مصرف کننده‌ها چه کسانی هستند و رابطه‌شون با کالا چطوریه. فعلاً فرض می‌کنم که هر کالا یک سری مصرف کننده داره:


جدول مربوط به مخارج مشترک میان اشخاص در خانه دانشجویی است . افراد خرید هایی را انجام می دهند مثل خریدن 5 عدد تخم مرغ که قیمت هر تخم مرغ خریداری شده 100 تومان می باشد و این تخم مرغ ها را تعدادی از اشخاص که می تواند خود خریدار یا همخانه ای های خریدار باشد (به طور کلی هر یک از اشخاص ثبت شده برای این خرید ) مصرف کرده اند . این خرید یک شماره دارد که منحصر به فرد است (شماره خرید) .


جدول مصرف کننده:
کد (منحصربه‌فرد)
نام


نام ها منحصر به فرد هستند (نام یا نام مستعار) .. استفاده از کد لازم نیست ..


جدول کالا-مصرف کننده:
کد کالا
کد مصرف کننده


جدول خرید - مصرف کننده :
کد خرید
نام شخص

این هم تصویری از رکورد ثبت شده در جدول روش اول :
12671

من می خوام یه همچین تصویر و نمایی رو برای کاربر در روش دوم بوجود بیارم .یعنی اینکه فیلد مصرف کننده رو از جدول خرید ها حذف و جدول "کد خرید - نام اشخاص" رو جایگزین کنم . و در حالی که مصرف کننده های یک خرید رو به طور غیر مستقیم مشخص هستند اونها بوسیله یک Query و به صورت فیلدی مجازی به جدول خریدها اضافه کنم . در این صورت مصرف کننده های هر خرید رو در همون رکورد (درست مثل تصویر روش اول که در بالا نشون دادم) نشون داده می شن و در عین حال جداول استاندارد تر هستند .


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

می دونم که با join می شه دو تا جدول رو بوسیله رکور های مرتبط به هم چسبوند (به طور مجازی و ظاهری) و یک جدول جدید ایجاد کرد ولی جدولی که من می خوام کاربر مشاهده کنه همون جدول بدون مصرف کننده است که با اضافه کردن یک ستون در وسط آن مصرف کننده های هر رکورد در فیلد این ستون مشخص می شه . در حالی که مصرف کننده ها در جدولی جدا گانه به شماره خرید مور نظر ربط داده می شوند (جدول کد خرید - نام شخص) و در جدول خرید ها اصلا نامی از مصرف کننده ها ثبت نمی شود .
.

SYNDROME
چهارشنبه 14 آذر 1386, 05:10 صبح
می دونم که با join می شه دو تا جدول رو بوسیله رکور های مرتبط به هم چسبوند (به طور مجازی و ظاهری) و یک جدول جدید ایجاد کرد ولی جدولی که من می خوام کاربر مشاهده کنه همون جدول بدون مصرف کننده است که با اضافه کردن یک ستون در وسط آن مصرف کننده های هر رکورد در فیلد این ستون مشخص می شه . در حالی که مصرف کننده ها در جدولی جدا گانه به شماره خرید مور نظر ربط داده می شوند (جدول کد خرید - نام شخص) و در جدول خرید ها اصلا نامی از مصرف کننده ها ثبت نمی شود .
.
1-چرا می خواهی یک جدول بسازی خوب همان Join را به کاربر نمایش بده؟
2-می توانی در هنگام نمایش از یک جدول Temp استفاده کنی و Join مورد نظر را داخل آن بریزی.
موفق باشید

M.Ehsanifar
چهارشنبه 14 آذر 1386, 15:12 عصر
1-چرا می خواهی یک جدول بسازی خوب همان Join را به کاربر نمایش بده؟
2-می توانی در هنگام نمایش از یک جدول Temp استفاده کنی و Join مورد نظر را داخل آن بریزی.
موفق باشید

خیلی ممنون از راهنماییتون .. اگر ممکنه query مورد نظرتون رو برای این کار بنویسید .. query که وسط جدول بدون مصرف کننده ستون مصرف کننده ها رو بوجود بیاره . مثل تصویری که نشون دادم . متشکرم

SYNDROME
چهارشنبه 14 آذر 1386, 18:29 عصر
خیلی ممنون از راهنماییتون .. اگر ممکنه query مورد نظرتون رو برای این کار بنویسید .. query که وسط جدول بدون مصرف کننده ستون مصرف کننده ها رو بوجود بیاره . مثل تصویری که نشون دادم . متشکرم


Select T1.* , T2.Name
From Tbl_Test1 T1
Inner Join Tbl_Test2 T2
On T1.Code = T2.Code

Tbl_Test1 : جدول اولیه شما و فیلد Code هم کد مصرف کننده را ذخیره می کند.
Tbl_Test2 : جدول مصرف کننده شما و فیلد Code آن هم همان فیلدی است که در جدول قبل ذخیره می شود و فیلد Name هم نام مصرف کننده شما را در خود جای داده است.
موفق باشید

M.Ehsanifar
پنج شنبه 15 آذر 1386, 14:03 عصر
Tbl_Test1 : جدول اولیه شما و فیلد Code هم کد مصرف کننده را ذخیره می کند.
Tbl_Test2 : جدول مصرف کننده شما و فیلد Code آن هم همان فیلدی است که در جدول قبل ذخیره می شود و فیلد Name هم نام مصرف کننده شما را در خود جای داده است.
موفق باشید

متشکرم . کدی که نوشتین خیلی برام مفید بود ..
ولی مقصود اصلی منو برآورده نکرد .. اگه تصویری که براتون ضمیمه می کنم رو مشاهده کنید می بینید که به ازای هر نفر که در یک خرید مصرف کننده است یک بار رکورد مورد نظر تکرار می شود . در حالی که باید کل مصرف کننده های یک خرید مورد نظر در فیلد جدید ساخته شده بصورت یک رشته نمایش داده شوند .. مثلا (ali , amir ) در فیلد جدید (consumerEX) برای خریدی با کد 1 . (در حالتی که در تصویر مشاهده می کنید فضای حافظه هرز می ره)

12712

SYNDROME
پنج شنبه 15 آذر 1386, 14:29 عصر
متشکرم . کدی که نوشتین خیلی برام مفید بود ..
ولی مقصود اصلی منو برآورده نکرد .. اگه تصویری که براتون ضمیمه می کنم رو مشاهده کنید می بینید که به ازای هر نفر که در یک خرید مصرف کننده است یک بار رکورد مورد نظر تکرار می شود . در حالی که باید کل مصرف کننده های یک خرید مورد نظر در فیلد جدید ساخته شده بصورت یک رشته نمایش داده شوند .. مثلا (ali , amir ) در فیلد جدید (consumerEX) برای خریدی با کد 1 . (در حالتی که در تصویر مشاهده می کنید فضای حافظه هرز می ره)

12712
منظورتان این است که یک خرید چند مصرف کننده دارد.
بیشترین تعداد مصرف کننده ها چند نفر است یا می تواند به هر تعدادی بالا برود؟
اگر تعداد مصرف کننده ها باز باشد بهتر است از یک جدول Temp استفاده کنید و مقادیر را در آن قرار دهید.
موفق باشید

M.Ehsanifar
پنج شنبه 15 آذر 1386, 17:51 عصر
منظورتان این است که یک خرید چند مصرف کننده دارد.
بیشترین تعداد مصرف کننده ها چند نفر است یا می تواند به هر تعدادی بالا برود؟
موفق باشید

بله . یک خرید می تواند یک یا چند مصرف کننده داشته باشد .


اگر تعداد مصرف کننده ها باز باشد بهتر است از یک جدول Temp استفاده کنید و مقادیر را در آن قرار دهید.
موفق باشید
خوب من هم همین کار را کردم . به جای اینکه مصرف کننده ها را بطور مستقیم در فیلد مصرف کننده های جدول اصلی به عنوان مصرف کننده این خرید معرفی کنم و با space نام آنها را از هم جدا کنم (که کاری نا متعارف به نظر می رسد) ، در جدولی جدا گانه به نام (جدول "کد خرید -نام شخص") آنها را به عنوان مصرف کننده آن خرید مورد نظر تعریف می کنم .
("001 - علی" یعنی اینکه علی در خرید شماره 001 مصرف کننده بوده)
(چند رکورد از جدول کدخرید - نام شخص)
001 - ali
001 - reza
001 - ehsan
به طور غیر مستقیم می توان فهمید که علی و رضا و احسان هر سه مصرف کننده خرید شماره 001 هستند .
حال با این تغییرات انجام شده می خواهم با query جدول را به صورت قبلی که همان نشان دادن مصرف کننده های خرید شماره 001 در یک فیلد و جدا کردن آنها با space از هم است نشان دهم .(ایجاد نمای جدول قبلی در حالت جدید)
(یک رکورد جدول در نمای حقیقی)
001 - ehsan (kharidar) - mast - 2 (tedad) - 500(price) - 1386/3/5
(یک رکورد جدول در نمای query)
001 - ehsan (kharidar) - mast - 2 (tedad) - 500(price) - "ali reza ehsan"(masrafkonandeha) - 1386/3/5
یعنی بشود در داخل هر رکورد جدول اصلی نشان داد که مصرف کننده ها چه کسانی بودن .
امید وارم خوب توضیح داده باشم ..
بازم از راهنماییتون ممنونم ..

Exception
پنج شنبه 15 آذر 1386, 20:16 عصر
دوست عزیر من تو net. این کارو اینجوری انجام میدیم حالا توببین یک همچین کاری میتونی بکنی!
select مورد نظرتون رو بدون درنظر گرفتن اون ستون انجام بدید و به 1 grid اونو bind کنید سپس در itemTemplate اون grid یگ grid دیگه بگذارید و برای اون grid دستور select ای بنویسید که کد خرید رو بگیره و نام مصرف کننده ها رو بده .
bind شدن grid دوم در event rowDataBound گرید اول باید انجام بشه و پارامتر ورودی query یکی از ستون های هر سطر از grid اول است.

M.Ehsanifar
شنبه 17 آذر 1386, 23:56 عصر
دوست عزیر من تو net. این کارو اینجوری انجام میدیم حالا توببین یک همچین کاری میتونی بکنی!
select مورد نظرتون رو بدون درنظر گرفتن اون ستون انجام بدید و به 1 grid اونو bind کنید سپس در itemTemplate اون grid یگ grid دیگه بگذارید و برای اون grid دستور select ای بنویسید که کد خرید رو بگیره و نام مصرف کننده ها رو بده .
bind شدن grid دوم در event rowDataBound گرید اول باید انجام بشه و پارامتر ورودی query یکی از ستون های هر سطر از grid اول است.

خیلی متشکر . ولی نتونستم معادلش رو در دلفی پیدا کنم .

ولی یک راه دیگه پید کردم اونم استفاده از فیلد محاسباتیه .. (calculated field type)
ولی یه مشکلی دارم . وقتی یک فیلد محاسباتی مصرف کننده ها رو حساب می کنه . برای همه رکورد ها یکی در می یاد .
جدول "شماره خرید-نام شخص" منبع master یا همون (masterSource) خودش رو از جدول اصلی (خریدها) می گیره و باید در زمان محاسبه فیلد محسباتی مصرف کننده ها ، جدول "شماره خرید-نام شخص" در حالتی باشه که فقط رکوردهایی رو نشون بده که شماره فیلد "شماره خرید" شان با شماره خرید رکورد فعلی جدول اصلی یعنی جدول خرید ها برابرند .
اگه با masterSource کار کرده باشید متوجه منظورم می شید . ولی جواب این رو نشون نمی ده .

اگه کسی راه استفاده از فیلد محاسباتی در این حالت رو می دونه لطفا راهنمایی کنه ..

متشکرم ..

M.Ehsanifar
یک شنبه 18 آذر 1386, 02:05 صبح
بعد کلی سر و کله زدن با رویداد OnCalcFields برای فیلد محاسباتی بالاخره این کد رو نوشتم که به خوبی جواب داد. توضیحات رو هم پائین کد نوشتم .. اگه راهی بهتر یا کدی بهینه تر سراغ دارید لطفا بنویسید ، اگر هم این کد مناسبه تاپیک رو تایید کنم تا دوستان دیگه به عنوان راه حل ازش استفاده کنن .

بازم از تمام دوستان که همفکری کردن تشکر می کنم ..




procedure TDM1.tempListTableCalcFields(DataSet: TDataSet);
var
s,tempMasterFieldsStr:string;
begin
DM1.shopOPersonTable.Open;
with DM1.shopOPersonTable do
begin
tempMasterFieldsStr:=MasterFields;
MasterFields:='';
Filtered:=false;
Filter:='shopNo = '+ quotedStr(DM1.tempListTable['shopNo']);
Filtered:=true;
First;
s:='';
while not Eof do
begin
if s='' then
s:=Fields[1].value {Fields[1].value = consumerName or personName}
else
s:=s+' '+Fields[1].value;
Next;
end;
Filter:='';
Filtered:=false;
MasterFields:=tempMasterFieldsStr; //!!!!!
end;
DataSet['consumers']:=s;
end;



توضیحات :
tempListShopTable = جدول خرید ها که فیلد "consumers" به عنوان فیلد محسباتی در این جدول قرار می گیره .
shopOPersonTable = جدول "شماره خرید - نام شخص" (که شخص رو به عنوان یکی از مصرف کننده این خرید معرفی می کنه و هر دو فیلد کلید هستند ) . فیلد masterSource این جدول با منبع جدول خرید ها مقدار دهی شده تا از این خاصیت در جاهای دیگه استفاده بشه ولی در اینجا موقتا این خاصیت با حذف مقدار masterFields برداشته می شه تا از یک خطای خاص جلوگیری کنه .

رشته S مجموع رشته های نام مصرف کننده های خرید مورد نظر را که از جدول shopOPerson بیرون کشیده شده اند ذخیره می کند و در نهایت مقدار آن به عنوان نتیجه محاسبات در فیلد محاسباتی ذخیره می شود .

hamidele
سه شنبه 20 آذر 1386, 19:03 عصر
سلام دوست عزیز!
البته این نوشته من زیاد به موضوع مورد بحث مربوط نیست!!
داشتم کدی که نوشته بودی رو نگاه می کردم که دیدم خیلی خوب نکات ظریفی رو که کمتر رعایت میشه در نحوه نوشتن برنامه رعایت کردی!
می خواستم یه توصیه کوچیک بکنم: اینکه معمولا begin و end زیر دستور قلمداد نمیشن! پس لازم نیست که فاصله زیادی بین اونها و دستور قبلشون بدیم! می تونی از پیش فرض های خود دلفی برای نوشتن کدت استفاده کنی(با نوشتن حرف اول دستور ذخیره شده و زدن دکمه Ctrl+j )دلفی معمولا به جای 4 فاصله خالی برای یک زیر دستور از 2 فاصله استفاده میکنه!
------------------------------------
راستی از طرح دانشجویی که داده بودی خوشم اومد ولی یه سوال برام مطرحه که چرا برنامه ای که مینویسی درصد استفاده از کالا ها ی خریداری شده توسط هر یک از مصرف کنندگان رو نمیگیره؟ مثلا اگر از 10 تا تخم مرغی که محمود خریده 5 تاش رو خودش مصرف کنه و 2 تاش رو علی و 3 تاش رو احمد ! بازم برای حساب سهم هر کدام از انها ده سوم حساب میشه؟

<!-- /

M.Ehsanifar
چهارشنبه 21 آذر 1386, 20:53 عصر
می خواستم یه توصیه کوچیک بکنم: اینکه معمولا begin و end زیر دستور قلمداد نمیشن! پس لازم نیست که فاصله زیادی بین اونها و دستور قبلشون بدیم! می تونی از پیش فرض های خود دلفی برای نوشتن کدت استفاده کنی(با نوشتن حرف اول دستور ذخیره شده و زدن دکمه Ctrl+j )دلفی معمولا به جای 4 فاصله خالی برای یک زیر دستور از 2 فاصله استفاده میکنه!

اولین باری که با visual studio کار کردم خیلی از نحوه ای که برای آرایش کدها استفتده می کرد خوشم اومد . این فاصله زیاد بین دستورات و زیر دستورات باعث می شد که با یه نگاه سطحی از ساختار کلی اون و سلسه مراتب ها مطلع بشم .
V S علامت های شروع و پایان { } بصورت جداگانه فاصله می داد . اول فکر کردم کار وقت گیر و بی فایده ای باشه ، ولی وقتی که تاثیرش رو روی بلوک بندی خوب کد ها دیدم از این روش استفاده می کنم .


راستی از طرح دانشجویی که داده بودی خوشم اومد ولی یه سوال برام مطرحه که چرا برنامه ای که مینویسی درصد استفاده از کالا ها ی خریداری شده توسط هر یک از مصرف کنندگان رو نمیگیره؟ مثلا اگر از 10 تا تخم مرغی که محمود خریده 5 تاش رو خودش مصرف کنه و 2 تاش رو علی و 3 تاش رو احمد ! بازم برای حساب سهم هر کدام از انها ده سوم حساب میشه؟

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