个人博客 用于记载日常收集的一些技术文章 ...
K3 BOS : 金蝶K3:控制单据焦点 K3 BOS : 金蝶K3:控制单据焦点 金蝶K3插件开发-控制单据焦点(BOS单据、工业单据)

Call m_BillInterface.SetActiveCell("FDecimal")


BOS单据设置方法

单据体和单据头均使用SetActiveCell方法。

语法:Object.SetActiveCell (sKey As String, [lRow As Long])
参数说明:

sKey:String类型。指定字段的Key。

lRow:Long类型。可选参数。需要锁定的单据体多分录的行号。
注意:

如果指定的字段为“锁定”的字段,该方法不起任何作用。
示例:

在单据加载后,判断单据状态,如果是“修改”模式,设置光标在单据头字段FDecimal上:

Private Sub m_BillInterface_AfterLoadBill()
If m_BillInterface.BillStatus = Enu_BillStatusExt_Modify Then
Call m_BillInterface.SetActiveCell("FDecimal")
End If
End Sub

如果想控制单据体,SetActiveCell方法中指定lRow参数即可,不再说明,自己动手测试吧!



工业单据设置方法

单据体:

m_BillTransfer.BillForm.vsEntrys.SetFocus

m_BillTransfer.BillForm.vsEntrys.SetActiveCell(lCol,lRow)

单据头

m_BillTransfer.BillForm.KDCtl(i).SetFocus



或者使用以下方法:

单据体:

m_BillTransfer.grid.SetFocus

m_BillTransfer.grid.SetActiveCell(lCol,lRow)

单据头

m_BillTransfer.Head(i).SetFocus
郭少锋 创建 2024-05-14 21:13:08 K3 BOS
K3 BOS : VB 修改 表头字段 基础资料 K3 BOS : VB 修改 表头字段 基础资料 Private Sub m_BillInterface_AfterNewBill()

aFClassTypeID = m_BillInterface.FID
aFBiller = m_BillInterface.GetFieldValue("FBiller") '【FBiller 创建人】

aSql = "select a1.*,a2.FID FSenderNo from a_UserSet a1 join t_SubMessage a2 on a1.FSender = a2.FInterID where a1.FClassTypeID = " & aFClassTypeID & " and a1.FBiller = " & aFBiller

Set aRecordset = m_BillInterface.K3Lib.GetData(aSql)

If Not aRecordset.EOF Then

Set oField = m_BillInterface.BillHeads(1).BOSFields("FBase12") '【FSender 送货人 FBase12】 表头字段【基础资料】
With oField
.Number = aRecordset("FSenderNo") '【修改值】【核算项目.编码】
End With

End If

End Sub
郭少锋 创建 2024-05-14 00:25:35 K3 BOS
windows : windows server 2019 永久激活码 windows : windows server 2019 永久激活码 6XBNX-4JQGW-QX6QG-74P76-72V67
MFY9F-XBN2F-TYFMP-CCV49-RMYVH
RC4VN-4GQBW-WYPTV-3BD66-FVXR6
N3P28-TW9C9-69PWP-YQVC3-YBKR4
NMB98-MKJBC-FTVQ9-J3XK6-QYKTQ

Windows Server 2019产品密钥 WMDGN-G9PQG-XVVXX-R3X43-63DFG

Windows Server 2019 Standard N69G4-B89J2-4G8F4-WWYCC-J464C

Windows Server 2019 Essential WVDHN-86M7X-466 P 6-VHXV7-YY726
郭少锋 创建 2024-05-13 13:50:07 windows
云星空 : BOS 表达式 云星空 : BOS 表达式 原文链接:https://vip.kingdee.com/article/422885285635266304?productLineId=1&lang=zh-CN

一、前置条件-文本类字段

1.文本类字段设置前置条件一定要用三段式:前端看到文本类字段为空,数据库里有时储存的是一个空格符

①文本不为空:文本<>null and 文本<> '' and 文本<> ' '

②文本为空:文本==null Or 文本=='' Or 文本==' '

2.判断文本是否包含某个值:文本.find('XXX')>=0

3..find('str'),返回目标字符的位置,>=0则代表字符存在(0表示第1位,1表示第2位,以此类推)

4..find('str')是python语句;like ‘%XXX%’是sql语句,作用同.find('str')

5.实体服务规则/字段值更新/校验规则不支持sql语句,所以不支持like '%XXX%'

6.过滤语句支持sql语句,所以支持用 like '%XXX%'

进阶用法

设置文本='1234567890',

则:截取文本前三位: 文本[0:3]= '123' 或者 文本[:3]= '123'

截取文本后三位:文本[-3:]= '890'

截取文本第三位: 文本[2]= '3'

截取文本倒数第三位:文本[-3]= '8'

截取所有文本:文本[:]='1234567890'

倒叙截取所有文本:文本[::-1]= '0987654321'

截取文本第三位到第五位:文本[2:5]= '345'

截取文本第三位到倒数第二位:文本[2:-2]= '345678'

截取文本倒数第五位到第八位:文本[-5:8]= '678'

截取文本倒数第七位到倒数第六位:文本[-7:-5]= '45'

二、前置条件-日期类字段

1.日期字段不能直接与字符串常量进行比较:

需要采用.ToString('yyyy-MM-dd')函数,把日期转换为字符串进行比较:

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

取日期的天号:F_JD_Date.Date.Day

4.计算日期差: (F_JD_Date1 - F_JD_Date2).Days

计算月份差: (F_JD_Date1 - F_JD_Date2).Months

计算年度差: (F_JD_Date1 - F_JD_Date2).Years

5.增加天数:F_JD_Date2=F_JD_Date1.AddDays(-1)

增加月份:F_JD_Date2=F_JD_Date1.AddMonths(-1)

增加年份:F_JD_Date2=F_JD_Date1.AddYears(-1)

进阶应用

1.取每月第一天:FSTARTDate= FDate.AddDays(1-float((FDate.ToString("dd"))))

2.取每个月最后一天(复杂):FENDDate = FDate.AddDays(1-float((FDate.ToString("dd")))).AddMonths(+1).AddDays(-1)

长日期字段

1.长日期/时间/打印时间/

与具体的时间作比较:F_JD_Date.ToString('yyyy-MM-dd hh:mm:ss') = '2016-07-07 10:05:33'

2.与当前时间作比较: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'

【注意】因为多语言文本字段是按照语言隔离控制的,所以需要使用.ToString()函数,转换成纯文本。

前置条件-单选下拉列表字段

下拉列表不为空:F_JD_Combo<>null And F_JD_Combo<>'' And F_JD_Combo<>' '

下拉列表等XXX:F_JD_Combo=='XXX',XXX代表所查询的枚举项值

【注意】下拉列表不能用枚举项名称作为前置条件

前置条件-分组字段

编码:F_JD_Group <>null And F_JD_Group.FNumber==‘XXX’

名称:F_JD_Group<>null And F_JD_Group.FName.ToString()=='XXX'

前置条件-复选框字段

判断复选框字段勾选:FPayBox 或者 FPayBox==1 或者 FPayBoxtrue 或者 FPayBox==True

判断复选框字段不勾选:FPayBox ==0 或者 FPayBoxfalse 或者 FPayBox==False

注意true,不要写成ture

前置条件-单据状态字段

单据状态<>null and 单据状态=='XXX',XXX代表所需要判断的状态值

前置条件-单据类型字段

单据类型为空:单据类型==null or 单据类型=='' or单据类型==' '

单据类型不为空:单据类型<>null and单据类型<>'' and单据类型<>' '

单据类型<>null And 单据类型.编码== 'XXX'

前置条件-数值型字段

数量1>数量2 或者 数量1>0

四舍五入:小数2 = round (小数1,精度位数)

向下取整:小数2= int (小数1)

向上取整:小数2= int ( round (小数1+ 0.4999999999 ) )

前置条件-多类别基础资料列表字段(比如往来单位类型)

多类别基础资料列表==‘XXX’,

XXX代表所需要判断的具体基础资料英文标识:

①客户:BD_Customer

②供应商:BD_Supplier

③员工:BD_Empinfo

④部门:BD_Departmnet

⑤其他往来单位:FIN_OTHERS

⑥组织架构:ORG_Organizations

⑦银行:BD_BANK(最好能记住)

前置条件-多类别基础资料字段(比如往来单位)

多类别基础资料列表=='XXX' and 多类别基础资料.FNumber=='XXX'

需要注意的是,多类别基础资料因为集合了多种基础资料,只能设置共性的属性作为条件。不能取到某种基础资料的特有属性作为条件。

如果一定要取特有属性作为条件,则需要添加基础资料字段,设置实体服务规则取值。再以新加字段的特有属性作为条件。

是否有源单

判断单据有源单:ISDRAW() 或者 ISDRAW()==true 或者 ISDRAW()==True 或者 ISDRAW()==1

判断单据无源单:ISDRAW()==false 或者 ISDRAW()==False 或者 ISDRAW()==0

注意不可缺少(),注意不能使用isdraw/IsDraw,注意不能使用TRUE/FALSE

或者可以变通的用单据体的源单类型或者源单编号字段结合遍历语句判断是有有源单

是否已下推

判断单据已经下推:ISPUSH ()或者ISPUSH ()==true或者ISPUSH ()==True或者ISPUSH ()==1

判断单据未下推:ISPUSH ()==false或者ISPUSH ()==False或者ISPUSH ()==0

注意不可缺少(),注意不能使用ispush/IsPush,注意不能使用TRUE/FALSE

或者可以变通的取下游单据反写的字段作为条件

组织字段

组织<>null And 组织.编码=='XXX'

组织==@currentorgid(当前登录组织)

用户/创建人/修改人/打印人字段

用户<>null And 用户.编码=='XXX’

用户==@userid(当前登录用户)

前置条件-基础资料字段

1.基础资料字段,F_JD_Base返回的是一个复杂对象 BaseFieldDynamicRow,包含了很多的属性,不能与一个简单常量进行比较。如 F_JD_Base == '资料名称',达不到预期效果。需要明确的指定属性与常量值进行比较:

2.内码: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() == '采购员'

注意:写条件最好是一步一步来,写全写对,不要只写F_JD_Base.FNumber == 'GW0001'

基础资料字段.基础资料属性(比如申请部门.上级部门)

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.注意:需要在申请部门字段上做上级部门的属性引用

基础资料字段.辅助资料属性(比如申请部门.部门属性)

编码:F_JD_Base<>null and F_JD_Base.FDeptProperty <>null and F_JD_Base. FDeptProperty ['Number'] == 'DP02_SYS'

基础资料字段.分组属性(比如申请部门.部门分组)

编码: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'

多级引用属性做条件(比如申请部门.上级部门.部门属性)

不支持F_JD_Base.FProperty.FDeptProperty['Number']== 'DP02_SYS'多级属性引用作为条件的

标识与绑定实体属性的选择

①F_JD_Base<>null and F_JD_Base.FNumber == ‘GW0001' FNumber取的是编码的标识

②同样可以写作: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 取的是编码的绑定实体属性

④同样可以写作: F_JD_Base<>null and F_JD_Base.FProperty<>null and F_JD_Base.Fproperty['Number']== 'GW0001'

建议统一使用['Number']的格式

基础资料属性引用的作用归纳

①需要基础资料字段做属性引用,基础资料属性字段,才可以选到被引用的属性。

②实体服务规则/字段值更新事件的前置条件/赋值公式需要引用基础资料属性,否则会报错

③工作流-流程设计器-流程线/(流程节点-审批动作-参与人方案)-高级

④预算控制规则-控制单据-控制维度-字段取值来源

【反例】过滤语句与凭证模板的(科目影响因素/核算维度)取值不需要引用属性

写语句注意事项

1.符号的应用

①写条件语句,等号用==;写赋值语句用=;写过滤语句用=

②不等号可以用<>,也可以用!=

③可以用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.能做实体服务规则不做字段值更新事件,原因如下:

①满足条件即触发,不需点击触发 ②配置工作量少(以A=B+C举例)

③条件不满足亦可配置服务 ④易于后续维护与排查

4.粘贴网页/word/excel的语句到BOS编辑器,最好要通过txt文档中转,因为网页的语句可能会带有格式,导致BOS不能识别。

5.实体服务规则/字段值更新事件:A=B+C,需要在前置条件设置B==B and C==C;并且需要勾选B与C两个字段的“即时触发字段值更新事件”

6.给单据体字段赋值,需要在单据体上设置实体服务规则,或者单据体字段的字段值更新事件。不能是单据头的实体服务规则。

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'))

即时触发字段值更新事件的作用

①为字段值更新事件/实体服务规则的前置条件字段触发前置条件。

②影响新增修改单据时,数值型字段汇总到上级字段的功能实时触发更新。

③手工新增/修改单据时,在单据体底端实时统计数值型字段的汇总值。

④单选按钮组字段作为前置条件(包含字段值更新与实体服务规则),单选按钮字段需要勾选该属性才能生效。

【注意】自定义的字段,默认不勾选“即时触发字段值更新事件”。

计数遍历

len(filter(lambda x:x.FExpID<>null and x.FExpID.FName=='业务招待费', FEntity))>0

①len:计数; ②filter:过滤;③ lambda:遍历;④ x:x. 固定写法;⑤ FExpID:费用项目字段的标识;⑥ FExpID.FName:费用项目.名称的标识 ;⑦ FEntity:费用报销单的明细单据体的标识

语句大意:先使用lambda函数对FEntity单据体做遍历操作,再使用filter函数,按照FExpID<>null and FExpID.FName=='业务招待费'作为条件,将满足条件的明细行过滤出来,最后len函数对满足条件的明细行做计数统计,得到的数值与0做比较返回true或者false。

求和遍历

FExpAmountSum=sum(map(lambda x:x.FExpenseAmount, FEntity)

① FExpAmountSum :单据头汇总金额字段的标识; ② sum:求和;③ map:映射;④ lambda:遍历;⑤ x:x. 固定写法;⑥ FExpenseAmount:单据体费用金额字段的标识;⑥FEntity:费用报销单的明细单据体的标识

语句大意:先使用lambda函数对FEntity单据体做遍历操作,再使用map函数,将FExpenseAmount字段从明细行映射挑选出来组成一个新的集合;最后使用sum函数对集合里面的所有元素做求和汇总,得到的数值赋值给FExpAmountSum字段。

求和遍历 经典案例

【需求】报销单申请报销金额不能超过收票金额之和(不能超发票金额报销)

【思路】在BOS为报销单设置保存校验规则,用sum(map(lambda语句求和汇总收票单信息单据体里的收票单金额,再与单据头的申请报销金额汇总字段,做单据合法性校验大小。

【语句】sum(map(lambda x : (x.FRecInv.FSUMALLAMOUNT),FRecInvInfo))<= FReqReimbAmountSum

①FRecInvInfo:费用报销单的收票信息单据体的标识;②FRecInv:收票信息单据体的收票单字段(基础资料)的标识;③FRecInv.FSUMALLAMOUNT:收票单.价税合计的标识。

求和遍历 进阶案例

【业务场景】求和汇总费用报销单费用项目.名称=业务招待费的明细行的费用金额。

【语句1】FExpAmountSum=sum(map(lambda x:x.FExpenseAmount if FExpID<>null and FExpID.FName=='业务招待费’ else 0 , FEntity)

语句大意:先使用lambda函数对FEntity单据体做遍历操作,再使用map函数,按照FExpID<>null and FExpID.FName==‘业务招待费'作为条件,将满足条件的FExpenseAmount字段从明细行映射挑选出来(若不满足条件, FExpenseAmount字段则为0),组成一个新的集合;最后使用sum函数对集合里面的元素做相加统计,得到的数值赋值给FExpAmountSum字段。

【语句2】FExpAmountSum=sum(map(lambda(x:x.FExpenseAmount ,filter(lambda(y:y.FExpID<>null and y.FExpID.FName=='业务招待费'), FEntity))))>0

语句大意:先使用lambda函数对FEntity单据体做遍历操作,再使用filter函数,按照FExpID<>null and FExpID.FName==‘业务招待费'作为条件,将满足条件的明细行过滤出来;再使用lambda函数对这部分明细行做遍历操作;再使用map函数,将 FExpenseAmount字段从明细行映射挑选出来,组成一个新的集合;最后使用sum函数对集合里面的元素做相加统计,得到的数值赋值给FExpAmountSum字段。

拼接遍历

FCausa = '\n'.join(o for o in (set(map(lambda x:(format(x.FRemark)), FEntity))))

①FCausa :单据头事由字段的标识;②‘\n’:自动换行符;③.join:拼接;④ o for o in 固定写法;⑤ set:去重; ⑥map:映射;⑦lambda:遍历;⑧format:格式化字符串;⑨FRemark :单据体备注字段的标识;⑩ FEntity:费用报销单的明细单据体的标识

语句大意:先使用format函数对先对FRemark做格式化操作,得到纯文本。再使用lambda函数对FEntity单据体做遍历操作,再使用map函数,将格式化后的字符串从明细行映射挑选出来,组成一个新的集合;再使用set函数,对集合里的元素做去重操作,去重后按照原有的顺序组成新的集合。最后使用join函数对集合里面的元素,使用自动换行符'\n'做拼接操作,得到的字符串赋值给FCausa字段。

遍历语句注意事项

适用范围

1.支持单据头实体服务规则

2.支持表单服务策略与校验规则

3.不支持单据体实体服务规则

4.不支持字段值更新事件

多单据体遍历

不支持同时遍历多个单据体/子单据体

业务场景:同时对采购订单明细单据体的价税合计字段求和,同时对自定义的子单据体的金额字段求和,然后两者作大小比较

遍历语句 其他应用

基础资料单据体字段

如需对基础资料字段,单据体中属性进行比较,也需要使用lambda进行遍历:

【需求】判断申请人(基础资料员工)字段的任岗信息单据体上是否至少存在一行就任岗位.名称=财务经理的明细行。

【语句】len(filter(lambda x:(x['Post']['Name'].ToString() =='财务经理' ), FStaffId.PostEntity)) >0

语句说明: ①FStaffId:申请人字段的标识;② PostEntity:基础资料员工的员工任岗信息单据体的ORM实体名;③Post:基础资料员工的员工任岗信息单据体的就任岗位字段的绑定实体属性;④Name:Post的名称属性的绑定实体属性

前置条件-多选类字段

1.多选基础资料未录入:len( FMulBase )<= 0 或者 FMulBase.Count<=0

多选基础资料不为空:len( FMulBase ) > 0 或者 FMulBase.Count>0

【注意】只能是Count,不能是count或者COUNT。

多选基础资料字段包含编码为001的值:len(filter(lambda x:(x.Number=='001'),F_xkcw_MulBase))>0

多选基础资料字段不包含编码为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.有选择某一个枚举项:多选下拉列表.find('枚举项值')!=-1 没有选择某一个枚举项:多选下拉列表.find('枚举项值')==-1

是否都有勾选两个枚举项:多选下拉列表.find('枚举项值a')!=-1 and 多选下拉列表.find('枚举项值b')!=-1

是否至少有勾选两个枚举项其一:多选下拉列表.find('枚举项值a')!=-1 or 多选下拉列表.find('枚举项值b')!=-1

两个枚举项都不勾选:多选下拉列表.find('枚举项值a')==-1 and 多选下拉列表.find('枚举项值b')==-1

两个枚举项至少其一不勾选:多选下拉列表.find('枚举项值a')==-1 or 多选下拉列表.find('枚举项值b')==-1

过滤语句

过滤与高级过滤

1.基础资料字段的特有功能 2.高级过滤的过滤条件可以直接粘贴语句的 3.均支持python与sql的语法

需求分析

【需求1】在采购增值税专用发票的收票信息页签,选择发票时,只能选择到查验状态=已查验的收票单

【语句】FISEXAMINE='1'

FISEXAMINE:收票单.查验状态的标识

【需求2】在采购增值税专用发票选择物料时,只能选择到物料.默认供应商=单据头.供应商的物料。

【语句】FDefaultVendor=GetValue(FSUPPLIERID)

FDefaultVendor:物料.默认供应商的标识

FSUPPLIERID:单据头.供应商的标识

【需求5】费用报销单,想要实现:当申请部门不为空时,往来单位供应商F8,按照供应商.负责部门=申请部门做过滤;当申请部门为空时,往来单位供应商F8,不做限制。

【语句用法】case when 条件语句 then 条件满足时的过滤语句 else 条件不满足时的过滤语句 end

特点:作用类同于if…else语句

【具体语句】FDeptId=CASE WHEN (GetValue(FRequestDeptID) <>0 and GetValue(FRequestDeptID) is not null) THEN GetValue(FRequestDeptID) ELSE FDeptID END

语句缺陷

【语句缺陷】1.不管前置条件是否满足,基础资料都必须使用FDeptId属性作为过滤的依据。若是想要实现当条件不满足时,使用非FDeptId属性作为过滤的依据,就没办法实现。

2.因为select与case when结合的语句,select子查询语句只能返回1个值(select若不与case when结合,是可以返回多个值的),但是截图里的语句需要用到in,会返回多个值。所以该语句会报错不能实现需求。

【需求6】当申请人字段(基础资料员工)不为空时,岗位信息字段(基础资料岗位信息)F8开窗选择(或者模糊查询选择、快速录入)时,只可选择申请人任岗的并且没被禁用的岗位。否则,岗位信息字段能选到所有的岗位。

BOS设计器-业务字段-岗位字段的使用案例https://vip.kingdee.com/article/155401307799205376

【语句1】FPOSTID in (select FPOSTID from T_BD_STAFF where FEMPINFOID = GetValue(申请人字段的标识) 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(申请人字段的标识) AND t1.FFORBIDSTATUS = ‘A’)

【语句术语具体说明】

①T_ORG_POST:基础资料岗位信息-单据头实体岗位信息的表名。②FPOSTID:基础资料岗位信息的主键字段名/岗位信息表T_ORG_POST的Id,也就是岗位信息本身。③FPOSTID:基础资料员工任岗信息-就任岗位字段的字段名。④T_BD_STAFF:基础资料员工任岗信息-单据头实体员工信息的表名。⑤FEMPINFOID:基础资料员工任岗信息-员工字段的字段名。⑥FFORBIDSTATUS:基础资料员工任岗信息-禁用状态字段的字段名。A是未禁用。

语句逻辑具体讲解

【语句大意】1.员工任岗表T_BD_STAFF定义为t1,岗位信息表T_ORG_POST定义为t2。

2.根据t1.FPOSTID = t2.FPOSTID的匹配关系将t1表与t2表通过inner join(内拼接)语句拼接成一个新表。

3.在新表里面按照条件t1.FEMPINFOID = GetValue(申请人字段的标识) AND FFORBIDSTATUS = 'A'过滤出符合条件的记录明细。

4.在这些记录里面映射出FPOSTID字段作为元素组成一个集合。

5.单据的岗位信息字段的属性FPOSTID与该集合的元素用in语句做匹配过滤。

【需求7】当部门字段不为空时,员工字段F8开窗选择时,只可选择在部门字段下勾了负责人岗位的岗位任岗的,并且没被禁用的员工。否则,员工F8开窗选择,能选到没被禁用的所有员工。

【举例】财务部 有三个岗位(财务总监,会计,出纳),其中财务总监勾选负责人岗位。部门字段选择财务部后,再选择员工字段,只能选择员工任岗为财务总监的员工。

【语句】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')

修改枚举项名称

【需求】想要修改报销单发票类型字段的普通发票的名称,以及新增发票类型。

【错误做法】直接在BOS拓展报销单,直接修改发票类型关联的枚举类型:发票类型(财务使用)的枚举项名称,与添加新的枚举项

【后果】系统每一次升级,都会还原系统预置的枚举项名称,并且丢失新加的枚举项信息

【正确做法】参照发票类型(财务使用) ,新建一个枚举类型,与预置的枚举项值保持一致(枚举项名称可以做修改),新增枚举项。发票类型字段关联新建的枚举类型。

BOS经典案例分析

差旅费报销单BOS打开报错

【原理】出差申请单与费用申请单and差旅费报销单与费用报销单在BOS的构造上,是继承与被继承的关系,所以在费用申请单及其拓展所做的一切配置,都会同步配置在出差申请单上。反之则不然。

【具体原因】上述报错截图是由于先在出差申请单上添加了一个标识为F_UVPC_Assistant1的字段。后来在费用申请单上,又人为手工的添加了一个同样标识为F_UVPC_Assistant1的字段,由于继承与被继承的关系,在出差申请单上也会同步新增一个标识为F_UVPC_Assistant1的字段。造成了出差申请单上字段标识重复。BOS重新打开出差申请单的拓展时,触发了字段标识唯一性的校验,从而会有上述的报错。

两个字段作比较

【需求】列表过滤想要进行两个金额字段的比较,比如过滤出A字段不等于B字段的单据,如何实现?

【方法】需要BOS后台为字段A/字段B配置过滤比较符号集:200

【用途】①单据列表过滤

②数据规则授权

③凭证模板的分录行生成条件

④选单条件策略

自动下推服务

1.审核操作上自动下推服务

2.工作流的自动下推动作

3.子系统的管理参数

注意:三者只能择其一,不能重复设置

注意:自动下推是整单下推的。不能以单据体字段作为条件,控制只下推满足条件的明细行。

郭少锋 创建 2024-05-08 20:53:47 云星空
云星空 : Sql:空值 参与 条件判断 云星空 : Sql:空值 参与 条件判断 SELECT * FROM (
------------------------------------------------------------------------------------------------------------------------------------------
SELECT

FIvDate FIvDate2

,isnull(convert(nvarchar(20) ,FIvDate ,23),'') FIvDate -- 日期空值 参与 条件判断

,isnull(FIvNo ,'') FIvNo -- 文本空值 参与 条件判断

,isnull(FIvSeq ,0) FIvSeq -- 数字空值 参与 条件判断

FROM TMPB3766E7A0B7111EFACB10050563
------------------------------------------------------------------------------------------------------------------------------------------
) a1

WHERE (FIvDate>={ts'2024-02-29 00:00:00'} and FIvDate<={ts'2024-02-29 23:59:59'}) -- 等于 2024-02-29

AND (FIvDate>={ts'2024-05-06 00:00:00'} and FIvDate<{ts'2024-05-07 00:00:00'}) -- 今天 2024-05-06
AND (FIvDate>={ts'2024-05-05 00:00:00'} and FIvDate<{ts'2024-05-06 00:00:00'}) -- 昨天 2024-05-05
AND (FIvDate>={ts'2024-05-07 00:00:00'} and FIvDate<{ts'2024-05-08 00:00:00'}) -- 明天 2024-05-07
AND (FIvDate>={ts'2024-04-28 00:00:00'} and FIvDate<{ts'2024-05-05 00:00:00'}) -- 上周 2024-04-28 至 2024-05-04

AND (FIvDate>={ts'2024-05-01 00:00:00'} and FIvDate<={ts'2024-05-31 23:59:59'}) -- 月 2024-05
郭少锋 创建 2024-05-06 15:40:15 云星空
云星空 : 云星空 WebApi 查询报表数据 云星空 : 云星空 WebApi 查询报表数据 // 引用SDK组件Kingdee.BOS.WebApi.Client.dll;SDK下载地址:https://openapi.open.kingdee.com/ApiSdkCenter
var client = new K3CloudApi();
// 初始化登录认证,appID、appSec可在"第三方系统登录授权"中获取
client.InitClient("6529ff74328a55", "appID", "appSec", "userName", 2052, "100", "http://192.168.188.81/k3cloud/");
client.GetSysReportData("aGsf_240319","{"FieldKeys":"","SchemeId":"","StartRow":0,"Limit":2000,"IsVerifyBaseDataField":"true","FilterString":[],"Model":{"FDate1":"1900-01-01","FDate2":"1900-01-01"}}");

------------------------------------------------------------------------------------------------------------------------------------------
var aUrl = this.Context.ClientInfo.EntryPageUrl.ToString(); aUrl = aUrl.Substring(0, aUrl.IndexOf("k3cloud") + 8);
var aDBid = this.Context.DBId.ToString();
var aUser = "";
var aPass = "";

#region| 取得 用户密码 aUser,aPass ★ -
aSql = string.Format(@"/*dialect*/
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
select FName FUser ,FWebApi from T_SEC_user where FWebApi != '' order by FName
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
", aUserId); DynamicObjectCollection aTable2 = DBServiceHelper.ExecuteDynamicObject(this.Context, aSql);

if (aTable2.Count > 0)
{
aUser = aTable2[0]["FUser"].ToString();
aPass = aTable2[0]["FWebApi"].ToString();
}
else
{
this.View.ShowErrMessage("请打开【查询用户】 指定使用 WebApi 用户 !"); return;
}
#endregion

K3CloudApiClient k3Client = new K3CloudApiClient(aUrl);
k3Client.ValidateLogin(aDBid, aUser, aPass, 2052);

------------------------------------------------------------------------------------------------------------------------------------------
#region| aGetSysReport 查询报表数据 |
private void aGetSysReport(K3CloudApiClient k3Client)
{
#region| 查询报表 -
string aJson1 = @"
{
""FieldKeys"": ""FMaterialName,FLot_Text,FDate,FMachineName,FShiftGroupName"",
""SchemeId"": """",
""StartRow"": 0,
""Limit"": 10,
""IsVerifyBaseDataField"": ""true"",
""FilterString"": [

],
""Model"": {
""FDate1"": ""2024-03-01"",
""FDate2"": ""2024-03-31""
}
}";

string aResult1 = k3Client.GetSysReportData("aGsf_240319", aJson1); JObject aResultJObject1 = JObject.Parse(aResult1);
#endregion

#region| 读取结果 -
var aTable1 = aResultJObject1["Result"]["Rows"];

foreach (var aRow1 in aTable1) // 逐行赋值
{
string aFMaterialName = aRow1[0].Value<string>();
string aFLot_Text = aRow1[1].Value<string>();
string aFDate = aRow1[2].Value<string>();
string aFMachineName = aRow1[3].Value<string>();
string aFShiftGroupName = aRow1[4].Value<string>();
}
#endregion

}
#endregion

------------------------------------------------------------------------------------------------------------------------------------------
aFMaterialName "TPA4533-P白色造粒料" string
aFLot_Text "C24ZL050619" string
aFDate "2024-03-19" string
aFMachineName "造粒05线" string
aFShiftGroupName "白班" string

------------------------------------------------------------------------------------------------------------------------------------------
aResultJObject1 {{
"Result": {
"IsSuccess": true,
"RowCount": 95,
"Rows": [
[
"TPA4533-P白色造粒料",
"C24ZL050619",
"2024-03-19",
"造粒05线",
"白班"
],
[
"TPA4533-P白色造粒料",
"C24ZL050619",
"2024-03-19",
"造粒05线",
"夜班"
]
]
}
}}


------------------------------------------------------------------------------------------------------------------------------------------
一、请求参数说明:
1.formid:业务对象表单Id,字符串类型(必录)
2.data:JSON格式数据(详情参考JSON格式数据)(必录)
2.1.FieldKeys:需查询的字段key集合,字符串类型,格式:"key1,key2,..."(必录)注(简单账表可能存在动态字段,指定待查字段时,须确保当前查询条件的结果集中包含待查字段)
2.2.SchemeId:过滤方案内码,字符串类型
2.3.StartRow:开始行索引,整型(非必录)
2.4.Limit:最大行数,整型,不能超过10000(非必录)
2.5.IsVerifyBaseDataField:是否验证所有的基础资料有效性,布尔类,默认true(非必录)
2.6.FilterString:过滤条件,数组类型,如:[{"Left":"(","FieldName":"Field1","Compare":"67","Value":"111","Right":")","Logic":"0"},{"Left":"(","FieldName":"Field2","Compare":"67","Value":"222","Right":")","Logic":"0"}]
2.7.Model:表单数据包,JSON类型(必录)

二、返回结果:
{"Result": {"IsSuccess": true,"RowCount": 0,"Rows": [ ] }}

三、代码示例:
// 引用SDK组件Kingdee.BOS.WebApi.Client.dll;SDK下载地址:https://openapi.open.kingdee.com/ApiSdkCenter
var client = new K3CloudApi();
// 初始化登录认证,appID、appSec可在"第三方系统登录授权"中获取
client.InitClient("6529ff74328a55", "appID", "appSec", "userName", 2052, "100", "http://192.168.188.81/k3cloud/");
client.GetSysReportData("aGsf_240319","{"FieldKeys":"","SchemeId":"","StartRow":0,"Limit":2000,"IsVerifyBaseDataField":"true","FilterString":[],"Model":{"FDate1":"1900-01-01","FDate2":"1900-01-01"}}");

四、JSON格式数据:
{
"FieldKeys": "",
"SchemeId": "",
"StartRow": 0,
"Limit": 2000,
"IsVerifyBaseDataField": "true",
"FilterString": [],
"Model": {
"FDate1": "1900-01-01",
"FDate2": "1900-01-01"
}
}

五、字段说明:
起始日期:FDate1 (必填项)
截止日期:FDate2 (必填项)

参数FieldKeys显示列:
造粒料名称:FMaterialName
鑫瑞订单ID:FLot_Text
生产日期:FDate
产线:FMachineName
班次:FShiftGroupName
总投料量:FQtyInput
生产总量:FQtyProduce
合格品数量:FQtyPass
不合格品数量:FQtyUnPass
合格品累计:FQtyPassSum
不合格品累计:FQtyUnPassSum
不合格数量上限预警%:FQtyUnPassRate
批次待完成数量:FQtyRemain
行数:FRow

备注:错误代码MsgCode说明
0:默认
1:上下文丢失
2:没有权限
3:操作标识为空
4:异常
5:单据标识为空
6:数据库操作失败
7:许可错误
8:参数错误
9:指定字段/值不存在
10:未找到对应数据
11:验证失败
12:不可操作
13:网控冲突
14:调用限制
15:禁止管理员登录
郭少锋 编辑 2024-04-30 15:23:22 创建 2024-04-30 15:22:40 云星空
windows : Excel 2021 第一次编辑 单元格 会很卡 windows : Excel 2021 第一次编辑 单元格 会很卡 处理方法:开始 - 条件格式 - 清除规则 - 清除整个工作表的规则
郭少锋 创建 2024-04-18 17:20:05 windows
SQL : Sql:创建索引 SQL : Sql:创建索引 创建索引:可以提高查询的速度

CREATE INDEX Index_1 ON T_SAL_OutStockZx (FEntryIdZx ,FEntryId) -- 索引不止一个列,在括号中列出这些列的名称,用逗号隔开
CREATE INDEX Index_1 ON T_PRD_InStockZx (FEntryIdZx ,FEntryId) -- 索引不止一个列,在括号中列出这些列的名称,用逗号隔开
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
left join (select distinct FEntryIdZx ,FEntryId from T_PRD_InStockZx where FEntryId != 0) c3 on c3.FEntryIdZx = a3.FEntryIdZx -- 生产入库
left join (select distinct FEntryIdZx ,FEntryId from T_SAL_OutStockZx where FEntryId != 0) c4 on c4.FEntryIdZx = a3.FEntryIdZx -- 销售出库
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CREATE UNIQUE INDEX index_name ON table_name (column_name) -- 创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE INDEX index_name ON table_name (column_name) -- 创建一个简单的索引。允许使用重复的值

CREATE INDEX Index_Pers ON Person (LastName) -- 创建一个简单的索引,名为 "Index_Pers",在 Person 表的 LastName 列
CREATE INDEX Index_Pers ON Person (LastName DESC) -- 以降序索引某个列中的值,在列名称之后添加 DESC
CREATE INDEX Index_Pers ON Person (LastName, FirstName) -- 索引不止一个列,在括号中列出这些列的名称,用逗号隔开
郭少锋 编辑 2024-04-18 16:55:22 创建 2024-04-18 16:41:08 SQL
SQL : Sql:修复数据表 SQL : Sql:修复数据表 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
delete from t_Balance where FYear = 2024 and FPeriod = 4

内部查询处理器错误:查询处理器在执行过程中遇到意外错误。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DBCC CHECKDB ('AIS20171115092420')

alter database AIS20171115092420 set single_user with rollback immediate

DBCC CHECKTABLE ('AIS20171115092420..t_Balance',repair_rebuild)
DBCC CHECKTABLE ('AIS20171115092420..t_ProfitAndLoss',repair_rebuild)
DBCC CHECKTABLE ('AIS20171115092420..ICInvBal',repair_rebuild)

alter database AIS20171115092420 set multi_user with rollback immediate
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DBCC CHECKDB ('AIS20171115092420')

表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
CHECKDB 在表 't_Balance' (对象 ID 1019866700)中发现 0 个分配错误和 12 个一致性错误。

表错误: 对象 ID 1067866871,索引 ID 1,分区 ID 351458699968512,分配单元 ID 351458699968512 (类型为 In-row data)。页 (1:70888) 缺少上一页 (1:62734) 对它的引用。可能是因为链链接有问题。
CHECKDB 在表 't_ProfitAndLoss' (对象 ID 1067866871)中发现 0 个分配错误和 1 个一致性错误。

表错误: 表 'ICInvBal' (ID 1293299717)。索引 'pk_ICInvBal' (ID 2)中的索引行与任何数据行都不匹配。可能是以下行的多余或无效的键:
表错误: 表 'ICInvBal' (ID 1293299717)。索引 'idx_ICInvBal_FMTONo' (ID 3)中的索引行与任何数据行都不匹配。可能是以下行的多余或无效的键:
CHECKDB 在表 'ICInvBal' (对象 ID 1293299717)中发现 0 个分配错误和 2 个一致性错误。

CHECKDB 在数据库 'AIS20240416130543' 中发现 0 个分配错误和 15 个一致性错误。
对于由 DBCC CHECKDB (AIS20240416130543)发现的错误,repair_rebuild 是最低的修复级别。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DBCC CHECKTABLE ('t_Balance',repair_rebuild)

t_Balance的 DBCC 结果。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。
修复: 已成功地修复了数据库 'AIS20171115092420' 的索引 'dbo.t_Balance, ix_Balance_1'中的 inserted 行。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:19)由(FAccountID = 1198 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0)标识,索引值为 'FAccountID = 1198 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:20)由(FAccountID = 1198 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0)标识,索引值为 'FAccountID = 1198 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:21)由(FAccountID = 1199 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0)标识,索引值为 'FAccountID = 1199 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:22)由(FAccountID = 1199 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0)标识,索引值为 'FAccountID = 1199 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:23)由(FAccountID = 1201 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0)标识,索引值为 'FAccountID = 1201 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:24)由(FAccountID = 1201 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0)标识,索引值为 'FAccountID = 1201 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:25)由(FAccountID = 1202 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0)标识,索引值为 'FAccountID = 1202 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:26)由(FAccountID = 1202 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0)标识,索引值为 'FAccountID = 1202 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:27)由(FAccountID = 1203 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0)标识,索引值为 'FAccountID = 1203 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:28)由(FAccountID = 1203 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0)标识,索引值为 'FAccountID = 1203 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:29)由(FAccountID = 1204 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0)标识,索引值为 'FAccountID = 1204 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 0 and FDetailID = 0'。

消息 8951,级别 16,状态 1,第 2 行
表错误: 表 't_Balance' (ID 1019866700)。数据行在索引 'ix_Balance_1' (ID 2)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。

消息 8955,级别 16,状态 1,第 2 行
数据行(1:70882:30)由(FAccountID = 1204 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0)标识,索引值为 'FAccountID = 1204 and FYear = 2024 and FPeriod = 4 and FCurrencyID = 1 and FDetailID = 0'。

对象 't_Balance' 的 852 页中有 38985 行。
CHECKTABLE 在表 't_Balance' (对象 ID 1019866700)中发现 0 个分配错误和 12 个一致性错误。
CHECKTABLE 在表 't_Balance' (对象 ID 1019866700)中修复了 0 个分配错误和 12 个一致性错误。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
t_ProfitAndLoss的 DBCC 结果。
修复: 已为数据库 'AIS20171115092420' 中的对象 'dbo.t_ProfitAndLoss' 成功地重新生成了 Clustered 索引。
修复: 已为数据库 'AIS20171115092420' 中的对象 'dbo.t_ProfitAndLoss, ix_ProfitAndLoss_1' 成功地重新生成了 Nonclustered 索引。
修复: 已为数据库 'AIS20171115092420' 中的对象 'dbo.t_ProfitAndLoss, ix_ProfitAndLoss_2' 成功地重新生成了 Nonclustered 索引。
修复: 已为数据库 'AIS20171115092420' 中的对象 'dbo.t_ProfitAndLoss, ix_ProfitAndLoss_3' 成功地重新生成了 Nonclustered 索引。

消息 8945,级别 16,状态 1,第 2 行
表错误: 将重新生成对象 ID 1067866871,索引 ID 1。
该错误已修复。

消息 8978,级别 16,状态 1,第 2 行
表错误: 对象 ID 1067866871,索引 ID 1,分区 ID 351458699968512,分配单元 ID 351458699968512 (类型为 In-row data)。页 (1:70888) 缺少上一页 (1:62734) 对它的引用。可能是因为链链接有问题。
该错误已修复。

消息 8945,级别 16,状态 1,第 2 行
表错误: 将重新生成对象 ID 1067866871,索引 ID 2。
该错误已修复。

消息 8945,级别 16,状态 1,第 2 行
表错误: 将重新生成对象 ID 1067866871,索引 ID 3。
该错误已修复。

消息 8945,级别 16,状态 1,第 2 行
表错误: 将重新生成对象 ID 1067866871,索引 ID 4。
该错误已修复。

对象 't_ProfitAndLoss' 的 54 页中有 4318 行。
CHECKTABLE 在表 't_ProfitAndLoss' (对象 ID 1067866871)中发现 0 个分配错误和 1 个一致性错误。
CHECKTABLE 在表 't_ProfitAndLoss' (对象 ID 1067866871)中修复了 0 个分配错误和 1 个一致性错误。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ICInvBal的 DBCC 结果。
修复: 已为数据库 'AIS20171115092420' 中的对象 'dbo.ICInvBal, pk_ICInvBal' 成功地重新生成了 Nonclustered 索引。
修复: 已为数据库 'AIS20171115092420' 中的对象 'dbo.ICInvBal, idx_ICInvBal_FMTONo' 成功地重新生成了 Nonclustered 索引。

消息 8952,级别 16,状态 1,第 3 行
表错误: 表 'ICInvBal' (ID 1293299717)。索引 'pk_ICInvBal' (ID 2)中的索引行与任何数据行都不匹配。可能是以下行的多余或无效的键:
该错误已修复。

消息 8956,级别 16,状态 1,第 3 行
索引行(1:66253:119)的值为(FItemID = 289 and FStockID = 294 and FStockInDate = '' and FYear = 2024 and FPeriod = 3 and FBatchNo = '' and FStockPlaceID = 0 and FKFPeriod = 0 and FKFDate = '' and FAuxPropID = 0 and FBillInterID = 0 and FMTONo = '' and FSupplyID = 0 and UNIQUIFIER = 72),指向由(FItemID = 289 and UNIQUIFIER = 72)标识的数据行。

消息 8952,级别 16,状态 1,第 3 行
表错误: 表 'ICInvBal' (ID 1293299717)。索引 'idx_ICInvBal_FMTONo' (ID 3)中的索引行与任何数据行都不匹配。可能是以下行的多余或无效的键:
该错误已修复。

消息 8956,级别 16,状态 1,第 3 行
索引行(1:49928:224)的值为(FMTONo = '' and FItemID = 289 and UNIQUIFIER = 72),指向由(FItemID = 289 and UNIQUIFIER = 72)标识的数据行。

对象 'ICInvBal' 的 45 页中有 524 行。
CHECKTABLE 在表 'ICInvBal' (对象 ID 1293299717)中发现 0 个分配错误和 2 个一致性错误。
CHECKTABLE 在表 'ICInvBal' (对象 ID 1293299717)中修复了 0 个分配错误和 2 个一致性错误。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
错误代码:3631(E2FH)
Source :Microsoft OLE DB Provider for SQL Server
Detail :违反了 PRIMARY KEY 约束 'pk_Balance'。不能在对象 'dbo.t_Balance' 中插入重复键。

错误代码:3631(E2FH)
Source :Microsoft OLE DB Provider for SQL Server
Detail :违反了 PRIMARY KEY 约束 'pk_ProfitAndLoss'。不能在对象 'dbo.t_ProfitAndLoss' 中插入重复键。

delete from t_Balance where FYear = 2024 and FPeriod = 4
delete from t_ProfitAndLoss where FYear = 2024 and FPeriod = 4

select * from t_Balance where FYear = 2024 and FPeriod = 4
select * from t_ProfitAndLoss where FYear = 2024 and FPeriod = 4
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
郭少锋 编辑 2024-04-16 20:25:07 创建 2024-04-16 19:29:20 SQL
云星空 : Sql:参数设置 云星空 : Sql:参数设置 SQL:BatchStarting: 是 SQL Server Profiler 中的一个事件,它指示一个新的 SQL 批处理正在开始执行。当 SQL Server 开始执行一个新的批处理时,它会生成此事件。批处理可以包含一个或多个 SQL 语句,它们将作为一个单独的单元执行。在 Profiler 或 Extended Events 中捕获这个事件可以帮助你跟踪和分析 SQL Server 中正在执行的查询或操作。
SQL:BatchCompleted: 是 SQL Server Profiler 中的一个事件。当 SQL Server 完成执行一个 SQL 批处理(Batch)时,会生成这个事件。这个事件的产生意味着整个 SQL 批处理已经执行完毕,并且可以包含一个或多个 SQL 语句。
在 SQL Server Profiler 中,可以使用这个事件来跟踪查询和批处理的执行情况。SQL:BatchCompleted 事件提供了关于查询执行时间、影响的行数、执行计划等信息,对于监视数据库的性能和查询执行情况非常有用。通过分析这个事件,你可以了解到 SQL 语句的执行效率、执行计划以及可能存在的性能瓶颈。

SET NO_BROWSETABLE ON :
是 SQL Server 中的一个选项,它用于指示数据库引擎在执行查询时不要返回任何结果集。
这个选项通常用于阻止返回结果,只执行对数据的更改或操作。

当你设置 NO_BROWSETABLE 为 ON 时,执行查询将不会返回结果集,即使查询本身会生成结果。
这在某些情况下可能是有用的,特别是当你只对修改数据感兴趣,而不是获取结果集时。
要记住的是,启用此选项后,你将无法看到由查询生成的结果,因此需谨慎使用,以免导致不必要的数据丢失或错误。

SET FMTONLY ON:
是针对 SQL Server 的一个 T-SQL 语句,
用于在执行 Transact-SQL 批处理时,只返回查询的元数据(Metadata)信息,而不返回实际的数据记录。
这个语句在某些情况下很有用,特别是在需要检查查询语句生成的结果集的结构,但并不需要实际返回数据的情况下。

当执行 SET FMTONLY ON 后,SQL Server 会模拟执行查询语句,分析其数据的结构,但不会执行实际的查询操作。
这样可以快速获取查询的元数据,例如列名、数据类型等信息,而不必等待整个查询执行完毕返回数据。
这个语句的典型使用场景是在开发和调试过程中,当你需要检查一个查询返回的列的数据类型或者结构是否符合预期时。
但需要谨慎使用,因为它仅返回空的结果集,并且有时可能会导致误解或错误的结果,特别是当查询依赖于实际的数据来进行一些操作时。

NOLOCK: 是 SQL Server 中用于指定不使用共享锁(Shared Lock)的查询提示。它允许查询在读取数据时不加锁,以提高并发性能。在 SQL 查询中使用 NOLOCK 提示时,查询将不会等待其他事务释放其持有的锁,这可能会导致读取未提交的数据(脏读)或者读取到尚未提交的修改。
使用 NOLOCK 查询提示时需要注意以下几点:
读取未提交的数据:由于不使用锁机制,可能会读取到尚未提交的数据。这意味着查询结果可能包含其他事务尚未提交的修改,可能导致不一致的结果。
可能导致幻读和不可重复读:尽管 NOLOCK 可以提高并发性能,但在并发情况下,可能会导致幻读(Phantom Reads)或不可重复读(Non-repeatable Reads)等问题,因为数据在查询期间可能被其他事务修改。
应用场景:通常在对一致性要求不高,或者对数据最新性要求不严格的场景下才会使用 NOLOCK,比如一些报表查询或数据仅用于参考而不用于重要业务逻辑的情况。

Audit Login: 在 SQL Server 中,你可以使用 SQL Server Audit 来审计登录事件。SQL Server Audit 是一种功能强大的工具,可以跟踪和记录数据库服务器上发生的各种事件,包括登录、查询、更改、删除等操作。

SET QUOTED_IDENTIFIER ON: 是 SQL Server 中的一个语句,用于设置在标识符(如表名、列名、存储过程名等)中使用双引号作为标识符定界符。在使用 QUOTED_IDENTIFIER ON 的情况下,双引号表示标识符,而单引号则用于字符串。
当 QUOTED_IDENTIFIER 设置为 ON 时,SQL Server 将遵循 ANSI SQL 标准,强制要求使用双引号将标识符括起来。

SET ARITHABORT OFF: 用于控制当运算发生错误时,是否引发错误并中止查询。通常情况下,ARITHABORT 默认是启用的(ON)。当它被设置为 OFF 时,一些情况下会改变 SQL Server 引擎的行为。
当 ARITHABORT 设置为 OFF 时,在某些情况下,即使计算出现错误(如除以零),SQL Server 也不会引发错误,而是返回 NULL 或者特定的错误代码。
当 ARITHABORT 设置为 ON 时,默认行为是在发生错误时引发错误并中止查询。这有助于保持数据的完整性,并且可以防止不可预知的行为。
一般来说,默认情况下,最好将 ARITHABORT 设置为 ON,这样可以确保查询的可靠性和一致性。只有在特殊情况下,需要处理不同的错误处理策略或者与其他数据库交互时,才会考虑手动设置 ARITHABORT

SET NUMERIC_ROUNDABORT OFF: 是 SQL Server 中的一个语句,用于控制在发生数据类型转换时是否引发错误。
当 NUMERIC_ROUNDABORT 设置为 OFF 时,如果数据类型转换导致了数据的精度损失(例如,将浮点数转换为整数时会导致小数部分丢失),SQL Server 不会引发错误,而是尝试执行转换并返回结果。这样的话,在一些情况下,即使有精度损失,也不会中止查询或抛出异常。
然而,默认情况下 NUMERIC_ROUNDABORT 是启用的(ON),这意味着当进行数值型数据转换时,如果转换导致了精度丢失,SQL Server 将引发错误并中止查询,以确保数据的完整性和一致性。
通常建议保持 NUMERIC_ROUNDABORT 设置为默认值 ON,这有助于保持数据的准确性和完整性。只有在特殊情况下,需要对精度损失的处理进行不同的设置时,才会考虑手动设置 NUMERIC_ROUNDABORT 为 OFF。

SET ANSI_WARNINGS ON: 用于控制在执行 SQL 查询时是否引发 ANSI 标准警告。
当 ANSI_WARNINGS 设置为 ON 时,SQL Server 将遵循 ANSI 标准,对于一些警告性质的情况(比如截断数据、除零等),会引发警告或者错误,以确保数据的完整性和一致性。
举例来说,在执行某些操作时,如果出现数据截断(将一个值赋给过小的列,导致数据丢失),SQL Server 会引发警告或者错误,中止相关的操作。
默认情况下,ANSI_WARNINGS 是启用的(ON),这有助于保持 SQL 查询的规范性和数据的完整性。只有在某些情况下,你确信了解并且需要忽略某些警告时,才会考虑手动将 ANSI_WARNINGS 设置为 OFF。不过,这种操作需要慎重考虑,因为可能会影响数据的准确性和完整性。

SET ANSI_PADDING ON: 用于控制对于在拼接和比较字符列时的填充方式。
当 ANSI_PADDING 设置为 ON 时,SQL Server 将遵循 ANSI 标准,在使用 CREATE TABLE 或 ALTER TABLE 语句创建或更改表时,使用 ANSI_PADDING 设置为 ON 的情况下,字符列的存储和比较会保留尾部的空格。也就是说,在插入数据时,如果字符串末尾有空格,将会被保留,而不会被截断。
默认情况下,ANSI_PADDING 是启用的(ON),这意味着 SQL Server 将按照 ANSI 标准处理字符列的填充方式。
只有在某些情况下,你确实需要关闭 ANSI 标准的字符列填充行为时,才会考虑手动将 ANSI_PADDING 设置为 OFF。不过,在大多数情况下,最好保持默认设置以确保与 ANSI 标准的兼容性和一致性。

SET ANSI_NULLS ON:用于控制在比较或处理 NULL 值时的行为。
当 ANSI_NULLS 设置为 ON 时,SQL Server 将按照 ANSI 标准处理 NULL 值。在此模式下:
使用等号(=)进行比较时,NULL 不能与任何值相等,包括其他的 NULL。
在聚合函数中,如 COUNT、SUM、AVG 等,将不会包括 NULL 值。
默认情况下,ANSI_NULLS 是启用的(ON),这意味着 SQL Server 将按照 ANSI 标准处理 NULL 值的比较。
只有在某些特殊情况下,你确实需要修改 NULL 值的比较行为时,才会考虑手动将 ANSI_NULLS 设置为 OFF。但是,要谨慎使用,因为修改 ANSI NULL 行为可能导致查询结果与预期不符。

SET CONCAT_NULL_YIELDS_NULL ON: 用于控制在连接字符串时,如果其中有 NULL 值是否返回 NULL。
当 CONCAT_NULL_YIELDS_NULL 设置为 ON 时,在字符串连接时,如果其中一个操作数是 NULL,整个连接表达式的结果将会是 NULL。
默认情况下,CONCAT_NULL_YIELDS_NULL 是启用的(ON)。这意味着如果你试图将一个字符串与 NULL 连接,结果将会是 NULL。

SET IMPLICIT_TRANSACTIONS OFF: 用于控制隐式事务的开启和关闭。
当 IMPLICIT_TRANSACTIONS 设置为 OFF 时,SQL Server 不会自动将每个语句包装在事务中。这意味着每个语句将在自己的事务上下文中执行,并且需要显式地使用 BEGIN TRANSACTION 开启事务,以及使用 COMMIT 或 ROLLBACK 明确地提交或回滚事务。
默认情况下,IMPLICIT_TRANSACTIONS 是禁用的(OFF)。这意味着不会自动开启隐式事务,每个语句都会在自己的事务上下文中执行。
开启隐式事务可能会导致一些意外的结果和行为,因此在大多数情况下,最好保持默认设置,显式地控制事务的开启和关闭,以确保更好地控制事务的边界和行为。

SET LANGUAGE: 是 SQL Server 中的一个语句,用于设置当前会话的语言环境。在 SQL Server 中,它可以影响日期格式、语言相关的错误消息、排序规则等。
SET LANGUAGE 'us_english' 用于将当前会话的语言设置为美国英语。这会影响到在该会话中所执行的一些语言相关的操作,比如日期格式的显示,一些语言相关的错误消息等。
这个语句会将当前会话的语言环境设置为指定的语言,从而影响到会话中执行的一些语言相关的操作和结果显示。

SET DATEFORMAT: 是 SQL Server 中用于设置日期格式的语句,用于指定解释日期字符串的格式。SET DATEFORMAT 'mdy' 会将当前会话的日期格式设置为月/日/年的格式。
在这种设置下,如果你输入一个日期字符串,SQL Server 将按照月/日/年的顺序解释该日期。例如,日期字符串 '01/02/2023' 将被解释为 2023 年 1 月 2 日。
这个设置只影响日期字符串的解释方式,并不影响数据的存储或内部表示。它仅决定了在输入日期时 SQL Server 应该如何解释这些日期。

SET DATEFIRST: 是 SQL Server 中用于设置每周的第一天的语句。默认情况下,SQL Server 将周的第一天设置为 Sunday(7),这与美国常见的习惯一致。
通过 SET DATEFIRST 7 可以显式地将每周的第一天设置为 Sunday(7)。这样,当你执行类似于 DATEPART(WEEKDAY, '2023-12-31') 这样的查询时,它将返回 1,因为 '2023-12-31' 是一周中的第一天,而在 DATEFIRST 设置为默认值 7(Sunday)时,它被认为是一周中的第一天。
这个设置可以影响与日期和周相关的计算,例如,确定一周的开始或者计算日期的周数等。


SET TRANSACTION ISOLATION LEVEL READ COMMITTED: 是 SQL Server 中用于设置事务隔离级别的语句。
READ COMMITTED 是 SQL Server 默认的事务隔离级别。这个级别的含义是:一个事务可以读取到其他已经提交的事务所做的更改,但不能读取到其他事务未提交的更改。它确保了每个事务都只能读取到已提交的数据,并且可以避免脏读(读取到未提交的数据)。
设置事务隔离级别可以在事务开始之前或者在事务内部进行。使用 SET TRANSACTION ISOLATION LEVEL 可以根据需要设置不同的隔离级别,比如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 或 SERIALIZABLE 等。
注意,更高的隔离级别通常会带来更高的数据完整性和一致性,但可能会降低并发性能。因此,在选择事务隔离级别时,需要考虑到系统的要求和性能之间的平衡。

COMMIT TRAN:用于提交事务的命令。当你执行一系列的数据库操作,并希望将这些操作永久地应用到数据库时,你可以使用 COMMIT TRAN 命令来提交事务。
在执行 COMMIT TRAN 后,SQL Server 将会把你在事务中所做的修改永久地保存到数据库中,并释放这个事务所持有的数据库锁。这样其他事务就可以访问这些修改了。
需要注意的是,COMMIT TRAN 只适用于处于已经启动的事务中,它表示你已经完成了这个事务的操作,并且希望将这些操作永久应用到数据库中。

@@TRANCOUNT: 是 SQL Server 中的一个系统函数,用于返回当前会话中活动的事务数量。它返回一个整数值,表示当前事务的嵌套级别。
当执行一个事务时,@@TRANCOUNT 的值会增加。每次执行 BEGIN TRANSACTION 语句,@@TRANCOUNT 的值会增加1。而每次执行 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION,@@TRANCOUNT 的值会减少1。
这个函数对于检查当前会话中是否有未完成的事务或者确定事务的嵌套级别非常有用。当 @@TRANCOUNT 的值为 0 时,表示当前会话中没有活动的事务。

@@SPID 是一个系统函数,用于返回当前会话的进程 ID(SPID)。每个连接到 SQL Server 的会话都有一个唯一的 SPID,它用于标识每个连接的客户端进程。
通过执行 SELECT @@SPID; 可以获取当前会话的 SPID,它是一个数字值,代表当前连接的唯一标识符。这个标识符在处理连接、跟踪和诊断问题时非常有用,特别是在监视和追踪数据库活动时。
郭少锋 创建 2024-04-15 17:23:03 云星空