销售点逻辑

本文关键字:销售点 | 更新日期: 2023-09-27 18:01:47

my tables…

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呢?另一个想法是,我的理想值是varchar (10)我在c#中随机选取字母和数字,然后得到它在文本框中保存,同时输入

或者,我可以用什么其他形式呢?做这件事的最好方法是什么?

——补充道{我总是有一个按钮"插入"销售和获取id,然后你就可以添加列表了。但我知道这不是正确的形式。有时你有销售没有列表(如果你没有添加任何产品,并关闭应用程序,再打开它)}

销售点逻辑

您有几个选择。(更多信息在这里:http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/)

  1. 使用SCOPE_IDENTITY()返回当前会话中创建的最后一个标识值,并且仅限于当前范围。这就解决了@@IDENTITY的问题。

  2. 让INSERT语句通过OUTPUT子句(http://msdn.microsoft.com/en-us/library/ms177564.aspx)给您插入的ID

  3. 不要使用Int作为键,而是使用唯一标识符(GUID)。好处:您可以创建id客户端并将其提交给服务器。缺点:它会给你的索引带来麻烦

如果由我决定,我想100%确定我得到的ID值,那么我会使用上面的选项#2

我有点难以理解问题是什么。通读一遍,在我看来,你不一定有生成销售id的问题,但更重要的是,在跨会话/计算机/实例等为客户维护一个销售列表?

假设:1)一个特定的客户一次只能有一个销售清单2)列"idclient"是销售列表所属的客户的ID。

解决方案:不查找销售,而是查找所讨论的客户的表sale中的idclient。如果没有任何结果,就为该客户创建一个新的销售,如果确实有销售,就使用该销售id。当您需要该saleid时,请执行此操作。

更好的解决方案:上述解决方案只允许您有一个销售,因此销售列表,每个客户。如果您想要任意数量的过去已完成的销售,但只有一个当前已打开的销售,执行以下操作:

添加一个"isSaleCompleted"布尔列到表sale。仅当销售完成并完成时才将其设置为true。然后,在上面相同的客户销售搜索中,也检查isSaleCompleted是否为false。

因此,客户销售搜索存储过程看起来像这样:
CREATE Procedure ClientSaleSearch
(
    @clientid int
)
SELECT saleid
From Sale
WHERE id=@userid AND isSaleCompleted = '0'

INSERT INTO sale ....SQL @@IDENTITY变量将包含idsale最后生成的值。您可以使用该值将所需的idsale插入到listofsale表中。

如果你需要更多的信息,可以在这里找到http://msdn.microsoft.com/en-us/library/ms187342.aspx

我认为不应该将主键(如idsale)设置为varchar,因为这会减慢搜索和检索数据的速度。尝试将idsale作为自动编号,在sales表中插入数据后,获取最后插入的标识值的id,并使用它来插入listofsale。

当我在我的销售点(TradeMeters)工作时,我设计了这样的表:

SaleItems
{
    transaction_id int,
    product_id int,
    quantity float,
    unit_price float,
    discount float
}

注意不需要小计,因为您可以从金额和价格单位计算小计。

Subtotal = priceunit x amount