Κλήση ερωτήματος sql από κωδικό πρόσβασης vba. Δημιουργία συμβολοσειράς ερωτήματος SQL σε VBA. Ερωτήματα στη βάση δεδομένων INSERT, UPDATE, DELETE σε VBA

Πρόσβασηαποθήκευσε ένα ερώτημα που αναπτύχθηκε χρησιμοποιώντας ένα πρόγραμμα δημιουργίας ερωτημάτων που ονομάζεται "myQuery". Η βάση δεδομένων συνδέεται με το σύστημα μέσω σύνδεσης ODBC. Οι μακροεντολές περιλαμβάνονται όλες.

Προέχωέχει σύνδεση 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" Ορισμός rs = Νέο ADODB.Recordset rs.Άνοιγμα sqlQuery, con, ...

Αλλά θέλω να αποκτήσω πρόσβαση στο ερώτημα που έχω αποθηκεύσει στη βάση δεδομένων πρόσβασης. Πώς μπορώ λοιπόν να καλέσω ένα αποθηκευμένο ερώτημα στη βάση δεδομένων που μόλις συνδέθηκα.

Το δοκίμασα ήδη

  1. con.Execute("EXEC myQuery")αλλά αυτό μου είπε ότι δεν μπορούσε να βρεθεί το myQuery.
  2. rs.Άνοιγμα "myQuery", συναλλά αυτό δεν είναι έγκυρο και θέλει δηλώσεις SELECT /etc από αυτό
vba excel-vba ms-access-2007 adodb excel

5 Απαντήσεις


6

Νομίζω ότι μπορείτε να το σκεφτείτε ως μια αποθηκευμένη διαδικασία.

Αν ξεκινήσουμε ακριβώς πριν το Dim sqlQuery As String

Dim 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 "MyQuery"

Απλά αφήστε το Exec στην άκρη.

Μπορείτε επίσης να προσθέσετε παραμέτρους, αυτό είναι λίγο ξεπερασμένο αλλά θα βοηθήσει:


0

Είναι κάπως χακάρισμα, αλλά μπορείτε να το ζητήσετε. Δηλαδή, αντικαταστήστε τη γραμμή sql με το εξής:

SqlQuery = "SELECT * FROM QueryName;"

Πριν εκτελέσετε αυτό το πρόγραμμα, πρέπει να βεβαιωθείτε ότι η βάση δεδομένων Πρόσβαση σε δεδομένασώθηκε δηλ. πατήστε Ctrl+S (δεν αρκεί να εκτελεστεί το ερώτημα στην Access).


0

Μπόρεσα να εκτελέσω ένα ερώτημα ενημέρωσης που ήταν ήδη αποθηκευμένο στην Access χρησιμοποιώντας:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

Αυτό μου έδινε σφάλματα μέχρι να αντικαταστήσω τα κενά στο όνομα του ερωτήματος με υπογράμμιση τόσο στη βάση δεδομένων της Access όσο και στη δήλωση εκτέλεσης.


0

Πάει πολύς καιρός από τότε που δημιουργήθηκε αυτό το νήμα. Αν καταλαβαίνω τα πάντα σωστά, μπορώ να προσθέσω κάτι χρήσιμο. Έδωσα ένα όνομα σε αυτό που περιγράφει το OP, το οποίο είναι η διαδικασία χρήσης SQL από ένα ερώτημα που είναι αποθηκευμένο στο ACCDB για εκτέλεση σε VBA μέσω DAO ή ADOBD. Του έδωσα το όνομα "παροχέας ιδιοκτησίας αντικειμένου", ακόμη και με το ακρωνύμιο OPP στις σημειώσεις μου, και ένα πρόθεμα/επίθημα για το όνομα του αντικειμένου.

Η ιδέα είναι ότι ένα υπάρχον αντικείμενο στο ACCDB (συνήθως ένα ερώτημα) εκθέτει μια ιδιότητα (συνήθως SQL) που πρέπει να χρησιμοποιηθεί στο VBA. Έβαλα μια συνάρτηση μόνο για να ρουφήξω την SQL από τα ερωτήματα για αυτό. Δες παρακάτω. Προειδοποίηση: Συγγνώμη, αλλά όλα αυτά είναι στο DAO, δεν χρησιμοποιώ πολύ το ADODB. Ελπίζω να σας φανούν χρήσιμες αυτές οι ιδέες.

Έφτασα μάλιστα στο σημείο να αναπτύξω μια μέθοδο για τη χρήση/εισαγωγή αντικαταστάσιμων παραμέτρων στην SQL που προέρχεται από αυτά τα ερωτήματα OPP. Στη συνέχεια χρησιμοποιώ την VBA.Replace() για να κάνω την αντικατάσταση πριν χρησιμοποιήσω την SQL στο VBA.

Η διαδρομή αντικειμένου DAO προς το ερώτημα SQL στο ACCDB είναι η εξής:

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

Χρησιμοποιώ αντικαταστάσιμες παραμέτρους αξιολογώντας τι πρέπει να αντικατασταθεί και επιλέγοντας ένα ασυνήθιστο όνομα για την παράμετρο που μπορεί να μην υπάρχει στην πραγματική βάση δεδομένων. Ως επί το πλείστον, οι μόνες αντικαταστάσεις που έχω κάνει είναι τα ονόματα πεδίων ή πινάκων ή εκφράσεις όρων WHERE και HAVING. Οπότε τους ονομάζω πράγματα όπως "(ReplaceMe00000001)" και μετά χρησιμοποιώ τη συνάρτηση Replace() για να κάνω τη δουλειά...

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

και μετά χρησιμοποιήστε το sqlText σε VBA. Ακολουθεί ένα παράδειγμα εργασίας:

Δημόσια συνάρτηση MySqlThing() Dim sqlText as String Dim myParamater as String Dim myExpression as String "Ρύθμιση όλων. «Κάνε την αντικατάσταση . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Στη συνέχεια χρησιμοποιήστε το SQL. db.Execute sqlText, dbFailOnError End Function Function getSqlTextFromQuery(ByVal oppName As Dippmplication. defs Ως DAO.QueryDefs Dim qdef Ως DAO.QueryDef Dim sqlText As String Set app = Access.Application Set db = app.CurrentDb Set qdefs = db.QueryDefs Set qdef = qdefs(oppNameqlT.SQet) oppextGet


Εκτελέστε ένα ερώτημα στο Access MakeTable από το Excel

Έχω ένα αρχείο Excel που πρέπει να αυτοματοποιήσω. Όταν ένας χρήστης ανοίγει μια αναφορά του Excel, θα του ζητηθεί να ανανεώσει τα δεδομένα. Εάν πουν ναι, τότε πρέπει να εκτελέσω το ερώτημα...


Εκτελέστε τη λειτουργία VBA μέσω ερωτήματος προβολής στο MS Access 2013 από το JS ActiveX ADO

Πώς να εκτελέσετε μια μακροεντολή VBA μέσω ερωτήματος προβολής στο MS Access 2013 από το JS ActiveX ADO; Λειτουργία VBAπροορίζεται να λάβει τρέχων χρήστης, συνδεδεμένος με: Δημόσια δήλωση...


Εκτελέστε το αποθηκευμένο ερώτημα που περιέχει "συνάρτηση" στην πρόσβαση db από το excel

Προσπαθώ να εκτελέσω ένα ερώτημα που είναι αποθηκευμένο σε μια βάση δεδομένων πρόσβασης από το excel vba. Το ερώτημα λειτουργεί καλά εάν το ανοίξω και το εκτελέσω στη βάση δεδομένων πρόσβασης, αλλά παρουσιάζει ένα σφάλμα κατά την εκτέλεση του από μια λειτουργική μονάδα...


MS Access - Εκτελέστε το αποθηκευμένο ερώτημα με το όνομα στο VBA

Πώς να εκτελέσετε ένα αποθηκευμένο ερώτημα στο MS Access 2007 σε VBA; Δεν θέλω να κάνω αντιγραφή και επικόλληση SQL σε VBA. Προτιμώ απλώς να εκτελέσω το όνομα του αιτήματος. Αυτό δεν θα λειτουργήσει... Η VBA δεν μπορεί να βρει το ερώτημα....


Πώς να εκτελέσετε ένα αίτημα σε ms-access σε κώδικα VBA;

Πώς μπορώ να εκτελέσω ένα ερώτημα για να επιστρέψω εγγραφές στη βάση δεδομένων ms-πρόσβαση δεδομένωνχρησιμοποιώντας κώδικα VBA;


Εκτελέστε ένα αίτημα πρόσβασης από το excel και περάστε τις παραμέτρους

Πώς να εκτελέσετε ένα ερώτημα σε MS Access db από κώδικα Excel VBA ή μακροεντολή. Το αίτημα MS-Access δέχεται ορισμένες παραμέτρους που πρέπει να μεταβιβαστούν από το Excel. Ευχαριστώ


Διαχείριση βιβλίου εργασίας του Excel από την Access 2010 VBA

Έχω μια κατάσταση παρόμοια με την ακόλουθη ανάρτηση: Αίτημα πρόσβασης στο excel 2010 για τη δημιουργία γραφήματος μέσω vba Στην περίπτωσή μου, εξάγω έναν πίνακα, αλλά θέλω να κάνω πολλά περισσότερα στο αρχείο...


Εκτελέστε το ερώτημα διέλευσης του SQL Server από την Access VBA

Έχω ένα ερώτημα διέλευσης UPDATE που είναι αποθηκευμένο στην Access 2007. Όταν κάνω διπλό κλικ στο ερώτημα διέλευσης, εκτελείται με επιτυχία. Πώς μπορώ να κάνω αυτό το ερώτημα να εκτελεστεί από το VBA; Θα...


Εισαγωγή τεράστιου συνόλου δεδομένων στην Access από το Excel μέσω VBA

Έχω ένα τεράστιο σύνολο δεδομένων που πρέπει να εισαγάγω από το Excel στην Access (~800k σειρές). Ωστόσο, μπορώ να αγνοήσω σειρές με συγκεκριμένη τιμή στήλης που είναι περίπου 90%...


Υπάρχει κάποιο ερώτημα MDX στο Excel vba;

υπάρχει τρόπος να εκτελέσετε ένα ερώτημα MDX μέσα στο Excel VBA; Νόμιζα ότι αυτό θα μπορούσε να γίνει μέσω ADO, όπως ακριβώς και με την SQL (ναι, ξέρω ότι η SQL είναι διαφορετική από την MDX - ένα ζήτημα που πολλές φορές...

Η Access αποθήκευσε ένα ερώτημα που αναπτύχθηκε χρησιμοποιώντας το εργαλείο δημιουργίας ερωτημάτων 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" Ορισμός rs = Νέο ADODB.Recordset rs.Άνοιγμα sqlQuery, con, ...

Αλλά θέλω να αποκτήσω πρόσβαση στο ερώτημα που έχω αποθηκεύσει στη βάση δεδομένων πρόσβασης. Πώς μπορώ λοιπόν να καλέσω ένα αποθηκευμένο ερώτημα στη βάση δεδομένων που μόλις συνδέθηκα.

Το δοκίμασα ήδη

  1. con.Execute("EXEC myQuery"), αλλά αυτό μου είπε ότι το myQuery δεν ήταν δυνατό να βρεθεί.
  2. rs. Ανοίξτε το "myQuery", αλλά δεν είναι έγκυρο και απαιτεί δηλώσεις SELECT/etc από αυτό

5 απαντήσεις

Νομίζω ότι μπορείτε να το σκεφτείτε αυτό ως μια αποθηκευμένη διαδικασία.

Αν ξεκινήσουμε ακριβώς πριν το Dim sqlQuery As String

Dim 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 "MyQuery"

Απλά αφήστε το Exec.

Μπορείτε επίσης να προσθέσετε παραμέτρους, αυτό είναι λίγο παλιό, αλλά θα σας βοηθήσει: Ενημερώστε 2 πεδία σε μια βάση δεδομένων της Access με δεδομένα Excel και ίσως μια μακροεντολή

Μπόρεσα να εκτελέσω ένα ερώτημα ενημέρωσης που ήταν ήδη αποθηκευμένο στην Access χρησιμοποιώντας:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

Αυτό μου έδινε σφάλματα μέχρι να αντικαταστήσω τα κενά στο όνομα του ερωτήματος με υπογράμμιση τόσο στη βάση δεδομένων της Access όσο και στη δήλωση εκτέλεσης.

Είναι μια δουλειά χακαρίσματος, αλλά μπορείτε να ζητήσετε ένα αίτημα. Δηλαδή, αντικαταστήστε τη γραμμή SQL με το εξής:

SqlQuery = "SELECT * FROM QueryName;"

Πριν ξεκινήσετε, πρέπει να βεβαιωθείτε ότι έχει αποθηκευτεί η βάση δεδομένων της Access, π.χ. πατήστε Ctrl + S (δεν αρκεί να εκτελεστεί το ερώτημα στην Access).

Πάει πολύς καιρός από τότε που δημιουργήθηκε αυτό το θέμα. Αν καταλαβαίνω καλά, ίσως μπορώ να προσθέσω κάτι χρήσιμο. Έδωσα ένα όνομα σε αυτό που περιγράφει το OP: αυτή είναι η διαδικασία χρήσης SQL από ένα ερώτημα που είναι αποθηκευμένο στο ACCDB για εκτέλεση σε VBA μέσω DAO ή ADOBD. Το ονόμασα "Object Property Provider", ακόμη και με το ακρωνύμιο OPP στις σημειώσεις μου και για το όνομα του αντικειμένου πρόθεμα/κατάληξη.

Η ιδέα είναι ότι ένα υπάρχον αντικείμενο στο ACCDB (συνήθως ένα ερώτημα) εκθέτει μια ιδιότητα (συνήθως SQL) που πρέπει να χρησιμοποιηθεί στο VBA. Έριξα μαζί μια συνάρτηση μόνο για να ρουφήξω την SQL από τα ερωτήματα για αυτό. Δες παρακάτω. Προειδοποίηση: Συγγνώμη, αλλά όλα αυτά είναι στο DAO, δεν χρησιμοποιώ πολύ το ADODB. Ελπίζω να σας φανούν χρήσιμες οι ιδέες.

Έφτασα μάλιστα στο σημείο να αναπτύξω μια μέθοδο για τη χρήση/εισαγωγή αντικαταστάσιμων παραμέτρων στην SQL που προέρχεται από αυτά τα ερωτήματα OPP. Στη συνέχεια χρησιμοποιώ την VBA.Replace() για να κάνω την αντικατάσταση πριν χρησιμοποιήσω την SQL στο VBA.

Η διαδρομή αντικειμένου DAO προς το ερώτημα SQL στο ACCDB είναι η εξής:

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

Χρησιμοποιώ αντικαταστάσιμες παραμέτρους αξιολογώντας τι πρέπει να αντικατασταθεί και επιλέγοντας ένα ασυνήθιστο όνομα για την παράμετρο που μπορεί να μην υπάρχει στην πραγματική βάση δεδομένων. Ως επί το πλείστον, οι μόνες αντικαταστάσεις που έχω κάνει είναι τα ονόματα πεδίων ή πινάκων ή εκφράσεις ρήτρας WHERE και HAVING. Οπότε τους ονομάζω πράγματα όπως "(ReplaceMe00000001)" και μετά χρησιμοποιώ τη συνάρτηση Replace() για να κάνω τη δουλειά...

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

Στη συνέχεια χρησιμοποιήστε το sqlText σε VBA. Ακολουθεί ένα παράδειγμα εργασίας:

Δημόσια συνάρτηση MySqlThing() Dim sqlText as String Dim myParamater as String Dim myExpression ως String "Ρύθμιση όλων. «Κάνε την αντικατάσταση . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Στη συνέχεια χρησιμοποιήστε τη συνάρτηση SQL. db.Execute sqlText, dbFailOnError End Function getSqlTextFromQuery(ByVal oppName As Dippmplication. defs Ως DAO.QueryDefs Dim qdef Ως DAO.QueryDef Dim sqlText As String Set app = Access.Application Set db = app.CurrentDb Set qdefs = db.QueryDefs Set qdef = qdefs(oppNameqlT.SQet) oppextGet

Αυτό το μάθημα είναι αφιερωμένο σε Ερωτήματα SQLστη βάση δεδομένων στις Πρόσβαση VBA. Θα δούμε πώς γίνονται τα ερωτήματα INSERT, UPDATE, DELETE στη βάση δεδομένων στο VBA και θα μάθουμε επίσης πώς να λαμβάνουμε μια συγκεκριμένη τιμή από ένα ερώτημα SELECT.

Όσοι προγραμματίζουν Πρόσβαση VBAκαι κατά την εργασία με τη βάση Δεδομένα SQLΟι διακομιστές αντιμετωπίζουν πολύ συχνά μια τόσο απλή και απαραίτητη εργασία όπως η αποστολή ενός ερωτήματος SQL σε μια βάση δεδομένων, είτε είναι INSERT, UPDATE είτε ένα απλό ερώτημα SQL SELECT. Και επειδή είμαστε αρχάριοι προγραμματιστές, θα πρέπει επίσης να μπορούμε να το κάνουμε αυτό, οπότε σήμερα θα κάνουμε ακριβώς αυτό.

Έχουμε ήδη θίξει το θέμα της λήψης δεδομένων από Διακομιστής SQL, όπου έγραψαν κώδικα σε VBA για να αποκτήσουν αυτά τα δεδομένα, για παράδειγμα, στο άρθρο σχετικά με τη Μεταφόρτωση δεδομένων σε αρχείο κειμένου από το MSSql 2008 ή επίσης το άγγιξαν λίγο στο υλικό Μεταφόρτωση δεδομένων από την Access σε πρότυπο Word και Excel, αλλά με τον ένα ή τον άλλο τρόπο το εξετάσαμε επιφανειακά, και σήμερα προτείνω να μιλήσουμε για αυτό με λίγο περισσότερες λεπτομέρειες.

Σημείωση! Όλα τα παρακάτω παραδείγματα λαμβάνονται υπόψη χρησιμοποιώντας το έργο Access 2003 ADP και τη βάση δεδομένων MSSql 2008. Εάν δεν γνωρίζετε τι είναι έργο ADP, τότε εξετάσαμε αυτό στο υλικό Πώς να δημιουργήσετε και να ρυθμίσετε ένα έργο Access ADP

Πηγή δεδομένων για παραδείγματα

Ας υποθέσουμε ότι έχουμε έναν πίνακα test_table, ο οποίος θα περιέχει τους αριθμούς και τα ονόματα των μηνών του έτους (τα ερωτήματα εκτελούνται χρησιμοποιώντας Management Studio)

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ .( ΟΧΙ NULL, (50) NULL) ON GO

Όπως είπα ήδη, θα χρησιμοποιήσουμε ένα έργο ADP που έχει ρυθμιστεί να λειτουργεί με το MS SQL 2008, στο οποίο δημιούργησα μια δοκιμαστική φόρμα και πρόσθεσα ένα κουμπί έναρξης με υπογραφή "Τρέξιμο", το οποίο θα χρειαστεί να δοκιμάσουμε τον κώδικά μας, π.χ. Θα γράψουμε όλο τον κώδικα στο πρόγραμμα χειρισμού συμβάντων " Πατήστε το κουμπί».

Ερωτήματα στη βάση δεδομένων INSERT, UPDATE, DELETE σε VBA

Για να μην καθυστερήσουμε πολύ, ας ξεκινήσουμε αμέσως, ας πούμε ότι πρέπει να προσθέσουμε μια σειρά στον πίνακα δοκιμών μας ( σχολιάστηκε ο κώδικας)/

Private Sub start_Click() "Δηλώστε μια μεταβλητή για αποθήκευση της συμβολοσειράς ερωτήματος Dim sql_query As String "Γράψτε το ερώτημα που χρειαζόμαστε σε αυτό sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "June")" "Execute it DoCmd RunSQL sql_query End Sub

Σε αυτήν την περίπτωση, το ερώτημα εκτελείται χρησιμοποιώντας τις τρέχουσες παραμέτρους σύνδεσης βάσης δεδομένων. Μπορούμε να ελέγξουμε αν τα δεδομένα έχουν προστεθεί ή όχι.

Όπως μπορείτε να δείτε, τα δεδομένα έχουν εισαχθεί.

Για να διαγράψουμε μία γραμμή γράφουμε τον παρακάτω κώδικα.

Private Sub start_Click() "Δηλώστε μια μεταβλητή για την αποθήκευση της συμβολοσειράς ερωτήματος Dim sql_query As String "Write a delete query into it sql_query = "DELETE test_table WHERE id = 6" "Run it DoCmd.RunSQL sql_query End Sub

Αν ελέγξουμε, θα το δούμε απαιτούμενη γραμμήαριστερά.

Για να ενημερώσετε τα δεδομένα, γράψτε το αίτημα ενημέρωσης στη μεταβλητή sql_query, ελπίζω ότι το νόημα είναι σαφές.

ΕΠΙΛΟΓΗ ερωτήματος σε μια βάση δεδομένων σε VBA

Εδώ τα πράγματα είναι λίγο πιο ενδιαφέροντα από ό,τι με άλλες κατασκευές SQL.

Αρχικά, ας υποθέσουμε ότι πρέπει να λάβουμε όλα τα δεδομένα από τον πίνακα και, για παράδειγμα, θα τα επεξεργαστούμε και θα τα εμφανίσουμε σε ένα μήνυμα, και εσείς, φυσικά, μπορείτε να τα χρησιμοποιήσετε για άλλους σκοπούς, για αυτό γράφουμε τα εξής κώδικας

Private Sub start_Click() "Δήλωση μεταβλητών "Για ένα σύνολο εγγραφών από τη βάση δεδομένων Dim RS As ADODB.Recordset "Σειρά ερωτήματος 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 "Loop through RS.EOF) "Συμπληρώστε τη μεταβλητή για να εμφανιστεί το μήνυμα str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline "μετάβαση στην επόμενη εγγραφή RS.MoveNext Wend " Εξαγωγή του μηνύματος msgbox str Τέλος υπο

Εδώ χρησιμοποιούμε ήδη βρόχους VBA Access για να επαναλάβουμε όλες τις τιμές στο σύνολο εγγραφών μας.

Αλλά αρκετά συχνά είναι απαραίτητο να λαμβάνετε όχι όλες τις τιμές από ένα σύνολο εγγραφών, αλλά μόνο μία, για παράδειγμα, το όνομα του μήνα από τον κωδικό του. Και για να γίνει αυτό, είναι λίγο ακριβό να χρησιμοποιήσουμε έναν βρόχο, οπότε μπορούμε απλά να γράψουμε ένα ερώτημα που θα επιστρέψει μόνο μία τιμή και θα αποκτήσει πρόσβαση, για παράδειγμα, θα λάβουμε το όνομα του μήνα χρησιμοποιώντας τον κωδικό 5

Private Sub start_Click() "Declare variables" Για ένα σύνολο εγγραφών από τη βάση δεδομένων Dim RS As ADODB.Recordset "Query string Dim sql_query As String "String για εμφάνιση της τελικής τιμής Dim str Ως συμβολοσειρά "Δημιουργία νέου αντικειμένου για το σύνολο εγγραφών RS = New ADODB.Recordset "Query line sql_query = "SELECT name_mon FROM test_table WHERE id = 5" "Εκτέλεσε το ερώτημα χρησιμοποιώντας τις τρέχουσες ρυθμίσεις σύνδεσης έργου RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Get. Fields(0) msgbox str Τέλος υπο

Για καθολικότητα, εδώ έχουμε ήδη αναφερθεί όχι με το όνομα του κελιού, αλλά με το ευρετήριό του, δηλ. 0, και αυτή είναι η πρώτη τιμή στο Ρεκόρ σετ, στο τέλος πήραμε την αξία "Ενδέχεται".

Όπως μπορείτε να δείτε, όλα είναι πολύ απλά. Εάν χρειάζεται συχνά να λαμβάνετε μια συγκεκριμένη τιμή από τη βάση δεδομένων ( όπως στο τελευταίο παράδειγμα), τότε προτείνω την έξοδο όλου του κώδικα σε μια ξεχωριστή συνάρτηση (Πώς να γράψετε μια συνάρτηση στο VBA Access 2003) με μία παράμετρο εισόδου, για παράδειγμα, τον κωδικό μήνα ( αν αναλογιστούμε το παράδειγμά μας) και απλά, όπου είναι απαραίτητο να εμφανιστεί αυτή η τιμή, καλέστε τη συνάρτηση που χρειαζόμαστε με την απαιτούμενη παράμετρο και τέλος, με αυτόν τον τρόπο θα μειώσουμε σημαντικά τον κώδικα VBA και θα βελτιώσουμε την αντίληψη του προγράμματός μας.

Αυτά για σήμερα. Καλή τύχη!

Η Access σάς επιτρέπει να δημιουργείτε μέσω προγραμματισμού συμβολοσειρές ερωτημάτων SQL, καθώς και συμβολοσειρές που χρησιμεύουν ως τιμές για ιδιότητες φορμών, αναφορών κ.λπ., παραμέτρους συναρτήσεων κ.λπ., οι οποίες πρέπει επίσης να αντιστοιχούν Σύνταξη SQL. Ταυτόχρονα, πρέπει να θυμόμαστε ότι οι σταθερές που περιλαμβάνονται σε μια τέτοια γραμμή πρέπει επίσης να μορφοποιούνται σύμφωνα με κανόνες SQL, δηλαδή:

  • στους αριθμούς το δεκαδικό διαχωριστικό πρέπει να είναι ένα σημείο,
  • οι συμβολοσειρές πρέπει να περικλείονται σε εισαγωγικά ή απόστροφα (και τα εισαγωγικά ή τα απόστροφα, αντίστοιχα, διπλασιάζονται μέσα στη συμβολοσειρά),
  • Οι ημερομηνίες πρέπει να εσωκλείονται σε σημάδια κατακερματισμού και να γράφονται σε αμερικανική μορφή (μμ/ηη/εεεε) με κάθετο ως οριοθέτη.

    Εάν αυτό παραβιαστεί, είναι πιθανές οι ακόλουθες επιπτώσεις:

  • ένας αριθμός όπως το 10,5 με κόμμα αντί για τελεία θα γίνει αντιληπτός ως μια λίστα με δύο αριθμούς 10 και 5, που θα οδηγήσει σε κάποιου είδους ασυμφωνία στον αριθμό των πεδίων,
  • μια συμβολοσειρά όπως η Vasya χωρίς εισαγωγικά και απόστροφα θα γίνει αντιληπτή ως το όνομα ενός πεδίου, εάν υπάρχει τέτοιο πεδίο, ή ως το όνομα μιας παραμέτρου που θα ζητηθεί αμέσως,
  • μια ημερομηνία όπως η 1/2/2010 ή η 1-2-2010 χωρίς σημάδια κατακερματισμού θα αντιμετωπίζεται ως αριθμητική έκφραση (με διαίρεση και αφαίρεση, αντίστοιχα),
  • μια ημερομηνία όπως η 1.2.2010 θα ερμηνευτεί ως κλασματικός αριθμός με δύο δεκαδικά ψηφία και θα οδηγήσει σε σφάλμα,
  • μια ημερομηνία με σημάδια κατακερματισμού, αλλά όχι στην αμερικανική μορφή, θα γίνει αντιληπτή ως ημερομηνία, αλλά διαφορετική (η ημέρα και ο μήνας θα αναδιαταχθούν).

    Παρακάτω σε κάθε ενότητα υπάρχει ένα παράδειγμα της συμβολοσειράς SQL που πρέπει να παραχθεί όταν δημιουργία λογισμικού, και μετά τον κώδικα VBA που το δημιουργεί. Παρακάτω είναι μια πολύ χρήσιμη σύσταση.

    1. Χρήση αριθμών

    SELECT * FROM Table WHERE (((Πίνακας .Quanty)= 12 .197 ));
    VBA v1

    Dim q Ως Μονό q = 12 .197 strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" & q & "));"
    VBA v2

    Dim q Ως συμβολοσειρά q = "12,197" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" & Str (q) & "));"
    Σημείωση:

  • VBA v1- για ακέραιους αριθμούς. Για κλασματικούς αριθμούς αυτή είναι μια ειδική περίπτωση μόνο όταν το διαχωριστικό συστήματος είναι μια τελεία.
  • VBA v2- πιο σωστή επιλογή, γιατί στον κλασικό προγραμματισμό, μόνο οι συμβολοσειρές μπορούν να συνδεθούν με συμβολοσειρές, ενώ το VBA v1 χρησιμοποιεί σιωπηρή μετατροπή τύπων, αν και δεν υπήρχαν παράπονα σχετικά με αυτήν τη μέθοδο για ακέραιους αριθμούς. (Το παράδειγμα δίνεται όταν ο οριοθέτης συστήματος είναι κόμμα.)
  • Μερικές φορές η συνάρτηση CStr() χρησιμοποιείται επίσης για μετατροπή, αλλά δεν είναι πάντα εφαρμόσιμη, επειδή επιστρέφει έναν αριθμό ως συμβολοσειρά, όπου γράφεται μέσω του οριοθέτη συστήματος, ενώ η SQL δέχεται μόνο μια τελεία ως οριοθέτη.
  • Σημείωση!Όταν χρησιμοποιείτε άτυπα διαχωριστικά συστήματος, τα παραπάνω παραδείγματα ενδέχεται να μην λειτουργούν· σε αυτές τις περιπτώσεις, πρέπει να αντικαταστήσετε μέσω προγραμματισμού το διαχωριστικό συστήματος με μια τελεία. Παρακάτω είναι μια συνάρτηση που επιστρέφει τον οριοθέτη συστήματος.
    Συνάρτηση GetDecimalSeparator() Ως συμβολοσειρά GetDecimalSeparator = Μορφή ( 0 #, "." ) Λειτουργία τερματισμού Σημειώστε επίσης ότι ορισμένες τυπικές ενέργειες της Access ενδέχεται να μην λειτουργούν σε αυτήν την περίπτωση.

    2. Χρήση χορδών

    SELECT * FROM Table WHERE (((Table .Name)="All" ));
    VBA v1

    Dim q Ως συμβολοσειρά q = "Όλα" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" "" & DoubleQuote(q) & "" "));"
    VBA v2

    Dim q Ως συμβολοσειρά q = "All" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)="" & DoubleApostrophe(q) & "" ));"
    Σημείωση:

  • VBA v1: DoubleQuote() - συνάρτηση που διπλασιάζεται εισαγωγικά.

    Παράδειγμα:
    συνθήκη δειγματοληψίας:
    a"a"s SQL:
    WHERE field=" α""α"ς"VBA:
    strWhere = " WHERE field=""" & "α""""α"ς" & """ "

  • VBA v2:: DoubleApostrophe() - συνάρτηση που διπλασιάζεται αποστρεφόμενα.

    Παράδειγμα:
    συνθήκη δειγματοληψίας:
    a"a"s SQL:
    WHERE field=" α"α""ς"VBA:
    strWhere = " WHERE field="" & "α""α""ς" & "" "

  • Οι λειτουργίες DoubleQuote και DoubleApostrophe που αναφέρονται παραπάνω ΔΕΝ είναι ενσωματωμένες λειτουργίες Access, αλλά συναρτήσεις που καθορίζονται από το χρήστη, η υλοποίηση των οποίων επαφίεται στη διακριτική ευχέρεια του προγραμματιστή. Συγκεκριμένα, στις εκδόσεις Access 2000 και νεότερες εκδόσεις μπορείτε να χρησιμοποιήσετε την ενσωματωμένη λειτουργία Αντικατάσταση για το σκοπό αυτό και στις εκδόσεις 97 και κάτω μπορείτε να χρησιμοποιήσετε αυτήν τη λειτουργία:

    Δημόσια συνάρτηση Replace97 (StrMain ως συμβολοσειρά , StrFind ως συμβολοσειρά , StrZam ως συμβολοσειρά ) Ως συμβολοσειρά σε σφάλμα GoTo err Dim pos As Long If StrFind = "" Τότε GoTo err If StrMain = "" Τότε Replace97 = StrZam: Έξοδος Συνάρτηση Κάντε μέχρι InStr( 1 , StrMain, StrFind) = 0 pos = InStr( 1 , StrMain, StrFind) StrMain = mid (StrMain, 1 , θέση - 1 ) & StrZam & mid (StrMain, pos + Len(StrFind), Len(StrMain)) Loop Replace97 = StrMain Exit Function err: Replace97 = StrMain End Function
    3. Χρήση ημερομηνιών

    SELECT * FROM Table WHERE (((Πίνακας .TimeOpen)=# 3 /31 /2003 11 :17 :19 #));
    VBA

    Dim q Ως Ημερομηνία q = Τώρα strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.TimeOpen)=#" & Format (q, "mm\/dd\/yy ωω\:mm \:ss" ) & "#));"
    Σημείωση:

  • Το Microsoft JET SQL λειτουργεί με ημερομηνίες σε αμερικανική μορφή, π.χ. ακριβώς στην παραπάνω μορφή Μήνας/Ημέρα/Έτος.
  • Μην παραλείψετε τους # χαρακτήρες (περικλείει ολόκληρη τη σταθερά ημερομηνίας) και \ (αποτρέπει την αντικατάσταση του / και : από ρυθμίσεις τοπικής ρύθμισης, κάτι που τείνει να κάνει η συνάρτηση Μορφοποίηση και που αποτρέπει σωστή λειτουργίαεντολές SQL).
  • Συνιστάται να διαβάσετε εδώ: σχετικά με τους τρόπους αποθήκευσης ημερομηνίας/ώρας.
  • Σημείωση!Δεν πρέπει να χρησιμοποιήσετε τη μετατροπή ημερομηνίας σε Ακέραιο (ή Μακρύ), γιατί στην Access και στον SQL Server, διαφορετικοί αριθμοί αντιστοιχούν στην ίδια ημερομηνία και όταν συγκρίνονται, μπορείτε να λάβετε ένα απροσδόκητο αποτέλεσμα.

    Έχοντας συνθέσει μια τέτοια χορδή που περιέχει Εντολή SQL, και η αποστολή του για εκτέλεση μπορεί να οδηγήσει σε σφάλμα. Σε αυτήν την περίπτωση, εκτυπώστε αυτήν τη συμβολοσειρά στο παράθυρο εντοπισμού σφαλμάτων και δείτε την με τα μάτια σας. Ίσως το σφάλμα να τραβήξει αμέσως το μάτι σας. Εάν δεν λειτουργεί, δημιουργήστε ένα νέο ερώτημα στον σχεδιαστή ερωτήματος, μεταβείτε στη λειτουργία SQL, εισαγάγετε το κείμενο του ερωτήματος εκεί και εκτελέστε το. Εάν υπάρχει σφάλμα, θα εμφανιστεί πιο καθαρά.