PDA

View Full Version : سوال: پیدا کردن مقدار ماکزیمم بین چند فیلد از یک رکورد



Rasool-GH
جمعه 04 آذر 1390, 12:58 عصر
سلام دوستان
من نیاز دارم که بین چند فیلد عدد که در یک رکورد ثبت شده مقدار ماکزیمم و مینیمم اونها رو به وسیله کوئری پیدا کنم .
از چه تابعی و به چه شکل میشه استفاده کرد ؟

Abbas Amiri
جمعه 04 آذر 1390, 16:09 عصر
فرض می کنیم رکوردی با فیلد ID =x و فیلهای مقایسه با نامهای SearchField2 تا SearchField5 را می خواهیم



Dim rs As Recordset, s As String
Dim minVal
s = "SELECT * FROM MyTable WHERE ID=" & x
Set rs = CurrentDb.OpenRecordset(s)
If rs.RecordCount Then
minVal = rs.Fields("SearchField2")
If rs.Fields("SearchField3") < minVal Then minVal = rs.Fields("SearchField3")
If rs.Fields("SearchField4") < minVal Then minVal = rs.Fields("SearchField4")
If rs.Fields("SearchField5") < minVal Then minVal = rs.Fields("SearchField5")
' For More fields like above
End If
set rs=nothing

والبته برای بزرگترین مقدار علامت بزرگتر را قرار می دهیم

Rasool-GH
جمعه 04 آذر 1390, 17:33 عصر
سلام
ممنون بابت راهنمایی ولی به نمونه من توجه کنید من همین کار رو در کوئری انجام دادم ولی میخوام بدونم که مثل اکسل که تابع MAX() داره و خروجی اون ماکزیمم مقدار موجود در فیلدهای معرفی شده به اونه در اکسس هم میشه همچین استفاده ای کرد
مثلا در اکسل میگیمo Max(a1:f1) o حالا تو کوئری اکسس نمیشه بگیم o Max([a][b][c][d]) o

ممنون میشم که راهنمایی کنید

ضمنا توی نمونه وقتی برای Unbalance شرط میزارم که مثلا مقادیر بیشتر از 30 رو لیست کنه مقدار Maxt و Mint رو پیدا نمیکنه یا نمیتونه محاسبه کنه . در این مورد یکی از دوستان گفت که باید محاسبه توی یک کوئری دیگه انجام بشه و نتیجه در کوئری نهایی فیلتر بشه .

Abbas Amiri
جمعه 04 آذر 1390, 19:20 عصر
درسته با یک کوئری دیگه اینکار انجام می شود


SELECT Gozareshe.*
FROM Gozareshe
WHERE (((Gozareshe.unbalance)>30));

Rasool-GH
جمعه 04 آذر 1390, 19:57 عصر
در مورد تابع max توضیح ندادین
تابعی که چند فیلد رو بگیره و خروجیش بزرگترین یا کوچکترین مقدار بین فیلدها باشه نداریم ؟؟؟

Abbas Amiri
جمعه 04 آذر 1390, 20:06 عصر
در فایل خودتان اصلاح شد

Rasool-GH
جمعه 04 آذر 1390, 23:54 عصر
اقا ممنون از جوابتون
من همچنان برام روشن نشد که اکسس توابع max , min , average با خصوصیاتی مشابه اکسل داره یا نه
اگر راهنمایی کنین که کجا دنبالش بگردم خودم پیگیرش میشم .
توی این روشی شما فرمودین به دلیل این که فیلدهای مورد نظر من زیاده برنامه نویسی خیلی طولانی و پیچیده میشه و بعدها برای اعمال تغییرات به مشکل بر میخورم
من 40 گروه فیلد 4 تایی دارم که در یک رکود ثبت هستند و با روش شما باید حدود 300 خط بنویسم.

Abbas Amiri
شنبه 05 آذر 1390, 22:31 عصر
توابع خاص اکسل با توابع VB فرق دارند.برای منظور شما با یک مقدار تمهیدات می توان با کمترین کدنویسی انجام داد.اولا جداول مورد نظر ، از نظر اسم دارای پیشوندهای یکسان باشند ثانیا 4 فیلد موردنظرتان در جداول درجاهای یکسانی قرار گرفته باشند (مثلا همه از فیلد 4 تا فیلد هفتم باشند)

Rasool-GH
یک شنبه 06 آذر 1390, 12:36 عصر
سلام
اقا ممنون از جوابت
من جدول رو برات ميزارم يه نگاهي به جدول بنداز راهنمايي كن كه با چه روشي بهتر ميشه مقادير زير رو حساب كرد

مقدار ميانگين و Min و Max بين هر گروه از فيلدها (r1,s1,t1)(r2,s2,t2)(...) در يك كوئري به شكلي كه در جواب معادل ركوردهاي موجود در جدول اصلي ركوردهايي شامل موارد فوق داشته باشم
و يك مورد ديگه اينكه من چطور ميتونم با يك كوئري مقادير خالي موجود داخل اين جدول رو با 0 يا هر كاراكتر ديگه اي پر كنم

Rasool-GH
یک شنبه 06 آذر 1390, 13:14 عصر
سلام
اقا ممنون از جوابت
من جدول رو برات ميزارم يه نگاهي به جدول بنداز راهنمايي كن كه با چه روشي بهتر ميشه مقادير زير رو حساب كرد

مقدار ميانگين و Min و Max بين هر گروه از فيلدها (r1,s1,t1)(r2,s2,t2)(...) در يك كوئري به شكلي كه در جواب معادل ركوردهاي موجود در جدول اصلي ركوردهايي شامل موارد فوق داشته باشم
و يك مورد ديگه اينكه من چطور ميتونم با يك كوئري مقادير خالي موجود داخل اين جدول رو با 0 يا هر كاراكتر ديگه اي پر كنم

Abbas Amiri
یک شنبه 06 آذر 1390, 21:49 عصر
فایل زیر را ببینید . درضمن برای اینکه فیلدهای خالی مقدار صفرداشته باشند ، در جدول مربوطه DefaultValue آن را صفر قرار دهید.وبرای مقادیر قبلی می توانید از دستور ( Nz(FieldName,0 استفاده کنید

Rasool-GH
سه شنبه 08 آذر 1390, 19:07 عصر
اقا بابت کمک شما ممنون
من از اون دوتا تابع Min , Max داخل کوئری استفاده کردم و کاملا به مقصودم رسیدم
در مورد Nz یه توضیح میدید که عملکردش به چه شکله یعنی نحوه استفاده و استانداد کد نویسیش چیه

ضمنا من میخوام که مقادیر خالی داخل جدول اصلی با 0 پر بشه نه در جدول نتایج . برای اون جه راه حلی وجود داره

Abbas Amiri
سه شنبه 08 آذر 1390, 19:53 عصر
کد زیر را در برنامه تان کپی کنید و استفاده کنید البته مجبور شدم بعلت تعداد بالای فیلدها در 2نوبت عملیات آپدیت راانجام بدهم.


Sub MakeZeroNullValues(TableName As String)
Dim rs As Recordset, sSQL As String
Dim fld As Field, k As Integer
Set rs = CurrentDb.OpenRecordset(TableName)
For k = 1 To 100
Set fld = rs.Fields(k)
If fld.Type = dbLong Or fld.Type = dbByte Or _
fld.Type = dbCurrency Or fld.Type = dbInteger Then
sSQL = sSQL & fld.Name & " = Nz(" & fld.Name & ", 0), "
End If
Next
sSQL = "UPDATE " & TableName & " SET " & Left(sSQL, Len(sSQL) - 2)
CurrentDb.Execute sSQL
sSQL = ""
For k = 101 To rs.Fields.Count - 1
Set fld = rs.Fields(k)
If fld.Type = dbLong Or fld.Type = dbByte Or _
fld.Type = dbCurrency Or fld.Type = dbInteger Then
sSQL = sSQL & fld.Name & " = Nz(" & fld.Name & ", 0), "
End If
Next
sSQL = "UPDATE " & TableName & " SET " & Left(sSQL, Len(sSQL) - 2)
CurrentDb.Execute sSQL
Set rs = Nothing
End Sub


البته کنجکاو شدم که این همه فیلد چطور مقداردهی میشوند!

Rasool-GH
سه شنبه 08 آذر 1390, 20:49 عصر
این برنامه مربوط به کار بنده است که در شرکت برق کار میکنم و برای ثبت مقادیر جریان و ولتاژ اندازه گیری شده در هر دوره بازدید و اندازه گیری پارامتر های مربوط به یک پست توزیع عمومی استفاده میشه که باید از اونها در پایش فرایند برنامه ریزی سالانه شرکت استفاده بشه و متاسفانه هنوز هم دارن این امور را به صورت دستی و کاغذی انجام میدن و من دارم برای خودم اینها رو داخل دیتا بیس وارد میکنم که راحت تر باشم

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

Rasool-GH
سه شنبه 08 آذر 1390, 21:36 عصر
در حال حاظر به دلیل این که حدود 80% امور جاری با برنامه های مبتنی بر دیتابیس بسیار روان و راحت انجام میشه من خیلی علاقه مند شدم که این کار رو تکمیل کنم . تا الان هم خیلی کار کردم و از هر جایی که تونستم به هر طریقی شده کار رو پیش بردم

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

Abbas Amiri
سه شنبه 08 آذر 1390, 21:59 عصر
من با اینکه با ویژوال بیسیک آشنا بودم با اینحال حدود ده سال پیش کتاب راهنمای برنامه نویسی برای اکسس 97 پیترنورتن را تهیه کردم وخیلی استفاده کردم ، در سالهای بعدهم ورژن جدیدتر آن هم به بازار آمد ، می توانید تهیه کنید واستفاده کنید.

Rasool-GH
سه شنبه 08 آذر 1390, 23:40 عصر
لطفا در مورد تابع Nz یه توضیح کوتاه بدین

ممنون

Abbas Amiri
چهارشنبه 09 آذر 1390, 19:09 عصر
از آنجاییکه درهنگام محاسبات با مقادیرنول به مشکل بر میخوریم ،اکسس تابع توکار Nz بکار میرود :( Nz(Value, ValueIfNull =(متغیر یا فیلد)
در Help اکسس می توانید اطلاعات کافی بدست آورید

Rasool-GH
چهارشنبه 09 آذر 1390, 21:57 عصر
ممنون قبلا مطالعه کردم . گفتم شاید چیز بیشتری وجود داشته باشه .

Rasool-GH
یک شنبه 13 آذر 1390, 19:41 عصر
سلام
یک درخواستی دارم که اگر لطف کنید بسیار ممنون میشم
در برنامه هایی که نوشتید موارد زیادی هست که متوجه عملکرد برنامه نمیشم
براتون امکان داره که در مورد عملکرد خط به خط برنامه توضیح بدید . البته درک میکنم که خواسته زیادیه . ولی برای سایرین هم اموزش خوبی میشه


Sub MakeZeroNullValues(TableName As String)
Dim rs As Recordset, sSQL As String
Dim fld As Field, k As Integer
Set rs = CurrentDb.OpenRecordset(TableName)
For k = 1 To 100
Set fld = rs.Fields(k)
If fld.Type = dbLong Or fld.Type = dbByte Or _
fld.Type = dbCurrency Or fld.Type = dbInteger Then
sSQL = sSQL & fld.Name & " = Nz(" & fld.Name & ", 0), "
End If
Next
sSQL = "UPDATE " & TableName & " SET " & Left(sSQL, Len(sSQL) - 2)
CurrentDb.Execute sSQL
sSQL = ""
For k = 101 To rs.Fields.Count - 1
Set fld = rs.Fields(k)
If fld.Type = dbLong Or fld.Type = dbByte Or _
fld.Type = dbCurrency Or fld.Type = dbInteger Then
sSQL = sSQL & fld.Name & " = Nz(" & fld.Name & ", 0), "
End If
Next
sSQL = "UPDATE " & TableName & " SET " & Left(sSQL, Len(sSQL) - 2)
CurrentDb.Execute sSQL
Set rs = Nothing
End Sub


و



Function DelTable(TableName As String) As Boolean
If DCount("*", "MSysObjects", "Name = '" & TableName & "' AND (Type = 6 OR Type = 1) ") Then
DoCmd.DeleteObject acTable, TableName
End If
End Function

Sub CreateTempTable(rs As Recordset)
Dim sSuffix As String, minVal As Integer, maxVal As Integer
Dim fld As Field
DelTable "tmpTable"
strSQL = "CREATE TABLE tmpTable (ID INTEGER)"
CurrentDb.Execute strSQL
With rs
If .RecordCount Then
For Each fld In .Fields
If Left(fld.Name, 1) = "R" Then
sSuffix = Right(fld.Name, Len(fld.Name) - 1)
strSQL = "ALTER TABLE tmpTable ADD COLUMN MinVal_" & sSuffix & " INTEGER, MaxVal_" & sSuffix & " INTEGER"
CurrentDb.Execute strSQL
End If
Next
End If
End With
RefreshDatabaseWindow
End Sub

Sub MinMaxValues()
Dim strSQL As String, strValues As String

Dim sSuffix As String, minVal As Integer, maxVal As Integer
Dim rs As Recordset, fld As Field
Set rs = CurrentDb.OpenRecordset("Bargiri")
CreateTempTable rs
With rs
If .RecordCount Then
Do While Not .EOF
strValues = .Fields("ID") & ", "
For Each fld In .Fields
If Left(fld.Name, 1) = "R" Then
sSuffix = Right(fld.Name, Len(fld.Name) - 1)
minVal = GetMin(Nz(fld, 0), Nz(.Fields("S" & sSuffix), 0), Nz(.Fields("T" & sSuffix), 0))
maxVal = GetMax(Nz(fld, 0), Nz(.Fields("S" & sSuffix), 0), Nz(.Fields("T" & sSuffix), 0))
strValues = strValues & minVal & ", " & maxVal & ", "
End If
Next
strValues = Left(strValues, Len(strValues) - 2)
strSQL = "INSERT INTO tmpTable VALUES(" & strValues & ")"
CurrentDb.Execute strSQL
.MoveNext
Loop
End If
End With
End Sub

Abbas Amiri
یک شنبه 13 آذر 1390, 20:29 عصر
MakeZeroNullValues:درمورد سابروتین اول یک رکوردست از جدول آرگومان آن ایجاد می کنیم .ازآنجاییکه حداکثر رکوردهایی که دریک کوئری می توان تعریف کرد 255 تااست ودر کوئری آپدیت این مقدار نصف می شود و به 127 محدود میشود ، همچنین جدول شما بیش از 127 فیلد دارد به همین جهت در دونوبت فیلها چک شدند یکبار تا فیلد صدم وباردیگر تاانتها. درخطوط 7و8 نوع داده فیلد چک شده تا حتما مقادیر عددی صفر شوند.
درخط 9 یک رشته (sSQL) ، عبارات آپدیت را که شامل نام فیلد و مقدار صفر دادن به آن درصورت نول بودن را تشکیل می دهد.خط 13 هم مشخص است که عبارت سیکیوال را اجرا می کند وبقیه هم که تکرار می شود

Function DelTable : برای حذف یک جدول بکار میرود .مشخصات اشیاء موجود در اکسس در جدول MSysObjects نگهداری مشود ابتدا در این جدول وجود جدول مربوطه را چک می کنیم وسپس آنرا حذف می کنیم.

CreateTempTable: برای ایجاد جدول برااساس فیلدهای یک جدول دیگر و افزودن پسوند به نامهای مورد نیاز. دراینجا هم پس ازدستور سیکیوال ایجاد جدول خام وفیلد ID ، تک تک فیلدها چک میشوند وچنانچه در ابتدای نام فیلدی "R" باشد سه فیلد با پیشوند MinVal وپسوند R,s,T وسه فیلد هم ........... ودر خط 19 این فیلدها اضافه می شوند تا همه فیلدها چک شوند .
برای آخری هم کمی تحقیق کنید بهتر درک خواهیدکرد

korosh00
سه شنبه 29 اسفند 1391, 00:55 صبح
ماکزیمم بین چندین رکورد مثلا فیلد نمره در رکودها؟

korosh00
سه شنبه 29 اسفند 1391, 11:23 صبح
سلام این این برنامه کوچک در اکسس است من می خوام وقتی در فرم 1 نمایش نتیجه زده میشه صفحه گزارش باز میشه در کنار رتبه محاسبه کنه که این شخص در چه رتبه ای قرار داره مثلا امتیازش 8 شده رتبه اش شده نفر دوم . همین
لطفا روی فایل خودم راهنمایی کنید
تشکر

korosh00
سه شنبه 29 اسفند 1391, 11:25 صبح
سلام این این برنامه کوچک در اکسس است من می خوام وقتی در فرم 1 نمایش نتیجه زده میشه صفحه گزارش باز میشه در کنار رتبه محاسبه کنه که این شخص در چه رتبه ای قرار داره مثلا امتیازش 8 شده رتبه اش شده نفر دوم . همین
لطفا روی فایل خودم راهنمایی کنید
تشکر