PDA

View Full Version : گير شر كردن به اين ميگن(كمك كمك در مورد sql server)



ali682344
پنج شنبه 27 اسفند 1388, 19:55 عصر
با سلام خدمت همه دوستان

من مي خوام برنامه خودم كه با اكسس هست رو به sql server 2000 تبديل كنم كه اين كارو فقط به خاطر مسئله همزماني در شبكه انجام مي دم
پايگاه دادشو تبديل كردم
مي خوام بدونم sql به طور خودكار اين مسئله رو تشخيص مي ده يا نياز به كدنويسي چيزي داره
اگه امكان داره يه نمونه بذاريد


اين شر رو از سر من كم كنيد
فداتون بشم منتظرم

ali682344
جمعه 28 اسفند 1388, 13:00 عصر
كسي نيست كمك كنه
تو رو خدا كمك كنين::افسرده::افسرده::افسرده ::افسرده:

HjSoft
جمعه 28 اسفند 1388, 13:21 عصر
متوجه نشدم .. .بیشتر توضیح بده . من هم دقیقا همین کار رو کردم و بانک اکسسم رو به sql تبدیل کردم . هیچ مشکلی پیش نیامد و هیچ کد خاصی هم نمی خواد فقط کافیه یک کانکشن استرینگ درست بهش بدی .

ali682344
یک شنبه 01 فروردین 1389, 17:04 عصر
ضمن تبريك سال نو

مشكلم اينه كه sql رو چطوري مي تونم براي اين مشكلات تنظيم كنم:
1- مثلا من يه فيلد autonumber دارم وقتي كليد add زده مي شه اون فيلد مقدار 1 ميگيره و سيستم هاي بعدي هم همون مقدار رو دارن و همه با يك كد ذخيره ميشن البته يكي از دوستان براي پايگاه اكسس گفتند كا با كد نويسي مي توني هنگام ذخيره چك كني ببيني اين كد ثبت شده يا نه اگه ثبت شده بود اون كدو + 1 كن
ولي براي من خوب جواب نميده
ايا sql به طور خودكار جلوگيري مي كنه يا بايد كد نويسي شه
2-مثلا در ان واحد يكي مي تونه يه ركورد و حذف كنه و يه نفر ديگه رو همون ركورد داره عمل ويرايش انجام ميده



بازم از پاسختون ممنونم

HjSoft
دوشنبه 02 فروردین 1389, 10:02 صبح
جواب 1 : اگه درست متوجه شده باشم ، شما توی برنامه تون یک دکمه دارید به نام افزودن که کاربر روی اون که کلیک میکنه ، قسمت ورود اطلاعات جدید باز میشه و کاربر می تونه اطلاعات جدید رو وارد کنه ، یعنی در حقیقت با کلیک روی افزودن addnew رو به رکوردست بانک میفرستین ... خوب شما به جای اون کار تکست ها رو از بانک جدا کنید و به کاربر اجازه بدین ، که بتونه هرچی خواست وارد کنه ، بعد یک دکمه بزارید به جای افزودن ، که که کاربر روی اون کلیک کرد ، همزمان addnew به بانک فرستاده شده و مقدار هایی که کاربر در تکست ها وارد کرده به بانک اضافه بشن و با یک msgbox ، کد شناسایی رو به کاربر اعلام کنید . این راهیه که خودم تا حالا استفاده می کردم . کد اون دکمه میشه به صورت زیر :


rst.addnew
rst.field("name") = txt_name.text
rst.update
msgbox rst.field("id")

برای سوال دومتون هم من جوابی ندارم ، برام پیش نیامده !


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

ali682344
دوشنبه 02 فروردین 1389, 15:11 عصر
از كدي كه فرستادي ممنونم
------------------------------
نمي دونم مشكل دومي اصلا در اسكيوال وجود داره يا نه
اگه كسي واقعا اينو ميدونه كمك كنه
توش موندم بد جوري :عصبانی++::گریه::گریه:

علیرضا حسن زاده
دوشنبه 02 فروردین 1389, 15:42 عصر
از كدي كه فرستادي ممنونم
------------------------------
نمي دونم مشكل دومي اصلا در اسكيوال وجود داره يا نه
اگه كسي واقعا اينو ميدونه كمك كنه
توش موندم بد جوري :عصبانی++::گریه::گریه:
می تونی رکورد رو Lock کنی که دو راه داره اولی که بهتره از طریق خود SQL هست و رکورد رو Lock میکنه و برای این کار می تونی از طریق ADO هم عمل کنی راه دوم هم اینکه که واسه هر رکورد یه فیلد Status بذاری که وقتی کاربری اون رو خوند مشخص کنه کاربرای دیگه می تونن اونو بخونن با ویرایش کنن و... اینم یادت باشه که اگه یه موقع کاربر در هر دو حالت رکورد رو قفل کرد و یه موقع سرور یا سیستم کابر هنگ کرد و ریستارت شده رکورد به صورت قفل باقی می مونه و باید یه قسمتی هم برای از قفل خارج کردنش بنویسی:لبخندساده:

ali682344
دوشنبه 02 فروردین 1389, 16:57 عصر
علي رضا جان من در اين مورد كه فرمودي خيلي مبتدي هستم
حداقل يه نمونه ميشه بفرستي

دستت درد نكنه اون راهي كه از همشون ساده تره

علیرضا حسن زاده
سه شنبه 03 فروردین 1389, 13:22 عصر
علي رضا جان من در اين مورد كه فرمودي خيلي مبتدي هستم
حداقل يه نمونه ميشه بفرستي

دستت درد نكنه اون راهي كه از همشون ساده تره
در اولین فرصت چشم ولی شاید خیلی دیر کنم چون درگیر طراحی یه سایت هستم سرم خیلی شلوغه از دید و بازدید عید هم موندم ولی اگه فرصت کنم چشم:قلب:
اگر هم من نتونستم یه مطالعه ای در باره کرسر ها SQL انجام بده اون وقت یه چیزایی دستت میاد مثلا اگه با یه کرسر خاص یه پایگاه داده رو مرور کنی رکوردهایی که پرسجوی تو برمی گردونه واسه دیگران غیر قابل نمایش میشه

ali682344
سه شنبه 03 فروردین 1389, 14:05 عصر
فدات بشم مشكلي نيست فقط اين مشكل من حل بشه

بازم ممنون

ali682344
چهارشنبه 04 فروردین 1389, 12:57 عصر
هنوز منتظرم

ali682344
شنبه 07 فروردین 1389, 15:11 عصر
واقعا كسي نيست كه اطلاعات كافي در اين مورد داشته باشه

paladin
شنبه 07 فروردین 1389, 19:55 عصر
شما می توانید از خود mssql استفاده کنی . توی ان از import استفاده کنی . فقط باید کلید ها و autonumber ها رو دوباره تعریف کنی . اگه مشکل داشتی بگو که بهت بگم. من روزی دوبار تبدیل میکنم .

علیرضا حسن زاده
شنبه 07 فروردین 1389, 23:22 عصر
دوست عزیز شرمنده یادم رفته بود
ولی برای حالا این کاری رو که می گم بکن حل میشه؟
برای جدول هایی که کاربرا می تونن به صورت مشترک استفاده کنن یه فیلد با مقدار بولین اضافه کنید(یا 0و1و2 که بتونه حالت های مختلف رو پشتیبانی کنی حالا اینو توضیح میدم).
وقتی هر کاربری یه رکورد خاص رو خواست Fetch کنه اول چک کنه که فیلد وضعیت False هست یا نه اگر true بود پیام بده که کاربر دیگه درحال استفاده از این رکورد می باشد از طرف دیگه هر وقت کاربری روکورد رو تونست بخونه فیلد وضعیت اون رو true کنه تا کاربرای دیگه نتونن از اون استفاده کنن
خوب کل تئوری بود
حالا می تونی امکانات بیشتری رو هم اضافه کنی مثلا می تونی فیلد رو از نوع عدد صحیح انتخاب کنی و هر کاربر با قرار دادن مقدار های 0و1و2و... مشخص کنه که دیگران می تونن اون رو بخونن، اجازه خوندن به دیگران نده، اجازه نمایش به دیگران رو بده ولی امکان ویرایش و Update اون رو به دیگران نده یعنی برنامه چک کنه اگه فیلد مقدار مثلا 2 بود اجازه آپدیت رکورد رو به کابر نده.
خوب این تا اینجا که کل عملیات رو باید خودت پیاده سازی کنی البته اگه خواستی روش دوم رو پیاده کنی باید خیلی چیزار و حواست باشه
باز اگه فرصتی شد روش استفاده از کرسر ها رو هم توضیح میدم که شاید راحتتر باشه

ali682344
شنبه 07 فروردین 1389, 23:58 عصر
از راهنمايي شما واقعا ممنونم


در اين روش اگه سيستم هنگ كنه چه بلايي سر ركورد مياد
مثلا اگه يه كابر رفته بود روي يك ركورد كه اونو ويرايش كنه بعد سيستم هنگ كنه
مقداري كه در ركورد ذخيره شده همون مقدار قبليه پس همون ركورد ديگه غير قابل ويرايشه

يعني دفعه بعد خودش هم دچار مشكل ميشه ، قادر به ويرايش اون ركورد نيست
اينو بايد چه كار كرد

علیرضا حسن زاده
یک شنبه 08 فروردین 1389, 09:11 صبح
خوب دوست عزیز همینو گفتم باید مواظب باشی برنامه هایی که از این روش استفاده می کنن قسمتی هم دارن که Admin برنامه میتونه رکورد ها رو از حالت قفل دربیاره یا میتونه این اختیار رو به کاربرای خاصی بده به این صورت که بدون توجه به وضعیت قفل رکورد اون رو به حالت دلخواه خودش می بره (می تونه یه سری رکورد ها رو غیر قابل نمایش یا ویرایش برای کابرای دیگه بکنه) این روش انعطاف پذیریش خیلی زیاده و هر چیزی که تو ذهنت باشه می تونی پیاده سازی کنی ولی در استفاده از کرسرها محدودیت های خاصی داری که البته این مشکلات رو نداری

ali682344
یک شنبه 08 فروردین 1389, 10:37 صبح
دوست عزيز با اين پيشنهاد هاي شما مخ من هم جرقه اي زد گفتم بهتره اونو مطرح كنم .

من اومدم دو تا فيلد درست كردم يكي براي كاربران(karbar) و دومي همون مقدار بولين (edit)

وقتي يك كاربر لوگين مي كنه اين مقدار فيلد يعني (karbar) پر مي شه يعني نام كابر داخل فيلد كابر ميره ،يعني ما براي هر ركورد مشخص مي كنيم چه كسي با اون كار كرده
وقتي كاربر روي يك ركورد ميره اگه فيلد edit مقدار false داشت به كابران ديگه اجازه ويرايشو نميده

خوب هدف من براي ايجاد فيلد كاربر اينه كه :

اگه سيستم هنگ كرده باشه و يك ركورد قفل شده بود ،با يه دستور در ابتداي فرم لوگين مي تونيم ركوردي و كه توسط اون كابر قفل شده باز كنيم

خوب اگه مشكلي به نظرتون مي رسه كه من متوجه نشدم لطفا توضيح بدين

علیرضا حسن زاده
یک شنبه 08 فروردین 1389, 14:25 عصر
خوب اگه مشكلي به نظرتون مي رسه كه من متوجه نشدم لطفا توضيح بدين
اینکه کاربر ایجاد کننده یا ویرایش کننده هر رکورد رو ثبت کنی تو خیلی از سیستم ها وجود داره و برای برنامه هایی مثل برنامه های حسابداری بزرگ که چند تا کاربر ازش استفاده می کنن مفیده
ولی این که کاربر بتونه در زمان لوگین رکورد قفل شده رو باز کنه خوب نیست و این وظایف آدمین برنامه هست و اون باید چک کنه که چرا رکورد قفل شده یا سیستم هنگ کرده بود(مثلا کاربر قصد خرابکاری داشته یا نه:چشمک:)
ولی خوب همون طور که گفتم تئوری واصول کار همینه حالا شما می تونه بسته به نوع نیازتون می تونید اون رو پیاده سازی کنید
اینم در نظر داشته باشید که اگه یه موقع برناتون خواست رو یه شبکه بزرگ کار کنه ممکنه ترافیک شبکه بوجود بیاره که باید بهینه سازی های مناسب رو انجام بدی تا به کمترین ارتباط با سرور نیاز باشه

paladin
سه شنبه 10 فروردین 1389, 19:30 عصر
پسر خوب از اکسس فقط در یک صورت دو صورت میتونی تحت شبکه (منظورم چند کاربره ) استفاده کنی اول استفاده از لایه بنده با کامپوننت های RCC هست . دوم استفاده از Remote desktop . کلا اکسس رو بیخیال شو .
البته RD بدک نیست .

ali682344
سه شنبه 10 فروردین 1389, 19:47 عصر
دوست عزيز مشكل من در sql server 2000 هست


اگه شما در اين مورد اطلاعي داري واقعا دريغ نكنيد چون كارم گيره البته دوستاي ديگه راهنمايي هاي خوبي كردن ولي يه استفاده صحيح رو مي خوام ياد بگيرم.

ali682344
چهارشنبه 11 فروردین 1389, 22:31 عصر
گمون كنم كسي نيست يه كمك درستو حسابي به ما بكنه

paladin
یک شنبه 15 فروردین 1389, 23:22 عصر
خوب الان مشکل شما دقیقا کجاست؟

ali682344
یک شنبه 15 فروردین 1389, 23:54 عصر
با تشکر از پاسختون
یکی از مشکلات رفع شد
مشکل دوم
مثلا در ان واحد يكي مي تونه يه ركورد و حذف كنه و يه نفر ديگه رو همون ركورد داره عمل ويرايش انجام ميده
با استفاده از یک روش حرفه ای ، نه با استفاده از ساختن یک فیلد boolean برای اینکه ببینیم این رکورد در حال ویرایش است یا نیست
(به دلیل مشکلاتی که بعدا پیش می اید ، در پست های قبلی به آن اشاره شده است)

paladin
دوشنبه 16 فروردین 1389, 19:25 عصر
شما چند راه دارید : 1 استفاده از برنامه نویسی چند لایه 2 استفاده از قفل کردن رکورد در زمان انجام اعمال خاص( مثل ویرایش ) و ... این دو راه از همه راحتره . از فکر فیلد boolean بیا بیرون، شدید ! چون باید قید گسترش برنامه رو بزنی . در هر مورد که گفته شد یه سرچ بزنی می تونی هزار تا مطلب پیدا کنی .

ali682344
دوشنبه 16 فروردین 1389, 19:46 عصر
با تشكر مجدد از شما
اگر يه نمونه كدي در مورد قفل كردن ركورد داريد من ديگه ازشر اين هم خلاص ميشم

بازهم از پاسختون ممنونم

paladin
چهارشنبه 18 فروردین 1389, 00:37 صبح
من چند وقته که VB کار نکردم ولی این رو پیدا کردم :
Dim conn As New ADODB.Connection
Dim rsapprove As New ADODB.Recordset
Set conn = New ADODB.Connection

Set rsapprove = New ADODB.Recordset
conn.Open sqlConnStr
rsapprove.Open "Finalvouch", conn, adOpenKeyset, adLockOptimistic, adCmdTable

Dim Str_query1 As String
Dim Status As String

If optApprove.Value = True Then
Status = "Approved"

' On Error GoTo myerror

With rsapprove
.AddNew

.Fields("vouchno") = txtVoucherNo
.Fields("PAYEE") = txtPayee
.Fields("BANK") = cboBank
.Fields("checkno") = txtCheckNo
.Fields("TDATE") = txtDate
.Fields("TOTAMT") = txtTotAmount
.Fields("prepby") = txtPREPBY
.Fields("notedby") = txtNOTEDBY
.Fields("apprby") = txtAPPRVBY
'.Fields("DateRecvd") = Me.txtDateRecvd
.Fields("recvdby") = txtRECVDBY
.Fields("PARTICULARS") = Me.txtParticulars.Text
.Fields("MADEIN") = cboIssuedAt
.Fields("Status") = Status

if rsapprove.fields("status") = "Approved" then
lock rsappove
end if

'Do While Not rsapprove.EOF
'If txtVoucherNo.Text <> rsapprove.Fields("vouchno") Then

.Update
'Else
' MsgBox "This check has already undergone Approval", vbInformation, "Check Voucher"
' Unload Me
' Exit Sub
'End If
'Loop

End With

MsgBox "Check Approved and Entries Updated", vbInformation, "Vouchers"
cmdSave.Enabled = False

ali682344
چهارشنبه 18 فروردین 1389, 08:41 صبح
دوست عزیز از لطف شما متشکرم
ولی این کد هم یه فیلد گزاشته برای قفل کردن رکورد با استفاده از چک باس
به طور کلی با این دستورات مشکلات عرض شده پابرجاست