ورود

View Full Version : سوال: مشکل در ایجاد رابطه بین چندین جدول در پروژه ی حسابدری



netfa.ir
دوشنبه 23 فروردین 1389, 06:23 صبح
با سلام. این اولین پستی که دارم می دم. کلی تو فروم گشتم. متاسفانه جوابی پیدا نکردم.
حقیقتش من دارم یه برنامه حسابداری برای پروژه ی دانشجویی می نویسم.:افسرده:
اطلاعات نسبتا کافی از حسابداری دارم.
مشکل در طراحی دیتابیس دارم.

من می خوام جداولی طراحی کنم که هر سند الزاما حسابهای زیر رو داشته باشه.
گروه>کل>معین
ولی اگر سندی تفصیل و ریز تفصیل داشت به این صورت باشه.
گروه<کل<معین>تفصیل>ریزتفصیل>

من به این صورت عمل کردم که یه جدول به نام AccGroup ایجاد کردم و یه جدول به نام AccKol که به واسطه کد گروه به جدول AccKol مرتبط میشه. از جدول AccKol هم کد کل به جدول AccMoien (جدول معین) مرتبط میشه. یه جدول دیگه به نام Docs ایجاد کردم که جدول AccMoien به واسطه کد معین اون متصل میشه.
حالا بر فرض اگر سندی با کد معین 1000 داشته باشیم و در داخل جدول معین کد کل برابر 100 باشه انتظار این رو دارم که بره توی کل 100 و در اون کد گروه رو پیدا کنه و به ترتیب این خروجی رو بده:

شماره سند>سند>کد معین>معین>کد کل>کل>کد گروه>گروه

ولی در صورتی که مثلا هم دوتا گروه و هم دوتا کل و هم دوتا معین تعریف کنم و یه کوئری بگیرم 2 به توان 4 بار نتایج رو تکرار می کنه :( مشکل کجاست؟

تصویر دیاگرام و تصویر کوئری رو ضمیمه کردم.


تا اینجا می خوام سه سطح رو برم جلو باری تفصیل و ریزتفصیل ایده ای دارید؟

ممنون میشم جواب بدین.
مشتاقانه منتظرم.
یا علی

svahidm
دوشنبه 23 فروردین 1389, 08:22 صبح
سلام
اصلا از حسابداري چيزي بلد نيستم ولي اين دستوري كه شما نوشتين جدول ها رو در هم ضرب مي كنه پس حتي اگر DB هم درست باشه اطلاعات درستي نشون نميده شما بايد از دستور Inner join بجاي cross join استفاده كني

mollyAreco
دوشنبه 23 فروردین 1389, 09:23 صبح
سلام
من هم کار برروی پروژه ای شبیه به این رو شروع کردم اگر دیتا بیست رو ببینم می تونم بیشتر کمک کنم .
این Query همونطوری که دوستمون گفته باید از InnerJoin استفاده کنی .
در مورد سوال دومت هم دقیقتر بگو تا چی می خوای درست کنی کمک کنم .
یا علی

Rejnev
دوشنبه 23 فروردین 1389, 10:49 صبح
این کوئری ها با استفاده از دستورهای sql خیلی راحت قابل پیاده سازی هستند.
سعی کنید ابتدا فیلدهایی که میخواید نمایش داده بشه رو در select بنویسید
بعد در قسمت from نام جداولی که از اونها در select انتخاب کردید رو (در صورت تمایل به همراه یک نام مستعار) به کوئری بدید
و بعد در دستور where ارتباط جداول رو نسبت به هم برقرار کنید.

به عنوان مثال میگوییم:
انتخاب کن
[جدول اسناد].[شماره سند] و
[جدول اسناد].[سند] و
[جدول معین].[کد معین] و...
از جداول
اسناد و معین و کل و ...
که
[جدول اسناد].[شماره معین] برابر است با(=) [جدول معین].[کد]
[جدول معین].[کد کل] برابر است با [جدول کل].[کد] و ...

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




select
doc.code,
doc.title,
moin.code,
moin.title,
kol.code,
kol.title [,...]
from
moin, doc, kol[,...]
where
doc.moinCode = moin.code and
moin.CodeKol = kol.code and ...



نام جداول و فیلدها رو خودتون درست کنید...

netfa.ir
دوشنبه 23 فروردین 1389, 14:52 عصر
این کوئری ها با استفاده از دستورهای sql خیلی راحت قابل پیاده سازی هستند.
سعی کنید ابتدا فیلدهایی که میخواید نمایش داده بشه رو در select بنویسید
بعد در قسمت from نام جداولی که از اونها در select انتخاب کردید رو (در صورت تمایل به همراه یک نام مستعار) به کوئری بدید
و بعد در دستور where ارتباط جداول رو نسبت به هم برقرار کنید.

به عنوان مثال میگوییم:
انتخاب کن
[جدول اسناد].[شماره سند] و
[جدول اسناد].[سند] و
[جدول معین].[کد معین] و...
از جداول
اسناد و معین و کل و ...
که
[جدول اسناد].[شماره معین] برابر است با(=) [جدول معین].[کد]
[جدول معین].[کد کل] برابر است با [جدول کل].[کد] و ...

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




select
doc.code,
doc.title,
moin.code,
moin.title,
kol.code,
kol.title [,...]
from
moin, doc, kol[,...]
where
doc.moinCode = moin.code and
moin.CodeKol = kol.code and ...



نام جداول و فیلدها رو خودتون درست کنید...




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

netfa.ir
دوشنبه 23 فروردین 1389, 17:21 عصر
سلام
من هم کار برروی پروژه ای شبیه به این رو شروع کردم اگر دیتا بیست رو ببینم می تونم بیشتر کمک کنم .
این Query همونطوری که دوستمون گفته باید از InnerJoin استفاده کنی .
در مورد سوال دومت هم دقیقتر بگو تا چی می خوای درست کنی کمک کنم .
یا علی

سوال اول با کمک شما و سایر دوستان برطرف شد.
خوب سوال دوم رو اینجوری توضیح می دم.
ما در حسابداری اسنادی رو داریم که تا سه سطح (گروه، کل ، معین ) زیر مجموعه می خورن.
ولی در این بین ممکنه سندی باز زیر مجموعه بخوره (مثلا: گروه>کل>معین>تفصیل(زیرمجموعه معین) و ... )

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

به عبارت دیگه:

سند>گروه>کل>معین> (در صورت وجود تفصیل) تفصیل>(در صورت وجود ریزتفصیل)>ریز تفصیل

ممنون میشم بازم کمک کنید.
و مثل دوست خوبم (mohammad_bagherani) با مثال و توضیحات اگه توضیح بدین عالی میشه.
ممنون

netfa.ir
دوشنبه 23 فروردین 1389, 17:38 عصر
این کوئری ها با استفاده از دستورهای sql خیلی راحت قابل پیاده سازی هستند.
سعی کنید ابتدا فیلدهایی که میخواید نمایش داده بشه رو در select بنویسید
بعد در قسمت from نام جداولی که از اونها در select انتخاب کردید رو (در صورت تمایل به همراه یک نام مستعار) به کوئری بدید
و بعد در دستور where ارتباط جداول رو نسبت به هم برقرار کنید.

به عنوان مثال میگوییم:
انتخاب کن
[جدول اسناد].[شماره سند] و
[جدول اسناد].[سند] و
[جدول معین].[کد معین] و...
از جداول
اسناد و معین و کل و ...
که
[جدول اسناد].[شماره معین] برابر است با(=) [جدول معین].[کد]
[جدول معین].[کد کل] برابر است با [جدول کل].[کد] و ...

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




select
doc.code,
doc.title,
moin.code,
moin.title,
kol.code,
kol.title [,...]
from
moin, doc, kol[,...]
where
doc.moinCode = moin.code and
moin.CodeKol = kol.code and ...



نام جداول و فیلدها رو خودتون درست کنید...




راستی دوست من جناب باقرانی، میشه از همین مثال یه مثال هم واسه INSERT و DELETE هم بزنید. :ناراحت::افسرده: آخه من زیاد Sql بلد نیستم.
ممنون میشم.

netfa.ir
دوشنبه 23 فروردین 1389, 19:04 عصر
من زیرمجموعه تفصیل و ریزتفصیل رو اینجوری تعریف کردم.

ولی وقتی کئوری میگیرم جوابی نمیده چرا؟


--------------------------------------
ضمایم قبلی ایراد داشتن که به زودی بدون ایراد رو ارائه خواهم داد. با تشکر:افسرده:

Rejnev
سه شنبه 24 فروردین 1389, 00:13 صبح
میشه از همین مثال یه مثال هم واسه INSERT و DELETE هم بزنید.دوست من help اس کیو ال از هر نظر یک مرجع کامله و توش هر دستور به صورت ریز و با جزئیات و مثال وجود داره.
کافیه توی تب index، سیستم help هر دستوری رو که دوست دارید وارد کنید و صفحه مورد نظر لیست میشه.
ولی چشم.
شما قصد دارید توی WindowsApplication درج و حذف انجام بدین یا همینطوری فقط میخواین دستور رو بدونید؟
دستور ثابته. اما شما هم میتونید توی یک Stored Procedure کدها رو بنویسید و هم از طریق کد که باید هر بار اون خط رو برای داده های جدید تغییر بدید.
Stored Procedure ها (SP) انتخاب بی نقصی هستند برای این کار. چون میتونید به اونها مقدار(پارامتر) بفرستید و اطلاعات رو در سمت sql و در بدنه روال مثلا تست کنید و هر کار اضافی از قبیل برنامه نویسی و... که لازم بود انجام بدید.
راه دیگه هم استفاده از خود دستور insert و Update بصورت مستقیم چه در خود sql و چه در سمت interface یک برنامه هست.
اما برای استفاده از SP که به شما پیشنهاد میکنم باید بعد از ساخت، اون رو در برنامه کاربردیمون و یا خود sql اجرا (execute) کنیم.
دستور ساخت یک sp که مثلا یک select میگیره و بعد اجرای اون به اینصورته:



create proc myProc as
begin
select * from myTable
end
...
--for use we write:
exec myProc

یک روال دیگه که یک پارامتر میگیره و یک جستجو انجام میده. یک تیکه از sql3 هم میذارم تا ببینید برنامه نویسی توی اونها چطوریه.



create proc myProc @Param int as
begin
-- this is sql 3...
if @param >100
set @ param=100
...
select * from myTable where myField= @param
end
...
--for use we write:
exec myProc

لازم نیست توی sp حتما select بنویسید.
sp در واقع یک رواله که یک کار رو انجام میده. حالا هر کاری.
برای ختم کار یک مثال میزنم که insert و delete رو انجام بده.(update به عهده خودتون)




create proc AddDocument
@DocCode int ,
@DocDescription nvarchar(300),
@MoinCode int
as
begin
if exists ((select DocCode from Documents where DocCode=@DocCode))
delete from Documents where DocCode=@DocCode;

insert into Documents(DocCode,Description,Moin)
values
(@DocCode, @DocDescription, @MoinCode)
end
...
--for use we write:
exec myProc

که در اینجا مثلا اگه شماره سندی که به اون میفرستیم تکراری باشه قبلی رو حذف و یکی جدید با همون کد و با مشخصات جدید اضافه میکنه.

netfa.ir
سه شنبه 24 فروردین 1389, 00:34 صبح
دوست من help اس کیو ال از هر نظر یک مرجع کامله و توش هر دستور به صورت ریز و با جزئیات و مثال وجود داره.
کافیه توی تب index، سیستم help هر دستوری رو که دوست دارید وارد کنید و صفحه مورد نظر لیست میشه.
ولی چشم.
شما قصد دارید توی WindowsApplication درج و حذف انجام بدین یا همینطوری فقط میخواین دستور رو بدونید؟
دستور ثابته. اما شما هم میتونید توی یک Stored Procedure کدها رو بنویسید و هم از طریق کد که باید هر بار اون خط رو برای داده های جدید تغییر بدید.
Stored Procedure ها (SP) انتخاب بی نقصی هستند برای این کار. چون میتونید به اونها مقدار(پارامتر) بفرستید و اطلاعات رو در سمت sql و در بدنه روال مثلا تست کنید و هر کار اضافی از قبیل برنامه نویسی و... که لازم بود انجام بدید.
راه دیگه هم استفاده از خود دستور insert و Update بصورت مستقیم چه در خود sql و چه در سمت interface یک برنامه هست.
اما برای استفاده از SP که به شما پیشنهاد میکنم باید بعد از ساخت، اون رو در برنامه کاربردیمون و یا خود sql اجرا (execute) کنیم.
دستور ساخت یک sp که مثلا یک select میگیره و بعد اجرای اون به اینصورته:



create proc myProc as
begin
select * from myTable
end
...
--for use we write:
exec myProc

یک روال دیگه که یک پارامتر میگیره و یک جستجو انجام میده. یک تیکه از sql3 هم میذارم تا ببینید برنامه نویسی توی اونها چطوریه.



create proc myProc @Param int as
begin
-- this is sql 3...
if @param >100
set @ param=100
...
select * from myTable where myField= @param
end
...
--for use we write:
exec myProc

لازم نیست توی sp حتما select بنویسید.
sp در واقع یک رواله که یک کار رو انجام میده. حالا هر کاری.
برای ختم کار یک مثال میزنم که insert و delete رو انجام بده.(update به عهده خودتون)




create proc AddDocument
@DocCode int ,
@DocDescription nvarchar(300),
@MoinCode int
as
begin
if exists ((select DocCode from Documents where DocCode=@DocCode))
delete from Documents where DocCode=@DocCode;

insert into Documents(DocCode,Description,Moin)
values
(@DocCode, @DocDescription, @MoinCode)
end
...
--for use we write:
exec myProc

که در اینجا مثلا اگه شماره سندی که به اون میفرستیم تکراری باشه قبلی رو حذف و یکی جدید با همون کد و با مشخصات جدید اضافه میکنه.








ممنون دوست من. واقعا از اینکه وقت گذاشتی سپاسگذارم. :افسرده: شرمنده کردی به خدا.
یه کم پیچیده شد ولی سعی می کنم تمرین کنم تا یاد بگیرم. باز اگه موردی بود بازهم زحمت میدم.
ممنون. واقعا ممنون.
یا علی

vbnovin
دوشنبه 20 اردیبهشت 1389, 21:54 عصر
سلام آدم با حوصله ای هستید خسته نباشید منم یه نمونه نوشتم اغراق نباشه مال شما بهتر عمل شده مرس ....لطفا ،: ای کاش نمونه سورس هم میگذاشتید ...

netfa.ir
شنبه 25 اردیبهشت 1389, 20:47 عصر
سلام آدم با حوصله ای هستید خسته نباشید منم یه نمونه نوشتم اغراق نباشه مال شما بهتر عمل شده مرس ....لطفا ،: ای کاش نمونه سورس هم میگذاشتید ...
سلام.
شما لطف دارین.
فعلا درگیر کارهای دیگه بودم.
و همین روش هم یه مقدار ایراد داره.
به کمک دوستان اگه رفع شد انشالله قرار می دم.
موفق باشین