ورود

View Full Version : چگونه در قبوض بدهی را تعیین می کنند؟



safa55
سه شنبه 28 بهمن 1393, 19:20 عصر
من روی برنامه ای کار می کنم که نیاز است که به صورت گروهی قبض صادر کند (همانند قبوض tel و...) ، بعد از اینکه این قبوض صادر شد باید تا قبل از پرداخت آن به صورت بدهی به حساب بیاید.
روش من این است که رکورد های چاپی به صورت bulk (درج گروهی داده) در database ثبت شود. این کار برای بار اول راحت است ، ولی فرض کنید 10 قبض با مبالغ پرداختی صادر شده و مبلغ هر یک با id اش در بانک به صورت bulk ذخیره شده است. و بعد همان رکورد ها + مثالا 5 رکورد جدیدرا می خواهیم چاپ کنیم (صدور قبض). با این حال چون بصورت bulk درج می شود نمی توان رکوردهایی که قبلا درج شده (رکوردهای تعیین کننده بدهی) رو شناسایی کرد و دوباره درج نشوند.
به نظر شما دوستان برای این کار باید چکار کرد؟
اگر روش دیگری برای ثبت بدهی هست لطفا بگید.

golbafan
سه شنبه 28 بهمن 1393, 20:17 عصر
سلام دوست عزیز
معمولا در اینگونه سیستم ها برای هر مشترک یک آی دی داریم و حساب بدهکار و بستانکار هر مشترک در جدول مجزایی دخیره میشود
قبلا در تاپبک دیگه ای گفتم که جدول شما مشکل داره یا حد اقل روشتون

ساده ترین جدول بدهکار و بستانکار:

idmoshtarak
tarikh
bed
bes

موفق باشید

safa55
چهارشنبه 29 بهمن 1393, 10:07 صبح
سلام دوست عزیز
معمولا در اینگونه سیستم ها برای هر مشترک یک آی دی داریم و حساب بدهکار و بستانکار هر مشترک در جدول مجزایی دخیره میشود
قبلا در تاپبک دیگه ای گفتم که جدول شما مشکل داره یا حد اقل روشتون

ساده ترین جدول بدهکار و بستانکار:

idmoshtarak
tarikh
bed
bes

موفق باشید

دوست محترم ، فکر کنم شما متوجه نشدید، نگفتم که من همچین جدولی ندارم ، نمی دونم چرا گیر دادید به اینکه جدول های من مشکل دارد.
جدول های من :1- جدول مشتری 2- جدول مربوط به مبلغ کالا به نسبت سال 3- جدول مربوط به بدهی با (id مشتری، سال ، مبلغ بدهی) و ....
اینکه می گید جدولی مثل جدول بالا داشته باشم این رو همه می دونند ولی مشکل من این نیست ، من میگم وقتی بصورت گروهی قبض صادر می شه در حساب مشتری تا قبل از پرداخت بدهی بحساب می اد . اگر در همان حین صدور قبض دوباره به صورت گروهی همان رکورد ها بخواهند چاپ شوند (قبض صادر شود). در این حال در حساب مشتری بدهی دو بار ثبت می شود.
منظورم فقط در زمان صدور قبض گروهی است.
الان باید چکار کنیم ؟ فقط می خواهم بهترین راه حل را استفاده کنم و الا خودم راههای بالا که گفتم رو می دانم.
در ضمن این برنامه مثل مصرف برق و تل و... چیزی نداره که با مصرف اش روزانه مبلغ بدهی حساب بشه و در حساب کاربری ثبت بشه. زمانی که قبض می خواهد صادر بشه بدهی حساب می شه.

golbafan
چهارشنبه 29 بهمن 1393, 10:21 صبح
ببینید هر قبضی یک تاریخ خواندن کنتور داره و مشخصه های دیگه ای هم داره که میتونید از اونا استفاده کنید

مثلا اگر قبضی برای من اومده که مربوط به تاریخ قرائت 29/5/93 باشه دیگه نباید همچین قبضی برام صادر بشه
یا میتونید یک فیلد منطقی (true/false) بزارید تا اگر برای من صادر شده دیگه نشه
یا میتونید چک کنید برای من در فلان تاریخ قبض صادر شده یا نه بعد مجدد صادر کنید

safa55
چهارشنبه 29 بهمن 1393, 10:33 صبح
ببینید هر قبضی یک تاریخ خواندن کنتور داره و مشخصه های دیگه ای هم داره که میتونید از اونا استفاده کنید

مثلا اگر قبضی برای من اومده که مربوط به تاریخ قرائت 29/5/93 باشه دیگه نباید همچین قبضی برام صادر بشه
یا میتونید یک فیلد منطقی (true/false) بزارید تا اگر برای من صادر شده دیگه نشه
یا میتونید چک کنید برای من در فلان تاریخ قبض صادر شده یا نه بعد مجدد صادر کنید

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

golbafan
چهارشنبه 29 بهمن 1393, 10:42 صبح
چی بگم والاّ ؟
منظورتون از بالک اینه که یک کوئری بزنید؟
چون معنی بالک یک داستان دیگه است برای ایمپورت به دیتابیس از طریق فایل

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

safa55
چهارشنبه 29 بهمن 1393, 10:51 صبح
چی بگم والاّ ؟
منظورتون از بالک اینه که یک کوئری بزنید؟
چون معنی بالک یک داستان دیگه است برای ایمپورت به دیتابیس از طریق فایل

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

منظورم همان bulkcopy است که می تونی توسط اون اطلاعات را به صورت گروهی یا حجمی یا یکباره در بانک (database) ثبت کنی.
query نیست ، از توابع C#‎ است.
یعنی یک datatable درست کنم که اطلاعات اش رو از datagridview می گیره بعد به صورت bulkcopy در بانک ذخیره کنه. چون وقتی تعداد رکورد زیاد باشه و بخواهی یکباره در بانک ذخیره کنی این بهینه ترین روش است.

golbafan
چهارشنبه 29 بهمن 1393, 10:58 صبح
منظورم همان bulkcopy است که می تونی توسط اون اطلاعات را به صورت گروهی یا حجمی یا یکباره در بانک (database) ثبت کنی.
query نیست ، از توابع C#‎‎‎‎‎‎‎‎ است.
یعنی یک datatable درست کنم که اطلاعات اش رو از datagridview می گیره بعد به صورت bulkcopy در بانک ذخیره کنه. چون وقتی تعداد رکورد زیاد باشه و بخواهی یکباره در بانک ذخیره کنی این بهینه ترین روش است.

ببخشید گیج شدم! چرا اطلاعات را از دیتا گرید ویو میگیرید؟ نمیشه از خود دیتابیس بگیرید؟
میتونید یک ویو در دیتابیس داشته باشید و اطلاعات رو ازش بگیرید

safa55
چهارشنبه 29 بهمن 1393, 11:10 صبح
ببخشید گیج شدم! چرا اطلاعات را از دیتا گرید ویو میگیرید؟ نمیشه از خود دیتابیس بگیرید؟
میتونید یک ویو در دیتابیس داشته باشید و اطلاعات رو ازش بگیرید

خوب datagridview هم اطلاعات رو از view می گیره. فرقی نمی کنه اطلاعات از کجا می یاد. از هر دو می تونم بگیرم.
ولی مشکل من چیز دیگری است.

aligh.es
چهارشنبه 29 بهمن 1393, 12:02 عصر
سلام
اگر درست متوجه شده باشم مشکل شما اینه که ممکنه یه قبضی برای شخصی صادر شده باشه و وقتی به صورت گروهی دوباره قبض صادر میشه قبض قبلی که همین قبضه به عنوان بدهی در قبض درحال صادر شدن میخوره که درواقع این دوتا قبض یکی هستن که فقط باید بتونن دوبار صادر بشن؟ درسته

safa55
چهارشنبه 29 بهمن 1393, 12:45 عصر
سلام
اگر درست متوجه شده باشم مشکل شما اینه که ممکنه یه قبضی برای شخصی صادر شده باشه و وقتی به صورت گروهی دوباره قبض صادر میشه قبض قبلی که همین قبضه به عنوان بدهی در قبض درحال صادر شدن میخوره که درواقع این دوتا قبض یکی هستن که فقط باید بتونن دوبار صادر بشن؟ درسته

بله. مشکل من هم همین است.
فرض کنید از id شماره 1 تا 10 را داریم که در یک چاپ گروهی قرار است چاپ شوند(برای هر id یک قبض صادر می شود). بعد فرض کنید همین کار را دوباره چند دقیقه بعد تکرار کنیم.
چون بدهی در حین چاپ تعیین می شود و در حساب هر یک از مشتری ها ثبت می شود . با چاپ دوباره نباید بدهی هم بحساب بیاید چون قبلا ثبت شده.
همین.

golbafan
چهارشنبه 29 بهمن 1393, 13:21 عصر
سلام

میتونید هر رکوردی رو که چاپ شد بعد پاکش کنید

aligh.es
چهارشنبه 29 بهمن 1393, 13:52 عصر
خوب همونطور که دوستمون گفتن باید بر اساس یکسری پارامترها تمایز قائل شوید بین فبض جدید و قبض قبلی که داخل سیستم وجود دارد یعنی باید بتونید به سیستم بفهمونید یکه این قبض صادر شده همون رو صدا بزن یا اینکه قبض جدیده و قبض قبلی رو به عنوان بدهی در نظر بگیر

safa55
چهارشنبه 29 بهمن 1393, 16:12 عصر
خوب همونطور که دوستمون گفتن باید بر اساس یکسری پارامترها تمایز قائل شوید بین فبض جدید و قبض قبلی که داخل سیستم وجود دارد یعنی باید بتونید به سیستم بفهمونید یکه این قبض صادر شده همون رو صدا بزن یا اینکه قبض جدیده و قبض قبلی رو به عنوان بدهی در نظر بگیر

مرسی بابت توجه.
دوستان عزیز ، من هم میدونم که باید تمایز قائل بشوم. خوب جدول بدهی (کد مشتری و سال و مبلغ) است. برای هر مشتری در هر سال فقط یک بدهی یا رکورد بدهی خواهیم داشت. این از تمایز. که بدیهی است و قبلا گفتم.
ولی مشکل من چیز دیگری است !!!! منظورم این است وقتی که بصورت bulk داده ثبت می شه چطور این مشکل را حل کنم؟
یک مثال ساده: فرض کنید 10 تا قبض (1تا 10) بغیر از قبض شماره 9 داره صادر می شه . بعد کاربر مثلا اطلاعات مشتری شماره 9 رو تکمیل می کنه و بعد این مشتری هم جزء این گروه 10 نفره قرار میگیره و کاربر می خواهد دوباره برای این 10 نفر قبض صادر کنه. چون قبلا برای این 9 نفر بدهی ثبت شده بس باید فقط برای مشتری 9 بدهی ثبت بشه . و.... بعد چاپ قبض.
یک جور دیگر: من یک view دارم که اطلاعات مشتری و مبلغی را که قرار است پرداخت کنه را بر میگردانه و بعد این رکوردها را چاپ می کنم.
و فرض کنید مثلا اطلاعات 100 نفر رو می خواهم چاپ کنم که قبل از چاپ مبلغ را به عنوان بدهی ثبت می کنم که تا قبل از پرداخت به صورت بدهی می ماند. و بعد شروع به چاپ می کند ولی مثلا چاپ نمی شود (مشکل سیستم و نبود کاغذ و....) رخ می دهد ولی بدهی در حسابشان وجود دارد، بعد از رفع مشکل کاربر سعی می کند دوباره عمل چاپ را انجام دهد، در این حالت نمی خواهم دوباره برای مشتری بدهی درج شود.

برای چاپ تکی ، بدیهی است که بانک را چک می کنم ولی وقتی به صورت bulk یا گروهی چاپ می شود نمی شود که یکی یکی رکورد های بدهی را کاوش کرد.
حالا بهترین راه حل چیست؟؟ من خودم به triger فکر می کنم. فقط می خواهم بهترین راه حل را استفاده کنم.

safa55
شنبه 02 اسفند 1393, 10:16 صبح
دوستان برای این مشکل ، می خوام از trigger استفاده کنم. ولی نمی دونم چرا اون هم درست کار نمی کنه!!!
این هم کد اش

ALTER TRIGGER Trigger1
ON dbo.bedehi
AFTER INSERT
AS
BEGIN

-- Check for duplicate Person. If there is no duplicate, do an insert.
IF exists (select *
from bedehi p
inner join inserted I on P.pid = I.pid AND P.date=I.date)
rollback
ELSE
COMMIT

END
اصلا اجازه نمی ده چیزی ثبت بشه.
کجای کار مشکل دارد؟

safa55
یک شنبه 03 اسفند 1393, 20:37 عصر
خودم جواب رو پیدا کردم.

ALTER TRIGGER Trigger1
ON dbo.bedehi
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
IF EXISTS
(
SELECT 1
FROM dbo.bedehi T
INNER JOIN INSERTED I
ON T.pid = I.pid
AND T.date = I.date
)
BEGIN
-- Do dupe handling here
rollback
END

-- actually add it in
INSERT INTO
dbo.bedehi
SELECT
*
FROM
INSERTED I
END
با این تریگر مشکل ام حل شد.