| Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
![]() |
| | Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
|
#11
| |||
| |||
|
Καλημέρα στην παρέα Γιάννη είδα το θαυμάσιο κώδικά σου. Νομίζω όμως ότι το πεδίο Fields(0) περιλαμβάνεται στο ερώτημα δύο φορές με παρενέργειες και στο αποτέλεσμα, όταν παραλείπεται το Pattern. Φιλικά/ Γιώργος Τελευταία επεξεργασία από το χρήστη kapetang : 09-09-10 στις 09:58. |
|
#12
| ||||
| ||||
|
Καλησπέρα Γιώργο και σ' ευχαριστώ για τα καλά σου λόγια! ![]() Με τις χρήσιμες (όπως πάντα) παρατηρήσεις σου, το "τραγούδι", μου βγήκε λίγο ...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
| ||||
| ||||
|
Καλησπέρα κι από μένα! Επιτρέψτε μου να κάνω μια παρέμβαση που έχει καθαρά τεχνικό χαρακτήρα. 1) Γιατί να χρησιμοποιείται η μέθοδος OpenRecordset για να ανοίξει πίνακα που μπορεί να περιέχει περισσότερα MB δεδομένων (μη παραγωγικό) όταν από τον δεύτερο ζητάμε μόνο τα ονόματα των πεδίων του; Νομίζω ότι το WizHook είναι πιο αποδοτικό. 2) Νομίζω ότι είναι καλύτερα αντί για: Κώδικας: ...Set flds = CurrentDb.TableDefs(TableName).OpenRecordset.Fields... Κώδικας: With CurrentDb.TableDefs(TableName).OpenRecordset
Set flds = .Fields
'...............
'.......................
'..........................
'..........................
'..........................
'..........................
.Close
End With
![]() Φιλικά Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
|
#14
| |||
| |||
|
Καλησπέρα στην παρέα Γιάννη και βέβαια χάρηκα το νέο κώδικα. Είναι πολύ πιο στιβαρός χωρίς να χάνει την αρμονία του. Μια σκέψη, επειδή η συνάρτηση (ανάλογα με τα ορίσματα) δίνει διάφορα αποτελέσματα, αν ο τύπος της ήταν variant, ίσως να μπορούσαμε να χειριστούμε ευκολότερα τις διάφορες περιπτώσεις. Φιλικά/Γιώργος |
|
#15
| |||
| |||
|
Καλησπέρα ξανά στην παρέα Μόλις διάβασα και τις τεχνικές επισημάνσεις του Τάσου. Το πρόβλημα αναφέρεται στη δομή (σχήμα) της βάσης δεδομένων. Γιατί δε χρησιμοποιούνται τα αντικείμενα της βιβλιοθήκης ADOX που έχει δημιουργηθεί για το σκοπό αυτό; Φιλικά/Γιώργος |
|
#16
| ||||
| ||||
|
Καλησπέρα! Τάσο μου, όσον αφορά την πρώτη παρατήρηση, έχεις εν μέρει δίκιο αλλά το ότι δεν ανοίγουμε εμείς ρητά το Recordset αυτό δεν σημαίνει πως δεν το κάνει και η μέθοδος του WizHook. Αλλά ακόμη κι αν δεν το κάνει, για ποιον λόγο να δώσουμε τον έλεγχο σε μια μη τεκμηριωμένη βιβλιοθήκη και να χρησιμοποιούμε πίνακες από Variants παιδεύοντας τη VBA με τη διαστασιολόγησή τους, όταν μπορούμε να πάρουμε μια μόνο από τις, πιθανώς εκατομμύρια, εγγραφές του πίνακα; Μήπως τελικά είναι πιο απλό και πιο αποδοτικό αν πούμε απλά και μόνο... Κώδικας: Set flds = CurrentDb.OpenRecordset("Select Top 1 * From " & TableName).Fields
Όσο για την δεύτερη, αν και η VBA είναι μια πολύ ελαστική και βολική γλώσσα στο θέμα της δημιουργίας και καταστροφής αντικειμένων, ...έχεις απόλυτο δίκιο. ![]() Είναι καλό να κλείνουμε και να καταστρέφουμε ρητά τα αντικείμενα που δημιουργούμε όμως αυτή η γλώσσα μας έχει κακομάθει λίγο... ![]() Γιώργο, η επιστρεφόμενη τιμή της συνάρτησης καθορίζεται από την εντολή: Κώδικας: Set GetFlexQueryEx = rs Τι ακριβώς εννοείς όμως με το "διάφορα αποτελέσματα" και το "διάφορες περιπτώσεις" και πως φαντάζεσαι πως θα μπορούσαμε να τις χειριστούμε;
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ![]() ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
|
#17
| |||
| |||
|
Γιάννη recordset επιστρέφεται μόνο όταν υπάρχει ο πίνακας και τα πεδία του ταιριάζουν με το μοτίβο (pattern). Σε κάθε μία από τις άλλες περιπτώσεις (δεν υπάρχει πίνακας, υπάρχει αλλά δεν έχει ταιριαστά πεδία, βρέθηκε ή όχι το ερώτημα) θα μπορούσε να αντιστοιχιστεί μια άλλη τιμή στη συνάρτηση που θα μας έδινε πληροφορίες και πιθανόν να βοηθούσε και στη διαμόρφωση του κώδικα. |
|
#18
| |||
| |||
|
Καλησπέρα σε όλους!!!! Χαίρομαι που η άγνοιά μου επέφερε μια τοσο σημαντική ανταλαγή απόψεων!!! Εγώ δεν μπορώ σας παρακολουθήσω!Μπορώ όμως να σας... δυσκολέψω :-Εφτιαξα το flexy ερώτημα με το κώδικα του Τάσου... -Καθόρισα μια σχέση: το ερωτημα με τον πίνακα -Εφτιαξα μια φόρμα: στο πάνω μέρος κάποια πεδία του πίνακα, στο κάτω μέρος τα πεδία του ερωτήματος (μια εγγραφή κάθε φορά) Εδω είναι το πρόβλημα: Οταν αλλάξουν τα πεδία με το νέο τρέξιμο του ερωτήματος, η φόρμα περιμένει τα παλιά πεδία! Υπάρχει δυνατότητα και για auto update της φόρμας ??? ΥΓ: Πραγματικά σας συγχαίρω για την επιμονή σας |
|
#19
| ||||
| ||||
|
Καλησπέρα Γιαννη! Θα σου πρότεινα να κάνεις τα εξής:
Κώδικας: 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
Κώδικας: 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
| ||||
| ||||
| Παράθεση:
Θέλεις να επιστρέφει τον τύπο του σφάλματος, εξαιτίας του οποίου δεν δημιουργήθηκε το RecordSet. Επειδή όμως οι Variants για τον nisgia είναι ό,τι και για τον διάολο το λιβάνι, θα προτιμούσα αυτή η τιμή να περνάει σε ένα ακόμη όρισμα τύπου Long, περασμένο δια αναφοράς (ByRef) το οποίο θα έπαιρνε την τιμή του Err στο σημείο σφάλματος. Εκεί δηλαδή που τώρα είναι τα μηνύματα ενημέρωσης σφάλματος. Έτσι η διαδικασία που καλεί τη συνάρτηση, θα έχει την ευκαιρία να εξετάσει τον αριθμό σφάλματος όταν η τιμή της συνάρτησης ισούται με Nothing. Ελπίζω να με καταλαβαίνεις... Φίλε Γιάννη, αν μας δώσεις να καταλάβουμε τι προσπαθείς να κάνεις, είμαι σίγουρος πως θα μπορέσουμε να σε βοηθήσουμε να βρεις μια πιο κανονικοποιημένη λύση για το επιχείρημά σου. Είναι φως φανάρι πως πρόκειται για θέμα κακού σχεδιασμού. Καλό ξημέρωμα! Γιάννης
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ![]() ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
![]() |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
| ||||
| Θέμα | Δημιουργός | 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.










δεν μπορώ σας παρακολουθήσω!
:

Αλλαγή σε γραμμικό τρόπο

