找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

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

[求助] 调用API生产成品入库单 类型不匹配

[复制链接]
发表于 2011-3-31 13:38:41 | 显示全部楼层 |阅读模式

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

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

×
我想通过API生成一张产成品入库单,在调用完API以后,返回的结果说“类型不匹配”,实在不明白指的是什么。
我在产成品入库单中成功录入了一张数据,然后我把这条数据参数固定到我的方法里面,然后再删除了这条数据。
然后调用API执行不成功,不知道代码哪里写不正确了。

        public void DoAPI(UFIDA.U8.UAP.Common.LoginInfo _loginInfo, Business _BusHead, Business _BusBody)
        {
            //第一步:构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = (clsLogin)_loginInfo.U8Login;
            //第二步:构造环境上下文对象,传入login,并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;
            //第三步:设置API地址标识(Url)
            //当前API:添加新单据的地址标识为:U8API/ProductIn/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ProductIn/Add");
            //第四步:构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);
            //第五步:API参数赋值
            //给普通参数sVouchType赋值。此参数的数据类型为System.String,此参数按值传递,表示单据类型:10
            System.String sVouchType = "10";
            broker.AssignNormalValue("sVouchType", sVouchType);

            //    //给BO表头参数DomHead赋值,此BO参数的业务类型为产成品入库单,属表头参数。BO参数均按引用传递
            //    //提示:给BO表头参数DomHead赋值有两种方法
            //    //方法一是直接传入MSXML2.DOMDocumentClass对象
            //    //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())
            //方法二是构造BusinessObject对象,具体方法如下:
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数,只能为一行
            //给BO对象(表头)的字段赋值,值可以是真实类型,也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            int maxid = ConvertTo.ToInt(DAL.DALRdrecord.GetHeadMaxID(), 0);// 取表头最大ID
            maxid += 1;
            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = maxid; //主关键字段,int类型
            DomHead[0]["ccode"] = "TEST3"; //入库单号,string类型
            DomHead[0]["ddate"] = "2011-03-18"; //入库日期,DateTime类型
            DomHead[0]["cwhname"] = "电池B品和未包装C品仓"; //仓库,string类型
            //    /***************************** 以下是非必输字段 ****************************/
            
            DomHead[0]["cwhcode"] = "A4"; //仓库编码,string类型
            DomHead[0]["crdcode"] = "103"; //入库类别编码,string类型
            //DomHead[0]["cdepcode"] = _BusHead.Cells["primy001_cWhCode"].Value; //部门编码,string类型
            //DomHead[0]["cprobatch"] = _BusHead.Cells["primy001_cProBatch"].Value; //生产批号,string类型
            //DomHead[0]["cmemo"] = _BusHead.Cells["primy001_Meno"].Value; //备注,string类型
            //DomHead[0]["brdflag"] = "1"; //收发标志,string类型
            //DomHead[0]["csource"] = ""; //单据来源,int类型
            #region Head 未使用字段
            #endregion

            broker.SetBoParam("DomHead", DomHead);
            //方法二是构造BusinessObject对象,具体方法如下:
            BusinessObject domBody = broker.GetBoParam("domBody");
            DataTable _dtBody = _BusBody.DataTable;
            domBody.RowCount = 1; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数,也可以不设置而自动增加行数
            //给BO对象的字段赋值,值可以是真实类型,也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            /****************************** 以下是必输字段 ****************************/
            int autoid = ConvertTo.ToInt(DAL.DALRdrecord.GetMaxBodyAutoID(), 0);//取表体最大ID
            autoid += 1;
            domBody[0]["autoid"] = autoid; //主关键字段,int类型
            domBody[0]["cinvcode"] = "8"; //产品编码,string类型
            domBody[0]["editprop"] = "A"; //编辑属性:A表新增,M表修改,D表删除,string类型
            //    /***************************** 以下是非必输字段 ****************************/
            domBody[0]["iquantity"] = "1000"; //数量,double类型
            domBody[0]["iunitcost"] = "1"; //单价,double类型
            domBody[0]["iprice"] = "1000"; //金额,double类型
            domBody[0]["id"] = maxid; //与主表关联项,int类型
            #region Body 未使用字段
            #endregion

            broker.SetBoParam("domBody", domBody);
            //给普通参数domPosition赋值。此参数的数据类型为System.Object,此参数按引用传递,表示货位:传空
            System.Object domPosition = new System.Object();
            broker.AssignNormalValue("domPosition", domPosition);
            //该参数errMsg为OUT型参数,由于其数据类型为System.String,为一般值类型,因此不必传入一个参数变量。在API调用返回时,可以通过GetResult("errMsg")获取其值
            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection,此参数按引用传递,表示连接对象,如果由调用方控制事务,则需要设置此连接对象,否则传空
            ADODB.Connection cnnFrom = new ADODB.Connection();
            broker.AssignNormalValue("cnnFrom", cnnFrom);
            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String,此参数按值传递。在API调用返回时,可以通过GetResult("VouchId")获取其值
            System.String VouchId = "";
            broker.AssignNormalValue("VouchId", VouchId);
            //该参数domMsg为OUT型参数,由于其数据类型为MSXML2.IXMLDOMDocument2,非一般值类型,因此必须传入一个参数变量。在API调用返回时,可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);
            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示是否控制可用量。
            System.Boolean bCheck = true;
            broker.AssignNormalValue("bCheck", bCheck);
            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示检查可用量
            System.Boolean bBeforCheckStock = true;
            broker.AssignNormalValue("bBeforCheckStock", bBeforCheckStock);
            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示是否红字单据
            System.Boolean bIsRedVouch = false;
            broker.AssignNormalValue("bIsRedVouch", bIsRedVouch);
            //给普通参数sAddedState赋值。此参数的数据类型为System.String,此参数按值传递,表示传空字符串
            System.String sAddedState = "";
            broker.AssignNormalValue("sAddedState", sAddedState);
            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示是否远程:转入false
            System.Boolean bReMote = false;
            broker.AssignNormalValue("bReMote", bReMote);
            //第六步:调用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;
            }
            //第七步:获取返回结果
            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean,此参数按值传递,表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            //获取out/inout参数值
            //获取普通OUT参数errMsg。此返回值数据类型为System.String,在使用该参数之前,请判断是否为空
            System.String errMsgRet = broker.GetResult("errMsg") as System.String;
            //获取普通INOUT参数VouchId。此返回值数据类型为System.String,在使用该参数之前,请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;
            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2,在使用该参数之前,请判断是否为空
            MSXML2.IXMLDOMDocument2 domMsgRet = (MSXML2.IXMLDOMDocument2)(broker.GetResult("domMsg"));
            //结束本次调用,释放API资源
            broker.Release();
            return;
        }
发表于 2013-6-5 14:09:21 | 显示全部楼层
楼主,是你参数传错了。
  1. //给普通参数domPosition赋值。此参数的数据类型为System.Object,此参数按引用传递,表示货位:传空
  2.             System.Object domPosition = new System.Object();
  3.              broker.AssignNormalValue("domPosition", domPosition);
  4.              //该参数errMsg为OUT型参数,由于其数据类型为System.String,为一般值类型,因此不必传入一个参数变量。在API调用返回时,可以通过GetResult("errMsg")获取其值
  5.             //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection,此参数按引用传递,表示连接对象,如果由调用方控制事务,则需要设置此连接对象,否则传空
  6.             ADODB.Connection cnnFrom = new ADODB.Connection();
  7.              broker.AssignNormalValue("cnnFrom", cnnFrom);
复制代码
这两个参数既然没有,传null就可以了,
我调用api生成销售出库单时,也有这两个参数,刚开始也是按楼主的方式创建新对象,也提示“类型不匹配”,
后来把这两个参数都传null,就不再出现这个问题了。
希望这个可以帮到大家!
回复 点赞 3 拍砖 0

使用道具 举报

发表于 2021-11-15 14:27:35 | 显示全部楼层
tianzhenyun 发表于 2013-6-4 14:33
如果你为cBusType赋值字符串的话,可能解决那个“业务类型(0)不正确”的问题(如果你赋值字符串后,它还 ...

第一次cBusType赋值可以成功,也生成发货单了,但是第二次执行就没有值了,这是为什么
回复 点赞 拍砖

使用道具 举报

发表于 2014-5-15 16:25:21 | 显示全部楼层
shawdavid 发表于 2014-4-29 10:02
我也是总报这个错误,还有 MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.IXMLDOMDocument2();
这里,接 ...

试试这样  MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocumentClass();
回复 点赞 拍砖

使用道具 举报

发表于 2014-4-29 10:02:35 | 显示全部楼层
caojuna 发表于 2014-4-7 22:04
总是提示: 未将对象引用设置到对象实例。 咋整啊

我也是总报这个错误,还有 MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.IXMLDOMDocument2();
这里,接口不是不能实例化吗,不知道您有没有解决~

点评

试试这样 MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocumentClass();  详情 回复 发表于 2014-5-15 16:25
回复 点赞 拍砖

使用道具 举报

发表于 2016-4-21 21:36:49 | 显示全部楼层
tianzhenyun 发表于 2013-6-5 14:09
楼主,是你参数传错了。这两个参数既然没有,传null就可以了,
我调用api生成销售出库单时,也有这两个参 ...

太好了  我试了改成NULL 真的行了 谢谢
回复 点赞 拍砖

使用道具 举报

 楼主| 发表于 2011-4-1 22:17:09 | 显示全部楼层
// 这里返货了false
System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
//这里返回了“类型不匹配”
System.String errMsgRet = broker.GetResult("errMsg") as System.String;

谁能帮我解决一下{:3_64:}
发表于 2011-5-16 02:32:09 | 显示全部楼层
问题解决没?我也碰到同样问题(成品入库)。测试发货单,也不成功,总是提示:"业务类型(n)不正确"(domHead[0]["cbustype"]=n,n从0换到20了,还是不对)。郁闷!!!

点评

如果你为cBusType赋值的话字符串,可能解决那个“业务类型(0)不正确”的问题(如果你赋值字符串后,它还是为空的话,你需要找一个最新的“UFIDA.U8.U8APIFramework.dll”文件即可解决)。  详情 回复 发表于 2013-6-4 14:33
发表于 2011-5-16 22:59:38 | 显示全部楼层
楼主你太相信用友的研发实力了.
  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:3
  • 最近打卡:2024-10-07 18:11:01
发表于 2011-5-17 14:02:22 | 显示全部楼层
好好学习、天天向上!!!
发表于 2011-6-8 10:57:52 | 显示全部楼层
改成INT32就能通过,但是不敢用,也不知道会不会有问题。
发表于 2011-9-16 12:46:12 | 显示全部楼层
也遇到了,不知道楼主后来怎么做的
发表于 2012-4-14 11:14:24 | 显示全部楼层
碰到了,留名等结果
回复 点赞 拍砖

使用道具 举报

发表于 2012-7-31 10:13:49 | 显示全部楼层
碰到了,留名等结果
回复 点赞 拍砖

使用道具 举报

发表于 2013-2-27 14:00:05 | 显示全部楼层
同样的问题 有没有解决方法
回复 点赞 拍砖

使用道具 举报

发表于 2013-4-9 12:15:23 | 显示全部楼层
用友的API确实是没经过培训很难调试
回复 点赞 拍砖

使用道具 举报

发表于 2013-4-26 10:11:00 | 显示全部楼层
MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.IXMLDOMDocument2();
  我的实例化时说  接口无法实例化啊,这个MSXML2.IXMLDOMDocument2接口
需要自己类实现吗?
回复 点赞 拍砖

使用道具 举报

发表于 2013-6-4 14:33:43 | 显示全部楼层

如果你为cBusType赋值字符串的话,可能解决那个“业务类型(0)不正确”的问题(如果你赋值字符串后,它还是为空的话,你需要找一个最新的“UFIDA.U8.U8APIFramework.dll”文件即可解决)。
回复 点赞 拍砖

使用道具 举报

发表于 2014-2-8 16:03:10 | 显示全部楼层
本帖最后由 youyou2013 于 2014-2-16 11:07 编辑

晕,我的也出错!

提示:类型匹配出错

提示:类型匹配出错
回复 点赞 拍砖

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-19 16:38 , Processed in 0.080620 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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