Forum

Forum (https://www.ms-office.gr/forum/)
-   Access - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/)
-   -   [ Συναρτήσεις ] Τρεις (ή χ) μεγαλύτερες τιμές από μια λίστα τιμών (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/2700-treis-i-x-megaliteres-times-apo-mia-lista-timon.html)

jim67 24-09-13 17:16

Τρεις (ή χ) μεγαλύτερες τιμές από μια λίστα τιμών
 
2 Συνημμένο(α)
Καλησπέρα σε όλους

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

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

Παρότι υπάρχουν αρκετές λύσεις για την πρώτη ή την χ μεγαλύτερη τιμή (βλέπε συννημένα (σε Access 2010 και 2003)) δεν μπορώ να καταλήξω για την δεύτερη ή για την τρίτη κατά σειρά μεγαλύτερη τιμή ταυτόχρονα.
Κάθε ιδέα καλοδεχούμενη...
Δημήτρης

Tasos 24-09-13 17:47

Καλησπέρα!

Δημήτρη, σε προβολή 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;

Με εκτίμηση

Τάσος

jim67 24-09-13 18:15

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

Υ.Γ Αλήθεια ποιο είναι το ρεκόρ στο φορουμ? (χα)

jim67 24-09-13 22:17

1 Συνημμένο(α)
Σε συνέχεια του προηγούμενου:
Πως θα ήταν δυνατό να βρούμε τις τρεις (ή χ) μεγαλύτερες τιμές, αυτή τη φορά μεταξύ όλων των πεδίων μιας εγγραφής;
Και σ' αυτή την περίπτωση έχω βρει κώδικα για την πρώτη μεγαλύτερη τιμή (βλέπε module1 και ερώτημα XMaxNumbersOfRecord στο συνημμένο) αλλά για τις αμέσως επόμενες 2 (ή χ) μεγαλύτερες τιμές;
Και πάλι ευχαριστώ θερμά
Δημήτρης

Tasos 25-09-13 06:18

Καλημέρα!

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


Καλή συνέχεια!

Τάσος

jim67 25-09-13 13:58

Όχι, αφού βγάλει μερικούς σωστούς υπολογισμούς αρχικά, μετά (και κυρίως όταν η εγγραφή/ες περιέχουν τιμές 0) δεν δείχνει πάντα τα αναμενόμενα αποτελέσματα κυρίως της 2ης και της 3ης μεγαλύτερης τιμής
Π.χ όταν δίνω σε μια εγγραφή 8, 1, 9, 0, 0, 0, μου αποδίδει την 1η μεγαλύτερη το 9, τη 2η το 8 και την 3η πάλι το 8. Αλλά και όταν δεν υπάρχουν τιμές 0 πάλι μερικές φορές "κολλάει" σε εντελώς λάθος αποτελέσματα
Δημήτρης

Tasos 25-09-13 15:33

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

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

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

Τάσος

kapetang 25-09-13 18:50

1 Συνημμένο(α)
Καλησπέρα στην παρέα

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

Κώδικας:

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;

Στην επισυναπτόμενη ΒΔ μπορούμε να δούμε ένα παράδειγμα.

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

jim67 25-09-13 19:30

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

Τάσο, Γιώργο
Ευχαριστώ θερμά
Δημήτρης

kapetang 25-09-13 19:45

1 Συνημμένο(α)
Δημήτρη σ’ ευχαριστώ.

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

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

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

jim67 25-09-13 21:43

1 Συνημμένο(α)
Γιώργο
Τελικά η λύση σου, μου παρουσίασε προβλήματα
Παράδειγμα:
Αν τα ορίσματα είναι: 0,0,1,0,1,0 (στην περίπτωσή μου μπορούν να κυμαίνονται από 0-6) οι τρείς μεγαλύτερες τιμές θα έπρεπε να είναι 1,1,0 και όχι 1,0,0.
Όπως και στην περίπτωση ορισμάτων 6,6,6,6,6,6 οι τρεις μεγαλύτερες τιμές θα είναι λογικά οι 6,6,6.
Προσπάθησα να το διορθώσω μόνος μου. Δεν το κατόρθωσα.

Επίσης στην τελευταία σου διόρθωση βγάζει συχνά αποτέλεσματα -2E+307. Πως μπορούμε να αντικαταστήσουμε το -2E+307 με 0, δεδομένου οτι τις ευρεθείσες τιμές πρέπει να τις χρησιμοποιήσω σε περαιτέρω πράξεις (το άθροισμα των τετραγώνων των τριών αυτών τιμών);

Υ.Γ Άρχισα να απελπίζομαι..
Δημήτρης

kapetang 25-09-13 22:23

Δημήτρη στη λύση που έδωσα (νόμιζα ότι αυτό ζητούσες) οι 3 (χ) τιμές είναι διαφορετικές.

Αν δεν υπάρχουν 3 (χ) διαφορετικές στη θέση αυτών που λείπουν θα επιστραφούν οι αρχικές τιμές (-2Ε+307).

Αν δεν θέλεις οι τιμές να είναι διαφορετικές θα πρέπει να ξαναδώ τον κώδικα.

Αν δεν υπάρχουν αρνητικές τιμές, άλλαξε την εντολή
const mini = -2Ε+307 σε Const mini = 0

kapetang 25-09-13 22:34

1 Συνημμένο(α)
Έκανα στα γρήγορα μια αλλαγή, δοκίμασέ την καλύτερα.

jim67 26-09-13 06:21

Ναι αυτό ήταν, επιτέλους...........
Αυτή τη φορά το δοκίμασα εξαντλητικά,

Δεν ξέρω πως να σας ευχαριστήσω
Τάσο, και ιδιαίτερα Γιώργο και πάλι με σώσατε..
Καλή συνέχεια


Φιλικά
Δημήτρης


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

Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2