一、前置條件-文本類字段
1.文本類字段設(shè)置前置條件一定要用三段式:前端看到文本類字段為空,數(shù)據(jù)庫(kù)里有時(shí)儲(chǔ)存的是一個(gè)空格符
①文本不為空:文本<>null and 文本<> '' and 文本<> ' '
②文本為空:文本==null Or 文本=='' Or 文本==' '
2.判斷文本是否包含某個(gè)值:文本.find('XXX')>=0
3..find('str'),返回目標(biāo)字符的位置,>=0則代表字符存在(0表示第1位,1表示第2位,以此類推)
4..find('str')是python語句;like ‘%XXX%’是sql語句,作用同.find('str')
5.實(shí)體服務(wù)規(guī)則/字段值更新/校驗(yàn)規(guī)則不支持sql語句,所以不支持like '%XXX%'
6.過濾語句支持sql語句,所以支持用 like '%XXX%'
進(jìn)階用法
設(shè)置文本='1234567890',
則:截取文本前三位: 文本[0:3]= '123' 或者 文本[:3]= '123'
截取文本后三位:文本[-3:]= '890'
截取文本第三位: 文本[2]= '3'
截取文本倒數(shù)第三位:文本[-3]= '8'
截取所有文本:文本[:]='1234567890'
倒敘截取所有文本:文本[::-1]= '0987654321'
截取文本第三位到第五位:文本[2:5]= '345'
截取文本第三位到倒數(shù)第二位:文本[2:-2]= '345678'
截取文本倒數(shù)第五位到第八位:文本[-5:8]= '678'
截取文本倒數(shù)第七位到倒數(shù)第六位:文本[-7:-5]= '45'
二、前置條件-日期類字段
1.日期字段不能直接與字符串常量進(jìn)行比較:
需要采用.ToString('yyyy-MM-dd')函數(shù),把日期轉(zhuǎn)換為字符串進(jìn)行比較:
F_JD_Date.ToString('yyyy-MM-dd') == '2016-07-07’
2.判斷日期是否大于今天:F_JD_Date>=@currentshortdate
3.取日期的年度:F_JD_Date.Date.Year
取日期的月份:F_JD_Date.Date.Month
取日期的天號(hào):F_JD_Date.Date.Day
4.計(jì)算日期差: (F_JD_Date1 - F_JD_Date2).Days
計(jì)算月份差: (F_JD_Date1 - F_JD_Date2).Months
計(jì)算年度差: (F_JD_Date1 - F_JD_Date2).Years
5.增加天數(shù):F_JD_Date2=F_JD_Date1.AddDays(-1)
增加月份:F_JD_Date2=F_JD_Date1.AddMonths(-1)
增加年份:F_JD_Date2=F_JD_Date1.AddYears(-1)
進(jìn)階應(yīng)用
1.取每月第一天:FSTARTDate= FDate.AddDays(1-float((FDate.ToString("dd"))))
2.取每個(gè)月最后一天(復(fù)雜):FENDDate = FDate.AddDays(1-float((FDate.ToString("dd")))).AddMonths(+1).AddDays(-1)
長(zhǎng)日期字段
1.長(zhǎng)日期/時(shí)間/打印時(shí)間/
與具體的時(shí)間作比較:F_JD_Date.ToString('yyyy-MM-dd hh:mm:ss') = '2016-07-07 10:05:33'
2.與當(dāng)前時(shí)間作比較:F_JD_Date>@currentlongdate
前置條件-單選輔助資料字段
編碼:F_JD_Assistant <>null And F_JD_Assistant.FNumber=='XXX'
名稱:F_JD_Assistant <>null And F_JD_Assistant.FDataValue.ToString() == 'XXX'
【注意】因?yàn)槎嗾Z言文本字段是按照語言隔離控制的,所以需要使用.ToString()函數(shù),轉(zhuǎn)換成純文本。
前置條件-單選下拉列表字段
下拉列表不為空:F_JD_Combo<>null And F_JD_Combo<>'' And F_JD_Combo<>' '
下拉列表等XXX:F_JD_Combo=='XXX',XXX代表所查詢的枚舉項(xiàng)值
【注意】下拉列表不能用枚舉項(xiàng)名稱作為前置條件
前置條件-分組字段
編碼:F_JD_Group <>null And F_JD_Group.FNumber==‘XXX’
名稱:F_JD_Group<>null And F_JD_Group.FName.ToString()=='XXX'
前置條件-復(fù)選框字段
判斷復(fù)選框字段勾選:FPayBox 或者 FPayBox==1 或者 FPayBoxtrue 或者 FPayBox==True
判斷復(fù)選框字段不勾選:FPayBox ==0 或者 FPayBoxfalse 或者 FPayBox==False
注意true,不要寫成ture
前置條件-單據(jù)狀態(tài)字段
單據(jù)狀態(tài)<>null and 單據(jù)狀態(tài)=='XXX',XXX代表所需要判斷的狀態(tài)值
前置條件-單據(jù)類型字段
單據(jù)類型為空:?jiǎn)螕?jù)類型==null or 單據(jù)類型=='' or單據(jù)類型==' '
單據(jù)類型不為空:?jiǎn)螕?jù)類型<>null and單據(jù)類型<>'' and單據(jù)類型<>' '
單據(jù)類型<>null And 單據(jù)類型.編碼== 'XXX'
前置條件-數(shù)值型字段
數(shù)量1>數(shù)量2 或者 數(shù)量1>0
四舍五入:小數(shù)2 = round (小數(shù)1,精度位數(shù))
向下取整:小數(shù)2= int (小數(shù)1)
向上取整:小數(shù)2= int ( round (小數(shù)1+ 0.4999999999 ) )
前置條件-多類別基礎(chǔ)資料列表字段(比如往來單位類型)
多類別基礎(chǔ)資料列表==‘XXX’,
XXX代表所需要判斷的具體基礎(chǔ)資料英文標(biāo)識(shí):
①客戶:BD_Customer
②供應(yīng)商:BD_Supplier
③員工:BD_Empinfo
④部門:BD_Departmnet
⑤其他往來單位:FIN_OTHERS
⑥組織架構(gòu):ORG_Organizations
⑦銀行:BD_BANK(最好能記住)
前置條件-多類別基礎(chǔ)資料字段(比如往來單位)
多類別基礎(chǔ)資料列表=='XXX' and 多類別基礎(chǔ)資料.FNumber=='XXX'
需要注意的是,多類別基礎(chǔ)資料因?yàn)榧狭硕喾N基礎(chǔ)資料,只能設(shè)置共性的屬性作為條件。不能取到某種基礎(chǔ)資料的特有屬性作為條件。
如果一定要取特有屬性作為條件,則需要添加基礎(chǔ)資料字段,設(shè)置實(shí)體服務(wù)規(guī)則取值。再以新加字段的特有屬性作為條件。
是否有源單
判斷單據(jù)有源單:ISDRAW() 或者 ISDRAW()==true 或者 ISDRAW()==True 或者 ISDRAW()==1
判斷單據(jù)無源單:ISDRAW()==false 或者 ISDRAW()==False 或者 ISDRAW()==0
注意不可缺少(),注意不能使用isdraw/IsDraw,注意不能使用TRUE/FALSE
或者可以變通的用單據(jù)體的源單類型或者源單編號(hào)字段結(jié)合遍歷語句判斷是有有源單
是否已下推
判斷單據(jù)已經(jīng)下推:ISPUSH ()或者ISPUSH ()==true或者ISPUSH ()==True或者ISPUSH ()==1
判斷單據(jù)未下推:ISPUSH ()==false或者ISPUSH ()==False或者ISPUSH ()==0
注意不可缺少(),注意不能使用ispush/IsPush,注意不能使用TRUE/FALSE
或者可以變通的取下游單據(jù)反寫的字段作為條件
組織字段
組織<>null And 組織.編碼=='XXX'
組織==@currentorgid(當(dāng)前登錄組織)
用戶/創(chuàng)建人/修改人/打印人字段
用戶<>null And 用戶.編碼=='XXX’
用戶==@userid(當(dāng)前登錄用戶)
前置條件-基礎(chǔ)資料字段
1.基礎(chǔ)資料字段,F(xiàn)_JD_Base返回的是一個(gè)復(fù)雜對(duì)象 BaseFieldDynamicRow,包含了很多的屬性,不能與一個(gè)簡(jiǎn)單常量進(jìn)行比較。如 F_JD_Base == '資料名稱',達(dá)不到預(yù)期效果。需要明確的指定屬性與常量值進(jìn)行比較:
2.內(nèi)碼:F_JD_Base<>null and F_JD_Base.Id == 100001
3.使用編碼:F_JD_Base<>null and F_JD_Base.FNumber =='GW0001'
或者 F_JD_Base<>null and F_JD_Base['Number']=='GW0001'
4.使用名稱:F_JD_Base<>null and F_JD_Base.FName.ToString() == '采購(gòu)員'
注意:寫條件最好是一步一步來,寫全寫對(duì),不要只寫F_JD_Base.FNumber == 'GW0001'
基礎(chǔ)資料字段.基礎(chǔ)資料屬性(比如申請(qǐng)部門.上級(jí)部門)
1.編碼:F_JD_Base<>null and F_JD_Base.FProperty<>null and F_JD_Base.Fproperty.Number == 'GW0001'
2.名稱:F_JD_Base<>null and F_JD_Base.FProperty<>null and F_JD_Base.FProperty['Name'] == 'GW0001'
3.注意:需要在申請(qǐng)部門字段上做上級(jí)部門的屬性引用
基礎(chǔ)資料字段.輔助資料屬性(比如申請(qǐng)部門.部門屬性)
編碼:F_JD_Base<>null and F_JD_Base.FDeptProperty <>null and F_JD_Base. FDeptProperty ['Number'] == 'DP02_SYS'
基礎(chǔ)資料字段.分組屬性(比如申請(qǐng)部門.部門分組)
編碼:F_JD_Base<>null and F_JD_Base.FGroup<>null and F_JD_Base.FGroup['Number']=='001'
名稱:F_JD_Base<>null and F_JD_Base.FGroup<>null and F_JD_Base.FGroup['Name'].ToString()=='分組1'
多級(jí)引用屬性做條件(比如申請(qǐng)部門.上級(jí)部門.部門屬性)
不支持F_JD_Base.FProperty.FDeptProperty['Number']== 'DP02_SYS'多級(jí)屬性引用作為條件的
標(biāo)識(shí)與綁定實(shí)體屬性的選擇
①F_JD_Base<>null and F_JD_Base.FNumber == ‘GW0001' FNumber取的是編碼的標(biāo)識(shí)
②同樣可以寫作:F_JD_Base<>null and F_JD_Base['Number']== 'GW0001'
③F_JD_Base<>null and F_JD_Base.FProperty<>null and F_JD_Base.Fproperty.Number == 'GW0001' Number 取的是編碼的綁定實(shí)體屬性
④同樣可以寫作: F_JD_Base<>null and F_JD_Base.FProperty<>null and F_JD_Base.Fproperty['Number']== 'GW0001'
建議統(tǒng)一使用['Number']的格式
基礎(chǔ)資料屬性引用的作用歸納
①需要基礎(chǔ)資料字段做屬性引用,基礎(chǔ)資料屬性字段,才可以選到被引用的屬性。
②實(shí)體服務(wù)規(guī)則/字段值更新事件的前置條件/賦值公式需要引用基礎(chǔ)資料屬性,否則會(huì)報(bào)錯(cuò)
③工作流-流程設(shè)計(jì)器-流程線/(流程節(jié)點(diǎn)-審批動(dòng)作-參與人方案)-高級(jí)
④預(yù)算控制規(guī)則-控制單據(jù)-控制維度-字段取值來源
【反例】過濾語句與憑證模板的(科目影響因素/核算維度)取值不需要引用屬性
寫語句注意事項(xiàng)
1.符號(hào)的應(yīng)用
①寫條件語句,等號(hào)用==;寫賦值語句用=;寫過濾語句用=
②不等號(hào)可以用<>,也可以用!=
③可以用A in ['xxx', 'xxx','xxx']來替換A=='xxx' or A=='xxx' or A=='xxx'
同理,A not in ['xxx', 'xxx','xxx']替換A<>'xxx' and A<>'xxx' and A<>'xxx'
2.互斥條件的寫法:
原條件:A>0 and (B<>null or C in ['xxx', 'xxx'])
互斥條件:A<=0 or (B==null and C not in ['xxx', 'xxx'])
3.能做實(shí)體服務(wù)規(guī)則不做字段值更新事件,原因如下:
①滿足條件即觸發(fā),不需點(diǎn)擊觸發(fā) ②配置工作量少(以A=B+C舉例)
③條件不滿足亦可配置服務(wù) ④易于后續(xù)維護(hù)與排查
4.粘貼網(wǎng)頁/word/excel的語句到BOS編輯器,最好要通過txt文檔中轉(zhuǎn),因?yàn)榫W(wǎng)頁的語句可能會(huì)帶有格式,導(dǎo)致BOS不能識(shí)別。
5.實(shí)體服務(wù)規(guī)則/字段值更新事件:A=B+C,需要在前置條件設(shè)置B==B and C==C;并且需要勾選B與C兩個(gè)字段的“即時(shí)觸發(fā)字段值更新事件”
6.給單據(jù)體字段賦值,需要在單據(jù)體上設(shè)置實(shí)體服務(wù)規(guī)則,或者單據(jù)體字段的字段值更新事件。不能是單據(jù)頭的實(shí)體服務(wù)規(guī)則。
if…else語句
①'賦值a' if (條件=='xxx') else '賦值b'
②'賦值a' if (條件1=='xxx') else ('賦值b' if (條件2=='xxx') else '賦值c')
③'賦值a' if (條件1=='xxx') else ('賦值b' if (條件2'==xxx') else ('賦值c' if (條件3=='xxx') else '賦值d'))
即時(shí)觸發(fā)字段值更新事件的作用
①為字段值更新事件/實(shí)體服務(wù)規(guī)則的前置條件字段觸發(fā)前置條件。
②影響新增修改單據(jù)時(shí),數(shù)值型字段匯總到上級(jí)字段的功能實(shí)時(shí)觸發(fā)更新。
③手工新增/修改單據(jù)時(shí),在單據(jù)體底端實(shí)時(shí)統(tǒng)計(jì)數(shù)值型字段的匯總值。
④單選按鈕組字段作為前置條件(包含字段值更新與實(shí)體服務(wù)規(guī)則),單選按鈕字段需要勾選該屬性才能生效。
【注意】自定義的字段,默認(rèn)不勾選“即時(shí)觸發(fā)字段值更新事件”。
計(jì)數(shù)遍歷
len(filter(lambda x:x.FExpID<>null and x.FExpID.FName=='業(yè)務(wù)招待費(fèi)', FEntity))>0
①len:計(jì)數(shù); ②filter:過濾;③ lambda:遍歷;④ x:x. 固定寫法;⑤ FExpID:費(fèi)用項(xiàng)目字段的標(biāo)識(shí);⑥ FExpID.FName:費(fèi)用項(xiàng)目.名稱的標(biāo)識(shí) ;⑦ FEntity:費(fèi)用報(bào)銷單的明細(xì)單據(jù)體的標(biāo)識(shí)
語句大意:先使用lambda函數(shù)對(duì)FEntity單據(jù)體做遍歷操作,再使用filter函數(shù),按照FExpID<>null and FExpID.FName=='業(yè)務(wù)招待費(fèi)'作為條件,將滿足條件的明細(xì)行過濾出來,最后len函數(shù)對(duì)滿足條件的明細(xì)行做計(jì)數(shù)統(tǒng)計(jì),得到的數(shù)值與0做比較返回true或者false。
求和遍歷
FExpAmountSum=sum(map(lambda x:x.FExpenseAmount, FEntity)
① FExpAmountSum :?jiǎn)螕?jù)頭匯總金額字段的標(biāo)識(shí); ② sum:求和;③ map:映射;④ lambda:遍歷;⑤ x:x. 固定寫法;⑥ FExpenseAmount:?jiǎn)螕?jù)體費(fèi)用金額字段的標(biāo)識(shí);⑥FEntity:費(fèi)用報(bào)銷單的明細(xì)單據(jù)體的標(biāo)識(shí)
語句大意:先使用lambda函數(shù)對(duì)FEntity單據(jù)體做遍歷操作,再使用map函數(shù),將FExpenseAmount字段從明細(xì)行映射挑選出來組成一個(gè)新的集合;最后使用sum函數(shù)對(duì)集合里面的所有元素做求和匯總,得到的數(shù)值賦值給FExpAmountSum字段。
求和遍歷 經(jīng)典案例
【需求】報(bào)銷單申請(qǐng)報(bào)銷金額不能超過收票金額之和(不能超發(fā)票金額報(bào)銷)
【思路】在BOS為報(bào)銷單設(shè)置保存校驗(yàn)規(guī)則,用sum(map(lambda語句求和匯總收票單信息單據(jù)體里的收票單金額,再與單據(jù)頭的申請(qǐng)報(bào)銷金額匯總字段,做單據(jù)合法性校驗(yàn)大小。
【語句】sum(map(lambda x : (x.FRecInv.FSUMALLAMOUNT),FRecInvInfo))<= FReqReimbAmountSum
①FRecInvInfo:費(fèi)用報(bào)銷單的收票信息單據(jù)體的標(biāo)識(shí);②FRecInv:收票信息單據(jù)體的收票單字段(基礎(chǔ)資料)的標(biāo)識(shí);③FRecInv.FSUMALLAMOUNT:收票單.價(jià)稅合計(jì)的標(biāo)識(shí)。
求和遍歷 進(jìn)階案例
【業(yè)務(wù)場(chǎng)景】求和匯總費(fèi)用報(bào)銷單費(fèi)用項(xiàng)目.名稱=業(yè)務(wù)招待費(fèi)的明細(xì)行的費(fèi)用金額。
【語句1】FExpAmountSum=sum(map(lambda x:x.FExpenseAmount if FExpID<>null and FExpID.FName=='業(yè)務(wù)招待費(fèi)’ else 0 , FEntity)
語句大意:先使用lambda函數(shù)對(duì)FEntity單據(jù)體做遍歷操作,再使用map函數(shù),按照FExpID<>null and FExpID.FName==‘業(yè)務(wù)招待費(fèi)'作為條件,將滿足條件的FExpenseAmount字段從明細(xì)行映射挑選出來(若不滿足條件, FExpenseAmount字段則為0),組成一個(gè)新的集合;最后使用sum函數(shù)對(duì)集合里面的元素做相加統(tǒng)計(jì),得到的數(shù)值賦值給FExpAmountSum字段。
【語句2】FExpAmountSum=sum(map(lambda(x:x.FExpenseAmount ,filter(lambda(y:y.FExpID<>null and y.FExpID.FName=='業(yè)務(wù)招待費(fèi)'), FEntity))))>0
語句大意:先使用lambda函數(shù)對(duì)FEntity單據(jù)體做遍歷操作,再使用filter函數(shù),按照FExpID<>null and FExpID.FName==‘業(yè)務(wù)招待費(fèi)'作為條件,將滿足條件的明細(xì)行過濾出來;再使用lambda函數(shù)對(duì)這部分明細(xì)行做遍歷操作;再使用map函數(shù),將 FExpenseAmount字段從明細(xì)行映射挑選出來,組成一個(gè)新的集合;最后使用sum函數(shù)對(duì)集合里面的元素做相加統(tǒng)計(jì),得到的數(shù)值賦值給FExpAmountSum字段。
拼接遍歷
FCausa = '\n'.join(o for o in (set(map(lambda x:(format(x.FRemark)), FEntity))))
①FCausa :?jiǎn)螕?jù)頭事由字段的標(biāo)識(shí);②‘\n’:自動(dòng)換行符;③.join:拼接;④ o for o in 固定寫法;⑤ set:去重; ⑥map:映射;⑦lambda:遍歷;⑧format:格式化字符串;⑨FRemark :?jiǎn)螕?jù)體備注字段的標(biāo)識(shí);⑩ FEntity:費(fèi)用報(bào)銷單的明細(xì)單據(jù)體的標(biāo)識(shí)
語句大意:先使用format函數(shù)對(duì)先對(duì)FRemark做格式化操作,得到純文本。再使用lambda函數(shù)對(duì)FEntity單據(jù)體做遍歷操作,再使用map函數(shù),將格式化后的字符串從明細(xì)行映射挑選出來,組成一個(gè)新的集合;再使用set函數(shù),對(duì)集合里的元素做去重操作,去重后按照原有的順序組成新的集合。最后使用join函數(shù)對(duì)集合里面的元素,使用自動(dòng)換行符'\n'做拼接操作,得到的字符串賦值給FCausa字段。
遍歷語句注意事項(xiàng)
適用范圍
1.支持單據(jù)頭實(shí)體服務(wù)規(guī)則
2.支持表單服務(wù)策略與校驗(yàn)規(guī)則
3.不支持單據(jù)體實(shí)體服務(wù)規(guī)則
4.不支持字段值更新事件
多單據(jù)體遍歷
不支持同時(shí)遍歷多個(gè)單據(jù)體/子單據(jù)體
業(yè)務(wù)場(chǎng)景:同時(shí)對(duì)采購(gòu)訂單明細(xì)單據(jù)體的價(jià)稅合計(jì)字段求和,同時(shí)對(duì)自定義的子單據(jù)體的金額字段求和,然后兩者作大小比較
遍歷語句 其他應(yīng)用
基礎(chǔ)資料單據(jù)體字段
如需對(duì)基礎(chǔ)資料字段,單據(jù)體中屬性進(jìn)行比較,也需要使用lambda進(jìn)行遍歷:
【需求】判斷申請(qǐng)人(基礎(chǔ)資料員工)字段的任崗信息單據(jù)體上是否至少存在一行就任崗位.名稱=財(cái)務(wù)經(jīng)理的明細(xì)行。
【語句】len(filter(lambda x:(x['Post']['Name'].ToString() =='財(cái)務(wù)經(jīng)理' ), FStaffId.PostEntity)) >0
語句說明: ①FStaffId:申請(qǐng)人字段的標(biāo)識(shí);② PostEntity:基礎(chǔ)資料員工的員工任崗信息單據(jù)體的ORM實(shí)體名;③Post:基礎(chǔ)資料員工的員工任崗信息單據(jù)體的就任崗位字段的綁定實(shí)體屬性;④Name:Post的名稱屬性的綁定實(shí)體屬性
前置條件-多選類字段
1.多選基礎(chǔ)資料未錄入:len( FMulBase )<= 0 或者 FMulBase.Count<=0
多選基礎(chǔ)資料不為空:len( FMulBase ) > 0 或者 FMulBase.Count>0
【注意】只能是Count,不能是count或者COUNT。
多選基礎(chǔ)資料字段包含編碼為001的值:len(filter(lambda x:(x.Number=='001'),F_xkcw_MulBase))>0
多選基礎(chǔ)資料字段不包含編碼為001的值:len(filter(lambda x:(x.Number=='001'),F_xkcw_MulBase))<=0
2.多選輔助資料字段為空:MulAssistant==null 多選輔助資料字段不為空:MulAssistant<>null
多選輔助資料字段包含編碼為China的值:
len(filter(lambda x:(x.F_xkcw_MulAssistant<>null and x.F_xkcw_MulAssistant.FNumber=='China'),F_xkcw_MulAssistant))>0
3.有選擇某一個(gè)枚舉項(xiàng):多選下拉列表.find('枚舉項(xiàng)值')!=-1 沒有選擇某一個(gè)枚舉項(xiàng):多選下拉列表.find('枚舉項(xiàng)值')==-1
是否都有勾選兩個(gè)枚舉項(xiàng):多選下拉列表.find('枚舉項(xiàng)值a')!=-1 and 多選下拉列表.find('枚舉項(xiàng)值b')!=-1
是否至少有勾選兩個(gè)枚舉項(xiàng)其一:多選下拉列表.find('枚舉項(xiàng)值a')!=-1 or 多選下拉列表.find('枚舉項(xiàng)值b')!=-1
兩個(gè)枚舉項(xiàng)都不勾選:多選下拉列表.find('枚舉項(xiàng)值a')==-1 and 多選下拉列表.find('枚舉項(xiàng)值b')==-1
兩個(gè)枚舉項(xiàng)至少其一不勾選:多選下拉列表.find('枚舉項(xiàng)值a')==-1 or 多選下拉列表.find('枚舉項(xiàng)值b')==-1
過濾語句
過濾與高級(jí)過濾
1.基礎(chǔ)資料字段的特有功能 2.高級(jí)過濾的過濾條件可以直接粘貼語句的 3.均支持python與sql的語法
需求分析
【需求1】在采購(gòu)增值稅專用發(fā)票的收票信息頁簽,選擇發(fā)票時(shí),只能選擇到查驗(yàn)狀態(tài)=已查驗(yàn)的收票單
【語句】FISEXAMINE='1'
FISEXAMINE:收票單.查驗(yàn)狀態(tài)的標(biāo)識(shí)
【需求2】在采購(gòu)增值稅專用發(fā)票選擇物料時(shí),只能選擇到物料.默認(rèn)供應(yīng)商=單據(jù)頭.供應(yīng)商的物料。
【語句】FDefaultVendor=GetValue(FSUPPLIERID)
FDefaultVendor:物料.默認(rèn)供應(yīng)商的標(biāo)識(shí)
FSUPPLIERID:?jiǎn)螕?jù)頭.供應(yīng)商的標(biāo)識(shí)
【需求5】費(fèi)用報(bào)銷單,想要實(shí)現(xiàn):當(dāng)申請(qǐng)部門不為空時(shí),往來單位供應(yīng)商F8,按照供應(yīng)商.負(fù)責(zé)部門=申請(qǐng)部門做過濾;當(dāng)申請(qǐng)部門為空時(shí),往來單位供應(yīng)商F8,不做限制。
【語句用法】case when 條件語句 then 條件滿足時(shí)的過濾語句 else 條件不滿足時(shí)的過濾語句 end
特點(diǎn):作用類同于if…else語句
【具體語句】FDeptId=CASE WHEN (GetValue(FRequestDeptID) <>0 and GetValue(FRequestDeptID) is not null) THEN GetValue(FRequestDeptID) ELSE FDeptID END
語句缺陷
【語句缺陷】1.不管前置條件是否滿足,基礎(chǔ)資料都必須使用FDeptId屬性作為過濾的依據(jù)。若是想要實(shí)現(xiàn)當(dāng)條件不滿足時(shí),使用非FDeptId屬性作為過濾的依據(jù),就沒辦法實(shí)現(xiàn)。
2.因?yàn)閟elect與case when結(jié)合的語句,select子查詢語句只能返回1個(gè)值(select若不與case when結(jié)合,是可以返回多個(gè)值的),但是截圖里的語句需要用到in,會(huì)返回多個(gè)值。所以該語句會(huì)報(bào)錯(cuò)不能實(shí)現(xiàn)需求。
【需求6】當(dāng)申請(qǐng)人字段(基礎(chǔ)資料員工)不為空時(shí),崗位信息字段(基礎(chǔ)資料崗位信息)F8開窗選擇(或者模糊查詢選擇、快速錄入)時(shí),只可選擇申請(qǐng)人任崗的并且沒被禁用的崗位。否則,崗位信息字段能選到所有的崗位。
BOS設(shè)計(jì)器-業(yè)務(wù)字段-崗位字段的使用案例https://vip.kingdee.com/article/155401307799205376
【語句1】FPOSTID in (select FPOSTID from T_BD_STAFF where FEMPINFOID = GetValue(申請(qǐng)人字段的標(biāo)識(shí)) AND FFORBIDSTATUS = 'A')
【語句2】FPOSTID in (select t1.FPOSTID from T_BD_STAFF t1 inner join T_ORG_POST t2 on t1.FPOSTID = t2.FPOSTID where t1.FEMPINFOID = GetValue(申請(qǐng)人字段的標(biāo)識(shí)) AND t1.FFORBIDSTATUS = ‘A’)
【語句術(shù)語具體說明】
①T_ORG_POST:基礎(chǔ)資料崗位信息-單據(jù)頭實(shí)體崗位信息的表名。②FPOSTID:基礎(chǔ)資料崗位信息的主鍵字段名/崗位信息表T_ORG_POST的Id,也就是崗位信息本身。③FPOSTID:基礎(chǔ)資料員工任崗信息-就任崗位字段的字段名。④T_BD_STAFF:基礎(chǔ)資料員工任崗信息-單據(jù)頭實(shí)體員工信息的表名。⑤FEMPINFOID:基礎(chǔ)資料員工任崗信息-員工字段的字段名。⑥FFORBIDSTATUS:基礎(chǔ)資料員工任崗信息-禁用狀態(tài)字段的字段名。A是未禁用。
語句邏輯具體講解
【語句大意】1.員工任崗表T_BD_STAFF定義為t1,崗位信息表T_ORG_POST定義為t2。
2.根據(jù)t1.FPOSTID = t2.FPOSTID的匹配關(guān)系將t1表與t2表通過inner join(內(nèi)拼接)語句拼接成一個(gè)新表。
3.在新表里面按照條件t1.FEMPINFOID = GetValue(申請(qǐng)人字段的標(biāo)識(shí)) AND FFORBIDSTATUS = 'A'過濾出符合條件的記錄明細(xì)。
4.在這些記錄里面映射出FPOSTID字段作為元素組成一個(gè)集合。
5.單據(jù)的崗位信息字段的屬性FPOSTID與該集合的元素用in語句做匹配過濾。
【需求7】當(dāng)部門字段不為空時(shí),員工字段F8開窗選擇時(shí),只可選擇在部門字段下勾了負(fù)責(zé)人崗位的崗位任崗的,并且沒被禁用的員工。否則,員工F8開窗選擇,能選到?jīng)]被禁用的所有員工。
【舉例】財(cái)務(wù)部 有三個(gè)崗位(財(cái)務(wù)總監(jiān),會(huì)計(jì),出納),其中財(cái)務(wù)總監(jiān)勾選負(fù)責(zé)人崗位。部門字段選擇財(cái)務(wù)部后,再選擇員工字段,只能選擇員工任崗為財(cái)務(wù)總監(jiān)的員工。
【語句】FID in (select t1. FEMPINFOID from (T_BD_STAFF t1 inner join T_HR_EMPINFO t2 on t1. FEMPINFOID = t2.FID) inner join T_ORG_HRPOST t3 on G.FPOSTID= t1.FPOSTID where t1. FDEPTID = GetValue(FRequestDeptID) AND t1.FFORBIDSTATUS = 'A' and t3.FLEADERPOST ='1')
修改枚舉項(xiàng)名稱
【需求】想要修改報(bào)銷單發(fā)票類型字段的普通發(fā)票的名稱,以及新增發(fā)票類型。
【錯(cuò)誤做法】直接在BOS拓展報(bào)銷單,直接修改發(fā)票類型關(guān)聯(lián)的枚舉類型:發(fā)票類型(財(cái)務(wù)使用)的枚舉項(xiàng)名稱,與添加新的枚舉項(xiàng)
【后果】系統(tǒng)每一次升級(jí),都會(huì)還原系統(tǒng)預(yù)置的枚舉項(xiàng)名稱,并且丟失新加的枚舉項(xiàng)信息
【正確做法】參照發(fā)票類型(財(cái)務(wù)使用) ,新建一個(gè)枚舉類型,與預(yù)置的枚舉項(xiàng)值保持一致(枚舉項(xiàng)名稱可以做修改),新增枚舉項(xiàng)。發(fā)票類型字段關(guān)聯(lián)新建的枚舉類型。
BOS經(jīng)典案例分析
差旅費(fèi)報(bào)銷單BOS打開報(bào)錯(cuò)
【原理】出差申請(qǐng)單與費(fèi)用申請(qǐng)單and差旅費(fèi)報(bào)銷單與費(fèi)用報(bào)銷單在BOS的構(gòu)造上,是繼承與被繼承的關(guān)系,所以在費(fèi)用申請(qǐng)單及其拓展所做的一切配置,都會(huì)同步配置在出差申請(qǐng)單上。反之則不然。
【具體原因】上述報(bào)錯(cuò)截圖是由于先在出差申請(qǐng)單上添加了一個(gè)標(biāo)識(shí)為F_UVPC_Assistant1的字段。后來在費(fèi)用申請(qǐng)單上,又人為手工的添加了一個(gè)同樣標(biāo)識(shí)為F_UVPC_Assistant1的字段,由于繼承與被繼承的關(guān)系,在出差申請(qǐng)單上也會(huì)同步新增一個(gè)標(biāo)識(shí)為F_UVPC_Assistant1的字段。造成了出差申請(qǐng)單上字段標(biāo)識(shí)重復(fù)。BOS重新打開出差申請(qǐng)單的拓展時(shí),觸發(fā)了字段標(biāo)識(shí)唯一性的校驗(yàn),從而會(huì)有上述的報(bào)錯(cuò)。
兩個(gè)字段作比較
【需求】列表過濾想要進(jìn)行兩個(gè)金額字段的比較,比如過濾出A字段不等于B字段的單據(jù),如何實(shí)現(xiàn)?
【方法】需要BOS后臺(tái)為字段A/字段B配置過濾比較符號(hào)集:200
【用途】①單據(jù)列表過濾
②數(shù)據(jù)規(guī)則授權(quán)
③憑證模板的分錄行生成條件
④選單條件策略
自動(dòng)下推服務(wù)
1.審核操作上自動(dòng)下推服務(wù)
2.工作流的自動(dòng)下推動(dòng)作
3.子系統(tǒng)的管理參數(shù)
注意:三者只能擇其一,不能重復(fù)設(shè)置
注意:自動(dòng)下推是整單下推的。不能以單據(jù)體字段作為條件,控制只下推滿足條件的明細(xì)行。