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/866-problima-enimerosis-pinakon-kai-diagrafi-anenergon-eggrafon-pinakos.html)

alex 07-12-10 08:44

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

Ξαναστέλνω το μηνυμά μου και δείγμα της βάσης μου γιατί είδα ότι το θέμα είναι κλειστό και δεν δεχεται απαντήσεις.Μήπως εχω κάνει κάποιο λάθος στο ανέβασμα η δεν είναι αποδεκτό.
Εχω προχωρήσει την βάση μου απο την προηγούμενη φορά που είχα ζητήσει την βοήθεια του φορούμ.
Πρόσθεσα τις εξής φόρμες, kinisisPerati ,ΗμερομηνιαΤαμείου,ΤαμείοΗ μέρας.
Λίγα λόγια για την διαδικασία:
Αφού καταχωρίσω τον πελάτη πάω μετα στην φόρμα κίνησης να τακτοποιήσω το οικονομικό.Εκεί εχω προσθέσει και μιά δευτερεύουσα φόρμα που εχει 2 επιλογές.ΕΝΑΝΤΙ & ΕΞΩΦΛΗΣΗ.
ΕΝΑΝΤΙ πληκτρολογώ για προκαταβολές και ΕΞΩΦΛΗΣΗ πληκτρολογώ το ποσό την στιγμή που με πληρώνει ο πελάτης και βάζω το ποσό να είναι ίδιο με το τελικό ποσό.Τότε μηδενίζεται το ποσό σημαίνει ότι ό πελάτης δεν χρωστάει.Επόμενη κίνηση τσεκάρω το checkBox(Εώφληση) για να μήν εμφανίζεται ξανά η εγγραφή στη φόρμα μέχρι εδώ τα πάω καλά καλά.
Τώρα το πρόβλημα είναι.
Πάτώντας την φόρμα ημερομηνίαΤαμείου πληκτρολογώ την ημερομηνία που θέλω να κάνω ταμείο και μετά το enter ,με πάει στη φόρμα ΤαμείοΗμέρας,:038: απο εκεί πατώντας εκτύπωση θέλω να κάνει εκτύπωση την έκθεση αλλά και να ενημερώνει τους πίνακες ΠελάτεςΜεταβCars το πεδίο ΠοσόΠληρωμών kαι τον πίνακα ΠληρωμέςΠελατών το πεδίο ΠοσόΠληρωμής.
Επίσης αφού γίνει η ενημέρωση σβήσιμο τω ανενργών εγγραφών απο τον Πίνακα ΠληρωμέςΠελατών.
Εχω γράψει τον κώδικα αλλά δεν ξέρω κάπου μου χτυπάει.
Στέλνω την βάση.Μήπως γνωρίζει κάποιος φίλος να με βοηθήσει

Ευχαριστώ
Αλέξανδρος

officeandi 07-12-10 12:00

Γεια σου alex.

Τι εννοείς με κάπου σου χτυπάει;

alex 07-12-10 12:41

καλησπε Ανδρέα

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

officeandi 07-12-10 14:41

Γεια σου alex,
Για να απαντήσω στο πρόβλημά σου , δημιούργησα αντίγραφο του DB3.mdb και το ονόμασα
DB3_Edit.mdb για τυχόν αλλαγές που θα έκανα στο debugging.

Το αρχείο DB3_Edit.mdb το άνοιξα με το MS Office 2007 EN.

Η φόρμα που δημιουργούσε σε μένα το πρόβλημα ήταν «ΤαμείοΗμέρας» όταν πάτησα τα κουμπιά «Εκτύπωση» και «Κλείσιμο».

Στον κώδικα που δραστηριοποιείται όταν πατάω «Εκτύπωση» (event handler), άλλαξα τη σειρά από
Dim db As Database, tbl1 As Recordset, tbl2 As Recordset
σε
Dim db As Database, tbl1 As DAO.Recordset, tbl2 As DAO.Recordset.

Φαίνεται πως με “recordset” το MS Access καταλαβαίνει ADODB.Recordset και εκεί δεν υπάρχει το recordset.Edit.

Η διαφορά μεταξύ Data Access Objects (DAO) και Active Data Objects είναι ότι το DAO χρησιμοποιεί το Object Database Connectivity (ODBC), πιο παλιό, ειδικό για βάσεις δεδομένων και πιο σταθερό, ενώ το ADO χρησιμοποιεί το OLEDB το οποίο έχει σχέση με το Component Object Model (COM), και είναι πιο σύγχρονο , δηλαδή όχι μόνο για βάσεις δεδομένων.

Στη συνέχεια μετέθεσα τον κώδικα του Form_Unload στο CmdClose_Click, ακριβώς πριν από το DoCmd.Close. To Private Sub Form_Unload το έσβησα. Ο λόγος που το έσβησα είναι ότι μάλλον δε έχει νόημα να χρησιμποιείς recordsets όταν η φόρμα έχει κλείσει. Μπορεί να τη βλέπεις στο γραφικό περιβάλλον (UI), αλλά αυτή έχει κλείσει. Αυτό δεν ισχύει όταν προσπαθήσεις το ίδιο με το που πατάς το κουμπί «Κλείσιμο», διότι η φόρμα είναι ανοιχτή και σε ενεργό κατάσταση.
Για το χρήστη το αποτέλεσμα είναι το ίδιο, διότι δεν αλλάζει η συμπεριφορά στη φόρμα.

Το δοκίμασα και η φόρμα δουλεύει όπως θα έπρεπε.

Αν συνεχίσουν να υπάρχουν προβλήματα, μη διστάσεις να ρωτήσεις!

alex 07-12-10 20:41

Καλησπέρα Ανδρέα

Καταρχήν ευχαριστώ για τον χρόνο που διέθεσες για το πρόβλημά μου.Το βράδυ θα το κοιτάξω με λεπτομέρεια και βλέποντας ξαναρωτάω. αν δεν δουλέψει.Και πάλι σ:bye::bye:ευχαριστώ.

Αλέξανδρος

alex 08-12-10 08:25

Kαλημέρα Ανδρέα

Εκανα την διόρθωση εκτυπώνει την έκθεση και βγάζει το εξής μήνυμα

Run-time error '3265'
Tο στοιχείο δεν βρέθηκε στην συλλογή


Πατώντας Debug μου κιτρινίζει την εξήςγραμμή του κώδικα

If tbl2![Εξώφληση] = -1 And tbl1![ΠελάτηςID] = tbl2![ΠελάτηςID] And tbl1![ΗμερΠληρωμής] >= tbl2![ΗμερΕναρξης] And tbl1![ΗμερΕναρξης] <= tbl2![ΗμερΛήξης] Then

αλλά δεν ενημερώνει τον πίνακα ΠελάτεςΜεταβCars στο πεδίο ΠοσόΠληρωμών

Αλλά ούτε στον πίνακα ΠληρωμέςΠελατών διαγράφονται οι εγγραφές πατώντας την εντολή εκτύπωση.
Στο δικό σου pc τους ενημερώνει και μετα διαγράφει τις εγγραφές στο πίνακα ΠληρωμέςΠελατών;
Σου βγάζει αυτό το μήνυμα;
Λογικά θα έπρεπε να ενημερώνονται και οι πίνακες και να διαγράφονται οι εγγραφές αφού ο κώδικας αυτό λέει.
Πάντως κάνοντας την αποσφαλμάτωση της βάσης δεν δείχνει ότι εχει σφάλμα.Αλλά δεν αφήνει να ολοκληρωθει η διαδικασία.Εκτυπώνει αλλά βγάζει μύνημα.

Αλεχ:secret:

officeandi 08-12-10 10:28

Καλημέρα Αλέξανδρε,

ας το προσπαθήσουμε λιγάκι και είμαι σίγουρος πως θα τα καταφέρουμε.
Πιο πάνω ορίζεις:
Set tbl1 = db.OpenRecordset("ΠληρωμέςΠελατών")
Set tbl2 = db.OpenRecordset("ΠελάτεςΜεταβCars")

Τώρα δες προσεκτικά

If tbl2![Εξώφληση] = -1 And tbl1![ΠελάτηςID] = tbl2![ΠελάτηςID] And tbl1![ΗμερΠληρωμής] >= tbl2![ΗμερΕναρξης] And tbl1![ΗμερΕναρξης] <= tbl2![ΗμερΛήξης] Then

και πες μου που βρίσκεται η στήλη [ΗμερΕναρξης] στον πίνακα [ΠληρωμέςΠελατών], διότι΄το αντίγραφο που έχω εγώ δεν την έχει.

Αν δε διορθωθεί αυτό, δεν έχει νόημα να ψάχνουμε παρακάτω.

Φιλικά
Ανδρέας

alex 08-12-10 10:54

Ανδρέα
Το είδα γιατί αφήνοντας το ποντίκι πάνω στην ΗμερΕναρξης δείχνει που είναι το πρόβλημα Τελικά δεν υπάρχει στο πίνακα ΠληρωμέςΠελατών. Μπορώ να προτείνω κάτι άλλο.Η ΗμερΕναρξης πρέπει να υπάρχει.Η ημερΛήξης δεν νομίζω ότι πρέπει να υπάρχει διότι υποτίθετε ότι προπληρώνεσε για μια ασφάλεια και δεν περιμένεις να λήξη μήπως πρέπει να το κάνω κάπως με διαφορετικό τρόπο η να προσθέσω στο ΠίνακαΠληρωμών το πεδίο ΗμερΕναρξης;Πες μου τι κίνηση να κάνω.

Φιλικά αλεχ

alex 08-12-10 11:01

Ανδρέα
Το βρήκα δεν είναι ΗμερΕναρξης είναι ΗμερΠληρωμής Λάθοςςςςςςςςςςςςςς
Αλεχ

alex 08-12-10 11:25

Φίλε Ανδρέα
Ενα μεγάλο ευχαριστώ γιατί μου εδωσες τα φώτα για την επίλυση του πρόβλήματος.Τελικά όταν παλεύεις να διορθώσεις κάτι κουράζεσε και δεν εχεις ξεκάθαρο μυαλό.Και εμπειρία βέβαια.Σε ευχαριστώ
Φιλικά
Αλέξανδρος:fryingpan::fryingpan:

officeandi 08-12-10 13:13

Αγαπητέ Αλέξανδρε,

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

Δεν τελειώσαμε όμως. Η σειρά μου.
1. Το κουμπί «εκτύπωση» θα το μετονόμαζα «ενημέρωση και εκτύπωση» ή «update & print». Ο λόγος; Πιστεύεις πως και μετά από μερικούς μήνες θα θυμάσαι ότι το κουμπί δεν εκτυπώνει απλά, αλλά ενημερώνει κιόλας;
2. Στο αντίγραφο που έχω, για να θυμάμαι σα χρήστης ότι εδώ ακριβώς γίνεται και μια διαγραφή εγγραφών, έθεσα ένα MsgBox που επιβεβαιώνει ότι γίνεται διαγραφή δεδομένων. Φαντάζομαι πως η χρήση της φόρμας «ταμείο ημέρας» γίνεται μία φορά την ημέρα. Συνεπώς η εμφάνιση του μηνύματος δε θα ενοχλούσε ιδιαίτερα.
3.H φόρμα κρύβει ορισμένα λάθη (παγίδες), οι οποίες δεν φαίνονται όσο ο χρήστης πατάει με τη σωστή σειρά τα κουμπιά. Για παράδειγμα, τι συμβαίνει όταν δεν πατήσω «εκτύπωση», αλλά αντί αυτού «κλείσιμο» (έστω και κατά λάθος); Μήπως έχασα μια εκτύπωση έτσι; Υπ’ όψιν ότι στο MS Access δεν υπάρχει κάδος ανακύκλωσης. Μήπως το κουμπί «κλείσιμο» θα πρέπει να προλαβαίνει το γεγονός ότι δεν προηγήθηκε μια «εκτύπωση»;
Μήπως καλύτερα «διαγραφή» και «κλείσιμο», έτσι ώστε να μπορείς να διώξεις τη φόρμα δίχως να διαγράψεις κάτι; Για το τελευταίο έχω ένα σενάριο όπου αυτό είναι λίγο πολύ απαραίτητο. Έστω ότι μετά από μια εκτύπωση και μια διαγραφή διαπιστώνεις ότι παρέλειψες κάποια «έναντι». Τι γίνεται στην περίπτωση αυτή;

Εσύ θα αποφασίσεις. Σκοπός του όλου είναι η φόρμα να αντιδρά σε κάθε περίπτωση σωστά.

Φιλικά
Ανδρέας

alex 08-12-10 14:52

1 Συνημμένο(α)
Aγαπητέ Ανδρέα
Δεν αμφισβητώ το ότι χωρίς εσένα θα το έβρισκα τόσο γρήγορα .Δεν διαθέτω τόσες γνώσεις. Αλλά ήταν όπως λές καλό ξεκίνημα.
1.Στην πρώτη πρότασή σου έχεις απολύτως δίκαιο και λογικό δεν μπορείς να θυμάσαι το ότι ενημερώνει κιόλας.
2.Και στην δεύτερη πρόταση δεκτό με το μήνυμα διότι λειτουργεί σαν Ζήτα η φόρμα μιας ταμειακής.
3.Στην Τρίτη πρόταση νομίζω ότι το έχω προλάβει. Στη φόρμα frmArhioAftokiniton εάν κοιτάξεις τον τίτλο στην κεφαλίδα της φόρμας αναγράφει Αρχείο διόρθωσης στοιχείων αυτοκινήτου. Σε περίπτωση που γίνει κάποιο λάθος από αυτή την φόρμα μπορείς να αλλάξεις τα δεδομένα. Ετσι θέλω να πιστεύω γιατί μπορεί και να κάνω λάθος.
4.Εγώ προτείνω για λιγότερες κινήσεις με το enter της φόρμας ΗμερομηνίαΤαμείου (βάζοντας την ημερομηνία) να βάλω τον κώδικα εκτύπωσης και τον κώδικα για την διαγραφή να μπει το μήνυμα διαγραφής να καταργήσω τελείως την εμφάνιση της φόρμας ΤαμείοΗμέρας αφού είναι μόνο για ανάγνωση. Και θα κάνει εκτύπωση και θα διαγράφει .Αν θέλω ανάκτηση πάω στή φόρμα και τα προσθέτω η αφαιρώ. Τί λες για αυτό.
Εκτός από αυτό ήθελα να ρωτήσω και κάτι άλλο όταν κάνω εκτύπωση θέλω να ακούγεται και ο ηχος πως κάνει η ταμειακή μηχανή. Το έκανα αυτό. Αλλά εάν πατήσεις δεύτερη φορά με ανοικτή φόρμα δεν το κάνει τι κώδικα θέλει να συμπληρώσω φαντάζομαι κάτι με το Loop.Στέλνω τον ήχο
Περιμένω την γνώμη σου.

Φιλικά Αλέξανδρος

alex 09-12-10 08:04

Ανδρέα καλημέρα
Σε μια δοκιμή που έκανα χωρίς DAO στο recordset
είδα ότι δούλεψε και χωρίς την προσθήκη DAO στο recordset.;Τελικά οπως φαίνεται αναγνωρίζει και το edit χωρίς την προσθήκη.

Alex

officeandi 09-12-10 09:38

Καλημέρα Αλέξανδρε,

Για να ενεργοποιήσεις τον ήχο, προτείνω να το μεθοδεύσεις ως εξής:
  • Το αρχείο του ήχου θα πρέπει να βρίσκεται στον ίδιο φάκελο, όπου βρίσκεται και η βάση δεδομένων.
  • Απενεργοποίησε πρώτα ΟΛΑ τα περιεχόμενα του cmdPrint_Click()
  • Απενεργοποίησε τα περιεχόμενα του CmdClose_Click από την αρχή μέχρι το DoCmd.Close, αλλά χωρίς το ίδιο.
  • Πάρε από το cmdPrint_MouseDown() την εντολή PlaySound "TestSound.wav" και τοποθέτησέ τη ως πρώτη εντολή μέσα στο cmdPrint_Click()
  • Αποθήκευσε τις αλλαγές και άνοιξέ τη κανονικά.
  • Με τις αλλαγές που θα έχεις κάνει δε θα εκτυπώνει, ούτε θα διαγράφει κατά το κλείσιμο.
  • Σιγουρέψου, ότι όσες φορές πατάς εκτύπωση ακούγεται ο ήχος. Σε εμένα δούλεψε.
  • Αν δουλεύει σωστά, ενεργοποίησε και πάλι τα περιεχόμενα στο cmdPrint_Click() και στο CmdClose_Click()
  • Σβήσε το cmdPrint_MouseDown (άδειο δε το χρειάζεσαι)
  • Έτοιμο.

Γιατί αυτές οι αλλαγές. Το PlaySound δεν είναι μέθοδος ούτε του Access ούτε του VBA, αλλά μέθοδος της φόρμας.
Το PlaySound δημιουργεί ένα Interoperability-layer (δυστηχώς δε γνωρίζω την αντίστοιχη ελληνική φράση) μεταξύ COM-Component (Access) και Windows Application Interface (WinAPI). για να καλέσει στη συνέχεια μια τη μέθοδο WinAPI."sndPlaySoundA" .

Το πρόβλημα; Πιστεύω πως ενώ το Access τα καταφέρνει με το MouseDown και το Click, το sndPlaySoundA μάλλον μπερδεύεται.
Click σημαίνει MouseDown + MouseUp. Συνήθως σε WinAPI-calls, για να αποφεύγονται αυτά χρησιμοποιούμε ή το Click ή το MouseDown και MouseUp. Σε COM-εφαρμογές (Access) η σειρά των γεγονότων είνα MouseDown-MouseUp-Click, οπότε δεν υπάρχει πρόβλημα.

Καλές δουλειές
Ανδρέας

alex 09-12-10 10:05

Ευχαριστώ Ανδρέα.
Όπως είπες εχω πολύ δουλειά.
Καλό μεσημέρι


Η ώρα είναι 21:14.

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


Search Engine Optimization by vBSEO 3.3.2