PDA

View Full Version : سوال: جستجوی صحت یک شماره صادره ---نیاز به کمک فوری



narpco
چهارشنبه 14 فروردین 1398, 00:53 صبح
سلام به همه اساتید محترم

سئوال:

فرض کنید یک برنامه حسابداری داریم. ما 4 سری دسته چک 25 برگی از بانک گرفتیم

جدولی داریم که شماره ابتدا و انتهای دسته چک را وارد می کنیم ...
نام جدول ما هست :::: tbl_check ----نام فیلد ها : start---و----end میباشد

end--------start
شروع پایان
1----------25
101--------125
201-------225
301-------325

حالا یک محدوده عددی بین هر کدام از اعداد شروع و پایان داریم

حالا در یک فرم دیگر میخواهیم اطلاعات مربوط به این چکها را ثبت نماییم ---نام فرم ::: checkinfo
یکی از فیلد های فرم شماره چک هست ---checkno

حالا میخواهیم در رویداد after update این فیلد شماره چک بگوییم ....
شماره چکی که کاربر وارد کرده رو بگیر
برو به جدول شماره دسته چکها (که در بالا به آن اشاره کردیم )
ببین اگر شماره چک بین این اعداد بود >> هیچ کاری نکن
اگر شماره چک بین این شماره چکها نبود >>> پیغام بده شماره چک در دسته چک وجود ندارد .

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

amirzazadeh
پنج شنبه 15 فروردین 1398, 18:33 عصر
با سلام و عرض تبريك
پيشنهاد من اينه كه از رويداد before update فيلد مورد نظر توي فرمتون استفاده كنيد به اين صورت كه با استفاده از ركوردست جدول رو باز مي كنيد و به فيلد اول منتقل ميشيد بعد يك حلقه for ... next ايجاد مي كنيد كه هر بار عدد يك رو به فيلد استارت شما اضافه مي كنه .داخل لوپ هم شرط گذاشته ميشكه كه اگر عدد توليد شده با مقدار فيلد شما برابر نبود حلقه تا پايان ادامه پيدا مي كنه.در صورتيكه عدد مورد نظر در دسته چك اول نباشه با دستور rs.move next به دومين دسته چك وارد شده و همين مراحل رو تكرار مي كنيم و همينطور براي دسته چك سوم و چهارم. و در انتها در صورت يافت نشدن پيام مورد نظر شما صادر ميشه.
........................
موفق باشيد

narpco
پنج شنبه 15 فروردین 1398, 19:04 عصر
با سلام و عرض تبريك
پيشنهاد من اينه كه از رويداد before update فيلد مورد نظر توي فرمتون استفاده كنيد به اين صورت كه با استفاده از ركوردست جدول رو باز مي كنيد و به فيلد اول منتقل ميشيد بعد يك حلقه for ... next ايجاد مي كنيد كه هر بار عدد يك رو به فيلد استارت شما اضافه مي كنه .داخل لوپ هم شرط گذاشته ميشكه كه اگر عدد توليد شده با مقدار فيلد شما برابر نبود حلقه تا پايان ادامه پيدا مي كنه.در صورتيكه عدد مورد نظر در دسته چك اول نباشه با دستور rs.move next به دومين دسته چك وارد شده و همين مراحل رو تكرار مي كنيم و همينطور براي دسته چك سوم و چهارم. و در انتها در صورت يافت نشدن پيام مورد نظر شما صادر ميشه.
........................
موفق باشيد

سلام و سپاس بسیار از پاسخ شما ...یک پیام بصورت شخصی برای شما ارسال نمودم ممنون میشم پاسخ بفرمایید.با تشکر

reza2371
جمعه 16 فروردین 1398, 13:25 عصر
با عرض سلام و ادب و احترام
ضمن ارزوی سالی خوب برای اساتید و همراهان سایت برنامه نویس
بنده هم چنین مشکلی را دارم با این تفاوت که به جای دسته چک " از ردیف تا ردیف " دارم یعنی دو عدد دارم که بین آنها دامنه عددی ایجاد میشه
در یک زمین کشاورزی تعداد زیادی ردیف داریم که هر کشاورز روزانه تعدادی از انها را ابیاری میکند
در یک بانک اطلاعات پایه ثبت شده است مثلا از دریف 1 الی 45

سوال: در فرمی که اطلاعات وارد میشود میخواهیم اگر ردیف ها بر اساس کشاورز و شماره ردیف تکراری وارد شد خطا بما بدهد؟(بر اساس اطلاعات قبلی ثبت شده) همچنین در محدوده ای که برای اون تعریف شده قرار بگیره

میشه لطف کنید و فرمولی را ک دادید در اینجا بیارید
ممنون میشم منم خیلی عجله دارم149985

reza2371
یک شنبه 18 فروردین 1398, 01:16 صبح
با سلام و عرض تبريك
پيشنهاد من اينه كه از رويداد before update فيلد مورد نظر توي فرمتون استفاده كنيد به اين صورت كه با استفاده از ركوردست جدول رو باز مي كنيد و به فيلد اول منتقل ميشيد بعد يك حلقه for ... next ايجاد مي كنيد كه هر بار عدد يك رو به فيلد استارت شما اضافه مي كنه .داخل لوپ هم شرط گذاشته ميشكه كه اگر عدد توليد شده با مقدار فيلد شما برابر نبود حلقه تا پايان ادامه پيدا مي كنه.در صورتيكه عدد مورد نظر در دسته چك اول نباشه با دستور rs.move next به دومين دسته چك وارد شده و همين مراحل رو تكرار مي كنيم و همينطور براي دسته چك سوم و چهارم. و در انتها در صورت يافت نشدن پيام مورد نظر شما صادر ميشه.
........................
موفق باشيد

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

amirzazadeh
یک شنبه 18 فروردین 1398, 19:21 عصر
سلام
يك نمونه ساده براتون اپلود كردم

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("ChecksTable", dbOpenDynaset)
rs.MoveLast
rs.MoveFirst
For x = 1 To rs.RecordCount
If CInt(Me.Text0) >= CInt(rs.Fields(1)) And CInt(Me.Text0) <= CInt(rs.Fields(2)) Then
Exit Sub
Else
rs.MoveNext
End If
Next x
MsgBox "Check serial is not valid"
Cancel = True
rs.Close
Set rs = Nothing

reza2371
یک شنبه 18 فروردین 1398, 22:01 عصر
خیییییییییییییییلیییییییی یییییییییی ممنونم تشکر از توجه و وقت گذاری تون

fazl11
دوشنبه 19 فروردین 1398, 20:31 عصر
سلام
دوست عزیز حالا فکر کنید چند سال گذشت و تعداد دسته چکها به صد رسید باید کل صد تا دسته چک کنترل بشه که باعث کندی برنامه و مشکلات بعدی خواهید شد
به نظرم شما یه جدول دیگه ایجاد کنید و دسته چک ایجادی توی اون به صورت برگ برگ ذخیره بشه و اگر چک پاس شد از اون جدول خارج بشه و از تابع vlookup برای تایید برگه چک های موجود (نه پاس شده) که تعدادشون هم کم شده اقدام کنید

reza2371
سه شنبه 20 فروردین 1398, 00:56 صبح
سلام
يك نمونه ساده براتون اپلود كردم

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("ChecksTable", dbOpenDynaset)
rs.MoveLast
rs.MoveFirst
For x = 1 To rs.RecordCount
If CInt(Me.Text0) >= CInt(rs.Fields(1)) And CInt(Me.Text0) <= CInt(rs.Fields(2)) Then
Exit Sub
Else
rs.MoveNext
End If
Next x
MsgBox "Check serial is not valid"
Cancel = True
rs.Close
Set rs = Nothing


سلام مهندس امیرزاده
من هرکارکردم نتونستم اصلاح کنم از شما درخواست دارم کمکم کنید
دستوری ک شما دادید یک عدد رابررسی میکنه اما اگر یک دامنه اعداد باشه دستور به چه صورت میشه؟
درضمن چند تا شرط دیگه هم میخام اضافه کنم.؟؟؟؟

اینم فایل
149997

narpco
چهارشنبه 21 فروردین 1398, 01:26 صبح
دوست عزیز و گرامی ام .جناب امیرزاده ....
بسیار سپاسگزارم از دقت سرعت و مسئولیت پذیری حضرتعالی در برابر مشکلات دوستانی مانند بنده که دانش فنی کافی برای حل مشکلاتشان را ندارند.
فایل اولی رو که فرستاده بودید بنده با کمی تغییر ...توانستم استفاده کنم ....و مشکل بسیار بزرگی در بنده حل شد....انشالله که حضرت حق همه خوبی های زمین آسمان را نصیب شما عزیز گرنقدر نماید....آنطور که شایسته دل بزرگ شماست ....ارادتمند ...داریوش

narpco
چهارشنبه 21 فروردین 1398, 01:35 صبح
و اما در پاسخ به دوست عزیزمان جناب فاضل که فرموده بودن :

سلام
*****دوست عزیز حالا فکر کنید چند سال گذشت و تعداد دسته چکها به صد رسید باید کل صد تا دسته چک کنترل بشه که باعث کندی برنامه و مشکلات بعدی خواهید شد به نظرم شما یه جدول دیگه ایجاد کنید و دسته چک ایجادی توی اون به صورت برگ برگ ذخیره بشه و اگر چک پاس شد از اون جدول خارج بشه و از تابع vlookup برای تایید برگه چک های موجود (نه پاس شده) که تعدادشون هم کم شده اقدام کنید***************

دوست عزیز در مقام برادر کوچک شما و یک حسابرس عرض می کنم که جدول شماره چک تنها بعنوان مرجع کنترل مورد استفاده قرار میگرد و در جدول جدا گانه ای است ....بر فرض محل که تعداد دسته چکهای شما به 100 فقره برسد ....بازهم مشکل افت سرعت نخواهید داشت چون اکسس در حال کنترل بین 200 عدد(شروع و پایان ) میباشد......باز هم برفرض محل اگر افت سرعت داشت شما میتوانید 98 ردیف رو پاک کنید و هیچ مشکلی نخواهید داشت چون بصورت منطق ریاضی شما باید تمام برگه چک های دسته چکهای قبلی تان به بانک ارجاع شده باشد تا بتوانید دسته چک جدید بگیرید و اینکه شماره دسته چکهای قبلی در جدول اسناد پرداختنی قبلا ثبت و تعیین تکلیف شده اند ...و رابطه جدولی با جدول تعریف شماره دسته چک ندارند .....
هدف ما از بیان این مشکل تنها کنترل لحظه ای شماره چک وارد شده در فرم صدور اسناد پرداختنی میباشد و بعد از کنترل و ثبت همه برگه های چک دیگر نیازی به اون ردیف دسته چک تعریف شده ...نخواهیم داشت و میتوانیم آنرا پاک کنیم ......جا داره دوباره از جناب امیرزاده ....قدردانی نمایم ....روزگار خوش

mazoolagh
چهارشنبه 21 فروردین 1398, 09:05 صبح
به جای جستجوی رکورد به رکورد میشه از تابع dfirst هم استفاده کرد:



Function InRange(x As Long) As Boolean
InRange=Nz(DFirst("start" , "tbl_check" , x & " BETWEEN [start] AND [end]") , 0)
End Function

narpco
چهارشنبه 21 فروردین 1398, 23:50 عصر
دوست عزیز با سپاس از شما ...ممنون میشم روش استفاده از این کد رو رو هم بفرمایید ایا ما این رو داخل یک ماژول بزاریم و در یک رویداد یدا بزنیم ؟
یا مثلا در رویدار beforupdate تکست باکس مورد نظرمان قرار بدیم ؟ممنون میشم ...

reza2371
جمعه 23 فروردین 1398, 23:02 عصر
سلام مهندس امیرزاده
من هرکارکردم نتونستم اصلاح کنم از شما درخواست دارم کمکم کنید
دستوری ک شما دادید یک عدد رابررسی میکنه اما اگر یک دامنه اعداد باشه دستور به چه صورت میشه؟
درضمن چند تا شرط دیگه هم میخام اضافه کنم.؟؟؟؟

اینم فایل
149997

اساتید محترم بزرگوارهای عزیز کسی میتونه مشکل منو حل بکنه؟؟؟

Mehr@ban
شنبه 24 فروردین 1398, 00:51 صبح
یکم تاپیک شلوغ شده!
مشکلتون رو تا جایی که حل نشده مجددا بفرمایید

reza2371
شنبه 24 فروردین 1398, 18:20 عصر
یکم تاپیک شلوغ شده!
مشکلتون رو تا جایی که حل نشده مجددا بفرمایید

سلام
آقای امیرزاده دستوری دادن که یک عدد را گرفته و در بانک جستجوی میکنه اگر این عدد در بانک موجود نباشه خطا میده
حالا من میخوام یه دستور for دیگه به این کد اضافه بشه ( چون توی فرم بنده از دوعدد استفاده میشه که دامنه این دو عدد باید از طریق دستور آقای امیرزاده صحتش در بانک چک بشه)
خیلی زود عجله دارم

reza2371
یک شنبه 25 فروردین 1398, 08:46 صبح
یکم تاپیک شلوغ شده!
مشکلتون رو تا جایی که حل نشده مجددا بفرمایید

این هم فایل که مشکل داره + توضیحات

mazoolagh
یک شنبه 25 فروردین 1398, 09:45 صبح
دوست عزیز با سپاس از شما ...ممنون میشم روش استفاده از این کد رو رو هم بفرمایید ایا ما این رو داخل یک ماژول بزاریم و در یک رویداد یدا بزنیم ؟
یا مثلا در رویدار beforupdate تکست باکس مورد نظرمان قرار بدیم ؟ممنون میشم ...

بهتره در validation rule استفاده بشه

reza2371
دوشنبه 26 فروردین 1398, 14:52 عصر
این هم فایل که مشکل داره + توضیحات


سلام
کسی نمیتونه جواب سوال منو بده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟