VBA хандалтын кодоос sql хайлтыг дуудаж байна. VBA дээр SQL асуулгын мөрийг үүсгэж байна. Өгөгдлийн сангийн асуулга VBA дахь INSERT, UPDATE, DELETE

Хандалт"myQuery" нэртэй асуулга үүсгэгч ашиглан боловсруулсан асуулгыг хадгалсан. Өгөгдлийн сан нь ODBC холболтоор системд холбогдсон. Макро бүгд багтсан.

Excelдамжуулан мэдээллийн сантай холбогдохын тулд ADODB холболттой

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection with con .Provider = "Microsoft.ACE.OLEDB.12.0". "MyDatabase.accdb"-г нээнэ үү.

Ихэвчлэн та зүгээр л SQL-ээ бичээд, зүгээр л ийм зүйл хий

Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = Шинэ ADODB.Recordset rs.Open sqlQuery, con, ...

Гэхдээ би хандалтын мэдээллийн санд хадгалсан асуулгад хандахыг хүсч байна. Тэгэхээр би саяхан холбосон өгөгдлийн сан дээр хадгалсан хайлтыг яаж дуудах вэ.

Аль хэдийн туршиж үзсэн

  1. con.Execute("EXEC myQuery")гэхдээ энэ нь миний Query-г олох боломжгүй гэж надад хэлсэн.
  2. rs. "myQuery"-г нээ, conгэхдээ энэ нь хүчингүй бөгөөд үүнээс SELECT /etc хэллэг авахыг хүсч байна
vba excel-vba ms-access-2007 adodb excel

5 хариулт


6

Та үүнийг хадгалагдсан журам гэж ойлгож болно гэж би бодож байна.

Хэрэв бид Dim sqlQuery As String-ийн өмнө эхлэх юм бол

Cmd-г шинэ ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

Үүний дараа бичлэгийн ажлаа хий.


1

Та бараг тэнд байсан:

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection with con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "z:\docs\MyDatabase.accdb"-ээр дуусгах con.Execute "Миний асуулга"

Exec-г зүгээр орхи.

Та мөн параметрүүдийг нэмж болно, энэ нь бага зэрэг хуучирсан боловч туслах болно:


0

Энэ нь хакердсан шинжтэй боловч та хүсэлт гаргаж болно. Өөрөөр хэлбэл, sql мөрийг дараах байдлаар солино.

SqlQuery = "QueryName-аас * СОНГОХ;"

Энэ програмыг ажиллуулахын өмнө та мэдээллийн сан байгаа эсэхийг шалгах хэрэгтэй Мэдээлэлд хандахаврагдсан, өөрөөр хэлбэл. Ctrl+S товчийг дарна уу (хэрэглэлтийг Access дээр ажиллуулахад хангалтгүй).


0

Би Access-д хадгалсан шинэчлэлтийн хүсэлтийг дараах байдлаар ажиллуулж чадсан:

Холболт."My_Update_Query_Alreaded_ad_Access", adExecuteNoRecords, adCmdStoredProc-г гүйцэтгэнэ

Энэ нь Access мэдээллийн бааз болон гүйцэтгэх мэдэгдлийн аль алинд нь асуулгын нэр дэх хоосон зайг доогуур зураасаар солих хүртэл алдаа гаргаж байсан.


0

Энэ хэлхээ үүсгэгдээд багагүй хугацаа өнгөрчээ. Хэрэв би бүх зүйлийг зөв ойлговол ашигтай зүйл нэмж болно. DAO эсвэл ADOBD-ээр дамжуулан VBA-д ажиллуулахын тулд ACCDB-д хадгалагдсан асуулгаас SQL-г ашиглах үйл явц болох OP-ийн тайлбарлаж буй нэрсийг би нэрлэсэн. Би түүнд "объект өмчийн үйлчилгээ үзүүлэгч" гэсэн нэр өгсөн, тэр ч байтугай миний тэмдэглэлд OPP товчлол, объектын нэрний угтвар/дагаврыг оруулсан.

Гол санаа нь ACCDB-д байгаа объект (ихэвчлэн асуулга) нь VBA-д ашиглах шаардлагатай шинж чанарыг (ихэвчлэн SQL) ил гаргадаг. Би зөвхөн SQL-г асуулгад оруулахын тулд функцийг цуглуулсан; доороос үзнэ үү. Анхааруулга: Уучлаарай, гэхдээ энэ бүхэн DAO-д байгаа, би ADODB-г тийм ч их ашигладаггүй. Эдгээр санаанууд танд хэрэгтэй хэвээр байна гэж найдаж байна.

Би эдгээр OPP асуулгын дагуу SQL-д сольж болох параметрүүдийг ашиглах/оруулах аргыг боловсруулах хүртэл явсан. Дараа нь би VBA-д SQL-г ашиглахаасаа өмнө VBA.Replace()-г ашиглан орлуулалт хийдэг.

ACCDB дахь SQL асуулгад хүрэх DAO объектын зам дараах байдалтай байна.

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

Би солих шаардлагатай параметрүүдийг үнэлж, бодит мэдээллийн санд байхгүй байж болох параметрийн ер бусын нэрийг сонгох замаар сольж болох параметрүүдийг ашигладаг. Ихэнх тохиолдолд миний хийсэн цорын ганц зүйл бол талбар эсвэл хүснэгтийн нэр эсвэл WHERE болон HAVING заалтуудын илэрхийлэл юм. Тиймээс би тэднийг "(ReplaceMe00000001)" гэх мэтээр дуудаж, дараа нь Replace() функцийг ашиглан ажлаа хийдэг...

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

дараа нь VBA дээр sqlText ашиглана уу. Ажлын жишээ энд байна:

Нийтийн функц MySQLLEINTER () DISPLETERS MYPLTERTERS MYPLTERTER-ийг STARTERTERTERS DILLEXTRESCREST MYPLTERTERCRESCROMES (MYQUETERTERTERTERTROMITERIETQUETQUETQUETQUESTERCROMERIETQUETION . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Дараа нь SQL-г ашиглана уу. db.Execute sqlText, dbFailOnError Төгсгөлийн Функц getSqlTextFromQuery(ByVal oppName As String) Asim.Daf String Dim програм DDAf Asim.Daf Asim. 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 Fun.SLd


Excel програмаас Access MakeTable дээр асуулга ажиллуулна уу

Надад автоматжуулах шаардлагатай Excel файл байна. Хэрэглэгч Excel тайланг нээх үед тэд өгөгдлийг сэргээхийг хүсэх болно. Хэрэв тэд тийм гэж хэлбэл би асуулга явуулах хэрэгтэй...


JS ActiveX ADO-аас MS Access 2013 дээр харагдах асуулга ашиглан VBA функцийг гүйцэтгэнэ

JS ActiveX ADO-аас MS Access 2013 дээр харах асуулга ашиглан VBA макро хэрхэн ажиллуулах вэ? VBA функцхүлээн авах зорилготой одоогийн хэрэглэгч, нэвтэрсэн: Нийтийн тунхаг...


Excel-ийн db-д хандах "функц" агуулсан хадгалсан хайлтыг гүйцэтгэнэ

Би excel vba-аас хандалтын мэдээллийн санд хадгалагдсан хайлтыг ажиллуулахыг оролдож байна. Хэрэв би үүнийг хандалтын мэдээллийн санд нээж ажиллуулбал энэ асуулга хэвийн ажилладаг боловч модулиас ажиллуулахад алдаа гардаг...


MS Access - Хадгалсан хүсэлтийг VBA-д нэрээр нь гүйцэтгэх

MS Access 2007 дээр хадгалсан хайлтыг VBA дээр хэрхэн гүйцэтгэх вэ? Би SQL-г VBA руу хуулж буулгахыг хүсэхгүй байна. Би хүсэлтийн нэрийг л гүйцэтгэхийг илүүд үздэг. Энэ ажиллахгүй... VBA асуулга олж чадахгүй байна....


VBA кодын ms-access дахь хүсэлтийг хэрхэн гүйцэтгэх вэ?

Өгөгдлийн сан дахь бүртгэлийг буцаахын тулд би хэрхэн асуулга ажиллуулж болох вэ? ms-хандалтын өгөгдөл VBA код ашиглаж байна уу?


Excel-ээс хандалтын хүсэлтийг ажиллуулж, параметрүүдийг дамжуулна уу

Excel VBA код эсвэл макроноос MS access db дээр асуулга хэрхэн ажиллуулах вэ. MS-Access хүсэлт нь Excel-ээс дамжуулах шаардлагатай зарим параметрүүдийг хүлээн авдаг. Баярлалаа


Access 2010 VBA-аас Excel ажлын номыг удирдах

Надад дараах нийтлэлтэй маш төстэй нөхцөл байдал тулгараад байна: Excel 2010 программ руу vba-аар дамжуулан график үүсгэх хүсэлт гаргаж байна. Миний хувьд би хүснэгт экспортлож байгаа боловч файлд илүү их зүйлийг хийхийг хүсч байна...


Access VBA-аас SQL Server Pass-through Query-г гүйцэтгэнэ

Надад Access 2007-д хадгалагдсан ШИНЭЧЛЭГДЭХ асуулга байна. Би нэвтрүүлэх асуулга дээр давхар товших үед энэ нь амжилттай хэрэгждэг. Би энэ асуулгыг VBA-аас хэрхэн гүйцэтгэх вэ? Би...


Excel-ээс VBA-ээр дамжуулан асар том өгөгдлийн багцыг Access руу импортлох

Надад Excel-ээс Access руу оруулах шаардлагатай асар том өгөгдлийн багц байна (~800 мянган мөр). Гэсэн хэдий ч би 90% гэх мэт тодорхой баганын утгатай мөрүүдийг үл тоомсорлож болно ...


Excel vba доторх MDX асуулга байна уу?

Excel VBA дотор MDX хайлт хийх арга бий юу? Би үүнийг SQL-тэй адил ADO-ээр хийж болно гэж бодсон (тиймээ, SQL нь MDX-ээс ялгаатай гэдгийг би мэднэ - энэ нь олон удаа тохиолддог асуудал ...

Access нь myQuery query builder ашиглан боловсруулсан асуулгыг хадгалсан. Өгөгдлийн сан нь ODBC холболтоор системд холбогдсон. Бүх макронууд багтсан болно.

Excel нь мэдээллийн сантай холбогдохын тулд ADODB холболтыг бий болгосон

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection with con .Provider = "Microsoft.ACE.OLEDB.12.0". "MyDatabase.accdb"-г нээнэ үү.

Ихэвчлэн та зүгээр л сайн ажилладаг SQL-ээ бичээд дараа нь иймэрхүү зүйлийг хий

Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = Шинэ ADODB.Recordset rs.Open sqlQuery, con, ...

Гэхдээ би хандалтын мэдээллийн санд хадгалсан асуулгад хандахыг хүсч байна. Тэгэхээр би саяхан холбосон өгөгдлийн сан дээр хадгалагдсан хайлтыг хэрхэн дуудах вэ.

Би аль хэдийн туршиж үзсэн

  1. con.Execute("EXEC myQuery"), гэхдээ энэ нь myQuery олдохгүй байгааг хэлсэн.
  2. rs. "myQuery"-г нээнэ үү, гэхдээ энэ нь хүчингүй бөгөөд үүнээс SELECT/etc хэллэг шаардлагатай.

5 хариулт

Та үүнийг хадгалагдсан процедур гэж бодож болно гэж би бодож байна.

Хэрэв бид Dim sqlQuery As String-ийн өмнө эхлэх юм бол

Cmd-г шинэ ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

Үүний дараа бичлэгийн багцтай ажлаа аваарай.

Та бараг тэнд байсан

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection with con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "z:\docs\MyDatabase.accdb"-ээр дуусгах con.Execute "Миний асуулга"

Зүгээр л Exec-г орхи.

Та мөн параметрүүдийг нэмж болно, энэ нь бага зэрэг хуучирсан боловч туслах болно: Access мэдээллийн баазын 2 талбарыг Excel өгөгдөл болон магадгүй макро ашиглан шинэчлэх

Би Access-д хадгалсан шинэчлэлтийн хүсэлтийг дараах байдлаар ажиллуулж чадсан:

Холболт."My_Update_Query_Alreaded_ad_Access", adExecuteNoRecords, adCmdStoredProc-г гүйцэтгэнэ

Энэ нь Access мэдээллийн бааз болон гүйцэтгэх мэдэгдлийн аль алинд нь асуулгын нэр дэх хоосон зайг доогуур зураасаар солих хүртэл алдаа гаргаж байсан.

Энэ нь хакердсан ажил боловч та хүсэлт гаргаж болно. Өөрөөр хэлбэл, SQL мөрийг дараах байдлаар солино.

SqlQuery = "QueryName-аас * СОНГОХ;"

Эхлэхээсээ өмнө та Access мэдээллийн сан хадгалагдсан эсэхийг шалгах хэрэгтэй, i.e. Ctrl + S товчийг дарна уу (хэрэглэлтийг Access дээр гүйцэтгэхэд хангалтгүй).

Энэ сэдвийг үүсгээд багагүй хугацаа өнгөрчээ. Хэрэв би зөв ойлговол ашигтай зүйл нэмж оруулах боломжтой. Би OP-ийн тайлбарлаж буй нэрсийг өгсөн: энэ нь DAO эсвэл ADOBD-ээр дамжуулан VBA-д ажиллуулахын тулд ACCDB-д хадгалагдсан асуулгаас SQL-г ашиглах үйл явц юм. Би үүнийг "Object Property Provider" гэж нэрлэсэн, тэр ч байтугай миний тэмдэглэлд OPP товчлол болон объектын нэрийн угтвар/дагаврыг ашигласан.

Гол санаа нь ACCDB-д байгаа объект (ихэвчлэн асуулга) нь VBA-д ашиглах шаардлагатай шинж чанарыг (ихэвчлэн SQL) ил гаргадаг. Би зөвхөн SQL-г асуулгад оруулахын тулд функцийг нэгтгэсэн; Доор үзнэ үү. Анхааруулга: Уучлаарай, гэхдээ энэ бүхэн DAO-д байгаа, би ADODB-г тийм ч их ашигладаггүй. Танд санаанууд хэрэгтэй хэвээр байна гэж найдаж байна.

Би эдгээр OPP асуулгын дагуу SQL-д сольж болох параметрүүдийг ашиглах/оруулах аргыг боловсруулах хүртэл явсан. Дараа нь би VBA-д SQL-г ашиглахаасаа өмнө VBA.Replace()-г ашиглан орлуулалт хийдэг.

ACCDB дахь SQL асуулгад хүрэх DAO объектын зам дараах байдалтай байна.

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

Би солих шаардлагатай параметрүүдийг үнэлж, бодит мэдээллийн санд байхгүй байж болох параметрийн ер бусын нэрийг сонгох замаар сольж болох параметрүүдийг ашигладаг. Ихэнх тохиолдолд миний хийсэн цорын ганц орлуулалт бол талбар эсвэл хүснэгтийн нэр эсвэл WHERE болон HAVING өгүүлбэрийн илэрхийллүүд юм. Тиймээс би тэднийг "(ReplaceMe00000001)" гэх мэтээр дуудаж, дараа нь Replace() функцийг ашиглан ажлаа хийдэг...

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

Дараа нь VBA дээр sqlText ашиглана уу. Ажлын жишээ энд байна:

Нийтийн функц MySQLLEINTER () DISPLETERS MYPLTERTERS MYPLTERTER-ийг STARTERTERTERS DILLEXTRESCREST MYPLTERTERCRESCROMES (MYQUETERTERTERTERTROMITERIETQUETQUETQUETQUESTERCROMERIETQUETION . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Дараа нь SQL-г ашиглана уу. db.Execute sqlText, dbFailOnError Төгсгөлийн Функц getSqlTextFromQuery(ByVal oppName As String) Asim.Daf String Dim програм DDAf Asim.Daf Asim. 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 Fun.SLd

Энэ хичээлийг зориулав SQL асуулгамэдээллийн сан руу VBA хандалт. Бид VBA дахь өгөгдлийн санд INSERT, UPDATE, DELETE асуулга хэрхэн хийгддэгийг судлах ба SELECT асуулгаас тодорхой утгыг хэрхэн авах талаар суралцах болно.

Программчлагдсан хүмүүс VBA хандалтмөн суурьтай ажиллах үед SQL өгөгдөлсерверүүд нь INSERT, UPDATE эсвэл энгийн SQL SELECT асуулга гэх мэт мэдээллийн сан руу SQL асуулга илгээх гэх мэт энгийн бөгөөд шаардлагатай ажилтай байнга тулгардаг. Бид шинэхэн програмистууд учраас үүнийг хийх чадвартай байх ёстой, тиймээс өнөөдөр бид үүнийг хийх болно.

Мэдээлэл авах сэдвийг бид аль хэдийн хөндсөн SQL сервер, Тэд энэ өгөгдлийг олж авахын тулд VBA-д код бичсэн, жишээлбэл, MSSql 2008-аас текст файл руу өгөгдөл байршуулах тухай нийтлэлд эсвэл Access-ээс Word болон Excel загварт өгөгдөл байршуулах тухай материалд бага зэрэг хөндөв. Ямар нэг байдлаар бид үүнийг өнгөцхөн харсан бөгөөд өнөөдөр би энэ талаар бага зэрэг дэлгэрэнгүй ярихыг санал болгож байна.

Анхаар! Доорх бүх жишээг Access 2003 ADP төсөл болон MSSql 2008 мэдээллийн санг ашиглан авч үзсэн болно.Хэрэв та ADP төсөл гэж юу болохыг мэдэхгүй байгаа бол бид үүнийг Access ADP төслийг хэрхэн үүсгэх, тохируулах тухай материалаас харлаа.

Жишээ нь эх сурвалж мэдээлэл

Бидэнд жилийн саруудын тоо, нэрийг агуулсан тест_хүснэгт байгаа гэж бодъё (асуултуудыг ашиглан гүйцэтгэнэ. Менежментийн студи)

CREATE TABLE .( NULL БИШ, (50) NULL) ON GO

Миний хэлсэнчлэн бид MS SQL 2008-тай ажиллахаар тохируулсан ADP төслийг ашиглах болно, үүнд би тестийн маягт үүсгэж, гарын үсэг бүхий эхлүүлэх товчийг нэмсэн. "Гүйх", энэ нь бидний кодыг шалгах шаардлагатай болно, i.e. Бид бүх кодыг үйл явдлын зохицуулагч дээр бичих болно. Товч дарах».

Өгөгдлийн сангийн асуулга VBA дахь INSERT, UPDATE, DELETE

Хэт удаан саатахгүйн тулд шууд эхэлцгээе, бид туршилтын хүснэгтэд мөр нэмэх хэрэгтэй гэж бодъё ( код тайлбар хийсэн)/

Private Sub start_Click() "Асуулгын мөрийг хадгалах хувьсагчийг зарлах Dim sql_query String хэлбэрээр "Бидэнд хэрэгтэй асуулгыг бичнэ үү sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "June")" "Гүйцэтгэх Энэ DoCmd.RunSQL sql_query End Sub

Энэ тохиолдолд одоогийн өгөгдлийн сангийн холболтын параметрүүдийг ашиглан хайлтыг гүйцэтгэнэ. Бид өгөгдөл нэмэгдсэн эсэхийг шалгаж болно.

Таны харж байгаагаар өгөгдөл оруулсан байна.

Нэг мөрийг устгахын тулд бид дараах кодыг бичнэ.

Private Sub start_Click() "Dim sql_query хайлтын мөрийг мөр болгон хадгалах хувьсагчийг зарлах "Түүнд устгах асуулга бичих sql_query = "test_table-г УСТГАХ WHERE id = 6" "Үүнийг ажиллуулна DoCmd.RunSQL sql_query End

Хэрэв бид шалгавал бид үүнийг харах болно шаардлагатай шугамзүүн.

Өгөгдлийг шинэчлэхийн тулд sql_query хувьсагч руу шинэчлэх хүсэлтийг бичнэ үү, утга нь тодорхой байна гэж найдаж байна.

VBA дахь өгөгдлийн сангийн SELECT асуулга

Энд бусад SQL бүтээцтэй харьцуулахад арай илүү сонирхолтой байдаг.

Нэгдүгээрт, бид хүснэгтээс бүх өгөгдлийг авах хэрэгтэй гэж бодъё, жишээлбэл, бид үүнийг боловсруулж, мессежээр харуулах болно, та мэдээж үүнийг өөр зорилгоор ашиглаж болно, үүний тулд бид дараахь зүйлийг бичнэ. код

Private Sub start_Click() "Хувьсагчийг зарлах "Өгөгдлийн сангийн багц бичлэгийн хувьд Dim RS As ADODB.Recordset "Query string Dim sql_query As String "Мессеж дэх хураангуй өгөгдлийг харуулах мөр Dim str As String "Бичлэгт зориулж шинэ объект үүсгэх set RS = New ADODB .Recordset "Query line sql_query = "SELECT id, name_mon FROM test_table" "Одоогийн төслийн холболтын тохиргоог ашиглан асуулга ажиллуулна уу RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Бичлэгүүдээр давталт хийх ( RS.EOF) "Мессежийг харуулах хувьсагчийг бөглөнө үү str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline "дараагийн бичлэг рүү очно уу RS.MoveNext Wend " msgbox str End Sub мессежийг гарга

Энд бид бүртгэлийнхээ бүх утгыг давтахын тулд VBA хандалтын гогцоо ашиглаж байна.

Гэхдээ ихэнхдээ олон тооны бичлэгээс бүх утгыг авах шаардлагагүй, харин зөвхөн нэгийг нь, жишээлбэл, сарын нэрийг кодоор нь авах шаардлагатай байдаг. Үүнийг хийхийн тулд гогцоо ашиглах нь нэлээд үнэтэй тул бид зүгээр л нэг утгыг буцаах асуулга бичиж, түүнд хандах боломжтой, жишээлбэл, бид 5 кодыг ашиглан сарын нэрийг авах болно.

Private Sub start_Click() "Хувьсагчийг зарлах" Өгөгдлийн сангийн багц бичлэгийн хувьд Dim RS As ADODB.Recordset "Query string Dim sql_query As String "Төгсгөлийн утгыг харуулах мөр Dim str As String "Бүртгэлд зориулж шинэ объект үүсгэх RS. = Шинэ ADODB.Recordset "Асуулгын мөр sql_query = "Test_table WHERE id = 5 FROM name_mon SELECT" "Одоогийн төслийн холболтын тохиргоог ашиглан асуулга ажиллуулна уу RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Бидний утгыг авах str = RS. Fields(0) msgbox str End Sub

Нийтлэг байдлын хувьд бид энд аль хэдийн эсийн нэрээр биш, харин индексээр нь авч үзсэн болно. 0 бөгөөд энэ нь хамгийн анхны утга юм Бичлэгийн багц, эцэст нь бид үнэ цэнийг авсан "Тавдугаар сар".

Таны харж байгаагаар бүх зүйл маш энгийн. Хэрэв та ихэвчлэн мэдээллийн сангаас тодорхой утгыг авах шаардлагатай бол ( сүүлчийн жишээн дээрх шиг), дараа нь би бүх кодыг тусдаа функц болгон гаргахыг зөвлөж байна (VBA Access 2003 дээр функцийг хэрхэн бичих вэ) нэг оролтын параметртэй, жишээлбэл, сарын код ( Хэрэв бид өөрсдийн жишээг авч үзвэл) бөгөөд энэ утгыг харуулах шаардлагатай бол бидэнд шаардлагатай функцийг шаардлагатай параметрээр дууд, тэгээд л болоо, үүнийг хийснээр бид VBA кодыг эрс багасгаж, програмынхаа ойлголтыг сайжруулах болно.

Өнөөдрийн хувьд энэ л байна. Амжилт хүсье!

Хандалт нь SQL асуулгын мөрүүдийг программчлан үүсгэх боломжийг олгодог, мөн маягт, тайлан гэх мэт шинж чанаруудын утгын үүрэг гүйцэтгэдэг мөрүүдийг, мөн тэдгээрт тохирох ёстой функцийн параметрүүд гэх мэт. SQL синтакс. Үүний зэрэгцээ, ийм мөрөнд орсон тогтмолуудыг SQL дүрмийн дагуу форматлах ёстой гэдгийг санах хэрэгтэй, тухайлбал:

  • тоонуудын аравтын ялгагч нь цэг байх ёстой,
  • тэмдэгт мөрүүд нь хашилт эсвэл таслах тэмдэг дотор байх ёстой (мөн ишлэл эсвэл хасах тэмдэг нь мөр дотор хоёр дахин нэмэгддэг),
  • Огноог хэш тэмдгээр хавсаргаж, Америк форматаар (мм/дд/жжж) зааглагчаар налуу зураасаар бичсэн байх ёстой.

    Хэрэв үүнийг зөрчсөн бол дараахь үр дагавар гарч болзошгүй.

  • Цэгний оронд таслалтай 10.5 гэх мэт тоо нь 10 ба 5 гэсэн хоёр тооны жагсаалт гэж ойлгогдох бөгөөд энэ нь талбаруудын тоонд зарим төрлийн зөрүү гарахад хүргэдэг.
  • Вася шиг хашилт, таслах тэмдэггүй мөрийг тухайн талбар байгаа бол тухайн талбарын нэр эсвэл нэн даруй хүсэх параметрийн нэр гэж ойлгох болно.
  • 1/2/2010 эсвэл 1-2-2010 зэрэг хэш тэмдэггүй огноог арифметик илэрхийлэл гэж үзнэ (хуваах, хасах үйлдэлтэй),
  • 1.2.2010 шиг огноог хоёр аравтын бутархай тоо гэж тайлбарлах бөгөөд алдаа гарах болно,
  • хэш тэмдэгтэй огноог америк форматаар биш, огноо гэж хүлээн зөвшөөрөх боловч өөр (өдөр, сарыг дахин тохируулах болно).

    Хэсэг бүрийн доор SQL мөрийн жишээг хэзээ гаргах ёстой програм хангамж бий болгох, дараа нь үүнийг үүсгэгч VBA код. Доорх нь маш хэрэгтэй зөвлөмж юм.

    1. Тоо ашиглах

    * ХҮСНЭГТЭЭС СОНГОХ (((Хүснэгт .Тоо хэмжээ)= 12 .197 ));
    VBA v1

    Dim q As Single q = 12 .197 strSQL = "СОНГОХ * " _ & "Хүснэгтээс" _ & "ХАААН (((Хүснэгт.Тоо хэмжээ)=" & q & "));"
    VBA v2

    Dim q As String q = "12,197" strSQL = "SELECT * " _ & "FROM Хүснэгт" _ & "WHERE (((Хүснэгт.Тоо хэмжээ)=" & Str (q) & "));"
    Жич:

  • VBA v1- бүхэл тоонуудын хувьд. Бутархай тоонуудын хувьд энэ нь зөвхөн системийн тусгаарлагч нь цэг байх үед онцгой тохиолдол юм.
  • VBA v2- илүү зөв сонголт, учир нь сонгодог програмчлалд зөвхөн тэмдэгт мөрүүдийг мөртэй холбож болдог бол VBA v1 нь далд төрлийн хөрвүүлэлтийг ашигладаг боловч бүхэл тоонуудын хувьд энэ аргын талаар гомдол гараагүй байна. (Системийн хязгаарлагч нь таслал байх үед жишээг өгсөн болно.)
  • Заримдаа CStr() функцийг хөрвүүлэхэд ашигладаг боловч энэ нь үргэлж хэрэглэгдэхгүй, учир нь тоог мөр болгон буцаадаг бөгөөд энэ нь системийн хязгаарлагчаар бичигддэг бол SQL нь зөвхөн цэгийг хязгаарлагч болгон хүлээн зөвшөөрдөг.
  • NB!Ердийн бус систем тусгаарлагчийг ашиглах үед дээрх жишээнүүд ажиллахгүй байж магадгүй бөгөөд эдгээр тохиолдолд та системийн тусгаарлагчийг програмын дагуу цэгээр солих хэрэгтэй. Системийн хязгаарлагчийг буцаадаг функцийг доор харуулав.
    Функц GetDecimalSeparator() мөр хэлбэрээр GetDecimalSeparator = Формат ( 0 #, "." ) Төгсгөлийн функц Мөн зарим стандарт хандалтын үйлдлүүд энэ тохиолдолд ажиллахгүй байж болохыг анхаарна уу.

    2. Мөр ашиглах

    СОНГОХ * Хүснэгтээс WHERE (((Хүснэгт .Нэр)="Бүгд" ));
    VBA v1

    Dim q As String q = "All" strSQL = "SELECT * " _ & "FROM Хүснэгт" _ & "WHERE ((((Хүснэгт.Тоо хэмжээ)=" "" & DoubleQuote(q) & "" "));"
    VBA v2

    Dim q As String q = "Бүгд" strSQL = "SELECT * " _ & "FROM Хүснэгт" _ & "ХАААН (((Хүснэгт.Тоо хэмжээ)="" & DoubleApostrophe(q) & "" ));"
    Жич:

  • VBA v1: DoubleQuote() - хоёр дахин нэмэгддэг функц ишлэл.

    Жишээ:
    дээж авах нөхцөл:
    a"a"s SQL:
    WHERE талбар = a""a"s"VBA:
    strWhere = " WHERE талбар=""" & "a""""a"s" & """ "

  • VBA v2:: DoubleApostrophe() - хоёр дахин нэмэгддэг функц апостроф.

    Жишээ:
    дээж авах нөхцөл:
    a"a"s SQL:
    WHERE талбар = a"a""s"VBA:
    strWhere = " WHERE талбар =" & "a""a""s" & "" "

  • Дээр дурдсан DoubleQuote болон DoubleApostrophe функцууд нь суулгасан Access функцүүд БИШ, харин хэрэглэгчийн тодорхойлсон функцууд бөгөөд тэдгээрийн хэрэгжилтийг програмистын үзэмжээр үлдээдэг. Ялангуяа Access 2000 ба түүнээс дээш хувилбаруудад та энэ зорилгоор суулгасан Replace функцийг ашиглаж болно, 97 ба түүнээс доош хувилбарт та энэ функцийг ашиглаж болно:

    Нийтийн функц Replace97(StrMain As String , StrFind As String , StrZam As String ) As String On Error GoTo err Dim pos As Long Хэрэв StrFind = "" Дараа нь GoTo err Хэрэв StrMain = "" Дараа нь Replace97 = StrZam: Гарах функцийг InStr( 1 , StrMain, StrFind) = 0 pos = InStr( 1 , StrMain, StrFind) StrMain = дунд (StrMain, 1 ,pos- 1 ) & StrZam & mid (StrMain, pos + Len(StrFind), Len(StrMain)) Loop Replace97 = StrMain Гарах функц алдаа: Replace97 = StrMain төгсгөлийн функц
    3. Огноо ашиглах

    * ХҮСНЭГТЭЭС СОНГОХ (((Хүснэгт .TimeOpen)=# 3 /31 /2003 11 :17 :19 #));
    VBA

    Dim q As Date q = Now strSQL = "SELECT * " _ & "FROM Table" _ & "WHERE (((Table.TimeOpen)=#" & Format (q, "mm\/dd\/yy hh\:mm" \:ss" ) & "#)))"
    Жич:

  • Microsoft JET SQL нь америк форматаар огноогоор ажилладаг, i.e. яг дээрх хэлбэрээр Сар/Өдөр/Жил.
  • # тэмдэгтүүдийг бүү орхи (энэ нь огноо цагийн тогтмолыг бүхэлд нь хавсаргана) болон \ (энэ нь / болон :-г Формат функцийн хийх хандлагатай байдаг бөгөөд энэ нь локал тохиргоогоор солигдохоос сэргийлдэг. зөв ажиллагаа SQL командууд).
  • Эндээс уншихыг зөвлөж байна: огноо / цагийг хадгалах аргуудын талаар.
  • NB!Та огноог бүхэл тоо (эсвэл урт) болгон хөрвүүлэхийг ашиглах ёсгүй, учир нь Access болон SQL Server дээр өөр өөр тоонууд ижил огноотой таарч байгаа бөгөөд харьцуулж үзвэл та гэнэтийн үр дүнд хүрч чадна.

    агуулсан ийм мөрийг зохиосон байх SQL тушаал, мөн гүйцэтгэхээр илгээх нь алдаа гаргаж болзошгүй. Энэ тохиолдолд дибаг хийх цонхонд энэ мөрийг хэвлээд нүдээрээ хар. Магадгүй алдаа тэр даруй таны анхаарлыг татах болно. Хэрэв энэ нь ажиллахгүй бол асуулга зохион бүтээгч дээр шинэ асуулга үүсгэж, SQL горим руу шилжиж, асуулгын текстийг оруулаад ажиллуулна уу. Хэрэв алдаа гарсан бол энэ нь илүү тодорхой харагдах болно.