PDA

View Full Version : سوال: چگونه اعداد مثبت و منفی یک فرم را جدا گانه جمع بزنیم ؟



narpco
جمعه 05 دی 1399, 17:58 عصر
سلام دوستان
یک فرم داریم و یک ساب فرم
در پایین ساب فرم در نقطه B
جمع یک فیلد را با دستور زیر بدست اورده ایم
=Sum(Val([vam_sub_mablagh_ghest]))
در نقطه A
یک فیلد داریم که نتیجه نقطه Bرا نمایش میدهد با دستور زیر
=Val([frm_vam_app_sub]![txt_vam_sum])
هر دو فیلد UNBOUND هستند
مشکل اول :
وقتی که در ساب فرم ردیفی نباشد و خالی باشد در نقطه A این خطا رو میبینیم داخل تکست باکس
#TYPE!
مشکل دوم :
ستونی که در ساب فرم مورد جمع قرار میگیرد وضعیت اقساط پرداخت شده و پرداخت نشده را نشان میدهد
یعنی هم دارای عدد منفی است هم عدد مثبت
میخواهیم دو فیلد مجزا در ساب فرم داشته باشیم که در یکی فقط عدد منفی جمع شود
و در یکی فقط عدد مثبت جمع شود

مشکلی که در حال حاظر داریم اینه که با توجه به فرمول های بالا
در ابتدای داستان جمع درسته اما وقتی عدد قسط بدلیل پرداخت شدن منفی و قرمز میشوند
در نقطه B ...از یک جایی به بعد فقط دیگه اعداد مثبت رو جمع نمیزنه اعداد منفی رو جمع میزنه
توضیح این که NZ هم استفاده کرده VALهم استفاده کردم در ترکیب فرمول نویسی ولی هر دو مشکل همچنان برقرار است
با سپاس


فیلم توضیحی 1 دقیقه :
https://s17.picofile.com/d/8418860500/69cebdc8-e11f-4699-9d5b-9e232b4fcbc2/QQQQ.rar

عکس توضیحی :
https://s17.picofile.com/file/8418858468/AAAAA.png

padide55
جمعه 05 دی 1399, 21:05 عصر
سلام
شبیه این موضوع به طریق دیگری قبلا مطرح شده .
به این تاپیک نگاه کنید .
فکر کنم با کمی تغییر مشکل حل بشه .
اونجا جمع بر اساس عنوان داره در یک فیلد دیگر ولی شما شرط بگذارید اعداد مثبت و منفی در همان فیلد


اینجا (https://barnamenevis.org/showthread.php?561788-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%A7%D8%B3%D9%85-%DA%AF%D8%B1%D9%88%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%B4%D8%AF%D9%87-%D9%88-%D8%AA%D9%81%D8%B1%DB%8C%D9%82-%D8%AF%D9%88-%D8%AA%DA%A9%D8%B3%D8%AA-%D8%A8%D8%A7%DA%A9%D8%B3-%D8%AF%D8%B1-%DA%AF%D8%B2%D8%A7%D8%B1%D8%B4&p=2432894&viewfull=1#post2432894)

narpco
جمعه 05 دی 1399, 22:08 عصر
سلام
شبیه این موضوع به طریق دیگری قبلا مطرح شده .
به این تاپیک نگاه کنید .
فکر کنم با کمی تغییر مشکل حل بشه .
اونجا جمع بر اساس عنوان داره در یک فیلد دیگر ولی شما شرط بگذارید اعداد مثبت و منفی در همان فیلد


اینجا (https://barnamenevis.org/showthread.php?561788-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%A7%D8%B3%D9%85-%DA%AF%D8%B1%D9%88%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%B4%D8%AF%D9%87-%D9%88-%D8%AA%D9%81%D8%B1%DB%8C%D9%82-%D8%AF%D9%88-%D8%AA%DA%A9%D8%B3%D8%AA-%D8%A8%D8%A7%DA%A9%D8%B3-%D8%AF%D8%B1-%DA%AF%D8%B2%D8%A7%D8%B1%D8%B4&p=2432894&viewfull=1#post2432894)

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

ما یک ستون داریم که میخواهیم اعداد مثبت و منفی داخلش رو جدا گانه جمع بزنیم و در دو تکست باکس مجزا در فرم نشون بدیم ..نمیخواهیم که مانده رو نشون بده

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

چون همونقدر که اعداد مثبت مهمه در گزارشگری مالی اعداد منفی هم مهم هستند

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

هدف اینه که از طریق کد نویسی اعداد مثبت در یک تکست باکس و اعداد منفی در یک تکست باکس مجزا نمایش داده بشه
و این عملیات در ساب فرم انجام بشه کافیه ...در فرم اصلی REFER میدیم به ساب فرم .....اون قسمت مشکلی نیست
و جواب سئوال اول هم همچنان باقی است ....که برای خودم هم موضوع جالبیه ..خیلی گشتم روش های مختلفی رو تست کردم .....حتی فرمول : =IIF (ISNULL(AAA),BBB,CCCC

و سایر روشها مشابه حل نشد حالا امید بخدا بریم جلو ببینیم چی میشه .....بازم ممنون

New Account
جمعه 05 دی 1399, 22:30 عصر
سلام

از تابع DSum استفاده کنید .

padide55
جمعه 05 دی 1399, 22:46 عصر
سلام
فعلا کامپیوتر دم دستم نیست ولی این کد شاید بکار بیاد



=Sum(IIf([yourfieldname]<0,[yourfieldname],0))


و این کد



Posstive = CALCULATE(SUM(Table1[Difference]),Table1[Difference] > 0)

Negative = CALCULATE(SUM(Table1[Difference]),Table1[Difference] < 0)


ویا با روش
این پست (https://barnamenevis.org/showthread.php?563647-%DA%86%DA%AF%D9%88%D9%86%D9%87-%DB%8C%DA%A9-%D8%AF%DA%A9%D9%85%D9%87-%D8%B1%D9%88%DB%8C-%D8%B1%D8%AF%DB%8C%D9%81-%D9%87%D8%A7%DB%8C-CONTINUOUS-FORM-%D8%B1%D8%A7-%D8%A7%D8%AA%D9%88%D9%85%D8%A7%D8%AA%DB%8C%DA%A9-%D8%A7%D8%AC%D8%B1%D8%A7-%DA%A9%D9%86%DB%8C%D9%85-%D8%9F&p=2437796&viewfull=1#post2437796)
به این صورت




Dim i As Integer
dim sumnegative as integer
Me.frm_rollcall_B_Sub.SetFocus
Form_frm_rollcall_B_Sub.Form.BTN_CONTROL.SetFocus
Me.frm_rollcall_B_Sub.Form.Recordset.MoveFirst
For i = 1 To Me.frm_rollcall_B_Sub.Form.Recordset.RecordCount - 1
if myfield<0 then
sumnegative=sumnegative+myfield


DoCmd.GoToRecord , , acNext
Next

textnegativesum=sumnegative

padide55
جمعه 05 دی 1399, 23:03 عصر
nz(myfield,0)

اگر فیلد خالی بود صفر در نظر بگیره .
امتحان کنید

eb_1345
شنبه 06 دی 1399, 05:09 صبح
..................................................

padide55
شنبه 06 دی 1399, 08:05 صبح
سلام
جمع مشروط
جمع اعداد منفی و اعداد مثبت در یک ستون و یک فیلد . در ساب فرم به دو روش
این هم نمونه

ضمنا برای مشکل A به این صورت عمل کنید . در نمونه آورده ام حل شده
nz را دقیقا بجای نام فیلد بکار ببرید


(nz(myfield,0))





Sum(nz(Val([vam_sub_mablagh_ghest])),0)


ویا



Sum(Val(nz([vam_sub_mablagh_ghest]),0))

eb_1345
شنبه 06 دی 1399, 15:53 عصر
سلام
جمع مشروط
جمع اعداد منفی و اعداد مثبت در یک ستون و یک فیلد . در ساب فرم به دو روش
این هم نمونه

ضمنا برای مشکل A به این صورت عمل کنید . در نمونه آورده ام حل شده
nz را دقیقا بجای نام فیلد بکار ببرید


(nz(myfield,0))





Sum(nz(Val([vam_sub_mablagh_ghest])),0)


ویا



Sum(Val(nz([vam_sub_mablagh_ghest]),0))



سلام
جناب padide55 نیاز به اینهمه کد نویسی نیست ! در نمونه شما کافیست برای بدست آوردن جمع اعداد منفی و مثبت دو خط کد زیر رو در مقایل کنترل سورس دو تکست باکس مربوطه در فرم اصلی وارد کنید


=Abs(DSum("mablaQ";"TblKarkard";"[mablaQ]<0 and idpersn=" & [idper] & ""))

=DSum("mablaQ";"TblKarkard";"[mablaQ]>0 and idpersn=" & [idper] & "")




تابع قدر مطلق ABS هم جمع اعداد منفی رو بصورت مثبت نمایش میدهد

ان شاءالله جناب ناصریان هم با الگو گرفتن از دو خط کد فوق مشکلشون برطرف خواهد شد

New Account
شنبه 06 دی 1399, 20:15 عصر
سلام
Padide55




Dim i As Integer
dim sumnegative as integer
Me.frm_rollcall_B_Sub.SetFocus
Form_frm_rollcall_B_Sub.Form.BTN_CONTROL.SetFocus
Me.frm_rollcall_B_Sub.Form.Recordset.MoveFirst
For i = 1 To Me.frm_rollcall_B_Sub.Form.Recordset.RecordCount - 1
if myfield<0 then
sumnegative=sumnegative+myfield

DoCmd.GoToRecord , , acNext
Next

textnegativesum=sumnegative




تریگر این قطعه کدی که نوشتید چیه ؟ ( کل کد رو عرض میکنم )

موفق باشید .

padide55
شنبه 06 دی 1399, 21:04 عصر
سلام
میشه برای
insertinto
تریگر نوشت که این کد مرتب اجرا نشه .
فکر کنم منظورتون همینه .
Form_frm_rollcall_B_Sub.Form.BTN_CONTROL.SetFocus

که این کد در تریگر از ابتدا تعریف بشه

For i = 1 To Me.frm_rollcall_B_Sub.Form.Recordset.RecordCount - 1
if myfield<0 then
sumnegative=sumnegative+myfield

New Account
شنبه 06 دی 1399, 22:00 عصر
سلام

منظورم اینه که چون شما دارید اون رو در سطح فرم اجرا میکنید این کد با چه چیزی اجرا میشه ؟ ؛ فرضا با AfterUpdate , AfterInsert و .......

شما برای اجراش به یک Action یا Trigger نیاز دارید .

فکر میکنم سئوال رو بدون کد نویسی حل کنید مناسب تره , با همون روشی که آقای بهرامی استفاده کردن .

ممنون

eb_1345
شنبه 06 دی 1399, 22:35 عصر
سلام و درود بر استاد و دوست قدیمی جناب آقای پیروزمهر عزیز !
کم پیدائی بزرگوار ! دلمون برات تنگ شده بود

New Account
شنبه 06 دی 1399, 22:46 عصر
سلام جناب آقای بهرامی عزیز بنده هم همچنین

ارادت دارم خدمت تمامی دوستان قدیمی .

موفق باشید

padide55
شنبه 06 دی 1399, 22:48 عصر
سلام
به هر دو روش در نمونه انجام شده .
پایین ساب فرم ملاحظه بفرمایید.
از راهنمایی متشکرم .
در تاپیک چندی پیش برای کلیک باتن در ساب فرم این روش رو متوجه شدم و در این تاپیک امتحان کردم .هر چند روش طولانی و سطر به سطر بود .ولی نوع عملکرد کار برام مهم بود .
ممنون
دارم سعی میکنم از ابتدا کد نویسی بیسیک یاد بگیرم .
در این زمینه ضعیف هستم .
مخصوصا استفاده از ارایه ها و...

ضمنا طراح سوال یه توپ انداخته وسط زمین. رفته !!!
عکس العملی .چیزی ؟؟!!

New Account
شنبه 06 دی 1399, 23:48 عصر
سلام Padide55

این کد رو جایگزین کد خودتون کنید :


Public Sub Command20_Click()
On Error GoTo Command20_Click_Error
Dim rs As DAO.Recordset
Set rs = Me.QryKarkardsub.Form.RecordsetClone
rs.MoveFirst
While Not rs.EOF
If rs!mablaQ.Value < 0 Then
sumnegative = sumnegative + Nz(rs!mablaQ.Value, 0)
Else


sumpositive = sumpositive + Nz(rs!mablaQ.Value, 0)
End If
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
txtnegative = sumnegative
txtpositive = sumpositive
QryKarkardsub.Form.tsubneg = sumnegative
QryKarkardsub.Form.tsubpos = sumpositive



On Error GoTo 0
Exit Sub


Command20_Click_Error:
If Err.Number = 3021 Then Resume Next
MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Command20_Click, line " & Erl & "."


End Sub


اگر قرار هست از رکورد ست اسنفاده کنید نصفه نیمه استفاده نکنبد ( زیاد قالب کلیش رو تغییر ندادم و از قالب خودتون استفاده کردم اگر بنده بودم اینو تبدیلش میکردم به دو تا تابع )

کد بالا خیلی سریعتر از کد اولیه شماست خصوصا اگر تعداد رکوردهای ساب فرم زیاد باشه

مشکل هم برمیگرده به اون بخشی که شما دارید با دستور Docmd پیمایش بین رکوردها رو انجام میدید , در واقغ همین یک خط کد مخل بسیاری کارها میشه

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

تعیین کننده روش حل مساله پاسخ دهنده هستش ( منظورم این یک سئوال خاص نیست , کلی عنوان کردم )

ضمنا یک نکته ای

یک کم اگر دقت کنید میتونید کدهاتون رو بهینه کنید و سرعت اجرا رو ببرید بالا

به طور مثال در همون قطعه کد خودتون


For i = 1 To Me.frm_rollcall_B_Sub.Form.Recordset.RecordCount - 1


مگر تعداد رکوردها وقتی که دارید غملیات محاسبه رو شروع میکنید تغییر میکنه ؟! خیر

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

به جای اون


Dim tmpCounter As Integer
tmpCounter = Me.frm_rollcall_B_Sub.Form.Recordset.RecordCount - 1
For i = 1 To tmpCounter



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

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

ولی همونطوزی که قبلا هم خدمتتون عرض کردم , کد نویسی در این سئوال موضوعیتی نداره .

خیلی خوبه که تلاش میکنی Padide55 و شخصا از دیدنش خوشحالم .

موفق باشید

padide55
یک شنبه 07 دی 1399, 04:23 صبح
ممنون از راهنمایی شما .
راهنمایی شما کاملا صحیح هست .
شمارنده قبل از حلقه کاملا منطقی هست.
به نظرم دوستان در این تاپیک با مشاهده مطالب و پاسخها نهایتا ارائه دهنده بهترین راه و علت اون باشند اهمیت داره .
نکات ذکر شده حتما در نمونه های بعدی درانجمن استفاده میکنم .ممنون .

narpco
یک شنبه 07 دی 1399, 11:02 صبح
ضمنا طراح سوال یه توپ انداخته وسط زمین. رفته !!!
عکس العملی .چیزی ؟؟!![/QUOTE]
------------------------------------------------------------------------------------------------
سلام به همه دوستان روز بخیر ....
ممنون از همه عزیزانی که پاسخ دادن

دوست عزیز
padide55 (https://barnamenevis.org/member.php?263869-padide55)-----واقعا نمیدونم در مورد این صحبت شما چه پاسخی باید بدم که ناراحت نشید ....که بعد از پاسخ بنده بفرمایید من شوخی کردم بودم !!! من اگر نیستم تو سایت حتما دلیلی داره ....بعد هم حتما سئوال برام مهم بوده که پرسیدم و جوابش هم حتما مهمه که پرسیدم ....روند اجرای پروژه متوقف شده برا ی همین یک سئوال ...چون پاسخ و جوابش در فرم های دیگه استفاده میشه و تا حل نشه ....کاری نمیشه انجام داد .....

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


و اما کد ...ها من دارم دونه دونه تست می کنم ببینم به کجا میرسم حتما اطلاع میدم ....چشم ....

یک انتقاد دوستانه ....
یکی از ایرادات اساسی شما در بحث اکسس اینه که اصرار دارید باروش های خود اکسس مشکل رو حل کنید که خوب اینم یک روشی است منتها به موارد درج شده در سئوال دقت نمی کنید ....عزیز دل بنده عرض کردم که قصد استفاده از کوئری در فرم رو ندارم .....اکثرا دیدم که شما برای حل مسئله به ساخت کوئری متوصل میشید که همه جا کاربرد نداره و راه رو طولانی می کنه .......که خوب این مسئله جواب سئوال من نیست

ولی حتما کدهاتون رو تست می کنم خدا روچه دیدی شاید مشکل از همین راه طولانی حل شد .!!ولی تجربه من میگه امکانات داخلی خود اکسس خیلی جوابگوی پروژهای بزرگ نیست حتما باید کد نویسی بلد بود .....که البته خود بنده هم در حال یادگیری هستم مثل شما ....اما ترجیح اولم کد نویسی هست نه استفاده از داستانای خود اکسس به هر روی .....الان من موفق شدم پاسخ های دوستان رو ببینم ......دارم تست می کنم اطلاع میدم ...و ممنون که وقت گذاشتی رو حل سئوال ....

padide55
یک شنبه 07 دی 1399, 11:35 صبح
سلام به همه دوستان روز بخیر ....
ممنون از همه عزیزانی که پاسخ دادن


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



تسلیت عرض میکنم .خدا رحمت کنه
انشااله بقای عمر بازماندگان .

eb_1345
یک شنبه 07 دی 1399, 14:09 عصر
سلام!
بنده هم تسلیت عرض می کنم ،از خداي مهربان براي آنمرحوم آمرزش و رحمت و مغفرت الهي و براي جنابعالی و خانواده محترم صبر و شکيبايي مسئلت مي نمايم .
جهت شادی روح آن مرحوم الفاتحه مع الصلوات

narpco
یک شنبه 07 دی 1399, 14:26 عصر
سلام مجدد بنده رو شرمنده کردید ...انشالله بقای عمر شما و عزیزان باشه ......به هر حال خواستم بدونید که بنده به تلاش دوستان بی اهمیت نیستم .....واقعا گاهی اوقات کنترل از دست ادمیزاد خارجه .....بازم ممنون

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

narpco
دوشنبه 08 دی 1399, 08:49 صبح
سلام اگر دوستان تمایل داشتن در مورد نتیجه ها اظهار نظر فنی داسته باشن ....ما خوشحال میشیم .....روز خوبی داشته باشید ...

narpco
سه شنبه 09 دی 1399, 07:39 صبح
سلام و ممنون از همکاری دوستان .....