Difference between revisions of "Tab.UpdateLineEx"

From SunFlurry wiki
Jump to: navigation, search
1>Admin
 
m (1 revision imported)
 
(No difference)

Latest revision as of 19:07, 27 December 2025

  UpdateLineEx (Работа со строками)
Объект:Таблица
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, неверные имена столбцов
Визуальность:Нет

Функция обновляет строки, заданные аргументами для поиска или добавляет новую строку. Поиск начинается со строки, заданной вторым аргументом. Для всех строк, удовлетворящих условиям поиска, значения в столбцах, заданных аргументов с наименования столбцов обновления, будут изменены на аргументы, идущие за аргументом с наименованиями. Если ни одна строка не найдена, будет добавлена одна новая строка (режим добавления можно отключить, добавив знак "-" в начало перечисления столбцов поиска). Если применяется сортированный поиск (аргумент сортироки равен 1), строка вставляется в таблицу таким образом, чтобы не нарушить сортировку, заданную наименованиями столбцов первого аргумента. Если второй аргумент является переменной, в ней будет возвращен индекс добавленной строки или общее количество найденных и измененных строк в соотвествии с результатами поиска. Данная функция не использует текущую строку таблицы, что позволяет ее применять при работе с нескольми потоками (thread-safe). Важно: ни один из столбцов поиска не должен присутствовать в списке столбцов обновления.

Синтаксис

Tab.UpdateLineEx(<Наименования столбцов поиска через запятую (STRING)>,<Начальный индекс поиска, результирующий индекс (INT)>,<Значение столбца поиска 1>,<Значение столбца поиска 2>...,<Таблица сортирована по столбцам поиска (INT)>,<Наименования столбцов обновления через запятую (STRING)>,<Значение обновления столбца 1>,<Значение обновления столбца 2>...):<0, если строка добавлена, иначе количество обновленных строк (INT)>

Аргументы

  • <Наименования столбцов поиска через запятую (STRING)> - Строка содержит список наименований столбцов поиска через запятую. Регистр наименований не имеет значения. Каждый заданный столбец должен присутствовать в таблице. Первый символ этого аргумента может быть знаком + или -. В случае "+" функция добавляет новую строку, если не будет найдено ни одной существующей строки (это режим по умолчанию), в случае "-", функция не будет добавлять эту строку.
  • <Начальный индекс поиска, результирующий индекс (INT)> - (необязательный аргумент) (возможен аргумент-переменная (ByRef)) Переменная, содержащая начальную строку поиска. Если задана, также будет обновлена индексом добавленной строки (если строка была добавлена), или количеством обновленных строк (если не было необходимости добавлять строку).
  • <Значение столбца поиска ?> - (необязательный аргумент) Произвольные значения, которые необходимо найти в таблице в указанных в первом аргументе столбцах поиска. Количество аргументов должно совпадать с количеством столбцов. При добвлении строки, ее соответствующие столбцы будут заполнены этими значениями.
  • <Таблица сортирована по столбцам поиска (INT)> - (необязательный аргумент) Возможные значения 0 и 1. Если таблица была предварительно отсортирована по всем столбцам поиска по неубыванию (т.е. предварительно выполнена конструкция aTab.Sort(<Столбец1,Столбец2...>), либо для заполнения таблицы вызывалась функция aTab.AddLineSorted(<Столбец1,Столбец2...>,...)), будет происходить поиск с учетом сортировки (ускорение). Пример сравнения скорости работы функции для сортированных и не сортированных таблиц см. ниже. Важно: если таблица не была отсортирована по столбцам поиска, функция не будет работать корректно, если этот аргумент установлен.
  • <Наименования столбцов обновления через запятую (STRING)> - Наименования столбцов обновления, разделенные запятой. Для всех найденных в таблице строк их значения в этих столбцах будут изменены на значения последующих аргументов. При добавлении строки, ее соответствующие столбцы также будут заполнены этими значениями.
  • <Значение столбца ?> - (необязательный аргумент) Значения произвольного типа, которыми будут обновлены ячейки наденных строк таблицы, либо заполнены в добавляемой строке.

Возвращаемое значение

Возвращает 0, если строка добавлена, иначе количество обновленных строк.

Примеры

//Создается и заполняется таблица значений
aTab:=Tab.Create("b1,b2,b3,b4");

aTab.AddLine("b1,b2,b3,b4",1,2,3,4);
aTab.AddLine("b1,b2,b3,b4",2,2,3,4);
aTab.AddLine("b1,b2,b3,b4",3,5,5,4);
aTab.AddLine("b1,b2,b3,b4",4,2,3,4);
aTab.AddLine("b1,b2,b3,b4",4,2,3,4);
aTab.AddLine("b1,b2,b3,b4",5,2,3,4);

Message(aTab.UpdateLineEx("b1,b2",,2,2,0,"b3,b4",9,9));
//Выводит число 1 (количество изменненных строк)
//Вторая строка теперь содержит значения: 2,2,9,9.

Message(aTab.UpdateLineEx("b1,b2",,9,9,0,"b3,b4",9,9));
//Выводит число 0
//В таблице добавилась строка со значениями 9,9,9,9.


Сравнение скорости работы функций с сортировкой и функций без сортировки

Данный пример сравнивает скорость работы функции FindAndGoto для сортированной и не сортированной таблиц. Внутри цикла поиска также происходит увеличение массива с помощью функции AddLineSorted для проверки корректности ее работы.

См. также Пример поиска множества значений в сортированных таблицах.

ProfilerClear();
ProfilerStart();

randomize(1);
aTab:=Tab.Create("Col1,Col2,Col3");
For i:=1 To 100000 Do
  aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000));
EndDo;

For i:=1 To 10000 Do
  j:=Random(aTab.Size())+1;
  aCol1:=aTab.Get(j,"Col1");
  While _And(j>1,aTab.Get(j-1,"Col1")=aCol1) Do
    j:=j-1;
  EndDo;
  aTab.FindAndGoto(aCol1,,"Col1",1);
  If j<>aTab.CurLine Then
    Message("Проблема при поиске значения!","!");
  EndIf;
  //Добавление случайного значения внутри цикла поиска
  aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000));
EndDo;  

randomize(1);
aTab:=Tab.Create("Col1,Col2,Col3");
For i:=1 To 100000 Do
  aTab.AddLine("Col1,Col2,Col3",Random(10000),Random(10000),Random(10000));
EndDo;

aTab.Sort("Col1");
For i:=1 To 10000 Do
  j:=Random(aTab.Size())+1;
  aCol1:=aTab.Get(j,"Col1");
  While _And(j>1,aTab.Get(j-1,"Col1")=aCol1) Do
    j:=j-1;
  EndDo;
  aTab.FindAndGoto(aCol1,,"Col1");
  If j<>aTab.CurLine Then
    Message("Проблема при поиске значения (2)!","!");
  EndIf;
  //Добавление случайного значения внутри цикла поиска
  aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000));
EndDo;  

ProfilerStop();
debugbreak;

Message("Done!");
//Для i5, конечные результаты для среднего времени исполнения каждой операции:
//aTab.AddLineSorted() (нач. заполнение)   -- 3.61 сек.
//aTab.AddLine() и aTab.Sort();            -- 3.45 сек.
//aTab.FindAndGoto(aCol1,,"Col1",1);       -- 36 мс./10000
//aTab.FindAndGoto(aCol1,,"Col1");         -- 35010 мс./10000
//
//Как показывает эксперимент, для больших таблиц поиск в сортированной таблице имеет очень большое преимущество перед поиском без учета сортировки (1000 раз в нашем случае), 
//  преимущество будет только расти при увеличении количества строк в таблице
//Сортировка больших таблиц работает достаточно медленно, однако, использование функции AddLineSorted не имеет преимущества перед заполнением массива в случайном порядке, а затем его сортировкой.
//  AddLineSorted, однако, незаменим в случаях, когда необходимо добавлять строки в таблицу в цикле, в котором одновременно происходит сортированный поиск в этой же таблице.