PDA

View Full Version : به دست آوردن موجودي كالا با دستورات TSQL



sempaisaleh
سه شنبه 12 اسفند 1393, 11:55 صبح
با سلام خدمت دوستان
من يك جدول دارم كه مي خوام از توي اون موجودي رو بدست بيارم. فيلدهاشم به اينصورت كه (sh_fac,flag,OD_CD,quantity) كه فارسيش (تعداد، كد كالا، نوع فاكتور، شماره فاكتور)ميشه.
نكته منظور از نوع فاكتور رسيد يا حواله بودن است. حالا مي خوام يه كوئري بنويسم كه بياد موجودي هر كالا رو واسم بياره. بدين صورت كه بياد جمع به جايي كه همه فيلد Quantity رو با هم جمع كنه اگه مقدار flag برابر مثلا 5 باشه بياد به فيلد mojodi اضافه بشه اگه مقدارش 6 باشه از فيلد موجودي كم بشه. كه از آخر با Group By كردن بر اساس كد كالا مقدار موجودي توي فيلد موجودي قرار بگيره. كسي هست راهنمايي كنه؟

SabaSabouhi
سه شنبه 12 اسفند 1393, 13:15 عصر
با سلام خدمت دوستان
من يك جدول دارم كه مي خوام از توي اون موجودي رو بدست بيارم. فيلدهاشم به اينصورت كه (sh_fac,flag,OD_CD,quantity) كه فارسيش (تعداد، كد كالا، نوع فاكتور، شماره فاكتور)ميشه.
نكته منظور از نوع فاكتور رسيد يا حواله بودن است. حالا مي خوام يه كوئري بنويسم كه بياد موجودي هر كالا رو واسم بياره. بدين صورت كه بياد جمع به جايي كه همه فيلد Quantity رو با هم جمع كنه اگه مقدار flag برابر مثلا 5 باشه بياد به فيلد mojodi اضافه بشه اگه مقدارش 6 باشه از فيلد موجودي كم بشه. كه از آخر با Group By كردن بر اساس كد كالا مقدار موجودي توي فيلد موجودي قرار بگيره. كسي هست راهنمايي كنه؟





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

یه چیز دیگه هم می‌خوام بگم که امیدوارم ناراحت نشی اما خیلی مهمه
با این شکل نام‌گذاری روی جدول و ستون‌ها، ( و احتمالاً متغیر‌ها و متدها توی برنامه‌ات) فقط می‌تونی تنهایی کار کنی.
سعی کن عادی کنی که نام‌گذاری رو کامل و بدون استفاده از پینگلیش! انجام بدی.
مثلاً InvoiceNumber چه اشکالی داره که بجاش از sh_fac استفاده می‌کنی؟ یا مثلاً OD_CD یعنی چی؟
این‌ها مثل خط و امضای برنامه‌نویس می‌مونه. سعی کن یه جوری بنویسی که همه به راحتی بتونن بخونن.

صبا صبوحی

sempaisaleh
سه شنبه 12 اسفند 1393, 15:17 عصر
سلام
دوست عزیز، شما آجر اول رو کج گذاشتی حالا می‌خوای با زحمت زیاد درستش کنی.
شما باید یک ستون به جدولت اضافه کنی، و تعداد ورودی ( بر اساس رسید، مرجوعی، موجودی اول دوره و غیره ) رو توی اون ستون پر کنی
و یه ستون رو هم بگذاری برای تعداد خروجی ( مانند حواله، برگشت از خرید، تعدیل و غیره )
اینطوری به راحتی مقادیر مثبت و منفی تفکیک می‌شن.

یه چیز دیگه هم می‌خوام بگم که امیدوارم ناراحت نشی اما خیلی مهمه
با این شکل نام‌گذاری روی جدول و ستون‌ها، ( و احتمالاً متغیر‌ها و متدها توی برنامه‌ات) فقط می‌تونی تنهایی کار کنی.
سعی کن عادی کنی که نام‌گذاری رو کامل و بدون استفاده از پینگلیش! انجام بدی.
مثلاً InvoiceNumber چه اشکالی داره که بجاش از sh_fac استفاده می‌کنی؟ یا مثلاً OD_CD یعنی چی؟
این‌ها مثل خط و امضای برنامه‌نویس می‌مونه. سعی کن یه جوری بنویسی که همه به راحتی بتونن بخونن.

صبا صبوحی

دوست عزيز مرسي از جواب سريعت
در خصوص ديتابيس و راه حلي كه پيشنهاد دادين بايد عرض كنم كه ديتابيس مربوط به نرم افزار جامع مالي شركت هست و بنده ننوشتم. حالام بايد بدوم دنبال راه حلي كه كارم راه بندازه. خودمم زياد راضي از اين نوع ديتابيس ها نيستم هنوز كه هنوز دارم دردسر ميكشم بابت برنامه نويسي كه براي اين برنامه شده.
حالا راه حلي براي اين بدست آوردن موجودي با اين شرايط مي خوام

SabaSabouhi
سه شنبه 12 اسفند 1393, 16:30 عصر
دوست عزيز مرسي از جواب سريعت
در خصوص ديتابيس و راه حلي كه پيشنهاد دادين بايد عرض كنم كه ديتابيس مربوط به نرم افزار جامع مالي شركت هست و بنده ننوشتم. حالام بايد بدوم دنبال راه حلي كه كارم راه بندازه. خودمم زياد راضي از اين نوع ديتابيس ها نيستم هنوز كه هنوز دارم دردسر ميكشم بابت برنامه نويسي كه براي اين برنامه شده.
حالا راه حلي براي اين بدست آوردن موجودي با اين شرايط مي خوام

سلام
خوب می‌تونی جدول رو به صورت مجازی بسازی، می‌دونی که هر Select یک جدول هست، پس می‌تونی یه select بنویسی که با استفاده از CASE یک ستون رو تبدیل به
دو ستون کنی و از این جدول تو Select اصلی که Group By داره استفاده کنی. البته کلاً چون با View مشکل دارم، تبدیل این Select به View رو توصیه نمی‌کنم.
البته راه حل‌های دیگه هم وجود داره، اما گمان کنم این به‌ترین باشه.

صبا صبوحی

sempaisaleh
چهارشنبه 13 اسفند 1393, 11:33 صبح
با تشكر از جوابتون
من كمي با case مشكل دارم وگرنه ميتونم بيام موقعي كه select مينويسم بگم يك فيلد جمع بذار اگه مقدار فيلد flag مثلا 5 بود بياد مقدار Quantity‌ رو به مقدار فيلد جمع اضافه كن اگه هم flag برابر 6 بود بياد مقدار Quantity رو از فيلد جمع كم كن.
ولي مشكلم همينجاست نميدونم چطور از case يا if ميتونم تو اين دستوراتم استفاده كنم.


SELECT FLAG, OD_CD, SUM(QUANTITY) AS jam
FROM S_DTL_FCT
GROUP BY S_HED_FCT.FLAG, S_DTL_FCT.OD_CD
HAVING (S_HED_FCT.FLAG = 5 OR
S_HED_FCT.FLAG = 6)
ORDER BY S_DTL_FCT.OD_CD

SabaSabouhi
چهارشنبه 13 اسفند 1393, 13:18 عصر
با تشكر از جوابتون
من كمي با case مشكل دارم وگرنه ميتونم بيام موقعي كه select مينويسم بگم يك فيلد جمع بذار اگه مقدار فيلد flag مثلا 5 بود بياد مقدار Quantity‌ رو به مقدار فيلد جمع اضافه كن اگه هم flag برابر 6 بود بياد مقدار Quantity رو از فيلد جمع كم كن.
ولي مشكلم همينجاست نميدونم چطور از case يا if ميتونم تو اين دستوراتم استفاده كنم.


SELECT FLAG, OD_CD, SUM(QUANTITY) AS jam
FROM S_DTL_FCT
GROUP BY S_HED_FCT.FLAG, S_DTL_FCT.OD_CD
HAVING (S_HED_FCT.FLAG = 5 OR
S_HED_FCT.FLAG = 6)
ORDER BY S_DTL_FCT.OD_CD




سلام
یادته گفتم که خروجی هر Select یک Table هست؟


SELECT OD_DC, Summary = SUM( Incomming ) - SUM( Outgoing )
FROM (
SELECT OD_DC, Incomming = CASE WHEN Flag = 5 THEN Quantity ELSE 0 END
, Outgoing = CASE WHEN Flag = 6 THEN Quantity ELSE 0 END
FROM S_DTL_FCT ) T
GROUP BY OD_DC

به همین راحتی


صباصبوحی

ghasem110deh
پنج شنبه 14 اسفند 1393, 18:14 عصر
سلام
نمی دونم این پروژه انبارداری رو که گذاشتم دیدن یا نه ؟
تو قسمت کارتکس کالا گیر کردم :
http://s4.picofile.com/file/8174697650/cardex.png
نمیتونم چند تا سلکت (از چند جدول) رو باهم ادغام کنم ! (البته sp پارامتر داره که اسم کالاهستش)
که مربوط به جدول مشخصات دیگه هست ! چطور اطلاعات رو از دو تا جدول خرید و فروش بهش اضافه کنم ؟
-----------------------------

USE [AnbarDB]GO
/****** Object: StoredProcedure [dbo].[Kardex] Script Date: 03/05/2015 17:54:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[Kardex]
@Kala nvarchar(50)


AS
BEGIN
select
dbo.TAnbar.Anbar as anbar,
dbo.TAnbar.Kalatype as noekala,
dbo.TKala.Cod as cod,
dbo.TKala.Kala as kala,
dbo.TKala.Vahed as vahed,
dbo.TKala.Toz as tozi,
dbo.TKala.Mojodi as mojodi,
dbo.TKala.Pic as pict
From dbo.TAnbar inner join dbo.TKala
on dbo.TAnbar.Anbar = dbo.TKala.Anbar
where dbo.TKala.Kala = @Kala
END

SabaSabouhi
پنج شنبه 14 اسفند 1393, 22:08 عصر
سلام
دوست من، این فرمی که گذاشتی شباهتی به فرم «کارت کالا» ( یا همون کاردکس ) نداره.
گمان کنم کمی اشتباه کرده باشی.
فرم کارت کالا یه جدول هست که ستون‌های تاریخ، سند، تعداد ورود و تعداد خروج داره.

صبا صبوحی

ghasem110deh
جمعه 15 اسفند 1393, 00:59 صبح
سلام
مشخصات کالا - خرید/فروش (همون ورود و خروج دیگه :)) -صد البته + تاریخ
---------------
منتها همه اینارور توی یه جدول ندارم !
کالا رو که از طریق وریبل و پارامتر (نام کالا) هست انتخاب می کنم ... ولی تو بقیش گیر کردم !

SabaSabouhi
جمعه 15 اسفند 1393, 19:55 عصر
سلام
مشخصات کالا - خرید/فروش (همون ورود و خروج دیگه :)) -صد البته + تاریخ
---------------
منتها همه اینارور توی یه جدول ندارم !
کالا رو که از طریق وریبل و پارامتر (نام کالا) هست انتخاب می کنم ... ولی تو بقیش گیر کردم !

سلام
اگه کارفرما فرم رو اینطوری خواسته که حرفی نیست. چون در نهایت پول پروژه رو کارفرما می‌ده نه من :)
اما این رو مطمئن باش که این فرم هیچ ربطی به «کارت کالا» نداره.
«کارت کالا» یه فرم استاندارد انبار هست که همه جا هم به یک شکل ازش استفاده می‌شه.

صبا صبوحی

ghasem110deh
جمعه 15 اسفند 1393, 21:09 عصر
سلام
اگه کارفرما فرم رو اینطوری خواسته که حرفی نیست. چون در نهایت پول پروژه رو کارفرما می‌ده نه من :)
اما این رو مطمئن باش که این فرم هیچ ربطی به «کارت کالا» نداره.
«کارت کالا» یه فرم استاندارد انبار هست که همه جا هم به یک شکل ازش استفاده می‌شه.

صبا صبوحی
----------------
کارفرما و برنامه نویس که خودمم :)
چند جایی نگاه کردم ... ولی اطلاعات بدرد بخور تو بانک الان اینا رو دارم فقط !؟

http://www.articlesoft.ir/articlehelp/index.htm#page=p0057.htm

http://cactus.ir/tabid/63/Default.aspx

الان چطور چند تا سلکت رو با هم ادغام کنم ؟ فعلا کوئری همین رو بزنم ! (شاهکار کردم)

ghasem110deh
دوشنبه 18 اسفند 1393, 11:33 صبح
اینو زدم ولی به group by گیر میده :

USE [AnbarDB]GO
/****** Object: StoredProcedure [dbo].[Kardex] Script Date: 03/09/2015 10:52:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[Kardex]
@Kala nvarchar(50)


AS
BEGIN
select
dbo.TAnbar.Anbar as anbar,
dbo.TAnbar.Kalatype as noekala,
dbo.TKala.Cod as cod,
dbo.TKala.Kala as kala,
dbo.TKala.Vahed as vahed,
dbo.TKala.Toz as tozi,
dbo.TKala.Mojodi as mojodi,
dbo.TKala.Pic as pict,
COUNT(dbo.TBuy.Kala) as tedadkala,
SUM(dbo.TBuy.Andaze) as andaz,
SUM(dbo.TBuy.Kol) as kalakol,
COUNT(dbo.TSel.Kala) as tedadkala2,
SUM(dbo.TSel.Andaze) as andaz2,
SUM(dbo.TSel.Kol) as kalakol2
From dbo.TAnbar inner join dbo.TKala on dbo.TAnbar.Anbar = dbo.TKala.Anbar
inner join dbo.TBuy on dbo.TKala.Kala = dbo.TBuy.Kala
inner join dbo.TSel on dbo.TKala.Kala = dbo.TSel.Kala
where dbo.TKala.Kala = @Kala
group by dbo.TKala.Kala
END

خطا :


Msg 8120, Level 16, State 1, Procedure Kardex, Line 7
Column 'dbo.TAnbar.Anbar' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

SabaSabouhi
دوشنبه 18 اسفند 1393, 14:19 عصر
اینو زدم ولی به group by گیر میده :



سلام
دوست عزیز، طبیعی هست که گیر بده. شما وقتی Group می‌کنی. تو فهرست Select خودت فقط مجاز به استفاده از ستون‌هایی هستی
که جلوی Group آمده. غیر از اون فقط می‌تونی از توابع جمع کننده مثل Sum, Min, Max, Avg, Count و امثال این‌ها استفاده کنی.

تو این پروژه کارفرما و مجری خودتی، اما همیشه اینطور نخواهد بود. شما باید تو این بازار هم بتونی با دیگران کار گروهی انجام بدی و
هم برای کارفرماها کار کنی. کارفرماها هم معمولاً مشاور IT دارن.
سعی کن از همین اول کار عادی کنی که نام جدول‌ها، ستون‌ها، متغیرها و متدهای برنامه‌هات رو درست و به زبان انگلیسی و بدون PINGLISH
انتخاب کنی. مطمئن باش همین چیزهای به ظاهر بی‌اهمیت «متر»هایی برای سنجش توانایی شما توسط کارفرماها و همکارانتان خواهند بود.

صبا صبوحی

ghasem110deh
دوشنبه 18 اسفند 1393, 18:58 عصر
قسمت انبار رو وقتی حذف میکنم باز همین خطا رو میده *** الان دیگه فقط با کالا سر و کار داره دیگه (تو سه تا جدول هم هستش)
------------
منظورم از هم برنامه نویس و هم کارفرما ، (پروژه) تمرین هستش !
------------
قطعا تو پروژه بعدی (تازه دارم نمودار er اش رو میکشم) فینگلیش نمیزنم :)

SabaSabouhi
سه شنبه 19 اسفند 1393, 02:57 صبح
قسمت انبار رو وقتی حذف میکنم باز همین خطا رو میده *** الان دیگه فقط با کالا سر و کار داره دیگه (تو سه تا جدول هم هستش)
------------
منظورم از هم برنامه نویس و هم کارفرما ، (پروژه) تمرین هستش !
------------
قطعا تو پروژه بعدی (تازه دارم نمودار er اش رو میکشم) فینگلیش نمیزنم :)

سلام
شرطی که گفتم رو فراموش نکن. هر چیزی که جلوی Select میاد باید یکی از دو شرط زیر رو داشته باشه.
الف) داخلی یکی از توابع جمع کننده باشه ( Min, Max, Sum, Count, Avg, etc )
ب) جلوی Group By هم قید شده باشه

صبا صبوحی

ghasem110deh
چهارشنبه 20 اسفند 1393, 20:42 عصر
سلام به همه ...
با این پروسیجر میشه هر چند تا جدول رو با هم join کرد :

USE [AnbarDB]
GO
/****** Object: StoredProcedure [dbo].[Kardex] Script Date: 03/10/2015 23:06:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[Kardex]
@Kala nvarchar(50)

AS
BEGIN
With T1(Kala, tedadkala, andaz, kalakol)
AS
(SELECT Kala, Count(Kala), SUM(Andaze), SUM(Kol)
from TBuy GROUP BY Kala),
T2(Kala, tedadkala2, andaz2, kalakol2)
AS
(SELECT Kala, Count(Kala), SUM(Andaze), SUM(Kol)
from TSel GROUP BY Kala)
select
dbo.TAnbar.Anbar as anbar,
dbo.TAnbar.Kalatype as noekala,
dbo.TKala.Cod as cod,
dbo.TKala.Kala as kala,
dbo.TKala.Vahed as vahed,
dbo.TKala.Toz as tozi,
dbo.TKala.Mojodi as mojodi,
dbo.TKala.Pic as pict,
tedadkala,
andaz,
kalakol,
tedadkala2,
andaz2,
kalakol2
From dbo.TAnbar
inner join dbo.TKala on dbo.TAnbar.Anbar = dbo.TKala.Anbar
inner join T1 on T1.Kala = TKala.Kala
inner join T2 on TKala.Kala = T2.Kala
where dbo.TKala.Kala = @kala
END

یا علی !