PDA

View Full Version : سوال: نوع داده هاي ذخيره شده در فيلد



ali_bagheri34
سه شنبه 24 مرداد 1391, 09:54 صبح
سلام
من مشكلي در خصوص نوع داده ها( Data Type )و موضوع
"""Forms![Personel]![ID]""" پيدا كردم

و براي اينكه بتونم منظورم را كامل برسونم يك مثال آماده كردم تا به نتيجه راحتتر برسم


لطفا يك نگاهي به فايل اكسس پيوست كنيد
دقيقا سوالم را انجا مشخص كردم

با تشكر

Abbas Amiri
سه شنبه 24 مرداد 1391, 19:58 عصر
ا- استفاده ازمتغیر بجای نام فرم


Dim frmName As String
frmName = "Personnel"
var = Forms(frmName).CtlName.Value



این هم تابع برای بدست آوردن نوع داده فیلد:



Function GetFieldType(TableName As String, fldName As String) As String
On Error GoTo ErrFieldType
Dim k As Integer
k = CurrentDb.TableDefs(TableName).Fields(fldName).Typ e
Select Case k
Case dbByte
GetFieldType = "Byte"
Case dbInteger
GetFieldType = "Integer"
Case dbLong
GetFieldType = "Long"
Case dbSingle
GetFieldType = "Single"
Case dbDouble
GetFieldType = "Double"
Case dbText
GetFieldType = "Text"
Case dbMemo
GetFieldType = "Memo"
Case dbBoolean
GetFieldType = "Boolean"
Case dbCurrency
GetFieldType = "Currency"
Case dbNumeric
GetFieldType = "Numeric"
Case dbDate
GetFieldType = "Date"
Case dbTime
GetFieldType = "Time"
Case dbDecimal
GetFieldType = "Decimal"
Case Else
GetFieldType = "N/A"
End Select
Exit Function
ErrFieldType:
MsgBox "خطا"
End Function

ali_bagheri34
چهارشنبه 25 مرداد 1391, 07:49 صبح
ا- استفاده ازمتغیر بجای نام فرم


Dim frmName As String
frmName = "Personnel"
var = Forms(frmName).CtlName.Value



این هم تابع برای بدست آوردن نوع داده فیلد:



Function GetFieldType(TableName As String, fldName As String) As String
On Error GoTo ErrFieldType
Dim k As Integer
k = CurrentDb.TableDefs(TableName).Fields(fldName).Typ e
Select Case k
Case dbByte
GetFieldType = "Byte"
Case dbInteger
GetFieldType = "Integer"
Case dbLong
GetFieldType = "Long"
Case dbSingle
GetFieldType = "Single"
Case dbDouble
GetFieldType = "Double"
Case dbText
GetFieldType = "Text"
Case dbMemo
GetFieldType = "Memo"
Case dbBoolean
GetFieldType = "Boolean"
Case dbCurrency
GetFieldType = "Currency"
Case dbNumeric
GetFieldType = "Numeric"
Case dbDate
GetFieldType = "Date"
Case dbTime
GetFieldType = "Time"
Case dbDecimal
GetFieldType = "Decimal"
Case Else
GetFieldType = "N/A"
End Select
Exit Function
ErrFieldType:
MsgBox "خطا"
End Function



=====================
sسلام
از پاسخ شما بسيار متشكرم
ولي ميشه خواهش كنم تو فايلي كه براتون فرستادم اين تغييرات را بديد تا بهتر متوجه بشم
با تشكر

emami.sie
چهارشنبه 25 مرداد 1391, 09:21 صبح
با سلام
چون بحث رو پیگیری می کردم، نمونه رو هم اصلاح کردم و برای صرفه جویی در وقت جناب امیری براتون ضمیمه می کنم...
موفق باشید
یا علی

ali_bagheri34
چهارشنبه 25 مرداد 1391, 09:33 صبح
سلام مجدد آقاي
abbas amiri
مورد اولم بطور كامل حل شد واقعا متشكرم
در خصوص مورد دوم كه نوع ديتا در يك فيلد است
چطوري مي تونم نام خدول را پيدا كنم تا بتونم توي فانكش شما بزارم
منظورم اينه كه نام جدول كاملا نا مشخص است و قابل تغيير است

محبت ميكني كه راهنماييم كني

Abbas Amiri
چهارشنبه 25 مرداد 1391, 19:15 عصر
باتشکر ازآقای امامی


چطوري مي تونم نام خدول را پيدا كنم تا بتونم توي فانكش شما بزارم

اگرمنظورشما جدولی است که فرم شما به آن مقید شده ،بجای نام جدول می توانید از عبارت Me.RecordSource استفاده کنید

ali_bagheri34
پنج شنبه 26 مرداد 1391, 08:07 صبح
باتشکر ازآقای امامی

اگرمنظورشما جدولی است که فرم شما به آن مقید شده ،بجای نام جدول می توانید از عبارت Me.RecordSource استفاده کنید


درسته منظورم نام جدولي است كه به فرم متصل شده است ولي مشكل اينجاست كه اگر در recordSource از Select‌ استفاده كرده باشد نام جدول را بر نمي گرداند
براي مثال رفتم سلكت زير را زدم
SELECT tblPersonel.ID, tblPersonel.name, tblPersonel.sh_sh FROM tblPersonel;
و بعد نتيجه مشخص هستش نام جدول را بر نمي گرداند

ali_bagheri34
پنج شنبه 26 مرداد 1391, 08:27 صبح
جناب آقاي اميري و امامي
در ضمن اگر در RecordSource ما از يك View استفاده شود كه داراي دو جدول جوين به هم باشد
آيا اين روش جوابگو مي باشد ؟؟؟

آيا با دستور Screen.ActiveControl مي شود كاري كرد يا نه ؟؟؟

Abbas Amiri
پنج شنبه 26 مرداد 1391, 19:17 عصر
با تغییراتی در فانکشن فوق درصورت ارسال عبارت سیکیوال بجای آرگومان TableName ، تابع تشخیص داده و پس ازایجاد یک کوئری وانجام بقیه عملیات ، درپایان کوئری حذف خواهدشد.


Function GetFieldType(TableName As String, fldName As String) As String
On Error GoTo ErrFieldType
Dim IsSQLExpression As Boolean
k = DCount("*", "MSysObjects", "Name='" & TableName & "' AND Type=1") '
If k = 0 Then
IsSQLExpression = True
CurrentDb.CreateQueryDef "tmpQuery", TableName
TableName = "tmpQuery"
k = CurrentDb.QueryDefs(TableName).Fields(fldName).Typ e
Else
k = CurrentDb.TableDefs(TableName).Fields(fldName).Typ e
End If
Select Case k
Case dbByte
GetFieldType = "Byte"
Case dbInteger
GetFieldType = "Integer"
Case dbLong
GetFieldType = "Long"
Case dbSingle
GetFieldType = "Single"
Case dbDouble
GetFieldType = "Double"
Case dbText
GetFieldType = "Text"
Case dbMemo
GetFieldType = "Memo"
Case dbBoolean
GetFieldType = "Boolean"
Case dbCurrency
GetFieldType = "Currency"
Case dbNumeric
GetFieldType = "Numeric"
Case dbDate
GetFieldType = "Date"
Case dbTime
GetFieldType = "Time"
Case dbDecimal
GetFieldType = "Decimal"
Case Else
GetFieldType = "N/A"
End Select
If IsSQLExpression Then DoCmd.DeleteObject acQuery, "tmpQuery"
Exit Function
ErrFieldType:
If DCount("*", "MSysObjects", "Name='tmpQuery' AND Type=5") Then
DoCmd.DeleteObject acQuery, "tmpQuery"
End If
MsgBox "ÎØÇ"
End Function



مثال:

var = GetFieldType ("SELECT * FROM Personel","name")

ali_bagheri34
شنبه 28 مرداد 1391, 07:55 صبح
سلام از شما بسيار متشكرم
كه براي اين موضوع وقت مي زارين
داخل برنامه قبلي كمي تغييرات بوجو دآوردم مثلا جدول حقوق را اضافه كردم كه به عبارتي دو جدول با هم جوين شوند
و بعد به فرمايش شما رفتم اين كدها را داخلش گذاشتم و دقيقا مثل مثال شما رفتم جلو
ولي بعد وقتي اجرا كردم خطاي "ÎØÇ" nh داد
لطفا به برنامه يك نگاهي 9143391434بكنيد

Abbas Amiri
شنبه 28 مرداد 1391, 20:08 عصر
علت خطا واضحه ، جدولی بنام Personel نداریم tblPersonelهست ، ضمن اینکه از Me.RecordSource هم هرجا لازم باشد میتوانید استفاده کنید

ali_bagheri34
یک شنبه 29 مرداد 1391, 07:11 صبح
علت خطا واضحه ، جدولی بنام Personel نداریم tblPersonelهست ، ضمن اینکه از Me.RecordSource هم هرجا لازم باشد میتوانید استفاده کنید

==============
واقعا از شما متشكرم
خيلي قشنگ كار كرد
آيا اين روش در اكسس پروجكت نيز درست كار مي كند (چون برنامه من به اس كيو ال 2005 متصل است )؟؟؟؟؟

ali_bagheri34
یک شنبه 29 مرداد 1391, 07:47 صبح
با سلام مجدد
من توي اكسس پروجكت تست كردم ولي انگار كار نمي كنه ميشه بهم كمك كنيد اين موضوع را هم اكسس پروجكت نتيجه بگيرم

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

Abbas Amiri
یک شنبه 29 مرداد 1391, 08:44 صبح
استفاده ازرکوردست راحتتر است واحتمالا برای منظورشماهم جواب خواهدداد


Function GetFieldType(TableName As String, fldName As String) As String
On Error GoTo ErrFieldType
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(TableName)
k = rs.Fields(fldName).type
Set rs = Nothing
Select Case k
Case dbByte
GetFieldType = "Byte"
Case dbInteger
GetFieldType = "Integer"
Case dbLong
GetFieldType = "Long"
Case dbSingle
GetFieldType = "Single"
Case dbDouble
GetFieldType = "Double"
Case dbText
GetFieldType = "Text"
Case dbMemo
GetFieldType = "Memo"
Case dbBoolean
GetFieldType = "Boolean"
Case dbCurrency
GetFieldType = "Currency"
Case dbNumeric
GetFieldType = "Numeric"
Case dbDate
GetFieldType = "Date"
Case dbTime
GetFieldType = "Time"
Case dbDecimal
GetFieldType = "Decimal"
Case Else
GetFieldType = "N/A"
End Select
Exit Function
ErrFieldType:
MsgBox "خطا,"
End Function

ali_bagheri34
دوشنبه 30 مرداد 1391, 07:41 صبح
استفاده ازرکوردست راحتتر است واحتمالا برای منظورشماهم جواب خواهدداد


Function GetFieldType(TableName As String, fldName As String) As String
On Error GoTo ErrFieldType
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(TableName)
k = rs.Fields(fldName).type
Set rs = Nothing
Select Case k
Case dbByte
GetFieldType = "Byte"
Case dbInteger
GetFieldType = "Integer"
Case dbLong
GetFieldType = "Long"
Case dbSingle
GetFieldType = "Single"
Case dbDouble
GetFieldType = "Double"
Case dbText
GetFieldType = "Text"
Case dbMemo
GetFieldType = "Memo"
Case dbBoolean
GetFieldType = "Boolean"
Case dbCurrency
GetFieldType = "Currency"
Case dbNumeric
GetFieldType = "Numeric"
Case dbDate
GetFieldType = "Date"
Case dbTime
GetFieldType = "Time"
Case dbDecimal
GetFieldType = "Decimal"
Case Else
GetFieldType = "N/A"
End Select
Exit Function
ErrFieldType:
MsgBox "خطا,"
End Function



--------
سلام بر شما بزرگوار از شما متشكرم بخاطر اينكه به اين موضوع توجه كرده ايد
من اين فانكشن را در اكسس پروجكت بردم و اجرا كردم خطا داد
و پيغام خطا اين بود
Object variable or With block variable not set
ميشه از شما خواهش كنم يك كمي به اينجانب بكنيد و يك تست واقعي بزنيد و مرا از اين دردسر نجات دهيد
در ضمن اگر ميتونيد از Ado استفاده كنيد بجاي Dao
و يك خواهش ديگر اينكه اگر بتونيد يك نمونه برام بزاريد تا بهتر متوجه بشم و هي شما را اذيت نكنم
با تشكر فراوان

Abbas Amiri
دوشنبه 30 مرداد 1391, 14:50 عصر
برای استفاده از رکوردست ADO کد زیر راجایگزین قبلی تا قسمت Select Case کنید . متاسفانه SQLServer من دچار مشکل شده


On Error GoTo ErrFieldType
Dim rst As ADODB.Recordset, cn As ADODB.Connection
Set conn = CurrentProject.AccessConnection
Set rst = New ADODB.Recordset
With rst
Set .ActiveConnection = conn
.Source = TableName
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Open
End With
k = rst.Fields(fldName).type
Set rst = Nothing
Set conn = Nothing

ali_bagheri34
سه شنبه 31 مرداد 1391, 09:19 صبح
برای استفاده از رکوردست ADO کد زیر راجایگزین قبلی تا قسمت Select Case کنید . متاسفانه SQLServer من دچار مشکل شده


On Error GoTo ErrFieldType
Dim rst As ADODB.Recordset, cn As ADODB.Connection
Set conn = CurrentProject.AccessConnection
Set rst = New ADODB.Recordset
With rst
Set .ActiveConnection = conn
.Source = TableName
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Open
End With
k = rst.Fields(fldName).type
Set rst = Nothing
Set conn = Nothing



سلام
از شما واقعا متشكرم
خيلي لطف كردين
ماچ ماچ هزتا ماچ
مشكل حل شد
واقعا متشكرم