Γεια σας και πάλι!
Πέρα από το 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.
Τα λέμε!
Γιάννης.