कंस्ट्रक्टर में नेस्टेड क्वेरीज़. क्वेरी कंस्ट्रक्टर 1सी क्वेरी कंस्ट्रक्टर शर्तें

तो, आइए कुछ सरल से शुरू करें: कॉन्फिगरेटर में एक नई प्रोसेसिंग बनाएं, इसे क्वेरी कंसोल या क्वेरी बिल्डर नाम दें, जैसा आप चाहें।

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

अपनी पैरामीटर तालिका बनाने के लिए, इसके "सारणीबद्ध भाग" में "डेटा" टैब पर हम एक नई तालिका जोड़ेंगे, इसे क्वेरी पैरामीटर कहेंगे, यहां हम इस तालिका के कॉलम जोड़ेंगे: 1) पैरामीटर नाम, टाइप स्ट्रिंग = 25 अक्षर; पैरामीटर वैल्यू, यहां एक समग्र डेटा प्रकार है, चित्र देखें:

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

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

यहां मुख्य बात यह है: फॉर्म को संपादित करने के लिए "टेक्स्टवैल्यूज़" विशेषता को बाएं फ़ील्ड में खींचने के बाद, इसके गुणों में "व्यू" = टेक्स्ट दस्तावेज़ फ़ील्ड सेट करना सुनिश्चित करें। चित्र देखें:

"क्वेरी टेबल" विशेषता के गुणों में, आप वैकल्पिक रूप से "डिस्प्ले ग्रिड" और "डिस्प्ले हेडर" निर्दिष्ट कर सकते हैं।

इसके बाद, फॉर्म को संपादित करने के लिए दाहिनी विंडो में, "कमांड" टैब पर जाएं और एक नया बटन जोड़ें, जिस पर क्लिक करने पर हमारा कंसोल एक निश्चित कार्रवाई करेगा। आइए एक "क्वेरी डिज़ाइनर" बटन बनाएं, यदि आप चाहें, तो आप बटन में एक आइकन जोड़ सकते हैं, मुख्य बात यह है कि बटन को बाएं फॉर्म संपादन विंडो में ही रखें - ताकि हम इसे देख सकें। फिर दाएं फॉर्म में संपादन विंडो, हमारे बटन पर राइट-क्लिक करें और गुणों का चयन करें - गुणों में, "एक्शन" आइटम पर क्लिक करें, एक मोडल विंडो दिखाई देगी जिसमें पूछा जाएगा कि वास्तव में हमारा प्रोग्राम कोड कहां निष्पादित किया जाएगा, जिसे हम बटन को असाइन करेंगे - चुनें " ग्राहक पर”

फॉर्म मॉड्यूल एक तैयार खाली प्रक्रिया "प्रोसीजर क्वेरी कंस्ट्रक्टर (कमांड)" के साथ खुलेगा। इस प्रक्रिया के अंदर हम मानक 1c8 क्वेरी बिल्डर को कॉल का वर्णन करेंगे। यह बहुत आसान है: कंस्ट्रक्टर = नया अनुरोध कंस्ट्रक्टर;लेकिन यहां कुछ कमियां हैं - प्लेटफ़ॉर्म में निर्मित क्वेरी कंस्ट्रक्टर केवल एक मोटे क्लाइंट के तहत उपयोगकर्ता मोड में काम करता है! इसलिए, हम प्रीप्रोसेसर निर्देश #यदि की स्थिति सम्मिलित करेंगे, लेकिन यहां आप अपने प्लेटफ़ॉर्म के आधार पर स्वयं निर्णय लेते हैं, या आपके पास सामान्य फ़ॉर्म हैं, तो "चुनें" FatClientRegularApp"या आपके पास प्रबंधित प्रपत्रों पर आधारित एक मंच है, तो" थिकक्लाइंटमैनेज्डएप्लिकेशन“.अंजीर देखें.

अब इस प्रक्रिया में अनुरोध पाठ को रिकॉर्ड करने के लिए एक शर्त जोड़ना बाकी है, जिसे क्वेरी बिल्डर हमारे "अनुरोध पाठ" फॉर्म विवरण में हमारे लिए उत्पन्न करेगा:

यदि Constructor.OpenModal()=True तो object.RequestText=Constructor.Text; अगर अंत;

लेकिन हम अनुरोध टेक्स्ट में मैन्युअल रूप से कुछ बदल सकते हैं (उपयोगकर्ता मोड में - "अनुरोध टेक्स्ट" विशेषता विंडो में) ताकि हमारे परिवर्तन क्वेरी कंस्ट्रक्टर में आ जाएं जब इसे दोबारा बुलाया जाए - हम यहां एक सरल शर्त जोड़ देंगे:

यदि EmptyString(Object.QueryText) नहीं है तो Constructor.Text = object.QueryText; अगर अंत;

बस इतना ही, हमने 1c8 प्लेटफ़ॉर्म में निर्मित क्वेरी कंस्ट्रक्टर को कनेक्ट कर दिया है, आइए हमारे काम पर नज़र डालें। ऐसा करने के लिए, निम्न विधियों में से किसी एक का उपयोग करके मोटे क्लाइंट मोड में 1C: एंटरप्राइज लॉन्च करें: 1) कॉन्फिगरेटर का मुख्य मेनू - डिबगिंग - डिबगिंग प्रारंभ करें - मोटा क्लाइंट; 2) या यदि आपके पास कॉन्फिगरेटर में नियंत्रण कक्ष पर ये कुंजियाँ हैं - तो बस एक मोटे बिंदु के साथ पीले वृत्त वाले बटन को दबाएँ, चित्र देखें:

1cEnterprise8 का उपयोगकर्ता मोड शुरू होता है, हम अपनी प्रोसेसिंग ढूंढते हैं, इसे लॉन्च करते हैं, हमारे "क्वेरी डिज़ाइनर" बटन पर क्लिक करते हैं और देखते हैं कि प्लेटफ़ॉर्म में निर्मित डिज़ाइनर कैसे खुलता है। अंजीर देखें.

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

निष्पादन क्वेरी() प्रक्रिया में, जो हमारे पास क्लाइंट पर है, हम एक शर्त लिखेंगे यदि उपयोगकर्ता ने क्वेरी टेक्स्ट दर्ज नहीं किया है, लेकिन इसे निष्पादित करने के लिए कहता है:

यदि EmptyString(Object.QueryText) तो रिपोर्ट करें ("क्वेरी टेक्स्ट दर्ज करें!"); अगर अंत;

सिस्टम ने पहले ही स्वचालित रूप से Execute RequestOnServer() प्रक्रिया के लिए एक लिंक तैयार कर लिया है; - यह अच्छा है, चलिए इस प्रक्रिया पर चलते हैं, जो सर्वर पर निष्पादित होती है, और यहां हमारे दर्ज किए गए अनुरोध को निष्पादित करने के लिए कोड लिखते हैं।

यहां विकल्प हैं: आप बिल्डिंग क्वेरी से संबंधित सभी अभिव्यक्तियां स्वयं लिख सकते हैं, यानी। मैन्युअल रूप से, लेकिन एक और भी सरल विकल्प है - प्रक्रिया के अंदर, राइट-क्लिक करें और ड्रॉप-डाउन मेनू में "परिणामों के प्रसंस्करण के साथ क्वेरी बिल्डर, चित्र देखें" चुनें:

यदि आपने "परिणाम प्रसंस्करण के साथ क्वेरी बिल्डर" आइटम पर क्लिक किया है, तो एक मोडल विंडो "क्वेरी टेक्स्ट नहीं मिला। एक नया बनाएं?" दिखाई देगा, हाँ पर क्लिक करें। अंतर्निहित क्वेरी डिज़ाइनर खुल जाएगा, जिसमें इसके पहले टैब पर "परिणाम प्रसंस्करण" - पहला आइटम "परिणाम को दरकिनार करना" चुनें। बस, हमें इस कंस्ट्रक्टर से और कुछ नहीं चाहिए, "ओके" बटन पर क्लिक करें - एक मोडल विंडो दिखाई देगी "अनुरोध में कोई फ़ील्ड चयनित नहीं है, "ओके" पर क्लिक करें।

इसके बाद, निम्नलिखित तैयार टेम्पलेट हमारी ExecuteRequestOnServer() प्रक्रिया के अंदर दिखाई देगा:

आइए कंस्ट्रक्टर द्वारा निर्मित अभिव्यक्ति पर चलते हैं:

अनुरोध.पाठ = "";

अनुरोध.पाठ = वस्तु.अनुरोधपाठ;

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

आइए विस्तार से देखें कि स्प्रेडशीट दस्तावेज़ क्या है - यह एक एक्सेल शीट की तरह है - आप केवल टेबल सेल का उपयोग करके एक विशिष्ट सेल में रिकॉर्ड प्राप्त कर सकते हैं, यहां हम उन्हें एक क्षेत्र कहते हैं, लेकिन हम स्वयं इस क्षेत्र की सीमा का चयन कर सकते हैं एक विशिष्ट सेल में:

इसलिए, हमने पता लगाया कि एक स्प्रेडशीट दस्तावेज़ क्या है और अपने लिए निर्धारित किया कि हमें इस स्प्रेडशीट दस्तावेज़ के एक विशिष्ट सेल में अपनी क्वेरी से डेटा को परिभाषित करने की आवश्यकता होगी। लेकिन आइए सोचें: वह "क्वेरी परिणाम" क्या है जो डिज़ाइनर ने हमारे लिए इतनी जल्दी तैयार कर दिया? सहायता खोलें - क्वेरी का परिणाम एक तालिका है जिसमें उपयुक्त गुण हैं! अंजीर देखें.

और यदि हम अब अभिव्यक्ति Query Result = Query.Execute(); (कन्स्ट्रक्टर द्वारा निर्मित) के बाद लिखते हैं, तो यहां संग्रह के लिए इतना सरल चक्र है:

क्वेरी परिणाम से प्रत्येक कॉलम नाम के लिए कॉलम लूप रिपोर्ट (कॉलम नाम नाम); अंतचक्र;

इस चक्र के बाद, अब कंस्ट्रक्टर द्वारा स्वचालित रूप से बनाए गए सभी भावों को नोट कर लें। और थिक क्लाइंट के अंतर्गत 1C:Enterprise8 चलाएं। कोई भी सरल क्वेरी बनाएं (आप क्वेरी बिल्डर का उपयोग कर सकते हैं - यह पहले से ही हमारे लिए काम करता है) और "रन क्वेरी" बटन पर क्लिक करें:

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

आइए अब अपनी पीड़ा के क्षेत्रों के इन नामों को एक स्प्रेडशीट दस्तावेज़ में प्रदर्शित करें:

क्वेरी परिणाम से प्रत्येक कॉलम नाम के लिए। कॉलम लूप सेल=ऑब्जेक्ट.क्वेरीटेबल.एरिया(1,क्वेरीरिजल्ट.कॉलम.इंडेक्स(कॉलमनाम)+1); सेल.टेक्स्ट=कॉलमनाम.नाम; अंतचक्र;

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

चयन विवरण रिकॉर्ड = QueryResult.Select(); जबकिelectionDetailedRecords.Next() Loop //पहली पंक्ति में हमारे पास पहले से ही तालिका कॉलम के नाम लिखे हुए हैं, इसलिए हम पहली पंक्ति के नीचे डेटा लोड करते हैंDocRowNumber=Object.QueryTable.TableHeight+1; क्वेरी परिणाम से प्रत्येक कॉलम नाम के लिए। कॉलम साइकिल सेल=ऑब्जेक्ट.क्वेरीटेबल.एरिया(DocRowNumber,QueryResult.Columns.Index(ColumnName)+1); सेल.टेक्स्ट = चयनविस्तृत रिकॉर्ड[कॉलमनाम.नाम]; अंतचक्र; अंतचक्र;

बस इतना ही, हम जांच कर सकते हैं, एक मोटे ग्राहक के तहत उद्यम को लोड कर सकते हैं, पैरामीटर के बिना एक साधारण अनुरोध दर्ज कर सकते हैं, "रन क्वेरी" बटन पर क्लिक कर सकते हैं, चित्र देखें:

हुर्रे, सब कुछ काम करता है!!!

यह बहुत सुविधाजनक होता है, जब हमारे क्वेरी कंसोल को खोलते/बंद करते समय, हमारा क्वेरी टेक्स्ट, जिसके साथ हमने कंसोल को बंद करने से पहले काम किया था, फिर से "क्वेरी टेक्स्ट" फ़ील्ड में लिखा जाता है। ऐसा करने के लिए, आपको बस फॉर्म प्रॉपर्टी = ऑटोसेव को सक्षम करना होगा, चित्र देखें:

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

आप हमारे कंसोल में कुछ बटन भी जोड़ सकते हैं जो उपयोगकर्ता मोड में पैरामीटर विंडो और अनुरोध टेक्स्ट विंडो को साफ़ कर देंगे।

हमारा क्वेरी कंसोल उपयोग के लिए तैयार है, मैं क्वेरी कंसोल जैसे सरल और शक्तिशाली टूल का उपयोग करके आपके सफल रचनात्मक समाधान की कामना करता हूं!

यह प्रोसेसिंग 1c8.3 प्लेटफ़ॉर्म (प्रबंधित प्रपत्र) पर लिखी गई है और एक मोटे क्लाइंट के अंतर्गत चलती है। इसे 1c8.2 प्लेटफ़ॉर्म पर भी लिखा जा सकता है, नियमित प्रपत्रों के अंतर्गत और प्रबंधित प्रपत्रों के अंतर्गत।

डाउनलोड में हमारे द्वारा अभी बनाए गए क्वेरी कंसोल का एक नमूना शामिल है।

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

क्वेरी कंसोल अपग्रेड:

1) अब बिल्ट-इन क्वेरी बिल्डर के साथ हमारा होममेड क्वेरी कंसोल किसी भी क्लाइंट के तहत चलेगा: नियमित और प्रबंधित रूपों के एक मोटे क्लाइंट के तहत और एक पतले और वेब क्लाइंट के तहत।

अनुलेख बिल्ट-इन क्वेरी बिल्डर का रूप और स्वरूप अलग-अलग है - यह इस बात पर निर्भर करता है कि हमने किस क्लाइंट के तहत अपना कंसोल लॉन्च किया है। (मैं व्यक्तिगत रूप से एक मोटे क्लाइंट के तहत क्वेरी बिल्डर के फॉर्म से अधिक परिचित और सुविधाजनक हूं)

&क्लाइंट प्रक्रिया क्वेरी कंस्ट्रक्टर (कमांड) पर //मानक क्वेरी कंस्ट्रक्टर को कॉल करना केवल मोटे क्लाइंट के तहत संभव है #यदि थिकक्लाइंटमैनेज्डएप्लिकेशन या थिकक्लाइंटनॉर्मलएप्लिकेशन है तो कंस्ट्रक्टर=नया क्वेरी कंस्ट्रक्टर; यदि EmptyString(Object.QueryText) नहीं है तो Constructor.Text = object.QueryText; अगर अंत; यदि Constructor.OpenModal()=True तो object.RequestText=Constructor.Text; अगर अंत; // #अन्यथा // रिपोर्ट ("क्वेरी बिल्डर को कॉल करना केवल एक मोटे क्लाइंट के तहत ही संभव है"); // वापस करना; //# EndIf #Else रिपोर्ट ("आप एक पतले क्लाइंट के तहत क्वेरी बिल्डर चला रहे हैं - यह अपने स्वरूप और प्रदर्शन गति में थोड़ा भिन्न है!"); कंस्ट्रक्टर = नया क्वेरीकंस्ट्रक्टर(); यदि EmptyString(Object.QueryText) नहीं है तो Constructor.Text = object.QueryText; अगर अंत; कंस्ट्रक्टर अलर्ट = नया अलर्ट विवरण ("RunAfterClosingConstructor", ThisForm); कंस्ट्रक्टर.शो(कंस्ट्रक्टर अलर्ट); # EndIf प्रक्रिया का अंत &क्लाइंट प्रक्रिया पर ExecuteAfterClosingConstructor(Result, ConstructorParameters) निर्यात //Result=text, यदि कंस्ट्रक्टर को ठीक बटन का उपयोग करके बंद कर दिया गया था object.RequestText = AbbreviatedLP(Result); //काम करता है!!! प्रक्रिया का अंत

2) हमारे सरल क्वेरी कंसोल में पैरामीटर्स को पास की गई एक अस्थायी तालिका के साथ जटिल प्रश्नों को दर्ज करने की क्षमता जोड़ी गई!!! तंत्र बहुत सरल और सुरुचिपूर्ण निकला - XML ​​कोड का उपयोग किए बिना, जैसा कि पेशेवर कंसोल में किया जाता है।

आप दूसरी संलग्न फ़ाइल में अस्थायी तालिकाओं के मापदंडों के लिए कोड और स्थानांतरण तंत्र की प्रक्रियाओं को देख सकते हैं। मैंने पैरामीटर्स में अस्थायी तालिकाओं का अपना संस्करण कैसे विकसित करना शुरू किया, यह इस लिंक https://forum.infostart.ru/forum9/topic183700/ पर पाया जा सकता है।

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

बाहरीडेटा.उत्पाद, बाहरीडेटा.मात्रा स्थान बाहरीडेटा को बाहरीडेटा के रूप में &बाहरीडेटा से चुनें; ///////////////////////////////////////////// // /////////////////////////////बाहरी डेटा चुनें। उत्पादशेष.मात्राशेष, 0) - बाहरीडेटा.मात्रा शेष के रूप में बाहरीडेटा के रूप में बाहरीडेटा बाएँ शामिल हों रजिस्टर संचय.शेष उत्पाद.शेष(और दिनांक, उत्पाद IN (बाहरीडेटा के रूप में बाहरीडेटा से बाहरीडेटा.उत्पाद का चयन करें)) शेष उत्पाद के रूप मेंशेष सॉफ़्टवेयर बाहरीडेटा.उत्पाद = शेषउत्पादशेष । उत्पाद

उपरोक्त क्वेरी कोड के उदाहरण और समानता के आधार पर, आप अपने डेटा ऑब्जेक्ट को ध्यान में रखते हुए अपनी खुद की जटिल क्वेरी बना सकते हैं।

इसलिए, क्वेरी डिज़ाइनर में हमने कंस्ट्रक्टर को बंद करते हुए उपरोक्त क्वेरी बनाई - क्वेरी टेक्स्ट हमारे कंसोल फ़ील्ड "क्वेरी टेक्स्ट" में जाएगा, "पैरामीटर ढूंढें" बटन पर क्लिक करें, हम देखते हैं कि पैरामीटर तालिका में एक पंक्ति दिखाई देती है = "बाहरी डेटा", मान प्रकार = "मूल्य तालिका", चित्र देखें।

पैरामीटर्स की इस तालिका में - दिनांक पैरामीटर दर्ज करें, उदाहरण के लिए, आज की तारीख, फिर हमारे अस्थायी तालिका पैरामीटर "बाहरी डेटा" को संपादित करने का प्रयास करने के लिए क्लिक करें, तीन बिंदुओं पर "वैल्यू टेबल" वाले फ़ील्ड में क्लिक करें - प्रकारों का चयन होगा दिखाई दें, पंक्ति पर क्लिक करें, हमारा तंत्र हमें प्रपत्र पर पृष्ठ बदल देता है, जहां हमें मैन्युअल रूप से इस अस्थायी तालिका को दर्ज करने की आवश्यकता होती है।

यहां ध्यान दें कि इस मामले में, "टाइमटेबल्स" पृष्ठ पर नीचे "पैरामीटर में अस्थायी तालिका का नाम" फ़ील्ड में, हमारी अस्थायी तालिका का नाम दिखाई देगा (यह पैरामीटर तालिका से कॉपी किया गया है)।

अब तक, "समय सारणी" पृष्ठ पर हम केवल एक खाली तालिका देखते हैं - यह हमारी भविष्य की अस्थायी तालिका के प्रकारों की तालिका है। "जोड़ें" बटन का उपयोग करके, हम भविष्य की तालिका के विवरण और प्रकार का नाम जोड़ देंगे . सावधान रहें - नाम और प्रकार हमारे द्वारा &ExternalData के अनुरोध में निर्दिष्ट से मेल खाना चाहिए:

अब हम "अपडेट अस्थायी तालिका" बटन दबाते हैं - और हमारे पास यहां एक दूसरी तालिका होगी - हम इसे सीधे "जोड़ें" बटन के माध्यम से अस्थायी तालिका डेटा से भर देंगे।

बस, हम अपने आप को एक बार फिर से जांच सकते हैं कि क्या हमने प्रसंस्करण के पहले पृष्ठ पर पैरामीटर तालिका में क्वेरी पैरामीटर का आदिम डेटा दर्ज किया है, और "रन क्वेरी" बटन पर क्लिक करें - सब कुछ की गणना की जाती है और उसके अनुसार चुना जाता है। हमारी अस्थायी तालिका के पैरामीटर में पारित डेटा की सीमा

अनुलेख यदि आपने विवरण और उनके प्रकारों का नाम टाइप करते समय कोई गलती की है (पहली तालिका में) - बस कंसोल को बंद करें और इसे फिर से खोलें - अस्थायी डेटा तालिका मिटा दी जाएगी - और प्रकार तालिका को फिर से संपादित किया जा सकता है और a नई डेटा तालिका फिर से बनाई जा सकती है।

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

बस इतना ही, हम अपने हाथों से एक बहुत शक्तिशाली कार्य उपकरण बना सकते हैं, इसके अलावा, हमारा कंसोल अभी भी पेशेवर कंसोल की तुलना में बहुत तेज़ है - और यह डेवलपर्स के लिए एक बहुत बड़ा प्लस है! और, निःसंदेह, अब हमारा कंसोल किसी भी क्लाइंट के अंतर्गत काम करता है! आपके रचनात्मक विकास के लिए शुभकामनाएँ!!!

आइए देखें कि हम फ़ील्ड के अनुसार इन दोनों तालिकाओं को कैसे जोड़ सकते हैं उत्पाद कोडका उपयोग करते हुए
क्वेरी कंस्ट्रक्टर (अस्थायी तालिकाएँ बनाने के लिए कोड एक उदाहरण के रूप में दिया गया है
मैं नहीं करूंगा. आप इसे उपरोक्त लिंक से ले सकते हैं)।

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

बुकमार्क पर जाएँ "सम्बन्ध". एक नई पंक्ति जोड़ें. खेत मेँ तालिका नंबर एक
ड्रॉप-डाउन सूची से उत्पादों वाली तालिका और फ़ील्ड का चयन करें तालिका 2मेज़
देशों के साथ.

के लिए टेबल्स1बॉक्स को चेक करें सभी. के लिए
टेबल्स2हम इस बॉक्स को चेक नहीं करते. इसका मतलब यह है कि से टेबल्स1
सभी रिकॉर्ड का चयन किया जाएगा, और से टेबल्स2केवल वे जिनके लिए यह किया जाता है
कनेक्शन की स्थिति, अर्थात्, हमें झंडे का ऐसा संयोजन मिलता है
बायां कनेक्शन. आगे आपको भरना होगा संचार की स्थिति.
यहां हम ड्रॉप-डाउन सूचियों से तालिका फ़ील्ड का चयन करते हैं और ड्रॉप-डाउन से तुलना चिह्न का भी चयन करते हैं
सूची।

इस कनेक्शन के परिणामस्वरूप, हमें निम्नलिखित अनुरोध पाठ मिलता है:

VT_Product.Product Code, VT_Product.Name, VT_Country.Country को VT_Product से VT_Product के रूप में चुनें।

आइए अब कुछ बिंदुओं पर करीब से नजर डालते हैं।
आइए चेकबॉक्स को स्वैप करने का प्रयास करें सभी.


ऐसा प्रतीत होगा कि अंत में यह काम करना चाहिए सही जोड़, लेकिन अगर हम
आइए कंस्ट्रक्टर द्वारा उत्पन्न क्वेरी टेक्स्ट को देखें, हम देखेंगे कि टेबल
स्थानों की अदला-बदली हुई, लेकिन कनेक्शन अभी भी बाकी है:

VT_Product.Product Code, VT_Product.Name, VT_Country.Country को VT_Country AS VT_Country से चुनें VT_Country के रूप में VT_Product AS VT_Product से जुड़ें VT_Product.Product कोड = VT_Country.Product कोड द्वारा

आइए देखें कि यदि हम दोनों बक्सों को अनचेक कर दें तो क्या होगा

परिणामस्वरूप, हमें एक आंतरिक संबंध प्राप्त होता है।

VT_Product.Product Code, VT_Product.Name, VT_Country.Country को VT_Product AS से VT_Product आंतरिक रूप से चुनें VT_Country AS VT_Country BY VT_Product.Product Code = VT_Country.Product Code चुनें

अंत में, यदि दोनों चेकबॉक्स चेक किए गए हैं


हमें पूरा कनेक्शन मिलता है

VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product पूर्ण कनेक्शन VT_Country AS VT_Country BY VT_Product.Product Code = VT_Country.Product Code चुनें

आप किसी बुकमार्क पर अनेक पंक्तियाँ निर्दिष्ट कर सकते हैं सम्बन्ध. इस मामले में, अनेक
पंक्तियाँ शर्त के अनुसार जुड़ी हुई हैं और. इसके अलावा, लाइनें आवश्यक नहीं हैं
हर बार फिर से ड्राइव करें। उन्हें कुंजी का उपयोग करके कॉपी किया जा सकता है एफ9.
और नई लाइन में केवल कनेक्शन की स्थिति बदलें। इससे विकास में काफी तेजी आती है।
साथ ही, लिंक स्थिति में केवल पूर्वनिर्धारित फ़ील्ड का उपयोग करना आवश्यक नहीं है
ड्रॉप-डाउन सूचियाँ। आप एक मनमाना अभिव्यक्ति का उपयोग कर सकते हैं जो संतुष्ट करती है
1C क्वेरी भाषा. ऐसा करने के लिए, आपको बॉक्स को चेक करना होगा मुक्त
और शर्त को सीधे फ़ील्ड में दर्ज करें, या एक सहायक विंडो खोलें
जहां आप क्वेरी भाषा फ़ंक्शन के साथ टेम्प्लेट का उपयोग कर सकते हैं।


बेशक, व्यवहार में कहीं अधिक जटिल प्रश्न हैं
एक दूसरे के बीच विभिन्न कनेक्शन वाली कई तालिकाएँ। लेकिन क्वेरी बिल्डर में
किसी भी जटिलता के कनेक्शन को पुन: प्रस्तुत किया जा सकता है।

क्वेरी डिज़ाइनर में निम्नलिखित टैब होते हैं:

1. "टेबल्स और फ़ील्ड्स" - टैब पर तीन पदानुक्रमित सूचियाँ हैं:
एक। "डेटाबेस" - उन सभी उपलब्ध वस्तुओं को सूचीबद्ध करता है जिनसे पूछताछ की जा सकती है। बटन भी "परिवर्तन तालिकाएँ प्रदर्शित करें", जिसके साथ आप सूचना सुरक्षा वस्तुओं में परिवर्तन की तालिकाओं तक पहुंच सकते हैं यदि वे किसी विनिमय योजना के लिए पंजीकृत हैं।
बी। "टेबल्स" - चयनित तालिकाओं की एक सूची जिस पर क्वेरी निष्पादित की जाएगी। इसके अलावा इस विंडो में आप किसी तालिका को हटा सकते हैं, तालिका का नाम बदल सकते हैं या उसे बदल सकते हैं और एक आंतरिक क्वेरी जोड़ सकते हैं।

आप "वर्चुअल टेबल्स पैरामीटर्स" बटन पर क्लिक करके वर्चुअल टेबल्स के लिए पैरामीटर निर्दिष्ट कर सकते हैं:

कुछ आयामों द्वारा चयन के लिए वर्चुअल टेबल के मापदंडों का सक्रिय रूप से उपयोग करने की अनुशंसा की जाती है, क्योंकि इससे क्वेरी निष्पादन की गति बढ़ जाती है। आप पैरामीटर्स में बाहरी वेरिएबल्स का उपयोग कर सकते हैं, जिनके नाम के पहले "&" चिन्ह लगा होता है।
सी। "फ़ील्ड्स" - तालिकाओं से चुने गए फ़ील्ड्स की एक सूची। आप परिकलित फ़ील्ड भी जोड़ सकते हैं; ऐसा करने के लिए, "जोड़ें" बटन पर क्लिक करने से कस्टम एक्सप्रेशन कंस्ट्रक्टर खुल जाता है:

बाईं ओर अभिव्यक्ति में उपलब्ध फ़ील्ड वाली एक विंडो है। दाईं ओर प्रयुक्त कार्यों का एक संकेत है। नीचे एक रचनात्मक मनमाना अभिव्यक्ति है। आप अभिव्यक्तियों में बाहरी मापदंडों का उपयोग कर सकते हैं; उन्हें "&" चिह्न का उपयोग करके दर्शाया जाता है, उदाहरण के लिए: &अवधि, &प्रारंभ दिनांक
आपको सावधान रहने की आवश्यकता है, यदि विंडो में एक लंबी और जटिल अभिव्यक्ति टाइप की गई है, जिसमें एक छोटी सिंटैक्स त्रुटि है, तो "ओके" बटन पर क्लिक करने के बाद, सिस्टम एक चेतावनी जारी करेगा और विंडो बंद कर देगा। सभी टाइप किए गए कोड खो जाएंगे, इसलिए मेरा सुझाव है कि यदि आप अभिव्यक्ति की शुद्धता के बारे में सुनिश्चित नहीं हैं, तो कंस्ट्रक्टर को बंद करने से पहले सामग्री को हमेशा क्लिपबोर्ड (Ctrl-C) पर सहेजें।

2. "संबंध" - टैब पर, तालिकाओं के बीच कनेक्शन दर्शाए गए हैं।

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

3. "ग्रुपिंग" - टैब इंगित करता है कि कौन से फ़ील्ड समूहीकृत हैं और कौन से फ़ील्ड एकत्रित (सारांशित) हैं।

4. टैब "शर्तें" - अनुरोध पर लगाई गई शर्तों को सूचीबद्ध करता है।
शर्तों में, आप सरल अभिव्यक्ति कंस्ट्रक्टर का उपयोग करके और बाहरी चर का उपयोग करके जटिल अभिव्यक्ति भी लिख सकते हैं:

5. "उन्नत"
अनुरोध पर अतिरिक्त पैरामीटर लगाए गए

6. "संघ और छद्म नाम"
इस टैब पर आप फ़ील्ड के लिए उपनाम निर्दिष्ट कर सकते हैं, साथ ही उन क्वेरीज़ को प्रबंधित कर सकते हैं जो "यूनाइट" या "यूनाइट ऑल" संरचनाओं के माध्यम से जुड़ी हुई हैं।

7. "आदेश"
क्वेरी परिणाम किस क्रम में प्रदर्शित होंगे?

ध्यान! बुकमार्क के नीचे आप एक चेकमार्क देख सकते हैं "ऑटो-ऑर्डर"- ACS में 1C 8.1 के वर्तमान संस्करण में, यह बेकार है; इसके अलावा, जब रिकॉर्डिंग करते समय चेकबॉक्स चेक किया जाता है, तो ACS एक त्रुटि देता है, इसलिए आपको इसका उपयोग नहीं करना चाहिए।

8. "डेटा संरचना"
वह टैब जिसमें एक्सेस कंट्रोल सिस्टम के लिए सेवा फ़ील्ड परिभाषित हैं। यह एक नियमित रिपोर्ट डिज़ाइनर में "रिपोर्ट बिल्डर" टैब के समान ही भूमिका निभाता है।

उ. "टेबल्स" टैब पर - क्वेरी में उपयोग की गई तालिकाएं सूचीबद्ध हैं; आप "आवश्यक" चेकबॉक्स को चेक करके इंगित कर सकते हैं कि तालिका को क्वेरी में शामिल किया जाना चाहिए या नहीं। वे। यदि चयन में कोई फ़ील्ड शामिल नहीं है, तो यह तालिका क्वेरी में बिल्कुल भी भाग नहीं लेती है। आप तालिकाओं के लिए पैरामीटर भी निर्दिष्ट कर सकते हैं.

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

9. "विशेषताएँ"
एक बुकमार्क जिसका सामान्य आउटपुट फॉर्म कंस्ट्रक्टर में कोई एनालॉग नहीं है।

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

जानकारी साइट से ली गई है

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

मान लीजिए कि हमारे पास जानकारी का यह सरल रजिस्टर है, जहां कीमतें वस्तुओं और आपूर्तिकर्ताओं द्वारा संग्रहीत की जाती हैं:

हम उन सभी उत्पादों को प्राप्त करने का अनुरोध करना चाहते हैं जिनके एक से अधिक आपूर्तिकर्ता हैं। इसे निम्नलिखित क्वेरी का उपयोग करके कार्यान्वित किया जा सकता है:

आपूर्तिकर्ताओं की संख्या चुनें। उत्पाद के रूप में उत्पाद चुनें (मूल्य चुनें। उत्पाद के रूप में उत्पाद, मात्रा (अलग-अलग कीमत। आपूर्तिकर्ता) रजिस्टर जानकारी से आपूर्तिकर्ताओं के रूप में। मूल्य मूल्य के अनुसार समूह मूल्य के अनुसार। उत्पाद) आपूर्तिकर्ताओं की संख्या जहां आपूर्तिकर्ताओं की संख्या। आपूर्तिकर्ता > 1

कंस्ट्रक्टर में नेस्टेड क्वेरी बनाना

आइए कंस्ट्रक्टर का उपयोग करके उपरोक्त अनुरोध बनाएं।

ऐसा करने के लिए, फ़ील्ड के ऊपर कमांड पैनल में टेबलबटन दबाएँ एक सबक्वेरी बनाएं:


जिसके बाद क्वेरी कंस्ट्रक्टर के दूसरे उदाहरण के साथ एक विंडो खुलेगी:


और इस नई विंडो में हम एक नेस्टेड क्वेरी बनाते हैं:




बटन क्लिक करना अनुरोधनिचले बाएँ कोने में हम सबक्वेरी का पाठ देख सकते हैं:


सहायक कंस्ट्रक्टर में ओके बटन पर क्लिक करने के बाद, हमें मुख्य विंडो में निम्नलिखित चित्र मिलता है:


वाक्यांश के बाद से नेस्टेडक्वेरीधारणा के लिए बहुत सुविधाजनक नहीं है, आइए तालिका का नाम बदलने के लिए सही माउस बटन का उपयोग करें आपूर्तिकर्ताओं की संख्या, इसमें से एक फ़ील्ड चुनें उत्पादऔर बुकमार्क पर स्थितियाँआइए आवश्यक शर्त लिखें:




और इन सभी जोड़तोड़ के बाद, हमें वांछित अनुरोध प्राप्त होता है। यदि आवश्यक हो, तो आप नेस्टिंग के कई स्तरों के साथ क्वेरीज़ बना सकते हैं।

कंस्ट्रक्टर में नियमित क्वेरी से नेस्टेड क्वेरी कैसे बनाएं

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

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

टिप्पणी।

दुर्भाग्य से, एक प्रबंधित एप्लिकेशन में, आप "क्वेरी से जानें" प्रोसेसिंग में क्वेरी डिज़ाइनर का उपयोग नहीं कर सकते। आप इसे सामान्य मोड पर स्विच करके इस प्रोसेसिंग में उपयोग कर सकते हैं, लेकिन हम ऐसा नहीं करेंगे।

आइए "रिक्वेस्ट कंस्ट्रक्टर" प्रोसेसिंग बनाएं और इसे "रिपोर्ट और प्रोसेसिंग" सबसिस्टम में परिभाषित करें।

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

फॉर्म मॉड्यूल में, कमांड को काम करने के लिए, हम एक प्रक्रिया लिखते हैं:

&ऑनक्लाइंट

प्रक्रिया निष्पादन क्वेरी (कमांड)

ExecuteRequestServer();

प्रक्रिया का अंत

&सर्वर पर

प्रक्रिया का अंत

हम सर्वर पर बुलाए गए प्रक्रिया के अंदर जाते हैं और संदर्भ मेनू से "परिणाम प्रसंस्करण के साथ क्वेरी कंस्ट्रक्टर" को कॉल करते हैं (चित्र 2.65)।

चित्र 2.65 परिणाम प्रसंस्करण के साथ क्वेरी कंस्ट्रक्टर

प्रोसेसिंग प्रकार को "स्प्रेडशीट दस्तावेज़ में आउटपुट" पर सेट करें और या तो "अगला" बटन या "टेबल्स और फ़ील्ड्स" टैब पर क्लिक करें।

डिज़ाइनर के "टेबल्स और फ़ील्ड्स" टैब पर, आप सिस्टम में वर्तमान में मौजूद तालिकाओं को देख सकते हैं (बायां भाग "डेटाबेस" का हकदार है) (चित्र 2.66)।

चित्र 2.67 क्वेरी कंस्ट्रक्टर

वे तालिकाएँ जिनसे क्वेरी डेटा प्राप्त करेगी, उन्हें "टेबल्स" क्षेत्र में स्थानांतरित कर दिया जाता है; क्वेरी के लिए आवश्यक फ़ील्ड्स को "फ़ील्ड्स" क्षेत्र में स्थानांतरित कर दिया जाता है। आइए इसे चित्र 2.68 के अनुसार करें।

चित्र 2.68 क्वेरी कंस्ट्रक्टर

यहां हमने बनाए गए डिफ़ॉल्ट दृश्य फ़ील्ड को हटा दिया है - "प्रस्तुति (उत्पाद रसीद उत्पाद। नामकरण)"

डिज़ाइनर के साथ काम करते समय, आप किसी भी समय परिणामी अनुरोध टेक्स्ट देख सकते हैं। इस कार्य को करने के लिए, आपको डिज़ाइनर फॉर्म के निचले बाएँ कोने में स्थित "अनुरोध" बटन पर क्लिक करना होगा (चित्र 2.69)।

आप "संपादित करें" बटन पर क्लिक करके अनुरोध पाठ को मैन्युअल रूप से संपादित कर सकते हैं।

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

हम "क्वेरी कंस्ट्रक्टर" प्रोसेसिंग में ExecuteRequestServer() प्रक्रिया पर लौटते हैं और संदर्भ मेनू से फिर से "परिणाम प्रोसेसिंग के साथ क्वेरी कंस्ट्रक्टर" को कॉल करते हैं।

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

समूहीकरण को परिभाषित करते समय, आपको निम्नलिखित नियम का पालन करना होगा: सभी क्वेरी चयन फ़ील्ड को उन फ़ील्ड में विभाजित किया जाता है जिनके द्वारा समूहीकरण (कन्वोल्यूशन) किया जाता है, नेस्टेड तालिकाओं के फ़ील्ड (वे फ़ील्ड जो उन फ़ील्ड के सापेक्ष सारांशित होते हैं जिनके द्वारा समूहीकरण किया जाता है) और समग्र कार्य. आइए समूहों को परिभाषित करें (चित्र 2.70)।

चित्र 2.70 क्वेरी बिल्डर

यदि अनुरोध द्वारा प्राप्त डेटा को किसी शर्त के अनुसार चुना जाना चाहिए, तो इस स्थिति में "शर्तें" टैब का उपयोग करना आवश्यक हो सकता है। चलिए Goods ReceiptGoods.Quantity=10 चुनें (चित्र 2.71)।

चित्र 2.71 क्वेरी कंस्ट्रक्टर स्थिति।

कृपया ध्यान दें कि यदि शर्त को चित्र के समान ही परिभाषित किया गया है, तो अनुरोध निष्पादित नहीं किया जाएगा।

स्थिति को ठीक करने के दो तरीके हैं:

    "पी..." ध्वज की जाँच करके स्थिति को फिर से परिभाषित करके;

    अनुरोध पाठ को स्वयं बदलने के अवसर का लाभ उठाकर ("अनुरोध संपादित करें" बटन पर क्लिक करके प्राप्त किया गया)।

मैन्युअल परिवर्तन में यह तथ्य शामिल होगा कि संख्या "10" से पहले "&" प्रतीक को हटाना आवश्यक है। अनुरोध पाठ में यह प्रतीक अनुरोध पैरामीटर को परिभाषित करता है, जिसमें कुछ मान बाद में लिखे जाने चाहिए (लेकिन अनुरोध निष्पादित करने से पहले)। "क्वेरी संपादित करें" बटन पर क्लिक करें और संपादित करें (चित्र 2.72)।

चित्र 2.73 एक क्वेरी का संपादन

"उन्नत" टैब पर, आप कई फ़्लैग (क्वेरी भाषा के "चयन करें" कीवर्ड से संबंधित) की जांच कर सकते हैं और क्वेरी को बदलने के लिए इच्छित तालिकाओं की संरचना निर्धारित कर सकते हैं (चित्र 2.74)।

चित्र 2.74 अतिरिक्त क्वेरी फ़ंक्शन

"जॉइन्स/एलियासेस" टैब पर, आप "एलियासेस" सेट करके फ़ील्ड नाम बदल सकते हैं, लेकिन हम ऐसा नहीं करेंगे।

"ऑर्डर" टैब पर, आप क्वेरी के परिणामस्वरूप रिकॉर्ड का सॉर्टिंग क्रम निर्धारित कर सकते हैं (चित्र 2.75)।

चित्र 2.75 रिकॉर्ड सॉर्ट क्रम

"ऑटो-ऑर्डर" ध्वज पर ध्यान दें, इसका उपयोग संदर्भ प्रकार के फ़ील्ड द्वारा ऑर्डर करने के लिए किया जा सकता है।

"कुल" अनुभाग को परिभाषित करते समय, आपको इस तथ्य के लिए तैयार रहना चाहिए कि क्वेरी के परिणामस्वरूप "अतिरिक्त" कुल रिकॉर्ड दिखाई देंगे। इन रिकॉर्ड्स के साथ, क्वेरी परिणाम पदानुक्रमित हो जाता है (चित्र 2.76)।

चित्र 2.76.क्वेरी कंस्ट्रक्टर के परिणाम।

कई प्रकार के योग निर्दिष्ट करना संभव है:

    तत्व (क्वेरी परिणाम चयन में समूहीकरण योग और विस्तृत रिकॉर्ड शामिल हैं);

    पदानुक्रम (क्वेरी परिणाम चयन में, सामान्य मामले में, पदानुक्रम द्वारा सारांश रिकॉर्ड, समूहीकरण द्वारा सारांश रिकॉर्ड और विस्तृत रिकॉर्ड होते हैं);

    केवल पदानुक्रम (क्वेरी परिणाम चयन में, सामान्य तौर पर, पदानुक्रम द्वारा सारांश रिकॉर्ड होते हैं)।

कंस्ट्रक्टर के "ओके" बटन पर क्लिक करने के बाद, एक "लेआउट" जेनरेट होगा और ExecuteRequestServer() प्रक्रिया के लिए कोड फॉर्म मॉड्यूल में लिखा जाएगा:

&सर्वर पर

प्रक्रिया ExecuteRequestServer()

//((QUERY_CONSTRUCTOR_WITH_RESULT_PROCESSING

// यह टुकड़ा कंस्ट्रक्टर द्वारा बनाया गया है।

// कंस्ट्रक्टर का पुन: उपयोग करते समय, मैन्युअल रूप से किए गए परिवर्तन खो जाएंगे!!!

लेआउट = प्रोसेसिंग.QueryConstructor.GetLayout("लेआउट");

अनुरोध = नया अनुरोध;

अनुरोध.पाठ=

| माल माल की प्राप्ति। नामकरण के रूप में नामकरण,

| एसयूएम (माल की प्राप्ति माल। मात्रा) मात्रा के रूप में,

| रकम (माल की प्राप्ति। राशि) राशि के रूप में

| दस्तावेज़. माल की प्राप्ति. माल

| उत्पाद कैसे प्राप्त करें

| माल माल की प्राप्ति। मात्रा > 1

|समूह द्वारा

| मालगुड्स की प्राप्ति.नामपद्धति

|आदेश द्वारा

| मात्रा,

| राशि में कमी

| योग(मात्रा),

| योग(योग)

| नामकरण पदानुक्रम";

परिणाम = क्वेरी.रन();

हेडरएरिया = लेआउट.गेटएरिया('हेडर');

एरियाफुटर = लेआउट.गेटएरिया('फुटर');

TableHeadArea = Layout.GetArea('TableHeader');

TableFooterArea = Layout.GetArea('TableFooter');

एरियानोमेनक्लेचरपदानुक्रम = लेआउट.गेटएरिया('नामकरणपदानुक्रम');

क्षेत्रनामपद्धति = लेआउट.गेटएरिया('नामपद्धति');

TabDoc.Clear();

TabDoc.Output(AreaHeader);

TabDoc.Output(TableHeadArea);

TabDoc.StartAutoGroupingRows();

चयननामपद्धति = परिणाम.चयन(BypassQueryResult.ByGrouping);

जबकि सिलेक्शननोमेनक्लेचर.नेक्स्ट() लूप

यदि सिलेक्शननोमेनक्लेचर.रिकॉर्डटाइप() = RequestRecordType.TotalByHierarchy तो

क्षेत्र = क्षेत्रनामपद्धतिपदानुक्रम;

क्षेत्र = क्षेत्रनामपद्धति;

अगर अंत;

क्षेत्र.पैरामीटर.भरण(चयननामपद्धति);

TabDoc.Output(क्षेत्र, चयननामपद्धति.स्तर());

अंतचक्र;

TabDoc.FiishAutoGroupingRows();

TabDoc.Output(TableFooterArea);

TabDoc.Output(AreaFooter);

//))CONSTRUCTOR_QUERY_WITH_RESULT_PROCESSING