我的桌子......
create table sale
(
idsale int primary key identity,
idclient int,
user1 varchar(50),
fecha datetime
)
create table listofsale
(
idsale int,
idproduct int,
amount int,
priceunit float,
subtotal
)
销售完成后我将插入全部 我指的是我要插入
的信息table sale
和listofsale
然后我做插入,但我怎么得到列表相同的idsale?
我的另一个想法是我的idsale是varchar (10)
我在c#中随机输入字母和数字,我将会拥有它
在文本框中,所以我可以同时保存它
或者,我可以用另一种形式做什么? 这样做的最佳方式是什么?
- 补充道 { 我总是有一个“插入”销售按钮并获得身份证, 之后你可以添加列表.. 但我知道这不是正确的形式.. 有时您没有列表的销售(如果您没有添加任何产品,并关闭应用程序并再次打开它) }
答案 0 :(得分:4)
使用SCOPE_IDENTITY()返回在当前会话中创建的最后一个标识值,并且也限制为当前范围。这解决了@@ IDENTITY的问题。
让INSERT语句通过OUTPUT子句(http://msdn.microsoft.com/en-us/library/ms177564.aspx)
不使用Int作为密钥,而是使用uniqueidentifier(GUID)。 好处:您可以创建ID客户端并将其提交给服务器。 下行:它将导致您的索引地狱。
如果由我决定并且我想100%确定我的ID值,那么我会使用上面的选项#。
答案 1 :(得分:1)
当你 INSERT INTO销售.... SQL @@ IDENTITY 变量将包含 idsale 的最后生成值。 您可以使用此值将所需的 idsale 插入 listofsale 表。
如果您需要更多信息,可以在http://msdn.microsoft.com/en-us/library/ms187342.aspx
找到答案 2 :(得分:1)
我有点难以理解问题所在。在阅读中,在我看来,您不一定在生成销售ID方面存在问题,而是在跨会话/计算机/实例/等维护一个客户的销售清单时? p>
假设: 1)特定客户一次只能有一个销售清单,并且 2)您的列“idclient”是该销售清单所属的客户的ID。
解决方案: 而不是寻找销售,寻找有问题的客户在桌面销售中的idclient。如果没有任何回复,请为该客户创建一个新的销售,如果它确实回来了,请使用该saleid。每当你需要那个saleid时就这样做。
更好的解决方案: 以上解决方案仅允许您为每个客户进行一次销售,从而销售清单。如果您想要任意数量的过去已完成的销售,但只需要一个当前的,打开一个,请执行以下操作:
向表格销售添加“isSaleCompleted”布尔列。仅在销售完成并完成时将其设置为true。 然后,在与上面相同的客户销售搜索中,还检查isSaleCompleted是否为false。
因此,客户销售搜索存储过程看起来如此:
CREATE Procedure ClientSaleSearch
(
@clientid int
)
SELECT saleid
From Sale
WHERE id=@userid AND isSaleCompleted = '0'
答案 3 :(得分:1)
我认为您不应该将主键(如idsale)作为varchar,因为它会降低搜索和检索数据的速度。尝试将idsale设为autonumber,并在sale表中插入数据后获取最后插入的标识值的id,并将其用于插入listofsale。
在处理我的销售点(TradeMeters)时,我设计了这样的表:
SaleItems
{
transaction_id int,
product_id int,
quantity float,
unit_price float,
discount float
}
注意小计不是必需的,因为您可以从金额和priceunit计算小计。
Subtotal = priceunit x amount