Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

Îåêßíçóå áðü ôï ìÝëïò spiliot. Τελευταία δημοσίευση από το μέλος kxag στις 14-05-2006, 13:59. Υπάρχουν 17 απαντήσεις.
Σελίδα 1 από 2 (18 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-05-2006, 22:12 12561

    Tongue Tied [:S] Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Καλησπέρα σε όλους... Έχω ένα πρόβλημα που δεν ξέρω πως να το λύσω...

    Θέλω με ένα ερώτημα να πάρω το παρακάτω πρότυπο:

                       <--Αναλυτικά--> <-Προοδευτικά->
    Ημερομηνία Αριθμός Χρέωση  Πίστωση Χρέωση  Πίστωση Υπόλοιπο
    05/04/2006      23   200€            200€       0€     200€
    10/04/2006      56            100€   200€     100€     100€
    18/04/2006      78            450€   200€     550€    -350€
    25/04/2006     112   150€            350€     550€    -200€
    10/05/2006     244   500€            850€     550€     300€


    Οι εγγραφές είναι αποθηκευμένες σε έναν πίνακα monetary με πεδία date, number, value (έχει και άλλα αλλά δεν παίζει ρόλο)

    Τι πρέπει να γίνεται. Αν το Value είναι θετικό τότε πρόκειται για χρέωση, οπότε στο ερώτημα το εμφανίζει στην θέση χρέωση, αν είναι αρνητικό τότε το εμφανίζει στη θέση Πίστωση. Αυτό το έχω κάνει στο ερώτημα με την χρήση της iif εύκολα...

    Τώρα αυτό που δεν έχω ιδέα πως να το κάνω είναι το πεδίο προοδευτικής χρέωσης να προσθέτει αυτόματα όλες τις χρεώσεις (και το ίδιο αυτό της πίστωσης) και τέλος στο υπόλοιπο να φαίνεται η διαφορά τους.

    Αν δεν μπορεί να γίνει σε query και μπορεί σε έκθεση, δεν με πειράζει, αλλά ούτε και εκεί το κατάφερα. Ουσιαστικά πρόκειται για άθροισμα των απο πάνω πεδίων για κάθε γραμμή...

    Η μόνη λύση που μπορώ να σκεφτώ είναι με κώδικα να πάρω το ερώτημα που ήδη έχω καταφέρει να φτιάξω (χωρίς τις προοδευτικές εγγραφές δηλαδή) και να φτιάξω ένα δεύτερο σαν το πρότυπο που θέλω, όπου για κάθε γραμμή θα κάνω το άθροισμα στον κώδικα και μετά θα προσθέτω τα αποτελέσματα στο καινούριο ερώτημα. Θα δουλέψει, αλλά μου φαίνεται τελείως βλακεία, σίγουρα θα υπάρχει κάποιος καλύτερος τρόπος που αγνοώ...
  •  12-05-2006, 09:35 12574 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Άν κατάλαβα καλά, θέλεις να έχεις ένα Report της μορφής:

    <--Αναλυτικά-->

    Ημερομηνία Αριθμός Χρέωση  Πίστωση Υπόλοιπο
    05/04/2006      23   200€            200€
    10/04/2006      56            100€   100€
    18/04/2006      78            450€   -350€
    25/04/2006     112   150€            -200€
    10/05/2006     244   500€            300€

    -------------------------------------------

    <-Προοδευτικά->    Χρέωση  Πίστωση Υπόλοιπο
                                              850€     550€    300

    Άν ναι, τότε δημιούργησε ένα Report, το οποίο παίρνει τα πεδία του ερωτήματος.

    Έπειτα πρόσθεσε στην γραμμή της Λεπτομέρειας ένα TextBox(π.χ. TextBox1) και στα Property αυτού

          -Ορατό    Όχι

          -Προέλευση Στοιχείου Ελέγχου   =[ΧΡΕΩΣΗ] ' Ή όπως αλλιώς ονομάζεις το αντίστοιχο πεδίο στο ερώτημα

          -Τρέχον Άθροισμα      Για Όλα

    Τέλος στο Υποσέλιδο του Report πρόσθεσε ένα TextBox  στο οποίο θα δώσεις

          -Προέλευση Στοιχείου Ελέγχου   =[TextBox1]  'Ή όπως αλλιώς ονομάζεις το αντίστοιχο TextBox στη Λεπτομέρεια.

    και Voila!!! το TextBox αυτό θα σου δίχνει το Συνολικό Άθροισμα.

    Αντίστοιχα θα κάνεις και για την Πίστωση και για το Υπόλοιπο.

  •  12-05-2006, 09:38 12575 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Αν κατάλαβα καλά την ερώτησή σου.. θα μπορούσες στο υποσέλιδο της έκθεσης να δημιουργήσεις 3 πλαίσια κειμένου [SumΧρέωση], [SumΠίστωση], [SumΥπόλοιπο] με προέλευση εγγραφών αντίστοιχα, =Άθροισμα([Χρέωση]), =Άθροισμα([Πίστωση]), =[SumΧρέωση]-[SumΠίστωση] .

  •  12-05-2006, 10:23 12576 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Κατ' αρχήν ευχαριστώ για τις απαντήσεις, όμως καμία από τις δύο δεν φαίνεται να είναι αυτό που θέλω...

    Αν προσέξετε, δεν θέλω στο τέλος (υποσέλιδο σελίδας) να έχω σύνολα, οπότε θα δούλευε με την sum ή με το αυτόματο άθροισμα στο textbox, αλλά μέσα στη λεπτομέρεια!

    Για κάθε γραμμή λοιπόν, μαζί με την τιμή θα πρέπει να γίνεται και το άθροισμα των -μέχρι της εκάστοτε γραμμής- τιμών. Σε κάθε περίπτωση λοιπόν το συνολικό άθροισμα (το οποίο έτσι και αλλιώς μπορούσα να κάνω) δεν με βοηθάει...

    Η ενεργοποίηση της επιλογής Τρέχον Άθροισμα: Για Όλα μέσα στη λεπτομέρεια δεν έχει καμία αλλαγή στην τιμή του, καθώς τα αθροίσματα γίνονται πάντα στο τέλος ομαδοποιήσεων ή στο τέλος της φόρμας.
  •  12-05-2006, 11:07 12580 σε απάντηση της 12576

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Πιθανόν να υπάρχει και καλύτερος τρόπος.

    Η πιο κάτω sql δήλωση προυποθέτει πως

    ο πίνακας ονομάζεται pin

    H Ημερομηνία hmnia

    O Αριθμός ΑΑ

    το ποσό Poso

    Το παρακάτω κάνει ότι θέλεις, μόνο που χρειάζεται να εξασφαλίσεις πως θα σου φέρει 0 όπου υπάρχει null για να γίνει σωστά η πράξη, διότι 200 - null κάνει null.

    Αυτό στην aceess γίνεται με την συνδυασμένη χρήση των iif και isnull.

    Αν έχεις κάποιο πρόβλημα ενημέρωσέ με.

    SELECT a.hmnia,a.aa,iif(a.poso>=0,a.poso,0) as  ΧΡΕΩΣΗ
                 ,iif(a.poso< 0,-a.poso,0) as  ΠΙΣΤΩΣΗ
                 , (select sum(b.poso) from pin as b where b.hmnia <= a.hmnia and b.poso >= 0) as ΠρΧρ
                 , (select sum(c.poso) from pin  as c where c.hmnia <= a.hmnia and c.poso < 0) as ΠΡπ
                 ,  ((select sum(b.poso) from pin as  b where b.hmnia <= a.hmnia and b.poso >= 0) +  (select sum(c.poso) from pin as  c where c.hmnia <= a.hmnia and c.poso < 0)) as  ΥΠΟΛΟΙΠΟ
    from pin as a;

  •  12-05-2006, 13:05 12586 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Συμπληρωματικά αν θέλεις τη σούμα στη λεπτομέρεια μπορείς να δημιουργήσεις επιπλέον πλαίσια κειμένου ως =DSum("[Χρέωση]";"ΌνομαΠίνακα";"Number<=" & Εκθέσεις!ΌνομαΕκθεσης!Number). Παρόμοια και στα άλλα.
  •  12-05-2006, 18:12 12606 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Pero μου άρεσε σαν ιδέα η λύση που έδωσες (προτιμώ να εξασκούμαι στη λύση των προβλημάτων μέσα στην sql ή στον κώδικα απ' ότι με μπακαλίστικες ή έτοιμες μεθόδους της access). Όμως υπάρχει μια λεπτομέρεια που δημιουργεί πρόβλημα...

    Ο έλεγχος που κάνεις για την πρόσθεση γίνεται στο πεδίο της ημερομηνίας, πράγμα που σημαίνει ότι αν σε μια μέρα υπάρχουν περισσότερες της μίας εγγραφής (πράγμα που συμβαίνει) τότε προστίθενται όλες. Αυτό που δεν είχα γράψει νωρίτερα γιατί δεν θεωρούσα ότι έπαιζε ρόλο είναι ότι ο πίνακας έχει και ένα πεδίο με μοναδικό κλειδί (ID) και θα το παλέψω με αυτό και πιστεύω το άθροισμα να βγει σωστό.

    Η λύση του koykoy (δεν την δοκίμασα ακόμα) φαίνεται πιο εύκολη παρόλα αυτά και μάλλον αυτό θα κάνω αν δουλέψει.
    Σας ευχαριστώ όλους και θα επανέλθω αν χρειαστεί...

    ΠΡΟΣΘΗΚΗ:

    Παρατήρησα ότι συμβαίνει το εξής "κουφό". Αν βάλω τα δεδομένα χωρίς την δημιουργία της στήλης Χρέωσης-Πίστωσης με την iif (χρησιμοποιήσω δηλαδή μόνο το value), τότε οι προσθέσεις δουλεύουν σωστά χρησιμοποιώντας το "Τρέχον Άθροισμα" στις ιδιότητες του textbox!!!


    Δοκίμασα να μην αφήσω την τιμή σε null στην iif, αλλά να την αλλάξω σε 0, να καλέσω την format και να το κάνω currency, αλλά και πάλι, όταν μπει η iif τα αθροίσματα δεν δουλεύουν! Έχει κανείς κάποια ιδέα ή να χτυπήσω το κεφάλι μου στον τοίχο;

    Περιλαμβάνω το ερώτημα μήπως δείτε κάτι που δεν βλέπω:
    SELECT Custs.CustID, Custs.CustName, MonetaryEntries.ChargeDate, MonetaryEntries.Number, Type.TypeName & IIf(IsNull(MonetaryEntries.Comment),IIf(IsNull(MonetaryEntries.ForJourney),""," (" & queryJourneyNames.JourneyName & ")")," (" & MonetaryEntries.Comment & ")") AS Description, Format(IIf(MonetaryEntries.Value<0,0,MonetaryEntries.Value),"Currency") AS Charge, Format(IIf(MonetaryEntries.Value>0,0,-MonetaryEntries.Value),"Currency") AS Credit

    FROM Type INNER JOIN (Custs INNER JOIN (MonetaryEntries LEFT JOIN queryJourneyNames ON MonetaryEntries.ForJourney=queryJourneyNames.JourneyID) ON Custs.CustID=MonetaryEntries.FromCust) ON Type.TypeID=MonetaryEntries.Type
    ORDER BY Custs.CustName;

    Με έντονο χρώμα τα πεδία που μας ενδιαφέρουν...
  •  12-05-2006, 18:51 12607 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Το πρόβλημα (ή μάλλον τα συμπτώματα) το έλυσα τελικά ως εξής:

    Στέλνω απλά το Value από το ερώτημα, το οποίο βάζω σε ένα κρυφό txtbox στην έκθεση (με όνομα txtbValue). Στην συνέχεια έχω τo txtbox στη θέση Χρέωση να δείχνει ή όχι τα δεδομένα με βάση την iif([Value]>0;[txtbValue]) και παρόμοια για το αντίστοιχο της πίστωσης. Τέλος ένα ακόμα txtbox κάνει την πρόσθεση αυτόματα με την χρήση της "Τρέχον Άθροισμα" και σαν Προέλευση Δεδομένων το txtbCharge...

    Δηλαδή χρησιμοποίησα κάτι από όλες τις απαντήσεις :-)

    Παραμένει όμως το πρόβλημα γιατί δεν δουλεύει το τρέχον άθροισμα στην περίπτωση που τα δεδομένα έρχονται από το ερώτημα σε δύο πεδία... :-(
  •  12-05-2006, 20:22 12610 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Αυτό που ζητάς σέ SQL για να το πάρεις ακολούθα το παρακάτω statment

     

    SELECT monetary.idate, monetary.inumber, IIf(monetary.ivalue>0,monetary.ivalue,0) AS debit,
                abs(IIf(monetary.ivalue<0,monetary.ivalue,0)) AS credit,
               (select sum(c.ivalue) from monetary c where c.idate<=monetary.idate and c.ID<=monetary.ID and  c.ivalue>0) AS runningdebit,
              abs( (select sum(f.ivalue) from monetary f where f.idate<=monetary.idate and f.ID<=monetary.ID and  f.ivalue<0)) AS runningcredit,
              (select sum(l.ivalue) from monetary l where l.idate<=monetary.idate and l.ID<=monetary.ID ) AS remaining
    FROM monetary ORDER by idate,ID;

    και θα δείς ότι θα πάρεις τον πίνακα που ζητάς

    Ουσιαστικά είναι αυτό που σου πρότεινε ο  Perro αλλά λαμβάνει υπόψή και το ID που αναφέρεις για να δημιουργηθούν σωστά τα αθροίσματα.

    Παρεπιπτόντως δέν νομίζω ότι η SQLSyntax στην ACCESS είναι μπακαλίστικος τρόπος.


    Ιωάννης Μανουσάκης
  •  12-05-2006, 21:11 12612 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    προτιμώ να εξασκούμαι στη λύση των προβλημάτων μέσα στην sql ή στον κώδικα απ' ότι με μπακαλίστικες ή έτοιμες μεθόδους της access

    Παρεπιπτόντως δέν νομίζω ότι η SQLSyntax στην ACCESS είναι μπακαλίστικος τρόπος


    Ούτε και εγώ όπως λέω! Μακάρι να είχες απαντήσει 2 ώρες νωρίτερα να μην το είχα ήδη φτιάξει "μπακαλίστικα" μέσα στην έκθεση από το απλό ερώτημα (όπως λέω παραπάνω).

    Έτρεξα το ερώτημα και είναι ακριβώς ότι ήθελα (λείπει το AS μέσα στα select των προσθέσεων)... Μάθαμε πάλι κάτι σήμερα :-)

    Πάντως το κουφό ακόμα παραμένει, γιατί δεν δουλεύει το Τρέχον Άθροισμα στα textbox στις εκθέσεις όταν το ερώτημα περιείχε την iif για να δώσει την τιμή...
  •  12-05-2006, 21:21 12613 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Σίγουρα σέ κάποιο σημείο της iif άν χρησιμοποιείς αυτό iif(value>0,value,"") γι΄αυτό το λόγο δέν σου δουλεύουν οι αθροίσεις γιατί μετά πάει να προσθέσει μία string μέ μία value θα έπρεπε να χρησιμοποιείς iif(value>0,value,0) .

    Μόνο αυτό μπορώ να φανταστώ ότι γίνεται.
    Ιωάννης Μανουσάκης
  •  12-05-2006, 21:31 12614 σε απάντηση της 12612

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Μπα τελικά έφτασα να χρησιμοποιήσω αυτό:

    Format(IIf(MonetaryEntries.Value<0,0,MonetaryEntries.Value),"Currency")

    χωρίς επιτυχία, όπως και το ίδιο χωρίς την format.
  •  12-05-2006, 21:34 12615 σε απάντηση της 12561

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Θα πρέπει να δώ την Access που έχεις για να μπορέσω να σου απαντήσω.

    Δηλ. μιά Access που να εμπεριέχει τους πίνακες που λές καί την έκθεση για να δώ τις συναρτήσεις που έχεις.
    Ιωάννης Μανουσάκης
  •  12-05-2006, 21:46 12616 σε απάντηση της 12612

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    προτιμώ να εξασκούμαι στη λύση των προβλημάτων μέσα στην sql ή στον κώδικα απ' ότι με μπακαλίστικες ή έτοιμες μεθόδους της access

    Παρεπιπτόντως δέν νομίζω ότι η SQLSyntax στην ACCESS είναι μπακαλίστικος τρόπος


    Μάλλον παρεξήγησα το πώς εννοούσες το μπακαλίστικα ταπεινά συγνώμη
    Ιωάννης Μανουσάκης
  •  12-05-2006, 21:58 12617 σε απάντηση της 12613

    Απ: Πεδίο και άθροισμά του στην ίδια γραμμή (Access)

    Επίσης να προσθέσω ότι προσοχή γιατι η Format συνήθως επιστρέφει string και οχι αριθμο. οποτε αν πας αν αθροισεις αυτο:

    Format(IIf(MonetaryEntries.Value < 0 , 0,MonetaryEntries.Value),"Currency") AS Charge

    μαλλον δεν θα έχεις τα λογικα αποτελεσματα

    Επίσης οταν αθροιζεις το null παλι δεν έχεις καλα αποτελεσματα άρα πιστευω ότι η λυση είναι κάπου στη μέση δηλαδή αυτό

    IIf(MonetaryEntries.Value <  0 , 0 ,MonetaryEntries.Value). Ελπίζω να βοήθησα να λυθεί και η τελευταία σου αποροία.

    Επίσης αν δε δούλευες σε access θα σου έλεγα μη φτιάξεις αυτό το πράμα με query

    Διότί απλά σε κάθε γραμμή κάνεις και από ένα sum To αποτέλεσμα είναι η ταχύτητα του query σου να μειώνεται με αριμιτική πρόοδο με κάθε εγγραφή που προσθέτεις στη βάση δίοτι κάθε φόρα προσθέτεις και ένα άθροισμα το οποίο επιπλέον έχει και μια πράξη παραπάνω να κάνει.Φαντάσου ότι αυτό το κάνεις επι 2 (μια για τη χρέωση και μια γιατη πίστωση).  Το  αποτέλεσμα είναι αν μεγαλώσει πολύ να τη γονατίσεις από θέμα ταχύτητας πραγμα που πιστεύω ότι θα γίνει πάρα πολύ σύντομα. Φαντάσου ότι για μια βάση με 6 εγγραφές μόνο για την πίστωση θα κάνεις αυτές τις πράξεις

    Στη  γραμμή Νο 1 :0 πράξεις

    Στη γραμμή Νο 2 : 1 πράξη

    Στη γραμμή Νο 3 :2 πράξεις

    Στη γραμμή Νο 4 :3 πράξεις

    Στη γραμμή Νο 5 :4 πράξεις

    Στη γραμμή Νο 6 :5 πράξεις

    Σύνολο 15 πράξεις

    και ουτω καθεξης

    Έχεις δηλαδη με απλά μαθηματικά μια αριθμιτική πρόοδο .

    ....

    Μήπως να χρησιμοποιπούσες λίγο VBA για αυτό που θες να κάνεις??

Σελίδα 1 από 2 (18 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems