Volanie dotazu sql z prístupového kódu vba. Generovanie reťazca dotazu SQL vo VBA. Dotazy do databázy INSERT, UPDATE, DELETE vo VBA

Prístup uložil dotaz vyvinutý pomocou nástroja na tvorbu dotazov s názvom „myQuery“. Databáza je pripojená k systému prostredníctvom pripojenia ODBC. Všetky makrá sú zahrnuté.

Excel má ADODB pripojenie na pripojenie k databáze cez

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = Nové ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Otvoriť "MyDatabase.accdb" End with

Zvyčajne pokračujete a jednoducho napíšete svoje SQL, čo je úplne v poriadku, a potom urobíte niečo podobné

Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = New ADODB.Recordset rs.Open sqlQuery, con, ...

Chcem však získať prístup k dotazu, ktorý mám uložený v prístupovej databáze. Ako teda môžem zavolať uložený dotaz v databáze, ku ktorej som sa práve pripojil.

Už to vyskúšané

  1. con.Execute("EXEC myQuery") ale ten mi povedal, že to nemôže byť find myQuery.
  2. rs.Open "myQuery", con ale tento je neplatný a chce od neho príkazy SELECT /etc
vba excel-vba ms-access-2007 adodb excel

5 odpovedí


6

Myslím, že si to môžete predstaviť ako uloženú procedúru.

Ak začneme tesne pred Dim sqlQuery As String

Dim cmd ako nový ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

Potom vezmite svoju prácu so súbormi záznamov.


1

Boli ste skoro tam:

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = Nové ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Otvoriť "z:\docs\MyDatabase.accdb" End with con.Execute "MyQuery"

Nechajte Exec bokom.

Môžete tiež pridať parametre, je to trochu zastarané, ale malo by pomôcť:


0

Je to akýsi hack, ale môžete si to vyžiadať. To znamená, že nahraďte riadok sql nasledujúcim:

SqlQuery = "SELECT * FROM QueryName;"

Pred spustením tohto programu sa musíte uistiť, že databáza Prístupové údaje bol zachránený tj. stlačte Ctrl+S (nestačí, aby bol dotaz spustený v Accesse).


0

Podarilo sa mi spustiť aktualizačný dotaz, ktorý už bol uložený v Accesse pomocou:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

To mi spôsobovalo chyby, kým som nenahradil medzery v názve dotazu podčiarkovníkmi v databáze programu Access aj v príkaze na vykonanie.


0

Je to už dávno, čo toto vlákno vzniklo. Ak všetkému správne rozumiem, môžem pridať niečo užitočné. Pomenoval som to, čo OP popisuje, čo je proces použitia SQL z dotazu uloženého v ACCDB, ktorý sa má spustiť vo VBA cez DAO alebo ADOBD. Dal som mu názov „poskytovateľ vlastníctva objektu“ aj so skratkou OPP v poznámkach a predponou/príponou pre názov objektu.

Ide o to, že existujúci objekt v ACCDB (zvyčajne dotaz) odhaľuje vlastnosť (zvyčajne SQL), ktorú je potrebné použiť vo VBA. Zostavil som funkciu len na vysávanie SQL z dopytov na to; Pozri nižšie. Upozornenie: Prepáčte, ale toto všetko je v DAO, ADODB moc nepoužívam. Dúfam, že tieto nápady stále považujete za užitočné.

Dokonca som zašiel tak ďaleko, že som vyvinul metódu na používanie/vkladanie vymeniteľných parametrov v SQL, ktoré pochádzajú z týchto OPP dotazov. Potom použijem VBA.Replace() na nahradenie pred použitím SQL vo VBA.

Cesta objektu DAO k dotazu SQL v ACCDB je nasledovná:

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

Používam vymeniteľné parametre tak, že vyhodnotím, čo je potrebné nahradiť, a zvolím nezvyčajný názov pre parameter, ktorý nemusí existovať v skutočnej databáze. Z väčšej časti sú jedinými náhradami, ktoré som urobil, názvy polí alebo tabuliek alebo výrazy klauzúl WHERE a HAVING. Takže im hovorím veci ako "(ReplaceMe00000001)" a potom použijem funkciu Replace() na vykonanie úlohy...

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

a potom použite sqlText vo VBA. Tu je pracovný príklad:

Verejná funkcia MySqlThing() Dim sqlText ako reťazec Dim myParamater ako reťazec Dim myExpression ako reťazec "Nastaviť všetko. sqlText = getSqlTextFromQuery("myQuery") myParameter = "(ReplaceMe00000001)" myExpression = "Something12Do17Some" . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Potom použite SQL. db.Execute sqlText, dbFailOnError End Function getSqlTextFromQuery(ByVal oppName As String) As String Dim app As Access.Application Dim Database As Ddefs 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 = qdef.SQL End Function


Spustite dotaz v Access MakeTable z Excelu

Mám súbor Excel, ktorý potrebujem zautomatizovať. Keď používateľ otvorí zostavu programu Excel, zobrazí sa výzva na obnovenie údajov. Ak povedia áno, musím spustiť dotaz...


Vykonajte funkciu VBA prostredníctvom dotazu na zobrazenie v MS Access 2013 z JS ActiveX ADO

Ako spustiť makro VBA prostredníctvom dotazu na zobrazenie v MS Access 2013 z JS ActiveX ADO? Funkcia VBA určené na prijatie súčasný užívateľ, prihlásený pomocou: Verejné vyhlásenie...


Vykonajte uložený dotaz obsahujúci "funkciu" v access db z excelu

Snažím sa spustiť dotaz uložený v prístupovej databáze z excel vba. Dotaz funguje dobre, ak ho otvorím a spustím v databáze prístupu, ale pri spustení z modulu vyvolá chybu...


MS Access - Spustite uložený dotaz podľa názvu vo VBA

Ako vykonať uložený dotaz v MS Access 2007 vo VBA? Nechcem kopírovať a vkladať SQL do VBA. Radšej vykonám len názov požiadavky. Toto nebude fungovať... VBA nemôže nájsť dopyt....


Ako vykonať požiadavku v ms-access v kóde VBA?

Ako môžem spustiť dotaz na vrátenie záznamov v databáze ms-access dáta pomocou kódu VBA?


Spustite žiadosť o prístup z programu Excel a odovzdajte jej parametre

Ako spustiť dotaz v MS access db z kódu Excel VBA alebo makra. Požiadavka MS-Access akceptuje niektoré parametre, ktoré je potrebné odovzdať z Excelu. Ďakujem


Správa excelového zošita z Accessu 2010 VBA

Mám situáciu veľmi podobnú nasledujúcemu príspevku: Žiadosť o prístup do excelu 2010 na vytvorenie grafu cez vba V mojom prípade exportujem tabuľku, ale so súborom chcem urobiť oveľa viac...


Vykonajte prechodový dotaz SQL Server z Accessu VBA

Mám UPDATE pass through dotaz uložený v Accesse 2007. Keď dvakrát kliknem na pass through dotaz, vykoná sa úspešne. Ako môžem dosiahnuť, aby sa tento dotaz vykonal z VBA? ja by som...


Importovanie obrovskej množiny údajov do Accessu z Excelu cez VBA

Mám obrovský súbor údajov, ktorý potrebujem importovať z Excelu do Accessu (~ 800 000 riadkov). Môžem však ignorovať riadky s konkrétnou hodnotou stĺpca, ktoré sú ako 90%...


Nejaký dotaz MDX v programe Excel vba?

existuje spôsob, ako vykonať dotaz MDX v programe Excel VBA? Myslel som, že by sa to dalo urobiť cez ADO, rovnako ako pri SQL (áno, viem, že SQL sa líši od MDX - problém, ktorý sa mnohokrát...

Access uložil dotaz, ktorý bol vyvinutý pomocou nástroja na tvorbu dotazov myQuery. Databáza je pripojená k systému prostredníctvom pripojenia ODBC. Všetky makrá sú zahrnuté.

Excel vytvoril ADODB pripojenie na pripojenie k databáze cez

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = Nové ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Otvoriť "MyDatabase.accdb" End with

Zvyčajne stačí napísať svoj SQL, ktorý funguje skvele, a potom urobiť niečo ako

Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = New ADODB.Recordset rs.Open sqlQuery, con, ...

Chcem však získať prístup k dotazu, ktorý mám uložený v databáze prístupu. Ako teda zavolám uložený dotaz v databáze, ku ktorej som sa práve pripojil.

Už som to skúšal

  1. con.Execute("EXEC myQuery"), ale to mi povedalo, že myQuery sa nepodarilo nájsť.
  2. rs.Open "myQuery", ale je neplatný a vyžaduje od neho príkazy SELECT/atď

5 odpovedí

Myslím, že si to môžete predstaviť ako uloženú procedúru.

Ak začneme tesne pred Dim sqlQuery As String

Dim cmd ako nový ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

Potom si vyzdvihnite svoju prácu so sadou záznamov.

Už si bol skoro tam

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = Nové ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Otvoriť "z:\docs\MyDatabase.accdb" End with con.Execute "MyQuery"

Nechajte Exec.

Môžete tiež pridať parametre, je to trochu zastarané, ale malo by to pomôcť: Aktualizujte 2 polia v databáze programu Access pomocou údajov programu Excel a možno aj makra

Podarilo sa mi spustiť aktualizačný dotaz, ktorý už bol uložený v Accesse pomocou:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

To mi spôsobovalo chyby, kým som nenahradil medzery v názve dotazu podčiarkovníkmi v databáze programu Access aj v príkaze na vykonanie.

Je to druh hackerskej práce, ale môžete požiadať o žiadosť. To znamená, že nahraďte riadok SQL nasledujúcim:

SqlQuery = "SELECT * FROM QueryName;"

Pred spustením sa musíte uistiť, že databáza Accessu bola uložená, t.j. stlačte Ctrl + S (nestačí, aby sa dotaz vykonal v Accesse).

Už je to dávno, čo táto téma vznikla. Ak som správne pochopil, možno by som mohol pridať niečo užitočné. Pomenoval som to, čo OP popisuje: toto je proces použitia SQL z dotazu uloženého v ACCDB, ktorý sa má spustiť vo VBA cez DAO alebo ADOBD. Nazval som to „Poskytovateľ vlastníctva objektu“, dokonca aj so skratkou OPP v poznámkach a pre predponu/príponu názvu objektu.

Ide o to, že existujúci objekt v ACCDB (zvyčajne dotaz) odhaľuje vlastnosť (zvyčajne SQL), ktorú je potrebné použiť vo VBA. Dal som dohromady funkciu len na vysávanie SQL z dopytov na to; Pozri nižšie. Upozornenie: Prepáčte, ale toto všetko je v DAO, ADODB moc nepoužívam. Dúfam, že vám nápady budú stále užitočné.

Dokonca som zašiel tak ďaleko, že som vyvinul metódu na používanie/vkladanie vymeniteľných parametrov v SQL, ktoré pochádzajú z týchto OPP dotazov. Potom použijem VBA.Replace() na nahradenie pred použitím SQL vo VBA.

Cesta objektu DAO k dotazu SQL v ACCDB je nasledovná:

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

Používam vymeniteľné parametre tak, že vyhodnotím, čo je potrebné nahradiť, a zvolím nezvyčajný názov pre parameter, ktorý nemusí existovať v skutočnej databáze. Väčšinou sú jedinými náhradami, ktoré som urobil, názvy polí alebo tabuliek alebo výrazy klauzúl WHERE a HAVING. Takže im hovorím veci ako "(ReplaceMe00000001)" a potom použijem funkciu Replace() na vykonanie úlohy...

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

A potom použite sqlText vo VBA. Tu je pracovný príklad:

Verejná funkcia MySqlThing() Dim sqlText ako reťazec Dim myParamater ako reťazec Dim myExpression ako reťazec "Nastaviť všetko. sqlText = getSqlTextFromQuery("myQuery") myParameter = "(ReplaceMe00000001)" myExpression = "Something12Do17Some" . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Potom použite SQL. db.Execute sqlText, dbFailOnError End Function getSqlTextFromQuery(ByVal oppName As String) As String Dim app As Access.Application Dim Database As Ddefs 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 = qdef.SQL End Function

Táto lekcia je venovaná SQL dotazy do databázy na Prístup VBA. Pozrieme sa na to, ako sa vo VBA robia dotazy INSERT, UPDATE, DELETE do databázy a tiež sa dozvieme, ako získať konkrétnu hodnotu z SELECT dotazu.

Tí, ktorí programujú v Prístup VBA a pri práci so základňou SQL dáta servery sa veľmi často stretávajú s takou jednoduchou a nevyhnutnou úlohou, ako je odoslanie SQL dotazu do databázy, či už je to INSERT, UPDATE alebo jednoduchý SQL SELECT dotaz. A keďže sme začínajúci programátori, mali by sme to zvládnuť aj my, takže dnes to urobíme.

Už sme sa dotkli témy získavania údajov z SQL server, kde napísali kód vo VBA na získanie týchto údajov napríklad v článku o Nahrávaní údajov do textového súboru z MSSql 2008 alebo sa toho trochu dotkli aj v materiáli Nahrávanie údajov z Accessu do šablóny Word a Excel, ale tak či onak sme sa na to pozreli povrchne a dnes o tom navrhujem hovoriť trochu podrobnejšie.

Poznámka! Všetky nižšie uvedené príklady sú zvažované s použitím projektu Access 2003 ADP a databázy MSSql 2008. Ak neviete, čo je projekt ADP, potom sme sa na to pozreli v materiáli Ako vytvoriť a nakonfigurovať projekt Access ADP

Zdrojové údaje pre príklady

Povedzme, že máme tabuľku test_table, ktorá bude obsahovať čísla a názvy mesiacov v roku (dotazy sa vykonávajú pomocou Manažérske štúdio)

VYTVORIŤ TABUĽKU .( NOT NULL, (50) NULL) ON GO

Ako som už povedal, použijeme projekt ADP nakonfigurovaný na prácu s MS SQL 2008, v ktorom som vytvoril testovací formulár a pridal tlačidlo štart s podpisom "beh", ktorý budeme potrebovať na otestovanie nášho kódu, t.j. Celý kód napíšeme do obsluhy udalosti " Stlačenie tlačidla».

Dotazy do databázy INSERT, UPDATE, DELETE vo VBA

Aby sme príliš nezdržiavali, začnime hneď, povedzme, že potrebujeme pridať riadok do našej testovacej tabuľky ( kód komentovaný)/

Private Sub start_Click() "Deklarovať premennú na uloženie reťazca dotazu Dim sql_query As String "Zapíšte do nej dotaz, ktorý potrebujeme sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "June")" "Vykonať to DoCmd RunSQL sql_query End Sub

V tomto prípade sa dotaz vykoná pomocou aktuálnych parametrov pripojenia k databáze. Môžeme skontrolovať, či boli údaje pridané alebo nie.

Ako vidíte, údaje boli vložené.

Aby sme odstránili jeden riadok, napíšeme nasledujúci kód.

Private Sub start_Click() "Deklarujte premennú na uloženie reťazca dotazu Dim sql_query As String "Napíšte do nej mazací dotaz sql_query = "DELETE test_table WHERE id = 6" "Spustite DoCmd.RunSQL sql_query End Sub

Ak to skontrolujeme, uvidíme požadovaný riadok vľavo.

Ak chcete aktualizovať údaje, napíšte požiadavku na aktualizáciu do premennej sql_query, dúfam, že význam je jasný.

SELECT dotaz do databázy vo VBA

Tu sú veci o niečo zaujímavejšie ako pri iných konštruktoch SQL.

Najprv povedzme, že potrebujeme získať všetky údaje z tabuľky a napríklad ich spracujeme a zobrazíme v správe a vy ich, samozrejme, môžete použiť na iné účely, na tento účel napíšeme nasledovné kód

Private Sub start_Click() "Deklarovať premenné "Pre množinu záznamov z databázy Dim RS As ADODB.Recordset "Reťazec dopytu Dim sql_query As String "Reťazec pre zobrazenie súhrnných údajov v správe Dim str As String "Vytvoriť nový objekt pre záznamy set RS = New ADODB .Recordset "Query line sql_query = "SELECT id, name_mon FROM test_table" "Spustite dotaz s použitím aktuálnych nastavení pripojenia projektu RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Prehľadávať záznamy, kým nie ( RS.EOF) "Vyplňte premennú, aby sa zobrazila správa str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline "prejsť na ďalší záznam RS.MoveNext Wend " Vypíšte správu msgbox str End Sub

Tu už používame slučky VBA Access na iteráciu cez všetky hodnoty v našej sade záznamov.

Pomerne často je však potrebné získať nie všetky hodnoty zo súboru záznamov, ale iba jeden, napríklad názov mesiaca podľa jeho kódu. Aby sme to dosiahli, je trochu drahé použiť slučku, takže môžeme jednoducho napísať dotaz, ktorý vráti iba jednu hodnotu a pristúpime k nej, napríklad dostaneme názov mesiaca pomocou kódu 5

Private Sub start_Click() "Deklarovať premenné" Pre sadu záznamov z databázy Dim RS As ADODB.Recordset "Reťazec dopytu Dim sql_query As String "Reťazec na zobrazenie konečnej hodnoty Dim str As String "Vytvoriť nový objekt pre sadu záznamov RS = New ADODB.Recordset "Query line sql_query = "SELECT name_mon FROM test_table WHERE id = 5" "Spustite dotaz pomocou aktuálneho nastavenia pripojenia projektu RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Získajte našu hodnotu str = RS. Polia(0) msgbox str End Sub

Pre univerzálnosť sme tu už riešili nie názvom bunky, ale jej indexom, t.j. 0 a toto je úplne prvá hodnota v Sada záznamov, nakoniec sme dostali hodnotu "Smieť".

Ako vidíte, všetko je celkom jednoduché. Ak často potrebujete získať konkrétnu hodnotu z databázy ( ako v poslednom príklade), potom odporúčam vypísať celý kód do samostatnej funkcie (Ako napísať funkciu vo VBA Access 2003) s jedným vstupným parametrom, napríklad kódom mesiaca ( ak vezmeme do úvahy náš príklad) a jednoducho tam, kde je potrebné túto hodnotu zobraziť, zavoláme funkciu, ktorú potrebujeme s požadovaným parametrom a je to, tým výrazne zredukujeme VBA kód a zlepšíme vnímanie nášho programu.

To je na dnes všetko. Veľa štastia!

Access umožňuje programovo vytvárať reťazce SQL dotazov, ako aj reťazce, ktoré slúžia ako hodnoty pre vlastnosti formulárov, zostáv atď., parametre funkcií atď., ktoré tiež musia zodpovedať SQL syntax. Zároveň musíme pamätať na to, že konštanty zahrnuté v takomto riadku musia byť tiež naformátované podľa pravidiel SQL, a to:

  • v číslach musí byť oddeľovač desatinných miest bodka,
  • reťazce musia byť uzavreté v úvodzovkách alebo apostrofoch (a úvodzovky alebo apostrofy sú vo vnútri reťazca zdvojené),
  • Dátumy musia byť uzavreté krížikmi a napísané v americkom formáte (mm/dd/rrrr) s lomkou ako oddeľovačom.

    Ak sa to poruší, môžu sa vyskytnúť tieto účinky:

  • číslo ako 10,5 s čiarkou namiesto bodky bude vnímané ako zoznam dvoch čísel 10 a 5, čo povedie k určitému rozdielu v počte polí,
  • reťazec ako Vasya bez úvodzoviek a apostrofov bude vnímaný ako názov poľa, ak také pole existuje, alebo ako názov parametra, ktorý bude okamžite požadovaný,
  • dátum ako 1. 2. 2010 alebo 1. 2. 2010 bez hash značiek sa bude považovať za aritmetický výraz (s delením a odčítaním),
  • dátum ako 1.2.2010 bude interpretovaný ako zlomkové číslo s dvoma desatinnými čiarkami a bude mať za následok chybu,
  • dátum s hash značkami, ale nie v americkom formáte, bude vnímaný ako dátum, ale iný (budú preusporiadané deň a mesiac).

    Nižšie v každej časti je uvedený príklad reťazca SQL, ktorý by sa mal vytvoriť tvorba softvéru a potom kód VBA, ktorý ho vytvára. Nižšie je uvedené veľmi užitočné odporúčanie.

    1. Používanie čísel

    SELECT * FROM Tabuľka WHERE (((Tabuľka .Quanty)= 12 .197 ));
    VBA v1

    Dim q Ako Single q = 12 .197 strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Tabuľka. Množstvo)=" & q & "));"
    VBA v2

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

  • VBA v1- pre celé čísla. Pre zlomkové čísla ide o špeciálny prípad iba vtedy, keď je systémovým oddeľovačom bodka.
  • VBA v2- správnejšia možnosť, pretože v klasickom programovaní je možné s reťazcami spájať iba reťazce, zatiaľ čo VBA v1 používa implicitnú konverziu typov, aj keď v prípade celých čísel neboli na túto metódu žiadne sťažnosti. (Príklad je uvedený, keď je systémovým oddeľovačom čiarka.)
  • Niekedy sa na konverziu používa aj funkcia CStr(), ale nie vždy je použiteľná, pretože vráti číslo ako reťazec, kde sa zapíše cez systémový oddeľovač, zatiaľ čo SQL akceptuje ako oddeľovač iba bodku.
  • NB! Pri použití atypických systémových oddeľovačov nemusia vyššie uvedené príklady fungovať, v týchto prípadoch je potrebné programovo nahradiť systémový oddeľovač bodkou. Nižšie je uvedená funkcia, ktorá vracia systémový oddeľovač.
    Funkcia GetDecimalSeparator() As String GetDecimalSeparator = Formát ( 0 #, "." ) End Function Tiež si všimnite, že niektoré štandardné akcie Access nemusia v tomto prípade fungovať.

    2. Pomocou šnúrok

    SELECT * FROM Tabuľka WHERE (((Tabuľka .Názov)="Všetko" ));
    VBA v1

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

    Dim q As String q = "All" strSQL = "SELECT * " _ & "FROM Table" _ & "WHERE (((Table.Quanty)="" & DoubleApostrophe(q) & "" ));"
    Poznámka:

  • VBA v1: DoubleQuote() - funkcia, ktorá sa zdvojnásobí citácie.

    Príklad:
    vzorkovacia podmienka:
    SQL "a":
    WHERE pole=" ""a"s"VBA:
    strWhere = " pole WHERE=""" & "a""""a"." & """ "

  • VBA v2:: DoubleApostrophe() - funkcia, ktorá sa zdvojnásobí apostrofy.

    Príklad:
    vzorkovacia podmienka:
    SQL "a":
    WHERE pole=" "a" "s"VBA:
    strWhere = " WHERE pole="" & "a""a""s" & "" "

  • Vyššie uvedené funkcie DoubleQuote a DoubleApostrophe NIE SÚ vstavané funkcie Access, ale funkcie definované používateľom, ktorých implementácia je ponechaná na uváženie programátora. Najmä vo verziách Access 2000 a vyšších môžete na tento účel použiť vstavanú funkciu Nahradiť a vo verziách 97 a nižších môžete použiť túto funkciu:

    Verejná funkcia Replace97(StrMain As String , StrFind As String , StrZam As String ) As String On Error GoTo err Dim pos as Long If StrFind = "" Then GoTo err If StrMain = "" Then Replace97 = StrZam: Exit Function Do InStr( 1 , StrMain, StrFind) = 0 pos = InStr( 1 , StrMain, StrFind) StrMain = stred (StrMain, 1 ,po- 1 ) & StrZam & stred (StrMain, poz + Len(StrFind), Len(StrMain)) Slučka Nahradiť97 = Funkcia ukončenia StrMain err: Nahradiť97 = Koniec funkcie StrMain
    3. Použitie dátumov

    SELECT * FROM Table WHERE (((Table .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" ) & "#));"
    Poznámka:

  • Microsoft JET SQL operuje s dátumami v americkom formáte, t.j. presne vo vyššie uvedenom tvare Mesiac/Deň/Rok.
  • Nevynechávajte znaky # (ohraničuje celú konštantu dátumu a času) a \ (bráni tomu, aby boli / a : nahradené nastaveniami miestneho nastavenia, čo má tendenciu robiť funkcia Format a ktorá zabraňuje správna prevádzka SQL príkazy).
  • Odporúča sa prečítať si tu: o spôsoboch uloženia dátumu/času.
  • NB! Nemali by ste používať konverziu dátumu na celé číslo (alebo dlhé), pretože v Accesse a na SQL Serveri zodpovedajú rôzne čísla rovnakému dátumu a pri porovnaní môžete získať neočakávaný výsledok.

    Po zložení takéhoto reťazca obsahujúceho SQL príkaz a odoslanie na vykonanie môže viesť k chybe. V tomto prípade vytlačte tento reťazec do ladiaceho okna a pozrite sa naň očami. Možno vás chyba okamžite upúta. Ak to nefunguje, vytvorte nový dotaz v návrhárovi dotazov, prepnite sa do režimu SQL, vložte tam text dotazu a spustite ho. Ak sa vyskytne chyba, zobrazí sa jasnejšie.