2012-07-18 11 views
11

मैं थोड़ी देर के लिए एक्सेस के साथ काम कर रहा हूं, और हालांकि मैं सब पर एक फ़ंक्शन के स्पष्ट लाभ को समझता हूं, यह परिणामस्वरूप मूल्यों को वापस कर सकता है, मैं नहीं हूं निश्चित रूप से मुझे एक उपरोक्त फ़ंक्शन का उपयोग क्यों करना चाहिए। जब तक मैं गलत नहीं हूं तब तक; कार्य सब कुछ कर सकते हैं सब कुछ कर सकते हैं?फ़ंक्शंस पर उप-दिनचर्या का उपयोग करने का उद्देश्य

नोट: मैं कैसे दोनों उप और समारोह के तो देख नहीं उपयोग करने के लिए वे कैसे काम के लिए स्पष्टीकरण से पूरी तरह वाकिफ हूँ।

+0

* * subroutine * का एक कॉल एक बयान है; फ़ंक्शन का कॉल एक * अभिव्यक्ति * है। Subroutines परिस्थितियों के लिए हैं जब आप वापसी मूल्य के उत्पादन के बिना कुछ करने की जरूरत है। – dasblinkenlight

+0

सभी, प्रतिक्रियाओं के लिए धन्यवाद, मैं किए गए अंकों की सराहना करता हूं, हालांकि मैं वास्तव में क्या करने की कोशिश कर रहा हूं, अगर मुझे एक दिनचर्या चलाने की ज़रूरत है जो मूल्य वापस नहीं करता है। क्या एक उप किसी फ़ंक्शन पर कोई लाभ लाएगा, @TheNewOne ने उप निष्पादन समय को हाइलाइट किया है बेहतर हो सकता है लेकिन यह एक सिद्ध निष्कर्ष के रूप में नहीं पढ़ता है? –

+1

मुझे बाइट्स.com पर एक चर्चा मिली जो कि ब्याज की हो सकती है। यह सुनिश्चित नहीं है कि आप सब के साथ सिद्ध निष्कर्ष निकालने के लिए (बहुत मामूली) प्रदर्शन सुधार का न्याय करेंगे या नहीं। निजी तौर पर, मैं एक साधारण मानदंड का उपयोग करता हूं: प्रक्रिया तब तक उप होगी जब तक कि मुझे किसी फ़ंक्शन के एएस डेटाटाइप असाइनमेंट के साथ कोई मान वापस करने की आवश्यकता न हो। http://bytes.com/topic/access/answers/209591- कार्यक्षमता- vs-sub-public-vs-private – HansUp

उत्तर

8

मुख्य अंतर न केवल वापसी मूल्य है, ऐसा लगता है कि सब्स (कम से कम .NET में) से अधिक तेज़ हैं क्योंकि जब कोई मान वापस नहीं आता है तो एमएसआईएल कोड सब कम होता है। इसलिए जब कोई मूल्य वापस नहीं किया जाता है तो कुल subs तेजी से होते हैं। ओह मुझे इसके लिए एक महान स्रोत मिला है (.net के बारे में बात करते हैं), शायद आप इसके बारे में और अधिक पढ़ना चाहेंगे- Functions vs. Subroutines

+0

आश्चर्यजनक है कि एकमात्र अंतर नियमित रूप से वापस आने वाले मूल्यों के लिए थोड़ी गति वृद्धि नहीं होगी, जो कि एकमात्र उत्तर, चीयर्स प्रतीत होता है। –

+1

@ मैटडोनन, जबकि यह उत्तर दिलचस्प है, यह आपके प्रश्न के लिए प्रासंगिक नहीं है क्योंकि वीबीए एक पूरी तरह से अलग वातावरण है जिसका .NET ढांचा के साथ कुछ लेना देना नहीं है। यह स्पोर्ट्स कार के प्रदर्शन की जांच करके गोल्फ़ कार्ट के प्रदर्शन के बारे में धारणा बनाने जैसा है। कुछ समानताएं हैं, लेकिन मतभेद कहीं अधिक महत्वपूर्ण हैं। – phoog

+0

नमस्ते, ज़ाहिर है कि ज़्यादा तेज़ नहीं है और मैंने इसे वीबीए के लिए भी सही पाया है और 10,000,000 कॉल सब्सक्राइब 1 सेकेंड तक तेज हैं। खुश होती है। – TheNewOne

1

हां, एक फ़ंक्शन केवल एक उप है जो मान देता है।

0

आप ध्यान दें कि घटनाएं हमेशा subs होती हैं, कभी काम नहीं करतीं।

On Close: = MyCloseFunction() 

Subs एक मूल्य ByRef लौट सकते हैं: हालांकि, एमएस एक्सेस में, यह काम करता है बनाने के लिए उपयोगी होता है जब आप उन्हें एक घटना की संपत्ति के रूप में उपयोग करना चाहते हैं हो सकता है।

11

प्रदर्शन के संदर्भ में, यह कोई महत्वपूर्ण मुद्दा नहीं होगा।

मुख्य अंतर यह है कि उपयोगकर्ता परिभाषित फ़ंक्शन को आपके कोड में अभिव्यक्ति में उपयोग किया जा सकता है, जहां एक उप नहीं हो सकता है।

यह वास्तव में यहां एक अंतर का विशाल माउंट एवरेस्ट है।

यह अंतर वास्तव में प्रवेश करने के लिए ही सीमित नहीं है, लेकिन आदत हर कार्यक्रमों की भाषा पर लागू होता है और मुझे लगता है कि प्रणाली के बारे में सोच सकते हैं उपयोगकर्ता परिभाषित कार्यों के निर्माण का समर्थन करता है।

परिभाषित समारोह का उपयोग करने का मुख्य लाभ कई हैं, लेकिन सबसे बुनियादी मुद्दा यह है कि इस तरह के समारोह भाव में इस्तेमाल किया जा सकता है।

एक फार्म पर एक बटन के लिए सेटिंग क्लिक पर

उदाहरण के लिए, एक में, आप आम तौर पर एक VBA [इवेंट कोड] दिनचर्या कि बटन से जुड़ी हो सकती है।

लेकिन अगर आप भी इस तरह संपत्ति शीट में एक अभिव्यक्ति जगह कर सकते हैं: ऊपर अभिव्यक्ति में

=MyUserFunction() 

ऊपर एक आसान टिप है, के बाद से तो आप एक फार्म पर 10 नियंत्रण हाइलाइट कर सकते हैं, और प्रकार और आपने उपर्युक्त फ़ंक्शन को उन 10 बटनों पर असाइन किया है। आप उपरोक्त उपरोक्त नहीं कर सकते हैं।

एक और महत्वपूर्ण अंतर आप एक फार्म या रिपोर्ट पर एक पाठ बॉक्स के लिए डेटा स्रोत के रूप में एक समारोह (अभिव्यक्ति) का उपयोग कर सकते हैं (फिर से आप एक उप के साथ ऐसा नहीं कर सकते) है।

एक और महत्वपूर्ण अंतर यह है कि आप इन कार्यों को एसक्यूएल में उपयोग कर सकते हैं। यह वास्तव में शानदार क्षमता है क्योंकि आपके पास क्वेरी की प्रत्येक पंक्ति के लिए "रन" कोड हो सकता है। और इसका मतलब है कि आप एसक्यूएल की क्षमता और कार्यात्मक रूप से विस्तार कर सकते हैं।

और आप इस विचार का उपयोग एसक्यूएल क्वेरी में वीबीए चर प्रदर्शित करने के लिए भी कर सकते हैं क्योंकि आप बस एक सार्वजनिक फ़ंक्शन बनाते हैं जो वीबीए वैरिएबल देता है और इसका उपयोग क्वेरी में किया जा सकता है - हालांकि आप किसी क्वेरी में वीबीए चर का उपयोग नहीं कर सकते !

और यह एसक्यूएल के विस्तार को खोलता है अंतहीन विचारों:

तो मैं कहा जाता है कल एक सार्वजनिक समारोह का निर्माण कर सकते()

Public Function Tomorrow() as date 

    Tomorrow() = date() + 1 

End Function. 

अब क्वेरी बिल्डर में, मैं जा सकते हैं:

Select FirstName, lastName, Tomorrow() as NextDay from tblCustomers 

और आप कस्टम रूपांतरण भी कर सकते हैं जैसे:

Select FirstName, LastName, Celsius([DailyGreenHouseTemp]) from tblGreenHouse. 

ऊपर डेली तापमान पढ़ने फारेनहाइट में में कर सकता है और आप बस एक सार्वजनिक समारोह इस तरह सेल्सियस बुलाया परिभाषित करने के लिए है:

Public Function Celsius(Temperature As Variant) As Variant 

    Celsius = (Temperature * 1.8) + 32 

End Function 

अब ऊपर समारोह सरल है, जबकि, यह जटिल रिकॉर्ड कर सकता है एक जटिल प्रसंस्करण सेट तापमान और आर्द्रता के आधार पर एक फूल के बर्तन के ऊपर नमी निर्धारित करने के लिए एल्गोरिदम।

तो एक बार जब हम इस तरह के एक सार्वजनिक समारोह को परिभाषित करते हैं, तो मुख्य अवधारणा इस तरह का एक फ़ंक्शन न केवल वीबीए कोड में अभिव्यक्ति के रूप में उपयोग किया जा सकता है, लेकिन यह भी आश्चर्यजनक उपयोग किया जा सकता है कि इस क्षमता में एसक्यूएल शामिल है।

तो भी कोड में, आप जा सकते हैं:

If MyCustomfucntion(SomeVar) = lngTestValue then 

फिर ऊपर में, आप एक उप VBA भाव में उपयोग नहीं कर सकते।

और एक्सेस में रिबन के लिए कस्टम एक्सएमएल का उपयोग करते समय और भी दिलचस्प है, तो यदि आप "क्रिया पर" विशेषता के लिए फ़ंक्शन() अभिव्यक्ति का उपयोग करते हैं तो आप रिबन कॉल बैक की आवश्यकता से बच सकते हैं। इससे भी बेहतर यह है कि रिबन उन कार्यों() को वर्तमान रूप में कॉल करेगा, न कि सार्वजनिक कोड मॉड्यूल जैसे कि आपको रिबन कॉल बैक के साथ करना होगा।

मैं शायद अंतर के रूप में अन्य 10+ पृष्ठों के लिए टाइप कर सकता हूं, लेकिन मुझे लगता है कि यह अनावश्यक होना शुरू हो जाएगा और मैं यहां किसी भी तरह से घनत्व नहीं दिखाना चाहता हूं।

तो वीबीए में एक उप और फ़ंक्शन के बीच मूल अंतर या वास्तव में अधिकांश प्रोग्रामिंग भाषाओं में मूल रूप से वही है।

और एक्सेस में किसी फ़ंक्शन का उपयोग करने या किसी भी प्रोग्रामिंग भाषा के बारे में केवल लाभ समान हैं। उदाहरण के लिए मैं टी-एसक्यूएल (स्केलर) में उपयोगकर्ता परिभाषित फ़ंक्शन को परिभाषित कर सकता हूं - और फिर आप उस टी-एसक्यूएल फ़ंक्शन का उपयोग अपने किसी भी टी-एसक्यूएल कोड या यहां तक ​​कि क्वायर जो आप बनाते हैं और एसक्यूएल सर्वर के लिए उपयोग करते हैं, का उपयोग करने के लिए स्वतंत्र हैं।

तो यह सब और एक फ़ंक्शन के बीच बुनियादी और सरल अंतर है, और मुझे लगता है कि जो लोग कंप्यूटर कोड लिख चुके हैं, वे किसी भी प्रोग्रामिंग भाषा में ही उपरोक्त और एक समारोह के बीच उपरोक्त महत्वपूर्ण और उपयोगी अंतरों को महसूस करेंगे ।

+2

धन्यवाद अल्बर्ट, मैं वास्तव में अंतर की व्याख्या करने के लिए आपके द्वारा उठाए गए समय की सराहना करता हूं। यह मेरे प्रश्न के वाक्यांश के लिए नीचे हो सकता है (और यदि यह है तो मैं क्षमा चाहता हूं) लेकिन मुझे उपरोक्त के बारे में पता है और मैं इस क्षेत्र में अनुभव कर रहा हूं (हालांकि मुझे पता है कि यह इस धागे को उठाए रखने के लिए उपयोगी जानकारी के रूप में कार्य करता है) I जानें कि कितने महान कार्य हैं और वे कौन सी संभावनाएं सक्षम करते हैं, मैं वास्तव में पहुंचने की कोशिश कर रहा था, क्यों "उप" कभी भी बेहतर विकल्प लेने का विकल्प होगा? –

+0

@ मैटडोनन, जैसा कि मैंने उल्लेख किया है, सब एक घटना के लिए * केवल * पसंद है। – Fionnuala

+1

@Remou मैं देखता हूं कि आपका क्या मतलब है, अगर मैं किसी भी अंतर्निहित घटनाओं का उपयोग करता हूं तो यह कोड को उप के रूप में डालेगा, हालांकि यह एक्सेस के अंतर्निहित व्यवहार है, संभवतया एमएस घटनाओं को स्वत: उत्पन्न करने के लिए ईवेंट सेट कर सकता है अगर वे कामना की। अफसोस की बात है कि मैंने जो सवाल पूछा है वह किसी के लिए किसी भी महान मूल्य का नहीं होने वाला है, मैंने सोचा कि उप के अस्तित्व का उद्देश्य क्या है, वे सभी कार्य क्यों नहीं कर रहे हैं? –

1

मुझे बिल्कुल यकीन नहीं है, हालांकि, मुझे लगता है कि सबस फ़ंक्शंस से तेज़ हैं क्योंकि सबराउटिन के चर को सबराउटिन के निर्माण पर परिभाषित किया जाता है और स्मृति स्थान को संदर्भित करके एक्सेस किया जाता है। जब भी उन्हें एक्सेस किया जाता है तो कार्यों को मेमोरी स्पेस आवंटित करना होगा।

सबराउटिन कॉलिंग कोड में चर को संशोधित करता है और फ़ंक्शंस उन्हें बरकरार छोड़ देता है।तो एक सबराउटिन कॉलिंग कोड में कई संशोधित टुकड़ों को जानकारी प्रदान कर सकता है (जैसे कि चर के रूप में कई बदलाव होते हैं, जिनमें एरे भी शामिल हैं) लेकिन एक फ़ंक्शन केवल उस समय के लिए एक उत्तर प्रदान कर सकता है जो उसके पास पास किए गए मानों के लिए हो। इस अंतर के कारण, यदि यह महत्वपूर्ण है कि एक सबराउटिन में एक चर अपना मान नहीं बदलता है, तो किसी को सबराउटिन के भीतर परिभाषित अस्थायी चर के लिए मान असाइन करना होगा।

1

FWIW (मेरे सिद्धांत;) -

इस को समझने के लिए असली दुनिया के थिंक देता है।

आइए कहें कि आप कुछ करना चाहते हैं। ऐसा करने के कम से कम 2 तरीके हैं (कम से कम)।

पहला तरीका, मददगारों को जानकारी के लिए अनुरोध भेजें और वे आपके लिए जानकारी के साथ वापस आ जाएंगे। इसलिए आप नियंत्रण में रहते हैं यानी सभी जानकारी आपको वापस बह रही है और आप यह तय कर रहे हैं कि यदि कोई हो तो आगे क्या करना है। यह केंद्रीय नियंत्रित वातावरण का अधिक है। यह vba

दूसरा तरीका है, काम को अलग-अलग कार्यों में विभाजित करें और अपने सहायकों को आपके लिए कार्य पूरा करने के लिए ज़िम्मेदारी सौंपें यानी वास्तविक कार्य केवल जानकारी एकत्र करने के विपरीत मददगार द्वारा किया जाता है। यह वीबीए में 'उप' का सार है।

तो सोचें कि कोड तोड़ने पर क्या करना है। फ़ंक्शन कॉल के साथ, आप विफलता के कारण की तलाश करने के लिए केंद्रीय कमांड पर ध्यान केंद्रित करते हैं। उप कॉल के साथ, आपको प्रत्येक उप के काम में भाग लेना होगा और यह पता लगाना होगा कि उन्होंने क्या किया है।

बेशक, आप उद्देश्य को खराब कर सकते हैं और कार्यों को काम कर सकते हैं और सबकुछ सिर्फ जानकारी प्राप्त कर सकते हैं, लेकिन चीजें तोड़ने पर यह वास्तव में भ्रमित हो जाएगा! ओह लेकिन आप ऐसा नहीं कर सकते हैं, इस लिंक को पढ़ें - http://www.cpearson.com/excel/differen.htm, जो बताता है कि एक्सेल कोशिकाओं के मूल्यों को बदलने वाले कार्यों को प्रतिबंधित करता है और उप-कोशिकाओं से बुलाया जाता है।

संबंधित मुद्दे