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/4675-programmatismos-kai-mathimatika-akribeias.html)

dimitrisp 17-09-17 10:51

Προγραμματισμός και μαθηματικά ακριβείας!
 
1 Συνημμένο(α)
Γεια σας,

Η συνημμένη βάση (http://www.ms-office.gr/forum/access...io-pinaka.html)
δημιουργήθηκε χάρις στην εξαιρετική βοήθεια του φίλου του Forum
Γιώργου(Kapetang).

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

Εργαζόμενος πάνω σε αυτή , διαπίστωσα ότι, σε ορισμένες περιπτώσεις,
δεν υπάρχει ακρίβεια δεκαδικών μονάδων. Για παράδειγμα:

Παράθεση:

Θέτω στη φόρμα
1. Σύνολο οφειλής = 641,01€
2. Περίοδος δόσεων = ΜΗΝΙΑΙΑ
3. Σύνολο δόσεων = 5

και στον πίνακα καταχωρίζονται 5 ισόποσες δόσεις * 128,20 € = 641,00€.
Δηλαδή μας λείπει 1 λεπτό.

Ομοίως, όταν θέτω στη φόρμα

1. Σύνολο οφειλής = 76,36€
2. Περίοδος δόσεων = ΜΗΝΙΑΙΑ
3. Σύνολο δόσεων = 5
πάλι έχουμε απώλεια του ενός λεπτού (5*15,27€=76,35€)
Επειδή οι υπολογισμοί μου στη διαμόρφωση των δόσεων θα πρέπει
να είναι απολύτως ακριβείς και να μην υπολείπονται ούτε στο ένα λεπτό,
θα παρακαλούσα για τη τη βοήθειά σας:

Είναι δυνατόν κατά τον υπολογισμό των εκάστοτε δόσεων το υπολειπόμενο
λεπτό (ή λεπτά) να τίθεται(-νται) στο ποσό της τελευταίας δόσης?

(Έτσι, όλες οι δόσεις μας θα είναι ισόποσες πλην της τελευταίας)

kapetang 17-09-17 17:47

Καλησπέρα

Φίλε Δημήτρη άλλαξε τον παλιό κώδικα του κουμπιού με τον:

Κώδικας:

Private Sub cmdAdd_Click()
    Dim rs As DAO.Recordset, dt As Date, i As Long, sum As Double
    Dim vPeriodos As Variant, strC As String, k As Long

    On Error GoTo errHandler
    'Ελέγχος καταχώρησης αναγκαίων στοιχείων
    If Not ((IsDate(Me.DAYEX) And _
            Nz(Me.KATIGORIAEX, "") <> "") And _
            (Nz(Me.KATASTASIEX, "") <> "") And _
            IsNumeric(Me.ARXEXODA) And _
            IsNumeric(Me.SYNDOSEON) And _
            (Nz(Me.PERIODOS, "") <> "") And _
            IsNumeric(Me.Prokatavoli)) Then
        MsgBox "Σε κάποια πεδία δε δόθηκαν κατάλληλες τιμές"
        Exit Sub
    End If

    'Αποτροπή πολλαπλών καταχωρήσεων
    strC = "DAYEX=#" & Format(Me.DAYEX, "m/d/yyyy") & "# And " & _
          "KATIGORIAEX='" & Me.KATIGORIAEX & "' And " & _
          "KATASTASIEX='" & Me.KATASTASIEX & "' AND ARXEXODA=" & _
          Replace(Me.ARXEXODA, ",", ".") & " And " & _
          "SYNDOSEON=" & Me.SYNDOSEON & " AND PERIODOS='" & Me.PERIODOS & "' And " & _
          "TREXDOSI=1 AND Prokatavoli=" & Replace(Me.Prokatavoli, ",", ".")
    If DCount("*", "tblExoda", strC) Then
        MsgBox "Τα στοιχεία είναι ήδη καταχωρημένα"
        Exit Sub
    End If

    'Καταχώρηση δεδομένων
    vPeriodos = Array(1, 2, 3, 6, 12)
    k = Me.PERIODOS.ListIndex
    Set rs = CurrentDb.OpenRecordset("tblExoda")
    dt = CDate(Me.DAYEX)
    sum = Me.Prokatavoli
    For i = 1 To Me.SYNDOSEON
        rs.AddNew
        rs!DAYEX = DateAdd("m", vPeriodos(k) * (i - 1), dt)
        If i = Me.SYNDOSEON Then
            rs!POSOEX = Me.ARXEXODA - sum
        Else
            rs!POSOEX = Round((Me.ARXEXODA - Me.Prokatavoli) / Me.SYNDOSEON, 2)
            sum = sum + Round((Me.ARXEXODA - Me.Prokatavoli) / Me.SYNDOSEON, 2)
        End If
        rs!KATIGORIAEX = Me.KATIGORIAEX
        rs!KATASTASIEX = Me.KATASTASIEX
        rs!ARXEXODA = Me.ARXEXODA
        rs!SYNDOSEON = Me.SYNDOSEON
        rs!PERIODOS = Me.PERIODOS
        rs!TREXDOSI = i
        rs!Prokatavoli = Me.Prokatavoli
        rs!PERIGRAFIEX = Me.PERIGRAFIEX
        rs.Update
    Next
    MsgBox "Η προσθήκη των εγγραφών ολοκληρώθηκε"
    Exit Sub
errHandler:
    MsgBox Err.Description, vbCritical, "Error #" & Err.Number
End Sub


dimitrisp 17-09-17 18:40

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

Γιώργο, καταπληκτικά!!!
Ο κώδικας μού δίνει ακριβώς αυτό που ήθελα.

Αν μπορείς, ήθελα κάτι ακόμη:

Στον πίνακα έχω προσθέσει και ένα υπολογιζόμενο πεδίο "SYNYPOLOIPO",
το οποίο μού δίνει σε κάθε δόση το υπολειπόμενο ποσό. Αλλά με την παράσταση
που έχω βάλει (Στρογγυλεμένη(([PosoDoseon])-(([TREXDOSI])*[POSOEX]);2)),
δεν βγάζω υπόλοιπο μηδέν(0) στην τελευταία δόση!

Έχεις καμιά ιδέα για το ποιά παράσταση θα βάλω στο υπολογιζόμενο πεδίο για να μού βγάζει στην τελευταία δόση
ως υπόλοιπο μηδέν (0), που έιναι και το σωστό?


Σε υπερευχαριστώ για τη βοήθειά σου...

kapetang 17-09-17 21:59

Καλησπέρα

Για τη διαμόρφωση του τύπου θα πρέπει να λάβουμε υπόψη μας.

1) Οι δόσεις, εκτός από την τελευταία, είναι ίσες με:

Round(([ARXEXODA]-[Prokatavoli])/[SYNDOSEON];2)
.
2) Η τελευταία δόση προκύπτει από την αφαίρεση του αθροίσματος των προηγούμενων δόσεων από το ποσό: [ARXEXODA]-[Prokatavoli] και κατά κανόνα διαφέρει από τις προηγούμενες.

Με βάση τα παραπάνω θα πρότεινα να δοκιμάσεις τον τύπο:

[ARXEXODA]-[Prokatavoli]-Round(([ARXEXODA]-[Prokatavoli])/[SYNDOSEON];2)*([TREXDOSI]-1)-[POSOEX]

dimitrisp 18-09-17 18:41

Καλησπέρα

Φίλε Γιώργο, σε υπερευχαριστώ και πάλι για τη βοήθειά σου.
Η πρόταση σου δοκιμάστηκε στη βάση μου και λειτουργεί άψογα!


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

kapetang 18-09-17 19:24

Φίλε Δημήτρη να είσαι καλά!

johnchrist73 17-02-20 22:35

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

Ευχαριστώ πολύ

kapetang 18-02-20 09:12

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

Γιάννη, κάνε δοκιμές στο συνημμένο.

Η μέρα καταβολής των δόσεων συμπίπτει με τη μέρα της ημερομηνίας που καταχωρούμε στο πεδίο [Ημερομηνία].

Συνεπώς, αν θέλουμε οι δόσεις να καταβάλλονται κάθε «Σάββατο», θα πρέπει η ημερομηνία που καταχωρούμε στο πεδίο [Ημερομηνία] να είναι «Σάββατο».

johnchrist73 18-02-20 20:49

Γιώργο σε ευχαριστώ πολύ για όλα!!
Ειναι αυτο που ζητούσα.

kapetang 18-02-20 22:15

Να είσαι καλά Γιάννη και καλή συνέχεια.


Η ώρα είναι 09:03.

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


Search Engine Optimization by vBSEO 3.3.2