Мы можем начать с таблицы базы данных. Это может выглядеть
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");
}
}
}
Вышеупомянутый код не проверен, но я надеюсь, что основная идея должна быть ясна из него.
Здравствуйте, Олег, спасибо вам за ответ. Просто чтобы убедиться, что я понимаю ... У меня есть 2 стола. Основной и второй - с выпадающим списком. Когда я делаю запрос к базе данных из службы Java REST, я создаю внутреннее соединение, беря значения из основной таблицы и значения из столбца, содержащего значение DDL, из второй таблицы, и я передаю их в Grid. Верный? Кроме того, когда дело доходит до вставки данных в эти таблицы из jqGrid, я могу создать 2 вставных оператора? Тот, который отправляет данные в основную таблицу и 1, чтобы отправить значение DDL во вторую таблицу? – IvanSt
@IvanSt: Я предложил вам ** два варианта **: с использованием или без использования 'formatter:" выберите "', но с использованием 'edittype:" выберите «' в обоих случаях. Вторая таблица 'dbo.Order' содержит ссылки на идентификаторы' OrderStatusId' вместо текстов (например, 1 вместо ''Pending''). Если вы делаете INNER JOIN, вам не нужно * использовать идентификаторы на стороне клиента. Пример, который я описал более подробно, - это использование SELECT без INNER JOIN. Один заполняет сетку идентификатором 'dbo.OrderStatus'. Можно изменить приведенный выше код и заполнить «значение:» Ожидание: Ожидание; Активное: Активное «' from' orderStatus'. – Oleg
@IvanSt: у вас обычно будет только ** одна ** вставка в 'dbo.Order'. Пользователь увидит столбец 'orderStatus' как раскрывающийся список, и он сможет выбрать существующее значение статуса из предопределенного списка значений. Не нужно позволять пользователю создавать новый статус. Таким образом, один будет вставляться только один раз в 'dbo.Order'. Если вы используете SELECT с INNER JOIN, пользователь отправляет обратно * текст orderStatus *. Поэтому вам нужно будет выбрать Id по имени из 'dbo.OrderStatus', чтобы иметь' OrderStatusId' для вставки/редактирования элементов 'dbo.Order'. – Oleg