找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 16369|回复: 5

[模式] 发货单保存失败:本单据已被他人修改或修改不成功或网络冲突

[复制链接]
发表于 2013-5-21 14:56:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

×
本帖最后由 tianzhenyun 于 2013-5-24 17:10 编辑

由于之前没有做过U8 API的开发,现在遇到了很多问题,有些经过查找摸索已经解决,和大家分享一下,不过目前这个销售发货单的保存还有问题!
1、就是登录时出错,尽管登录信息都正确,但还是登录失败提示“类型不匹配”,那么这个就u8Login.dll文件的问题,在上一个篇章已经说明.
2、如果可以正常登录,单据的装载一般都没有什么问题,都可以查询到单据信息(有一点要注意,API它要的单据ID是主表的ID,就拿查询销售发货单来,
  1. /// <summary>
  2.         /// 销售订单:装载单据
  3.         /// </summary>
  4.         public SO_SOMain Load(string vouchID)
  5.         {
  6.             try
  7.             {
  8.                 //第二步:构造环境上下文对象,传入login,并按需设置其它上下文参数
  9.                 U8EnvContext envContext = new U8EnvContext();
  10.                 envContext.U8Login = Login.U8Login;

  11.                 //销售所有接口均支持内部独立事务和外部事务,默认内部事务
  12.                 //如果是外部事务,则需要传递ADO.Connection对象,并将IsIndependenceTransaction属性设置为false
  13.                 //envContext.BizDbConnection = new ADO.Connection();
  14.                 //envContext.IsIndependenceTransaction = false;

  15.                 //设置上下文参数
  16.                 envContext.SetApiContext("VoucherType", 12); //上下文数据类型:int,含义:单据类型:12

  17.                 //第三步:设置API地址标识(Url)
  18.                 //当前API:装载单据的地址标识为:U8API/SaleOrder/Load
  19.                 U8ApiAddress myApiAddress = new U8ApiAddress("U8API/SaleOrder/Load");

  20.                 //第四步:构造APIBroker
  21.                 U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

  22.                 //第五步:API参数赋值

  23.                 //给普通参数VouchID赋值。此参数的数据类型为string,此参数按值传递,表示单据号
  24.                 broker.AssignNormalValue("VouchID", vouchID);

  25.                 //给普通参数blnAuth赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示是否控制权限:true
  26.                 broker.AssignNormalValue("blnAuth", true);

  27.                 //第六步:调用API
  28.                 if (!broker.Invoke())
  29.                 {
  30.                     //错误处理
  31.                     Exception apiEx = broker.GetException();
  32.                     if (apiEx != null)
  33.                     {
  34.                         if (apiEx is MomSysException)
  35.                         {
  36.                             MomSysException sysEx = apiEx as MomSysException;
  37.                             Console.WriteLine("系统异常:" + sysEx.Message);
  38.                             //todo:异常处理
  39.                         }
  40.                         else if (apiEx is MomBizException)
  41.                         {
  42.                             MomBizException bizEx = apiEx as MomBizException;
  43.                             Console.WriteLine("API异常:" + bizEx.Message);
  44.                             //todo:异常处理
  45.                         }
  46.                         //异常原因
  47.                         String exReason = broker.GetExceptionString();
  48.                         if (exReason.Length != 0)
  49.                         {
  50.                             Console.WriteLine("异常原因:" + exReason);
  51.                         }
  52.                     }
  53.                     //结束本次调用,释放API资源
  54.                     broker.Release();
  55.                     return null;
  56.                 }

  57.                 //第七步:获取返回结果

  58.                 //获取返回值
  59.                 //获取普通返回值。此返回值数据类型为System.String,此参数按值传递,表示成功为空串
  60.                 System.String result = broker.GetReturnValue() as System.String;
  61.                 //throw new Exception(result);
  62.                 if (!string.IsNullOrEmpty(result))
  63.                     throw new Exception(result);
  64.                 //获取out/inout参数值

  65.                 //out参数domHead为BO对象(表头),此BO对象的业务类型为销售订单。BO参数均按引用传递,具体请参考服务接口定义
  66.                 //如果要取原始的XMLDOM对象结果,请使用GetResult("domHead") as MSXML2.DOMDocument
  67.                 BusinessObject domHeadRet = broker.GetBoParam("domHead");
  68.                 Console.WriteLine("BO对象(表头)行数为:" + domHeadRet.RowCount); //获取BO对象(表头)的行数
  69.                 //获取BO对象(表头)各字段的值。字段定义详见API服务接口定义

  70.                 //MSXML2.DOMDocument domHead = broker.GetResult("domHead") as MSXML2.DOMDocument;

  71.                 //out参数domBody为BO对象(表体),此BO对象的业务类型为销售订单。BO参数均按引用传递,具体请参考服务接口定义
  72.                 //如果要取原始的XMLDOM对象结果,请使用GetResult("domBody") as MSXML2.DOMDocument
  73.                 BusinessObject domBodyRet = broker.GetBoParam("domBody");
  74.                 Console.WriteLine("BO对象(表体)行数为:" + domBodyRet.RowCount); //获取BO对象(表体)的行数
  75.                 //获取BO对象(表体)各字段的值。以下代码示例只取第一行。字段定义详见API服务接口定义

  76.                 //MSXML2.DOMDocument domBody = broker.GetResult("domBody") as MSXML2.DOMDocument;


  77.                 //结束本次调用,释放API资源
  78.                 broker.Release();

  79.                 SO_SOMain so_somain = EntityConvert.ToSO_SOMain(domHeadRet[0]);
  80.                 SO_SODetails so_sodetail;
  81.                 for (int i = 0; i < domBodyRet.RowCount; i++)
  82.                 {
  83.                     so_sodetail = EntityConvert.ToSO_SODetails(domBodyRet[i]);
  84.                     so_sodetail.cSOCode = so_somain.cSOCode;
  85.                     so_somain.List.Add(so_sodetail);
  86.                 }
  87.                 return so_somain;

  88.             }
  89.             catch (Exception ex)
  90.             {
  91.                 throw new Exception(ex.Message);

  92.             }
  93.         }
复制代码
参数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()方法之后得到的结果。

“获取单据前缀格式失败”这个问题已经解决,原因是没给domBody[0]["cvouchType"]这个参数赋值,它应该赋值为"05”,而我当时没注意传了空字符串导致的。但是这个参数明明在非必输字段里,也不知道U8api资源管理器中的说明是怎么写。
接着有一个问题出现了"本单据已被他人修改或修改不成功或网络冲突".
请高人指点!
发表于 2015-5-9 18:18:34 | 显示全部楼层
本单据已被他人修改或修改不成功或网络冲突
问题可能在timestamp字段,传null试试。
回复 点赞 1 拍砖 0

使用道具 举报

 楼主| 发表于 2013-5-24 17:03:26 | 显示全部楼层
本帖最后由 tianzhenyun 于 2013-5-24 17:05 编辑

哈哈,调用U8api,销售发货单终于保存成功了,{:soso_e113:},
接着说明一下,出现问题的关键点,本贴最后一个问题“本单据已被他人修改或修改不成功或网络冲突”,原因跟参数赋值有关,
具体是哪个参数不对,我也不知道!我是这样操作的,先把u8api资源管理器说明的 表头表体中“非必输字段”全部注释,点击提交他会提示几个参数必输,具体记不清了,好像有以下几个
表头中
            obj["iexchrate"] = dispatchList.iExchRate; //汇率,double类型
            obj["cexch_name"] = dispatchList.cexch_name; //币种,string类型

            obj["ivtid"] = 71; //dispatchList.iVTid; //单据模版号,int类型,--这个必输,如果没有报错。

            obj["cvouchtype"] = dispatchList.cVouchType; //单据类型编码,string类型,--也是必输,否则会出现上面的问题。
表体中

            obj["cwhcode"] = dispatchLists.cWhCode; //仓库编码,string类型
            obj["cgroupcode"] = dispatchLists.cGroupCode; //计量单位组,string类型
            obj["dvdate"] = dispatchLists.dvDate; //失效日期,DateTime类型
            //obj["cbatch"] = dispatchLists.cBatch; //批号,string类型
等这几个字段,然后再提交,不再提示“本单据已被他人修改或修改不成功或网络冲突”,而是提示“库存系统修改现存量不成功,详细错误如下:相关资源正在被其他用户占用,请稍后再试!” 这个新问题,上网查了,下面问了很多,也没解决这个问题,先是慢慢的添加了一些参数(iQuotedPrice、iMoney、iTax、iTaxRate、cSoCode、iDisCount等)可以还是保存不成功。
依然“现存量修改不成功 ,请稍后再试”,
后来把很多参数都取消了注释,又出了一个问题“调用"VoucherCO_Sa.ClsVoucherCO_SA"对象的方法"Save"失败,原因:调用的目标发生了异常。”这个问题多次调试找到原因,是因为DateTime类型参数赋值错误,如
//obj["cdefine36"] = dispatchLists.cDefine36; //表体自定义项15,DateTime类型
它需要DateTime类型的参数,我传的也是时间类型,但我传的是类对象,没有给这个参数cDefine36赋值,默认为时间最小值,但接口不接收,提示“调用的目标发生了异常”,时间类型在表头与表体中都有,把这些参数直接注释掉就不会出现这个问题了。
再后来,基本上把所有的参数都取消了注释后(不用的时间类型参数一定要注释掉),提交也没有了上面的问题,最后提交成功。
{:soso_e112:}希望这些经历可以帮到你。
回复 点赞 1 拍砖 0

使用道具 举报

发表于 2013-5-21 16:15:18 | 显示全部楼层
太夸张了  看不懂
回复 点赞 拍砖

使用道具 举报

发表于 2013-5-21 16:34:00 | 显示全部楼层
帮你顶高人
回复 点赞 拍砖

使用道具 举报

发表于 2013-5-21 18:00:08 | 显示全部楼层
不用这么复杂吧,一般情况下也就是单据已被删除而已。
回复 点赞 拍砖

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-5-26 20:00 , Processed in 0.035938 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表