Function replace

Συζητήσεις για την τοπική βάση δεδομένων Access της Microsoft

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Cat-Cat
Δημοσιεύσεις: 11
Εγγραφή: 05 Ιουν 2006 13:24

Function replace

Δημοσίευση από Cat-Cat » 19 Οκτ 2007 12:22

Καλή ημέρα σε όλους. Προσπαθώ να κάνω μία μαζική αλλαγή σε πίνακα με στοιχεία που δίνει ο χρήστης. Ευρεση - αντικατάσταση. Δεν μπορώ να κατανοήσω τη σύνταξη της function replace. Θέλω η εύρεση να γίνει από την αρχή του πεδίου και όχι σε όλο το πεδίο. Μπορεί κανείς να βοηθήσει :question:

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Function replace

Δημοσίευση από dva_dev » 19 Οκτ 2007 14:07

Το εύρεση - αντικατάσταση είναι δύο ξεχωριστές λειτουργίες.
Το αν ξεκινάει από την αρχή του πεδίου η όχι θα στο πεί η Εύρεση (χρησιμοποιείς την Instr) επιστρέφοντας ότι το string που αναζητάς βρέθηκε να ξεκινάει στην αρχή του string που έχεις (θέση 1) οπότε και θα προχωρήσεις στην αντικατάσταση.
Αν επιστρέψει οτιδήποτε άλλο, πάει να πεί ότι δεν βρέθηκε καθόλου ή βρέθηκε σε κάποιο άλλο σημείο πάντως όχι στην αρχή.
Στην αντικατάσταση θα κοιτάξεις τις παραμέτρους σου ώστε να αντικαταστήσει μόνο 1 φορά αυτό που θα βρεί (ουσιαστικά αυτό που έχεις βρεί πριν, στην αρχή του string) και όχι όλες τις φορές που θα το βρεί (γιατί μπορεί να υπάρχει και σε άλλα σημεία εκτός από την αρχή).

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Function replace

Δημοσίευση από Programmer » 20 Οκτ 2007 06:46

Υπάρχουν δύο περιπτώσες επειδή αντιλαμβάνομαι την διατύπωσή σου ως ελλειπή...

Η πρωτη περίπτωση είναι να αναφέρεσαι για το πλάισιο διαλόγου εύρεση και αντικακάσταση του μενού επεξεργασία -> εύρεση. Σε αυτήν την περίπτωση κάνεις κλικ στο όνομα του πεδίου ώστε να επιλεγέι΄μόνο η στήλη του πεδίου και προχωράς στα παρακάτω... στον διάλογο του "εύρεση και αντικακάσταση", θα εμφανίζεται το όνομα επιλεγμένου πεδίου

Η δεύτερη περίπτωση είναι να έχεις συντάξει μια μακροεντολή ή κώδικα της visual basic και η συνάρτηση replace, να μην κάνει αυτό που θέλεις... Μπορέις να δεις την συνάρτηση αυτή από την βοήθεια της accses... Αλλά χρειάζεται να δώσεις περισσότερα στοιχεία για τί ακριβώς πρόκειται ώστε να μην μπαίνουμε στον κόπο να σου λέμε διάφορα που δεν θα σου κάνουν και την δουλεια σου...

Άβαταρ μέλους
Cat-Cat
Δημοσιεύσεις: 11
Εγγραφή: 05 Ιουν 2006 13:24

Function replace

Δημοσίευση από Cat-Cat » 24 Οκτ 2007 13:41

το αρχείο είναι τηλεφωνικός καταλόγος.
Ο χρήστης δίνει σε μία φόρμα έναν πρόθεμα τηλεφώνου (Me![old_phone]) προς αναζήτηση
σε μία δεύτερη φόρμα εμφανίζω σε query το αποτέλεσμα της αναζήτησης και ο
χρήστης δίνει το νέο πρόθεμα (Me![new_phone]),
Θα ήθελα με μία εντολή να αντικαταστήσω το πρώτο μέρος του πεδίου [MAG Phones.PhoneNo] με το νέο πρόθεμα.

Η παρακάτω εντολή δεν κάνει τίποτα.
Από το help της access δεν μπορώ να βγάλω άκρη. Είναι και από τις περιπτώσεις που δεν έχει ένα παράδειγμα.

Private Sub Εντολή11_Click()
Replace([MAG Phones.PhoneNo], Me![old_phone], Me![new_phone], 2)

End Sub

Ελπίζω τώρα να είναι πιο κατανοητό το πρόβλημα

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Function replace

Δημοσίευση από dva_dev » 24 Οκτ 2007 22:11

Κώδικας: Επιλογή όλων

Replace([MAG Phones.PhoneNo], Me![old_phone], Me![new_phone], 1, 1)

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Function replace

Δημοσίευση από Programmer » 25 Οκτ 2007 20:36

Αν το πεδίο τηλεφώνου δεν είναι αλφαριθμητικό δεν μπορεί να γίνεται.

Δοκίμασε

Replace([Ονομα_Φορμας0![ονομα_πινακα.πεδίο], Ονομα_φόρμας1![ονομα_αντικειμένου1],
Ονομα_φόρμας2![ονομα_αντικειμένου2 ], Me![new_phone], -1, 1)

Λογικά το Ονομα_πινακα.πεδίο δεν μπορέι να επιστρέψει ένα αλφαριθμητικό που περιέχει όλα τα τηλέφωνα του πεδίου του πίνακα. Αν επισστρέψει κάτι θα πρέπει να περιέχει το τηλέφωνο της τρέχουσας εγγραφής.

Πάλι λογικά δεν μπορέις με μια replace να αλλάξεις όλες τις εγγραφές ενός πεδίου πίνακα. Χρειάζεσαι βρόγχο να διατρέξεις όλες τις εγγραφές, και να τις αλλάζεις μία - μία.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Function replace

Δημοσίευση από dva_dev » 25 Οκτ 2007 21:15

Αν είναι για μαζική αλλαγή σε πεδίο πίνακα ίσως είναι προτιμότερο να γίνει με ένα query.

Κώδικας: Επιλογή όλων

UPDATE [MAG Phones] SET [MAG Phones].PhoneNo = [new_phone] & Mid("PhoneNo",Len([old_Phone]))
WHERE ([MAG Phones].PhoneNo Like [old_Phone] & "*");

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Function replace

Δημοσίευση από Programmer » 26 Οκτ 2007 00:44

Υπάρχουν σεπεριβάλλοντα όπως η access πολλές λύσεις για ένα πρόβλημα.

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

Π.χ. αν ο χρήστης που δημοσιευεσε το πρόβλημα του δεν μπορέι να βεβαιωθεί αν στον πίνακα του οι αριθμοί τηλεφώννου δεν είναι καταχωρημένοι σαν αριθμοί αλλά σαν αλφαριθμητικά, τότε ότι και να λέμε εμείς το πρόβλημα δεν λύνεται... η συνάρτηση replace απαιτέι αλφαριθμιτικά σαν ορίσματα...
Θα πρέπει να κυνηγάμε τον αρχάριο να καταφέρουμε να μας δώσει μια επαρκή περιγραφή. Εκέινος βλέπει ολόκληρη την ΒΔ εμέις μόνο τις ανεπαρκείς περιγραφές του...

Άβαταρ μέλους
Cat-Cat
Δημοσιεύσεις: 11
Εγγραφή: 05 Ιουν 2006 13:24

Function replace

Δημοσίευση από Cat-Cat » 29 Οκτ 2007 11:00

Ευχαριστώ Programmer. Το πεδίο είναι αλφαριθμητικό.

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Function replace

Δημοσίευση από Programmer » 30 Οκτ 2007 12:52

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

str2 = Replace(str1, findstr, replacestr,1,1)

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

'Tablename string Το όνομα του πίνακα π.χ. "Πινακας1"
'FieldIndex integer Ο αριθμός σειρας πεδίου πίνακα. Το πρώτο είναι 0 το δεύτερο 1, κ.τ.λ.
'findwhat string Το τμήμα του αλφαριθμητικού που θα αναζητηθεί.
'Replacewith string Τα αλφαριθμητικό που θα αντικαταστήσει το τμήμα που θα αναζητηθεί, αν ευρεθεί.

Public Sub myReplace(Tablename As String, FieldIndex As Integer, _
findwhat As String, Replacewith As String)
On Error GoTo Err_Handler

Dim str As String

'ADO RECORDSET
Dim cnThisConnect As New ADODB.Connection
Dim rs As New ADODB.Recordset

'ΑΝΟΙΓΜΑ ΤΟΥ ΠΙΝΑΚΑ Tablename
Set cnThisConnect = CurrentProject.Connection
rs.Open Tablename, cnThisConnect, adOpenKeyset, adLockOptimistic, adCmdTable

'ΑΝ ΔΕΝ ΥΠΑΡΧΟΥΝ ΕΓΓΡΑΦΕΣ
If rs.RecordCount < 1 Then
GoTo CLOSE_RECORDSET_POINT
End If

rs.MoveFirst

'ΔΕΙΚΤΗΣ (MOUSE) ΑΝΑΜΟΝΗΣ
Screen.MousePointer = 11 'vbHourglass

While rs.EOF <> True
str = rs.Fields(FieldIndex).Value
rs.Fields(FieldIndex).Value = Replace(str, findwhat, Replacewith, 1, 1, vbDatabaseCompare)
rs.Update
rs.MoveNext
Wend


CLOSE_RECORDSET_POINT:
'ΚΛΕΙΝΟΥΜΕ ΤΙΣ ΣΥΝΔΕΣΕΙΣ ΜΕ ΤΟΝ ΠΙΝΑΚΑ ΚΑΙ ΤΗΝ ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ

rs.Close
Set rs = Nothing
cnThisConnect.Close

'ΚΑΝΟΝΙΚΟΣ ΔΕΙΚΤΗΣ ΦΟΡΜΑΣ (MOUSE)
Screen.MousePointer = 0 'vbDefault

Exit_Proc:
Exit Sub
Err_Handler:
MsgBox Err.Description, , "Error!"
Resume Exit_Proc

End Sub

Απάντηση

Επιστροφή στο “MS Access”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες