Проблема подкачки источника данных (пересмотренная) - PullRequest
0 голосов
/ 16 мая 2019

Простая настройка тестирования: отдел: сотрудник, 1: М и форма поиска, которая позволяет выполнять фильтрацию по Emploee FirstName =, фамилия =, адрес электронной почты содержит, возраст> =, дата присоединения <= и соответствующий отдел =. </p>

Форма поиска с виджетами, привязанными к параметрам сценария запроса источника данных облака SQL.

Кнопка отправки в форме поиска, которая открывает страницу результатов запроса с таблицей, привязанной к источнику данных сценария запроса облака SQL.

скрипт запроса

var params = query.parameters;

return getEmployeeRecords_( 
  params.param_FirstName, 
  params.param_LastName, 
  params.param_Email, 
  params.param_StartDate, 
  params.param_Age, 
  params.param_Department
);

и

function getEmployeeRecords_( firstName, lastName, email, startDate, age,     
department) {

 var ds = app.models.Employee.newQuery();

 if ( firstName !== null ) {
    ds.filters.FirstName._equals = firstName;
 }
 if ( lastName !== null ) {
    ds.filters.LastName._equals = lastName;
 }
 if ( email !== null) {
    ds.filters.Email._contains = email;
 }
 if ( startDate !== null) {
    ds.filters.StartDate._greaterThanOrEquals = startDate;
 }
 if ( age !== null) {
    ds.filters.Age._lessThanOrEquals = parseInt(age, 10);
 }
 if ( department !== null) {
    ds.filters.Department.Department._equals = department;
 }

 var records = ds.run();

 // intention is to store this value for future use
 var recs = records.length;

 return records;
}

На странице результатов для подкачки источника данных сценария запросапросто сломанЗапрос, который корректно возвращает 8 записей, для которых размер страницы запроса установлен на 5, позволяет мне заставить пейджер перейти на страницу 1000, если я хочу, но источник данных всегда остается на первой странице записей.Если для размера страницы установлено, например, 100, правильно отображается правильный набор результатов.

Фактически все, что я делаю с такого рода запросами, имеет проблемы с подкачкой страниц.Если я вставлю этот код

var ds = app.models.Employee.newQuery();
//ds.filters.FirstName._equals = firstName;
//ds.filters.LastName._equals = lastName;
//ds.filters.Email._contains = '.com';
//ds.filters.StartDate._greaterThanOrEquals = startDate;
ds.filters.Age._lessThanOrEquals = 40;
//ds.filters.Department.Department._equals = department;
ds.sorting.Age._ascending();
var records = ds.run();
return records;

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

Если я использую скрипт построителя запросов, такой как

(
FirstName =? :param_FirstName and
LastName =? :param_LastName and
Email contains? :param_Email and
StartDate >=? :param_Startdate and
Age <=? :param_Age and
Department.Department =? :param_Department
)

и привязки, такие как

@datasources.Search_Query_Builder.query.parameters.param_FirstName

это работает без проблем.То же самое с прямой фильтрацией, где мы используем привязки, такие как

@datasources.Employee.query.filters.FirstName._equals

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

... Просто глядя на разрабатываемое реальное приложение и использование сценария запроса в редакторе сценария запроса источника данных, без параметров, без привязки, только этот код: -

var ds = app.models.Incident.newQuery();
ds.filters.Id._greaterThanOrEquals = 200;
ds.filters.Id._lessThanOrEquals = 300;
var records = ds.run();
return records;

и размер страницы, установленный на 20, и снова подкачка идет вверх по течению, никогда не выходит за пределы первой страницы записей, несмотря на увеличение номера страницы.

1 Ответ

0 голосов
/ 16 мая 2019

У меня есть несколько предложений, как решить эту проблему, хотя до сих пор неясно, что именно вызывает проблему подкачки и будут ли мои предложения устранять основную проблему. Однако в моей собственной прикладной среде у меня есть несколько случаев, когда я использую стандартную модель SQL и применяю фильтры к источнику данных из этой модели, а затем получаю параллельную вычисляемую модель (источник данных), которая возвращает общее количество записей, соответствующих применяемым фильтрам. на мой другой источник данных. Вот и мы:

Создайте новый источник данных под своей моделью Employee, оставьте его по умолчанию в типе «Построитель запросов», отрегулируйте размер страницы запроса по своему усмотрению, но желательно, чтобы что-то, что, как вы знаете, будет возвращать более одной страницы записей при запросе источник данных. Снимите флажок «автоматически загружать данные», если только вы не хотите загружать все записи при первом переходе на свою страницу, где вы устанавливаете свои фильтры. Не вводите ничего в построитель запросов.

Для вычисленного источника данных, который вы назвали Employee_RecordCount, добавьте свои параметры, FirstName_equals, LastName_equals, Email_contains, StartDate_greaterequals, Age_lessequals и Departments_equals, если вы этого еще не сделали. В этой рассчитанной модели у вас должно быть поле с именем RecordCount. В разделе сценария запроса этого источника данных вы должны указать свою функцию как return getEmployeeRecords_(query).

В разделе вашего серверного скрипта, где вашей функцией getEmployeeRecords является код, должен быть следующий код:

function getEmployeeRecords_(query) {
 var params = query.parameters;
 var ds = app.models.Employee.newQuery();

 if (params.FirstName_equals !== null ) {
    ds.filters.FirstName._equals = params.FirstName_equals;
 }
 if (params.LastName_equals !== null ) {
    ds.filters.LastName._equals = params.LastName_equals;
 }
 if (params.Email_contains !== null) {
    ds.filters.Email._contains = params.Email_contains;
 }
 if (params.StartDate_greaterequals !== null) {
    ds.filters.StartDate._greaterThanOrEquals = params.StartDate_greaterequals;
 }
 if (params.Age_lessequals !== null) {
    ds.filters.Age._lessThanOrEquals = parseInt(params.Age_lessequals, 10);
 }
 if (params.Department_equals !== null) {
    ds.filters.Department.Department._equals = params.Department_equals;
 }
 var records = ds.run();

 // update calculated model with record count
 var calculatedModelRecord = app.models.Employee_RecordCount.newRecord();
 calculatedModelRecord.RecordCount = records.length;

 return [calculatedModelRecord];
}

Теперь перейдите на страницу поиска, создайте новую панель или форму и установите для нее тот же новый источник данных, который вы создали. Убедитесь, что у вас есть все соответствующие поля и измените привязку этих полей на:

@datasource.query.filters.firstName._equals
@datasource.query.filters.lastName._equals
@datasource.query.filters.email._contains
@datasource.query.filters.StartDate._greaterThanOrEquals
@datasource.query.filters.Age._lessThanOrEquals
@datasource.query.fitlers.Department.Department._equals

Кнопка, запускающая поиск, должна иметь следующий код:

var ds = widget.datasource;
ds.load(function() {
  app.showPage(app.pages.YourSearchResultPage);
}
var calculatedDs = app.datasources.Employee_RecordCount;
var props = calculatedDs.properties;
props.FirstName_equals = ds.query.filters.firstName._equals;
props.LastName_equals = ds.query.filters.lastName._equals;
props.Email_contains = ds.query.filters.email._contains;
props.StartDate_greaterequals = ds.query.filters.StartDate._greaterThanOrEquals;
props.Age_lessequals = ds.query.filters.Age._lessThanOrEquals;
props.Department_equals = ds.query.filters.Department.Department._equals;
calculatedDs.load();

Теперь перейдите на страницу результатов поиска и убедитесь, что у вас есть следующие элементы:

  1. Панель, для источника данных которой установлено значение Employee_RecordCount. внутри эта панель создает метку и устанавливает привязку к @datasource.item.RecordCount.
  2. Таблица с установленным источником данных. к тому же источнику данных, который был создан на первом этапе. Убедитесь, что ваш В таблице включена «нумерация страниц».

Это должно быть все, и это работает в моем приложении. Это сложно настроить, но я боюсь, что это единственный обходной путь, чтобы иметь общее количество записей. Должен отметить, что у меня никогда не было проблем с подкачкой.

...