测试环境
新安装的u813.0虚拟机演示帐套,替换了login,mssql2012,vs2017
引用dll
- 接下来会手把手教你完成单据审核、加载、弃审、删除、新增
- C:\U8SOFT\U8KCSN\bin目录下引用下面的dll
- adodb.dll可以在vs中找到,这里也提供文件
vs会提示
其他入库单
- 在u8上新建一张其他入库单如下,后面加载、审核、弃审、删除使用
加载单据
- GetU8Login获取u8登陆对象
- USERPCO.VoucherCO.Load方法用于加载单据,08是其他入库单,这里加载id为1000000015的单据
private void button2_Click(object sender, EventArgs e)
{
U8Login.clsLogin u8login = GetU8Login();
string Msg = "";
var VCO = new USERPCO.VoucherCO();
VCO.IniLogin(u8login, ref Msg);
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
MSXML2.IXMLDOMDocument2 domHead = new MSXML2.DOMDocumentClass();
MSXML2.IXMLDOMDocument2 domBody = new MSXML2.DOMDocumentClass();
MSXML2.IXMLDOMDocument2 domPos = new MSXML2.DOMDocumentClass();
bool bb = VCO.Load("08", "ID='1000000015'", ref domHead, ref domBody, ref domPos, ref Msg, false, "");
string xml = domHead.xml;
xml = domBody.xml;
xml = domPos.xml;
u8login.ShutDown();
}
审核单据
USERPCO.VoucherCO.Verify 审核刚刚创建的其他入库单
private void button3_Click(object sender, EventArgs e)
{
ADODB.Connection con = null;
try
{
U8Login.clsLogin u8login = GetU8Login();
string VouchId = "1000000015";
string Msg = "";
con = new ADODB.Connection();
con.ConnectionString = u8login.UfDbName;
con.Open();
con.BeginTrans();
USERPCO.VoucherCO VCO = new USERPCO.VoucherCO();
VCO.IniLogin(u8login, ref Msg);
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
object TimeStamp = null;
MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocumentClass();
bool bCheck = true, bBeforCheckStock = true, bList = false;
bool bsuccess = VCO.Verify("08", VouchId, ref Msg, ref con, ref TimeStamp, ref domMsg, ref bCheck, ref bBeforCheckStock, ref bList);
string errxml = domMsg.xml;
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
con.CommitTrans();
u8login.ShutDown();
}
catch (Exception ex)
{
con.RollbackTrans();
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
弃审单据
- USERPCO.VoucherCO.UnVerify来弃审单据
- TimeStamp 为单据时间戳,可以根据此字段判断单据是否被其他人修改,弃审&删除都需要传入单据时间戳,获取方法如下,不要删除ufts前面空字符,否则会提示:该单据OI202209180001已经被其他人修改,请刷新后重新弃审
审核弃审后可查询现存量表CurrentStock看下库存
select convert(nchar,convert(money,ufts),2) as ufts
from rdrecord08 where ccode='OI202209180001'
private void button4_Click(object sender, EventArgs e)
{
ADODB.Connection con = null;
try
{
U8Login.clsLogin u8login = GetU8Login();
string VouchId = "1000000015";
string Msg = "";
con = new ADODB.Connection();
con.ConnectionString = u8login.UfDbName;
con.Open();
con.BeginTrans();
USERPCO.VoucherCO VCO = new USERPCO.VoucherCO();
VCO.IniLogin(u8login, ref Msg);
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
//传入时间戳
object TimeStamp = " 480.8518";
MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocumentClass();
bool bCheck = true, bBeforCheckStock = true, bList = false;
bool bsuccess = VCO.UnVerify("08", VouchId, ref Msg, ref con, ref TimeStamp, ref domMsg, ref bCheck, ref bBeforCheckStock, ref bList);
string errxml = domMsg.xml;
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
con.CommitTrans();
u8login.ShutDown();
}
catch (Exception ex)
{
con.RollbackTrans();
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
删除单据
- USERPCO.VoucherCO.Delete删除单据
单据需弃审才能删除,否则返回Msg:该单据OI202209180001已经被其他人修改,请刷新后重新删除
private void button5_Click(object sender, EventArgs e)
{
ADODB.Connection con = null;
try
{
U8Login.clsLogin u8login = GetU8Login();
string VouchId = "1000000015";
string Msg = "";
con = new ADODB.Connection();
con.ConnectionString = u8login.UfDbName;
con.Open();
con.BeginTrans();
USERPCO.VoucherCO VCO = new USERPCO.VoucherCO();
VCO.IniLogin(u8login, ref Msg);
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
//传入时间戳
object TimeStamp = " 480.8633";
MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocumentClass();
bool bCheck = true, bBeforCheckStock = true, bList = false;
bool bsuccess = VCO.Delete("08", VouchId, ref Msg, ref con, ref TimeStamp, ref domMsg, ref bCheck, ref bBeforCheckStock, ref bList);
string errxml = domMsg.xml;
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
con.CommitTrans();
u8login.ShutDown();
}
catch (Exception ex)
{
con.RollbackTrans();
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
新增单据
- 右击引用Interop.USERPCO查看插入方法
- 插入方法声明如下:
sVouchType:单据类型,当前为其他入库单传08
DomHead:单据头部数据
domBody:单据体数据
domPosition:货位数据
errMsg:错误信息
[]:包裹的参数为可选参数
public virtual bool Insert(string sVouchType, object DomHead, object domBody,
object domPosition, ref string errMsg,
[ref ADODB.Connection cnnFrom],
[ref string VouchId],
[ref MSXML2.IXMLDOMDocument2 domMsg],
[ref bool bCheck = True],
[ref bool bBeforCheckStock = True],
[bool bIsRedVouch = False],
[string sAddedState = ],
[bool bReMote = False])
类文件
- 我们需要建立c#的class文件,里面的字段为其他入库单的表体表头字段
获取Dom
- 在加载单据接口中,你会得到单据domHead,domBody,同样的在新增时需要传入dom xml数据
getDom方法将查询结果返回dom,这里用于构建一个空的dom
/// <summary>
/// 获取dom
/// </summary>
/// <param name="Strsql"></param>
/// <param name="strConn"></param>
/// <returns></returns>
public static MSXML2.DOMDocument getDom(string Strsql, string strConn)
{
MSXML2.DOMDocument dom = new MSXML2.DOMDocument();
ADODB.Connection conn = new ADODB.Connection();
ADODB.Recordset rs = new ADODB.Recordset();
conn.Open(strConn);
rs.Open(Strsql, conn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockOptimistic, -1);
rs.Save(dom, ADODB.PersistFormatEnum.adPersistXML);
return dom;
}
将对象数据存入dom xml ```csharp ///
/// 获取dom /// /// /// ///public static MSXML2.DOMDocument getDom(string Strsql, string strConn) { MSXML2.DOMDocument dom = new MSXML2.DOMDocument(); ADODB.Connection conn = new ADODB.Connection(); ADODB.Recordset rs = new ADODB.Recordset(); conn.Open(strConn); rs.Open(Strsql, conn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockOptimistic, -1); rs.Save(dom, ADODB.PersistFormatEnum.adPersistXML); return dom; }
public static void ConvertHeadXML
public static void Parameter
}
}
<a name="uuBEW"></a>
### 执行保存
1. KCOtherInH&KCOtherInB为其他入库单视图
```csharp
private void button6_Click(object sender, EventArgs e)
{
ADODB.Connection con = null;
try
{
//dom
MSXML2.DOMDocument domHead = new MSXML2.DOMDocument();
MSXML2.DOMDocument domBody = new MSXML2.DOMDocument();
MSXML2.DOMDocument domPos = new MSXML2.DOMDocument();
MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
//登录对象
U8Login.clsLogin u8login = GetU8Login();
//数据库连接
con = new ADODB.Connection();
con.ConnectionString = u8login.UfDbName;
con.Open();
con.BeginTrans();
//单据数据
rdrecord08 head = new rdrecord08();
head.cvouchtype = "08";
head.cbustype = "其他入库";
head.csource = "库存";
head.cwhcode = "04";
head.cmaker = "demo";
head.brdflag = 1;
head.vt_id = 67;
head.dnmaketime = DateTime.Now;
head.ddate = Convert.ToDateTime("2022-09-18");
head.ccode = "OI202209180002";//放已经存在的单据号保存会生成新单据号
head.cmemo = "接口生成";
List<rdrecords08> bodys = new List<rdrecords08>();
rdrecords08 body = new rdrecords08();
body.irowno = 1;
body.cinvcode = "01019002063";
body.iquantity = 1;
body.editprop = "A";//rdrecords08增加此字段
bodys.Add(body);
string sql = "";
//单据头dom
sql = "select m.* from KCOtherInH m with(nolock) where 1=2";
domHead = getDom(sql, u8login.UfDbName);
ConvertHeadXML(domHead, head);
string xml = domHead.xml;
//单据体dom
sql = "select '' as editprop,m.* from KCOtherInB m with(nolock) where 1=2";
domBody = getDom(sql, u8login.UfDbName);
ConvertBodyXML(domBody, bodys);
xml = domBody.xml;
//保存
string Msg = "", VouchId="";
USERPCO.VoucherCO CO = new USERPCO.VoucherCO();
CO.IniLogin(u8login, ref Msg);
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
bool bsucess = CO.Insert("08", domHead, domBody, domPos, ref Msg, ref con, ref VouchId, ref domMsg);
if (!string.IsNullOrEmpty(Msg))
{
throw new Exception(Msg);
}
con.CommitTrans();
u8login.ShutDown();
MessageBox.Show("执行成功:"+ VouchId);
}
catch (Exception ex)
{
con.RollbackTrans();
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
其他出库单
- 其他出库单的加载、审核、弃审、删除跟其他入库单差不多,自行尝试改一下
- 这里重点说下出库的库存提示,刚才我们保存的存货数量1,在u8做单出2会提醒零出库控制。那我们在co中如何获取错误提示呢?
- Insert方法中有一个msg和 domMsg,我们可以根据这两个值进行检查
新增单据
类文件
- 跟上面一样,生成rdrecord09&rdrecords09用来保存单据数据
保存
private void button7_Click(object sender, EventArgs e)
{
ADODB.Connection con = null;
try
{
//dom
MSXML2.DOMDocument domHead = new MSXML2.DOMDocument();
MSXML2.DOMDocument domBody = new MSXML2.DOMDocument();
MSXML2.DOMDocument domPos = new MSXML2.DOMDocument();
MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
//登录对象
U8Login.clsLogin u8login = GetU8Login();
//数据库连接
con = new ADODB.Connection();
con.ConnectionString = u8login.UfDbName;
con.Open();
con.BeginTrans();
//单据数据
rdrecord09 head = new rdrecord09();
head.cvouchtype = "09";
head.cbustype = "其他出库";
head.csource = "库存";
head.cwhcode = "04";
head.cmaker = "demo";
head.brdflag = 0;
head.vt_id = 85;
head.dnmaketime = DateTime.Now;
head.ddate = Convert.ToDateTime("2022-09-18");
head.ccode = "OO20220918000001";//放已经存在的单据号保存会出现生成单据号
head.cmemo = "接口生成";
List<rdrecords09> bodys = new List<rdrecords09>();
rdrecords09 body = new rdrecords09();
body.irowno = 1;
body.cinvcode = "01019002063";
body.iquantity = 2;
body.editprop = "A";//编辑属性:A表新增,M表修改,D表删除
bodys.Add(body);
string sql = "";
//单据头dom
sql = "select m.* from KCOtherOutH m with(nolock) where 1=2";
domHead = getDom(sql, u8login.UfDbName);
ConvertHeadXML(domHead, head);
string xml = domHead.xml;
//单据体dom
sql = "select '' as editprop,m.* from KCOtherOutB m with(nolock) where 1=2";
domBody = getDom(sql, u8login.UfDbName);
ConvertBodyXML(domBody, bodys);
xml = domBody.xml;
//保存
string Msg = "", VouchId = "";
USERPCO.VoucherCO CO = new USERPCO.VoucherCO();
CO.IniLogin(u8login, ref Msg);
if (!string.IsNullOrEmpty(Msg)) { throw new Exception(Msg); }
bool bsucess = CO.Insert("09", domHead, domBody, domPos, ref Msg, ref con, ref VouchId, ref domMsg);
if (!bsucess)
{
if (!string.IsNullOrEmpty(Msg)) { throw new Exception(Msg); }
xml = domMsg.xml;
if (!string.IsNullOrEmpty(xml)) { throw new Exception("保存失败请查看:domMsg"); }
}
con.CommitTrans();
u8login.ShutDown();
MessageBox.Show("执行成功:" + VouchId);
}
catch (Exception ex)
{
con.RollbackTrans();
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
用数量2出返回dommsg错误,提示如下,我们可以进一步解析此xml返回客户端提示
把数量改为1,执行单据保存成功
总结
引用的错误提示
关于co
- 到这里你应该可以完成了其他出入库单的co接口,觉得有收获的话点个赞呗😀
其他库存接口大多类似,需要自行查看u8的单据表,观察u8的字段
关于源码
源码我就不直接给出了,引用不多,加上我大多贴了代码,建议自行操作一遍
- 不想自己敲代码的话可以联系qq243927103,请我喝杯奶茶发你源码,读后有收获也可打赏一下下哦😀