C# 销售点的逻辑?
我的桌子C# 销售点的逻辑?,c#,sql,identity,point-of-sale,C#,Sql,Identity,Point Of Sale,我的桌子 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 销售清单 然后我进
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
销售清单
然后我进行插入,但是如何为列表获取相同的idsale?
我的另一个想法是我的idsale是varchar 10
我用c随机抽取字母和数字,我会得到它
在一个文本框中,这样我可以同时保存它
或者,我可以用什么其他形式来做?
做这件事最好的方法是什么
-增加
{
我一直有一个按钮可以插入销售并获取id,
完成后,您可以添加列表。。
但我知道这不是正确的形式。。
有时,如果您没有添加任何产品,那么您的销售没有列表,请关闭应用程序并再次打开它
}当您插入销售时。。。。
SQL@@IDENTITY变量将包含上次生成的idsale值。
可以使用此值将所需的idsale插入到listofsale表中
如果您需要更多信息,请在此处找到。当您插入销售时。。。。
SQL@@IDENTITY变量将包含上次生成的idsale值。
可以使用此值将所需的idsale插入到listofsale表中
如果您需要更多信息,可以在此处找到您有几个选项。更多信息请点击此处: 使用SCOPE_IDENTITY,它返回在当前会话中创建的最后一个标识值,并且也限于当前作用域。这解决了@@IDENTITY的问题 让INSERT语句通过OUTPUT子句为您提供插入的ID 使用uniqueidentifier GUID,而不是使用Int作为键。优点:您可以在客户端创建id并将其提交到服务器。缺点:这会给你的索引带来麻烦
如果由我决定,我想100%确定我要返回的ID值,那么我会使用上面的选项2。您有几个选项。更多信息请点击此处: 使用SCOPE_IDENTITY,它返回在当前会话中创建的最后一个标识值,并且也限于当前作用域。这解决了@@IDENTITY的问题 让INSERT语句通过OUTPUT子句为您提供插入的ID 使用uniqueidentifier GUID,而不是使用Int作为键。优点:您可以在客户端创建id并将其提交到服务器。缺点:这会给你的索引带来麻烦
如果由我决定,我想100%确定我要返回的ID值,那么我会使用上面的选项2。我很难理解问题是什么。通读一遍,在我看来,生成销售ID并不一定有问题,而是在跨会话/计算机/实例/等为客户维护一个销售列表时有问题 假设: 1特定客户一次只能有一份销售清单,以及 2您的idclient列是销售列表所属客户的ID 解决方案: 不要寻找销售,而是在表sale中寻找相关客户的idclient。如果没有任何结果,则为该客户创建一个新的销售,如果它确实有结果,则使用该saleid。只要你需要saleid,就这样做 更好的解决方案: 上述解决方案只允许您对每个客户进行一次销售,从而列出销售清单。如果您想要任何数量的过去已完成销售,但只有一个当前销售,请打开一个,执行以下操作: 将isSaleCompleted布尔列添加到sale表中。仅当销售完成并完成时,才将其设置为true。 然后,在与上面相同的客户销售搜索中,也检查isSaleCompleted是否为false 因此,客户端销售搜索存储过程如下所示:
CREATE Procedure ClientSaleSearch
(
@clientid int
)
SELECT saleid
From Sale
WHERE id=@userid AND isSaleCompleted = '0'
我有点难以理解问题是什么。通读一遍,在我看来,生成销售ID并不一定有问题,而是在跨会话/计算机/实例/等为客户维护一个销售列表时有问题 假设: 1特定客户一次只能有一份销售清单,以及 2您的idclient列是销售列表所属客户的ID 解决方案: 不要寻找销售,而是在表sale中寻找相关客户的idclient。如果没有任何结果,则为该客户创建一个新的销售,如果它确实有结果,则使用该saleid。只要你需要saleid,就这样做 更好的解决方案: 上述解决方案只允许您对每个客户进行一次销售,从而列出销售清单。如果您想要任何数量的过去已完成销售,但只有一个当前销售,请打开一个,执行以下操作: 将isSaleCompleted布尔列添加到sale表中。仅当销售完成并完成时,才将其设置为true。 然后,在与上面相同的客户销售搜索中,也检查isSaleCompleted是否为false 因此,客户端销售搜索存储过程如下所示:
CREATE Procedure ClientSaleSearch
(
@clientid int
)
SELECT saleid
From Sale
WHERE id=@userid AND isSaleCompleted = '0'
我认为您不应该将idsale这样的主键作为varchar,因为它是slo ws-down搜索和检索数据。尝试将idsale设置为自动编号,在sale表中插入数据后,获取上次插入的标识值的id,并将其用于在listofsale中插入 在处理我的销售点时,我设计了如下表格:
SaleItems
{
transaction_id int,
product_id int,
quantity float,
unit_price float,
discount float
}
注:小计不是必需的,因为您可以根据金额和价格单位计算小计
Subtotal = priceunit x amount
我认为不应该将idsale这样的主键设为varchar,因为它会减慢搜索和检索数据的速度。尝试将idsale设置为自动编号,在sale表中插入数据后,获取上次插入的标识值的id,并将其用于在listofsale中插入 在处理我的销售点时,我设计了如下表格:
SaleItems
{
transaction_id int,
product_id int,
quantity float,
unit_price float,
discount float
}
注:小计不是必需的,因为您可以根据金额和价格单位计算小计
Subtotal = priceunit x amount
我知道!但是如果你在两台计算机上同时做,会发生什么呢?我不想有这个问题@sashai如果在两个不同的客户端上插入@@IDENTITY,则每个客户端的值都不同,因为每个客户端都有1个插入@@标识具有SQL会话作用域。表示它不是在SQL会话之间共享的。好的,您有两个不同的值,但是如果我从sale中选择maxidsale并将其添加到我的表listofsale中,那么它将获得最后一个!,在计算机1和计算机2中,将使用idsale和lastnumber添加到销售列表中,这将是一个问题@萨沙:不一定。如果涉及到触发器,@identity可以引用与OP后面的内容无关的其他标识值。@angel:您不能信任select maxidsale。。。如果有多个插入几乎同时发生,那么它就不起作用。我知道!但是如果你在两台计算机上同时做,会发生什么呢?我不想有这个问题@sashai如果在两个不同的客户端上插入@@IDENTITY,则每个客户端的值都不同,因为每个客户端都有1个插入@@标识具有SQL会话作用域。表示它不是在SQL会话之间共享的。好的,您有两个不同的值,但是如果我从sale中选择maxidsale并将其添加到我的表listofsale中,那么它将获得最后一个!,在计算机1和计算机2中,将使用idsale和lastnumber添加到销售列表中,这将是一个问题@萨沙:不一定。如果涉及到触发器,@identity可以引用与OP后面的内容无关的其他标识值。@angel:您不能信任select maxidsale。。。如果有多个插入几乎同时发生,则它不起作用。