Ανανέωση ιστοσελίδας
ms-office.gr > Forum > Microsoft Access > Access - Ερωτήσεις / Απαντήσεις > [ Συναρτήσεις ] Τρεις (ή χ) μεγαλύτερες τιμές από μια λίστα τιμών

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

Κλειστό Θέμα

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 24-09-13, 17:16
Όνομα: Δημήτρης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 25-07-2013
Μηνύματα: 25
Προεπιλογή Τρεις (ή χ) μεγαλύτερες τιμές από μια λίστα τιμών

Καλησπέρα σε όλους

Τελικά μήπως ισχύει το "Όσο πιο πολλά μαθαίνεις τόσες περισσότερες απορίες έχεις"?

Πάλι κόλλησα σε κάτι φαινομενικά εύκολο. Παρόλα αυτά δεν βρήκα λύση στο διεθνές προσκήνιο..
Ιδού το πρόβλημα:
Πώς μπορούμε να πάρουμε ταυτόχρονα τις τρεις μεγαλύτερες τιμές με διαφορετικές εκφράσεις για την κάθε μία, σε ένα ερώτημα (ή με κώδικα) από μια λίστα τιμών ενός πίνακα;

Παρότι υπάρχουν αρκετές λύσεις για την πρώτη ή την χ μεγαλύτερη τιμή (βλέπε συννημένα (σε Access 2010 και 2003)) δεν μπορώ να καταλήξω για την δεύτερη ή για την τρίτη κατά σειρά μεγαλύτερη τιμή ταυτόχρονα.
Κάθε ιδέα καλοδεχούμενη...
Δημήτρης
Συνημμένα Αρχεία
Τύπος Αρχείου: accdb 3highestNumbers.accdb (408,0 KB, 11 εμφανίσεις)
Τύπος Αρχείου: mdb 3highestNumbers.mdb (304,0 KB, 14 εμφανίσεις)
  #2  
Παλιά 24-09-13, 17:47
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.035
Προεπιλογή

Καλησπέρα!

Δημήτρη, σε προβολή 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  
Παλιά 24-09-13, 18:15
Όνομα: Δημήτρης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 25-07-2013
Μηνύματα: 25
Προεπιλογή

Αυτό δεν το περίμενα..!
Όχι για τόσο για την λύση.. αλλά για την ταχύτητα απάντησης..(31 λεπτά και κάτι δεύτερα..)
Ευχαριστώ Τάσο

Υ.Γ Αλήθεια ποιο είναι το ρεκόρ στο φορουμ? (χα)
  #4  
Παλιά 24-09-13, 22:17
Όνομα: Δημήτρης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 25-07-2013
Μηνύματα: 25
Προεπιλογή

Σε συνέχεια του προηγούμενου:
Πως θα ήταν δυνατό να βρούμε τις τρεις (ή χ) μεγαλύτερες τιμές, αυτή τη φορά μεταξύ όλων των πεδίων μιας εγγραφής;
Και σ' αυτή την περίπτωση έχω βρει κώδικα για την πρώτη μεγαλύτερη τιμή (βλέπε module1 και ερώτημα XMaxNumbersOfRecord στο συνημμένο) αλλά για τις αμέσως επόμενες 2 (ή χ) μεγαλύτερες τιμές;
Και πάλι ευχαριστώ θερμά
Δημήτρης
Συνημμένα Αρχεία
Τύπος Αρχείου: mdb 3highestNumbers1.mdb (320,0 KB, 12 εμφανίσεις)
  #5  
Παλιά 25-09-13, 06:18
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.035
Προεπιλογή

Καλημέρα!

Δημήτρη, δοκίμασε τον παρακάτω κώδικα 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;
σε συνδυασμό με τον παρακάτω κώδικα VBA:

Κώδικας:
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  
Παλιά 25-09-13, 13:58
Όνομα: Δημήτρης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 25-07-2013
Μηνύματα: 25
Προεπιλογή

Όχι, αφού βγάλει μερικούς σωστούς υπολογισμούς αρχικά, μετά (και κυρίως όταν η εγγραφή/ες περιέχουν τιμές 0) δεν δείχνει πάντα τα αναμενόμενα αποτελέσματα κυρίως της 2ης και της 3ης μεγαλύτερης τιμής
Π.χ όταν δίνω σε μια εγγραφή 8, 1, 9, 0, 0, 0, μου αποδίδει την 1η μεγαλύτερη το 9, τη 2η το 8 και την 3η πάλι το 8. Αλλά και όταν δεν υπάρχουν τιμές 0 πάλι μερικές φορές "κολλάει" σε εντελώς λάθος αποτελέσματα
Δημήτρης
  #7  
Παλιά 25-09-13, 15:33
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.035
Προεπιλογή

Γενικά, είμαι κατά του κώδικα VBA στα ερωτήματα αν το ζητούμενο μπορεί να λυθεί με χρήση ενσωματωμένων συναρτήσεων της Access.

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

Μάλλον θα πρέπει να προσαρμόσεις τον κώδικα στα μέτρα σου.

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

Τελευταία επεξεργασία από το χρήστη Tasos : 25-09-13 στις 15:56.
  #8  
Παλιά 25-09-13, 18:50
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

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

Μια άλλη προσέγγιση στο ζητούμενο.
Η παρακάτω συνάρτηση μας δίνει κατευθείαν την Χστή μέγιστη τιμή.

Κώδικας:
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
Για την κλήση της το πρώτο όρισμα πρέπει να είναι η τάξη (1,2, κλπ) της μέγιστης τιμής που μας ενδιαφέρει και τα υπόλοιπα τα πεδία που θα συγκριθούν.

Το ερώτημα συνεπώς σε προβολή 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;
Στην επισυναπτόμενη ΒΔ μπορούμε να δούμε ένα παράδειγμα.

Φιλικά/Γιώργος
Συνημμένα Αρχεία
Τύπος Αρχείου: mdb 3highestNumbers1.mdb (400,0 KB, 8 εμφανίσεις)
  #9  
Παλιά 25-09-13, 19:30
Όνομα: Δημήτρης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 25-07-2013
Μηνύματα: 25
Προεπιλογή

Ψάχνοντας βρήκα οτι υπάρχουν πολλές διαφορετικές προσεγγίσεις..
Η λύση του Γιώργου νομίζω οτι μου κάνει άψογα
Παρατήρηση: Εάν δεν υπάρχει περίπτωση αρνητικών ορισμάτων θα μπορούσε να γίνει
cMax(0) = 0 αντί του cMax(0) = -2E+307.

Τάσο, Γιώργο
Ευχαριστώ θερμά
Δημήτρης
  #10  
Παλιά 25-09-13, 19:45
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Δημήτρη σ’ ευχαριστώ.

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

Έκανα και μια μικρή βελτίωση στον κώδικα.

Φιλικά/Γιώργος
Συνημμένα Αρχεία
Τύπος Αρχείου: mdb xHighestLowestValueRecord.mdb (336,0 KB, 16 εμφανίσεις)
Κλειστό Θέμα


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

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


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

Θέμα Δημιουργός 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


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