PDA

View Full Version : اشکال کد زیر چی میتونه باشه ؟



Hossein Bazyan
دوشنبه 23 بهمن 1385, 23:35 عصر
دوستان سلام
اشکال کد زیر چی میتونه بشه ؟ هنگام اجرا هیچ خطایی نمیده اما هیچ رکوردی هم را برنمیگردونه با اینکه دربانک رکوردهایی با این مشخصات وجود دارند.





SQL="SELECT * FROM TimeTable WHERE AfpDate=#" & TodayDate & "# ORDER BY AfpTime"

علامت " قبل از SQL در آخر جمله باید قرار بگیرد

S_VB.max
سه شنبه 24 بهمن 1385, 00:29 صبح
اینا امتحان کن ببین به جواب می رسی


"SELECT * FROM TimeTable WHERE AfpDate='" & TodayDate & "'order by AfpTime"

zerobit-ltd
سه شنبه 24 بهمن 1385, 13:11 عصر
اول کاری رو که S_VB.max گفت رو انجام بدبد.
بعدشم اگر شما فیلد AfpDate رو از نوع datetime گرفتید، باید دقت کنید که کنار تاریخ، ساعت هم قرار می گیره. یعنی تو جستجو باید ساعت رو هم کنار تاریخ قرار بدید تا با فرمت فیلدتون یکی باشه. اگر فقط تاریخ رو بذارید و ساعت رو بی خیال بشید، تو query شما به جای ساعت، 00:00:00 یا همون 12:00AM قرار می گیره. یعنی می گه برو تمام رکوردهایی رو بیار که تاریخش فلان تاریخ باشه و ساعتش 00:00:00 باشه. برای رفع این مشکل دو تا راه دارید:
1) استفاده از like


"SELECT * FROM TimeTable WHERE AfpDate like '" & TodayDate & "'order by AfpTime"
2) استفاده از between

Hossein Bazyan
سه شنبه 24 بهمن 1385, 16:13 عصر
سپاس از جواب دوستان

اینا امتحان کن ببین به جواب می رسی


"SELECT * FROM TimeTable WHERE AfpDate='" & TodayDate & "'order by AfpTime"

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


اول کاری رو که S_VB.max گفت رو انجام بدبد.
بعدشم اگر شما فیلد AfpDate رو از نوع datetime گرفتید، باید دقت کنید که کنار تاریخ، ساعت هم قرار می گیره. یعنی تو جستجو باید ساعت رو هم کنار تاریخ قرار بدید تا با فرمت فیلدتون یکی باشه. اگر فقط تاریخ رو بذارید و ساعت رو بی خیال بشید، تو query شما به جای ساعت، 00:00:00 یا همون 12:00AM قرار می گیره. یعنی می گه برو تمام رکوردهایی رو بیار که تاریخش فلان تاریخ باشه و ساعتش 00:00:00 باشه. برای رفع این مشکل دو تا راه دارید:
1) استفاده از like


"SELECT * FROM TimeTable WHERE AfpDate like '" & TodayDate & "'order by AfpTime"
2) استفاده از between

در بانک موقع ذخیره فقط تاریخ ذخیره میشه . ( هنگام ذخیره من این طلب را دقت کرده ام و فقط تاریخ در بانک ذخیره میشه )

تعجب من از این است که اگر ما فیلدها را در یک محدوده زمانی محدود میکنیم ( نه یکروز مثلا از تاریخ پریروز تا پس فردا ) فیلدهای امروزبازیابی میشوند اما برای امروز جواب نمیدهد .
در ضن جناب zerobit-ltd منظور شمارا از between نفهمیدم میشه بیشتر توضیح بدهید .

zerobit-ltd
سه شنبه 24 بهمن 1385, 17:11 عصر
جالبه! من موقع insert اگر فقط تاریخو بزنم، به صورت 00:00:00 6-6-2006 ذخیره می شه.
منظور من از between این بود که داده هایی رو بازیابی کنیم که بین مثلا 00:00:00 6-6-2006 و 23:59:59 6-6-2006 باشند که یه روز رو در بر می گیره.
شما اگر از like استفاده کنید، قطعا جواب می گیرید.

Hossein Bazyan
سه شنبه 24 بهمن 1385, 17:40 عصر
جناب عزیز
من از LIKE هم استفاده کردم اما جواب نداد
در ضمن به مسئله عجیب دیگری برخورد کردم که قطعا این اولین بار در مدت زمان برنامه نویسی من میباشد
دیروز که این پست را زدم دوازدهم (میلادی ) بود و امروز سیزدهم برای همه روزهای این هفته از سه شنبه تا شنبه جواب میده به غیر از تاریخ دوازدهم !
من تاریخ سیستم ر اگه به 12 برمیگردانم ریپورت روز دوازدهم را ندارم اما اگه سیزدهم قرار میدم گزارش روز سیزدهم را به من میدهد .
در ضمن هیچ کد اضافه ای به کار نبرده ام و فقط بانک را باز کرده و تعداد رکوردها را میشمارم کار خاص دیگه ای انجام نمیده اینهم کد برنامه


Dim DB as Database
Dim RS as Recordset
Dim Sql as string
Sql="SELECT * FROM TimeTable WHERE AfpDate LIKE #" & Today & "#"
Set DB=OpenDatabase(App.Path & "\DataBase.Mdb"(
Set RS= DB.OpenRecrdset ( Sql, dbOpenDynaset)
Do While Not RS.EOF
MsgBox (RS("AfpDate")
RS.MoveNext
Loop

Hossein Bazyan
سه شنبه 24 بهمن 1385, 19:17 عصر
پیغام عدم مطابقت میده


Da type mismatch in criteria expression

zerobit-ltd
سه شنبه 24 بهمن 1385, 19:57 عصر
اولا که شما نگفتی از access استفاده می کنی، وگرنه اون error رو نمی دیدی.
دوما من این کد رو نوشتم، هیچ خطایی نداره، رکورد هم بر می گردونه.
شاید اشکال از متغیر Today باشه.


Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset
Private Sub Form_Load()
Dim Today As Date
Today = #6/6/2006#
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=ADMIN;Data Source=C:\Documents and Settings\ME\My Documents\db1.mdb;Persist Security Info=False"
cn.Open
cmd.ActiveConnection = cn
cmd.CommandText = "select * from tbl where dt = #" & Today & "#"
Set rs = cmd.Execute
rs.MoveFirst
While Not rs.EOF
MsgBox (rs.Fields(1).Value)
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub

yavari
سه شنبه 24 بهمن 1385, 21:28 عصر
سلام حسین آقا

به نظر من بهترین راه ذخیره تاریخ در بانک به صورت نامبره ! (که فواید این کارو همه می دونن )
پیشنهاد میکنم از این روش استفاده کنین !

موفق باشید

Hossein Bazyan
چهارشنبه 25 بهمن 1385, 00:07 صبح
جناب zerobit-ltd عزیز
سپاس از اسنکه وقت میذاری اما این مشکل من شاید کمی عجیب باشد . اگر من متغییر Today را خودم با یک مقدارتاریخی مقدار دهی کنم مانند مثال شما هیچمشکلی نداره !! اما اگر هم متغیرر تاریخ را از یک متغییر دیگر بخواند هیچ فیلدی را برنمیگرداند.! مثلا Today=Date دراین حالت هیچ رکوردی برگشت داده نمیشه اما در حالت #12-2-2007#= Today همه رکوردهای در این تاریخ ثبت شده برگشت داده میشه ! خیلی عجیبه نه !



به نظر من بهترین راه ذخیره تاریخ در بانک به صورت نامبره ! (که فواید این کارو همه می دونن )
پیشنهاد میکنم از این روش استفاده کنین !


سلام جناب یاوری
نظر شما هم نظر خوبیه اما من همه برنامه را نوشته ام و اگر بخواهم این فیلد راتغییر بدم باید کلی ساختار برنامه را تغییر بدم . این تجربه ای برای بعد باید بشه !
چون من با تاریخ شمسی کار نمیکنم و خود میکروسافت هم چند تا اکتیوایکس خوب برای تاریخ داره گفتم از اون اکتیوایکسها استفاده کنم و فیلدها را هم از نوع تاریخ بگیرم کار راحت تر میشه !

zerobit-ltd
چهارشنبه 25 بهمن 1385, 19:57 عصر
عجیبا غریبا!
این کدی هم که نوشتم، دقیقا همون طوری هستش که شما می خواستید. این هم کار می کنه!


Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset
Private Sub Form_Load()
Dim d As Date
d = Date
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\ME\My Documents\db1.mdb;Persist Security Info=False"
cn.Open
cmd.CommandText = "select dt from tbl where dt = #" & d & "#"
cmd.ActiveConnection = cn
Set rs = cmd.Execute
rs.MoveFirst
While Not rs.EOF
MsgBox (rs.Fields(0).Value)
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub