iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
自我挑戰組

用 ODK 和 Access VBA 打造行動化資料收集流程系列 第 18

Day18:表單邏輯(Form Logic) Part 3

  • 分享至 

  • xImage
  •  

驗證和限制回答(Validating and restricting responses)

若要驗證或限制回應值,請使用constraint(約束)欄位。當使用者點按鈕要切下一個畫面時,將檢查約束表達式,如果表達式的計算結果為 True,則表單將正常前進,如果為 False,則表單不會前進,並顯示constraint_message欄位的內容。

  • 輸入的回覆數值,在表達式中以單點 (.) 表示。
  • 約束表達式通常使用比較運算子和正規表示式。

例如:
「. >= 18」:如果回答大於或等於 18,則為 True。
「. > 20 and . < 200」:如果回答介於 20 到 200 之間,則為 True。
「regex(.,'\p{L}+')」:如果回應僅包含字母,不包含空格、分隔符號或數字,則為 true。
「not(contains(., 'prohibited'))」:如果禁止的子字串未出現在回應中,則為 true。
「not(selected(., 'none') and count-selected(.) > 1)」:如果回應不包含任何選擇或任何其他選擇,則為 False。

注意
如果回應空白,則不會檢查約束。若要限制空白回答,請將問題設為必填(required)。

技巧
對於「柔性」約束或警告,請使用在違反「柔性」約束時相關的註釋問題。例如,您可以顯示一條註解(note),表示允許參與者的年齡為 110 歲,但可能性不大。
註解也可用於「強硬」約束,這些約束應永久顯示,直到使用上述技術和 true() 所需的設定解決它們為止。例如,如果百分比總計不是 100,您可以顯示註釋,並要求普查員修正輸入值。

使用正規表達式(Using regular expressions):https://docs.getodk.org/form-regex/

type name label constraint constraint_message
text middle_initial 你的中間名首字母是什麼? regex(., '\p{L}') 只要第一個字

唯讀的問題

若要完全限制使用者輸入,請增加read_only 欄位,並使用yes值。這通常與預設回應相結合,預設回應通常是根據先前的回應計算出來的。

type name label read_only default calculation
decimal salary_income Income from salary
decimal self_income Income from self-employment
decimal other_income Other income
calculate income_sum ${salary_income} + ${self_income} + ${other_income}
decimal total_income Total income yes ${income_sum}

有條件的顯示問題(Conditionally showing questions)

relevant (相關)欄位可基於先前回應的問題與問題群組,來決定目前問題要顯示或隱藏。
如果 relevant (相關)欄位的表達式計算結果為 True,則會顯示問題或群組。如果為 False,則不顯示問題。

通常,比較運算子(https://getodk.github.io/xforms-spec/#xpath-operators )用於相關表達式中,例如:

「${age} <= 5」: 若年齡為五歲或以下,則為True
「${has_children} = 'yes'」: 如果 has_children 的答案是 yes,則為True
相關表達式也可以使用函數(https://docs.getodk.org/form-operators-functions/#form-functions)。例如:

「selected(${allergies}, 'peanut') 」:如果在名為過敏的多重選擇小工具中選擇了花生(peanut),則為 true。
「contains(${haystack}, 'needle') 」: 如果haystack 的回應中的任何位置有「needle」字串,則為 True。
「count-selected(${toppings}) > 5」:如果在名為 toppings 的多選小工具中選擇了五個以上選項,則為 True。

簡單範例

XLSForm
survey

type name label relevant
select_one yes_no watch_sports 你看體育比賽嗎?
text favorite_team 你最喜歡哪支球隊? ${watch_sports} = 'yes'

choices

list_name name label
yes_no yes Yes
yes_no no No

複雜範例

XLSForm
survey

type name label hint relevant constraint
select_multiple medical_issues what_issues 您是否經歷過以下情況? 選擇所有適用的選項。
select_multiple cancer_types what_cancer 您曾患過什麼類型的癌症? 選擇所有適用的選項。 selected(${what_issues}, 'cancer')
select_multiple diabetes_types what_diabetes 您患有什麼類型的糖尿病? 選擇所有適用的選項。 selected(${what_issues}, 'diabetes')
begin_group blood_pressure 血壓讀數 selected(${what_issues}, 'hypertension')
integer systolic_bp 收縮壓 . > 40 and . < 400
integer diastolic_bp 舒張壓 . >= 20 and . <= 200
end_group
text other_health 列出其他問題。 selected(${what_issues}, 'other')
note after_health_note This note is after all health questions.

choices

list_name name label
medical_issues cancer 癌症
medical_issues diabetes 糖尿病
medical_issues hypertension 高血壓
medical_issues other 其他
cancer_types lung 肺癌
cancer_types skin 皮膚癌
cancer_types prostate 攝護腺癌
cancer_types breast 乳癌
cancer_types other 其他
diabetes_types type_1 1 型(胰島素依賴性)
diabetes_types type_2 2 型(胰島素抗性)

問題分組(Question group)

若要將問題分組,請使用 begin_group與end_group 語法。

XLSForm — 問題分組

type name label
begin_group my_group 我的文字小工具
text Question_1 文字小工具 1
text Question_2 這些問題將會分組在一起
end_group

您可以使用群組上的欄位清單( field-list )外觀在同一螢幕上顯示多個問題。
如果begin_group有設定標籤 (label),群組將在表單路徑中可見,可協助判斷目前位置(例如:我的文字小工具 > 文字小工具 1)。帶有標籤的群組也會在跳頁選單中顯示為可點選的項目:

沒有標籤的群組有助於以使用者不可見的方式組織問題。此技巧有助於表單的內部組織。這些組別也可以是有條件地顯示某些問題的便捷方式。


上一篇
Day17:表單邏輯(Form Logic) Part 2
下一篇
Day19:表單邏輯(Form Logic) Part 4
系列文
用 ODK 和 Access VBA 打造行動化資料收集流程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言