Ανανέωση ιστοσελίδας
ms-office.gr > Forum > Microsoft Access > Access - Ερωτήσεις / Απαντήσεις > Βοήθεια για την εντολή SELECT

Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια!

Απάντηση στο θέμα

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #11  
Παλιά 09-09-10, 09:25
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλημέρα στην παρέα

Γιάννη είδα το θαυμάσιο κώδικά σου.
Νομίζω όμως ότι το πεδίο Fields(0) περιλαμβάνεται στο ερώτημα δύο φορές με παρενέργειες και στο αποτέλεσμα, όταν παραλείπεται το Pattern.

Φιλικά/ Γιώργος

Τελευταία επεξεργασία από το χρήστη kapetang : 09-09-10 στις 09:58.
Απάντηση με παράθεση
  #12  
Παλιά 09-09-10, 14:39
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 161
Προεπιλογή

Καλησπέρα Γιώργο και σ' ευχαριστώ για τα καλά σου λόγια!

Με τις χρήσιμες (όπως πάντα) παρατηρήσεις σου, το "τραγούδι", μου βγήκε λίγο ...HEAVY METAL
όμως ο "στοίχος" του, νομίζω πως έγινε πολύ πιο στιβαρός από τον πρωινό.

Ελπίζω να το απολαύσεις...
Κώδικας:
Function GetFlexQueryEx(TableName As String, _
        Optional QueryName As String, _
        Optional Pattern As String = "*") As Recordset

    Dim strSQL As String
    Dim fld As Field
    Dim flds As Fields
    Dim rs As Recordset

    On Error Resume Next
    Set flds = CurrentDb.TableDefs(TableName).OpenRecordset.Fields

    If flds Is Nothing Then
        MsgBox "TableDef """ & TableName & """ not found!", vbExclamation
    Else
        If Pattern = "*" Then
            strSQL = Pattern
        Else
            For Each fld In flds
                If fld.Name Like Pattern Then
                    strSQL = strSQL & ", [" & fld.Name & "]"
                End If
            Next fld
            strSQL = Mid(strSQL, 2)
        End If

        strSQL = "SELECT " & strSQL & " FROM [" & TableName & "]"
        Debug.Print strSQL
        Set rs = CurrentDb.OpenRecordset(strSQL)

        If Len(QueryName) Then
            DoCmd.Close acQuery, QueryName, acSaveNo
            Err.Clear
            DoCmd.DeleteObject acQuery, QueryName
            If Err = 0 Then
                Debug.Print "QueryDef """ & QueryName & """ deleted!"
            Else
                Err.Clear
            End If
            If rs Is Nothing Then
                MsgBox "No fields found in " & TableName _
                        & " with name like """ & Pattern & """" & vbCrLf _
                        & "Could not create query """ & QueryName & """!", vbExclamation
            Else
                CurrentDb.CreateQueryDef QueryName, strSQL
                If Err = 0 Then
                    Debug.Print "QueryDef """ & QueryName & """ created!"
                Else
                    MsgBox Err.Description, vbExclamation
                    Err.Clear
                End If
                Application.RefreshDatabaseWindow
            End If
        End If
        Set GetFlexQueryEx = rs
    End If
End Function

Sub TestFlexQueryEx()
    GetFlexQueryEx "Table1", "qryAllFields"        'Dimiourgia erwtimatos me ola ta pedia
    'GetFlexQueryEx "Table1", "qryAllFields", " "   'Mono diagrafi tou erwtimatos apo ti basi(an yparxei)
    'GetFlexQueryEx "Table1", "Query1", "a*"        'Dimiourgia erwtimatos me epilegmena pedia
    
    'Xrisi tou synolou egrafwn xwris dimiourgia erwtimatos
    On Error Resume Next
    Debug.Print GetFlexQueryEx("Table1").Fields.Count
End Sub
Το μόνο ζήτημα που μένει λίγο ασαφές, είναι το αν θα πρέπει να διαγράφεται το υπάρχον ερώτημα
όταν δεν υπάρχει πεδίο με όνομα που να ταιριάζει στο υπόδειγμα (Pattern).
Νομίζω όμως πως δεν είναι και τόσο σημαντικό μιας και πρόκειται για διαγραφή ερωτήματος
και όχι πραγματικών δεδομένων.

Φιλικά,
Γιάννης
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!
Απάντηση με παράθεση
  #13  
Παλιά 09-09-10, 17:43
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.035
Προεπιλογή

Καλησπέρα κι από μένα!

Επιτρέψτε μου να κάνω μια παρέμβαση που έχει καθαρά τεχνικό χαρακτήρα.

1) Γιατί να χρησιμοποιείται η μέθοδος OpenRecordset για να ανοίξει πίνακα που μπορεί να περιέχει περισσότερα MB δεδομένων (μη παραγωγικό) όταν από τον δεύτερο ζητάμε μόνο τα ονόματα των πεδίων του;
Νομίζω ότι το WizHook είναι πιο αποδοτικό.

2) Νομίζω ότι είναι καλύτερα αντί για:
Κώδικας:
...Set flds = CurrentDb.TableDefs(TableName).OpenRecordset.Fields...
να χρησιμοποιούμε:
Κώδικας:
    With CurrentDb.TableDefs(TableName).OpenRecordset
        Set flds = .Fields
            '...............
            '.......................
            '..........................
            '..........................
            '..........................
            '..........................
        .Close 
    End With
Για να μπορέσουμε να κλείνουμε το Recordset που έχουμε ανοίξει!

Φιλικά

Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
  #14  
Παλιά 09-09-10, 18:58
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα στην παρέα

Γιάννη και βέβαια χάρηκα το νέο κώδικα. Είναι πολύ πιο στιβαρός χωρίς να χάνει την αρμονία του.
Μια σκέψη, επειδή η συνάρτηση (ανάλογα με τα ορίσματα) δίνει διάφορα αποτελέσματα, αν ο τύπος της ήταν variant, ίσως να μπορούσαμε να χειριστούμε ευκολότερα τις διάφορες περιπτώσεις.

Φιλικά/Γιώργος
Απάντηση με παράθεση
  #15  
Παλιά 09-09-10, 19:17
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα ξανά στην παρέα

Μόλις διάβασα και τις τεχνικές επισημάνσεις του Τάσου.
Το πρόβλημα αναφέρεται στη δομή (σχήμα) της βάσης δεδομένων.
Γιατί δε χρησιμοποιούνται τα αντικείμενα της βιβλιοθήκης ADOX που έχει δημιουργηθεί για το σκοπό αυτό;

Φιλικά/Γιώργος
Απάντηση με παράθεση
  #16  
Παλιά 09-09-10, 19:37
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 161
Προεπιλογή

Καλησπέρα!

Τάσο μου, όσον αφορά την πρώτη παρατήρηση, έχεις εν μέρει δίκιο αλλά το ότι δεν ανοίγουμε εμείς ρητά το Recordset
αυτό δεν σημαίνει πως δεν το κάνει και η μέθοδος του WizHook.
Αλλά ακόμη κι αν δεν το κάνει, για ποιον λόγο να δώσουμε τον έλεγχο σε μια μη τεκμηριωμένη βιβλιοθήκη
και να χρησιμοποιούμε πίνακες από Variants παιδεύοντας τη VBA με τη διαστασιολόγησή τους,
όταν μπορούμε να πάρουμε μια μόνο από τις, πιθανώς εκατομμύρια, εγγραφές του πίνακα;

Μήπως τελικά είναι πιο απλό και πιο αποδοτικό αν πούμε απλά και μόνο...
Κώδικας:
Set flds = CurrentDb.OpenRecordset("Select Top 1 * From " & TableName).Fields
...?

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

Γιώργο, η επιστρεφόμενη τιμή της συνάρτησης καθορίζεται από την εντολή:
Κώδικας:
Set GetFlexQueryEx = rs
οπότε και Variant να ήταν ο τύπος της, πάλι RecordSet θα παίρναμε.
Τι ακριβώς εννοείς όμως με το "διάφορα αποτελέσματα" και το "διάφορες περιπτώσεις"
και πως φαντάζεσαι πως θα μπορούσαμε να τις χειριστούμε;
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!
Απάντηση με παράθεση
  #17  
Παλιά 09-09-10, 20:13
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Γιάννη recordset επιστρέφεται μόνο όταν υπάρχει ο πίνακας και τα πεδία του ταιριάζουν με το μοτίβο (pattern).
Σε κάθε μία από τις άλλες περιπτώσεις (δεν υπάρχει πίνακας, υπάρχει αλλά δεν έχει ταιριαστά πεδία, βρέθηκε ή όχι το ερώτημα) θα μπορούσε να αντιστοιχιστεί μια άλλη τιμή στη συνάρτηση που θα μας έδινε πληροφορίες και πιθανόν να βοηθούσε και στη διαμόρφωση του κώδικα.
Απάντηση με παράθεση
  #18  
Παλιά 09-09-10, 20:50
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 04-07-2010
Μηνύματα: 16
Προεπιλογή

Καλησπέρα σε όλους!!!!
Χαίρομαι που η άγνοιά μου επέφερε μια τοσο σημαντική ανταλαγή απόψεων!!!
Εγώ δεν μπορώ σας παρακολουθήσω!
Μπορώ όμως να σας... δυσκολέψω :
-Εφτιαξα το flexy ερώτημα με το κώδικα του Τάσου...
-Καθόρισα μια σχέση: το ερωτημα με τον πίνακα
-Εφτιαξα μια φόρμα: στο πάνω μέρος κάποια πεδία του πίνακα, στο κάτω μέρος τα πεδία του ερωτήματος (μια εγγραφή κάθε φορά)

Εδω είναι το πρόβλημα: Οταν αλλάξουν τα πεδία με το νέο τρέξιμο του ερωτήματος, η φόρμα περιμένει τα παλιά πεδία! Υπάρχει δυνατότητα και για auto update της φόρμας ???

ΥΓ: Πραγματικά σας συγχαίρω για την επιμονή σας
Απάντηση με παράθεση
  #19  
Παλιά 09-09-10, 22:39
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.035
Προεπιλογή

Καλησπέρα Γιαννη!


Θα σου πρότεινα να κάνεις τα εξής:

  • Δημιούργησε έναν πίνακα με το όνομα: tblFormNames καιπρόσθεσε του ένα
    και μοναδικό πεδίο τύπου "κείμενο" με κάποιο όνομα της αρεσκείας σου.
  • Στο πεδίο αυτό πληκτρολόγησε τα ονόματα των πεδίων του ερωτήματος πχ. "Το πεδίο μου", "Το άλλο μου πεδίο" κτλ.
  • Πέρασε τον παρακάτω κώδικα σε μια κοινή λειτουργική μονάδα (Module) και τρέξε τον μια φορά.
    Θα σου δημιουργήσει ένα ερώτημα με τα πεδία του πίνακα σου που
    αρχίζουν από a και των οποίων τα ονόματα πηγάζουν από τον πίνακα tblFormName
Κώδικας:
Function Create_Query(TableName As String, QueryName As String, SearchLetters As String)
    WizHook.Key = 51488399
    Dim MyFields, strSQL As String, i As Integer, DynQry As QueryDef, x As String, FormField As DAO.Field
    MyFields = WizHook.GetColumns(TableName)
    TableName = "[" & TableName & "]"
    MyFields = Split(MyFields, ";")
    With CurrentDb.OpenRecordset("tblFormNames")
        .MoveFirst
        Set FormField = .Fields(0)
        For i = 0 To UBound(MyFields) - 1
            If MyFields(i) Like SearchLetters Then
                strSQL = strSQL & TableName & ".[" & MyFields(i) & "] As [" & FormField & "], "
                .MoveNext
                If .EOF Then Exit For
            End If
        Next
        .Close
    End With
    If InStr(1, strSQL, "]") Then
        strSQL = Left(strSQL, Len(strSQL) - 2)
        strSQL = "SELECT " & strSQL & " FROM " & TableName
        On Error Resume Next
        x = CurrentDb.QueryDefs(QueryName).Name
        If Err <> 0 Then Err.Clear
        If x <> vbNullString Then DoCmd.DeleteObject acQuery, QueryName
        If Err =  2008 Then
            Err.Clear
            DoCmd.Close acQuery, QueryName, acSaveNo
            DoCmd.DeleteObject acQuery, QueryName
        End If
        On Error GoTo ErrH
        Set DynQry = CurrentDb.CreateQueryDef(QueryName, strSQL)
        'DoCmd.OpenQuery QueryName
    Else
ErrH:
        MsgBox "Can not create the Query!" & IIf(Err <> 0, vbLf & "Error number: " & Err & _
               vbLf & "Error Description : " & Err.Description, vbNullString), vbExclamation
    End If

End Function

Sub test()
    Create_Query "Table1", "Query1", "a*" 
End Sub
  • Σύνδεσε τα πεδία της φόρμας σου εκ νέου με τα πεδία του νέου αυτού ερωτήματος.
  • Στη φόρμα σου δημιούργησε ένα κουμπί με το όνομα cmdRefresh και αντιστοίχησε του το παρακάτω:
Κώδικας:
Private Sub cmdRefresh_Click()
    Dim formName As String
    formName = Me.Name
    DoCmd.Close
    Create_Query "Table1", "Query1", "a*"
    DoCmd.OpenForm formName
End Sub
Δοκίμασε και τα λέμε πάλι.

Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών

Τελευταία επεξεργασία από το χρήστη Tasos : 10-09-10 στις 08:13.
Απάντηση με παράθεση
  #20  
Παλιά 09-09-10, 23:25
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 161
Προεπιλογή

Παράθεση:
Αρχική Δημοσίευση από kapetang Εμφάνιση μηνυμάτων
Γιάννη recordset επιστρέφεται μόνο όταν υπάρχει ο πίνακας και τα πεδία του ταιριάζουν με το μοτίβο (pattern).
Σε κάθε μία από τις άλλες περιπτώσεις (δεν υπάρχει πίνακας, υπάρχει αλλά δεν έχει ταιριαστά πεδία, βρέθηκε ή όχι το ερώτημα) θα μπορούσε να αντιστοιχιστεί μια άλλη τιμή στη συνάρτηση που θα μας έδινε πληροφορίες και πιθανόν να βοηθούσε και στη διαμόρφωση του κώδικα.
Τώρα κατάλαβα Γιώργο!
Θέλεις να επιστρέφει τον τύπο του σφάλματος, εξαιτίας του οποίου δεν δημιουργήθηκε το RecordSet.

Επειδή όμως οι Variants για τον nisgia είναι ό,τι και για τον διάολο το λιβάνι, θα προτιμούσα αυτή η τιμή
να περνάει σε ένα ακόμη όρισμα τύπου Long, περασμένο δια αναφοράς (ByRef)
το οποίο θα έπαιρνε την τιμή του Err στο σημείο σφάλματος.
Εκεί δηλαδή που τώρα είναι τα μηνύματα ενημέρωσης σφάλματος.

Έτσι η διαδικασία που καλεί τη συνάρτηση, θα έχει την ευκαιρία να εξετάσει
τον αριθμό σφάλματος όταν η τιμή της συνάρτησης ισούται με Nothing.

Ελπίζω να με καταλαβαίνεις...

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

Καλό ξημέρωμα!
Γιάννης
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!
Απάντηση με παράθεση
Απάντηση στο θέμα


Δικαιώματα - Επιλογές
Δε μπορείτε να δημοσιεύσετε νέα μηνύματα
Δε μπορείτε να δημοσιεύσετε απαντήσεις
Δεν μπορείτε να επισυνάψετε αρχεία
Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας

Ο κώδικας ΒΒ είναι σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι εκτός λειτουργίας
Trackbacks are εκτός λειτουργίας
Pingbacks are εκτός λειτουργίας
Refbacks are εκτός λειτουργίας


Παρόμοια Θέματα

Θέμα Δημιουργός Forum Απαντήσεις Τελευταίο Μήνυμα
DelayTime σε εντολή γιώργοςΚ Access - Ερωτήσεις / Απαντήσεις 7 05-07-16 20:44
Εντολή Select All γιώργοςΚ Access - Ερωτήσεις / Απαντήσεις 5 23-03-16 15:25
Πρόβλημα με κώδικα Select Case Yes/No γιώργοςΚ Access - Ερωτήσεις / Απαντήσεις 3 15-01-15 12:05
[ Ερωτήματα ] Βοήθεια σε ερώτημα SQL (SELECT , WHERE) parara Access - Ερωτήσεις / Απαντήσεις 3 30-01-14 23:11


Η ώρα είναι 12:23.