系统运维.数据库.修改元数据XML

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

系统运维.数据库.修改元数据XML

【应用场景】

元数据出了状况,BOSIDE已经无法正常打开元数据设计界面或者XML界面,已经无法通过BOSIDE修改元数据。此时,为了修复该元数据,使得其能再次在BOSIDE中打开,可以通知直接数据库修改XML的方式处理。

【警告】执行SQL语句更新前,请先备份账套或者备份数据表。



【案例演示】

采购订单,新增文本字段1,文本字段2,通过SQL将文本字段2从元数据XML中移除。


实现步骤

<1>BOSIDE扩展采购订单,新增文本字段1,文本字段2。


<2>数据库查询下对应采购订单扩展的元数据。

SELECT * FROM T_META_OBJECTTYPE WHERE FID='3a9178d4-26c3-4497-b8ae-38a66f26b15b';


<3>根据元数据XML节点结构,编写更新SQL,并执行该SQL。

-- 删除字段

UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('delete /FormMetadata/BusinessInfo/BusinessInfo/Elements/TextField[1]') WHERE FID='3a9178d4-26c3-4497-b8ae-38a66f26b15b'; 

-- 删除字段的外观

UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('delete /FormMetadata/LayoutInfos/LayoutInfo/Appearances/TextFieldAppearance[1]') WHERE FID='3a9178d4-26c3-4497-b8ae-38a66f26b15b';


--【tips】SQL中的下标是指元素在节点下的索引,从1开始。


<4>执行成功后,再次检查元数据。

---------------------------------------------------------------------------------------------------------

【更多写法示例】

-- 修改用户参数的某个参数值

UPDATE T_BAS_USERPARAMETER SET FPARAMETERS.modify('replace value of (/BillUserParameter/FAutoSaveLayout/text())[1] with "True"') WHERE FPARAMETEROBJID='PUR_PurchaseOrder' AND FKEY='UserParameter' AND FUSERID=100008

-- 删除用户参数的某个参数值

UPDATE T_BAS_USERPARAMETER SET FPARAMETERS.modify('delete /BillUserParameter/FAutoSaveLayout') WHERE FPARAMETEROBJID='PUR_PurchaseOrder' AND FKEY='UserParameter' AND FUSERID=100008


--修改元数据中的第一个基础资料属性字段的Key

UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('replace value of (/FormMetadata/BusinessInfo/BusinessInfo/Elements/BasePropertyField/Key/text())[1] with "F_Jac_BaseProperty555"') 

WHERE FID='ca76da0a-8811-41f5-849d-a46bb5a8d327'


--修改元数据中的第一个基础资料属性字段的外观Key

UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('replace value of (/FormMetadata/LayoutInfos/LayoutInfo/Appearances/BasePropertyFieldAppearance/Key/text())[1] with "F_Jac_BaseProperty555"') 

WHERE FID='ca76da0a-8811-41f5-849d-a46bb5a8d327'


--修改元数据中的第二个基础资料属性字段的Key

UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('replace value of (/FormMetadata/BusinessInfo/BusinessInfo/Elements/BasePropertyField[2]/Key/text())[1] with "F_Jac_BaseProperty888"') 

WHERE FID='ca76da0a-8811-41f5-849d-a46bb5a8d327'


--修改元数据中的第二个基础资料属性字段的外观Key

UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('replace value of (/FormMetadata/LayoutInfos/LayoutInfo/Appearances/BasePropertyFieldAppearance[2]/Key/text())[1] with "F_Jac_BaseProperty888"') 

WHERE FID='ca76da0a-8811-41f5-849d-a46bb5a8d327'



---------------------------------------------------------------------------------------------------------

https://blog.csdn.net/beyondqd/article/details/8217704

/*------------------------------------------------------------------------------------------------------------------   

modify() 方法是使用 XML DML 语句在 XML 数据中插入、更新或删除节点。

语法:modify (XML_DML) XML_DML 是 XML 数据操作语言 (DML) 中的字符串。

XML DML 将下列区分大小写的关键字添加到 XQuery 中:

insert --添加

delete --删除

replace value of --更新

------------------------------------------------------------------------------------------------------------------*/


DECLARE @x XML 

SET @x='

<root>

  <rogue id="001">

    <hobo id="1">

      <name>彪</name>

      <type>流氓</type>

    </hobo>

  </rogue>

</root>'



------------------------------------------------------插入------------------------------------------------------------

--在 hobo 节点下插入 一个新节点

SET @x.modify('

insert <nickname>阿彪</nickname>

as first

into (/root/rogue/hobo)[1]

');


SELECT @x

--注释:如果某节点下面有多个节点的时候可以使用 as first 或 as last 来指定所需的新节点添加位置。



---在指定的 hobo 节点下,插入同一级节点

SET @x.modify('

insert <id>1</id>

before (/root/rogue/hobo)[1]

');


SELECT @x

--注释:是用 before 或者 after 关键字代替 into 在指定节点的 前面 或者 后面 插入同级节点

--after 关键字 和 before 关键字不能用于插入属性



--插入属性 一次插入多个属性值/使用变量/属性定位

DECLARE @a INT =5

SET @x.modify('           

insert (

            attribute a {sql:variable("@a")},

            attribute b {".5"}          

 

)     

into   (/root/rogue/hobo[@id=1])[1]

');   

        

SELECT @x;           

GO

----------------------------------------------------删除------------------------------------------------------------

DECLARE @x XML 

SET @x='

<?Instructions for=TheWC.exe ?> 

<root>

  <rogue id="001">

    <hobo id="1" weight="80" age="25">

      <name>彪</name>

      <type>流氓</type>

      <nickname>阿彪</nickname>

      <notes />

    </hobo>

    <page_hotspots />

  </rogue>

  <notes />

</root>'

-- 删除属性

SET @x.modify('

  delete /root/rogue/hobo/@id

')


SELECT @x



-- 删除节点

SET @x.modify('

  delete /root/rogue/hobo/name[1]

')


SELECT @x



-- 删除节点内容

SET @x.modify('

  delete /root/rogue/hobo/type/text()

')


SELECT @x



-- 删除所有处理指令

SET @x.modify('

  delete //processing-instruction()

')


SELECT @x



-- 删除所有的内容为空的节点

SET @x.modify('

delete //*[empty(./*)]

')


SELECT @x



----------------------------------------------------修改------------------------------------------------------------

DECLARE @x XML 

SET @x='

<root>

  <rogue id="001">

    <hobo id="1" weight="80" age="25">

      <name>彪</name>

      <type>流氓</type>

      <nickname>阿彪</nickname>

    </hobo>

  </rogue>

</root>'

-- 在修改语法当中 每次只能修改一个单个节点,不能批量修改或者一次修改多个值,这一点是比较郁闷的



-- 修改节点值

SET @x.modify('

  replace value of (/root/rogue/hobo/name/text())[1]

  with     "光辉"

')


SELECT @x



-- 修改属性值

SET @x.modify('

  replace value of (/root/rogue/hobo/@weight)[1]

  with     "70"

')


SELECT @x



-- 使用 if 表达式

SET @x.modify('

  replace value of (/root/rogue/hobo/@age)[1]

  with (

       if (count(/root/rogue/hobo/*) > 2) then

         "30"

       else

         "10"

      )

')


SELECT @x



------------------------------------------------------一些示例------------------------------------------------------------


-- 1

DECLARE @x1 XML

SELECT @x1 = '

<rogue>

    <hobo name="彪"/>

    <hobo name="光辉"/>

    <hobo name="小D"/>

    <hobo name="野子"/>

</rogue>'



------------------------------------------------------------

-- 把  小D  移动到 彪 前面

------------------------------------------------------------

SET @x1.modify('

    insert /rogue/hobo[@name="小D"] 

    before (/rogue/hobo[@name="彪"])[1]

    ')


SET @x1.modify ('

        delete (/rogue/hobo[@name="小D"])[2]

    ')


SELECT @x1



---------- --------------------------------------------------

-- 把 光辉 移动到 野子 后面

------------------------------------------------------------

SET @x1.modify('

    insert /rogue/hobo[@name="光辉"] 

    after (/rogue/hobo[@name="野子"])[1]

    ')


SET @x1.modify ('

        delete (/rogue/hobo[@name="光辉"])[1]

    ')


SELECT @x1



------------------------------------------------------------

-- 把 野子 向前移动一级

------------------------------------------------------------

SET @x1.modify('

    insert /rogue/hobo[@name="野子"] 

    before (/rogue/hobo[. << (/rogue/hobo[@name="野子"])[1]])[last()]

    ')


SET @x1.modify ('

        delete /rogue/hobo[@name="野子"] 

        [. is (/rogue/hobo[@name="野子"])[last()]]

    ')


SELECT @x1

------------------------------------------------------------

-- 把 彪  向后 移一级

------------------------------------------------------------

set @x1.modify('

    insert /rogue/hobo[@name="彪"] 

    before (/rogue/hobo[. >> (/rogue/hobo[@name="彪"])[1]])[2]

    ')

SELECT @x1

SET @x1.modify ('

        delete (/rogue/hobo[@name="彪"])[1]

    ')


SELECT @x1



------------------------------------------------------------

-- 使用变量修改属性名称

------------------------------------------------------------

DECLARE @x2 XML

SELECT @x2 = '

<Employees>

  <Employee FirstName="Jacob" MiddleName="V" LastName="Sebastian"/>

</Employees>'



DECLARE @var VARCHAR(20)

DECLARE @val VARCHAR(20)


SELECT @var = 'MiddleName'

SELECT @val = 'J'


SET @x2.modify('

    replace value of (

        /Employees/Employee/@*[local-name()=sql:variable("@var")]

    )[1]

    with sql:variable("@val")

')


SELECT @x2

---------------------------------------------------------------------------------------------------------













【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

系统运维.数据库.修改元数据XML

【应用场景】元数据出了状况,BOSIDE已经无法正常打开元数据设计界面或者XML界面,已经无法通过BOSIDE修改元数据。此时,为了修复该元数据...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息