PDA

View Full Version : ایجاد ستون بدهکار و بستانکار



DJ2008
یک شنبه 28 دی 1393, 23:43 عصر
سلام
تو یه برنامه حسابداری دیدم برای پرداخت و دریافت نقدی یک جدول بنام cash (نقدی) وجود داشت و برای مبلغ فیلد tot . منم اینکار رو کردم.
حالا برای برای گزارشگیری بدهکار-بستانکار-مانده خوردم به مشکل.
جدولم تقریباً اینطوریه :
id کد پرداخت/دریافت
date
desc
type1 برای دریافت عدد 1 و برای پرداخت عدد 2
type2 نقد-چک-واریز به حساب
tot مبلغ

اولاً نوشتن کد sql که شرط بذاره یعنی اگر type1 برابر 1 بود یه ستون ایجاد بشه بنام بدهکار و این مبلغ به اون اختصاص پیدا کنه رو بلد نبودم.ناچار از فیلدهای محاسباتی استفاده کردم.تا اینجا مشکلم حل شد.منتها برای ستون مانده ام با کدی که در سایت پیدا کردم مانده ردیف اولم اشتباه میشه و در ضمن با یک بار فرم عدد عوض میشه و در بار بعدی همون عدد اولی است.وجدولم devexpress است.اون کدم این بود

Adoquery.fieldbyname('Calcfield').asfloat:=Adoquer y.fieldbyname('Bed').asfloat - Adoquery.fieldbyname('Bes').asfloat + Value



Value:=Value +Adoquery.fieldbyname('Bed').asfloat - Adoquery.fieldbyname('Bes').asfloat


جداولم در فرم data modul است و منغیر Value رو هم در فرم گزارشم هنگان creat برابر صفر گداشتم درست نشد.شرط if گذاشتم ردیف یکم درست شد .ردیف آخرم اشتباه شد.
لطفاً کمک کنید این برنامه ما هم به یه جایی برسه ممنون.

hadisalahi2
دوشنبه 29 دی 1393, 10:44 صبح
این کاری که شما میخوای انجام بدی کلا یک روش قطعی نداره
هر کسی میتونه از خلاقیتش استفاده کنه و این بخش رو طراحی کنه

من خودم یک نرم افزار حسابداری دارم که این قسمت رو هم داره داخلش

من از یک جدول موقت استفاده میکنم و اطلاعات حساب رو اول انتقال میدم داخل جدول موقت
مثلا با کد SQL زیر



CREATE PROCEDURE InsertTo_CalcStatusTemp
@CustomerID nvarchar(15)
,@StartDate nvarchar(10)
,@EndDate nvarchar(10)
AS
Truncate Table CalculateStatusTable_Temp
INSERT INTO CalculateStatusTable_Temp
(ID,CustomerID,CustomerName,Dates,Comments,debtor, creditor,C)
SELECT ID,CustomerID,CustomerName,Dates,Rtrim(Ltrim(Comme nts)),debtor,creditor,C
FROM CalculateStatusTable
WHERE (CustomerID=@CustomerID)AND(Dates Between @StartDate AND @EndDate)
Update CalculateStatusTable_Temp
Set Mandes=0
GO




بعد اومدم از داخل دلفی محاسبات باقیمانده رو انجام میدم
این شکلی



for I := 1 to MainQuery.RecordCount do Begin
TempValue:=(MainQuery['debtor']-MainQuery['creditor'])+TempValue;
MainQuery.Edit;MainQuery['Mandes']:=TempValue;
if TempValue<0 then MainQuery['StatusText']:='بستانکار';
if TempValue=0 then MainQuery['StatusText']:='بی حساب';
if TempValue>0 then MainQuery['StatusText']:='بدهکار';
MainQuery.Post;
MainQuery.Next;
End;


در آخر هم برای مقادیری که منفی شده در مانده حساب یک Update گذاشتم
اینطوری:



CommonUnit.EXECuteSQL(ADOQuery1,'Update CalculateStatusTable_Temp Set Mandes=Mandes*(-1) Where Mandes<0 ',False);


امیدوارم راه حل من به دردت بخوره

یا حق

benyaminrahimi
دوشنبه 29 دی 1393, 11:20 صبح
با یه کوئری sql ....



SELECT
CASE
WHEN typ=1 THEN tot
END AS bed,
CASE
WHEN typ=2 THEN tot
END AS bes
FROM tbl_baz_page_detail

DJ2008
دوشنبه 29 دی 1393, 19:16 عصر
ممنون که وقت گذاشتین
متاسفانه چون تو سطح اول خواستم با اکسس بنویسم هزار و یک مشکلم واسم پیش اومد.
آقای رحیمی دستور case تو اکسس پشتیبانی نمیشه بجاش از switch استفاده میکنند که اونم تو کوئری بلد نیستم بنویسم.
ستون بدهکار و بستانکار از اول تو جدول بذارم راحت تر نیست به نظر خودم اصولی نیست.

DJ2008
دوشنبه 29 دی 1393, 20:28 عصر
آقا من کدش تو اکسس پیدا کردم ولی خط آخر (مانده) مقدار نمیگیره.
SELECT *, Switch(CashType=1,tot) as bed,Switch(CashType=2,tot) as bes,(bed-bes) as mande FROM cash'

DJ2008
سه شنبه 30 دی 1393, 09:10 صبح
مشکلم حل شد.کد پست اول یکم دستکاری کردم جواب گرفتم.
ممنون از آقایون مخصوصاً آقای رحیمی که همیشه جواب سوالمو میدن.
اگه لازمه توضیحش اینجا بذارم.