提问人:Darren Oxley 提问时间:2/6/2023 最后编辑:jarlhDarren Oxley 更新时间:2/7/2023 访问量:47
创建可更改的 SQL 编号以指定交货的工艺路线顺序
Create SQL Number that can be changed to specify the route order of deliveries
问:
我正在使用 SQL Server 并链接到 Access 前端。该项目用于交付货物。用户将添加 Sales,然后使用 Google 地图检查最佳路线(我没有使用 API 密钥的权限)。无论如何,他们都会添加一个订单,然后决定哪些订单将交付 1st、2nd、3rd 等。他们总是从总部出发,所以路线顺序为零。我需要确保数字没有重叠,这样我就可以按该数字排序,并根据该路线计算将要行驶的距离。 两个用户可以同时为“日期”和“车辆”添加一条记录(我使用一个表来存储每天和每辆带有 ID 的车辆。所以 Van 1 - 01/01/2023 是 ID:1。厢型车 2 - 01/01/2023 ID:2 等我在这里使用了一个 Orders 表,我需要存储 Route Order Sequence。用户将通过更改列表中的选定记录 Up 或 Down 来指定更好的路由,从而更改顺序。
到目前为止,我在 Access 中使用 VBA 来生成数字,但是如果我有两个用户尝试将订单添加到“同一车辆/日期”记录,则 VBA 将失败。我不想阻止用户添加到同一个 Van/Date,因为这种情况经常发生。另外,我不相信即使我这样做了,我的 VBA 也足够强大,可以提供正确的序列。理想情况下,我希望 SQL 处理数字,而不是 VBA。
答:
0赞
DaynaT
2/7/2023
#1
我曾使用过一个系统,该系统使用一个表中的主键来生成跨系统的唯一 ID。它利用了以下表结构。
CREATE TABLE [dbo].[OrderNumber]
( [OrderId] [int] NOT NULL,
[Assigned] [datetime] NOT NULL CONSTRAINT DF_OrderNumber_OrderId DEFAULT (GETDATE()),
CONSTRAINT [PK_OrderNumber] PRIMARY KEY CLUSTERED ([OrderId] ASC)
) ON [PRIMARY];
您需要确保填充了一个初始值:
INSERT dbo.OrderNumber (OrderId) VALUES (0);
从那里,您将需要使用包含事务的存储过程来确保该值是唯一的。可以使用 OUTPUT 子句来捕获插入的值。
ALTER PROCEDURE
dbo.GetOrderNumber
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION GetOrderNumbers;
DECLARE @Temp TABLE (OrderId INT);
INSERT INTO OrderNumber
( OrderId)
OUTPUT
inserted.OrderId
INTO
@Temp
SELECT
MAX(OrderId) + 1
FROM
OrderNumber;
COMMIT TRANSACTION GetOrderNumbers;
SELECT TOP 1 OrderId FROM @Temp;
END TRY
BEGIN CATCH
IF (@@TRANCOUNT = 0)
RETURN;
ROLLBACK TRANSACTION GetOrderNumbers;
THROW;
END CATCH;
END
如果检索数据时出错,则需要添加错误处理。
评论