Εμφάνιση ενός μόνο μηνύματος
  #9  
Παλιά 27-01-10, 23:23
Το avatar του χρήστη nisgia
nisgia Ο χρήστης nisgia δεν είναι συνδεδεμένος
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 186
Προεπιλογή

Γεια σας και πάλι!

Πέρα από το Multithreading, βασική παράμετρος στην απόδοση του κάθε συστατικού του Automation (COM),
είναι ο τρόπος με τον οποίο λειτουργεί μέσα σε μια εφαρμογή.

Επειδή όλες οι εφαρμογές του MS Office ανήκουν στην κατηγορία “Out-Of-Process Servers”,
όταν τις χρησιμοποιούμε ως server, το αντίγραφο της κλάσης τους αποθηκεύεται
σε διαφορετική περιοχή μνήμης από αυτό της client εφαρμογής.
Για παράδειγμα, όταν ελέγχουμε το Excel μέσα από την Access, η εφαρμογή της Access λειτουργεί ως client
ενώ το Excel ως server και η περιοχή διεργασιών(processes) του Excel δεν είναι στην ίδια περιοχή με αυτή της Access.

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

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

Παρακάτω φαίνεται ο τρόπος με τον οποίο μπορούμε να "μιλήσουμε" "λακωνικά" στο Excel μέσα από την Access
και να περάσουμε τα δεδομένα ενός πίνακα σε μια περιοχή ενός φύλλου του Excel με μια και μόνο εντολή:

Κώδικας:
    varData = Rs.GetRows
    With objWB.worksheets(1)
        .range(.cells(1), .cells(UBound(varData, 2) + 1, _
                UBound(varData) + 1)) = .Parent.Parent.transpose(varData)
    End With
Τα δεδομένα τα οποία βρίσκονται στο αντικείμενο ADODB.Recordset Rs περνάνε σε μια διάταξη τύπου Variant (varData)
με την μέθοδο GetRows του Rs και στην συνέχεια στα κελιά μιας περιοχής (ίδιων διαστάσεων με το πλέγμα του Rs)
του πρώτου φύλλου του βιβλίου objWB (αντικείμενο Workbook).

Ένας ακόμη πιο γρήγορος τρόπος είναι η κλήση μιας μεθόδου η ο οποία βρίσκεται αποθηκευμένη σε ένα υπάρχον βιβλίο εργασίας.
Από την πλευρά της Access μπορούμε καλέσουμε τη αποθηκευμένη μέθοδο GetData του αντικειμένου objWB ως εξής :

Κώδικας:
    objWB.Parent.Run "Test.xls!GetData", Rs
Eνώ η μέθοδο GetData από την πλευρά του Excel, θα μπορούσε να έχει ως εξής:

Κώδικας:
Sub GetData(objRS As Object)
    Dim varData As Variant

    varData = objRS.GetRows
    With ThisWorkbook.Worksheets(1)
        .Range(.Cells(1), .Cells(UBound(varData, 2) + 1, UBound(varData) + 1, = _
                Application.WorksheetFunction.Transpose(varData)
        .Parent.Save
    End With
End Sub
Ελπίζω να βάζω και εγώ με τα παραπάνω ένα λιθαράκι στη γνώση για την τεχνολογία Automation
και την επικοινωνία μεταξύ των εφαρμογών του Office.

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

Τελευταία επεξεργασία από το χρήστη nisgia : 27-01-10 στις 23:26.
Απάντηση με παράθεση