VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 888|回复: 3

delphi+sql 预防重复建临时表的问题

[复制链接]

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-11 01:30:01 | 显示全部楼层 |阅读模式
本人初学遇到如下问题,请各位高手鼎立帮忙!不胜感激!delphi+sql

      我做一个进销存的 进货单。进货单分为主表、明细表。现在在添加明细的时候,现要建一临时表,保证临时表内无重复现象。但不会建临时表,也不知怎么处理,各位有没有更好办法解决。

      主表(jh_master(dh单号(主键),ghs供货商,jhdate进货日期))
     明细表(jh_detail(dh单号(主键),spno商品编号(主键),qty数量))

现在进入页面先添入主表信息后,在添加多条明细,采用adoquery.append添加。但因为我的dbgrid设置的不自动存入数据库,所以必须等到保存时才adoquery.updatebatch保存。为了防止同一单据内商品编号不能重复。我要怎么处理。注意。adoquery.append时数据并没有存入数据库,所以不能查重复。所一想到建临时表,但我不会建。怎么处理呀!
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-4-17 15:30:01 | 显示全部楼层
在生成编号的方式上想办法;
不到事实表中去判断,而到专门存储当前编号中去判断;
例如:你可以单独在一个表t1中存储表的当前最大编号;然后在给个事件触发存储过程生成新的商品编号;
fx:
表t1中内容;
f1             f2
商品编号       sp000001
客户编号       kh000001


create procedure createNewID
@f1 varchar(20),
@ReturnID varchar(20)
as

declare
  @NewID varchar(20),
  @CurrID varchar(20)
--获取当前编号
  select @CurrID = f2 from t1 where f1 = @f1
--得到当前编号
  set @newID = convert(varchar(20),convert(int,right(@currid,6)))
  set @ReturnID = left(@Currid,8-len(@Newid))+@Newid
go


--测试结果
declare
  @Newid varchar(20)
exec createNewID '商品编号', @NewID output
print @Newid
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-4-17 16:45:01 | 显示全部楼层
不好意思;上面忘记一句将当前id更新回编号存储表中的语句;
完整代码应该是:
create procedure createNewID
@f1 varchar(20),
@ReturnID varchar(20)
as

declare
@NewID varchar(20),
@CurrID varchar(20)
--获取当前编号
select @CurrID = f2 from t1 where f1 = @f1
--得到当前编号
set @newID = convert(varchar(20),convert(int,right(@currid,6)))
set @ReturnID = left(@Currid,8-len(@Newid))+@Newid
--更新当前最新编号
update t1 set f2 = @ReturnID where f1 = @f1
go
回复

使用道具 举报

0

主题

13

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-7-6 12:45:01 | 显示全部楼层
create table #T(id int,...)
带个"#",就是临时表了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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