Power Apps(功能逻辑)
List搜索逻辑
SortByColumns(Search(数据源,搜索框.Text,字段),"排序字段",SortOrder.Descending)
//or
Sort(
Filter(
数据源,
"" || gblListSearchText in 字段1 || gblListSearchText in 字段2,
字段1,
字段2
),
字段1,
If(
gblListSort,
SortOrder.Descending,
SortOrder.Ascending
)
)
【Descending】表示倒序排列,将值由高到低进行排序。而【Ascending】则表示升序,将值由低到高进行排序。
优化搜索框行为
1、首先将搜索框的【DelayOutput】设置为 true 。
2、在搜索框的【OnChange】属性中用【Set】方法设置了一个全局变量如【gblSearchText】,将变量的值设置为此时搜索框中的值。
Set(gblSearchText,TextSearch.Text)
3、设置当前屏幕属性【OnVisible】(保证进入该屏幕就重置)
Set(gblSearchText,"")
4、然后将库控件的【Items】属性中的 txtSearch.Text 替换为在搜索框 onChange时设置的变量【gblSearchText】
Filter(数据源,StartsWith(字段,gblSearchText))
回车,或者点击画布其他地方的时候,就会触发【onChange】中配置的行为,也就是把此时文本框中的文本赋值给变量【gblSearchText】,而因为库中的【Items】是根据【gblSearchText】实现的搜索,因此会立刻对数据进行筛选。
//或者通过按钮查询,需在按钮【OnSelect】属性中添加
Set(gblSearchText,TextSearch.Text)
排除重复值
Distinct(数据源,字段)
应用:ComboBox与List检索数据
//ComboBox
Distinct(数据源,字段)
//List(设置允许选中多个)
Filter(
数据源,
字段 in ComboBox.SelectedItems
)
设置记录源(列表页面跳转详细页面)
//列表页面绑定数据源的窗体控件的名字(List),详细页面From选择属性区的【Item】
List.Selected
//后序通过ThisItem.字段就可显示对应的数据。
在此之前记得给详细页面From绑定数据源。
Text显示"新建"还是"编辑"
//FrmDetailEdit(窗体(Forms)编辑(Edit)控件)
If(FrmDetailEdit.Mode=FormMode.New,"新建","编辑")
按钮功能逻辑
//登录按钮(匹配用户名和密码匹配的用户且未删除,匹配成功则保存用户ID跳转页面,反之则提示错误信息)
If(
CountIf(
数据源,
And(
Text(账户字段) = 登录框.Text,
Text(密码字段) = 密码框.Text,
IsDelete = false
)
) > 0,
Set(
Uid,
LookUp(
数据源,
And(
Text(账户字段) = 登录框.Text,
Text(密码字段) = 密码框.Text,
IsDelete = false
)
, Id )
);
Navigate(
首页,
ScreenTransition.Fade
),
Notify("Incorrect Login Details",NotificationType.Error)
)
//退出应用按钮
Exit() //退出当前应用,让用户保持登录状态。 用户返回到应用列表。
Exit( true ) //退出当前应用并将用户退出。用户需要在运行应用前使用其凭据重新登录。
/*
PageList为列表页面
-PageDetail为详细页面
-PageDetailEdit为编辑页面
--FrmDetailEdit为编辑窗体(From)
*/
//跳转详细页面图标(重置表单,设置为只读模式,跳转详细页面)
ResetForm(FrmDetailEdit);ViewForm(FrmDetailEdit);Navigate(PageDetail,ScreenTransition.Fade)
//新建按钮(重置表单,设置为新建模式,跳转编辑页面)
ResetForm(FrmDetailEdit);NewForm(FrmDetailEdit);Navigate(PageDetailEdit,ScreenTransition.Fade)
//编辑按钮(重置表单,设置为编辑模式,跳转编辑页面)
ResetForm(FrmDetailEdit);EditForm(FrmDetailEdit);Navigate(PageDetailEdit,ScreenTransition.Fade)
//删除按钮(删除当前详细页面数据,返回上一级页面)
Remove(数据源,LookUp(数据源,字段=List.Selected.ID));Back();
//取消按钮(清除From内容并返回上一级页面)
ResetForm(FrmDetailEdit);Back();
//保存按钮(新记录或者是现有记录的修改进行保存,返回上一级页面)
SubmitForm(FrmDetailEdit);Back();
这里的跳转详细页面图标、新建、编辑按钮(ViewForm、NewForm、EditForm函数)会传参,更新FrmDetailEdit.Mode
//利用弹窗时
//提交(编辑提交按钮、新建提交按钮)
Switch(
UserDetailForm.Mode,
//编辑提交按钮
FormMode.Edit,
UpdateIf(
UserInfoTable,
ID = UserList.Selected.ID,
{
Account: TextInputAccount.Text,
Password:TextInputPassWord.Text,
}
);
ViewForm(UserDetailForm);
,
//新建提交按钮
FormMode.New,
Collect(
UserInfoTable,
{
Account: TextInputAccount.Text,
Password:TextInputPassWord.Text,
}
);
Navigate(
UserListPage,
ScreenTransition.Fade
)
);
UpdateContext({isPopUpShow_Submit: false});
//通过文本输入(TextInput)的【DisplayMode】属性更改显示模式(视图、编辑)
Switch(
FrmDetailEdit.Mode,
FormMode.View,
DisplayMode.View,
FormMode.New,
DisplayMode.Edit,
FormMode.Edit,
DisplayMode.Edit
)
//或者
If(FrmDetailEdit.Mode=FormMode.View,DisplayMode.View,DisplayMode.Edit)
//功能禁用方面(如只希望在编辑和查看的时候显示删除按钮)设置删除按钮的【Visible】属性
If(FrmDetailEdit.Mode=FormMode.New,false,true)
//位置更新方面(属性【X】【Y】)
If(Icon.Visible,400,555)
数值计算
Sum(Filter(数据源,And(Year("2024/4/25")=Year(Today()),Month("2024/4/25")=4)),Amount)/10000&"万"
图表(Chart)数据源应用
Table({Preiod:"sumu",Amount:10})
点击进一步处理和显示数据,可以用Navigate公式还有ChartColum.Selected来组合显示更多的数据。
ErrorMessage应用
/*对TextInput进行数据校验;设置 ErrorMessage 的 【Text】属性*/
//数字文本框校验(校验目标:TextInput1;校验结果:ErrorMessage1)
Coalesce(
Parent.Error,
//限制只能输入数字
If(
!IsBlank(TextInput1.Text) && !IsMatch(
TextInput1.Text,
Match.MultipleDigits
),
"请输入数字"
) ,
//限制为只能输入8位数
If(
!IsBlank(TextInput1.Text) && Len(TextInput1.Text) <> 8,
"请输入8位数字"
)
)
//Match.MultipleDigts,表示匹配一个或多个数字。
//邮箱校验(校验目标:TextInput2;校验结果:ErrorMessage2)
Coalesce(
Parent.Error,
If(
!IsBlank(TextInput2.Text) && !IsMatch(
TextInput2.Text,
Match.Email
),
"请输入正确的邮箱地址"
)
)
//限制日期范围(校验目标:DatePicker1(日期选取器控件DatePicker);校验结果:ErrorMessage2)
Coalesce(
Parent.Error,
//只能输入今天之后的日期
If(
!IsBlank(DatePicker1.SelectedDate) && DatePicker2.SelectedDate < Today(),
"请输入今天之后的日期"
),
//只能输入周一到周五的工作日
If(
Weekday(
DatePicker1.SelectedDate,
StartOfWeek.Monday
) > 5,
"必须输入工作日"
)
)
//同时TextInputN边框颜色变换(属性【BorderColor】)
If(IsBlank(ErrorMessageN.Text),Parent.BorderColor,Color.Red)
/*最后最后!!!限制提交!!!*/
//点击提交按钮,切换到其中的 【DisplayMode】属性
//通过控制【 DisplayMode 】可以限制用户是否能够点击该控件。
//当【DisplayMode】设置为Disabled时,用户将无法进行点击操作。
If(
!IsBlank(ErrorMessage1.Text) || !IsBlank(ErrorMessage2.Text) || !IsBlank(ErrorMessage3.Text),
DisplayMode.Disabled,
DisplayMode.Edit
)
【Coalesce】,可以指定多个参数,其中哪个参数返回的不是空,就按照参数填写的顺序将第一个非空值返回。
变量
//全局变量(范围:应用)
Set( MyVar, 1 )
//上下文变量(范围:屏幕)
UpdateContext( { MyTotal: 0 } )
Navigate( Screen2, None, { MyTotal: -1000 } ) //跳转Screen2当前MyTotal定义的屏幕才有效
//集合(范围:应用)
Collect( MyCollect, TextInput1.Text )
Sum( MyCollect, Value ) // 显示汇总
Clear( MyCollect); LoadData( MyCollect, "StoredMyCollect", true ) //先清除再加载数据
SaveData( MyCollect, "StoredMyCollect" ) //保存
删除字符串最后一位
Left(
Concat(
数据源,
字段,
" ;"
),
Len(
Concat(
数据源,
字段,
" ;"
)
) - 1
)
委派之【单项选择筛选】、【多项选择筛选】
//单项
ClearCollect(
col自定义名,
"请选择"
);
Collect(
col自定义名,
Choices(数据源.字段)
)
Filter(数据源,字段 = Dropdown1.Selected.Value || If(Dropdown1.Selected.Value = "请选择",true,false))
//多项(列表项隐藏)(Visible 属性)
"yes" in Concat(ForAll(ComboBox1.SelectedItems.Value,If(Value in ThisItem.字段,"yes","no")),Value)
委派之【最高值】、【最低值】
//最高值
First(
Sort(数据源,字段,SortOrder.Descending)
).字段
//最低值
First(
Sort(
Filter(数据源,字段 <> Blank()),
字段,
SortOrder.Ascending
)
).字段
时间转换
//转字符串
Text(DateAdd(Now(), -8, TimeUnit.Hours),"yyyy/mm/dd HH:mm") //对时间的小时位加减
Text(Now(),DateTimeFormat.LongDateTime) //当前时间
Text(Minute(Now()), "#00分") //分钟取值
//转时间
DateValue("2021/05/27") //转换为日期
TimeValue("10:20:30") //转换为时间
DateTimeValue("2021/05/27 10:20:30") //转换为日期和时间
//计算两个日期和时间之间的时差(使用 DateDiff 函数。)
DateDiff(
DateAdd(
DateAdd(
StartDateValue.SelectedDate,
StartHourValue.Selected.Value,
TimeUnit.Hours
),
StartMinuteValue.Selected.Value,
TimeUnit.Minutes
),
DateAdd(
DateAdd(
EndDateValue.SelectedDate,
EndHourValue.Selected.Value,
TimeUnit.Hours
),
EndMinuteValue.Selected.Value,
TimeUnit.Minutes
),
TimeUnit.Minutes
) / 60 & "小时"
//处理时间下拉框拼接 StartTimeText:
Text(
DateAdd(
DateAdd(
StartDateValue.SelectedDate,
StartHourValue.Selected.Value,
TimeUnit.Hours
),
StartMinuteValue.Selected.Value,
TimeUnit.Minutes
),
"yyyy/mm/dd HH:mm"
)
//转时间格式 LabText:
DateTimeValue(StartTimeText.Text)
类型
// 判断一个文本框中的输入值是否为整数
If(
IsNumeric(TextInput1.Text) && Round(TextInput1.Text, 0) = TextInput1.Text,
"输入值是整数",
"输入值不是整数"
)
//负数转正数
Abs(-10)
//文本转换、数值转换
Text(10)、Value("10")
控件引用
1、图片
//图片(UploadeUserImg)
(字段更新情况下)
UserImg: UploadeUserImg.Image
(新建行情况下)
UserImg: {
FileName: UploadeUserImg.Image,
Value: UploadeUserImg.Image
}
//UploadeUserImg image属性显示
If(
IsBlank(UserImg.Media), //替换图片(UserImg)
If(IsBlank(UserList.Selected.UserImg),SampleImage,UserList.Selected.UserImg),
UserImg.Media
)
//图片重置
Reset(UserImg);
2、附件
//字段更新新建情况下
File: {
FileName: First(WorkFile.Attachments).Name,
Value: First(WorkFile.Attachments).Value
}
自定义连接器和即时流的调用
//自定义连接器
导入连接 -> 在控件数据源中(连接器名.自定义操作名)
//即时流
导入流 -> 在事件中(流.run(参数1,参数2))
or Set(glbVal,流.run(参数1,参数2))
本文来自博客园,作者:苏沐~,转载请注明原文链接:https://www.cnblogs.com/sumu80/p/18156854