由于之前没有做过U8 API的开发,现在遇到了很多问题,有些经过查找摸索已经解决,和大家分享一下,不过目前这个销售发货单的保存还有问题!
1、就是登录时出错,尽管登录信息都正确,但还是登录失败提示“类型不匹配”,那么这个就u8Login.dll文件的问题,在上一个篇章已经说明.
2、如果可以正常登录,单据的装载一般都没有什么问题,都可以查询到单据信息(有一点要注意,API它要的单据ID是主表的ID,就拿查询销售发货单来,
/// <summary> /// 销售订单:装载单据 /// </summary> public SO_SOMain Load(string vouchID) { try { //第二步:构造环境上下文对象,传入login,并按需设置其它上下文参数 U8EnvContext envContext = new U8EnvContext(); envContext.U8Login = Login.U8Login; //销售所有接口均支持内部独立事务和外部事务,默认内部事务 //如果是外部事务,则需要传递ADO.Connection对象,并将IsIndependenceTransaction属性设置为false //envContext.BizDbConnection = new ADO.Connection(); //envContext.IsIndependenceTransaction = false; //设置上下文参数 envContext.SetApiContext("VoucherType", 12); //上下文数据类型:int,含义:单据类型:12 //第三步:设置API地址标识(Url) //当前API:装载单据的地址标识为:U8API/SaleOrder/Load U8ApiAddress myApiAddress = new U8ApiAddress("U8API/SaleOrder/Load"); //第四步:构造APIBroker U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext); //第五步:API参数赋值 //给普通参数VouchID赋值。此参数的数据类型为string,此参数按值传递,表示单据号 broker.AssignNormalValue("VouchID", vouchID); //给普通参数blnAuth赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示是否控制权限:true broker.AssignNormalValue("blnAuth", true); //第六步:调用API if (!broker.Invoke()) { //错误处理 Exception apiEx = broker.GetException(); if (apiEx != null) { if (apiEx is MomSysException) { MomSysException sysEx = apiEx as MomSysException; Console.WriteLine("系统异常:" + sysEx.Message); //todo:异常处理 } else if (apiEx is MomBizException) { MomBizException bizEx = apiEx as MomBizException; Console.WriteLine("API异常:" + bizEx.Message); //todo:异常处理 } //异常原因 String exReason = broker.GetExceptionString(); if (exReason.Length != 0) { Console.WriteLine("异常原因:" + exReason); } } //结束本次调用,释放API资源 broker.Release(); return null; } //第七步:获取返回结果 //获取返回值 //获取普通返回值。此返回值数据类型为System.String,此参数按值传递,表示成功为空串 System.String result = broker.GetReturnValue() as System.String; //throw new Exception(result); if (!string.IsNullOrEmpty(result)) throw new Exception(result); //获取out/inout参数值 //out参数domHead为BO对象(表头),此BO对象的业务类型为销售订单。BO参数均按引用传递,具体请参考服务接口定义 //如果要取原始的XMLDOM对象结果,请使用GetResult("domHead") as MSXML2.DOMDocument BusinessObject domHeadRet = broker.GetBoParam("domHead"); Console.WriteLine("BO对象(表头)行数为:" + domHeadRet.RowCount); //获取BO对象(表头)的行数 //获取BO对象(表头)各字段的值。字段定义详见API服务接口定义 //MSXML2.DOMDocument domHead = broker.GetResult("domHead") as MSXML2.DOMDocument; //out参数domBody为BO对象(表体),此BO对象的业务类型为销售订单。BO参数均按引用传递,具体请参考服务接口定义 //如果要取原始的XMLDOM对象结果,请使用GetResult("domBody") as MSXML2.DOMDocument BusinessObject domBodyRet = broker.GetBoParam("domBody"); Console.WriteLine("BO对象(表体)行数为:" + domBodyRet.RowCount); //获取BO对象(表体)的行数 //获取BO对象(表体)各字段的值。以下代码示例只取第一行。字段定义详见API服务接口定义 //MSXML2.DOMDocument domBody = broker.GetResult("domBody") as MSXML2.DOMDocument; //结束本次调用,释放API资源 broker.Release(); SO_SOMain so_somain = EntityConvert.ToSO_SOMain(domHeadRet[0]); SO_SODetails so_sodetail; for (int i = 0; i < domBodyRet.RowCount; i++) { so_sodetail = EntityConvert.ToSO_SODetails(domBodyRet[i]); so_sodetail.cSOCode = so_somain.cSOCode; so_somain.List.Add(so_sodetail); } return so_somain; } catch (Exception ex) { throw new Exception(ex.Message); } }
参数vouchID指的是销售订单主表SO_SOMain的ID字段,而不是cSOCode订单号字段,你需要根据订单号查询ID)。
问题都集中在销售发货单的保存,在终端根据查询的销售订单信息来扫描存货,封装销售发货单实体类对象,扫描完成提交数据,在后台为API的BusinessObject对象赋值后,在“if (!broker.Invoke())”这句话直接报错,提示“未将对象设置到对象的实例”,有可能就是你赋值有问题,你要仔细检查赋值是否为null,或都赋值类型错误,如果你不知道那个变量出现问题,你可以利用ILSpy来调试,看看那个变量为null,
后来又提示一个“业务类型(0)不正确”,
是啊,业务类型为int型我把枚举类型强转为整型,这是API的“domHead[0]["cbustype"] = ""; //业务类型,int类型”原句,后来网上说是不应该传整型,而是字符串,
可是我为cbustype赋值字符串后,总是为null,赋值之后再快速监视得的还是null,哎,这就不对了,刚赋值怎么没了,上网查询之后有人说“UFIDA.U8.U8APIFramework.dll”,找一个最新的就行了,试了下,得,还真行了。可以赋值字符串了,就在我认为没问题的时候,它又出现了一个问题,但不是异常
这是broker.Invoker()方法之后得到的结果。
目前这个问题还没有解决,希望那位高手能给指点一下,可能还是某个参数赋值错误或未赋值......
写的有点乱,但希望可能帮助那些调试U8API遇到这些问题的同鞋......