Actions

ExpressionScript examples/vi: Difference between revisions

From LimeSurvey Manual

(Created page with "<pre>{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }</pre>")
(Created page with "'''Chi tiết triển khai:''' * cho mảng đầu tiên : mảng một lựa chọn ** Mã câu hỏi là ARRAY ** Mã câu hỏi phụ là SQ01,SQ02,SQ03 và SQ04 ** cập...")
 
(34 intermediate revisions by the same user not shown)
Line 245: Line 245:
Sử dụng hàm <i>listifop</i> nếu bạn muốn xuất danh sách chỉ các mục đã chọn, ví dụ: Mercedes, Volvo
Sử dụng hàm <i>listifop</i> nếu bạn muốn xuất danh sách chỉ các mục đã chọn, ví dụ: Mercedes, Volvo


<pre>{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }</pre>
<pre>{ listifop( 'value', '==', 'Y', 'câu hỏi', ', ', that.q2.sgqa ) }</pre>




Where &nbsp;<small>that.q2</small>&nbsp; expands to all of q2's subquestions. See [[ExpressionScript - Presentation#The_reserved_.22this.22.2C_.22self.22.2C_and_.22that.22_variables|self, this and that]] for more detail.
Trong đó <small>that.q2</small> mở rộng sang tất cả các câu hỏi phụ của q2. Xem [[ExpressionScript - Trình bày#The_reserved_.22this.22.2C_.22self.22.2C_and_.22that.22_variables|self, cái này và cái kia]] để biết thêm chi tiết.


</br>
</br>


====Example 2 (assuming question type is Array (10 point choice))====
====Ví dụ 2 (giả sử loại câu hỏi là Mảng (chọn 10 điểm))====




- Please rate the quality of the car brands below on a scale from 1=very bad to 10=very good?
- Vui lòng đánh giá chất lượng các hãng xe dưới đây theo thang điểm từ 1=rất tệ đến 10=rất tốt?


-- Mercedes: 7
-- Mercedes: 7
Line 264: Line 264:




If you want to output rated items only you can put an IF statement around your output and check if the current sub question was answered by using:
Nếu bạn chỉ muốn xuất ra các mục được xếp hạng, bạn có thể đặt câu lệnh IF xung quanh đầu ra của mình và kiểm tra xem câu hỏi phụ hiện tại đã được trả lời hay chưa bằng cách sử dụng:


<pre>{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }</pre>
<pre>{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }</pre>




Use the <i>listifop</i> function if for example you want to only output a list of the selected items greater than eight, eg: Audi / Volvo
Sử dụng hàm <i>listifop</i> nếu chẳng hạn bạn chỉ muốn xuất danh sách các mục đã chọn lớn hơn 8, ví dụ: Audi / Volvo


<pre>{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }</pre>
<pre>{ listifop( 'value', '>', 8, 'câu hỏi', ' / ', that.q3.sgqa ) }</pre>


</br>
</br>


===Question with two scales===
===Câu hỏi có hai thang đo===




{{Note|This applies to the dual scale question type only.}}
{{Lưu ý|Điều này chỉ áp dụng cho loại câu hỏi thang đo kép.}}




Let's assume that the following codes are being used:
Giả sử rằng các mã sau đang được sử dụng:
*Question code: q4
*Mã câu hỏi: q4
*Subquestion codes: SQ001, SQ002, ...
*Mã câu hỏi phụ: SQ001, SQ002, ...
*Answer codes scale 1: A1, A2, ...
*Mã câu trả lời tỷ lệ 1: A1, A2, ...
*Answer codes scale 2: B1, B2, ...
*Đáp án thang điểm 2: B1, B2, ...




{{Note|To refer to the result of a certain subquestion on a certain scale, you need to use QuestionCode . '_' . SubQuestionCode . '_' . ScaleID. '''Note that "ScaleID" is 0 for the first scale and 1 for the other!'''</br> Example for referring to the answer of the third subquestion and second scale: q4_SQ003_1 - Question 4, subquestion 3, second scale.}}
{{Lưu ý|Để tham khảo kết quả của một câu hỏi phụ nhất định trên một thang đo nhất định, bạn cần sử dụng Mã câu hỏi . '_' . Mã câu hỏi phụ . '_' . ID quy mô. '''Lưu ý rằng "ScaleID" 0 cho thang đo đầu tiên và 1 cho thang đo còn lại!'''</br> Ví dụ tham khảo đáp án câu hỏi phụ thứ 3 và thang đo thứ 2: q4_SQ003_1 - Câu hỏi 4, câu hỏi phụ 3, thang đo thứ 2.}}




Let's output the results for both scales and the first two subquestions:
Hãy xuất kết quả cho cả hai thang đo và hai câu hỏi phụ đầu tiên:


- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
Line 297: Line 297:
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}


To output the subquestion text, you need to add the scale ID to the placeholder (though the texts are the same for both scales). So instead of {q4_SQ001.question} we have to use {q4_SQ001_0.question} or {q4_SQ001_1.question}.
Để xuất văn bản câu hỏi phụ, bạn cần thêm ID thang đo vào phần giữ chỗ (mặc dù văn bản giống nhau cho cả hai thang đo). Vì vậy, thay vì {q4_SQ001.question} chúng ta phải sử dụng {q4_SQ001_0.question} hoặc {q4_SQ001_1.question}.


If you want to export/display the results of subquestions with at least one answer only, use this syntax for each subquestion:
Nếu bạn muốn xuất/hiển thị kết quả của các câu hỏi phụ chỉ có ít nhất một câu trả lời, hãy sử dụng cú pháp này cho mỗi câu hỏi phụ:


<pre>{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}</pre>
<pre>{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}</pre>


===Question with X and Y scales===
===Câu hỏi có thang đo X Y===




This applies to all matrix questions which allow an answer for every cell (not just every row as shown previously):
Điều này áp dụng cho tất cả các câu hỏi ma trận cho phép trả lời cho mọi ô (không chỉ mỗi hàng như được hiển thị trước đó):
*Array Texts
*Array Texts
*Array Numbers
*Array Numbers




Assumed codes used:
Mã giả định được sử dụng:
*Question code: q5
*Mã câu hỏi: q5
*Subquestion codes: SQ001, SQ002, ...
*Mã câu hỏi phụ: SQ001, SQ002, ...
*Answer codes: A1, A2, ...
*Mã trả lời: A1, A2, ...


To refer to the result of a certain subquestion from a certain column, you need to use QuestionCode . '_' . SubQuestionCode . '_' . AnswerCode. Example for referring to the answer of the third subquestion and second column: q5_SQ003_A2.
Để tham khảo kết quả của một câu hỏi con nhất định từ một cột nhất định, bạn cần sử dụng Câu hỏi. '_' . Mã câu hỏi phụ . '_' . Mã trả lời. Ví dụ tham khảo câu trả lời của câu hỏi phụ thứ ba và cột thứ hai: q5_SQ003_A2.


Let's output the results for columns 1-3 of the first two subquestions:
Hãy xuất kết quả cho cột 1-3 của hai câu hỏi phụ đầu tiên:


- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}
- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}
Line 325: Line 325:




Since for these question types each cell (combination of X axes and Y axes) equals one answer option, a test for existing data needs to be done for each cell. Example:
Vì đối với những loại câu hỏi này, mỗi ô (kết hợp trục X và trục Y) tương đương với một tùy chọn trả lời, nên cần phải thực hiện kiểm tra dữ liệu hiện có cho từng ô. Ví dụ:


<pre>{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}</pre>
<pre>{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}</pre>




{{Note|To output the subquestion text you need to add the answer code to the placeholder (though the texts are the same for all answer options). So instead of {q5_SQ001.question} we have to use {q5_SQ001_A1.question} or {q5_SQ001_A2.question}.}}
{{Lưu ý|Để xuất văn bản câu hỏi phụ, bạn cần thêm mã câu trả lời vào phần giữ chỗ (mặc dù các văn bản đều giống nhau cho tất cả các tùy chọn trả lời). Vì vậy, thay vì {q5_SQ001.question} chúng ta phải sử dụng {q5_SQ001_A1.question} hoặc {q5_SQ001_A2.question}.}}


==Hide question if answer from previous question is empty==
==Ẩn câu hỏi nếu câu trả lời ở câu hỏi trước trống==




{|class="wikitable"
{|class="wikitable"
|Purpose||Hide question if answer from previous question is empty
|Purpose||Ẩn câu hỏi nếu câu trả lời ở câu hỏi trước trống
|-
|-
|Type||Question Relevance
|Type||Mức độ liên quan của câu hỏi
|-
|-
|Example||Question one: question code "name", question text "What's your name?" <br /> Question two: question text "{name}, how old are you?" <br /> To do: Hide question two if the textfield of question one is empty
|Ví dụ||Câu hỏi một: mã câu hỏi "tên", nội dung câu hỏi "Tên bạn là gì?"<br /> Câu hỏi thứ hai: nội dung câu hỏi "{name}, bạn bao nhiêu tuổi?"<br /> Việc cần làm: Ẩn câu hỏi thứ hai nếu trường văn bản của câu hỏi thứ nhất trống
|-
|-
|Expression||!is_empty(name)
|Expression||!is_empty(name)
|-
|-
|Description||is_empty() determines whether a variable is considered to be empty. The "!" negates the result. So if the variable is not empty the Expression will be true and the question is shown
|Description||is_empty() xác định xem một biến có được coi là trống rỗng. Các "!" phủ nhận kết quả. Vì vậy, nếu biến không trống thì Biểu thức sẽ đúng và câu hỏi được hiển thị
|-
|-
|Steps||Create/edit question two <br /> Insert "!is_empty(name)" into "Relevance equation:"
|Steps||Tạo/chỉnh sửa câu hỏi hai<br /> Chèn "!is_empty(name)" vào "Phương trình liên quan:"
|-
|-
|Sample File||[[Media:Hide_question_if_empty_question_group.zip|Hide_question_if_empty_question_group.zip]]
|Tệp mẫu||[[Media:Hide_question_if_empty_question_group.zip|Hide_question_if_empty_question_group.zip]]
|-
|-
|colspan="2" align="center"|[[File:Hide question if empty 1.png]][[File:Hide question if empty 2.png]]
|colspan ="2"align="center"|[[File:Hide question if empty 1.png]][[File:Hide question if empty 2.png]]
|}
|}




==Hide question group if answer from previous question is Yes or No==
==Ẩn nhóm câu hỏi nếu câu trả lời từ câu hỏi trước là Có hoặc Không==




{|class="wikitable"
{|class="wikitable"
|Purpose||Hide question group if answer from previous question is Yes or No
|Purpose||Ẩn nhóm câu hỏi nếu câu trả lời từ câu hỏi trước là Có hoặc Không
|-
|-
|Type||Question group Relevance
|Type||Độ liên quan của nhóm câu hỏi
|-
|-
|Example||Page one, Question Group one, Question one: question code "PET", question text "Do you have a pet?" -Yes -No <br /> Page two, Question Group two: Title "About your pet(s)" <br /> To do: Show/Hide question group two if answer from question one is Yes/No
| Ví dụ||Trang một, Nhóm câu hỏi một, Câu hỏi một: mã câu hỏi "PET", nội dung câu hỏi "Bạn có thú cưng không?" -Có không<br /> Trang hai, Nhóm câu hỏi thứ hai: Tiêu đề "Giới thiệu về (các) thú cưng của bạn"<br /> Việc cần làm: Hiển thị/Ẩn nhóm câu hỏi hai nếu câu trả lời từ câu hỏi một là Có/Không
|-
|-
|Expression||PET == "Y"
|Biểu thức||PET == "Y"
|-
|-
|Description||PET is the question code for the question you want to check the answer. If you don't use a suffix EM will use "Qcode.code". So you compare the answer code from the PET question to the value "Y". If the participant answers "Yes" the Expression is true and the question group "About your pet(s)" will be shown.
|Mô tả||PET là mã câu hỏi cho câu hỏi bạn muốn kiểm tra câu trả lời. Nếu bạn không sử dụng hậu tố EM sẽ sử dụng "Qcode.code". Vì vậy, bạn so sánh mã câu trả lời từ câu hỏi PET với giá trị "Y". Nếu người tham gia trả lời "", Biểu thức là đúng và nhóm câu hỏi "Giới thiệu về (các) thú cưng của bạn" sẽ được hiển thị.
|-
|-
|Steps||Create/edit question group two <br /> Insert "PET == "Y"" into "Relevance equation:"
|Các bước||Tạo/chỉnh sửa nhóm câu hỏi hai<br /> Chèn "PET == "Y"" vào "Phương trình liên quan:"
|-
|-
|Sample File||[[Media:Hide question group if answer from previous question is Yes or No.zip|Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip]]
|Tệp mẫu||[[Phương tiện:Ẩn nhóm câu hỏi nếu câu trả lời từ câu hỏi trước là Có hoặc Không.zip|Hide_question group_if_answer_from_previous_question_is_Yes_or_No. zip]]
|-
|-
|colspan="2" align="center"|[[File:Hide question group if answer from previous question is Yes or No 1.png]][[File:Hide question group if answer from previous question is Yes or No 2.png]]
|colspan="2"align="center"|[[File:Ẩn nhóm câu hỏi nếu câu trả lời từ câu hỏi trước là Có hoặc Không 1.png]][[File:Ẩn câu hỏi nhóm nếu câu trả lời từ câu hỏi trước là Có hoặc Không 2.png]]
|}
|}




==Display value of a multiple answer input question field==
==Giá trị hiển thị của trường câu hỏi nhập nhiều câu trả lời==




{|class="wikitable"
{|class="wikitable"
|Purpose||Display value of a multiple answer input question field
|Purpose||Giá trị hiển thị của trường câu hỏi nhập nhiều câu trả lời
|-
|-
|Type||Reference
|Type||Reference
|-
|-
|Example||Question one: question code "AskChildAge", question text "How old are your children?". Subquestions codes -Child1 -Child2 -Child3 - ChildXXX <br /> Question two: question code "ReportChildAge" question text "About your first child: - CHILD1 is AGE1."
|Ví dụ||Câu hỏi một : mã câu hỏi "AskChildAge", nội dung câu hỏi "Con bạn bao nhiêu tuổi?". Mã câu hỏi phụ -Child1 -Child2 -Child3 - ChildXXX<br /> Câu hỏi số hai: mã câu hỏi "ReportChildAge" nội dung câu hỏi "Giới thiệu về đứa con đầu lòng của bạn: - CHILD1 AGE1."
|-
|-
|Expression||{AskChildAge_Child1.question}, {AskChildAge_Child1.value}
|Expression||{AskChildAge_Child1.question}, {AskChildAge_Child1.value}
|-
|Mô tả||Bạn muốn sử dụng giá trị của câu hỏi phụ trong câu hỏi sau. Bạn có thể truy cập giá trị câu hỏi phụ bằng loại biểu thức sau: QcodeQuestion_QcodeSubquestion.value
|-
|-
|Description||You want to use the value of a subquestion in a following question. You can access the subquestion value with this kind of expression: QcodeQuestion_QcodeSubquestion.value
|Steps||Tạo/chỉnh sửa câu hỏi thứ hai<br /> Chèn văn bản này vào phần mô tả: "Giới thiệu về đứa con đầu lòng của bạn: - {AskChildAge_Child1.question} là {AskChildAge_Child1.value}."
|-
|-
|Steps||Create/edit the second question <br /> Insert this text in the description: "About your first child: - {AskChildAge_Child1.question} is {AskChildAge_Child1.value}."
|Tệp mẫu||[[Media:Display_value_of_a_multiple_answer_input_question_field.zip|Display_value_of_a_multiple_answer_input_question_field. zip]]
|-
|-
|Sample File||[[Media:Display_value_of_a_multiple_answer_input_question_field.zip|Display_value_of_a_multiple_answer_input_question_field.zip]]
|colspan="2"align="center"|[[File:Display value of a multiple answer input question field 1.png]]
|-
|colspan="2" align="center"|[[File:Display value of a multiple answer input question field 1.png]]
|}
|}


==Validate number of boxes ticked per row for an "Array (Numbers) Checkbox" question==
==Xác thực số lượng hộp được đánh dấu trên mỗi hàng cho câu hỏi "Hộp kiểm mảng (Số)"==




{|class="wikitable"
{|class="wikitable"
|Purpose||Validate number of boxes ticked per row
|Purpose||Xác thực số hộp được đánh dấu trên mỗi hàng
|-
|-
|Type||Validation
|Type||Xác thực
|-
|-
|Example||Question of type "Array Numbers (Checkbox Layout)"
|Ví dụ||Câu hỏi thuộc loại " Số mảng (Bố cục hộp kiểm)"
|-
|-
|Expression||sum(...)
|Biểu thức||sum(...)
|-
|-
|Description||(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) determines whether at least X checkboxes in row A are checked. <br />If you want to check all three rows (A, B, C), you can connect the expression using "&&": <br />(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) <br />&& (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X) <br />&& (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X)
|Description||(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) xác định xem có ít nhất X hộp kiểm ở hàng A được chọn hay không.<br /> Nếu bạn muốn kiểm tra cả ba hàng (A, B, C), bạn có thể kết nối biểu thức bằng "&&":<br /> (tổng(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X)<br /> && (tổng(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X)<br /> && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X)
|-
|-
|Steps||Create/edit question of type "Array Numbers (Checkbox Layout)".<br /> Insert the above expression into "Question validation equation" at the advanced question settings (you might have to adjust variable namings!).
|Các bước||Tạo/chỉnh sửa câu hỏi thuộc loại "Số mảng (Bố cục hộp kiểm)".<br /> Chèn biểu thức trên vào "Phương trình xác thực câu hỏi" ở cài đặt câu hỏi nâng cao (bạn có thể phải điều chỉnh cách đặt tên biến!).
|-
|-
|Sample File||[[Media:limesurvey_survey_53654.lss|Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss]]
|Tệp mẫu||[[Media:limesurvey_survey_53654.lss|Xác thực số lượng hộp đánh dấu mỗi hàng cho một Mảng (Số) Checkbox.lss]]
|-
|-
|colspan="2" align="center"|[[File:Validate number of boxes ticker per row for an Array (Numbers) Checkbox 05.png]][[File:Validate number of boxes ticker per row for an Array (Numbers) Checkbox 1.png]]
|colspan="2"align="center"|[[File:Validate number of boxes ticker per row for an Array (Numbers) Checkbox 05.png]][[File:Validate number of boxes ticker per row for an Array (Numbers) Checkbox 1.png]]
|}
|}


==Calculate difference between two dates==
==Tính chênh lệch giữa hai ngày==




{| class="wikitable"
{| class="wikitable"
|Purpose||Calculate difference between two dates
|Purpose||Tính toán sự khác biệt giữa hai ngày
|-
|-
|Type||Relevance / Equation question type / Validation
|Loại||Mức độ liên quan / Loại câu hỏi phương trình / Xác thực
|-
|-
|Example||Question one (date/time, code: DOB): What is your date of birth? <br /> Question two (date/time, code: datetoday): What is the date today? <br /> Question three (boilerplate): You are XXXX days old. <br /> To do: Calculate and display the number of days between the date given in question 1 and the question 2.
|Ví dụ||Câu hỏi một (ngày/giờ, : DOB): Ngày sinh của bạn là ngày nào?<br /> Câu hỏi thứ hai (ngày/giờ, : datetoday): Hôm nay là thứ mấy?<br /> Câu hỏi thứ ba (bản soạn sẵn): Bạn được XXXX ngày tuổi.<br /> Việc cần làm: Tính toán và hiển thị số ngày giữa ngày cho ở câu hỏi 1 và câu hỏi 2.
|-
|-
|Expression||{(strtotime(datetoday)-strtotime(DOB))/60/60/24}<br>
|Expression||{(strtotime(datetoday)-strtotime(DOB))/60/60 /24}<br>  
|-
|-
|Description|| strtotime calculates the number of seconds between the 1st of January 1970 and the given date. The above expression calculates the number of seconds between the two given dates. The term "/60/60/24" just calculates the number of days from the number of seconds. <br /> Instead of asking for the "datetoday", you can also use strtotime('now') or simply time(), which directly returns the number of seconds from January 1970 until now (i.e. the time the survey was taken). Thus you could quickly figure out the age of a person in years with  the equation {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} In any of these cases, it is critical that the date is entered in a proper format, otherwise the strtotime() function will not work right.
|Mô tả|| strtotime tính số giây giữa ngày 1 tháng 1 năm 1970 và ngày đã cho. Biểu thức trên tính số giây giữa hai ngày đã cho. Thuật ngữ "/60/60/24" chỉ tính số ngày từ số giây.<br /> Thay vì hỏi "datetoday", bạn cũng có thể sử dụng strtotime('now') hoặc đơn giản là time(), trả về trực tiếp số giây từ tháng 1 năm 1970 cho đến nay (tức là thời điểm khảo sát được thực hiện). Do đó, bạn có thể nhanh chóng tính ra tuổi của một người theo năm bằng phương trình {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} Trong bất kỳ trường hợp nào, điều quan trọng là phải nhập ngày ở định dạng phù hợp, nếu không hàm strtotime() sẽ không hoạt động bình thường.  
|-
|-
|Steps||Create two date questions (for the date of birth and for today's date) and a boilerplate question. <br /> In the question text of the boilerplate question insert: "On {datetoday} you were {(strtotime(today)-strtotime(dob))/60/60/24} days days old." <br /><br /> Please note: The function strtotime can work with MANY but not all date formats. If you run into problems set your survey's date format to mm/dd/yyyy or yyyy-mm-dd or dd.mm.yyyy"
|Steps||Tạo hai câu hỏi về ngày tháng (cho ngày sinh và ngày hôm nay) và một câu hỏi soạn sẵn.<br /> Trong nội dung câu hỏi của phần chèn câu hỏi soạn sẵn: "Vào {datetoday}, bạn đã được {(strtotime(today)-strtotime(dob))/60/60/24} ngày tuổi."<br /><br /> Xin lưu ý: Hàm strtotime có thể hoạt động với NHIỀU định dạng nhưng không phải tất cả các định dạng ngày. Nếu bạn gặp vấn đề, hãy đặt định dạng ngày của khảo sát thành mm/dd/yyyy hoặc yyyy-mm-dd hoặc dd.mm.yyyy"
|-
|-
|Sample File||[[Media:TestSurvey_Working_with_Dates.zip|Date_difference.zip]]
|Sample File||[[Media:TestSurvey_Working_with_Dates.zip| Date_difference.zip]]
|-
|-
|colspan="2" align="center"|[[File:Date_difference_example.png]]
|colspan="2"align="center"|[[File:Date_difference_example.png]]
|}
|}


==Using ExpressionScript for Assessments==
==Sử dụng ExpressionScript để đánh giá==




Here comes another example on how to use the ExpressionScript with [[Question type - Array|Array type questions]] and assessments:</ br>
Sau đây là một ví dụ khác về cách sử dụng ExpressionScript với [[Question type - Array|Array type questions]] và đánh giá:</ br>


Let's say you have 2 array questions and you want to save the results of the calculation data to your database. It is actually simple, you will need to create and test your arrays and submit a dummy response to see if it works and gives you the results in the completed page.
Giả sử bạn có 2 câu hỏi mảng và bạn muốn lưu kết quả dữ liệu tính toán vào cơ sở dữ liệu của mình. Nó thực sự đơn giản, bạn sẽ cần tạo và kiểm tra các mảng của mình rồi gửi phản hồi giả để xem liệu nó có hoạt động hay không và cung cấp cho bạn kết quả trên trang hoàn chỉnh.




'''Implementation details:'''
'''Chi tiết triển khai:'''
*add a question of type equation
*thêm một câu hỏi thuộc loại phương trình
*add the following line assuming that Q1 is your array question code while Q2 is the second one:
*thêm dòng sau giả sử rằng Q1 là mã câu hỏi mảng của bạn trong khi Q2 là câu hỏi thứ hai:
** <pre>{sum(Q1_SQ001.value,Q2_SQ001.value)}</pre>
**<pre> {tổng(Q1_SQ001.value,Q2_SQ001.value)}</pre>


Note that SQ001 is the default code for any subquestion. If you change the subquestion code, adjust the equation above accordingly.
Lưu ý rằng SQ001 là mã mặc định cho mọi câu hỏi phụ. Nếu bạn thay đổi mã câu hỏi phụ, hãy điều chỉnh phương trình trên cho phù hợp.




==Using em_validation_q in array==
==Sử dụng em_validation_q trong mảng==




You can use the [[QS:Em_validation_q|question validation equation]] to control an array with any condition.
Bạn có thể sử dụng [[QS:Em_validation_q|phương trình xác thực câu hỏi]] để kiểm soát một mảng với bất kỳ điều kiện nào.




'''Implementation details:'''
'''Chi tiết triển khai:'''
* for the first array : array of single choice
* cho mảng đầu tiên : mảng một lựa chọn
** Question code is ARRAY
** Mã câu hỏi là ARRAY
** Sub question code are SQ01,SQ02,SQ03 and SQ04
** Mã câu hỏi phụ là SQ01,SQ02,SQ03 SQ04
** update the Whole question validation equation and put <pre>!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03) </pre>
** cập nhật phương trình xác thực toàn bộ câu hỏi và đặt<pre> !is_empty(ARRAY_SQ01) !is_empty(ARRAY_SQ03)</pre>  
* for the second array : array of text
* cho mảng thứ hai : mảng văn bản
** Question code is ARRAYTEXT
** Mã câu hỏi là ARRAYTEXT
** Sub question at Y axis code are SY01,SY02,SY03, and SY04
** Câu hỏi phụ tại mã trục Y SY01,SY02,SY03 SY04
** Update the Whole question validation equation and put <pre>count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)</pre>
** Cập nhật toàn bộ câu hỏi phương trình xác nhận và đặt<pre> đếm(self.sq_SY01 >= 1) và đếm(self.sq_SY03 >= 3)</pre>

Latest revision as of 18:51, 15 January 2024

Template:Lưu ý


Cấu trúc

Phần đầu tiên của bài viết sẽ mô tả Biểu thức có thể được sử dụng để làm gì và nơi tìm/thêm Biểu thức. Phần thứ hai cung cấp các ví dụ về cách sử dụng Biểu thức.


Các loại biểu thức

LimeSurvey sử dụng Biểu thức cho các mục đích sau:


Mức độ liên quan

Mục đích: Ẩn nhóm câu hỏi/câu hỏi

Mức độ liên quan kiểm soát việc một nhóm câu hỏi hoặc câu hỏi được hiển thị hay ẩn. Nếu kết quả của Biểu thức là "true" (tức là 1) thì phần tử sẽ được hiển thị. Ngược lại (nếu kết quả của Biểu thức là "false" (tức là 0)), phần tử sẽ bị ẩn.

Type Hiển thị/ẩn Tìm ở đâu Ảnh chụp màn hình
Mức độ liên quan của nhóm câu hỏi nhóm câu hỏi Tạo/Chỉnh sửa nhóm câu hỏi -> "Phương trình liên quan:" 30px
Câu hỏi Mức độ liên quan câu hỏi Tạo/Chỉnh sửa câu hỏi -> "Phương trình liên quan:" 30px
Độ liên quan của câu hỏi con câu hỏi phụ Chỉnh sửa câu hỏi phụ -> "Phương trình liên quan:" 30px


Xác thực

Mục đích: Xác thực dữ liệu đầu vào/hành động đối với câu hỏi/câu hỏi phụ/câu trả lời

Xác thực kiểm soát xem thông tin đầu vào của người trả lời vào câu hỏi hoặc hành động có hợp lệ hay không. Nếu kết quả của biểu thức là "true" (tức là 1), lớp "tốt" sẽ được áp dụng cho phần tử và thông báo xác thực. Mặt khác, nếu kết quả của biểu thức là "false" (tức là 0)), lớp "lỗi" sẽ được áp dụng cho phần tử và thông báo xác thực. Bạn có thể khai báo kiểu cho các lớp này trong template.css.

Type Xác thực Tìm ở đâu Ảnh chụp màn hình
Xác thực câu hỏi câu hỏi Tạo/Chỉnh sửa câu hỏi -> "tab logic" - > "Phương trình xác thực câu hỏi" 30px
Xác thực câu hỏi con câu hỏi con Tạo/Chỉnh sửa câu hỏi -> "tab Logic" -> " Phương trình xác thực câu hỏi con"

Xuất văn bản

Mục đích: (Làm gì đó) và viết ra một số văn bản

Một biểu thức có thể được sử dụng để viết ra một số văn bản. Ví dụ: bạn có thể kiểm tra hoặc tính toán một cái gì đó và chỉ định kết quả đầu ra tùy thuộc vào kết quả kiểm tra hoặc tính toán. Nó cũng có thể được sử dụng để chèn nội dung câu hỏi, câu trả lời, loại câu hỏi, ... của câu hỏi được sử dụng trước khi sử dụng Biểu thức. Đầu ra văn bản có thể được sử dụng ở mọi nơi có văn bản được hiển thị và có thể trả về mọi loại kết quả.

Trường hợp sử dụng Description
Micro may đo Điều chỉnh văn bản, ví dụ: viết "Mr" hoặc "Mrs" tùy theo câu hỏi về giới tính được hỏi trước đó
Tính toán Tính một giá trị và viết nó ra, ví dụ: "Thu nhập của gia đình bạn là xxx"
Reference Chèn văn bản từ một phần tử, ví dụ: "Tên bạn là xxx. Bạn bao nhiêu tuổi?"


Lưu trữ câu trả lời

Mục đích: (Làm gì đó,) (viết một số văn bản) và lưu trữ một cái gì đó trong cơ sở dữ liệu

Loại câu hỏi phương trình có thể được sử dụng để lưu trữ nội dung nào đó trong cơ sở dữ liệu. Bạn có thể làm điều gì đó với Biểu thức, hiển thị câu hỏi Phương trình (tương tự như hiển thị văn bản) và lưu trữ kết quả của Biểu thức trong cơ sở dữ liệu. Nó lưu trữ câu trả lời vào bảng phản hồi. Sau đó, kết quả có thể được sử dụng trong tính năng thống kê hoặc cũng có thể được nhập vào một trong các định dạng do chức năng xuất LimeSurvey cung cấp.

Ví dụ về biểu thức

Chèn câu trả lời từ câu hỏi trước

Purpose Chèn câu trả lời từ câu hỏi trước
Type Reference
Ví dụ Câu hỏi một (mã câu hỏi " Q00"): Bạn sống ở thành phố nào?
Câu hỏi thứ hai (mã câu hỏi "Q01") Bạn đã sống ở THÀNH PHỐ bao lâu rồi?
Việc cần làm: Nên sử dụng câu trả lời của câu hỏi một thay vì "THÀNH PHỐ" trong câu hỏi thứ hai.
Expression {QOO}
Description Câu trả lời được cung cấp trong Q00 thay thế trường Q00 từ câu hỏi thứ hai
Các bước Tạo/Chỉnh sửa câu hỏi thứ hai
Chèn "Bạn đã sống ở {QOO} (năm) được bao lâu?" vào trường văn bản câu hỏi
File:Biểu thức đơn giản tên thành phố.png

Sử dụng câu hỏi phương trình ẩn để tự động điền câu trả lời

Vấn đề: Hãy tưởng tượng bạn có hai câu hỏi Q1 và Q2. Q1 hỏi người trả lời về độ tuổi của họ. Q2 chia người trả lời thành 3 nhóm: tuổi dưới 20, tuổi 20, tuổi lớn hơn 20. Vì vậy, Q2 nên sử dụng các giá trị “1”, “2”, “3” tương ứng với các điều kiện trên. Ngoài ra, chúng ta không nên quên ẩn Q2 (câu hỏi sẽ không được hiển thị trong khảo sát nhưng các giá trị sẽ thông qua "quy trình nền" trong bảng phản hồi).

Để điền vào cơ sở dữ liệu bằng loại câu hỏi Phương trình:

  • Đầu tiên, tạo một câu hỏi có mã Q1 làm câu hỏi nhập số.
  • Sau đó tạo một câu hỏi khác có mã Q2 làm câu hỏi phương trình .
  • Trong chương tab "Cài đặt hiển thị" của Q2:
    • đặt trường "Luôn ẩn câu hỏi này" là "Bật"
    • nhập vào trường "Phương trình" biểu thức:
 {if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}

Tạo trang tóm tắt bằng cách sử dụng trình giữ chỗ

Hướng dẫn này trình bày cách bạn có thể tạo một cái nhìn tổng quan ở cuối cuộc khảo sát, liệt kê tất cả các câu hỏi và câu trả lời thông qua phần giữ chỗ ExpressionScript. Nó cũng chỉ ra cách thực hiện giới hạn cái nhìn tổng quan như vậy chỉ ở những câu hỏi đã được trả lời.

Bạn có thể tải xuống ví dụ của chúng tôi từ đây: Ví dụ khảo sát về người giữ chỗ khảo sát.


Các loại câu hỏi đang được sử dụng ở đây:

1. Câu hỏi một lựa chọn / văn bản đơn/câu hỏi số

  • Danh sách (thả xuống)
  • Danh sách (radio) [L]
  • Có/Không [Y]
  • Văn bản dài tự do [T ]
  • Văn bản tự do ngắn [S]
  • Nhập số [N]
  • Phương trình [*]


2. Câu hỏi với câu hỏi phụ

  • Nhiều văn bản ngắn [Q]
  • Trắc nghiệm [M]
  • Array [F]
  • Array (Có/Không/Không chắc chắn) [C]!N !*Array (lựa chọn 10 điểm) [B]


3. Câu hỏi có 2 thang đo

  • Array thang đo kép [1]


4. Câu hỏi với thang đo X và Y

  • Array (Số) [:]


5. Mặt nạ câu hỏi

  • Hiển thị văn bản [X]


Trong ví dụ đơn giản này, tổng quan của chúng tôi sẽ là một danh sách đơn giản với:

- Nội dung câu hỏi: Câu trả lời của người dùng


Câu hỏi một lựa chọn/văn bản đơn/câu hỏi số

Đối với tất cả các loại câu hỏi này, Limesurvey sẽ lưu trữ một câu trả lời duy nhất:

  • Danh sách (thả xuống)
  • Danh sách (radio)
  • Danh sách có nhận xét
  • 5 điểm lựa chọn
  • Có/Không
  • Văn bản ngắn tự do
  • Văn bản dài tự do!N !*Văn bản miễn phí rất lớn
  • Nhập số
  • Phương trình
  • Ngày
  • Giới tính

Giả sử mã câu hỏi của câu hỏi là q1, chúng ta có thể tham khảo nội dung câu hỏi và câu trả lời bằng cách sử dụng:

- {q1.question}: {q1.shown}

Ví dụ:

- Bạn bao nhiêu tuổi?: 25


Nếu bạn muốn kiểm tra xem câu hỏi đó đã được trả lời chưa, bạn có thể đặt câu lệnh IF xung quanh đầu ra của mình:

{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}

Điều này "dịch" thành: NẾU câu hỏi có mã q1 không trống, xuất ra "- " VÀ văn bản câu hỏi VÀ ": " VÀ văn bản câu trả lời (hàm join() nối các phần tử dưới dạng một chuỗi mới; ELSE: không xuất ra gì (" " có nghĩa là chuỗi trống).

Câu hỏi có câu hỏi phụ

Đối với tất cả các loại câu hỏi này, LimeSurvey sử dụng các câu hỏi phụ:

  • Nhiều văn bản ngắn
  • Nhiều lựa chọn
  • Nhiều lựa chọn có nhận xét
  • Array
  • Array (lựa chọn 5 điểm)
  • Array (lựa chọn 10 điểm)
  • Array (Có /Không/Không chắc chắn)
  • Mảng (Tăng/Tương tự/Giảm)
  • Mảng theo cột

Giả sử mã câu hỏi của câu hỏi là q2 và các câu hỏi phụ được đánh số SQ001, SQ002, (đánh số tự động do LimeSurvey thực hiện), chúng ta có thể tham khảo nội dung câu hỏi và câu trả lời bằng cách sử dụng:

- {q2_SQ001.question}: {q2_SQ001.shown}

- {q2_SQ002.question}: {q2_SQ002.shown}

Đối với các câu hỏi trắc nghiệm, bây giờ nên hiển thị văn bản của câu hỏi phụ được đánh dấu nhưng hiển thị chữ Y cho mỗi tùy chọn đã chọn:

- {q2_SQ001.question}: {q2_SQ001}

- {q2_SQ002.question}: {q2_SQ002}

...

Lưu ý rằng hiện tại không thể xuất nội dung câu hỏi của các câu hỏi bằng câu hỏi phụ, hãy xem yêu cầu tính năng này.


Ví dụ 1 (giả sử loại câu hỏi là trắc nghiệm)

- Bạn có biết những hãng xe này không?

-- Mercedes: Đúng

-- Audi: N

-- Volvo: Y


Nếu bạn chỉ muốn xuất các mục đã chọn, bạn có thể đặt câu lệnh IF xung quanh đầu ra của mình và kiểm tra giá trị hộp kiểm:

{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }


Sử dụng hàm listifop nếu bạn muốn xuất danh sách chỉ các mục đã chọn, ví dụ: Mercedes, Volvo

{ listifop( 'value', '==', 'Y', 'câu hỏi', ', ', that.q2.sgqa ) }


Trong đó that.q2 mở rộng sang tất cả các câu hỏi phụ của q2. Xem self, cái này và cái kia để biết thêm chi tiết.


Ví dụ 2 (giả sử loại câu hỏi là Mảng (chọn 10 điểm))

- Vui lòng đánh giá chất lượng các hãng xe dưới đây theo thang điểm từ 1=rất tệ đến 10=rất tốt?

-- Mercedes: 7

-- Audi: 9

-- Volvo: 9


Nếu bạn chỉ muốn xuất ra các mục được xếp hạng, bạn có thể đặt câu lệnh IF xung quanh đầu ra của mình và kiểm tra xem câu hỏi phụ hiện tại đã được trả lời hay chưa bằng cách sử dụng:

{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }


Sử dụng hàm listifop nếu chẳng hạn bạn chỉ muốn xuất danh sách các mục đã chọn lớn hơn 8, ví dụ: Audi / Volvo

{ listifop( 'value', '>', 8, 'câu hỏi', ' / ', that.q3.sgqa ) }


Câu hỏi có hai thang đo

Template:Lưu ý


Giả sử rằng các mã sau đang được sử dụng:

  • Mã câu hỏi: q4
  • Mã câu hỏi phụ: SQ001, SQ002, ...
  • Mã câu trả lời tỷ lệ 1: A1, A2, ...
  • Đáp án thang điểm 2: B1, B2, ...


Template:Lưu ý


Hãy xuất kết quả cho cả hai thang đo và hai câu hỏi phụ đầu tiên:

- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}

- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}

Để xuất văn bản câu hỏi phụ, bạn cần thêm ID thang đo vào phần giữ chỗ (mặc dù văn bản giống nhau cho cả hai thang đo). Vì vậy, thay vì {q4_SQ001.question} chúng ta phải sử dụng {q4_SQ001_0.question} hoặc {q4_SQ001_1.question}.

Nếu bạn muốn xuất/hiển thị kết quả của các câu hỏi phụ chỉ có ít nhất một câu trả lời, hãy sử dụng cú pháp này cho mỗi câu hỏi phụ:

{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}

Câu hỏi có thang đo X và Y

Điều này áp dụng cho tất cả các câu hỏi ma trận cho phép trả lời cho mọi ô (không chỉ mỗi hàng như được hiển thị trước đó):

  • Array Texts
  • Array Numbers


Mã giả định được sử dụng:

  • Mã câu hỏi: q5
  • Mã câu hỏi phụ: SQ001, SQ002, ...
  • Mã trả lời: A1, A2, ...

Để tham khảo kết quả của một câu hỏi con nhất định từ một cột nhất định, bạn cần sử dụng Câu hỏi. '_' . Mã câu hỏi phụ . '_' . Mã trả lời. Ví dụ tham khảo câu trả lời của câu hỏi phụ thứ ba và cột thứ hai: q5_SQ003_A2.

Hãy xuất kết quả cho cột 1-3 của hai câu hỏi phụ đầu tiên:

- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}

- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}


Vì đối với những loại câu hỏi này, mỗi ô (kết hợp trục X và trục Y) tương đương với một tùy chọn trả lời, nên cần phải thực hiện kiểm tra dữ liệu hiện có cho từng ô. Ví dụ:

{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}


Template:Lưu ý

Ẩn câu hỏi nếu câu trả lời ở câu hỏi trước trống

Purpose Ẩn câu hỏi nếu câu trả lời ở câu hỏi trước trống
Type Mức độ liên quan của câu hỏi
Ví dụ Câu hỏi một: mã câu hỏi "tên", nội dung câu hỏi "Tên bạn là gì?"
Câu hỏi thứ hai: nội dung câu hỏi "{name}, bạn bao nhiêu tuổi?"
Việc cần làm: Ẩn câu hỏi thứ hai nếu trường văn bản của câu hỏi thứ nhất trống
Expression !is_empty(name)
Description is_empty() xác định xem một biến có được coi là trống rỗng. Các "!" phủ nhận kết quả. Vì vậy, nếu biến không trống thì Biểu thức sẽ đúng và câu hỏi được hiển thị
Steps Tạo/chỉnh sửa câu hỏi hai
Chèn "!is_empty(name)" vào "Phương trình liên quan:"
Tệp mẫu Hide_question_if_empty_question_group.zip


Ẩn nhóm câu hỏi nếu câu trả lời từ câu hỏi trước là Có hoặc Không

Purpose Ẩn nhóm câu hỏi nếu câu trả lời từ câu hỏi trước là Có hoặc Không
Type Độ liên quan của nhóm câu hỏi
Ví dụ Trang một, Nhóm câu hỏi một, Câu hỏi một: mã câu hỏi "PET", nội dung câu hỏi "Bạn có thú cưng không?" -Có không
Trang hai, Nhóm câu hỏi thứ hai: Tiêu đề "Giới thiệu về (các) thú cưng của bạn"
Việc cần làm: Hiển thị/Ẩn nhóm câu hỏi hai nếu câu trả lời từ câu hỏi một là Có/Không
Biểu thức PET == "Y"
Mô tả PET là mã câu hỏi cho câu hỏi bạn muốn kiểm tra câu trả lời. Nếu bạn không sử dụng hậu tố EM sẽ sử dụng "Qcode.code". Vì vậy, bạn so sánh mã câu trả lời từ câu hỏi PET với giá trị "Y". Nếu người tham gia trả lời "Có", Biểu thức là đúng và nhóm câu hỏi "Giới thiệu về (các) thú cưng của bạn" sẽ được hiển thị.
Các bước Tạo/chỉnh sửa nhóm câu hỏi hai
Chèn "PET == "Y"" vào "Phương trình liên quan:"
Tệp mẫu Hide_question group_if_answer_from_previous_question_is_Yes_or_No. zip
File:Ẩn nhóm câu hỏi nếu câu trả lời từ câu hỏi trước là Có hoặc Không 1.pngFile:Ẩn câu hỏi nhóm nếu câu trả lời từ câu hỏi trước là Có hoặc Không 2.png


Giá trị hiển thị của trường câu hỏi nhập nhiều câu trả lời

Purpose Giá trị hiển thị của trường câu hỏi nhập nhiều câu trả lời
Type Reference
Ví dụ Câu hỏi một : mã câu hỏi "AskChildAge", nội dung câu hỏi "Con bạn bao nhiêu tuổi?". Mã câu hỏi phụ -Child1 -Child2 -Child3 - ChildXXX
Câu hỏi số hai: mã câu hỏi "ReportChildAge" nội dung câu hỏi "Giới thiệu về đứa con đầu lòng của bạn: - CHILD1 là AGE1."
Expression {AskChildAge_Child1.question}, {AskChildAge_Child1.value}
Mô tả Bạn muốn sử dụng giá trị của câu hỏi phụ trong câu hỏi sau. Bạn có thể truy cập giá trị câu hỏi phụ bằng loại biểu thức sau: QcodeQuestion_QcodeSubquestion.value
Steps Tạo/chỉnh sửa câu hỏi thứ hai
Chèn văn bản này vào phần mô tả: "Giới thiệu về đứa con đầu lòng của bạn: - {AskChildAge_Child1.question} là {AskChildAge_Child1.value}."
Tệp mẫu Display_value_of_a_multiple_answer_input_question_field. zip

Xác thực số lượng hộp được đánh dấu trên mỗi hàng cho câu hỏi "Hộp kiểm mảng (Số)"

Purpose Xác thực số hộp được đánh dấu trên mỗi hàng
Type Xác thực
Ví dụ Câu hỏi thuộc loại " Số mảng (Bố cục hộp kiểm)"
Biểu thức sum(...)
Description (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) xác định xem có ít nhất X hộp kiểm ở hàng A được chọn hay không.
Nếu bạn muốn kiểm tra cả ba hàng (A, B, C), bạn có thể kết nối biểu thức bằng "&&":
(tổng(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X)
&& (tổng(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X)
&& (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X)
Các bước Tạo/chỉnh sửa câu hỏi thuộc loại "Số mảng (Bố cục hộp kiểm)".
Chèn biểu thức trên vào "Phương trình xác thực câu hỏi" ở cài đặt câu hỏi nâng cao (bạn có thể phải điều chỉnh cách đặt tên biến!).
Tệp mẫu Xác thực số lượng hộp đánh dấu mỗi hàng cho một Mảng (Số) Checkbox.lss

Tính chênh lệch giữa hai ngày

Purpose Tính toán sự khác biệt giữa hai ngày
Loại Mức độ liên quan / Loại câu hỏi phương trình / Xác thực
Ví dụ Câu hỏi một (ngày/giờ, mã: DOB): Ngày sinh của bạn là ngày nào?
Câu hỏi thứ hai (ngày/giờ, mã: datetoday): Hôm nay là thứ mấy?
Câu hỏi thứ ba (bản soạn sẵn): Bạn được XXXX ngày tuổi.
Việc cần làm: Tính toán và hiển thị số ngày giữa ngày cho ở câu hỏi 1 và câu hỏi 2.
Expression {(strtotime(datetoday)-strtotime(DOB))/60/60 /24}
Mô tả strtotime tính số giây giữa ngày 1 tháng 1 năm 1970 và ngày đã cho. Biểu thức trên tính số giây giữa hai ngày đã cho. Thuật ngữ "/60/60/24" chỉ tính số ngày từ số giây.
Thay vì hỏi "datetoday", bạn cũng có thể sử dụng strtotime('now') hoặc đơn giản là time(), trả về trực tiếp số giây từ tháng 1 năm 1970 cho đến nay (tức là thời điểm khảo sát được thực hiện). Do đó, bạn có thể nhanh chóng tính ra tuổi của một người theo năm bằng phương trình {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} Trong bất kỳ trường hợp nào, điều quan trọng là phải nhập ngày ở định dạng phù hợp, nếu không hàm strtotime() sẽ không hoạt động bình thường.
Steps Tạo hai câu hỏi về ngày tháng (cho ngày sinh và ngày hôm nay) và một câu hỏi soạn sẵn.
Trong nội dung câu hỏi của phần chèn câu hỏi soạn sẵn: "Vào {datetoday}, bạn đã được {(strtotime(today)-strtotime(dob))/60/60/24} ngày tuổi."

Xin lưu ý: Hàm strtotime có thể hoạt động với NHIỀU định dạng nhưng không phải tất cả các định dạng ngày. Nếu bạn gặp vấn đề, hãy đặt định dạng ngày của khảo sát thành mm/dd/yyyy hoặc yyyy-mm-dd hoặc dd.mm.yyyy"
Sample File Date_difference.zip

Sử dụng ExpressionScript để đánh giá

Sau đây là một ví dụ khác về cách sử dụng ExpressionScript với Array type questions và đánh giá:</ br>

Giả sử bạn có 2 câu hỏi mảng và bạn muốn lưu kết quả dữ liệu tính toán vào cơ sở dữ liệu của mình. Nó thực sự đơn giản, bạn sẽ cần tạo và kiểm tra các mảng của mình rồi gửi phản hồi giả để xem liệu nó có hoạt động hay không và cung cấp cho bạn kết quả trên trang hoàn chỉnh.


Chi tiết triển khai:

  • thêm một câu hỏi thuộc loại phương trình
  • thêm dòng sau giả sử rằng Q1 là mã câu hỏi mảng của bạn trong khi Q2 là câu hỏi thứ hai:
    •  {tổng(Q1_SQ001.value,Q2_SQ001.value)}

Lưu ý rằng SQ001 là mã mặc định cho mọi câu hỏi phụ. Nếu bạn thay đổi mã câu hỏi phụ, hãy điều chỉnh phương trình trên cho phù hợp.


Sử dụng em_validation_q trong mảng

Bạn có thể sử dụng phương trình xác thực câu hỏi để kiểm soát một mảng với bất kỳ điều kiện nào.


Chi tiết triển khai:

  • cho mảng đầu tiên : mảng một lựa chọn
    • Mã câu hỏi là ARRAY
    • Mã câu hỏi phụ là SQ01,SQ02,SQ03 và SQ04

** cập nhật phương trình xác thực toàn bộ câu hỏi và đặt

 !is_empty(ARRAY_SQ01) và !is_empty(ARRAY_SQ03)
  • cho mảng thứ hai : mảng văn bản
    • Mã câu hỏi là ARRAYTEXT
    • Câu hỏi phụ tại mã trục Y là SY01,SY02,SY03 và SY04
    • Cập nhật toàn bộ câu hỏi phương trình xác nhận và đặt
       đếm(self.sq_SY01 >= 1) và đếm(self.sq_SY03 >= 3)