abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十一)
abp(net core)+easyui+efcore实现仓储管理系统目录
abp(net core)+easyui+efcore实现仓储管理系统——EasyUI前端页面框架 (十八)
五、使用存储过程创建单号
1. 在Visual Studio 2017的“解决方案资源管理器”中,右键单击“ABP.TPLMS.Core”项目的“IRepositories”文件夹,在弹出菜单中选择“添加” > “类”。如下图。
2.在弹出对话框中选择“接口”, 将接口命名为 IOutStockOrderRepository,然后选择“添加”。如下图。
3.在IOutStockOrderRepository接口定义我们需要用到的方法,代码如下。
using Abp.Dependency;
using Abp.Domain.Repositories;
using ABP.TPLMS.Entitys;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text; namespace ABP.TPLMS.IRepositories
{ public interface IOutStockOrderRepository: IRepository<OutStockOrder, int>, ITransientDependency
{ DbCommand CreateCommand(string commandText, CommandType commandType, params object[] parameters); /// <summary>
/// 创建单号
/// </summary>
/// <param name="name">单证名称代码</param>
/// <returns></returns>
string GetNo(string name); /// <summary>
/// 导入入库货物信息
/// </summary>
/// <param name="ids">导入库单的ID集合</param>
/// <param name="no">单号</param>
void ImportInStockOrder(string ids, string no); }
}
4. 在Visual Studio 2017的“解决方案资源管理器”中,右键单击“ABP.TPLMS.EntityFrameworkCore”项目的“Repositories”文件夹,在弹出菜单中选择“添加” > “类”, 将类命名为 OutStockOrderRepository,并继承IOutStockOrderRepository接口。实现接口中的方法。代码如下。
using Abp.Data;
using Abp.Dependency;
using Abp.EntityFrameworkCore;
using ABP.TPLMS.Entitys;
using ABP.TPLMS.IRepositories;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Text; namespace ABP.TPLMS.EntityFrameworkCore.Repositories
{ public class OutStockOrderRepository: TPLMSRepositoryBase<OutStockOrder, int>, IOutStockOrderRepository, ITransientDependency
{ private readonly IActiveTransactionProvider _transactionProvider; public OutStockOrderRepository(IDbContextProvider<TPLMSDbContext> dbContextProvider) : base(dbContextProvider)
{ } protected OutStockOrderRepository(IDbContextProvider<TPLMSDbContext> dbContextProvider,
IActiveTransactionProvider transactionProvider)
: base(dbContextProvider)
{ _transactionProvider = transactionProvider; } public DbCommand CreateCommand(string commandText, CommandType commandType, params SqlParameter[] parameters)
{ EnsureConnectionOpen();
var dbFacade = Context.Database;
var connection = Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetDbConnection(dbFacade); var command = connection.CreateCommand();
command.CommandText = commandText;
command.CommandType = commandType;
command.Transaction = GetActiveTransaction();
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter);
} return command;
} DbCommand IOutStockOrderRepository.CreateCommand(string commandText, CommandType commandType, params object[] parameters)
{ EnsureConnectionOpen();
var dbFacade = Context.Database;
var connection = Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetDbConnection(dbFacade); var command = connection.CreateCommand();
command.CommandText = commandText;
command.CommandType = commandType;
command.Transaction = GetActiveTransaction();
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter);
} return command;
} private void EnsureConnectionOpen()
{ var dbFacade = Context.Database;
var connection = Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetDbConnection(dbFacade); if (connection.State != ConnectionState.Open)
{ connection.Open();
} } private DbTransaction GetActiveTransaction()
{ return (DbTransaction)_transactionProvider.GetActiveTransaction(new ActiveTransactionProviderArgs
{ {"ContextType", typeof(TPLMSDbContext) },
{"MultiTenancySide", MultiTenancySide }
}); } string IOutStockOrderRepository.GetNo(string name)
{ SqlParameter[] parameters = {
new SqlParameter("Name",System.Data.SqlDbType.NVarChar,10),
new SqlParameter("BH", System.Data.SqlDbType.NVarChar,20)
}; parameters[0].Value = name;
parameters[1].Direction = System.Data.ParameterDirection.Output;
int cnt = Context.Database.ExecuteSqlCommand( "EXEC p_NextBH @Name, @BH output",
parameters); string no = parameters[1].Value.ToString();
if (cnt < 0)
{
no = string.Empty;
} return no;
} void IOutStockOrderRepository.ImportInStockOrder(string ids, string no)
{
SqlParameter[] parameters = { new SqlParameter("id",System.Data.SqlDbType.VarChar,500),
new SqlParameter("No", System.Data.SqlDbType.NVarChar,20) }; parameters[0].Value = ids + ",";
parameters[1].Value = no; int cnt = Context.Database.ExecuteSqlCommand(
"EXEC SP_ImportInStockOrder2ODO @id, @No",
parameters);
} }
}
5. 在这里我一共使用了两个存储过程,p_NextBH 与SP_ImportInStockOrder2ODO。其中p_NextBH在入库单管理中已经介绍过了。
6. 在这里介绍一下SP_ImportInStockOrder2ODO这个存储过程的实现,代码如下:
Create Proc [dbo].[SP_ImportInStockOrder2ODO]
@id varchar(500), --id组合
@No nvarchar(20) --编号
as CREATE TABLE #IdTable(Id int NULL) DECLARE @str VARCHAR(1000)
DECLARE @x xml select @str=@id
insert #IdTable
SELECT convert(int,id) id
FROM (SELECT [value] = CONVERT(XML,'<v>' +REPLACE(@str,',' ,'</v><v>')+ '</v>')) A
OUTER APPLY ( SELECT id = N.v.value('.' , 'varchar(100)')
FROM A.[value].nodes('/v') N (v)
) B DECLARE @BH nvarchar(20),@batch varchar(20),@maxseqno int
select @BH=@No
select @maxseqno=isnull(MAX(seqno),0) from [InStockOrderDetail] where InStockNo= @BH INSERT INTO [dbo].[OutStockOrderDetail]
([OutStockNo],[SupplierId],[CargoCode],[HSCode],[CargoName],[Spcf]
,[Unit],[Country],[Brand] ,[Curr],[Package],[Length],[Width],[Height],[Qty]
,[Vol],[LawfQty],[SecdLawfQty],[Price],[TotalAmt],[GrossWt],[NetWt]
,[LawfUnit] ,[SecdLawfUnit],[Batch],[InStockOrderDetailLocId],[Loc],[CreationTime]) SELECT @BH,supplierid,[CargoCode],[HSCode],[CargoName],[Spcf]
,[Unit],[Country],[Brand],[Curr] ,[Package],[Length],[Width],[Height],0 [Qty]
,[Vol] ,0 [LawfQty], 0 [SecdLawfQty] ,[Price],0 [TotalAmt],[GrossWt],[NetWt]
,'' [LawfUnit],'' [SecdLawfUnit],batch,id,loc,getdate() FROM
(select row_number() OVER ( order by b.id) seqno,a.supplierid,[CargoCode],[HSCode]
,[CargoName],[Spcf]
,[Unit],[Country],[Brand],[Curr] ,[Package],[Length],[Width],[Height],0 [Qty]
,[Vol] ,0 [LawfQty], 0 [SecdLawfQty] ,[Price],0 [TotalAmt],[GrossWt],[NetWt]
,'' [LawfUnit],'' [SecdLawfUnit],b.id,b.loc,Batch
from [dbo].InStockOrderDetail a inner join InStockOrderDetailLoc b
on a.Id=b.InStockOrderDetailId
left join (select InStockOrderDetailLocId,SUM(isnull(qty,0)) as qty from OutStockOrderDetail
group by InStockOrderDetailLocId
)c on b.Id=c.InStockOrderDetailLocId
where b.Qty-ISNULL(c.qty,0)>0
and b.Id in (select Id from #IdTable)
) iso drop table #IdTable
abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十一)的更多相关文章
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十二)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之四(五十三)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之五(五十四)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之六(五十五)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- Abp(net core)+easyui+efcore实现仓储管理系统——出库管理之七(五十六)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- Abp(net core)+easyui+efcore实现仓储管理系统——出库管理之八(五十七)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之二(五十)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之一(四十九)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十一)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
随机推荐
- flask提交表单验证不通过,以及CSRF攻击原理
学习表单的问题1. 提交表单时怎么都无法验证通过 记录一下,自己的学习bug,主要是因为在模板中书写渲染的语句时,把CSRF的字段名写错了. 因为在模板中书写一些语句是没有提示的,自己手动敲代码容易出 ...
- Oracle闪回flashback
参考资料:Using Oracle Flashback Technology Oracle 11g的新特性闪回操作 闪回查询 闪回查询 闪回版本查询 闪回事务查询 闪回数据 闪回表 闪回删除 闪回数据 ...
- redhat中的RHCS双机配置
1. 主机概述 主机名 主机IP 备注 node1 192.168.1.101 模拟fence设备 node2 192.168.1.102 rhcs双机节点 node3 192.168.1.103 r ...
- zepto | 用事件委托去解决无法给新增添的DOM添加事件的问题
前段时间在做一个任务的时候,碰见了一个问题:zepto无法用on事件去监听新增加的dom事件.这个问题用live可解决, 但是live在ios下失效,为了解决这个问题,我采用了暴力的方法去解决,每次添 ...
- Java多线程--AQS
ReentrantLock和AQS的关系 首先我们来看看,如果用java并发包下的ReentrantLock来加锁和释放锁,是个什么样的: 1 ReentrantLock reentrantLock ...
- 堆的源码与应用:堆排序、优先队列、TopK问题
1.堆 堆(Heap))是一种重要的数据结构,是实现优先队列(Priority Queues)首选的数据结构.由于堆有很多种变体,包括二项式堆.斐波那契堆等,但是这里只考虑最常见的就是二叉堆(以下简称 ...
- vulnhub靶机Os-hackNos-1
vulnhub靶机Os-hackNos-1 信息搜集 nmap -sP 192.168.114.0/24 找到开放机器192.168.114.140这台机器,再对这台靶机进行端口扫描. 这里对他的端口 ...
- pwnable.kr-lotto-witeup
执行分析题目代码,发现是输入值和十进制是1到45的ASCII码系统生成对应字母做比较:而比较方法是遍历输入值的所有位和系统生成字符串的每个位作比较,相同计数为6则爆出flag.漏洞啊,只要押中有一字母 ...
- Mac 系统下如何显示和隐藏文件
苹果Mac OS X操作系统下,隐藏文件是否显示有很多种设置方法,最简单的要算在Mac终端输入命令.显示/隐藏Mac隐藏文件命令如下(注意其中的空格并且区分大小写): 第一种方式: 显示Mac隐藏文件 ...
- 解析Vue-router相关干货及工作原理
本文主要介绍了vue-router相关基础知识及单页面应用的工作原理,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 单页面工作原理是通过浏览器U ...