PDA

View Full Version : سوال: طولانی بودن کد در VBA



dadsara
چهارشنبه 06 شهریور 1387, 14:08 عصر
باسلام خدمت همه دوستان
آیا در نمونه ضمیمه کسی میدونه چرا هنگام اجرای ریپورت خطا ظاهر می شه؟
من نمونه های دیگر را دیده ام ولی هرچه سعی می کنم آنرا پیدا کنم با خطا مواجه می شوم.
**** با توجه به اینکه در نمونه واقعی طول Select زیاد می باشد لذا نمی خواهم کل Select در یک خط باشد ****

مهدی قربانی
چهارشنبه 06 شهریور 1387, 14:54 عصر
سلام
بهتره به اين شكل عمل كنيد :


Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Dim db As Database
Dim rst As Recordset
Dim strSQL As String
strSQL = "SELECT Table1.a, Table1.b, Table2.a2, Table2.a3"
strSQL = strSQL & " FROM Table1 INNER JOIN Table2 ON Table1.a = Table2.a"
Set db = CurrentDb
Set rst = db.OpenRecordset(strSQL)
Me.Text0 = rst.Fields(0)
End Sub

dadsara
شنبه 09 شهریور 1387, 07:53 صبح
باسلام
ضمن تشکر از حضرتعالی ولی منظور من نحوه نوشتن کد نبود بلکه مشکل من طول کد می باشد . همانگونه قبلا نیز عرض کردم فایل فوق را بعنوان نمونه قرار داده بودم تا سوالم واضح تر باشد .
نمونه نزدیک به برنامه ام شبیه زیر می باشد.

Set rst1 = db1.openrecordset("SELECT T_Main.Id, T_Main.date_input, _
'T_Shobeh.Shobeh,T_Name_Mamor.F_Name, T_Name_Mamor.Name_Mamor, _
' [T_Name_Mamor.F_Name]+" "+[Name_Mamor] AS Expr1 ,T_Main.Date_Mamor, _
' T_Main.Date_Eblagh, T_Resalt.Resalt, T_Main.Date_Sh, T_Main.Date_Dadgh, diff([date_Input],[Date_Dadgh]) AS a _
' FROM T_Shobeh INNER JOIN (T_Name_Mamor INNER JOIN _
' (T_Resalt INNER JOIN T_Main ON T_Resalt.Id_Resalt = T_Main.id_Resalt) ON _
' T_Name_Mamor.id_Name_mamor = T_Main.id_Name_Mamor) ON T_Shobeh.Id_shobeh = T_Main.id_shobeh _
' WHERE (((T_Main.date_input)>=[Forms]![F_Search_Main]![Text0] And (T_Main.date_input)<=[Forms]![F_Search_Main]![Text2]) AND _
' ((T_Shobeh.Shobeh) Like "*"+[Forms]![F_Search_Main]![Text21]+"*") AND _
' ((T_Name_Mamor.Name_Mamor) Like "*"+[Forms]![F_Search_Main]![Text4]+"*") AND _
' ((T_Main.Date_Mamor)>=[Forms]![F_Search_Main]![Text6] And (T_Main.Date_Mamor)<=[Forms]![F_Search_Main]![Text8]) AND _
' ((T_Main.Date_Eblagh)>=[Forms]![F_Search_Main]![Text10] And (T_Main.Date_Eblagh)<=[Forms]![F_Search_Main]![Text12]) AND _
' ((T_Resalt.Resalt) Like "*"+[Forms]![F_Search_Main]![Text32]+"*") AND ((T_Main.Date_Sh)>=[Forms]![F_Search_Main]![Text26] And _
' (T_Main.Date_Sh)<=[Forms]![F_Search_Main]![Text30]) AND ((T_Main.Date_Dadgh)>=[Forms]![F_Search_Main]![Text38] And _
' (T_Main.Date_Dadgh)<=[Forms]![F_Search_Main]![Text40]) AND _
' ((diff([date_Input],[Date_Dadgh]))>=[Forms]![F_Search_Main]![Text51])) ")
'a = rst1.Fields(0)
همانگونه که مشاهده می فرمائید تعداد پارامترها زیاد می باشد و من در انتهای هر خط آنرا با _ از خط بعدی تفکیک کرده ام اما قطعه کد فوق اجرا نمی شود.

مهدی قربانی
شنبه 09 شهریور 1387, 09:07 صبح
سلام
اگر منظور شما ايجاد انقطاع بين عبارات دستور SQL در VBA هست دو راه پيش رو هست يكي اون راه اولي كه تقديم شد و راه دوم كه فكر مي كنم مورد نظر شماست استفاده از كاراكترهاي &_ هست ، نمونه دومي كه شما قرار داديد چنانچه بخوايم قابل استفاده بشه بايد از راه دوم استفاده كرد و شما در زمان ايجاد انقتطاع در انتهاي خط ابتدا كاراكتر " و بعد با يك فاصله يا Space كاراكتر _ و سپس اينتر كرده و در ابتداي خط بعدي كاراكتر & و بعد از يك فاصله كاراكتر " و بعد عبارت SQL به همين ترتيب تا آخرين خط مطابق نمونه كد فقط يك نكته چنانچه در خلال كد SQL جاهايي فاصله داشته باشيم مثل قسمتهاي مشخص شده دركد زير

SELECT Table1.a, Table1.b, Table2.a2, Table2.a3 FROM Table1 INNER JOIN Table2 ON Table1.a = Table2.a
بايد فاصله مورد نظر لحاظ بشه مثل كدهاي زير :

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Dim db As Database
Dim rst As Recordset
Dim strSQL
strSQL = "SELECT Table1.a" _
& ", Table1.b, Table2.a2, Table2.a3" _
& " FROM Table1 INNER JOIN Table2" _
& " ON Table1.a = Table2.a"
Set db = CurrentDb
Set rst = db.OpenRecordset(strSQL)
Me.Text0 = rst.Fields(0)
End Sub

HAMRAHSOFT.IR
چهارشنبه 09 بهمن 1387, 10:27 صبح
ميشه دوستان لطف كن كد كه باهش بش از طريق وبي كاري كه كوئري ادد (append)انجام داد ممنون ميشم اگه اين كار انجام بديد

dadsara
چهارشنبه 09 بهمن 1387, 14:24 عصر
ميشه دوستان لطف كن كد كه باهش بش از طريق وبي كاري كه كوئري ادد (append)انجام داد ممنون ميشم اگه اين كار انجام بديد
سلام
ميشه يك مقدار واضح تر سوال خودتان را اعلام كنيد

HAMRAHSOFT.IR
پنج شنبه 10 بهمن 1387, 20:15 عصر
کوئری ادد که با اون مفداری ار یم تیبل به دیبل دیگه انتقال میدن

karmand
شنبه 12 بهمن 1387, 07:52 صبح
بطور کلی هر کواری که با حالت گرافیکی میسازید را میتوانید با وی بی اجرا نمایید
کواری append را در محیط گرافیکی بسازید اس کیو ال ان را کپی کنید و با دستور docmd.runsql اجرا نمایید

docmd.runsql("insetr into tabel1 from tabel2")

dadsara
شنبه 12 بهمن 1387, 07:54 صبح
سلام
با استفاده از كد زير مي توانيد عمليات مورد نظر را انجام دهيد
DoCmd.RunSQL "INSERT INTO T_Detail ( ID, Rooz ) SELECT T_Detail.ID, T_Detail.Rooz FROM T_Detail WHERE (((T_Detail.Id_Mah)=[forms]![F_append]![txt0]));"

HAMRAHSOFT.IR
یک شنبه 28 تیر 1388, 10:46 صبح
سلام دوستان خطا مال چي؟ من مخوام وقتي روي دكمه كليك كردم يك مقدار بخواد وقتي مقدار وارد كردم مقداري برام برگردون كن

HAMRAHSOFT.IR
یک شنبه 28 تیر 1388, 13:19 عصر
دوستان من كمي عجله دارم كسي نيست كمكم كنه

مهدی قربانی
یک شنبه 28 تیر 1388, 14:23 عصر
سلام
اشكال اول عدم رعايت فاصله در بين عبارات SQL بود و اشكال دوم در ايندكس گذاري فيلدهاي ركوردست ، شما ايندكس فيلد آخر رو 3 قرار داده بوديد كه بايد عرض كنم در ركوردست شما فقط تا 2 قابل استفاده هست چون كل فيلدها 3 تاست و از 0 اگر شروع كنيد ميشه 0 و 1 و 2 اشكال سوم هم مربوط ميشه به اينكه شما در مقابل عبارت WHERE بجاي قرار دادن [] كه موجب خطاي Too few Parameters ميشه بهتره از متغيير و تابع InputBox استفاده كنيد كدهاي موجود در نمونه خودتون و نمونه بنده رو مقايسه كنيد متوجه تغييرات ميشيد :

mehdi_fiz
یک شنبه 28 تیر 1388, 14:24 عصر
با سلام
نمونه رو اصلاح کردم چند جا فاصله ها رو یادتون رفته بود موفق باشید

HAMRAHSOFT.IR
یک شنبه 28 تیر 1388, 16:05 عصر
تشكر ولي اگه بخوام متغير ازم به پرسه بايد چكار كن چون انطوري بايد متغير دستي بهش بدم

mehdi_fiz
دوشنبه 29 تیر 1388, 01:23 صبح
با سلام
شما می تونید با استفاده از inputbox ویا یک تکست باکس روی فرم این کار را انجام دهید و مقدار شرط را مساوی نام تکست باکس قرار دهید
موفق باشید

dadsara
سه شنبه 30 تیر 1388, 09:03 صبح
سلام
باکمی تغییرات فایل اصلاح شده جنابعالی ضمیمه شد

HAMRAHSOFT.IR
سه شنبه 30 تیر 1388, 09:23 صبح
ببخشيد ميشه نمونه اصلاح كنيد

لازم ذكر است نوع فيلدA1A بايد Text باشه نهNumber

dadsara
سه شنبه 30 تیر 1388, 09:34 صبح
در پست شماره 16 اصلاح شد

HAMRAHSOFT.IR
سه شنبه 30 تیر 1388, 09:35 صبح
نمونه جديد را مگيم

dadsara
سه شنبه 30 تیر 1388, 10:01 صبح
نمونه جديد را مگيم
سلام

اگر متغیر از رشته باشد باید آنرا داخل '"& نام متغیر &"' گذاشت

& " WHERE (Tbl_Customer.CustomerID)= '" & strA & "' "

HAMRAHSOFT.IR
سه شنبه 30 تیر 1388, 10:13 صبح
ممنون از راهنماي شما حلا اگه دوتا متغير داشت باشيم به چه شكل ميشه و بايد چكار كنم

اگر مقدار وارد شده داخل بانك نباشه باز خطا ميده

dadsara
سه شنبه 30 تیر 1388, 13:19 عصر
هیچ فرقی بین یک متغیر و دو متغیر نیست.
استفاده از دستور
if rst.eof then . . .
برای همین مسئله می باشد

HAMRAHSOFT.IR
سه شنبه 30 تیر 1388, 15:38 عصر
ببخشيد منضورم بد گفتم مخوام يك متغير در دو فيلد از جدول بگرد بجاي كي فيلد

ميشه نمونه اصلاح كنيد

dadsara
چهارشنبه 31 تیر 1388, 07:35 صبح
ببخشيد منضورم بد گفتم مخوام يك متغير در دو فيلد از جدول بگرد بجاي كي فيلد

ميشه نمونه اصلاح كنيد
بازهم فرقی نمی کند مشابه نمونه زیر عمل کنید

& " WHERE (((Tbl_Customer.CustomerID)= '" & strA & "' ) and ((Tbl_Customer.CustomerName)= '" & strA & "' ))"

beyramali02
چهارشنبه 12 بهمن 1390, 12:19 عصر
باسلام دوستان لطفا يكي كمك كنه!!!!!!!!!!!!
من ماكرويي را طراحي كردم كه با گرفتن دوپارامتر(كد و جنسيت) گزارشي را چاپ مي كند
سوال اول : چگونه مي توان ماكرو را بدون واردكردن پارامتر از طريق حلقه For اجرا كرد
سوال دوم : چگونه به يك المان(دكمه يا خودماكرو) كليد فوري تخصيص داد؟
با تشكر