| Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
![]() |
| | Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
| |
|
#1
| |||
| |||
|
Καλησπέρα σε όλους Τελικά μήπως ισχύει το "Όσο πιο πολλά μαθαίνεις τόσες περισσότερες απορίες έχεις"? Πάλι κόλλησα σε κάτι φαινομενικά εύκολο. Παρόλα αυτά δεν βρήκα λύση στο διεθνές προσκήνιο.. Ιδού το πρόβλημα: Πώς μπορούμε να πάρουμε ταυτόχρονα τις τρεις μεγαλύτερες τιμές με διαφορετικές εκφράσεις για την κάθε μία, σε ένα ερώτημα (ή με κώδικα) από μια λίστα τιμών ενός πίνακα; Παρότι υπάρχουν αρκετές λύσεις για την πρώτη ή την χ μεγαλύτερη τιμή (βλέπε συννημένα (σε Access 2010 και 2003)) δεν μπορώ να καταλήξω για την δεύτερη ή για την τρίτη κατά σειρά μεγαλύτερη τιμή ταυτόχρονα. Κάθε ιδέα καλοδεχούμενη... Δημήτρης |
|
#2
| ||||
| ||||
|
Καλησπέρα! Δημήτρη, σε προβολή SQL ενός ερωτήματος επικόλλησε τον παρακάτω κώδικα SQL και δοκίμασε : Κώδικας: SELECT TOP 1 DMax("mynumbers","tbl") AS Number1,
DMax("mynumbers","tbl","mynumbers<" & [Number1]) AS Number2,
DMax("mynumbers","tbl","mynumbers<" & [Number2]) AS Number3
FROM tbl;
Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
|
#3
| |||
| |||
|
Αυτό δεν το περίμενα..! Όχι για τόσο για την λύση.. αλλά για την ταχύτητα απάντησης..(31 λεπτά και κάτι δεύτερα..) Ευχαριστώ Τάσο Υ.Γ Αλήθεια ποιο είναι το ρεκόρ στο φορουμ? (χα) |
|
#4
| |||
| |||
|
Σε συνέχεια του προηγούμενου: Πως θα ήταν δυνατό να βρούμε τις τρεις (ή χ) μεγαλύτερες τιμές, αυτή τη φορά μεταξύ όλων των πεδίων μιας εγγραφής; Και σ' αυτή την περίπτωση έχω βρει κώδικα για την πρώτη μεγαλύτερη τιμή (βλέπε module1 και ερώτημα XMaxNumbersOfRecord στο συνημμένο) αλλά για τις αμέσως επόμενες 2 (ή χ) μεγαλύτερες τιμές; Και πάλι ευχαριστώ θερμά Δημήτρης |
|
#5
| ||||
| ||||
|
Καλημέρα! Δημήτρη, δοκίμασε τον παρακάτω κώδικα SQL: Κώδικας: SELECT Maximum(-2.225E-307,[mynumbers],[mynumbers2],[mynumbers3],[mynumbers4],[mynumbers5],[mynumbers6]) AS 1stMaxRecordvalue, Maximum([1stMaxRecordvalue],[mynumbers],[mynumbers2],[mynumbers3],[mynumbers4],[mynumbers5],[mynumbers6],1) AS 2ndMaxRecordvalue, Maximum([2ndMaxRecordvalue],[mynumbers],[mynumbers2],[mynumbers3],[mynumbers4],[mynumbers5],[mynumbers6],1) AS 3rdMaxRecordvalue FROM tbl; Κώδικας: Option Compare Database
Option Explicit
Const Mini = -2.225E-307
Function Maximum(ParamArray ArrValues() As Variant)
Dim i As Integer
Dim MaxValue As Double
Dim tmpValue As Double
MaxValue = ArrValues(0)
tmpValue = ArrValues(1)
For i = 1 To UBound(ArrValues) - 1
If MaxValue > Mini Then
If ArrValues(i) > tmpValue And ArrValues(i) < MaxValue Then
tmpValue = ArrValues(i)
End If
Else
If ArrValues(i) > tmpValue Then
tmpValue = ArrValues(i)
End If
End If
Next i
Maximum = tmpValue
End Function
Καλή συνέχεια! Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
|
#6
| |||
| |||
|
Όχι, αφού βγάλει μερικούς σωστούς υπολογισμούς αρχικά, μετά (και κυρίως όταν η εγγραφή/ες περιέχουν τιμές 0) δεν δείχνει πάντα τα αναμενόμενα αποτελέσματα κυρίως της 2ης και της 3ης μεγαλύτερης τιμής Π.χ όταν δίνω σε μια εγγραφή 8, 1, 9, 0, 0, 0, μου αποδίδει την 1η μεγαλύτερη το 9, τη 2η το 8 και την 3η πάλι το 8. Αλλά και όταν δεν υπάρχουν τιμές 0 πάλι μερικές φορές "κολλάει" σε εντελώς λάθος αποτελέσματα Δημήτρης |
|
#7
| ||||
| ||||
|
Γενικά, είμαι κατά του κώδικα VBA στα ερωτήματα αν το ζητούμενο μπορεί να λυθεί με χρήση ενσωματωμένων συναρτήσεων της Access. Σε μένα πάντως δεν δημιουργείται κάποιο πρόβλημα ακόμα και σε περισσότερες εγγραφές. Μάλλον θα πρέπει να προσαρμόσεις τον κώδικα στα μέτρα σου. Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών Τελευταία επεξεργασία από το χρήστη Tasos : 25-09-13 στις 15:56. |
|
#8
| |||
| |||
|
Καλησπέρα στην παρέα Μια άλλη προσέγγιση στο ζητούμενο. Η παρακάτω συνάρτηση μας δίνει κατευθείαν την Χστή μέγιστη τιμή. Κώδικας: Public Function xMax(countMax As Integer, ParamArray values() As Variant) As Variant
Dim i As Integer, j As Integer, blnC As Boolean
On Error GoTo ErrHander
ReDim cMax(countMax) 'για την καταχώρηση των μέγιστων τιμών
'Αρχικές τιμές στις μεταβλητές των μεγίστων
cMax(0) = -2E+307
For j = 1 To countMax
cMax(j) = cMax(0)
Next
'Εύρεση της 1ης, 2ας,..., Χστης μέγιστης τιμής
For i = 1 To countMax
For j = 0 To UBound(values)
If i = 1 Then
blnC = cMax(i) < values(j)
Else
blnC = cMax(i) < values(j) And values(j) < cMax(i - 1)
End If
If blnC Then
cMax(i) = values(j)
End If
Next
Next
xMax = cMax(countMax)
Exit Function
ErrHander:
xMax = "Λάθος ορίσματα"
End Function
Το ερώτημα συνεπώς σε προβολή SQL θα έχει τη μορφή. Κώδικας: SELECT tbl.*, xMax(1,[mynumbers],[mynumbers2],[mynumbers3],[mynumbers4], [mynumbers5],[mynumbers6]) AS 1stMaxRecordvalue, xMax(2,[mynumbers],[mynumbers2], [mynumbers3],[mynumbers4],[mynumbers5],[mynumbers6]) AS 2stMaxRecordvalue, xMax(3, [mynumbers],[mynumbers2],[mynumbers3],[mynumbers4],[mynumbers5],[mynumbers6]) AS 3stMaxRecordvalue FROM tbl; Φιλικά/Γιώργος |
|
#9
| |||
| |||
|
Ψάχνοντας βρήκα οτι υπάρχουν πολλές διαφορετικές προσεγγίσεις.. Η λύση του Γιώργου νομίζω οτι μου κάνει άψογα Παρατήρηση: Εάν δεν υπάρχει περίπτωση αρνητικών ορισμάτων θα μπορούσε να γίνει cMax(0) = 0 αντί του cMax(0) = -2E+307. Τάσο, Γιώργο Ευχαριστώ θερμά Δημήτρης |
|
#10
| |||
| |||
|
Δημήτρη σ’ ευχαριστώ. Για να ολοκληρώσω κάπως το θέμα, στην επισυναπτόμενη ΒΔ πρόσθεσα και μία συνάρτηση για την εύρεση της χ χαμηλότερης τιμής. Έκανα και μια μικρή βελτίωση στον κώδικα. Φιλικά/Γιώργος |
![]() |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
| ||||
| Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
| Αυτόματες τιμές | ptridimas | Access - Ερωτήσεις / Απαντήσεις | 5 | 02-05-17 10:33 |
| [ Ερωτήματα ] Δημιουργία Ερωτήματος από λίστα τιμών πεδίου πίνακα | αρψηιε76γρ | Access - Ερωτήσεις / Απαντήσεις | 1 | 30-12-14 16:38 |
| [Excel07] Λίστα προϊόντων ( συνολικό άθροισμα τιμών) | rania1984 | Excel - Ερωτήσεις / Απαντήσεις | 4 | 04-11-14 20:58 |
| Εμφάνιση πολλαπλών τιμών σε λίστα | Σπύρος | Access - Ερωτήσεις / Απαντήσεις | 5 | 15-04-10 10:13 |
| [Συναρτήσεις] Τρείς Στήλες σε μία χωρίς κενά | Dimi | Excel - Ερωτήσεις / Απαντήσεις | 2 | 05-01-10 14:24 |
Η ώρα είναι 09:38.

Υβριδικός τρόπος

