PDA

View Full Version : حرفه ای: شمارش فیلدهای خالی موجود در یک رکورد



Nazir Ahmad
سه شنبه 10 آذر 1394, 10:17 صبح
سلام
چطوری میشه در یک کویری
1- تعداد فیلدهای خالی یک رکورد که مشخصه (بیشتر از یک فیلد مشخص در یک رکورد) رو پیدا کرد و تعداد اونارو در یک فیلد دیگه شمارش کرد؟
2- تعداد فیلدهای مشخصی (که مقادیر اون عدد هست) رو بدیم و تعداد فیلدهایی که مثلا کمتر از 10 باشه رو شمارش کنه؟


ممنون
یا حق

saeed1234n
سه شنبه 10 آذر 1394, 13:57 عصر
سلام


شمارش فیلدهای خالی موجود در یک رکورد

سلام
چطوری میشه در یک کویری
1- تعداد فیلدهای خالی یک رکورد که مشخصه (بیشتر از یک فیلد مشخص در یک رکورد) رو پیدا کرد و تعداد اونارو در یک فیلد دیگه شمارش کرد؟




پاسخ سوال اول :

يك راه ساده استفاده از تابع iif است :

مثلا براي محاسبه وجود n فيلد خالي مي توان از دستور زير در كوئري استفاده كرد :


select field 1, field2 , ... , fieldn ,iif(isnull(field1);1;0)+iif(isnull(field2);1;0)+ ... + iif(isnull(fieldn);1;0) as nuull
from tbl1


در مورد سوال دوم منظورتون رو نفهميدم .

Nazir Ahmad
چهارشنبه 11 آذر 1394, 10:01 صبح
سلام



پاسخ سوال اول :

يك راه ساده استفاده از تابع iif است :

مثلا براي محاسبه وجود n فيلد خالي مي توان از دستور زير در كوئري استفاده كرد :


select field 1, field2 , ... , fieldn ,iif(isnull(field1);1;0)+iif(isnull(field2);1;0)+ ... + iif(isnull(fieldn);1;0) as nuull
from tbl1


در مورد سوال دوم منظورتون رو نفهميدم .


سلام و ممنون
من هم فعلا دقیقا از همین روش استفاده میکنم. اما چون تعداد فیلدهای مورد نظر زیاده میخواستم ببینم آیا راه بهتری برای این کار وجود نداره؟

ممنون
یا حق

alirezabahrami
چهارشنبه 11 آذر 1394, 18:15 عصر
سلام و ممنون
من هم فعلا دقیقا از همین روش استفاده میکنم. اما چون تعداد فیلدهای مورد نظر زیاده میخواستم ببینم آیا راه بهتری برای این کار وجود نداره؟

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

saeed1234n
چهارشنبه 11 آذر 1394, 18:32 عصر
سلام

بسیار عالی !!

جناب استاد بهرامی مثل همیشه عالی



Public Function GetNullFld(intid As Integer)
Dim CountNullFld As Integer
Dim MyDB As DAO.Database, MyRS As DAO.Recordset
Set MyDB = CurrentDb()
Dim fld As Field
Set MyRS = MyDB.OpenRecordset("Select * From tbl1 Where [ID]=" & intid, dbOpenSnapshot)
For Each fld In MyRS.Fields
If IsNull(fld) Then
CountNullFld = CountNullFld + 1
End If
Next
GetNullFld = CountNullFld
MyRS.Close
End Function

Nazir Ahmad
پنج شنبه 12 آذر 1394, 07:54 صبح
سلام
اینجور موقع هاست که باید از طریق ایجاد یک تابع بهره جست .
کوئری نمونه ضمیمه را مشاهده بفرما !
از طریق تابع تعداد تمام فیلدهای خالی در جدول استخراج میشود.
یا علی


سلام

بسیار عالی !!

جناب استاد بهرامی مثل همیشه عالی



Public Function GetNullFld(intid As Integer)
Dim CountNullFld As Integer
Dim MyDB As DAO.Database, MyRS As DAO.Recordset
Set MyDB = CurrentDb()
Dim fld As Field
Set MyRS = MyDB.OpenRecordset("Select * From tbl1 Where [ID]=" & intid, dbOpenSnapshot)
For Each fld In MyRS.Fields
If IsNull(fld) Then
CountNullFld = CountNullFld + 1
End If
Next
GetNullFld = CountNullFld
MyRS.Close
End Function



سلام و ممنون بابت توجه شما
کاملا دقیق. اما مشکل اینجاست که من زیاد از کد نویسی سر در نمیارم. و تو فایل ضمیمه فکر کنم دو تا مشکل داره.
جدولی که من دارم تعداد فیلدهای زیادی داره که هر کدوم نامهای مختلفی داره و نوعیت تمام فیلدهای عدده
1- میخوام تعداد فیلدهای مشخصی نه تمام فیلدهای جدول رو که مقادیر اون خالی نباشه برام در بیاره. (یعنی برعکس این تابع)
2- از بین اونا تعداد فیلدهایی که مقدار اونا کمتر یا بزرگتر (خودم تعیین میکنم) از یه مقدار خاص (مثلا 10) باشه رو بشمره

باز هم ممنون
یا حق

alirezabahrami
پنج شنبه 12 آذر 1394, 12:43 عصر
سلام و ممنون بابت توجه شما
کاملا دقیق. اما مشکل اینجاست که من زیاد از کد نویسی سر در نمیارم. و تو فایل ضمیمه فکر کنم دو تا مشکل داره.
جدولی که من دارم تعداد فیلدهای زیادی داره که هر کدوم نامهای مختلفی داره و نوعیت تمام فیلدهای عدده
1- میخوام تعداد فیلدهای مشخصی نه تمام فیلدهای جدول رو که مقادیر اون خالی نباشه برام در بیاره. (یعنی برعکس این تابع)
2- از بین اونا تعداد فیلدهایی که مقدار اونا کمتر یا بزرگتر (خودم تعیین میکنم) از یه مقدار خاص (مثلا 10) باشه رو بشمره

باز هم ممنون
یا حق




سلام
در کدهای تابع فوق بجای کد زیر :


If Not IsNull(fld) Then

ازکد :


If Not IsNull(fld) And fld.Name <> "id" And fld.Value < 10 Then

استفاده کن !
با جایگزینی قطعه کد فوق ، فیلدهائی که مقدار آنها کمتر از 10 است ( البته بشرطیکه نام فیلد مخالف فیلد ID که بعنوان اتونامبر از آن استفاده میشود ) بدست می آید .
از آنجائیکه خودت اشاره کرده اید با کد نویسی خیلی آشنائی ندارید بنابراین بجای ایراد گرفتن از کد و بمنظور بهره برداری درست (آنطورکه شما میخواهید) نمونه فایل خودت را ضمیمه کن !
ضمناً مشخص کن که مقدار های کمتر یا بیشتر از یک عدد خاص را در کجا می خواهید تعیین کنید ( مثلاً از طریق فرم ؟)
یا علی

Abbas Amiri
پنج شنبه 12 آذر 1394, 14:17 عصر
- میخوام تعداد فیلدهای مشخصی نه تمام فیلدهای جدول رو که مقادیر اون خالی نباشه برام در بیاره. (یعنی برعکس این تابع)
2- از بین اونا تعداد فیلدهایی که مقدار اونا کمتر یا بزرگتر (خودم تعیین میکنم) از یه مقدار خاص (مثلا 10) باشه رو بشمره

سلام
در صورتی که می خواهید دریک فرم و یا گزارش که به آن کوئری مقید شده ، استفاده کنید و فیلدهای مورد نظر شما در آن فرم یا گزارش وجود دارند ، راه حل نسبتا ساده است . اما اگر اطلاعات کوئری را در شرایط دیگری احتیاج دارید ، کمی پیچیدگی خواهد داشت.
برای حالت ساده تر از تابع جناب بهرامی می توان با کمی تغییر بهره گرفت:
اگر فیلدهای موردنظر در فرم شما وجود داشته باشد ، فرمتان را در حالت Design باز کنید و خصوصیت Tag آن فیلدها را مقداردهی کنید(در اینجا مقدار NA) .
فرض کنیم دو TextBox داریم به نامهای txtMin و txtMax ، با فراخوانی تابع به صورت زیر میتوانید تعداد فیلدهای موردنظر در رکورد جاری را بدست آورید.در صورتی که فقط مقادیر غیر نول را میخواهید کافیست پارامتر اولی را پاس کنید (احتیاج به درج txtMin و txtMax ندارید)

notNullFields = GetNotNullFld(Me, txtMin, txtMax)

تابع اصلاح شده:

Public Function GetNotNullFld(frm As Form, Optional MinVal As Long = 1, Optional MaxVal As Long = 0)
Dim CountNullFld As Integer
Dim MyRS As DAO.Recordset
If MaxVal = 0 Then MaxVal = 2 ^ 31 - 1
Dim fld As Field
Set MyRS = frm.Recordset

On Error GoTo nextField
For Each fld In MyRS.Fields
If fld.Type > 1 And fld.Type < 8 And Not IsNull(fld) Then
If frm(fld.Name).Tag = "NA" And Nz(fld, 0) >= MinVal And Nz(fld, 0) <= MaxVal Then
CountNullFld = CountNullFld + 1
End If
End If
nextField:
Next

GetNotNullFld = CountNullFld
Set MyRS = Nothing
End Function


همان طور که آقای بهرامی ذکر کردند در این مواقع ، ارائه فایل خودتان خیلی سریعتر میتواند منجر به ایجاد راه حل موردنظر شما خواهد بود

alirezabahrami
پنج شنبه 12 آذر 1394, 18:02 عصر
با سلام و تشکر ازآقای امیری عزیز بخاطر تکمیل تابع
قبل از ایجاد پست جناب امیری ، بنده یک نمونه ساده را با استفاده از همان تابع اولیه و اما این دفعه استفاده از یک فرم که در آن دو تکست باکس جهت ورود مقادیر مورد نظر وجود دارد را آماده کرده بودم که با دیدن پست جناب امیری از فرستادن آن منصرف شدم ولی با خودم فکر کردم که شاید با استفاده از همین نمونه نیازت برآورده شود .
یا علی