2016-01-17 7 views
1

У меня есть jqGrid (последняя бесплатная версия jqGrid), заполненная данными из базы данных (MS SQL) с использованием службы REST Java. Один из столбцов jqGrid - это раскрывающийся список с 6 параметрами.Заполнение столбца таблицы SQL из другой таблицы

Мое назначение заключается в создании другой таблицы базы данных, содержащей значения выпадающего списка и использование внешних ключей/первичных ключей, я должен автоматически заполнять первые значения DDL таблицы.

Я не понимаю логики этого. Может ли кто-нибудь это сделать для меня? Как я могу это достичь. Я только отправляю идентификатор из jqGrid и в зависимости от этого идентификатора (1,2, .., 6) он выбирает, что нужно установить в столбце DD1 таблицы №1 (сравнение идентификатора, отправленного с идентификаторами таблицы, содержащей значения DDL)?

Я получаю чувство, что не очень хорошо себя чувствую ... Надеюсь, вы, ребята, понимаете меня.

ответ

2

Мы можем начать с таблицы базы данных. Это может выглядеть

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) 
) 

Это позволяет адресовать любой объект такого OrderStatus таблицы, Id или Name. 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 в данных или использовании соответствующего Name из dbo.OrderStatus:

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 

Если вы решили заполнить сетку идентификаторами (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) и вы размещаете как результаты в ответе сервера:

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

Для обработки orderStatus вам нужно добавьте следующее beforeProcessing, которое читает orderStatus и устанавливает editoptions.value столбца orderStatus сетки:

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"); 
     } 
    } 
} 

Вышеупомянутый код не проверен, но я надеюсь, что основная идея должна быть ясна из него.

+0

Здравствуйте, Олег, спасибо вам за ответ. Просто чтобы убедиться, что я понимаю ... У меня есть 2 стола. Основной и второй - с выпадающим списком. Когда я делаю запрос к базе данных из службы Java REST, я создаю внутреннее соединение, беря значения из основной таблицы и значения из столбца, содержащего значение DDL, из второй таблицы, и я передаю их в Grid. Верный? Кроме того, когда дело доходит до вставки данных в эти таблицы из jqGrid, я могу создать 2 вставных оператора? Тот, который отправляет данные в основную таблицу и 1, чтобы отправить значение DDL во вторую таблицу? – IvanSt

+0

@IvanSt: Я предложил вам ** два варианта **: с использованием или без использования 'formatter:" выберите "', но с использованием 'edittype:" выберите «' в обоих случаях. Вторая таблица 'dbo.Order' содержит ссылки на идентификаторы' OrderStatusId' вместо текстов (например, 1 вместо ''Pending''). Если вы делаете INNER JOIN, вам не нужно * использовать идентификаторы на стороне клиента. Пример, который я описал более подробно, - это использование SELECT без INNER JOIN. Один заполняет сетку идентификатором 'dbo.OrderStatus'. Можно изменить приведенный выше код и заполнить «значение:» Ожидание: Ожидание; Активное: Активное «' from' orderStatus'. – Oleg

+0

@IvanSt: у вас обычно будет только ** одна ** вставка в 'dbo.Order'. Пользователь увидит столбец 'orderStatus' как раскрывающийся список, и он сможет выбрать существующее значение статуса из предопределенного списка значений. Не нужно позволять пользователю создавать новый статус. Таким образом, один будет вставляться только один раз в 'dbo.Order'. Если вы используете SELECT с INNER JOIN, пользователь отправляет обратно * текст orderStatus *. Поэтому вам нужно будет выбрать Id по имени из 'dbo.OrderStatus', чтобы иметь' OrderStatusId' для вставки/редактирования элементов 'dbo.Order'. – Oleg

Смежные вопросы