Parse the XML file through a stored procedure and save it to the database

In fact, I have a little knowledge of the whole process. Compared with the interface that an older brother in the group has implemented, I wrote it according to the gourd drawing... I
will make a small summary of the problems that may not be useful to the judges, count me One of your own work records.
The XML file is as follows
. The file name here is IN_PUT-CLASSSETCODE ='EKPO'.

<?xml version="1.0" encoding="utf-16" ?>						
<xmldata>						
	<item>						
		<detailsItem>
			<MANDT />
			<ZGUID />
			<EBELN>4500055609</EBELN>
			<EBELP>00010</EBELP>
			<RETPO />
			<IDNLF />
			<ZHTHXM>00000</ZHTHXM>
			<AEDAT>20190522</AEDAT>
			<ERNAM>CHENR</ERNAM>
			<MATNR>000000000000003000</MATNR>
			<TXZ01>Raw Material</TXZ01>
			<MATKL>20402</MATKL>
			<MENGE>10.000</MENGE>
			<NETPR>50.00</NETPR>
			<PEINH>1</PEINH>
			<NETWR>500.00</NETWR>
			<WAERS>CNY</WAERS>
			<PSTYP>0</PSTYP>
			<MSGGUID>00000000000000000000000000000000</MSGGUID>
			<ZMSGTYPE />
			<ZSDATE>00000000</ZSDATE>
			<ZSTIME>000000</ZSTIME>
			<ZRDATE>00000000</ZRDATE>
			<ZRTIME>000000</ZRTIME>
			<ZZCODE />
			<ZZMESSAGE />
		</detailsItem>
	</item>
</xmldata>

The stored procedure code is as follows:

USE 数据库名
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		
-- Create date: 
-- Description:	
-- =============================================
ALTER PROCEDURE  存储过程名(
	@strXML text, /*<?xml version="1.0" encoding="gb2312"?><'xmldata><item><detailsItem>.</detailsItem>.<detailsItem>.</detailsItem></item>
																	<item><detailsItem>.</detailsItem></item>.</xmldata>*/
	@DataType VARCHAR(20)
)
AS 

BEGIN
DECLARE @hdoc int
if @DataType='EKPO'--销售合同主数据订单
begin

drop table #临时表
create table #临时表(
--日期类型,数字类型数据用nvarchaer表示
TBID nvarchar(40) not null,--自建数据id列
EBELN nvarchar(10) default '',--采购凭证号
EBELP int default 0,--采购凭证的项目编号
RETPO nvarchar(10) default '',--退货项目
IDNLF nvarchar(35) default '',--供应商使用的物料编号
ZHTHXM int default 0,--合同行项目号
AEDAT nvarchar(20) default '',--采购凭证项目更改日期
--------------AEDAT date default getdate(),--采购凭证项目更改日期 
ERNAM nvarchar(20) default '',--创建对象的人员名称
MATNR nvarchar(20) default '',--物料号
TXZ01 nvarchar(40) default '',--短文本
MATKL nvarchar(20) default '',--物料组
MENGE nvarchar(20) default '',--采购订单数量   
NETPR nvarchar(20) default '',--采购凭证中的净价(以凭证货币计)
PEINH nvarchar(20) default '',--价格单位
NETWR nvarchar(20) default '',--采购订单货币的订单净值
WAERS nvarchar(10) default '',--货币代码
PSTYP nvarchar(10) default '',--采购凭证中的项目类别
);
--将SAP文件解析,并将数据插入到临时表中

EXEC sp_xml_preparedocument @hdoc OUTPUT, @strXML
print(@hdoc)
INSERT INTO #CGGetSAPDDInfo
SELECT newid(),EBELN ,EBELP ,RETPO ,IDNLF , <----------这里也有过报错,主要是因为insert into 与插入表的字段不匹配,需要把要插入的字段一个一个的写出来,newid()的作用暂时还没考虑
ZHTHXM ,AEDAT ,ERNAM ,MATNR ,TXZ01 ,
MATKL ,MENGE ,NETPR ,PEINH ,NETWR,WAERS,PSTYP 
FROM OPENXML(@hdoc,'xmldata/item/detailsItem',1) 
WITH(

EBELN nvarchar(10)  'EBELN',
EBELP int  'EBELP', 
RETPO nvarchar(10)  'RETPO', 
IDNLF nvarchar(35)  'IDNLF', 
ZHTHXM int  'ZHTHXM', 
AEDAT nvarchar(20)  'AEDAT', 
ERNAM nvarchar(20)  'ERNAM', 
MATNR nvarchar(20)  'MATNR', 
TXZ01 nvarchar(40)  'TXZ01', 
MATKL nvarchar(20)  'MATKL', 
MENGE nvarchar(20)  'MENGE', <-----------此处我犯了类型转换的错误,应该定义成nvarchar 我给定义成了int,XML文件中传的值是1000.0所以绝对不可能是Int型
NETPR nvarchar(20)  'NETPR', 
PEINH nvarchar(20)  'PEINH', 
NETWR nvarchar(20)  'NETWR', 
WAERS nvarchar(10)  'WAERS', 
PSTYP nvarchar(10)  'PSTYP' 
);

--将临时表数据插入到正式存储表
--1、更新编号重复的订单
update CGGetSAPDDInfo  set 
CGGetSAPDDInfo.EBELN=#CGGetSAPDDInfo.EBELN ,
EBELP=#CGGetSAPDDInfo.EBELP ,
RETPO=#CGGetSAPDDInfo.RETPO ,
IDNLF=#CGGetSAPDDInfo.IDNLF ,
ZHTHXM=#CGGetSAPDDInfo.ZHTHXM ,
AEDAT=#CGGetSAPDDInfo.AEDAT,
ERNAM=#CGGetSAPDDInfo.ERNAM ,
MATNR=#CGGetSAPDDInfo.MATNR ,
TXZ01=#CGGetSAPDDInfo.TXZ01 ,
MATKL=#CGGetSAPDDInfo.MATKL ,
MENGE=#CGGetSAPDDInfo.MENGE ,
NETPR=#CGGetSAPDDInfo.NETPR ,
PEINH=#CGGetSAPDDInfo.PEINH ,
NETWR=#CGGetSAPDDInfo.NETWR, 
WAERS=#CGGetSAPDDInfo.WAERS, 
PSTYP=#CGGetSAPDDInfo.PSTYP

from #CGGetSAPDDInfo 
WHERE CGGetSAPDDInfo.EBELN=#CGGetSAPDDInfo.EBELN


--2、插入不存在编号的订单
insert into CGGetSAPDDInfo 
(TBID ,EBELN ,EBELP ,RETPO ,IDNLF ,
ZHTHXM ,AEDAT ,ERNAM ,MATNR ,TXZ01 ,
MATKL ,MENGE ,NETPR ,PEINH ,NETWR,WAERS,PSTYP)

select  
newid(),EBELN ,EBELP ,RETPO ,IDNLF ,
ZHTHXM ,AEDAT ,ERNAM ,MATNR ,TXZ01 ,
MATKL ,MENGE ,NETPR ,PEINH ,NETWR,WAERS,PSTYP 
from #CGGetSAPDDInfo
where not exists (select 1 from CGGetSAPDDInfo where CGGetSAPDDInfo.EBELN = #CGGetSAPDDInfo.EBELN) 
end 
END

Finally, even if the field type in the temporary table is changed, an error is reported during the test, because the data in the temporary table is finally inserted into the storage table, so the field type of the storage table must be modified. I forgot at first. The elder sister reminded me just to remember.
The usage of XML is still very important, we need to accumulate more usage in the future

这是编写的类
namespace 命名空间
{
    public class 类名
    {
        /// <summary>
        /// SAP返回合同订单信息到中间表
        /// </summary>
        /// <param name="param">接口XML参数</param>
        /// <param name="note">返回接口信息</param>
        /// <param name="returnValue">返回值</param>
        public void 方法名_Motherd(string sclasssetcode, string param, out string note, out string returnValue)
        {
            returnValue = string.Empty;//执行成功标志
            note = "SAP合同信" + sclasssetcode + "息接口";

            IGSPDatabase db = GSPContext.Current.Database;//获取数据库连接
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(param);

                XmlNode serviceNode = doc.SelectSingleNode("xmldata");
                db.BeginTransaction();
                if (serviceNode != null)
                {

                    IDbDataParameter[] dataParams = new IDbDataParameter[2];
                    dataParams[0] = db.MakeInParam("strXML", @"<?xml version =""1.0"" encoding=""gb2312""?>" + serviceNode.OuterXml);
                    dataParams[1] = db.MakeInParam("DataType", sclasssetcode);
                    db.RunProcWithNoQuery("此处调用存储过程", dataParams);
                    db.Commit();
                }
                else
                {
                    throw new ApplicationException("传入XML格式不包含正确数据");
                }
            }
            catch (Exception e)
            {
                db.Rollback();
                returnValue = e.Message;
            }
            finally
            {
                //关闭数据库连接
                db.Close();
            }
        }

Guess you like

Origin blog.csdn.net/zhuyin6553/article/details/90722110