PDA

View Full Version : سوال در مورد مرتب کردن شماره اسناد در بانک اطلاعاتی؟



نیما حتمی
دوشنبه 09 خرداد 1390, 12:11 عصر
با سلام

من برنامه ای نوشتم که کاربر اسناد حسابداری را وارد گرید و ذخیره میکنه.سوال اینجاست که وقتی کاربر مثلا امروز تاریخ1390/03/09 یک سند ثبت میکنه به شماره سند 1(شماره سند توسط سیستم درج میشود و کاربر دخاتی در آن ندارد)10 روز دیگه یک سند براش میاد دوباره به تاریخ1390/03/09 و در این 10 روز 100 سند زده و شماره اسناد تا 101 پیش رفته حالا کاربر می بایست سندی که اومده واسش و به تاریخ 1390/03/09 رو به همون تاریخ بزنه و می زنه و من فرمی طراحی کردم که باید در این فرم عملیات( شماره سند برگرده به یکی بعد از آخرین سند تاریخ 1390/03/09 ).مثلا اگه آخرین سند تاریخ1390/03/09 5 است باید این سندی که بعد از 10 روز به دست کاربر رسیده و کاربر ثبتش کرده برگرده به یکی بعد از آخرین شماره سند دذ تارخ مذکور
قابل ذکر است دوستان این توضیحاتی که بنده دادم در یک فرم جدا برای اسنادی که روزها پس از تاریخ روز به کاربر ثبت کننده داده می شود قرار است انجام بشه.
در واقع بنده می خوام اسناد حسابداری رو مرتب کنم براساس تاریخ ثبت که شماره اسنادشونم باید به ترتیب باشه

نیما حتمی
سه شنبه 10 خرداد 1390, 08:14 صبح
اساتید و مدیران محترم کسی نمی تونه راهنمایی منه؟

سمانه علوی فر
سه شنبه 10 خرداد 1390, 11:57 صبح
من کد وی بی شو می ذارم
یه راهنمایی هم می کنم

بی زحمت تبدیلش کردی به سی شارپ بذار تو همین صفحه که استفاده بشه





Public Sub ReindexRecordsUpdateCode(tbl As String, HasMsg As Boolean, ttl As String, Optional ByVal dateFieldName As String = "date")

Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = Nothing
Set db = New ADODB.Connection

db.CursorLocation = adUseClient
db.Open strDBConnectionString
Set rs = New ADODB.Recordset
' rs.Open "select code from " & tbl & " WHERE FT = " & lngCurrFinaTerm & " order by code ", db, adOpenStatic, adLockOptimistic
rs.Open "select * from " & tbl & " WHERE FT = " & lngCurrFinaTerm & " order by " & dateFieldName & ",code ", db, adOpenStatic, adLockOptimistic
Dim max, min, temp As Integer
Dim tmpDt As String, flgChange As Boolean




If rs.RecordCount > 0 Then
With rs

rs.MoveFirst
min = .Fields("code")

rs.MoveLast
max = .Fields("code")

If min < 0 Then
temp = max - min + 10
Else
temp = max + min + 1000
End If


.MoveFirst
Do Until .EOF = True

'If .Fields("code") < 0 Then
.Fields("code") = .Fields("code") + temp
.Update
.MoveNext
'Else
' GoTo nex
'End If

Loop

Dim i As Integer
i = 0
.MoveFirst
i = 0
Do Until .EOF
i = i + 1
.Fields("code") = i
.Update
.MoveNext
Loop



nex:
End With
If HasMsg Then farmsgbox "ok", vbOK, 4, "406"
Else
If HasMsg Then farmsgbox "NO", vbOK, 1, "406"
End If


'close data base
If db.State <> 0 Then
db.Close
End If
Set db = Nothing

With rs
If .State = 1 Then
.Close
End If
End With


End Sub

نیما حتمی
سه شنبه 10 خرداد 1390, 12:17 عصر
با تشکر پاسخ شما. این کد چیکار میکنه؟این کد convert به C# نمیشه.دوستان کسی نیست کمک کنه؟کارم گیره

سمانه علوی فر
سه شنبه 10 خرداد 1390, 13:23 عصر
با تشکر پاسخ شما. این کد چیکار میکنه؟این کد convert به C# نمیشه.دوستان کسی نیست کمک کنه؟کارم گیره

این کد دقیقا همون کاری رو انجام میده که شما می خوای
خیلی ساده می تونی سی شارپشو بنویسی
کاری نداره که

نیما حتمی
سه شنبه 10 خرداد 1390, 13:30 عصر
شکل زیرو نگاه کنید من میخوام 17 بشه 3 البته جای رکوردها نمی خوام عوض بشه
70594
سیستم میاد تاریخ رو میبینه براسا س تاریخ شماره سند رو تغییر می ده.در واقع من میخوام فقط وفقط جای شماره سندها باهم عوض بشه نه داده های دیگه و این تغییرات در بانک اعمال بشه(update بشه جدول مربوطه)


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

b_savad
سه شنبه 10 خرداد 1390, 15:18 عصر
هیچ راهی نداره مگه اینکه خودت شماره سند رو دستی تولید کنی
یعنی autonumber نباشه

نیما حتمی
سه شنبه 10 خرداد 1390, 15:29 عصر
هیچ راهی نداره مگه اینکه خودت شماره سند رو دستی تولید کنی
یعنی autonumber نباشه
در برنامه نویسی هیچ چیز غیر ممکن نیست

Reza_Yarahmadi
سه شنبه 10 خرداد 1390, 18:54 عصر
من نمیدونم علت اینکار شما چیه و به چه دلیل به این کار نیاز دارید ولی در کل این روش ، روش جالبی نیست. راه اصولی تر اینه که اعداد رو طوری تولید کنید که نیازی به تغییر سایر کدها نباشه ، بر مثال کدها ، اعداد بزرگتری باشه که بخش اول اونها سال و ماه و روز و بقیه کد شماره سند مربوطه باشه
139003070017
ولی اگر نیاز دارید به همون صورتی که خودتون فرمودید عمل بشه میتونید بصورت این کار رو انجام بدید.
Declare @MAXNumReceipt int,
@DateDoc varchar(10)
Set @DateDoc = '1390/03/07'

Select @MAXNumReceipt = MAX(NumReceipt)
From TableName
Where DateDoc = @DateDoc

Update TableName Set
NumReceip = NumReceipt + 1
Where
NumReceipt > @MAXNumReceipt
--OR
--DateDoc > @DateDoc

Insert Into TableName
(...,DateDoc, NumReceipt)
Values
(...,@DateDoc, @MAXNumReceipt + 1)
اگر تعداد استفاده این کد زیاد باشه سربار زیادی به سرور وارد میکنه.
با توجه به نوع ایندکسی که رو فیلدهاتون گذاشتید یکی از شرطهای آپدیت رو انتخاب کنید.

نیما حتمی
چهارشنبه 11 خرداد 1390, 08:48 صبح
سلام


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

tooraj_azizi_1035
چهارشنبه 11 خرداد 1390, 11:37 صبح
سلام،
اول اینکه منظورتون از اینکه میگید "کاربر باید بیاد اون سند رو به تاریخ 10 روز قبل بزنه" چیه؟
وقتی به یک سند یک شماره اختصاص پیدا کرد ما یک سری از اعداد متوالی داریم مثلاً 1 تا 10. اگر به هر دلیلی قرار باشه یک عدد جدید یکتا در این سری قرار بگیره چاره ای نیست جز اینکه از مکان اون عدد به بعد مجدداً شماره گذاری کنیم مثلاً تو مثال شما 17 می شه 3، 3 می شه 4 و الی آخر. که این کار رو باید در یک حلقه انجام بدی داخل حلقه یک دستور UPDATE اجرا می شه که شماره سند رو می گیره و اون رو عوض می کنه. البته می تونی یه Trigger بنویسی که کارش اینه که از 1 تا N رو روی مقادیر فعلی Replace کنه.

نیما حتمی
چهارشنبه 11 خرداد 1390, 11:48 صبح
سلام آقای عزیزی
منظورم اینه که وقتی به کاربر اسناد مربوط به 10 روز قبل رو امروز میدن که هنوز در سیستم ثبت نشده کاربر میاد به تاریخ 10 روز قبل سندی که امروز بهش دادنو می زنه حالا شماره سند تا امروز تا 100 رفته در صورتی که سندی که امروز به کاربر دادن شماره سندش باید بشه آخرین شماره سند تا تاریخ 10 روز پیش(مثلا اگه آخرین سند تا 10 روز پیش 12 بوده باید بشه 13 این سند و الی آخر)
اگه ممکنه با کد بفرمایید چه کار باید کنم.

نیما حتمی
چهارشنبه 11 خرداد 1390, 14:41 عصر
دوستان کسی نیست این کمک بزرگ و در حق ما بکنه؟

reuonis
چهارشنبه 11 خرداد 1390, 15:23 عصر
راهی که آقای Reza_Yarahmadi گفتند مشکلی نداره، من خودم از این روش استفاده می کنم.

نیما حتمی
چهارشنبه 11 خرداد 1390, 15:34 عصر
این دستورات sql هست.چطور در سی شارپ استفاده کنم؟ممنون میشم راهنماییم کنین

Reza_Yarahmadi
چهارشنبه 11 خرداد 1390, 18:35 عصر
که این کار رو باید در یک حلقه انجام بدی داخل حلقه یک دستور UPDATE اجرا می شه که شماره سند رو می گیره و اون رو عوض می کنه. البته می تونی یه Trigger بنویسی که کارش اینه که از 1 تا N رو روی مقادیر فعلی Replace کنه.
نیازی به این کار نیست و به یک دستور Update ساده میشه این کار رو انجام داد (همون دستوری که توی پست قبل گذاشتم).

این دستورات sql هست.چطور در سی شارپ استفاده کنم؟ممنون میشم راهنماییم کنین
یا این دستورات رو بصورت یک Store Proc بنویسید و سمت برنامه اونو صدا بزنید یا بصورت زیر عمل کنید.
SqlCommand cmd = new SqlCommand(@"
Declare @MAXNumReceipt int

Select @MAXNumReceipt = MAX(NumReceipt)
From TableName
Where DateDoc = @DateDoc

Update TableName Set
NumReceip = NumReceipt + 1
Where
NumReceipt > @MAXNumReceipt
--OR
--DateDoc > @DateDoc

Insert Into TableName
(...,DateDoc, NumReceipt)
Values
(...,@DateDoc, @MAXNumReceipt + 1)", con);
cmd.Parameters.AddWithValue("@DocDate", "1390/03/07");
con.Open();
cmd.ExecuteNonQuery();
con.Close();
به جای 3 نقطه سایر فیلدها و مقدارهاشون رو قرار بدید.
پیشنهاد میکنم یک مقدار در مورد SQL مطالعه کنید. نمیشه با دونستن فقط #C برنامه نویسی حرفه ای کرد ، بعضی از مواقع برای مواردی مثل امنیت بیشتر ، سرعت بیشتر ، کدنویسی راحتتر و ... باید کارها رو سمت دیتابیس انجام داد. (به خدا SQL هم همه چیز داره!! :چشمک:)
البته من بازم سر حرف خودم هستم که روش شماره گذاری سند خیلی جالب نیست .:گیج:

نیما حتمی
دوشنبه 16 خرداد 1390, 08:09 صبح
این دستورات واسه چیه دوست عزیز؟


Insert Into TableName
(...,DateDoc, NumReceipt)
Values
(...,@DateDoc, @MAXNumReceipt + 1)", con);



cmd.Parameters.AddWithValue("@DocDate", "1390/03/07");

نیما حتمی
دوشنبه 16 خرداد 1390, 10:01 صبح
این ارور واسه چیه؟من فیلدامو اضافه کردم
70786

نیما حتمی
دوشنبه 16 خرداد 1390, 14:43 عصر
آقا رضا این سوال منو میشه پاسخ بدین لطفا؟

Reza_Yarahmadi
دوشنبه 16 خرداد 1390, 18:37 عصر
این دستورات واسه چیه دوست عزیز؟
Insert Into TableName
(...,DateDoc, NumReceipt)
Values
(...,@DateDoc, @MAXNumReceipt + 1)", con);




cmd.Parameters.AddWithValue("@DocDate", "1390/03/07");


دستور اول: من فرض کردم بعد از جابجا کردن شماره سندها میخواید اطلاعات سند جدید رو ذخیره کنید ، این کد سند جدید رو با کد بدست اومده ذخیره میکنه (به جای 3 نقطه فیلدهای مورد نظرتون رو بذارید)
دستور دوم: متغیرها توی SQL با @ شروع میشن ، 2 راه برای تعریف متغیر وجود داره یکی اینکه توی دستورات SQL و با استفاده از دستور Declare متغیر و نوعش معلوم بشه (مثل متغیر MAXNumReceipt@) و دیگری اینکه توی دستورات SQL استفاده بشه ولی از سمت برنامه مقدارش پاس داده بشه. توی مثال بالا من متغیر DocDate@ رو توی دستورات استفاده کردم و با استفاده از خاصیت Parameters مقدار این متغیر رو پاس دادم (خیلی سعی میکنم روان توضیح بدم ولی نمیشه!:گیج:)

خطایی هم که به شما میده به این دلیله که 2 متغیر DateDoc@ و AtfDoc@ رو توی دستورات SQL استفاده کردید ولی نه توی دستورات SQL اونوها رو تعریف کردید نه از طرف برنامه مقداری به ازا هر کدوم پاس دادید (من توی کدی که گذاشتم به جای DateDoc@ اشتباها DocDate@ پاس دادم)
با استفاده از cmd.Parameters.AddWithValue هر 2 متغیر رو مقدار دهی کنید درست میشه.
cmd.Parameters.AddWithValue("@DateDoc", textBox1.Text);
cmd.Parameters.AddWithValue("@AtfDoc", textBox2.Text);