kastania Δημοσ. 4 Μαΐου 2007 Δημοσ. 4 Μαΐου 2007 Γεια σας!!! Πρώτη φορά κάνω post στο forum σας, ελπίζω να βρω κάποιον να με βοηθήσει.... Ξεκινάω.... Έχω μια φόρμα που έχει ενα πεδίο ημερομηνίας. Θέλω λοιπόν αν ο χρήστης βάλει αντι για ημερομηνια σε σωστο format , χαρακτηρες, να μην τον αφήνει να φύγει από το πεδίο μέχρι να το διορθώσει. Αυτό το κατάφερα πιάνοντας τα πιθανά λάθη σε εναν trigger on-error στον οποίο μέσα κάνω RAISE Form_trigger_Failure. Το πρόβλημα μου είναι ότι αν ο χρήστης δεν διορθώσει το πεδίο, θέλω πατώντας ενα κουμπί Cancel που έβαλα να κάνει clear. Επειδή όμως έχει σηκωθεί Form_trigger_Failure, αν δεν σβήσει ο χρήστης τα λάθος data δεν δουλεύει τίποτα στην φόρμα!!! Υπάρχει κάποιο workaround???? Μήπως δεν κάνω σωστά το validation???????
random Δημοσ. 4 Μαΐου 2007 Δημοσ. 4 Μαΐου 2007 εγώ οταν θέλω ο χρήστης να συμπληρώσει κάτι που θα περάσει απο έλεγχο για εγκυρότητα πάνω στη φόρμα (δηλ. πριν φτάσει στη database), βάζω τον έλεγχο σε WHEN-VALIDATE-ITEM trigger, πάνω στο συγκεκριμένο πεδίο. 1. αν η συμπλήρωση της ημ/νιας ειναι υποχρεωτική, βαλε στα properties του πεδίου required=yes με το που θα μπεί, δεν θα τον αφήνει να φύγει αν δεν γράψει κάτι. μερικές φορές ειναι σπαστικό, γιατι μπορει να μπηκε στο πεδιο κατα λάθος, και να μην μπορεί να φύγει. Αν δεν θελεις να τον μπλοκάρεις έτσι, άφησε το required=no, και κάνε έλεγχο για τον αν είναι NULL, όταν γίνει το save/commit 2. για το format ημερομηνιών, κατ αρχήν επιλέγω το data type του πεδίου να ειναι date ή datetime, οποτε οι βασικοί έλεγχοι αν εχει γράμματα, αν δώσει 30 Φεβρουαρίου, κλπ, γίνονται αυτόματα χωρις να γράψεις καθόλου κώδικα. αν το εχεις σαν CHAR πρεπει να κανεις εσυ τους ελέγχους αλλα δεν ειναι δύσκολο. για το Format προσωπικά προτιμώ το dd/mm/RRRR αυτό δινει την πιο μεγάλη ελευθερία στο χρήστη, χωρίς να εχεις μεγάλο κίνδυνο απο "άκυρες" ημ/νίες. δηλ. αν ο χρήστης γράψει ένα απο τα 050607, 05062007, 5/06/07, 05/06/2007, 05-06-07, 05-6-2007 η φόρμα θα το μετατρέψει στο αναμενόμενο 05/06/2007 με το RR, αν ο χρηστης δώσει 00-49, υποθέτουμε οτι εννοεί 2000-2049, ενώ απο 50-99, οτι εννοεί 1950-1999. δεν το χρησιμοποιούμε αν η βάση αφορά ειδικές περιπτώσεις, πχ. ιστορικά γεγονότα, που μπορει να ζητάμε ημερομηνίες οποιουδήποτε αιώνα. τοτε βαλε ετος ΥΥΥΥ να πληκτρολογεί υποχρεωτικά και τα 4. --------------------------------------------------- οποτε : αν εχεις required=yes τον αναγκάζεις να συμπληρώσει. αν εχεις data type = date, εισαι σιγουρος οτι θα ειναι κάποια valid ημ/νια. εστω οτι θελεις να ελενξεις οτη η ημ/νια ειναι μεσα σε λογικά πλαίσια. πχ. οχι μικρότερες απο 2007, και όχι μελοντικές. >DECLARE SHMERA DATE:= TO_DATE(:SYSTEM.EFFECTIVE_DATE,'DD-MON-YYYY HH24:MI:SS'); BEGIN IF :MYDATE NOT BETWEEN TO_DATE('01012007','DDMMYYYY') AND SHMERA THEN MHNYMA('ΣΟΒΑΡΕΨΟΥ!!!'); raise form_trigger_failure; --edw kleidonetai o user mesa sto pedio, mexri na to dior8wsei. END IF; END; αν θελεις, μπορεις να τα σβηνεις εσύ τα λαθος data, πριν σηκώσεις το μηνυμα, οποτε ο χρηστης να μην κλειδωθεί. μεσα στο IF... MHNYMA :MYDATE:=NULL; ...και το raise πλέον περιττέυει, αφου του έσβησες οτι λάθος έγραψε. Εγώ δεν το κάνω. μπορει να θελει να διορθωσει μονο 1 ψηφιο της ημνιας, και να την κανει σωστή. Καλύτερα να τη σβήνει μονος του αν θελει να βγει απο το πεδίο. ----------------------------------------------- αν το πεδίο δεν μπορεις να το εχεις date/datetime (κακώς), και το εχεις CHAR, μετατρεπεις το char σε date, και αν δεν γίνεται, σηκώνεις μηνυμα και error. >declare x date; begin x:= to_date( :mydate, 'dd/mm/yyyy' ); exception when others then MHNYMA( 'ΣΟΒΑΡΕΨΟΥ!!! σφάλμα μετατροπής ημ/νιας: ' || sqlerrm ); raise form_trigger_failure; end; στη θέση του 'dd/mm/yyyy' βάζεις εσυ όποιο φορματ εχετε συμφωνήσει οτι θα συμπληρώνουν οι χρήστες.
kastania Δημοσ. 7 Μαΐου 2007 Μέλος Δημοσ. 7 Μαΐου 2007 Σε υπερευχαριστώ που ασχολήθηκες τόσο! Κοίτα τι συμβαίνει... Δοκίμασα αυτά που μου είπες και είχα καταλήξει στην λύση μέσα στο IF να σηκώνω raise form_trigger_failure. Έτσι όμως, δεν άφηνε τον χρήστη να πατήσει cancel, μέχρι να διορθώσει τα data. Και είναι απολύτως λογικό αίτημα να θέλει ο χρήστης οποιαδήποτε στιγμή θέλει να πατήσει CANCEL. Απο την άλλη αν το έκανα με το χέρι null τότε αν πατούσε save θα αποθηκευόταν ημερομηνία null στην εγγραφή. Τέλοσπάντων, μετά από ώρες διαβάσματος, ψαξίματος έκανα το εξής: Έβαλα την φόρμα μου να κάνει validation σε form level. Οπότε Βάζοντας λάθος ημερομηνία, κάνει validation μόλις πατήσω save(commit) και επειδή είναι σε form level με αφήνει να πατήσω το cancel αν θέλω.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.