VBA kirish kodidan SQL so'rovini chaqirish. VBA-da SQL so'rovlar qatorini yaratish. VBA-da INSERT, UPDATE, DELETE ma'lumotlar bazasiga so'rovlar

Kirish"myQuery" deb nomlangan so'rovlar yaratuvchisi yordamida ishlab chiqilgan so'rovni saqladi. Ma'lumotlar bazasi tizimga ODBC ulanishi orqali ulangan. Barcha makrolar kiritilgan.

Excel orqali ma'lumotlar bazasiga ulanish uchun ADODB ulanishiga ega

Xiralashtirish ADODB.Connection As ADODB.Recordset sifatida Dim rs con = Yangi ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Oching "MyDatabase.accdb" End with

Odatda siz davom etasiz va shunchaki SQL-ni yozasiz, bu juda yaxshi va keyin shunga o'xshash narsani bajaring

Dim sqlQuery as String sqlQuery = "SELECT * FROM myTable" rs = Yangi ADODB.Recordset rs.Open sqlQuery, con, ...

Lekin men kirish ma'lumotlar bazasida saqlangan so'rovga kirishni xohlayman. Xo'sh, men ulangan ma'lumotlar bazasida saqlangan so'rovni qanday chaqirishim mumkin.

Allaqachon sinab ko'rgan

  1. con.Execute("EXEC myQuery") lekin u menga myQuery topilmasligini aytdi.
  2. rs. "myQuery" ni oching, con lekin bu yaroqsiz va undan SELECT /etc iboralarini talab qiladi
vba excel-vba ms-access-2007 adodb excel

5 ta javob


6

O'ylaymanki, siz buni saqlangan protsedura deb hisoblashingiz mumkin.

Agar biz Dim sqlQuery As String dan oldin boshlasak

Xira cmdni yangi ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

Shundan so'ng rekordlar to'plamini ishga tushiring.


1

Siz deyarli u erda edingiz:

Dim con As ADODB.Connection Dim rs As ADODB.Recordset o'rnating con = Yangi ADODB.Connection with con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "z:\docs\MyDatabase.accdb" End with con.Execute "Mening so'rovim"

Execni chetga qoldiring.

Siz parametrlarni ham qo'shishingiz mumkin, bu biroz eskirgan, ammo yordam berishi kerak:


0

Bu qandaydir hack, lekin siz buni talab qilishingiz mumkin. Ya'ni, sql qatorini quyidagi bilan almashtiring:

SqlQuery = "QueryName FROM dan * TANGLA;"

Ushbu dasturni ishga tushirishdan oldin ma'lumotlar bazasi mavjudligiga ishonch hosil qilishingiz kerak Ma'lumotlarga kirish qutqarildi, ya'ni. Ctrl+S tugmalarini bosing (Access-da so'rovni bajarish uchun bu etarli emas).


0

Men Access-da allaqachon saqlangan yangilash so'rovini ishga tushirishga muvaffaq bo'ldim:

Ulanish."Mening_yangilash_so'rovim_allaqachon_saqlangan_kirish", adExecuteNoRecords, adCmdStoredProc-ni bajaring.

Men Access ma'lumotlar bazasida va ijro bayonotida so'rov nomidagi bo'shliqlarni pastki chiziq bilan almashtirmagunimcha, bu menga xatoliklarni keltirib chiqardi.


0

Bu mavzu yaratilganiga ancha vaqt bo'ldi. Agar hamma narsani to'g'ri tushunsam, foydali narsalarni qo'shishim mumkin. Men OP ta'riflayotgan narsaga nom berdim, bu DAO yoki ADOBD orqali VBA-da ishga tushirish uchun ACCDB-da saqlangan so'rovdan SQL-dan foydalanish jarayonidir. Men unga "ob'ekt mulki provayderi" nomini berdim, hatto eslatmalarimdagi OPP qisqartmasi va ob'ekt nomi uchun prefiks/suffiks bilan.

G'oya shundan iboratki, ACCDB-dagi mavjud ob'ekt (odatda so'rov) VBA-da ishlatilishi kerak bo'lgan xususiyatni (odatda SQL) ochib beradi. Buning uchun so'rovlardan SQLni so'rib olish uchun funktsiyani birlashtirdim; pastga qarang. Ogohlantirish: Kechirasiz, lekin bularning barchasi DAO-da, men ADODB-dan ko'p foydalanmayman. Umid qilamanki, siz hali ham bu fikrlarni foydali deb topasiz.

Men hatto ushbu OPP so'rovlaridan kelib chiqadigan SQL-da almashtiriladigan parametrlarni ishlatish/qo'shish usulini ishlab chiqishgacha bordim. Keyin VBA-da SQL-ni ishlatishdan oldin almashtirishni amalga oshirish uchun VBA.Replace() dan foydalanaman.

ACCDB da SQL so'roviga DAO ob'ekt yo'li quyidagicha:

MySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

Men almashtiriladigan parametrlardan foydalanaman, nimani o'zgartirish kerakligini baholash va parametr uchun haqiqiy ma'lumotlar bazasida mavjud bo'lmagan noodatiy nom tanlash. Ko'pincha, men faqat maydon yoki jadval nomlarini yoki WHERE va HAVING band ifodalarini almashtirdim. Shuning uchun men ularni "(ReplaceMe00000001)" kabi narsalarni chaqiraman va keyin ishni bajarish uchun Replace() funktsiyasidan foydalanaman ...

SqlText = VBA.Replace(sqlText, "(ReplaceMe00000001)", "SomeActualParameter") ...

va keyin VBA-da sqlText-dan foydalaning. Mana ishlaydigan misol:

"Myxtalty" () Dim stsenorect simkrestressice satr chizig'i sifatida "Myxtlentext" satri sifatida "MyexlTextext112 / 31/11" "" Somedorsomphing12 / 2017 " . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Keyin SQL-dan foydalaning. db.Execute sqlText, dbFailOnError End Function Function getSqlTextFromQuery(ByVal oppName as String) Asim.App Dim Dim ilovasi Asim.Daf DDAf Asim.Access. As DAO.QueryDefs Dim qdef As DAO.QueryDef Dim sqlText as String Set app = Access.Application Set db = app.CurrentDb Set qdefs = db.QueryDefs Set qdef = qdefs(oppName) oppGetSqlText Function.S Enqde


Excel-dan Access MakeTable-da so'rovni ishga tushiring

Menda Excel fayli bor, uni avtomatlashtirishim kerak. Foydalanuvchi Excel hisobotini ochganda, undan ma'lumotlarni yangilash so'raladi. Agar ular ha desalar, men so'rovni bajarishim kerak ...


JS ActiveX ADO'dan MS Access 2013 da ko'rish so'rovi orqali VBA funktsiyasini bajaring

JS ActiveX ADO dan MS Access 2013 da ko'rish so'rovi orqali VBA makrosini qanday bajarish mumkin? VBA funktsiyasi olish uchun mo‘ljallangan joriy foydalanuvchi, tizimga kirgan: Jamoat deklaratsiyasi...


Excel dan Access db da "funksiya" ni o'z ichiga olgan saqlangan so'rovni bajaring

Men Excel vba'dan kirish ma'lumotlar bazasida saqlangan so'rovni ishga tushirishga harakat qilyapman. Agar men uni kirish ma'lumotlar bazasida ochsam va ishga tushirsam, so'rov yaxshi ishlaydi, lekin uni moduldan ishga tushirishda xatolik yuz beradi...


MS Access - VBA-da saqlangan so'rovni nomi bo'yicha bajarish

MS Access 2007 da saqlangan so'rovni VBA da qanday bajarish mumkin? Men SQL-ni VBA-ga nusxalash va joylashtirishni xohlamayman. Men so'rov nomini bajarishni afzal ko'raman. Bu ishlamaydi... VBA so'rovni topa olmadi....


VBA kodida ms-access-da so'rovni qanday bajarish mumkin?

Ma'lumotlar bazasidagi yozuvlarni qaytarish uchun so'rovni qanday bajarishim mumkin ms-access ma'lumotlari VBA kodidan foydalanasizmi?


Exceldan kirish so'rovini ishga tushiring va unga parametrlarni o'tkazing

Excel VBA kodi yoki makrosidan MS access db-da so'rovni qanday bajarish kerak. MS-Access so'rovi Exceldan o'tkazilishi kerak bo'lgan ba'zi parametrlarni qabul qiladi. rahmat


Access 2010 VBA dan Excel ish kitobini boshqarish

Menda quyidagi postga juda o'xshash vaziyat bor: vba orqali grafik yaratish uchun excel 2010 ga kirishni so'rash Mening holimda men jadvalni eksport qilyapman, lekin faylga ko'proq narsani qilishni xohlayman...


Access VBA-dan SQL Server Pass-Through so'rovini bajaring

Menda Access 2007 da saqlangan UPDATE orqali o'tish so'rovi bor. So'rovni ikki marta bosganimda u muvaffaqiyatli bajariladi. Ushbu so'rovni VBA'dan qanday qilib bajarishim mumkin? Men .. istayman...


Excel-dan VBA orqali Access-ga katta ma'lumotlar to'plamini import qilish

Menda Exceldan Access-ga import qilishim kerak bo'lgan katta ma'lumotlar to'plami bor (~ 800 ming qator). Biroq, men 90% kabi ma'lum bir ustun qiymatiga ega qatorlarni e'tiborsiz qoldira olaman ...


Excel vba ichida MDX so'rovi bormi?

Excel VBA ichida MDX so'rovini bajarishning bir usuli bormi? Men buni xuddi SQL bilan bo'lgani kabi ADO orqali ham amalga oshirish mumkin deb o'yladim (ha, men bilaman, SQL MDX dan farq qiladi - bu ko'p marta ...

Access myQuery so'rovlar yaratuvchisi yordamida ishlab chiqilgan so'rovni saqladi. Ma'lumotlar bazasi tizimga ODBC ulanishi orqali ulangan. Barcha makrolar kiritilgan.

Excel ma'lumotlar bazasiga ulanish uchun ADODB ulanishini o'rnatdi

Xiralashtirish ADODB.Connection As ADODB.Recordset sifatida Dim rs con = Yangi ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Oching "MyDatabase.accdb" End with

Odatda siz shunchaki ajoyib ishlaydigan SQL-ni yozasiz va keyin shunga o'xshash narsani qilasiz

Dim sqlQuery as String sqlQuery = "SELECT * FROM myTable" rs = Yangi ADODB.Recordset rs.Open sqlQuery, con, ...

Lekin men kirish ma'lumotlar bazasida saqlangan so'rovga kirishni xohlayman. Xo'sh, men ulangan ma'lumotlar bazasida saqlangan so'rovni qanday chaqirishim mumkin.

Men allaqachon sinab ko'rdim

  1. con.Execute("EXEC myQuery"), lekin bu menga myQuery topilmasligini aytdi.
  2. rs.Open "myQuery" lekin u yaroqsiz va undan SELECT/etc iboralarini talab qiladi

5 ta javob

O'ylaymanki, siz buni saqlangan protsedura deb o'ylashingiz mumkin.

Agar biz Dim sqlQuery As String dan oldin boshlasak

Xira cmdni yangi ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

Shundan so'ng yozuvlar to'plami bilan ishingizni oling.

Siz deyarli u erda edingiz

Dim con As ADODB.Connection Dim rs As ADODB.Recordset o'rnating con = Yangi ADODB.Connection with con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "z:\docs\MyDatabase.accdb" End with con.Execute "Mening so'rovim"

Exec-ni qoldiring.

Siz parametrlarni ham qo'shishingiz mumkin, bu biroz eskirgan, ammo yordam berishi kerak: Excel ma'lumotlari va ehtimol makro bilan Access ma'lumotlar bazasidagi 2 maydonni yangilang

Men Access-da allaqachon saqlangan yangilash so'rovini ishga tushirishga muvaffaq bo'ldim:

Ulanish."Mening_yangilash_so'rovim_allaqachon_saqlangan_kirish", adExecuteNoRecords, adCmdStoredProc-ni bajaring.

Men Access ma'lumotlar bazasida va ijro bayonotida so'rov nomidagi bo'shliqlarni pastki chiziq bilan almashtirmagunimcha, bu menga xatoliklarni keltirib chiqardi.

Bu qandaydir xakerlik ishi, lekin siz so'rov yuborishingiz mumkin. Ya'ni, SQL qatorini quyidagi bilan almashtiring:

SqlQuery = "QueryName FROM dan * TANGLA;"

Boshlashdan oldin, Access ma'lumotlar bazasi saqlanganligiga ishonch hosil qilishingiz kerak, ya'ni. Ctrl + S tugmalarini bosing (Access-da so'rovni bajarish uchun bu etarli emas).

Bu mavzu yaratilganiga ancha vaqt bo'ldi. Agar men to'g'ri tushunsam, foydali narsalarni qo'shishim mumkin. Men OP ta'riflayotgan narsaga nom berdim: bu DAO yoki ADOBD orqali VBA da ishga tushirish uchun ACCDB da saqlangan so'rovdan SQL dan foydalanish jarayoni. Men uni "Ob'ekt mulki provayderi" deb nomladim, hatto eslatmalarimdagi OPP qisqartmasi va ob'ekt nomi prefiksi/suffiksi uchun ham.

G'oya shundan iboratki, ACCDB-dagi mavjud ob'ekt (odatda so'rov) VBA-da ishlatilishi kerak bo'lgan xususiyatni (odatda SQL) ochib beradi. Buning uchun so'rovlardan SQLni so'rib olish uchun funktsiyani birlashtirdim; Pastga qarang. Ogohlantirish: Kechirasiz, lekin bularning barchasi DAO-da, men ADODB-dan ko'p foydalanmayman. Umid qilamanki, siz hali ham g'oyalarni foydali deb topasiz.

Men hatto ushbu OPP so'rovlaridan kelib chiqadigan SQL-da almashtiriladigan parametrlarni ishlatish/qo'shish usulini ishlab chiqishgacha bordim. Keyin VBA-da SQL-ni ishlatishdan oldin almashtirishni amalga oshirish uchun VBA.Replace() dan foydalanaman.

ACCDB da SQL so'roviga DAO ob'ekt yo'li quyidagicha:

MySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

Men almashtirilishi mumkin bo'lgan parametrlardan foydalanaman, nima o'zgarishi kerakligini baholash va haqiqiy ma'lumotlar bazasida mavjud bo'lmagan parametr uchun noodatiy nom tanlash. Ko'pincha, men faqat maydon yoki jadval nomlari yoki WHERE va HAVING band ifodalarini almashtirdim. Shuning uchun men ularni "(ReplaceMe00000001)" kabi narsalarni chaqiraman va keyin ishni bajarish uchun Replace() funktsiyasidan foydalanaman ...

SqlText = VBA.Replace(sqlText, "(ReplaceMe00000001)", "SomeActualParameter")

Va keyin VBA-da sqlText-dan foydalaning. Mana ishlaydigan misol:

"Myxtalty" () Dim stsenorect simkrestressice satr chizig'i sifatida "Myxtlentext" satri sifatida "MyexlTextext112 / 31/11" "" Somedorsomphing12 / 2017 " . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Keyin SQL-dan foydalaning. db.Execute sqlText, dbFailOnError End Function Function getSqlTextFromQuery(ByVal oppName as String) Asim.App Dim Dim ilovasi Asim.Daf DDAf Asim.Access. As DAO.QueryDefs Dim qdef As DAO.QueryDef Dim sqlText as String Set app = Access.Application Set db = app.CurrentDb Set qdefs = db.QueryDefs Set qdef = qdefs(oppName) oppGetSqlText Function.S Enqde

Ushbu dars bag'ishlangan SQL so'rovlari ma'lumotlar bazasiga VBA kirish. Biz VBA-da ma'lumotlar bazasiga INSERT, UPDATE, DELETE so'rovlari qanday amalga oshirilishini ko'rib chiqamiz, shuningdek, SELECT so'rovidan ma'lum qiymatni qanday olishni o'rganamiz.

Dasturlashtirganlar VBA kirish va tayanch bilan ishlashda SQL ma'lumotlari serverlar ko'pincha ma'lumotlar bazasiga SQL so'rovini yuborish, INSERT, UPDATE yoki oddiy SQL SELECT so'rovi kabi oddiy va zarur vazifaga duch kelishadi. Va biz yangi dasturchilar bo'lganimiz sababli, biz ham buni qila olishimiz kerak, shuning uchun bugun biz buni qilamiz.

Biz allaqachon ma'lumotlarni olish mavzusiga to'xtalib o'tdik SQL server, bu erda ular ushbu ma'lumotni olish uchun VBA-da kod yozishgan, masalan, MSSql 2008-dan matnli faylga ma'lumotlarni yuklash haqidagi maqolada yoki Access-dan Word va Excel shablonlariga ma'lumotlarni yuklash materialida bir oz tegib ketgan, ammo u yoki bu tarzda biz unga yuzaki qaradik va bugun men bu haqda biroz batafsilroq gapirishni taklif qilaman.

Eslatma! Quyida keltirilgan barcha misollar Access 2003 ADP loyihasi va MSSql 2008 maʼlumotlar bazasi yordamida koʻrib chiqiladi.Agar siz ADP loyihasi nima ekanligini bilmasangiz, biz buni Access ADP loyihasini qanday yaratish va sozlash boʻyicha materialda koʻrib chiqdik.

Misollar uchun manba ma'lumotlari

Aytaylik, bizda yil oylarining raqamlari va nomlari bo'lgan test_jadval mavjud (so'rovlar quyidagi buyruq yordamida bajariladi). Menejment studiyasi)

JADVAL TUZISH .( NULL EMAS, (50) NULL) ON GO

Yuqorida aytib o'tganimdek, biz MS SQL 2008 bilan ishlash uchun sozlangan ADP loyihasidan foydalanamiz, unda men test shaklini yaratdim va imzo bilan boshlash tugmachasini qo'shdim. "Yugurish", bu bizning kodimizni sinab ko'rishimiz kerak, ya'ni. Biz barcha kodni voqea ishlovchisiga yozamiz " Tugmachani bosish».

VBA-da INSERT, UPDATE, DELETE ma'lumotlar bazasiga so'rovlar

Ko'p vaqtni kechiktirmaslik uchun, keling, darhol boshlaylik, deylik, test jadvalimizga qator qo'shishimiz kerak ( kod izohlandi)/

Private Sub start_Click() "So'rovlar qatorini saqlash uchun o'zgaruvchini e'lon qilish Dim sql_query String sifatida "Unga kerakli so'rovni yozing sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "Iyun")" "Bajarish u DoCmd.RunSQL sql_query End Sub

Bunday holda, so'rov joriy ma'lumotlar bazasi ulanish parametrlari yordamida bajariladi. Ma'lumotlar qo'shilgan yoki qo'shilmaganligini tekshirishimiz mumkin.

Ko'rib turganingizdek, ma'lumotlar kiritilgan.

Bitta qatorni o'chirish uchun biz quyidagi kodni yozamiz.

Private Sub start_Click() "Dim sql_query so'rovlar qatorini String sifatida saqlash uchun o'zgaruvchini e'lon qiling "Unga o'chirish so'rovini yozing sql_query = "DELETE test_table WHERE id = 6" "Uni ishga tushiring DoCmd.RunSQL sql_query End

Agar tekshirsak, buni ko'ramiz kerakli qator chap.

Ma'lumotlarni yangilash uchun sql_query o'zgaruvchisiga yangilash so'rovini yozing, umid qilamanki, ma'no aniq.

VBA-da ma'lumotlar bazasiga so'rovni tanlang

Bu erda narsalar boshqa SQL konstruktsiyalariga qaraganda biroz qiziqroq.

Birinchidan, aytaylik, biz jadvaldan barcha ma'lumotlarni olishimiz kerak va, masalan, biz uni qayta ishlaymiz va xabarda ko'rsatamiz va siz, albatta, boshqa maqsadlarda ham foydalanishingiz mumkin, buning uchun biz quyidagilarni yozamiz. kod

Private Sub start_Click() "O'zgaruvchilarni e'lon qilish "Ma'lumotlar bazasidan yozuvlar to'plami uchun Dim RS As ADODB.Recordset "So'rov qatori Dim sql_query As String "Xabarda yakuniy ma'lumotlarni ko'rsatish uchun satr Dim str As String "uchun yangi ob'ekt yaratish. yozuvlar to'plami RS = Yangi ADODB .Recordset "So'rovlar qatori sql_query = "Tanlash identifikatori, test_jadvalidan nom_mon" "So'rovni joriy loyiha ulanish sozlamalari yordamida ishga tushiring RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Yozuvlar bo'ylab aylanish. (RS.EOF) "Xabarni ko'rsatish uchun o'zgaruvchini to'ldiring str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline "keyingi yozuvga o'ting RS.MoveNext Wend "msgbox str End Sub xabarini chiqaring

Bu erda biz yozuvlar to'plamimizdagi barcha qiymatlarni takrorlash uchun VBA Access halqalaridan foydalanmoqdamiz.

Ammo ko'pincha yozuvlar to'plamidan barcha qiymatlarni emas, balki faqat bittasini, masalan, oyning kodi bo'yicha nomini olish kerak bo'ladi. Buning uchun loopdan foydalanish qandaydir qimmatga tushadi, shuning uchun biz faqat bitta qiymatni qaytaradigan so'rov yozishimiz va unga kirishimiz mumkin, masalan, 5-kod yordamida oy nomini olamiz.

Private Sub start_Click() "O'zgaruvchilarni e'lon qilish" Ma'lumotlar bazasidan yozuvlar to'plami uchun Dim RS As ADODB.Recordset "So'rovlar qatori Dim sql_query As String "Yakuniy qiymatni ko'rsatish uchun string Dim str String sifatida "Yozuvlar to'plami uchun yangi ob'ekt yaratish RS = Yangi ADODB.Recordset "Query line sql_query = "Tanlang name_mon FROM test_table WHERE id = 5" "So'rovni joriy loyiha ulanish sozlamalari yordamida ishga tushiring RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Qiymatimizni oling str = RS. Maydonlar(0) msgbox str End Sub

Umumjahonlik uchun bu erda biz allaqachon hujayra nomi bilan emas, balki uning indeksi bilan murojaat qildik, ya'ni. 0 va bu eng birinchi qiymat Yozuvlar to'plami, oxirida biz qiymatga ega bo'ldik "may".

Ko'rib turganingizdek, hamma narsa juda oddiy. Agar siz tez-tez ma'lumotlar bazasidan ma'lum bir qiymat olishingiz kerak bo'lsa ( oxirgi misolda bo'lgani kabi), keyin men barcha kodni alohida funktsiyaga chiqarishni tavsiya qilaman (VBA Access 2003 da funktsiyani qanday yozish kerak) bitta kirish parametri bilan, masalan, oy kodi ( misolimizni ko'rib chiqsak) va oddiygina, agar bu qiymatni ko'rsatish kerak bo'lsa, kerakli parametr bilan bizga kerak bo'lgan funktsiyani chaqiring va tamom, bu bilan biz VBA kodini sezilarli darajada kamaytiramiz va dasturimizni idrok etishni yaxshilaymiz.

Bugun hammasi shu. Omad!

Access dasturli ravishda SQL so'rovlari qatorlarini, shuningdek, mos keladigan shakllar, hisobotlar va boshqalar, funktsiyalar parametrlari va boshqalar uchun qiymatlar sifatida xizmat qiluvchi satrlarni yaratishga imkon beradi. SQL sintaksisi. Shu bilan birga, shuni yodda tutishimiz kerakki, bunday qatorga kiritilgan konstantalar ham SQL qoidalariga muvofiq formatlanishi kerak, xususan:

  • raqamlarda o'nlik ajratuvchi nuqta bo'lishi kerak,
  • satrlar qo'shtirnoq yoki apostroflar ichiga olinishi kerak (va qo'shtirnoq yoki apostroflar qatorning ichida mos ravishda ikki marta ko'rsatilgan),
  • Sanalar xesh belgilariga qo'yilishi va Amerika formatida (aa/dd/yyyy) cheklovchi sifatida chiziq bilan yozilishi kerak.

    Agar bu buzilgan bo'lsa, quyidagi ta'sirlar mumkin:

  • nuqta o'rniga vergul qo'yilgan 10,5 kabi raqam ikkita 10 va 5 raqamlari ro'yxati sifatida qabul qilinadi, bu esa maydonlar sonida qandaydir nomuvofiqlikka olib keladi,
  • Qo'shtirnoq va apostrofsiz Vasya kabi satr maydon nomi sifatida qabul qilinadi, agar bunday maydon mavjud bo'lsa yoki darhol so'raladigan parametr nomi sifatida,
  • Xesh belgilarisiz 1/2/2010 yoki 1-2-2010 kabi sana arifmetik ifoda sifatida qabul qilinadi (mos ravishda bo'lish va ayirish bilan),
  • 1.2.2010 kabi sana ikki kasrli kasr son sifatida talqin qilinadi va xatolikka olib keladi,
  • xesh belgilari bo'lgan, ammo Amerika formatida emas, sana sana sifatida qabul qilinadi, lekin boshqacha (kun va oy qayta tartibga solinadi).

    Quyida har bir bo'limda qachon ishlab chiqarilishi kerak bo'lgan SQL qatoriga misol keltirilgan dasturiy ta'minot yaratish, va keyin uni yaratuvchi VBA kodi. Quyida juda foydali tavsiya mavjud.

    1. Raqamlardan foydalanish

    JADVALDAN * TANLANGAN QAYERDA ((((Jadval .Miqdor)= 12 .197 ));
    VBA v1

    Dim q As Single q = 12 .197 strSQL = "SELECT * " _ & "Jadvaldan" _ & "QAYERDA (((Jadval.Miqdor)=" & q & "));"
    VBA v2

    Dim q As String q = "12,197" strSQL = "SELECT * " _ & "FROM Jadval" _ & "WHERE (((Table.Quanty)=" & Str (q) & "));"
    Eslatma:

  • VBA v1- butun sonlar uchun. Kasr sonlar uchun bu tizim ajratuvchi nuqta bo'lgandagina alohida holat.
  • VBA v2- to'g'riroq variant, chunki klassik dasturlashda faqat satrlarni satrlar bilan birlashtirish mumkin, VBA v1 esa yashirin turdagi konvertatsiyadan foydalanadi, garchi butun sonlar uchun bu usul haqida hech qanday shikoyatlar bo'lmagan. (Misol tizim chegaralovchisi vergul bo'lganda berilgan.)
  • Ba'zan CStr() funktsiyasi ham konvertatsiya qilish uchun ishlatiladi, lekin u har doim ham qo'llanilmaydi, chunki raqamni satr sifatida qaytaradi, bu erda u tizim ajratuvchisi orqali yoziladi, SQL esa chegaralovchi sifatida faqat nuqtani qabul qiladi.
  • NB! Atipik tizim ajratgichlaridan foydalanilganda, yuqoridagi misollar ishlamasligi mumkin, bunday hollarda tizim ajratgichni dasturiy ravishda nuqta bilan almashtirishingiz kerak. Quyida tizim chegaralagichini qaytaruvchi funksiya mavjud.
    Funktsiya GetDecimalSeparator() string sifatida GetDecimalSeparator = Format ( 0 #, "." ) End Function Bundan tashqari, ba'zi standart Access amallari bu holatda ishlamasligi mumkinligini unutmang.

    2. Satrlardan foydalanish

    TANLOV * JADVALDAN QAYERDA ((((Jadval .Name)="Hammasi" ));
    VBA v1

    Dim q As String q = "Hammasi" strSQL = "SELECT * " _ & "FROM Jadval" _ & "WHERE ((((Table.Quanty)=" "" & DoubleQuote(q) & "" "));"
    VBA v2

    Dim q As String q = "Hammasi" strSQL = "SELECT * " _ & "FROM Jadval" _ & "WHERE (((Jadval.Miqdor)="" & DoubleApostrophe(q) & "" ));"
    Eslatma:

  • VBA v1: DoubleQuote() - ikki baravar oshiradigan funksiya iqtiboslar.

    Misol:
    namuna olish sharti:
    a"a" ning SQL:
    WHERE maydoni = a""a""VBA:
    strWhere = " WHERE maydoni = """ & "a""""a"" & """ "

  • VBA v2:: DoubleApostrophe() - ikki baravar oshiradigan funksiya apostroflar.

    Misol:
    namuna olish sharti:
    a"a" ning SQL:
    WHERE maydoni = a "a" "s"VBA:
    strWhere = " WHERE maydoni =" & "a""a""s" & "" "

  • Yuqorida aytib o'tilgan DoubleQuote va DoubleApostrophe funktsiyalari o'rnatilgan Access funktsiyalari EMAS, balki foydalanuvchi tomonidan belgilanadigan funktsiyalar bo'lib, ularni amalga oshirish dasturchining ixtiyorida qoladi. Xususan, Access 2000 va undan yuqori versiyalarida shu maqsadda o‘rnatilgan “Almashtirish” funksiyasidan, 97 va undan past versiyalarda esa ushbu funksiyadan foydalanishingiz mumkin:

    Umumiy funksiya Replace97(StrMain As String , StrFind As String , StrZam as String ) As String On Xato GoTo err Dim pos Kadar uzoq Agar StrFind = "" Keyin GoTo err If StrMain = "" Keyin Replace97 = StrZam: Funktsiyadan chiqish InStr( 1 , StrMain, StrFind) = 0 pos = InStr( 1 , StrMain, StrFind) StrMain = o'rta (StrMain, 1 ,pos- 1 ) & StrZam & mid (StrMain, pos + Len(StrFind), Len(StrMain)) Loop Replace97 = StrMain Chiqish funktsiyasi xato: Replace97 = StrMain End Function
    3. Sanalardan foydalanish

    JADVALDAN * TANLOVCHI ((((Jadval .TimeOpen)=#) 3 /31 /2003 11 :17 :19 #));
    VBA

    Dim q As Sana q = Hozir strSQL = "SELECT * " _ & "FROM Jadval" _ & "WHERE (((Table.TimeOpen)=#" & Format (q, "mm\/dd\/yy hh\:mm" \:ss" ) & "#)))"
    Eslatma:

  • Microsoft JET SQL Amerika formatidagi sanalar bilan ishlaydi, ya'ni. aynan yuqoridagi shaklda Oy/Kun/Yil.
  • # belgilarni qoldirmang (u butun sana-vaqt konstantasini o'z ichiga oladi) va \ (u / va : ni mahalliy parametrlar bilan almashtirilishiga yo'l qo'ymaydi, bu Format funksiyasi bajaradigan va buning oldini oladi. to'g'ri ishlash SQL buyruqlari).
  • Bu erda o'qish tavsiya etiladi: sana/vaqtni saqlash usullari haqida.
  • NB! Siz sanani butun songa (yoki Long) o'zgartirishdan foydalanmasligingiz kerak, chunki Access va SQL Serverda turli raqamlar bir xil sanaga to'g'ri keladi va solishtirganda siz kutilmagan natijaga erishishingiz mumkin.

    O'z ichiga olgan bunday qatorni tuzgan SQL buyrug'i, va uni bajarish uchun yuborish xatolikka olib kelishi mumkin. Bunday holda, ushbu satrni disk raskadrovka oynasiga chop eting va unga ko'z bilan qarang. Ehtimol, xato darhol ko'zingizni ushlaydi. Agar u ishlamasa, so'rovlar dizaynerida yangi so'rov yarating, SQL rejimiga o'ting, so'rov matnini u erga kiriting va uni ishga tushiring. Agar xato bo'lsa, u aniqroq ko'rsatiladi.