سلام!نقل قول:
ممكن لطفا سوالتون رو با يك ديتابيس نمونه مطرح كنيد.
Printable View
سلام!نقل قول:
ممكن لطفا سوالتون رو با يك ديتابيس نمونه مطرح كنيد.
آره. فرض كن يه جدول به نام Table1 داريم كه فهرست معلمين يك مدرسه هست. مثلاً:نقل قول:
1- اكبري
2- رضايي
3- كريمي
4- رحيمي
حالا ميخوام يه فرم طراحي كنم كه وقتي اون فرم رو باز مي كنيم، 4 تا Label به صورت «زير هم» داشته باشه با اين كپشن ها:
1- اكبري
2- رضايي
3- كريمي
4- رحيمي
اگر جدول رو تغيير دادم، بايد دفعه ديگه كه فرم رو باز مي كنم، ليبل ها هم طبق جدول تغيير كرده باشند. مثلاً اگر خانه سوم جدول شده باشه «حسيني» بايد ليبل سوم فرم هم شده باشه «حسيني». يا اگر رديف سوم جدول را حذف كنم، بايد ليبل سوم هم حذف بشه.
با سلام!نقل قول:
من يه كد نوشتم با محدوديت : در Table1 فيلدي هست با نام ID1 كه از يك شروع ميشه تا تعداد ركورد ها. بين اعداد اين فيلد نبايد فاصله بيفته، يعني وقتي يه ركورد حذف ميشه بايد اين فيلد هم دوباره مرتب بشه.(البته ميشه روش كار كرد تا اين محدوديت برطرف بشه!). برنامه ليبل هاي مورد نظر رو هنگام باز شدن فرم ، حذف ميكنه و دوباره اونا رو از روي جدول مي سازه.ساخت ليبل ها براي بار اول هم بايد توسط خود اين برنامه انجام بشه. مكان ليبل ها بايد توي برنامه تنظيم بشن. نام فيلد دوم جدول رو من naam گذاشتم. كد بايد هنگام باز شدن فرم اجرا بشه.
اگه تغييراتي در برنامه ايجاد كرديد به ما هم بگيد!
کد:
Option Compare Database
Public Function LabelCheck()
Dim nr As Integer, I As Integer, cf As Integer
Dim ctlnew As Control, ctl As Control
DoCmd.Echo (False)
cf = 567 'conversion factor to centimeter
nr = DCount("[ID]", "[Table1]") 'number of records
DoCmd.OpenForm "Form1", acDesign
While Forms("Form1").Controls.Count > 0
For Each ctl In Forms("Form1").Controls
If Left(ctl.Name, 6) = "Labelx" Then
DeleteControl "Form1", ctl.Name
End If
Next ctl
Wend
For I = 0 To nr - 1
Set ctlnew = CreateControl("Form1", acLabel, , , , 2 * cf, 2 * cf + I * cf, 3 * cf, 0.8 * cf)
ctlnew.Caption = DLookup("[naam]", "[Table1]", "[ID1]=" & I + 1)
ctlnew.Name = "Labelx" & I + 1
Next I
DoCmd.Save acForm, "Form1"
DoCmd.OpenForm "Form1", acNormal
DoCmd.Echo (True)
End Function
سلامنقل قول:
دستت درد نكنه.
كد رو گذاشتم ولي توي اين خط ارور داد:
DoCmd.Openform...
و پيغام خطا اين بود:
Cannon Swith to this view.....
و هنگ كرد.
اگه ميشه به من بگيد از طريق برنامه نويسي، چطور مي تونم:
1- يه Labal به فرم اضافه كنم.
2- مقدار تمام ركوردهاي ستون دوم از Table1 رو به دست بيارم.
متشكرم
با سلام!نقل قول:
با عرض پوزش از اينكه برنامه كار نكرد :11:
برنامه رو تصحيح كردم وديگه اينكه محدوديتي هم نداره يعني نياز به ساخت فيلد اضافي در جدول نيست و با فيلد ID ، كار ميكنه.ديگه اينكه محل دلخواه و فواصل بين ليبل ها در داخل دستور CreateControl تعيين ميشه. كاري كه فقط بايد كرد اينه كه يك ماكروي جداگونه ساخت و با دستور RunCode تابع رو اجرا كرد.يعني فرم بايد با اجراي اين ماكرو باز بشه! . (من وقتي كد يا ماكرو را مستقيما در Onopen فرم اجرا مي كنم، كار نميكنه!!!) باز اگه مشكلي بود لطفا بگيد :
اين كه گفتيد ليبل چطور ساخته ميشه ، با دستور CreateControl .کد:
Public Function LabelCheck()
Dim nr As Integer, I, J, cf, idm
Dim ctlnew As Control, ctl As Control
DoCmd.Echo (False)
cf = 567
nr = DCount("[ID]", "[Table1]")
idm = DMax("[ID]", "[Table1]")
DoCmd.Close acForm, "Form1", acSaveNo
DoCmd.OpenForm "Form1", acDesign
While Forms("Form1").Controls.Count > 0
For Each ctl In Forms("Form1").Controls
If Left(ctl.Name, 6) = "Labelx" Then
DeleteControl "Form1", ctl.Name
End If
Next ctl
Wend
J = 0
For I = 1 To idm
If IsNull(DLookup("[naam]", "[Table1]", "[ID]=" & I)) Then
I = I
Else
J = J + 1
Set ctlnew = CreateControl("Form1", acLabel, , , , 2 * cf, 2 * cf + J * cf, 3 * cf, 0.8 * cf)
ctlnew.Caption = DLookup("[naam]", "[Table1]", "[ID]=" & I)
ctlnew.Name = "Labelx" & I
End If
Next I
DoCmd.Close acForm, "Form1", acSaveYes
DoCmd.Echo (True)
DoCmd.OpenForm "Form1", acNormal
End Function
محمد جاننقل قول:
اين نمونه كد را هم گذاشتم، اما با توجه به اين كه تجربه چنداني در برنامه دهي به اكسس ندارم، باز هم به ارور برخوردم. مشكل اينجاست كه وقتي ارور ميده، هنگ هم مي كنه و ديگه نميتونم درست بفهمم كدوم خط ايراد داره.
اگه ميشه به جاي گذاشتن كد، هر كس ميدونه جواب سوال رو بده.
ضمناً:
من نميخوام ابتدا ليبل ها رو به فرم اضافه كرده و بعد فرم را باز كنم. ميخوام توي رويداد Form_Load دستوري بنويسم كه ليبل ها را به فرم اضافه كنه. توي VB.net يه دستور داريم به نام Me.Controls.Add ولي توي اكسس ظاهراً مشابهي نداره. يعني بايد اكسس رو بيخيال شده و به سراغ VB برم؟
سلامنقل قول:
اگه ميشه به جاي گذاشتن كد، هر كس ميدونه جواب سوال رو بده.
ضمناً:
من نميخوام ابتدا ليبل ها رو به فرم اضافه كرده و بعد فرم را باز كنم. ميخوام توي رويداد Form_Load دستوري بنويسم كه ليبل ها را به فرم اضافه كنه. توي VB.net يه دستور داريم به نام Me.Controls.Add ولي توي اكسس ظاهراً مشابهي نداره. يعني بايد اكسس رو بيخيال شده و به سراغ VB برم؟
ببخشید دخالت میکنم اما مگه میشه بدون اینکه کد بذارن جواب شما رو بدن آقا جواد؟
من یه چیزایی رو امتحان کردم بهتون میگم امیدوارم بدرد بخوره. اول اینکه فکر نکنم اکسس اجازه بده رو همون فرمی که به صورت FormView باز هست شما کنترل بسازید. ولی در یک فرم دیگه که در حالت Design هست میتونید این کارو بکنید. بنابراین من یه جدول با نام Table1 با دو فیلد ID و Name ساختم و در یک فرم یک Command Button گذاشتم که با کلیک روی اون بشه فرم دوم رو ساخت و تمام رکوردهای Name جدول Table1 رو با Lable در اون نشون داد. فکر میکنم شما هم همینو میخواستین. البته من تو اکسس 2003 امتحان کردم و کامل جواب داد.
توی رویداد کلیک Command Button این کد رو بذار.
کد:Dim frm As Form
Set frm = CreateForm
Dim rst As New ADODB.Recordset
Dim cnn As New ADODB.Connection
cnn = CurrentProject.Connection
rst.Open "SELECT ID,Name FROM Table1", CurrentProject.Connection, adOpenStatic, adLockOptimistic
I = 1
If Not (rst.BOF And rst.EOF) Then
While rst.RecordCount >= I
Set ctlnew = CreateControl(frm.Name, acLabel, , , , 300, I * 500, 1000, 500)
ctlnew.Caption = DLookup("[Name]", "[Table1]", "[ID]=" & I)
ctlnew.Visible = True
ctlnew.Name = "Labelx" & I
I = I + 1
Wend
End If
DoCmd.OpenForm frm.Name, acNormal
DoCmd.Restore
[quote=MBeigy;2146444]سلام
ببخشید دخالت میکنم اما مگه میشه بدون اینکه کد بذارن جواب شما رو بدن آقا جواد؟
من یه چیزایی رو امتحان کردم بهتون میگم امیدوارم بدرد بخوره. اول اینکه فکر نکنم اکسس اجازه بده رو همون فرمی که به صورت FormView باز هست شما کنترل بسازید. ولی در یک فرم دیگه که در حالت Design هست میتونید این کارو بکنید. بنابراین من یه جدول با نام Table1 با دو فیلد ID و Name ساختم و در یک فرم یک Command Button گذاشتم که با کلیک روی اون بشه فرم دوم رو ساخت و تمام رکوردهای Name جدول Table1 رو با Lable در اون نشون داد. فکر میکنم شما هم همینو میخواستین. البته من تو اکسس 2003 امتحان کردم و کامل جواب داد.
توی رویداد کلیک Command Button این کد رو بذار....
سلام!
از اینکه بحث یه خورده داغ شد ، یه جورایی یه ذره خوشحالم :31:
آقا جواد عزیز، نمی دونم چرا برنامه برای شما کار نکرد ولی نکته ای قبلا گفته بودم دوباره مایلم بگم: اینکه ماکرویی که کد رو اجرا میکنه نباید به On Event های فرم نسبت داده بشه و باید بصورت مجزا ساخته و اجرا بشه. اگه دوباره کار نکرد فرم رو حذف کنید و دوباره بسازید (دیگه باید جواب بده ! !). روش کار برنامه هم اینه که در ابتدا لیبل هایی رو که خود برنامه در دفعه قبل ساخته بوده رو حذف کرده و مجددا بر اساس جدول در حالت فعلی لیبل ها رو می سازه و با بقیه کنترلها و ... کاری نداره.
MBeigy جان ممنون از مشارکتتون. چند تا نکته درباره کد شما به نظرم میرسه که با اجازه میگم: اول اینکه در کد شما فرم مورد نظر هر دفعه ساخته میشه و تمام نکات طراحی برای کل فرم باید بصورت کد اجرا بشه و ویرایش اون کار زمانبریه. دوم اینکه اگر یک رکورد از جدول حذف بشه نظم فیلد ID هم بهم میخوره و دیگه از یک تا تعداد رکوردها نیست، بنابراین لیبلهایی باقی میمونن که برای اونا کپشن مورد نظر ساخته نمیشه.
در ضمن فرمان DoCmd.Close acForm, "Form1", acSaveNo هم در کد من اضافیه !!؟
با تشکر !
سلامنقل قول:
MBeigy جان ممنون از مشارکتتون. چند تا نکته درباره کد شما به نظرم میرسه که با اجازه میگم: اول اینکه در کد شما فرم مورد نظر هر دفعه ساخته میشه و تمام نکات طراحی برای کل فرم باید بصورت کد اجرا بشه و ویرایش اون کار زمانبریه. دوم اینکه اگر یک رکورد از جدول حذف بشه نظم فیلد ID هم بهم میخوره و دیگه از یک تا تعداد رکوردها نیست، بنابراین لیبلهایی باقی میمونن که برای اونا کپشن مورد نظر ساخته نمیشه.
محمد آقا من فقط خواستم گرا داده باشم و قضیه رو خود آقا جواد پیگیری کنه. با اینحال از نظراتتون ممنون.:31:
در مورد بهم ریختن ID من دقیقا برای اینکه اینطوری نشه از Recordset استفاده کردم ولی بعدش یادم رفت و از روش شما برای خوندن مقدار فیلدها استفاده کردم (یعنی همون DLookUp). که در کد زیر اصلاحش کردم. در مورد ساخته شدن فرم در هر بار هم به راحتی میشه یه فرم ساخته شده رو باز کرد.
لذا در کد اصلاح شده زیر همون جدول Table1 با دو فیلد ID و Name رو داریم. Form1 رو با یک Command Button روی اون می سازیم و در رویداد کلیک کد زیر رو وارد میکنیم. Form2 رو هم به صورت خالی میسازیم تا تمام محتویات Name داخل Form2 به صورت Label نمایش داده بشه.
کد:DoCmd.OpenForm "form2", acDesign
Dim rst As New ADODB.Recordset
Dim cnn As New ADODB.Connection
rst.Open "SELECT ID,Name FROM Table1", CurrentProject.Connection, adOpenStatic, adLockOptimistic
I = 1
If Not (rst.BOF And rst.EOF) Then
While rst.RecordCount >= I
Set ctlnew = CreateControl("form2", acLabel, , , , 300, I * 500, 1000, 500)
ctlnew.Caption = rst.Fields("Name").Value
ctlnew.Visible = True
ctlnew.Name = "Labelx" & I
rst.MoveNext
I = I + 1
Wend
End If
DoCmd.OpenForm "form2", acNormal
DoCmd.Restore
سلام . امیدوارم جواد آقا تا حالا نیومده باشن به اینجا چون من دوباره کد رو تغییر دادم :41: :31:
کد:
Public Function LabelCheck()
Dim nr As Integer, I, J, cf, idm
Dim ctlnew As Control, ctl As Control
DoCmd.Echo (False)
cf = 567
nr = DCount("[ID]", "[Table1]")
idm = DMax("[ID]", "[Table1]")
DoCmd.Close acForm, "Form1", acSaveNo
DoCmd.OpenForm "Form1", acDesign
For k = 1 To idm*20
For Each ctl In Forms("Form1").Controls
If Left(ctl.Name, 6) = "Labelx" Then
DeleteControl "Form1", ctl.Name
End If
Next ctl
Next k
J = 0
For I = 1 To idm
If IsNull(DLookup("[naam]", "[Table1]", "[ID]=" & I)) Then
I = I
Else
J = J + 1
Set ctlnew = CreateControl("Form1", acLabel, , , , 2 * cf, 2 * cf + J * cf, 3 * cf, 0.8 * cf)
ctlnew.Caption = DLookup("[naam]", "[Table1]", "[ID]=" & I)
ctlnew.Name = "Labelx" & I
ctlnew.SizeToFit
End If
Next I
DoCmd.Close acForm, "Form1", acSaveYes
DoCmd.Echo (True)
DoCmd.OpenForm "Form1", acNormal
End Function