U890 API 二次开发 测试销售发货单保存 遇到的一些问题

由于之前没有做过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遇到这些问题的同鞋......

原文地址:https://www.cnblogs.com/tianzhenyun/p/3086166.html