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))
posted @ 2024-04-25 09:15  苏沐~  阅读(237)  评论(0编辑  收藏  举报