【问题标题】:Populate SQL table column from another table从另一个表填充 SQL 表列
【发布时间】:2016-01-17 14:50:52
【问题描述】:

我有一个 jqGrid(最新的免费 jqGrid 版本)表,其中使用 Java REST 服务填充了来自数据库(MS SQL)的数据。其中一个 jqGrid 列是一个包含 6 个选项的下拉列表。

我的任务是创建另一个包含下拉列表值的数据库表,并使用外键/主键我必须自动填充第一个表 DDL 值。

我无法理解其背后的逻辑。有人可以向我解释一下吗?我怎样才能做到这一点。我是否只从 jqGrid 发送一个 ID,并根据该 ID(1,2,..,6) 选择在表#1 DDL 列中设置的内容(将发送的 ID 与包含 DDL 值的表的 ID 进行比较)?

我感觉我没有很好地表达自己......希望你们理解我。

【问题讨论】:

    标签: java sql sql-server jqgrid free-jqgrid


    【解决方案1】:

    我们可以从数据库表开始。它可能看起来像

    CREATE TABLE dbo.OrderStatus (
        Id int IDENTITY NOT NULL,
        Name nvarchar(100) NOT NULL,
        CONSTRAINT PK_LT_OrderStatus PRIMARY KEY CLUSTERED (Id),
        CONSTRAINT UC_LT_OrderStatus_Name UNIQUE NONCLUSTERED (Name)
    )
    

    它允许通过IdName 处理此类OrderStatus 表的任何项目。 UNIQUE CONSTRAINT 不允许添加重复名称。另一个表Order可以有列

    CREATE TABLE dbo.Order (
        Id int IDENTITY NOT NULL,
        OrderStatusId int NOT NULL,
        ...
    )
    
    ALTER TABLE dbo.Order  WITH CHECK ADD  CONSTRAINT FK_Order_OrderStatus
    FOREIGN KEY(OrderStatusId) REFERENCES dbo.OrderStatus (Id)
    

    在用数据填充网格时,您有两个主要选择:在数据中使用 OrderStatusId 或使用来自dbo.OrderStatus 的相应Name

    SELECT Id,OrderStatusId, ...  FROM dbo.Order
    

    SELECT Id,os.Name AS OrderStatus, ...
    FROM dbo.Order AS o
        INNER JOIN dbo.OrderStatus AS os ON os.Id=o.OrderStatusId
    

    如果您决定使用 id(OrderStatusId 值)填充网格,则必须使用 formatter: "select" 在相应列中显示文本(请参阅here)。它要求您必须让editoptions.value 填充来自dbo.OrderStatus 的所有不同值。实现这一点的最佳方法是扩展来自服务器的响应以使用您的自定义数据填充网格并使用beforeProcessing 设置editoptions.value。我在the answer 中描述了这个场景。我会在下面提醒你。

    让我们从服务器的响应看起来像

    {
        "rows": [{...}, {...}]
    }
    

    如果返回的数据看起来像

    [{...}, {...}]
    

    那么你应该包括包装。我建议你做

    SELECT Id,Name FROM dbo.OrderStatus
    

    另外dbo.Order (SELECT * FROM dbo.Order) 中进行主要选择,然后将 both 结果放在服务器响应中:

    {
        "orderStatus": [{"id":1, "name":"Pending"}, ...],
        "rows": [{...}, {...}]
    }
    

    要处理orderStatus,您需要添加以下beforeProcessing,即orderStatus 并设置网格orderStatus 列的editoptions.value

    beforeProcessing: function (response) {
        var $self = $(this), orderStatus = response.orderStatus, i, values = "";
        if (orderStatus != null && orderStatus.length > 0) {
            for (i = 0; i < orderStatus.length; i++) {
                if (values.length > 0) {
                    values += ";";
                }
                values += orderStatus[i].id + ":" + orderStatus[i].name;
            }
            $self.jqGrid("setColProp", "orderStatus", {
                editoptions {
                    value: values
                }
            });
            if (this.ftoolbar) { // filter toolbar exist
                $self.jqGrid("destroyFilterToolbar");
                $self.jqGrid("filterToolbar");
            }
        }
    }
    

    上面的代码没有经过测试,但希望从中能清楚大意。

    【讨论】:

    • 您好奥列格,感谢您的回复。只是为了确保我理解......我有 2 张桌子。主要的一个和第二个保存下拉列表值。当我从我的 Java REST 服务向数据库发出请求时,我创建了一个内部连接,从主表中获取值以及从第二个表中的 DDL 值保存列中获取值,并将它们提供给网格。正确的?另外,当从 jqGrid 向这个表中插入数据时,我是否创建了 2 个插入语句?一个发送数据到主表,1发送DDL值到第二个表?
    • @IvanSt:我建议你两个选项:使用或不使用formatter: "select",但在两种情况下都使用edittype: "select"。第二个表 dbo.Order 包含对 ID 的引用 OrderStatusId 而不是文本(例如 1 而不是 'Pending')。如果您进行 INNER JOIN,那么您不需要在客户端使用 id。我描述的更详细的例子是没有 INNER JOIN 的 SELECT 的用法。一个用dbo.OrderStatus 填充网格。可以修改上面的代码,从orderStatus填入value: "Pending:Pending;Active:Active"
    • @IvanSt:您通常只会在dbo.Order 中插入一个。用户将看到orderStatus 列作为下拉列表,他将能够从预定义的值列表中选择现有状态值。不需要允许用户创建新状态。因此,在dbo.Order 中只会插入一次。如果您将 SELECT 与 INNER JOIN 一起使用,则用户会发回 orderStatus 的文本。因此,您需要从 dbo.OrderStatus 中选择 Id by Name 以使用 OrderStatusId 插入/编辑 dbo.Order 的项目。
    • 我明白了。非常感谢。
    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多