Как программно связать вновь созданные записи с записью из другой таблицы - PullRequest
0 голосов
/ 16 июня 2019

Заранее спасибо за совет!

Справочная информация Я создаю базу данных для отслеживания заказов, размещаемых клиентами.

An 'Orders 'таблица хранит общие сведения о заказе, такие как имя клиента, дата заказа и требуемая дата доставки.

В отдельной таблице' Order_Items 'хранятся определенные товары, которые заказал клиент.

Это отношение один-ко-многим между таблицей 'Orders' и таблицей 'Order_Items', т. Е. У одного 'Order' может быть много 'Order_Items', но каждый 'Order_Item 'должен быть связан только с одной' Order '.

Текущее состояние В настоящее время у меня есть страница, где пользователь создает новую запись' Order '.Затем пользователь попадает на другую страницу, где он может создать столько записей «Order_Item», сколько необходимо для заказа.

Желаемое состояние То, чего я хотел бы достичь, это: Когдапользователь создает новые записи Order_Item, автоматически выделяет текущую запись Order в качестве внешнего ключа для новой записи Order_Item.

Что я пробовалПока что

Действие пользователя вручную: Один из способов установить связь между 'Order' и всеми его Order_Items состоит в добавлениираскрывающийся виджет, который эффективно запрашивает у пользователя что-то вроде «К какому номеру заказа принадлежат все эти элементы»? Затем действие пользователя установит связь между двумя таблицами и свяжет одну 'Order'со многими' Order_Items '.Однако моя цель состоит в том, чтобы этот шаг обрабатывался программно.

Официальная документация: Я ссылался на официальную документацию , которая была полезна, но как яЯ все еще учусь, я не знаю точно, что искать.Функция prefetch показалась многообещающей, но фактически не устанавливает связь;он просто загружает связанные записи более эффективно.

Учебники App Maker: Я нашел учебник App Maker , который создает приложение HR, где пользователь может создать список из 'Departments ', затем создайте список' Employees ', а затем свяжите' Employee 'с' Department '.Однако в примере приложения это соединение устанавливается пользователем вручную.В моем желаемом состоянии я хотел бы, чтобы ссылка была установлена ​​программно.

Режим ручного сохранения: Я также пытался переключиться на режим ручного сохранения , чтобы пользователь могдолжен создать черновую запись Orders, а затем несколько черновых записей Order Items и затем сохранить их все сразу.Однако мне не удалось заставить эту работу.Я не уверен, является ли неудача этого подхода причиной того, что 1) я пытаюсь создать черновые записи для более чем одной таблицы, 2) я просто делаю это неправильно, или 3) мне показалось, что я где-то читал этот черновикзаписи устарели.

Другие идеи

Я очень новичок в этой области и могу ошибаться, но у меня есть ощущение, что мне может понадобиться использовать некоторые сценарии для установления связи,Например, возможно, я мог бы использовать глобальную переменную, чтобы запомнить, какой «Order» создает пользователь.Затем для каждого 'Order_Item' я мог бы использовать событие onBeforeCreate для запуска сценария, который устанавливает связь между 'Order_Item' и 'Order', который был запомнен из ранее установленной глобальной переменной.

Обновленный вопрос

Спасибо Маркусу и Морфинизму за ваши ответы.Я использовал оба ответа с некоторым успехом.

Morfinismo: Я успешно использовал код, на который вы указали мне в существующих записях, но не могу заставить его работать для вновь созданных записей.

Например:


widget.datasource.createItem(); // This creates a new record

var managerRecord = app.datasources.Manager.item; // This sets the Manager of the currently selected parent record as a variable successfully. 

var teamRecord = app.datasources.Teams.item; // This attempts to set the Manager of the currently selected record as a variable. However, the record that was created in line 1 is not selected. Therefore, App Maker does not seem to know which record this line of code relates to and returns the error Cannot set property ‘Manager’ of null.

// Assign the manager to the team.
teamRecord.Manager = managerRecord; // This successfully assigns the manager but only in cases where the previous line of code was successful (i.e. existing records and not newly created ones).

Есть ли у вас какие-либо предложения или комментарии по поводу того, как применить этот код к записям, которые создаются начальной строкой кода в строке 1?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Я нашел самый простой способ создания связанных элементов для таких ситуаций, как ваша, - это на самом деле импортировать форму с источником данных, установленным в Parent: Child (relation) или Parent: Child (relation) (create). Таким образом, в вашем случае источник данных должен быть установлен на Order: Order_Items (relation).

Это можно сделать двумя разными способами, используя мастер виджетов форм:

Вариант 1:

  1. Если для источника данных вашей страницы установлено значение Order_Items, перетащите форму на свою страницу.
  2. В разделе выбора источника данных ваш источник данных в виджете формы должен по умолчанию иметь значение «Inherited: Order_Items». Нажмите кнопку «Дополнительно» в нижнем левом углу, затем в категории источников данных найдите «Порядок» в качестве источника данных, затем выберите отношения в следующем поле, а затем в следующем поле «Порядковые элементы», выберите «Вставить только» или «Изменить» и тогда соответствующие поля вы хотите в форме.
  3. Теперь каждый элемент, который создается в этой форме, автоматически становится дочерней записью текущей выбранной записи в вашем источнике данных Order.

Вариант 2:

  1. Если для источника данных вашей страницы установлено значение Порядок, перетащите форму на свою страницу.
  2. В разделе выбора источника данных ваш источник данных в виджете формы должен по умолчанию Inherited: Order. Прокрутите вниз в разделе выбора источника данных, пока не найдете Order: Order_Items (relation), затем выберите форму «Только вставка» или «Редактировать», а затем соответствующие поля в форме.
  3. Теперь каждый элемент, который создается в этой форме, автоматически становится дочерней записью текущей выбранной записи в вашем источнике данных Order.

В вашей модели Order убедитесь, что параметр безопасности установлен соответствующим образом, чтобы пользователь мог создавать отношения Order_Items в Order. На мой взгляд, это самый простой подход, так как вам не нужно жестко кодировать родителя в скриптах формы или клиента / сервера. Он автоматически основан на текущем выбранном родительском элементе и по сути делает то же самое, что @Morfinismo объяснил в разделе клиентского скрипта.

0 голосов
/ 17 июня 2019

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

Для управления отношениями с помощью клиентский скрипт :

var managerRecord = app.datasources.Manager.item;
var teamRecord = app.datasources.Teams.item;

// Assign the manager to the team.
teamRecord.Manager = managerRecord;

// Changes are saved automatically if the datasource in auto-save mode

// Add a team member to a Manager's team.
// Note: Retrieve Members on the client before proceeding, such as by using prefetch option in datasource - datasources Team -> Members)
var engineerRecord = app.datasources.TeamMember.item;
teamRecord.Members.push(engineerRecord);

Для управления отношениями с помощью серверный скрипт :

// Get the record for the Team to modify.
var teamRecord = app.models.Teams.getRecord("team1");

// Assign a manager to the Team.
var managerRecord = app.models.EmployeeDB.getRecord("manager1");
teamRecord.Manager = managerRecord;

// Note: The new association is not saved yet

// Assign a team member to the Team.
var engineerRecord = app.models.EmployeeDB.getRecord("engineer1");
teamRecord.Members.push(engineerRecord);

// Save both changes to the database.
app.saveRecords([teamRecord]);

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

...