ExpressionScript - प्रस्तुति
From LimeSurvey Manual
परिचय
LimeSurvey एक्सप्रेशन स्क्रिप्ट का उपयोग करता है, जिससे LimeSurvey अधिक जटिल ब्रांचिंग, आकलन, सत्यापन और अनुकूलन (टेलरिंग) को सपोर्ट कर पाता है। यह बैक-एंड पर LimeSurvey द्वारा रिप्लेसमेंट, शर्तें और आकलन को प्रबंधित करने के तरीके को बदल देती है। यह प्रोसेसिंग को भी काफ़ी तेज़ करती है, क्योंकि यह रन-टाइम पर होने वाली अधिकांश डेटाबेस रीड को समाप्त कर देती है। एक्सप्रेशन स्क्रिप्ट को डॉ. थॉमस व्हाइट (TMSWhite) ने विकसित किया था।
मुख्य परिभाषाएँ
- एक्सप्रेशन: कर्ली ब्रेसिज़ के अंदर लिखी कोई भी चीज़:
- बशर्ते खुलने वाले ब्रेस के तुरंत बाद या बंद होने वाले कर्ली ब्रेस से पहले कोई रिक्त स्थान (व्हाइट स्पेस) न हो।
- एक्सप्रेशन की सामग्री का मूल्यांकन EM द्वारा किया जाता है, इसलिए उसमें गणितीय सूत्र, फ़ंक्शन, तथा जटिल स्ट्रिंग और दिनांक प्रोसेसिंग हो सकती है।
- टेलरिंग: इसे कभी-कभी "पाइपिंग" भी कहा जाता है। यह शर्त के आधार पर टेक्स्ट को बदलने की प्रक्रिया है:
- आपको सभी 'रिप्लेसमेंट फ़ील्ड', प्रतिभागी डेटा और प्रतिक्रिया डेटा तक पहुँच मिलती है।
- आपको प्रश्नों, उत्तरों और उनके गुणों तक भी आसान पहुँच मिलती है।
- प्रासंगिकता समीकरण: प्रश्न की दृश्यता को नियंत्रित करने वाली एक नई प्रश्न विशेषता:
- यदि कोई प्रासंगिकता समीकरण है, तो प्रश्न केवल तभी दिखाया जाता है जब प्रासंगिकता का मान सही (true) आए।
- आंतरिक रूप से, सभी array_filter और array_filter_exclude कमांड उप-प्रश्न स्तर की प्रासंगिकता बन जाते हैं।
- SGQA (पहले वेरिएबल्स को इस तरह नाम दिया जाता था):
- इसका अर्थ है Survey-Group-Question-Answer (सर्वेक्षण-समूह-प्रश्न-उत्तर)
- SGQA वेरिएबल नाम 123X5X382X971 जैसे दिखते हैं, और उनमें उप-प्रश्न प्रत्यय हो सकते हैं।
- ये वेरिएबल नाम अंतर्निहित S/Q/G/A डेटाबेस कोड के लिए विशिष्ट होते हैं, इसलिए इन्हें अक्सर बदलना पड़ता है
- समीकरण प्रश्न का प्रकार: एक नया प्रश्न का प्रकार जो गणनाओं या रिपोर्टों को डेटाबेस में सहेजता है:
- यह बॉयलरप्लेट प्रश्न जैसा है, लेकिन "हमेशा इस प्रश्न को छिपाने" सेट करने पर भी इसकी सामग्री डेटाबेस में सहेजी जाती है।
- प्रश्न कोड: यह EM के लिए पसंदीदा वेरिएबल नाम है:
- यह प्रश्न के उद्देश्य को दर्शाने वाला एक वर्णनात्मक नाम हो सकता है, जिससे जटिल लॉजिक को पढ़ना आसान हो जाता है।
- मान्य प्रश्न कोड किसी संख्या से शुरू नहीं होने चाहिए, इसलिए प्रश्नों को क्रमांकित करने के लिए प्रश्न कोड का उपयोग करते समय बस "q1", "q1a" या "g1q2" का उपयोग करें।
- यदि आप डेटा को SPSS या R में एक्सपोर्ट करते हैं, तो यही वेरिएबल नाम बन जाता है। इसलिए, यदि आप सांख्यिकीय विश्लेषण करते हैं, तो आपको केवल अद्वितीय प्रश्न कोड बनाने चाहिए।
क्या मुझे एक्सप्रेशन स्क्रिप्ट का उपयोग करना ज़रूरी है?
संक्षिप्त उत्तर है "नहीं"। हालाँकि, यह काफ़ी हद तक इस पर निर्भर करता है कि आप कितना जटिल सर्वेक्षण बनाना चाहते हैं।
उदाहरण के लिए, शर्तें संपादक कुछ बुनियादी एक्सप्रेशन प्रदान करता है जिन्हें आपके सर्वेक्षण के प्रश्नों पर लागू किया जा सकता है। हालाँकि, शर्तें संपादक सीमित है। इसीलिए एक्सप्रेशन स्क्रिप्ट का उपयोग किया जाता है - यह अनुकूलन की संभावनाओं का दायरा बढ़ा देती है।
क्या मैं शर्तों और प्रासंगिकता समीकरणों को मिला सकता हूँ?
हाँ। आप कुछ प्रश्नों के लिए शर्तें संपादक और अन्य के लिए प्रासंगिकता समीकरण का उपयोग कर सकते हैं।
आप एक ही प्रश्न में शर्तें और एक्सप्रेशन दोनों सेट नहीं कर सकते! एक बार शर्त सेट हो जाने पर, यह प्रासंगिकता समीकरण फ़ील्ड में लिखे किसी भी एक्सप्रेशन को बदल देती है। इसके अलावा, प्रासंगिकता समीकरण फ़ील्ड को फिर मैन्युअल रूप से संपादित नहीं किया जा सकता।
फिर भी, एक प्रश्न में एक्सप्रेशन और शर्तें दोनों का उपयोग करने का एक तरीका है। जैसा कि ऊपर बताया गया है, शर्त प्रासंगिकता समीकरण फ़ील्ड को बदल देती है। ऐसा हो जाने पर, देखें कि नया बना समीकरण क्या है और उसे किसी टेक्स्ट एडिटर में कॉपी कर लें। नई बनी शर्त को शर्तें संपादक से डिलीट करें और फिर प्रश्न को एडिट करके अपनी टेक्स्ट एडिटर फ़ाइल से शर्त-आधारित एक्सप्रेशन को उन अन्य एक्सप्रेशन के साथ जोड़ें जिन्हें आप उपयोग करना चाहते हैं।
मुझे शर्तों और प्रासंगिकता में से कैसे चुनना चाहिए?
यहाँ प्रत्येक शैली के फ़ायदों और नुकसानों की सूची दी गई है:
| शैली | फ़ायदे | नुकसान |
|---|---|---|
| शर्तें | 1. सरल शर्तें बनाने के लिए बढ़िया GUI। 2. GUI अच्छी तरह प्रलेखित है और सपोर्ट टीम द्वारा समझी जाती है |
1. केवल सरल तुलनाओं को सपोर्ट करती है और "AND" तथा "OR" शर्तों को अच्छी तरह नहीं संभालती। 2. कैस्केडिंग शर्तें अनियमित रूप से काम करती हैं 3. धीमी - डेटाबेस पर अधिक निर्भर - यह लंबे सर्वेक्षणों को धीमा कर सकती है। 4. शर्तों को रीलोड करने में कुछ समस्याएँ रिपोर्ट की गई हैं। 5. जब दर्जनों, सैकड़ों या हज़ारों प्रश्न हों तो GUI अच्छी तरह स्केल नहीं करती। 6. काग़ज़ आधारित सर्वेक्षणों को बदलने में समय लग सकता है क्योंकि इसमें SGQA नामों का उपयोग करना पड़ता है। 7. जटिल ब्रांचिंग के लिए आवश्यक लॉजिक को कस्टम-कोड करने के लिए अक्सर प्रोग्रामर की ज़रूरत पड़ती है। |
| प्रासंगिकता | 1. 80+ फ़ंक्शन और गणित/स्ट्रिंग ऑपरेटरों सहित बहुत जटिल लॉजिक को सपोर्ट करती है। 2. कैस्केडिंग लॉजिक के लिए उत्कृष्ट सपोर्ट। 3. तेज़ - कोई अतिरिक्त डेटाबेस कॉल नहीं, 1000+ प्रश्नों वाले सर्वेक्षणों को सपोर्ट करती है। 4. लॉजिक रीलोड करने में कोई समस्या नहीं, क्योंकि इसे SGQA कोड की आवश्यकता नहीं होती। 5. सिंटैक्स-हाइलाइटिंग 1000+ प्रश्नों वाले सर्वेक्षणों तक स्केल करती है। 6. मौजूदा काग़ज़ आधारित सर्वेक्षणों को कंप्यूटरीकृत करने के इच्छुक समूहों के लिए आसान और तेज़। 7. यह प्रोग्रामर के बिना अर्ध-संरचित साक्षात्कारों और महामारी विज्ञान सर्वेक्षणों को आसानी से सपोर्ट करती है। |
1. सरल शर्तों के लिए कोई GUI नहीं - इसके बजाय यह सिंटैक्स-हाइलाइटिंग का उपयोग करती है। |
- हम सलाह देते हैं कि आप वही उपयोग करें जो आपकी ज़रूरतों के लिए बेहतर हो।
- EM की सुविधाओं के अधिक विस्तृत स्पष्टीकरण के लिए, निम्नलिखित लिंक पर क्लिक करें।
शुरुआत करना
EM के साथ शुरुआत करने का सबसे अच्छा तरीका है:
- https://www.limesurvey.org/en/download से नवीनतम स्थिर संस्करण इंस्टॉल करें।
- कुछ नमूना सर्वेक्षण इंपोर्ट करें और उन्हें देखें।
- उपयोग के मामले और कैसे करें तथा चरण-दर-चरण उदाहरण देखें।
- EM दस्तावेज़ीकरण (यह पृष्ठ) देखें
- पृथक एक्सप्रेशन के यूनिट टेस्ट (उन्नत)
- सभी EM फ़ंक्शन और ऑपरेटरों के उपयोग के उदाहरण, तथा PHP और JavaScript के परिणाम दिखाता है;
- ध्यान दें कि कुछ फ़ंक्शन PHP और JavaScript संस्करणों में अलग परिणाम देते हैं, इसलिए यह पृष्ठ आपको अपने EM लॉजिक की योजना उसी के अनुसार बनाने देता है।
- पृथक एक्सप्रेशन के यूनिट टेस्ट (उन्नत)
शब्दावली
EM की क्षमताओं का वर्णन करने के लिए ये शब्द आमतौर पर उपयोग किए जाते हैं:
- प्रासंगिकता-आधारित ब्रांचिंग - यदि कोई प्रश्न प्रासंगिक है, तो उसे पूछें, अन्यथा न पूछें (उदाहरण के लिए, उसे अदृश्य कर दें और डेटाबेस में NULL के रूप में चिह्नित करें)। आपको प्रासंगिकता फ़ील्ड प्रश्न संपादक पैनल के साथ-साथ प्रश्न समूह संपादक पैनल में भी मिलेंगे। बाद वाले का उपयोग हर प्रश्न में वही शर्त कॉपी किए बिना पूरे समूह पर शर्तों का एक सेट लागू करने, और/या समूह तथा प्रश्न स्तर के शर्त-आधारित लॉजिक को मिलाने के लिए किया जाता है।
- टेलरिंग - जब आप जान लेते हैं कि कौन से प्रश्न पूछे जाने चाहिए, तो टेलरिंग (जिसे कभी-कभी पाइपिंग कहा जाता है) तय करती है कि प्रश्न कैसे पूछा जाए। इससे आप न केवल सरल प्रतिस्थापन (जैसे {TOKEN:FIRSTNAME}) बल्कि अपने विषयों के लिंग या संख्या के आधार पर क्रियाओं के रूप और संज्ञाओं के विभक्ति-रूप भी सपोर्ट कर सकते हैं। यह आपको सर्वेक्षण प्रतिभागी को दिया जाने वाला संदेश इस आधार पर बदलने देता है कि उन्होंने अन्य प्रश्नों का उत्तर दिया या नहीं (या कैसे दिया)।
- समीकरण - EM समीकरण नामक एक नया प्रश्न का प्रकार जोड़ता है जो किसी एक्सप्रेशन का परिणाम संग्रहीत करता है। समीकरण के परिणाम गणना करके डेटाबेस में लिखे जाते हैं, भले ही आप उन्हें पृष्ठ पर छिपा दें। इसलिए, इनका उपयोग छिपी हुई स्कोरिंग गणनाओं, जटिल समीकरणों पर आधारित नेविगेशन, आकलनों, और डेटाबेस के भीतर बनाई और संग्रहीत की जाने वाली रिपोर्टों के लिए किया जाता है।
प्रासंगिकता और कैस्केडिंग प्रासंगिकता
अब प्रत्येक प्रश्न का प्रकार में एक प्रासंगिकता विकल्प है जो नियंत्रित करता है कि प्रश्न दिखाया जाए या नहीं। EM प्रत्येक प्रासंगिकता समीकरण को उसी क्रम में प्रोसेस करता है जिसमें वे सर्वेक्षण में दिखाई देते हैं। यदि एक्सप्रेशन सही है (या अनुपस्थित है - पुराने सर्वेक्षणों को सपोर्ट करने के लिए), तो प्रश्न दिखाया जाएगा। यदि वह प्रासंगिक नहीं है, तो प्रश्न छिपा दिया जाएगा और डेटाबेस में उसका मान NULL कर दिया जाएगा। यदि किसी समूह में कोई प्रासंगिक प्रश्न नहीं है, तो पूरा समूह छोड़ दिया जाएगा।
इसके अलावा, यदि किसी एक्सप्रेशन के भीतर कोई भी वेरिएबल अप्रासंगिक है, तो एक्सप्रेशन का मान हमेशा गलत (false) आता है। इससे कैस्केडिंग प्रासंगिकता संभव होती है, ताकि आपको हर प्रश्न के लिए बहुत लंबे प्रासंगिकता समीकरण न लिखने पड़ें।
मान लीजिए आपके पास पाँच प्रश्न Q1-Q5 हैं, और आप Q2 केवल तभी दिखाना चाहते हैं जब Q1 का उत्तर दिया गया हो, Q3 तभी जब Q2 का उत्तर दिया गया हो, इत्यादि। तब प्रासंगिकता समीकरण ये हो सकते हैं:
| प्रश्न कोड | प्रासंगिकता | प्रश्न |
|---|---|---|
| Q1 | 1 | आपका नाम क्या है? |
| Q2 | Q1 | {Q1}, आपकी उम्र कितनी है? |
| Q3 | Q2 | तो, आप {Q2} वर्ष के हैं। क्या आप विवाहित हैं? |
| Q4 | Q3 == "Y" | {Q1}, आपके विवाह को कितना समय हो गया है? |
| Q5 | Q4 | {Q1}, आपके कितने बच्चे हैं? |
समूह-स्तर की प्रासंगिकता
ExpressionScript समूह-स्तर की प्रासंगिकता को भी सपोर्ट करती है। इससे लूपिंग लागू करना आसान हो जाता है। मान लीजिए आप अधिकतम 10 इकाइयों (जैसे उत्पाद या किसी घर के लोग) से जानकारी एकत्र करना चाहते हैं, जहाँ आप पहले यह तय करते हैं कि कितनी इकाइयों के लिए फ़ॉलो-अप ज़रूरी है (जैसे यह पूछकर कि घर में कितने लोग रहते हैं, या लोगों से एक लंबी सूची में से यह चुनवाकर कि उन्हें कौन से उत्पाद पसंद हैं)। यह जानने के बाद कि कितनी इकाइयों के लिए फ़ॉलो-अप चाहिए, आप फ़ॉलो-अप प्रश्नों के 10 समूहों में से प्रत्येक के लिए {count >= 1}, {count >=2}, ... {count >= 10} जैसी समूह-स्तर की प्रासंगिकता का उपयोग कर सकते हैं। प्रत्येक समूह के भीतर, आप प्रश्न-स्तर का शर्त-आधारित लॉजिक रख सकते हैं (जैसे हर विषय के लिए लिंग या आयु-विशिष्ट फ़ॉलो-अप प्रश्न)। यह तय करने के लिए कि कौन-सा दिखाया जाए, प्रश्न और समूह-स्तर के प्रासंगिकता समीकरणों को आपस में AND किया जाता है।
ऐसा उदाहरण देखने के लिए, यह सर्वेक्षण इंपोर्ट करें: जनगणना सर्वेक्षण का उदाहरण।
नीचे दिए गए स्क्रीनशॉट में देखा जा सकता है कि यदि उत्तरदाता कम से कम एक अन्य सह-निवासी के साथ रहता है, तो Person 1 समूह प्रदर्शित होता है (या प्रासंगिक होता है):

टेलरिंग/पाइपिंग
कर्ली ब्रेसिज़ के भीतर की हर चीज़ को अब एक एक्सप्रेशन माना जाता है (एक अपवाद को छोड़कर, जिसका वर्णन नीचे किया गया है)। एक्सप्रेशन के पास सभी LimeReplacementFields और वेरिएबल (कई उपनामों के माध्यम से), सभी सामान्य समीकरण ऑपरेटर (गणितीय, तार्किक और तुलनात्मक) और दर्जनों फ़ंक्शन तक पहुँच होती है (जो क्लाइंट-साइड पर भी डायनामिक रूप से काम करते हैं)।
इन समीकरणों का उपयोग करके आप इस तरह के काम कर सकते हैं:
- पिछली प्रतिक्रियाओं के आधार पर उत्तरदाताओं को शर्त के अनुसार अनुकूलित संदेश दिखाना;
- मूल्यांकन मॉड्यूल का उपयोग किए बिना मूल्यांकन बनाना और उनके परिणाम दिखाना (या उन परिणामों के आधार पर शर्त के अनुसार ब्रांचिंग करना या संदेश दिखाना);
- प्रश्नों, उत्तरों और रिपोर्ट में क्रियाओं के रूप और संज्ञाओं की विभक्तियाँ बदलना;
- सर्वेक्षण के अंत में "अपने उत्तर दिखाएँ" पृष्ठ से पहले प्रतिक्रियाओं का सारांश दिखाना।
समीकरण
एक नया प्रश्न का प्रकार है जिसे समीकरण कहा जाता है। इसे पाठ प्रदर्शन प्रश्न का प्रकार की तरह समझें, अंतर यह है कि जो कुछ प्रदर्शित होता है उसका मान यह डेटाबेस में संग्रहीत करता है। इसलिए, यदि समीकरण प्रश्न टेक्स्ट में कोई मूल्यांकन गणना है, तो वह मान डेटाबेस में एक वेरिएबल में संग्रहीत किया जाएगा, जिसे सार्वजनिक या निजी आँकड़ों में दिखाया जा सकता है।
सिंटैक्स
कर्ली ब्रेसिज़ के भीतर की हर चीज़ को अब एक एक्सप्रेशन माना जाता है (एक अपवाद के साथ: शुरुआत या अंत में कोई खाली स्थान (व्हाइटस्पेस) नहीं होना चाहिए - यह इसलिए आवश्यक है ताकि ExpressionScript एम्बेडेड JavaScript को प्रोसेस करने का प्रयास न करे)।
ध्यान दें कि एक्सप्रेशन कई पंक्तियों में फैले हो सकते हैं, बशर्ते शुरुआती कर्ली ब्रेस के बाद या अंतिम कर्ली ब्रेस से पहले कोई खाली स्थान न हो। यह नेस्टेड "if()" कथनों के लिए विशेष रूप से उपयोगी है, जैसे:
{if(is_empty(PFTotals),
'',
if(PFTotals >= -5 && PFTotals <= -4,
'Very Soft',
if(PFTotals >= -3 && PFTotals <= -2,
'Soft',
if(PFTotals == -1,
'Somewhat Soft',
if(PFTotals == 0,
'Moderate',
if(PFTotals == 1,
'Somewhat Hard',
if(PFTotals >= 2 && PFTotals <= 3,
'Hard',
if(PFTotals >= 4 && PFTotals <= 5,
'Very Hard',
''
)
)
)
)
)
)
)
)}
ExpressionScript निम्नलिखित सिंटैक्स का समर्थन करता है:
- सभी मानक गणितीय ऑपरेटर (जैसे +,-,*,/,!);
- सभी मानक तुलना ऑपरेटर (जैसे <,<=,==,!=,>,>=, साथ ही उनके समकक्ष: lt, le, eq, ne, gt, ge);
- कोष्ठक (ताकि आप उप-एक्सप्रेशन को समूहित कर सकें);
- सशर्त ऑपरेटर (जैसे &&,| | और उनके समकक्ष: and, or);
- सिंगल और डबल कोट वाली स्ट्रिंग (जिनमें से प्रत्येक में दूसरे प्रकार के कोट वाली स्ट्रिंग एम्बेड की जा सकती है);
- कॉमा ऑपरेटर (ताकि एक्सप्रेशन की सूची हो सके और केवल अंतिम परिणाम लौटाया जाए);
- असाइनमेंट ऑपरेटर (=);
- पूर्व-परिभाषित वेरिएबल (प्रश्नों, प्रश्न गुणों और प्रतिक्रियाओं को संदर्भित करने के लिए) - जैसे SGQA कोड;
- पूर्व-परिभाषित फ़ंक्शन (पहले से ही 80 से अधिक हैं, और और जोड़ना आसान है)।
ऑपरेटर
EM सिंटैक्स सामान्य ऑपरेटर वरीयता का पालन करता है:
| स्तर | ऑपरेटर | विवरण |
|---|---|---|
| 1 | () | समूहन या फ़ंक्शन कॉल करने के लिए कोष्ठक |
| 2 | ! - + | एकल ऑपरेटर: नॉट, ऋणात्मक, धनात्मक |
| 3 | * / | गुणा, भाग |
| 4 | + - | जोड़, घटाव |
| 5 | < <= > >= lt le gt ge | सापेक्ष तुलनाएँ |
| 6 | == != eq ne | समानता तुलनाएँ |
| 7 | and | तार्किक AND |
| 8 | or | तार्किक OR |
| 9 | = | असाइनमेंट ऑपरेटर |
| 10 | , | कॉमा ऑपरेटर |
संख्या और स्ट्रिंग के बेमेल तथा वर्णानुक्रमिक/संख्यात्मक तुलना के बारे में चेतावनी
जब आप मानों की सापेक्ष या समानता तुलना करना चाहें, तो बेमेल पर ध्यान दें। उपयोगकर्ता द्वारा दर्ज किया गया (या उत्तर कोड के माध्यम से दिया गया) मान यदि वह स्पष्ट रूप से संख्या है तो संख्या के रूप में उपयोग किया जा सकता है।
यदि आप किसी मान को " से घेरते हैं, तो टेक्स्ट/स्ट्रिंग तुलना होगी। यदि आप संख्या के रूप में तुलना करना चाहते हैं, तो संख्या को कभी भी " से न घेरें।
उदाहरण के लिए, यदि Q0.NAOK एक संख्यात्मक प्रश्न है जिसका मान 9 है, तो Q0.NAOK > "50" सत्य होगा। इसका कारण यह है कि ऑपरेटर > इसे वर्णानुक्रमिक तुलना मानेगा, संख्यात्मक नहीं।
यह सुनिश्चित करने के लिए कि आप पूर्णांक मानों की तुलना करें, आप intval(Q0.NAOK) > 50 का उपयोग कर सकते हैं। बस याद रखें कि यदि Q0.NAOK संख्या नहीं है (खाली है या स्ट्रिंग है), तो intval(Q0.NAOK) === 0 होगा। स्ट्रिंग मानों ("A" < "B") की तुलना के लिए सीधे strcmp का उपयोग करें: strcmp(Q0.NAOK,"B") या strcmp(Q0.NAOK,"A5")।
असाइनमेंट ऑपरेटर (=) के उपयोग के बारे में सावधानी
जब तक नितांत आवश्यक न हो, आपको असाइनमेंट ऑपरेटरों के उपयोग से बचना चाहिए, क्योंकि वे अप्रत्याशित दुष्प्रभाव पैदा कर सकते हैं। उदाहरण के लिए, यदि आप किसी पिछली प्रतिक्रिया का मान बदलते हैं, तो उस प्रश्न और वर्तमान प्रश्न के बीच की कैस्केडिंग प्रासंगिकता और सत्यापन लॉजिक की पुनः गणना नहीं की जाती, इसलिए आपके पास आंतरिक रूप से असंगत डेटा हो सकता है (जैसे, ऐसे प्रश्न जिनका उत्तर दिया हुआ रहता है लेकिन जिन्हें NULL किया जाना चाहिए था, या ऐसे प्रश्न जो छोड़ दिए गए लेकिन जिनका उत्तर दिया जाना चाहिए था)। सामान्य तौर पर, यदि आप किसी वेरिएबल को मान देना चाहते हैं, तो आपको समीकरण प्रश्न का प्रकार बनाना चाहिए और उसका मान सेट करने के लिए एक्सप्रेशन का उपयोग करना चाहिए। फिर भी, कुछ दुर्लभ अवसर होते हैं जब लोगों को वास्तव में इस ऑपरेटर की आवश्यकता होती है, इसलिए हमने इसे उपलब्ध रखा है।
इस ऑपरेटर के बारे में आपको सावधान करने के लिए, इसे सिंटैक्स समीकरणों में लाल फ़ॉन्ट में दिखाया जाता है (ताकि आप इसे "==" से भ्रमित न करें)।
असाइनमेंट ऑपरेटर का उपयोग
असाइनमेंट ऑपरेटर का उपयोग करने के मुख्य कारण ये हो सकते हैं:
- आपको ऐसे प्रश्न के लिए समीकरण द्वारा डिफ़ॉल्ट मान सेट करना है जो डिफ़ॉल्ट मान स्वीकार नहीं करता (जैसे सूची रेडियो, जहाँ यूज़र इंटरफ़ेस आपको उत्तर विकल्पों में से एक चुनने देता है, लेकिन समीकरण दर्ज करने नहीं देता)। हालाँकि सावधान रहें, क्योंकि LimeSurvey यह सत्यापित नहीं कर पाएगा कि आपका समीकरण उस प्रश्न के लिए अनुमत उत्तरों में से कोई एक उत्पन्न करता है;
- आपको किसी बाद की प्रतिक्रिया के आधार पर पिछले प्रश्न की प्रतिक्रिया को ज़बरदस्ती बदलना है;
- आदि...
इस उद्देश्य के लिए आप पूरे एक्सप्रेशन मैनेजर सिस्टम का उपयोग कर सकते हैं। इसके लिए समीकरण का उपयोग करना बेहतर है।
कुछ उदाहरण:
- किसी संक्षिप्त पाठ प्रश्न का उत्तर छोटे अक्षरों (lowercase) में सेट करना :
{QCODE=strtolower(QCODE.NAOK)}; - सर्वेक्षण की शुरुआत में किसी सरणी प्रश्न के प्रकार का डिफ़ॉल्ट उत्तर सेट करना :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - सर्वेक्षण की शुरुआत में किसी सरणी पाठ प्रश्न के प्रकार का डिफ़ॉल्ट उत्तर सेट करना :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - शर्त के साथ उत्तर सेट करना :
{QCODE=if(YesNo="Y","A1","")}।
XSS सुरक्षा
XSS सक्षम होने पर, एक्सप्रेशन मैनेजर सिस्टम के कुछ हिस्सों का उपयोग नहीं किया जा सकता:
- किसी एक्सप्रेशन में HTML टैग शुरू करना लेकिन उसे दूसरे एक्सप्रेशन में समाप्त करना;
- किसी URL के भीतर जटिल एक्सप्रेशन का उपयोग करना।
उदाहरण और समाधान:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}XSS सुरक्षा के साथ काम नहीं करता, यहाँ आप{if(1,"<strong>information</strong>","information")}का उपयोग कर सकते हैं;<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, यहाँ आप समीकरण प्रश्न का उपयोग कर सकते हैं, क्योंकि पूरे प्रश्न कोड का उपयोग करना ठीक है:<a href="/script.php?value={EQUATION.NAOK}">next</a>।
वेरिएबल तक पहुँच
ExpressionScript आपको जिन भी वेरिएबल की आवश्यकता हो, उन्हें केवल पढ़ने की पहुँच देता है। पिछले संस्करणों के साथ संगतता के लिए, यह निम्नलिखित तक पहुँच प्रदान करता है:
- TOKEN:xxx - किसी TOKEN का मान (उदा., TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (केवल गैर-अनाम सर्वेक्षण के लिए)।
- सभी थीम द्वारा उपयोग किए जाने वाले {XXX} मान।
- प्रश्न टेक्स्ट में आप {QID} का उपयोग कर सकते हैं, जो प्रश्न की आईडी से बदल दिया जाता है, और {SGQ}, जो प्रश्न के SGQA से बदल दिया जाता है।
- मौजूदा प्रतिक्रिया आईडी के लिए {SAVEDID}
इसके अलावा, ExpressionScript आपको वेरिएबल को प्रश्न कोड (डेटाबेस की प्रश्न तालिका में 'title' कॉलम) से संदर्भित करने देता है। जब आप अपना डेटा SPSS, R या SAS में एक्सपोर्ट करते हैं, तब यही वेरिएबल लेबल के रूप में उपयोग होता है। उदाहरण के लिए, यदि आपके पास नाम, आयु और लिंग के बारे में प्रश्न हैं, तो आप उन वेरिएबल को 12345X13X22, 12345X13X23 और 12345X13X24 के बजाय name, age और gender कह सकते हैं। इससे समीकरणों को पढ़ना और उनके तर्क को सत्यापित करना सभी के लिए आसान हो जाता है, साथ ही समूह या प्रश्न संख्या का ध्यान रखे बिना प्रश्नों का क्रम बदलना भी संभव हो जाता है।
महत्वपूर्ण: पिछले पृष्ठों या प्रश्नों में आने वाले वेरिएबल को संदर्भित करना अधिक सुरक्षित है।
इसके अलावा, ExpressionScript आपको प्रश्न के कई गुणों तक पहुँचने देता है:
| सिंटैक्स | अर्थ | उदाहरण | उदाहरण परिणाम |
|---|---|---|---|
| Qcode | Qcode.code का उपनाम | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | प्रश्न के लिए चुना गया उत्तर कोड, यदि वह प्रासंगिक है (अन्यथा रिक्त), या टेक्स्ट मान, यदि यह कोडित प्रश्न नहीं है | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | Qcode के समान - NAOK की चर्चा देखें | {gender.NAOK} | 'M' |
| Qcode.value | प्रश्न का मूल्यांकन मूल्य, यदि वह प्रासंगिक है (अन्यथा रिक्त), या टेक्स्ट मान, यदि यह कोडित प्रश्न नहीं है | {gender.value} | '1' |
| Qcode.valueNAOK | Qcode.value के समान - NAOK की चर्चा देखें | {gender.valueNAOK} | '1' |
| Qcode.shown | प्रश्न का प्रदर्शित मान | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | प्रश्न का टेक्स्ट | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | प्रश्न अनिवार्य है या नहीं (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | प्रश्न की आंतरिक संख्या (क्रमिक संख्या नहीं) | {gender.qid} | 337 |
| Qcode.type | प्रश्न का प्रकार | {gender.type} | 'G' |
| Qcode.jsName | प्रश्न का सही javascript नाम, चाहे वह इस पृष्ठ पर घोषित हो या नहीं | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | समूह की आंतरिक संख्या (क्रमिक संख्या नहीं) | {gender.gid} | 3 |
| Qcode.qseq | प्रश्न की क्रमिक संख्या, 0 से शुरू | {gender.qseq} | 5 |
| Qcode.gseq | समूह की क्रमिक संख्या, 0 से शुरू | {gender.gseq} | 1 |
| Qcode.relevanceStatus | प्रश्न वर्तमान में प्रासंगिक है या नहीं (0 या 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | प्रश्न-स्तर का प्रासंगिकता समीकरण | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | समूह-स्तर का प्रासंगिकता समीकरण | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | इस प्रश्न का SGQA मान | {gender.sgqa} | '1827X3X337' |
HTML संपादक की समस्या
यदि आप HTML संपादक का उपयोग करते हैं, तो कुछ वर्ण HTML एंटिटी से बदल दिए जाते हैं।
- & को & से
- < को < से
- > को > से
यदि आप HTML संपादक का उपयोग करते हैं, तो आपको इनका उपयोग करना होगा:
- & के लिए and
- < के लिए lt
- <= के लिए le
- > के लिए gt
- >= के लिए ge
अनुशंसा की जाती है कि आप अपने एक्सप्रेशन के भीतर दिखाई देने वाले HTML को हटा दें। यदि आप LimeSurvey HTML संपादक का उपयोग करते हैं, तो "Source" बटन (संपादक के ऊपरी बाएँ भाग में स्थित) पर क्लिक करें और उन सभी वर्णों को डिलीट करें जो आपके एक्सप्रेशन से संबंधित नहीं हैं (उदा.,
,
आदि)।
Qcode वेरिएबल का नामकरण
यहाँ प्रश्न के प्रकार के अनुसार Qcode बनाने (और कुछ गुणों तक पहुँचने) का विवरण दिया गया है। सामान्यतः, Qcode इस प्रकार बनाए जाते हैं:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
comment और other के लिए, संबंधित प्रश्न कोड क्रमशः QuestionCode_comment और QuestionCode_other होते हैं।
| प्रकार | विवरण | कोड | उप-प्रश्न | जवाब विकल्प | स्केल | उत्तर कोड | प्रदर्शित उत्तर | प्रासंगिकता |
|---|---|---|---|---|---|---|---|---|
| 5 | 5 बिंदु वाले विकल्प रेडियो-बटन | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | सरणी (10 बिंदु वाले विकल्प) रेडियो-बटन | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | सरणी (5 बिंदु वाले विकल्प) रेडियो-बटन | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | सरणी (लचीले लेबल) दोहरा स्केल | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | सरणी (लचीली) - कॉलम प्रारूप | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | सरणी (लचीली) - पंक्ति प्रारूप | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | सरणी (बढ़ाएँ/वही/घटाएँ) रेडियो-बटन | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | सरणी (मल्टी फ्लेक्सी) 1 से 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | सरणी (मल्टी फ्लेक्सी) टेक्स्ट | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | सरणी (हां/अनिश्चित/नहीं) रेडियो-बटन | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | बॉयलरप्लेट प्रश्न | Q11 | {Q11.shown} | |||||
| D | दिनांक | Q12 | {Q12} | {Q12.shown} | ||||
| * | समीकरण | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | अपलोड फ़ाइल (अपलोड की गई फ़ाइलों की संख्या दर्ज करता है) | Q14 | {Q14} | {Q14>0} | ||||
| G | लिंग ड्रॉपडाउन सूची | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Teks bebas besar | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | भाषा प्रश्न | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | सूची - ड्रॉपडाउन | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | सूची ड्रॉपडाउन/रेडियो-बटन सूची | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | टिप्पणी के साथ सूची ड्रॉपडाउन/रेडियो-बटन सूची + टेक्स्ट एरिया | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | लंबे मुफ़्त टेक्स्ट | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | एकाधिक विकल्प चेकबॉक्स | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | टिप्पणी के साथ एकाधिक विकल्प चेकबॉक्स + टेक्स्ट | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | एकाधिक संख्यात्मक प्रश्न | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | एक से ज़्यादा छोटे टेक्स्ट | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | संख्यात्मक प्रश्न प्रकार | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | रैंकिंग शैली | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Teks bebas singkat | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | हां/नहीं रेडियो-बटन | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
NAOK का उपयोग
NAOK --> "Not Applicable" (NA) is alright (OK) अर्थात "लागू नहीं" ठीक है
NAOK का उपयोग करने का अर्थ है कि सभी या कुछ वेरिएबल अप्रासंगिक हैं (उदा. "Not Applicable" (NA) is alright (OK))।
उदाहरण: यदि Q1 का कोई उप-प्रश्न फ़िल्टर किया गया है, तो count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) हमेशा एक रिक्त स्ट्रिंग देता है। ऐसे प्रश्न में चुने गए उप-प्रश्नों की संख्या गिनने के लिए count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK) का उपयोग किया जा सकता है। यदि उप-प्रश्न छिपा हुआ है, तो EM एक रिक्त स्ट्रिंग लौटाता है।
NAOK के बिना, यदि कोई प्रश्न या उप-प्रश्न छिपा हुआ है, तो EM हमेशा एक रिक्त स्ट्रिंग लौटाता है (जो false लौटाने के समान है)।
.shown हमेशा NAOK प्रणाली का उपयोग करता है (छिपा होने पर रिक्त स्ट्रिंग), लेकिन यदि आपको उत्तर का कोड चाहिए, तो प्रश्न कोड के बाद .NAOK जोड़ना हमेशा अच्छा विचार है (सिवाय इसके कि आपको इसकी आवश्यकता हो और आप जानते हों कि आप क्या कर रहे हैं)।
अधिक जानकारी Overriding Cascading Conditions उपभाग में दी गई है।
आरक्षित "this", "self" और "that" वेरिएबल
अक्सर आप किसी प्रश्न के सभी भागों का मूल्यांकन करना चाहते हैं, जैसे कितने उप-प्रश्नों के उत्तर दिए गए हैं यह गिनना या अंकों का योग निकालना। अन्य समय में आप प्रश्न की केवल कुछ पंक्तियों या कॉलम को प्रोसेस करना चाहते हैं (जैसे पंक्ति या कॉलम का योग निकालकर उसे डेटाबेस में संग्रहीत करना)। ये आरक्षित वेरिएबल इस प्रक्रिया को अपेक्षाकृत आसान बना देते हैं।
"This" वेरिएबल
"this" वेरिएबल का उपयोग केवल "संपूर्ण प्रश्न सत्यापन समीकरण" और "उप-प्रश्न सत्यापन समीकरण" विकल्पों में किया जाता है (बाद वाला GUI से संभव नहीं है)। यह उन प्रश्नों के प्रत्येक सेल के वेरिएबल नामों में विस्तारित हो जाता है। इसलिए, यदि आप सुनिश्चित करना चाहते हैं कि प्रत्येक प्रविष्टि तीन से बड़ी हो, तो आप "उप-प्रश्न सत्यापन समीकरण" को (this > 3) पर सेट करेंगे।
"Self" वेरिएबल
"self" और "that" वेरिएबल अधिक शक्तिशाली हैं और मैक्रो के रूप में काम करते हैं, जो समीकरणों को प्रोसेस करने से पहले विस्तारित किए जाते हैं। "self" वेरिएबल के लिए सिंटैक्स विकल्प ये हैं:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- suffix कोई भी सामान्य qcode प्रत्यय हो सकता है (उदा., NAOK, value, shown)
- sub-selector निम्नलिखित में से कोई एक हो सकता है:
- comments - केवल वे उप-प्रश्न जो टिप्पणियाँ हैं (उदा., टिप्पणी के साथ एकाधिक विकल्प और टिप्पणी के साथ सूची);
- nocomments - केवल वे उप-प्रश्न जो टिप्पणियाँ नहीं हैं;
- sq_X - जहाँ X पंक्ति या कॉलम का पहचानकर्ता है। केवल वही उप-प्रश्न चुने जाते हैं जो पैटर्न X से मेल खाते हैं। ध्यान दें कि खोज पूर्ण कोड पहचानकर्ता पर की जाती है, इसलिए sq_X मिलान में उप-प्रश्न nX, X, Xn शामिल होते हैं (उदा., यदि आप sq_1 का उपयोग करते हैं, तो उप-प्रश्न a1, 1a, 1, 11 या 001 शामिल किए जाएँगे)। दोहरे स्केल वाले प्रश्न का प्रकार, जहाँ उप-प्रश्न कोड QCODE_SQCODE_1 और QCODE_SQCODE_1 होते हैं, और रैंकिंग प्रश्न का प्रकार, जहाँ उप-प्रश्न कोड QCODE_1, QCODE_2 ... होते हैं, इन पर विशेष ध्यान दें।
उदाहरण:
- क्या प्रश्न के किसी भी भाग का उत्तर दिया गया है? -> {count(self.NAOK)>0}
- इस प्रश्न का मूल्यांकन स्कोर क्या है? -> {sum(self.value)}
आप इनका उपयोग पंक्ति और कॉलम का योग निकालने के लिए भी कर सकते हैं। मान लें कि आपके पास संख्याओं की एक सरणी है जिसमें पंक्तियाँ A-E और कॉलम 1-5 हैं।
- कुल योग क्या है? -> {sum(self.NAOK)}
- पंक्ति B का योग क्या है? -> {sum(self.sq_B.NAOK)}
- कॉलम 3 का योग क्या है? -> {sum(self.sq_3.NAOK)}
"That" वेरिएबल
"that" वेरिएबल "self" वेरिएबल की तरह है, लेकिन यह आपको अन्य प्रश्नों का संदर्भ देने की सुविधा देता है। इसका सिंटैक्स है:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname उप-प्रश्न के किसी विस्तार के बिना प्रश्न का नाम है। तो मान लीजिए कि हम एक प्रश्न 'q1' बनाते हैं, जिसमें 'q' भी उसका qname दर्शाता है।
उदाहरण:
- क्या प्रश्न q1 के किसी भी भाग का उत्तर दिया गया है? -> {count(that.q1.NAOK)>0}
- q2 का मूल्यांकन स्कोर क्या है? -> {sum(that.q2.NAOK)}
- q3 का कुल योग क्या है? -> {sum(that.q3.NAOK)}
- q4 में पंक्ति C का योग क्या है? -> {sum(that.q4.sq_C.NAOK)}
- q4 में कॉलम 2 का योग क्या है? -> {sum(that.q4.sq_2.NAOK)}
"self" और "that" वेरिएबल का उपयोग किसी भी प्रासंगिकता, सत्यापन या टेलरिंग में किया जा सकता है।
एक बात का ध्यान रखें: जब आप Show logic file सुविधा का उपयोग करते हैं, तो यह "self" और "that" का विस्तारित मान दिखाएगी। इससे आप वह वास्तविक समीकरण देख सकते हैं जो बनाया जाएगा, ताकि आप (और EM) जाँच सकें कि वेरिएबल मौजूद हैं या नहीं। यह भ्रमित करने वाला लग सकता है क्योंकि आपको काफी लंबे समीकरण दिख सकते हैं। हालाँकि, यदि आप प्रश्न को एडिट करें, तो आपको "self" और/या "that" का उपयोग करने वाला मूल समीकरण दिखाई देगा।
- आप समीकरण में उपयोग किए गए प्रत्येक वेरिएबल का नाम स्पष्ट रूप से देना चाहते हैं, या
- ऐसे वेरिएबल का उपयोग कर रहे हैं जिनके उप-प्रश्न नहीं हैं (उदा., एकल प्रतिक्रिया वाले प्रश्न)। ऐसे मामलों में वेरिएबल के आगे "that" लगाना अनावश्यक है, और आपको अप्रत्याशित परिणाम मिलने का जोखिम रहता है।
फ़ंक्शन तक पहुँच
ExpressionScript गणितीय, स्ट्रिंग और उपयोगकर्ता-परिभाषित फ़ंक्शन तक पहुँच प्रदान करता है, जैसा कि नीचे दिखाया गया है। इन फ़ंक्शन के PHP और JavaScript समकक्ष उपलब्ध हैं, ताकि वे सर्वर-साइड (PHP) और क्लाइंट-साइड (JavaScript) पर एक समान रूप से काम करें। नए फ़ंक्शन जोड़ना आसान है।
लागू किए गए फ़ंक्शन
वर्तमान में निम्नलिखित फ़ंक्शन उपलब्ध हैं:
| फ़ंक्शन | अर्थ | सिंटैक्स |
|---|---|---|
| abs | निरपेक्ष मान | number abs(number) |
| acos | आर्क कोसाइन | number acos(number) |
| addslashes | स्ट्रिंग को स्लैश के साथ उद्धृत करें | string addslashes(string) |
| asin | आर्क साइन | number asin(number) |
| atan | आर्क स्पर्शरेखा | number atan(number) |
| atan2 | दो चर की आर्क स्पर्शरेखा | number atan2(number, number) |
| ceil | भिन्नों को ऊपर की ओर पूर्णांकित करें | number ceil(number) |
| checkdate | यदि ग्रेगोरियन कैलेंडर में तारीख मान्य है तो true(1) लौटाता है | bool checkdate(month,day,year) |
| convert_value | संख्यात्मक मानों की inputTable और outputTable का उपयोग करके किसी संख्यात्मक मान को परिवर्तित करें | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | कोसाइन | number cos(number) |
| count | सूची में उत्तर दिए गए (अरिक्त) प्रश्नों की संख्या गिनें | number count(arg1, arg12, ..., argN) |
| countif | सूची में उन उत्तर दिए गए प्रश्नों की संख्या गिनें जो पहले आर्ग्युमेंट के बराबर हैं | number countif(matches, arg1, arg2, ... argN) |
| countifop | सूची में उन उत्तर दिए गए प्रश्नों की संख्या गिनें जो मानदंड (arg op value) को पूरा करते हैं | number countifop(op, value, arg1, arg2, ... argN) |
| date | स्थानीय तारीख/समय को स्वरूपित करें | string date(format [, timestamp=time()]) |
| exp | e के घातांक का परिकलन करता है | number exp(number) |
| fixnum | आवश्यकता होने पर संख्याओं को अल्पविराम को दशमलव विभाजक बनाकर प्रदर्शित करें | string fixnum(number) |
| floor | भिन्नों को नीचे की ओर पूर्णांकित करें | number floor(number) |
| gmdate | GMT तारीख/समय को स्वरूपित करें | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | सभी HTML एंटिटी को उनके संगत वर्णों में बदलें (हमेशा ENT_QUOTES और UTF-8 का उपयोग करता है) | string html_entity_decode(string) |
| htmlentities | सभी संगत वर्णों को HTML एंटिटी में बदलें (हमेशा ENT_QUOTES और UTF-8 का उपयोग करता है) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | विशेष वर्णों को HTML एंटिटी में बदलें (हमेशा ENT_QUOTES और UTF-8 का उपयोग करता है) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | विशेष HTML एंटिटी को वापस वर्णों में बदलें (हमेशा ENT_QUOTES और UTF-8 का उपयोग करता है) | string htmlspecialchars_decode(string) |
| idate | स्थानीय समय/तारीख को पूर्णांक के रूप में स्वरूपित करें | string idate(string [, timestamp=time()]) |
| if | एक्सेल-शैली का if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | एक स्ट्रिंग के साथ सरणी तत्वों को जोड़ें | string implode(glue,arg1,arg2,...,argN) |
| intval | किसी चर का पूर्णांक मान प्राप्त करें | int intval(number [, base=10]) |
| is_empty | निर्धारित करें कि कोई चर रिक्त माना जाता है या नहीं | bool is_empty(var) |
| is_float | पता लगाएं कि क्या किसी चर का प्रकार फ़्लोट है | bool is_float(var) |
| is_int | पता लगाएं कि क्या किसी चर का प्रकार पूर्णांक है | bool is_int(var) |
| is_nan | पता लगाएं कि क्या मान कोई संख्या नहीं है | bool is_nan(var) |
| is_null | पता लगाएं कि क्या कोई चर NULL है | bool is_null(var) |
| is_numeric | पता लगाएं कि क्या कोई चर संख्या या संख्यात्मक स्ट्रिंग है | bool is_numeric(var) |
| is_string | पता लगाएं कि क्या किसी चर का प्रकार स्ट्रिंग है | bool is_string(var) |
| join (New in 2.0 build 130129) | तत्वों को नई स्ट्रिंग के रूप में जोड़ें | join(arg1, arg2, ... argN) |
| list | अरिक्त मानों की अल्पविराम-पृथक सूची लौटाएँ | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | सूची में उन प्रश्नों से, जो मानदंड (cmpProp op value) को पूरा करते हैं, निर्दिष्ट प्रश्न गुण (retProp) की 'glue'-पृथक सूची लौटाएँ | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | स्ट्रिंग के आरंभ से रिक्त स्थान (या अन्य वर्ण) हटाएँ | string ltrim(string [, charlist]) |
| max | सबसे बड़ा मान खोजें | number max(arg1, arg2, ... argN) |
| min | सबसे छोटा मान खोजें | number min(arg1, arg2, ... argN) |
| mktime | किसी तारीख के लिए UNIX टाइमस्टैम्प प्राप्त करें (6 आर्ग्युमेंट में से प्रत्येक वैकल्पिक है) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | मॉड्युलो फ़ंक्शन अभी समर्थित नहीं है। आप इसके स्थान पर floor() फ़ंक्शन का उपयोग कर सकते हैं | floor(x/y)==(x/y) |
| nl2br | स्ट्रिंग में सभी नई पंक्तियों से पहले HTML लाइन ब्रेक जोड़ता है | string nl2br(string) |
| number_format | हज़ारों को समूहीकृत करके संख्या को स्वरूपित करें | string number_format(number) |
| pi | pi का मान प्राप्त करें | number pi() |
| pow | घातीय व्यंजक | number pow(base, exp) |
| quoted_printable_decode | quoted-printable स्ट्रिंग को 8 बिट स्ट्रिंग में बदलें | string quoted_printable_decode(string) |
| quoted_printable_encode | 8 बिट स्ट्रिंग को quoted-printable स्ट्रिंग में बदलें | string quoted_printable_encode(string) |
| quotemeta | मेटा वर्णों को उद्धृत करें | string quotemeta(string) |
| rand | एक यादृच्छिक पूर्णांक उत्पन्न करें, यह उदाहरण देखें | int rand() OR int rand(min, max) |
| regexMatch | किसी स्ट्रिंग की नियमित अभिव्यक्ति से तुलना करें | bool regexMatch(pattern,input) |
| round | किसी संख्या को वैकल्पिक सटीकता तक पूर्णांकित करता है | number round(val [, precision]) |
| rtrim | स्ट्रिंग के अंत से रिक्त स्थान (या अन्य वर्ण) हटाएँ | string rtrim(string [, charlist]) |
| sin | साइन | number sin(arg) |
| sprintf | एक स्वरूपित स्ट्रिंग लौटाएँ | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | वर्गमूल | number sqrt(arg) |
| stddev | संख्याओं की सूची के लिए प्रतिदर्श मानक विचलन का परिकलन करें | number stddev(arg1, arg2, ... argN) |
| str_pad | किसी स्ट्रिंग को दूसरी स्ट्रिंग से भरकर निश्चित लंबाई तक पैड करें | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | स्ट्रिंग को दोहराएँ | string str_repeat(input, multiplier) |
| str_replace | खोजी गई स्ट्रिंग की सभी घटनाओं को प्रतिस्थापन स्ट्रिंग से बदलें | string str_replace(search, replace, subject) |
| strcasecmp | बाइनरी सुरक्षित, अक्षर-आकार की उपेक्षा करने वाली स्ट्रिंग तुलना | int strcasecmp(str1, str2) |
| strcmp | बाइनरी सुरक्षित स्ट्रिंग तुलना | int strcmp(str1, str2) |
| strip_tags | स्ट्रिंग से HTML और PHP टैग हटाएँ | string strip_tags(str, allowable_tags) |
| stripos | अक्षर-आकार की उपेक्षा करते हुए यूनिकोड स्ट्रिंग की पहली घटना की स्थिति खोजें (0 से आरंभ, न मिलने पर false लौटाता है) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | उद्धृत स्ट्रिंग से उद्धरण हटाएँ | string stripslashes(string) |
| stristr | अक्षर-आकार की उपेक्षा करने वाला strstr | string stristr(haystack, needle [, before_needle=false]) |
| strlen | स्ट्रिंग की लंबाई प्राप्त करें | int strlen(string) |
| strpos | यूनिकोड स्ट्रिंग की पहली घटना की स्थिति खोजें (0 से आरंभ, न मिलने पर false लौटाता है) | int strpos(haystack, needle [ offset=0]) |
| strrev | स्ट्रिंग को उलटें | string strrev(string) |
| strstr | स्ट्रिंग की पहली घटना खोजें | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | स्ट्रिंग को छोटे अक्षरों (lowercase) में बदलें | string strtolower(string) |
| strtotime | किसी भी अंग्रेज़ी पाठ्य दिनांक-समय विवरण को Unix टाइमस्टैम्प में बदलें | int strtotime(string) |
| strtoupper | स्ट्रिंग को बड़े अक्षरों (uppercase) में बदलें | string strtoupper(string) |
| substr | यूनिकोड स्ट्रिंग का एक भाग लौटाएँ | string substr(string, start [, length]) |
| sum | किसी सरणी में मानों के योग का परिकलन करें | number sum(arg1, arg2, ... argN) |
| sumifop | सूची में उन उत्तर दिए गए प्रश्नों के मानों का योग करें जो मानदंड (arg op value) को पूरा करते हैं | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | स्पर्शरेखा | number tan(arg) |
| time | वर्तमान UNIX टाइमस्टैम्प लौटाएँ | number time() |
| trim | स्ट्रिंग के आरंभ और अंत से रिक्त स्थान (या अन्य वर्ण) हटाएँ | string trim(string [, charlist]) |
| ucwords | स्ट्रिंग में प्रत्येक शब्द का पहला वर्ण बड़े अक्षर (uppercase) में बदलें | string ucwords(string) |
| unique | यदि सभी अरिक्त उत्तर अद्वितीय हैं तो true लौटाता है | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
प्लगइन के साथ नए एक्सप्रेशन फ़ंक्शन बनाएँ (New in 4.0.0 )
यदि आपको ऐसे नए फ़ंक्शन की आवश्यकता है जो कोर में मौजूद नहीं है, तो आप उसे प्लगइन से बना सकते हैं। ऐसा नया फ़ंक्शन expressionManagerStart इवेंट का उपयोग करके बनाया जाता है।
ExpressionScript जानता है कि कौन से चर लोकल हैं
किसी पेज के लिए JavaScript को सही ढंग से बनाने के लिए, EM को यह जानना आवश्यक है कि पेज पर कौन-से वेरिएबल सेट हैं और उनकी JavaScript ID क्या है (उदाहरण के लिए, document.getElementById(x) के लिए)। इसे यह भी पता होना चाहिए कि अन्य पेजों पर कौन-से वेरिएबल सेट हैं (ताकि यह सुनिश्चित किया जा सके कि आवश्यक <input type='hidden' value='x'> फ़ील्ड मौजूद हैं और भरे हुए हैं)।
क्रमिक (कैस्केडिंग) शर्तें
यदि कोई भी वेरिएबल अप्रासंगिक है, तो पूरा समीकरण अप्रासंगिक (false) हो जाएगा। उदाहरण के लिए, निम्न तालिका में N/A का अर्थ है कि वेरिएबल में से एक प्रासंगिक नहीं था:
| ऑपरेटर | उदाहरण | a | b | परिणाम |
|---|---|---|---|---|
| + (unary) | +a | N/A | false | |
| ! | !a | N/A | false | |
| == (or eq) | a == b | N/A | 5 | false |
| == (or eq) | a == b | N/A | 0 | false |
| == (or eq) | a == b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 5 | false |
| != (or ne) | a != b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 0 | false |
| > (or gt) | a > b | N/A | 5 | false |
| >= (or ge) | a >= b | N/A | 5 | false |
| < (or lt) | a < b | N/A | 5 | false |
| <= (or le) | a <= b | N/A | 5 | false |
| and | a and b | N/A | 5 | false |
| and | a and b | N/A | N/A | false |
| or | a or b | N/A | N/A | false |
| or | a or b | N/A | 5 | false |
| + | a + b | N/A | 5 | false |
| * | a * b | N/A | 5 | false |
| / | a / b | 5 | N/A | false |
| () | (a) | N/A | false | |
| (exp) | (a && b) | N/A | 5 | false |
| (exp) op (exp) | (b + b) > (a && b) | N/A | 5 | false |
| function | sum(a,b,b) | N/A | 5 | false |
| function | max(a,b) | N/A | 5 | false |
| function | min(a,b) | N/A | 5 | false |
| function | implode(', ',a,b,a,b) | N/A | 5 | false |
| function | if(a,a,b) | N/A | 5 | false |
| function | is_empty(a) | N/A | false | |
| function | is_empty(a) | 0 (or blank) | true | |
| function | !is_empty(a) | N/A | false |
क्रमिक (कैस्केडिंग) शर्तों को ओवरराइड करना
मान लीजिए आप सभी प्रासंगिक उत्तरों का चालू योग दिखाना चाहते हैं। आप समीकरण {sum(q1,q2,q3,...,qN)} का उपयोग करने का प्रयास कर सकते हैं। लेकिन आंतरिक रूप से इसका अनुवाद LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))) में हो जाता है। इसलिए, यदि q1-qN में से कोई भी मान अप्रासंगिक है, तो समीकरण हमेशा false लौटाएगा। इस स्थिति में, जब तक सभी प्रश्नों के उत्तर नहीं दिए जाते, sum() "0" दिखाएगा।
इससे बचने के लिए, प्रत्येक वेरिएबल में ".NAOK" प्रत्यय (जिसका अर्थ है Not Applicable is OK) जोड़ा जा सकता है। ऐसे में निम्न व्यवहार होता है। मान लीजिए आपके पास वेरिएबल q1.NAOK है:
- q1 को LEManyNA() क्लॉज़ में नहीं जोड़ा जाता
- LEMval('q1') यह जाँचना जारी रखेगा कि प्रतिक्रिया प्रासंगिक है या नहीं और यदि नहीं है तो "" लौटाएगा (इसलिए अलग-अलग अप्रासंगिक प्रतिक्रियाओं को अनदेखा कर दिया जाएगा, लेकिन वे पूरे एक्सप्रेशन को अमान्य नहीं करेंगी)।
इसलिए, चालू योग की समस्या का समाधान यह है कि समीकरण sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK) का उपयोग किया जाए।
.NAOK प्रत्यय का उपयोग लेखकों को ऐसे सर्वेक्षण डिज़ाइन करने की सुविधा भी देता है जिनमें कई संभावित मार्ग हों लेकिन बाद में वे सामान्य मार्गों पर मिल जाएँ। उदाहरण के लिए, मान लीजिए प्रतिभागी किसी सर्वेक्षण का उत्तर प्रतिक्रियाओं की सामान्य सीमा से बाहर देते हैं। लेखक प्रतिभागियों को चेतावनी दे सकता है कि उन्हें मान्य परिणाम नहीं मिल सकते हैं, और पूछ सकता है कि क्या वे वाकई सर्वेक्षण जारी रखना चाहते हैं। यदि वे "हां" कहते हैं, तो शेष प्रश्न दिखाए जाएंगे। "शेष प्रश्नों" की शर्त यह जाँचेगी कि क्या शुरुआती प्रतिक्रियाएँ सामान्य सीमा के भीतर दी गई थीं, या प्रतिभागी ने उस प्रश्न का उत्तर "हां" दिया है जो केवल तभी प्रासंगिक है जब उन्होंने सीमा से बाहर उत्तर दिया हो।
ExpressionScript सशर्त माइक्रो-टेलरिंग को कैसे सपोर्ट करता है?
यहाँ माइक्रो-टेलरिंग का एक उदाहरण है (जहाँ प्रश्न का प्रकार=='expr' का अर्थ समीकरण है):
| प्रश्न कोड | प्रासंगिकता | प्रश्न का प्रकार | प्रश्न |
|---|---|---|---|
| name | 1 | text | आपका नाम क्या है? |
| age | 1 | text | आपकी उम्र कितनी है? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | क्षमा करें, {name}, इस परीक्षण के लिए आप बहुत {if( (age<16),'छोटे',if( (age>80),'बुज़ुर्ग','मध्यम आयु के') ) } हैं। |
| kids | !badage | yesno | क्या आपके बच्चे हैं? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | आपके कितने बच्चे हैं? |
| kid1 | parents && numKids >= 1 | text | आपके पहले बच्चे की उम्र कितनी है? |
| kid2 | parents && numKids >= 2 | text | आपके दूसरे बच्चे की उम्र कितनी है? |
| kid3 | parents && numKids >= 3 | text | आपके तीसरे बच्चे की उम्र कितनी है? |
| kid4 | parents && numKids >= 4 | text | आपके चौथे बच्चे की उम्र कितनी है? |
| kid5 | parents && numKids >= 5 | text | आपके पाँचवें बच्चे की उम्र कितनी है? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, आपने बताया कि आपकी उम्र {age} है और आपके {numKids} बच्चे हैं। आपके पहले {min(numKids,5)} बच्चों की उम्र का योग {sumage} है |
ऊपर दिया गया सर्वेक्षण उदाहरण डाउनलोड करने के लिए, निम्न लिंक पर क्लिक करें: बच्चों की संख्या वाला सर्वेक्षण उदाहरण।
ये सभी प्रश्न एक ही पेज पर (उदाहरण के लिए, एक ही समूह में) हो सकते हैं, और केवल प्रासंगिक प्रश्न ही दिखाए जाएंगे। इसके अलावा, जैसे-जैसे आप बच्चों की उम्र दर्ज करेंगे, अंतिम प्रश्न में sum() एक्सप्रेशन अपने आप अपडेट होता जाएगा।
ExpressionScript यह सुविधा प्रत्येक एक्सप्रेशन को एक नामित <span> एलिमेंट से घेरकर प्रदान करता है। हर बार जब कोई मान बदलता है, तो यह उस <span> एलिमेंट में दिखने वाले एक्सप्रेशन की दोबारा गणना करता है और डिस्प्ले को फिर से बनाता है। आप एक ही पेज पर दर्जनों या सैकड़ों ऐसे टेलर्ड एक्सप्रेशन रख सकते हैं।
सिंटेक्स हाइलाइटिंग
एक्सप्रेशन दर्ज करने और उन्हें सत्यापित करने में सहायता के लिए, EM निम्न सुविधाओं के साथ सिंटेक्स हाइलाइटिंग प्रदान करता है:
सिंटेक्स हाइलाइटिंग के प्रकार और अर्थ
| रंग | नमूना | अर्थ | टूलटिप | टिप्पणियाँ |
|---|---|---|---|---|
| हल्का भूरा (टैन) बैकग्राउंड | Sample | पूरा समीकरण | none | कर्ली ब्रेसेस के भीतर की कोई भी चीज़ जिसे समीकरण के रूप में पहचाना जाता है (जैसे, जिसके आगे या पीछे कोई व्हाइटस्पेस नहीं है) उसे आसपास के टेक्स्ट से अलग दिखाने के लिए हल्के भूरे बैकग्राउंड से रंगा जाएगा |
| बोल्ड लाल टेक्स्ट | Sample | त्रुटि | त्रुटि के बारे में कुछ स्पष्टीकरण | यह कोई अज्ञात वेरिएबल या फ़ंक्शन में त्रुटि हो सकती है। सर्वेक्षण टूटा हुआ है और संबंधित एक्सप्रेशन पर निर्भर प्रश्न प्रतिभागियों को नहीं दिखाए जाएंगे। |
| नीला टेक्स्ट | Sample | फ़ंक्शन का नाम | अर्थ और मान्य सिंटेक्स | यह फ़ंक्शन के नामों या उन चीज़ों को दर्शाता है जो फ़ंक्शन होनी चाहिए क्योंकि उनके बाद खुला कोष्ठक है। इन्हें बोल्ड नीले टेक्स्ट में दिखाया जाता है। टूलटिप फ़ंक्शन का अर्थ और मान्य सिंटेक्स दिखाते हैं। |
| स्लेटी टेक्स्ट | Sample | स्ट्रिंग | none | सिंगल और डबल कोट्स वाली स्ट्रिंग्स स्लेटी टेक्स्ट में दिखाई जाती हैं। |
| सियान टेक्स्ट | Sample | उसी पेज पर सेट किया गया वेरिएबल, | [name]: प्रश्न; मान; उत्तर सूची जो प्रत्येक मान के कोड दिखाती है | जो वेरिएबल उसी पेज पर सेट है जिस पर आप वर्तमान में प्रश्न संपादित कर रहे हैं, वह सियान टेक्स्ट में दिखाया जाता है (इसे javascript में अपडेट किया जा सकता है)। टूलटिप उसका नाम, वास्तविक प्रश्न और उसका मौजूदा मान (या यदि सेट नहीं है तो खाली) दिखाता है। यदि प्रश्न का प्रकार गणनात्मक मान समूह से प्रतिक्रियाओं की अपेक्षा करता है, तो कोड से प्रदर्शित मानों की मैपिंग दिखाई जाती है। |
| हरा टेक्स्ट | Sample | पिछले पेज पर सेट किया गया वेरिएबल | [name]: प्रश्न; मान; उत्तर सूची जो प्रत्येक मान के कोड दिखाती है | पिछले पेज पर सेट किया गया कोई भी वेरिएबल बोल्ड हरे टेक्स्ट में दिखाया जाता है। टूलटिप उसका नाम, वास्तविक प्रश्न और उसका मौजूदा मान (या यदि सेट नहीं है तो खाली) दिखाता है। यदि प्रश्न का प्रकार गणनात्मक मान समूह से प्रतिक्रियाओं की अपेक्षा करता है, तो कोड से प्रदर्शित मानों की मैपिंग दिखाई जाती है। |
| बोल्ड गुलाबी टेक्स्ट | Sample | बाद के पेज पर सेट किया गया वेरिएबल सामान्यतः: सर्वेक्षण की शुरुआत में खाली, लेकिन इंडेक्स या पिछला पर जाने से भरा जा सकता है | [name या SGQA कोड]: प्रश्न; मान; उत्तर सूची जो प्रत्येक मान के कोड दिखाती है | बाद के पेज पर सेट किया गया कोई भी वेरिएबल बोल्ड गुलाबी टेक्स्ट में दिखाया जाता है। टूलटिप उसका नाम, वास्तविक प्रश्न और उसका मौजूदा मान (या यदि सेट नहीं है तो खाली) दिखाता है। यदि प्रश्न का प्रकार गणनात्मक मान समूह से प्रतिक्रियाओं की अपेक्षा करता है, तो कोड से प्रदर्शित मानों की मैपिंग दिखाई जाती है। |
| बोल्ड भूरा टेक्स्ट | Sample | लाइम रिप्लेसमेंट वैल्यू | मान | लाइम रिप्लेसमेंट स्ट्रिंग्स (जैसे {TOKEN:xxx}, {PRIVACY_MESSAGE}) बोल्ड भूरे टेक्स्ट में दिखाई जाती हैं। |
| लाल टेक्स्ट | Sample | असाइनमेंट ऑपरेटर (=) | चेतावनी संदेश | यदि आप असाइनमेंट ऑपरेटर (=) का उपयोग करते हैं, तो वह ऑपरेटर लाल टेक्स्ट में दिखाया जाएगा। इसका उद्देश्य मानों के अनजाने में पुनः असाइन होने से बचाना है, जब आप वास्तव में यह जाँचना चाहते थे कि a == b है या नहीं, न कि a = b से मान सेट करना। |
| सामान्य काला टेक्स्ट | Sample | विराम चिह्न | none | एक्सप्रेशन के भीतर अन्य सभी विराम चिह्न सामान्य काले टेक्स्ट में दिखाए जाते हैं। |
| लाल बॉक्स वाला टेक्स्ट | त्रुटि के चारों ओर बोल्ड लाल रेखा होती है | सिंटेक्स त्रुटि | त्रुटि का विवरण | पाई गई कोई भी सिंटेक्स त्रुटि लाल बॉक्स में दिखाई जाती है। टूलटिप त्रुटि को दिखाता है। उदाहरणों में बेमेल कोष्ठक, अपरिभाषित फ़ंक्शन का उपयोग, फ़ंक्शन को गलत संख्या में आर्ग्युमेंट देना, खराब संरचना वाले एक्सप्रेशन (जैसे, वेरिएबल के बीच ऑपरेटर का न होना), केवल-पढ़ने योग्य वेरिएबल को नया मान असाइन करने का प्रयास, गैर-वेरिएबल को मान असाइन करने का प्रयास, या असमर्थित सिंटेक्स का उपयोग शामिल हैं। ध्यान दें कि सिंटेक्स त्रुटि पहचान प्रणाली एक एक्सप्रेशन में एकाधिक त्रुटियाँ होने पर भी केवल एक त्रुटि रिपोर्ट कर सकती है; हालाँकि, यदि कोई त्रुटि पाई जाती है, तो कम से कम एक त्रुटि अवश्य दिखाई जाएगी। |
अतिरिक्त अध्ययन
ExpressionScript नमूना सर्वेक्षण
उपयोग के मामले और कैसे करें
चरण-दर-चरण उदाहरण
डेवलपर्स के लिए संदर्भ