创建可更改的 SQL 编号以指定交货的工艺路线顺序

Create SQL Number that can be changed to specify the route order of deliveries

提问人:Darren Oxley 提问时间:2/6/2023 最后编辑:jarlhDarren Oxley 更新时间:2/7/2023 访问量:47

问:

我正在使用 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。

SQL Server 序列

评论

0赞 Thom A 2/6/2023
你在这里的实际问题是什么,因为你什么都不问。如果您没有要问的问题,我们无法回答您的问题。
0赞 Darren Oxley 2/7/2023
对不起,Larnu - 我的问题是我怎样才能创建一个序列号来保持其完整性,用户可以更改它。因此,如果我有 OrderHeaderID: 100 RouteOrder 0。OrderHeaderID:101 RouteOrder 1。OrderHeaderID:102 RouteOrder =2。如果用户更改 RouteOrder OrderHeaderID 101,则 RouteOrder = 2,则 ID102 Route Order = 1。因此,它会对路由进行随机排序,以便 RouteOrders 始终正确。如果用户已将订单移至列表底部,则底部的订单已向上移动一行。
0赞 Thom A 2/7/2023
编辑您的问题以实际提出您的问题。
0赞 Darren Oxley 2/7/2023
更新记录时,如何确保 RouteOrder 编号正确无误。也就是说,如果有 5 条记录,则每条记录将具有 0,1,2,3,4 或任何 4,3,2,1,0。如果我指定的记录被分配了 RouteOrder+1(即在列表中向下移动),则下面的数字会正确更新。反之亦然,如果我指定的记录是 RouteOrder - 1,则 Order Sequence 保持其正确的顺序,因此始终存在 4.3.2.1.0。而不是 4,3,2,2,0 例如。不确定我能否更详细地表达我需要什么?这实际上有点复杂。
0赞 Darren Oxley 2/7/2023
例如,订单细分为销售和收款。销售必须始终首先交付。因此,所有销售将始终以 routeorder 0,1,2 和 Collections 3,4,5 列出。如果添加了新的销售,它将是 RouteOrder 3,所有集合都将更新为 RouteOrder +1,因此它们变为 4,5,6

答:

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

如果检索数据时出错,则需要添加错误处理。