|
|||
George Wheels
12.11.13 — 11:13 |
Можно ли выполнить поиск в ещё не записанном наборе записей регистра сведений? |
||
skunk
1 — 12.11.13 — 11:14 |
если доступ к набору есть то пожалуйста |
||
George Wheels
2 — 12.11.13 — 11:15 |
(1) Не вижу метода для поиска:( |
||
skunk
3 — 12.11.13 — 11:17 |
Отбор и прочитать |
||
George Wheels
4 — 12.11.13 — 11:18 |
(3) Ещё не записан |
||
Ненавижу 1С
5 — 12.11.13 — 11:19 |
(4) действительно нет, тогда выгрузи набор в ТЗ |
||
skunk
6 — 12.11.13 — 11:19 |
тогда перебрать |
||
George Wheels
7 — 12.11.13 — 11:21 |
(5) Жаль. Количество записей +100500 и перед добавлением новой записи выгружать накладно. Не хотел использовать таблицу значений. |
||
Ненавижу 1С
8 — 12.11.13 — 11:23 |
(7) а ты всё храни и ищи только в ТЗ и только перед самой записью загрузи ее в набор |
||
George Wheels
9 — 12.11.13 — 11:25 |
(8) Сейчас параллельно заполняются набор записей и ТЗ. Хотел обойтись без ТЗ. |
||
George Wheels
10 — 12.11.13 — 11:25 |
Я так понял, что это невозможно. Так и оставляю. |
||
Ненавижу 1С 11 — 12.11.13 — 11:25 |
(9) даже в типовых ТЗ передается в модуль набора записей и там загружается |
TurboConf — расширение возможностей Конфигуратора 1С
Для поиска записей по полям служат методы Locate и Lookup, причем поля могут быть неиндексированными.
Функция Locate с объявлением:
virtual bool __fastcall Locate (const AnsiString KeyFields, const System::Variant &KeyValues, TLocateOptions Options);
ищет запись с заданными значениями полей. Если удовлетворяющие условиям поиска записи существуют, то указатель текущей записи устанавливается на первую из них. Если запись найдена, функция возвращает значение true, в противном случае значение false. Список полей, по которым ведется поиск, задается в параметре KeyFields, поля разделяются точкой с запятой. Параметр KeyValues указывает значения полей для поиска. Если поиск ведется по одному полю, то параметр содержит одно значение, соответствующее типу поля, заданного для поиска.
Параметр Options позволяет задать значения, которые обычно используются при поиске строк. Этот параметр принадлежит к множественному типу TLocateOptions и принимает комбинации следующих значений:
- loCaseInsensitive (регистр букв не учитывается)
- loPartialKey (допускается частичное совпадение значений)
Тип TLocateOptions по сути похож на тип TFilterOptions, определяющий параметры фильтрации по выражению, но значения loPartialKey и foNoPartialCompare имеют противоположное действие.
При наличии у параметра Options значения loPartialKey к нему автоматически добавляется значение loCaseInsensitive.
Пример поиска по одному полю:
void __fastcall TForm1::Buttonlclick(TObject *Sender)
{
TLocateOptions SOptions;
Table1->Locate(«Товар», «Магнитофоны», SOptions<<loCaseInsensitive);
}
Поиск выполняется по полю товар и ищется первая запись, для которой значением этого поля является строка магнитофоны. В качестве параметра Поиска используется значение loCaselnsensitive.
При поиске по нескольким полям в методе Locate параметр KeyValues является массивом значений типа Variant, в котором содержится несколько элементов. Для приведения к типу вариантного массива используется функция VarArrayOf c объявлением:
extern PACKAGE Variant __fastcall VarArrayOf(constVariant * Values, const int Values_Size);
Параметр Values_size определяет индекс последнего элемента массива. Порядок следования значений должен соответствовать порядку полей параметра KeyFields. Например:
void __fastcall TForm1::Button2Click(TObjееt *Sender)
{
TLocateOptions SOptions;
Variant arrvalues[]={Edit1->Text,Edit2->Text};
Table1->Locate(«Оплата/Валюта», VarArrayOf(arrvalues,1), SOptions<<loPartialKey<<loCaseInsensitive);
}
Поиск выполняется по полям оплата и валюта, ищется первая запись, для которой значение поля оплаты содержится в Edit1->Text, а значение поля валюты содержится в Edit2->Text. Регистр букв значения не имеет.
Значение loPartialKey параметра Options должно обеспечивать возможность частичного совпадения строковых значений в ключевых полях, по которым осуществляется поиск. В действительности поиск записи происходит только при строгом совпадении значений полей.
Обычно при разработке приложений пользователю предоставляется возможность влиять на процесс поиска с помощью элементов управления, расположенных в форме. При этом действия пользователя по управлению поиском в наборе данных мало чем отличаются от аналогичных действий при выполнении фильтрации.
Если имя поля или тип значения заданы неправильно, то при попытке выполнить метод Locate генерируется исключение.
Метод Locate позволяет вести поиск по любым полям, однако если поля индексированы или являются частью некоторого индекса, то соответствующий индекс при поиске используется автоматически. При этом также автоматически записи набора данных сортируются по указанному индексу. В результате, если условиям поиска удовлетворяет несколько записей, то будет найдена и установлена текущей первая в порядке сортировки запись. При использовании другого индекса порядок расположения записей, удовлетворяющих условиям поиска, может измениться, и будет найдена другая запись.
Для поиска в наборе данных также используется метод Lookup, который работает аналогично методу Locate. Метод имеет объявление:
virtual System::Variant __fastcall Lookup(const AnsiString KeyFields, const System::Variant &KeyValues,const AnsiString ResultFields);
и осуществляет поиск записи, удовлетворяющей определенным условиям. В отличие от метода Locate, она не перемещает указатель текущей записи на найденную запись, а считывает информацию из полей записи. Метод Lookup осуществляет поиск на точное соответствие значений для поиска и значений в полях записей с учетом регистра букв.
Параметры KeyFields и KeyValues имеют такое же назначение, как и в методе Locate, и используются аналогичным образом.
В параметре ResultFields через точку с запятой перечисляются названия полей, значения которых будут получены в случае успешного поиска. Эти значения считываются из первой найденной записи, удовлетворяющей условиям поиска. Порядок перечисления полей в ResultFields может отличаться от порядка полей в наборе данных.
В случае удачного поиска метод Lookup в качестве результата возвращает значение типа Variant, размерность которого зависит от списка полей ResultFields. Если список содержит одно значение, то метод возвращает значение одного поля, если в списке задано несколько полей, то метод возвращает массив Variant, число элементов которого совпадает с числом полей В списке ResultFields.
При неудачном поиске метод Lookup возвращает вариантный массив, для которого функция VarType возвращает значение varNull.
Пример использования метода Lookup приведен ниже:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
int C;
AnsiString A;
Variant V;
V = Table1->Lookup(«Continent;Capital», VarArrayOf(OPENARRAY(Variant, («South America»,»Brasilia»))), «Name;Area»);
if(!(VarType (V) == varNull))
{
A = V.GetElement(0);
С = V.GetElement(1);
ShowMessage(A + » имеет площадь = «+IntToStr(С) +» кв. км»);
}
else
ShowMessage(«Search unsuccessful!»);
}
В примере поиск ведется по полям континента Continent и столицы Capital, а из найденной записи считываются значения полей названия государства Name и его площади Area. Значение, по которому ищется запись, вводится в редакторе edtFindName. После поиска выполняется анализ егс успешности, и при положительном результате выводится диалоговое окно с данными полей найденной записи. Если запись не найдена, то выводится соответствующее сообщение.
Табаков Юрий
Программист
Автор и редактор проекта CuBook.PRO. Главная задача, которую я ставлю перед собой – донести до начинающих программистов удобочитаемый материал. Буду рад выслушать замечания и предложения. Не забываем ставить оценки и делать репосты =)
Поиск в наборе записей
Материал из K3-Macro
Команды dbFindFirst, dbFindLast, dbFindNext, dbFindPrevious осуществляют поиск записи, отвечающей определенному условию. Если поиск был успешным, найденная запись становится текущей. Если запись не найдена, положение текущей записи не изменяется. Проверить успешность поиска можно с помощью функции dbNoMatch (см. конец главы). Условие поиска задаётся текстовой строкой <Str>
, аналогичной по смыслу параметру <Filter>
в командах dbOpen, dbFilter
dbFindFirst <ID>, <Str>
Команда осуществляет поиск первой записи с начала набора записей, удовлетворяющей условию, заданному в строке <Str>
.
dbFindLast <ID>, <Str>
Команда осуществляет поиск первой записи с конца набора записей, удовлетворяющей условию, заданному в строке <Str>
.
dbFindNext <ID>, <Str>
Команда осуществляет поиск следующей за текущей записи, удовлетворяющей условию, заданному в строке <Str>
.
dbFindPrevious <ID>, <Str>
Команда осуществляет поиск предыдущей (перед текущей) записи, удовлетворяющей условию, заданному в строке <Str>
.
Функция получения результатов поиска в наборе записей[править | править код]
LOGICAL dbNoMatch(INT <id>)
Функция dbNoMatch возвращает единицу, если результат предыдущего поиска в наборе записей с номером <id>
был неудачен, иначе функция возвращает ноль.
Макро | Работа с файлами DBF dBASE IV | Обзор средств работы с наборами записей | Команды работы с наборами записей | Получение информации о наборе записей | Чтение информации из набора данных | Внесение информации в набор записей | Функции начала, конца набора записей и работы с закладками | Навигация по набору записей | Поиск в наборе записей | Результаты поиска в наборе записей
Поиск
записи, удовлетворющей заданным условиям,
означает переход к этой записи. Поиск
по индексированным полям происходит
быстрее. Кроме того ряд методов поиска
может работать только с индексированными
полями. Для поиска данных можно
использовать методы:
FindFirst
– поиск первого подходящего значения
FindLast
– поиск последнего подходящего значения
FindNext
– поиск следующего подходящего значения
FindPrior
– поиск записи предшествующей искомой
Locate
– для поиска по одному или нескольким
полям
Lookup
– просмотр не изменяет положение
курсора, возвращает значение требуемых
полей найденной записи
Поисковые
признаки задаются в списке параметров
методов. Последовательный поиск можно
организовать с помощью метода
FindNearest.
При этом поиск производится по мере
ввода поискового признака.
Поиск может выполняться по первичному
ключу (главному индексу) или по вторичному
индексу. Перед выполнением поиска должен
быть задан нужный индекс.
Для
поиска методом Locate
поля для поиска могут быть неиндексированными.
Метод
Locate ищет первую запись, удовлетворяющую
критерию поиска, и если такая запись
найдена, делает ее текущей. В этом случае
в качестве результата возвращается
значение True. Если запись не найдена,
возвращается значение False и курсор не
меняет своего положения.
function Locate(const
KeyFields: String;
const
KeyValues: Variant;Options: TLocateOptions): Boolean:
Список
KeyFields указывает поле или несколько
полей, по которым ведется поиск. В случае
нескольких поисковых полей их названия
разделяются точкой с запятой. Критерии
поиска задаются в вариантном массиве
KeyValues так, что i-e
значение
в KeyValues ставится в соответствие i-му
полю в KeyFields. Параметр Options указывает
необязательные значения режимов поиска:
1)
loCaselnsensitive — поиск ведется без учета
возможной разницы регистра букв в
текстовых полях и в критерии поиска;
2)
loPartialKey — запись считается удовлетворяющей
условию поиска, если она содержит часть
поискового контекста; например,
удовлетворяющими контексту «Диа» будут
признаны записи со значениями в поле
поиска «Диалект», «Диалог-МИФИ», «ДиаСофт»
и т. д.
Метод
Locate производит поиск по любому полю
независимо от того, входит оно в состав
какого-либо индекса или нет. Если поле
(поля) поиска входят в какой-либо индекс,
Locate автоматически использует его, что
существенно увеличивает скорость
поиска.
Пример
для поиска по одному поисковому признаку:
If
Table1.Locate(‘number’,123,[]) then s1 else s2;
Поиск
ведется по полю number
ищется первая запись для которой это
поле равно 123, все параметры поиска
отключены.
31. Методы поиска записей в наборе данных. Метод Lookup.
Поиск
записи, удовлетв заданным условиям,
означает переход к этой записи. Поиск
по индексированным полям происходит
быстрее. Кроме того ряд методов поиска
может работать только с индексированными
полями. Для поиска данных можно
использовать методы:
FindFirst
– поиск первого подходящего значения.
FindLast
– поиск последнего подходящего значения
FindNext
– поиск следующего подходящего значения.
FindPrior
– поиск записи предшествующей искомой
Locate
– для поиска по одному или нескольким
полям. Lookup
– просмотр не изменяет положение
курсора, возвращает значение требуемых
полей найденной записи
Поисковые
признаки задаются в списке параметров
методов.
Для
поиска методом Lookup
поля для поиска могут быть неиндексированными.
Последовательный поиск можно организовать
с помощью метода FindNearest.
При этом поиск производится по мере
ввода поискового признака.
Поиск может выполняться по первичному
ключу (главному индексу) или по вторичному
индексу. Перед выполнением поиска должен
быть задан нужный индекс.
Метод
Lookup находит запись, удовлетворяющую
условию поиска, но не делает ее текущей,
а возвращает значения некоторых ее
полей. Независимо от результата поиска
записи указатель текущей записи в НД
не изменяется. В отличие от метода Locate
метод Lookup осуществляет поиск только на
точное соответствие критерию поиска
значения поля поиска записи.
function
Lookup(const
KeyFields:
String;
const
KeyValues:
Variant;
const
ResultFields:
String):
Variant;
В
параметре KeyFields указывается список
полей, по которым необходимо осуществить
поиск (если задается поиск по нескольким
полям, соседние поля в списке разделяются
точкой с запятой). Параметр KeyValues
определяет поисковые значения полей,
список которых содержится в параметре
KeyFields. В параметре Result-Fields перечисляются
поля, значения которых требуется получить
в случае успешного поиска. Тип результата
— Variant или вариантный массив.
Если
имеется несколько поисковых полей,
каждому г’-му полю в списке KeyFields ставится
в соответствие i-e
значение
в списке KeyValues. Если поиск ведется по
одному полю, его поисковое значение
можно указывать в качестве KeyValues
непосредственно;
в
случае нескольких полей их необходимо
приводить к типу вариантного массива
при помощи функции преобразования
VarArrayOf. Как и в методе Locate, в качестве
поисковых полей можно указывать поля
как входящие в какой-либо индекс, так и
не входящие в него. Если в результате
поиска запись не найдена, метод Lookup
возвращает Null, что можно проверить с
помощью такого приема:
var
LookupResult:
Variant;
LookupResult
:= Tablel.LookupC…);
if
VarType(LookupResult)
= varNull then
…
Если
поиск оказался успешным, Lookup возвращает
из найденной записи значения полей,
список которых содержит ResultFields. При
этом размерность результата зависит
от того, сколько результирующих полей
указано в ResultFields.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
+7
Как прочитать записи регистра сведений установив отбор и удалить записи?
Прочитать записи регистра сведений можно двумя способами: Через Набор Записей или Менеджер
Вот пример через набор записей:
Код 1C v 8.х
// Добавление новых данных в существующую запись регистра сведений
НаборЗаписей = РегистрыСведений.ДокументоОборот.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Доставка.Установить(Доставка);
НаборЗаписей.Отбор.Этап.Установить(Этап);
НаборЗаписей.Прочитать();
Для каждого Запись из НаборЗаписей Цикл
Запись.ДатаВремя = ДатаР;
Запись.Отдел = фио.Подразделение;
Запись.ФИО = ПараметрыСеанса.ТекущийПользователь;
Запись.Документы = Документы;
Запись.Примечание = Примечание;
КонецЦикла;
НаборЗаписей.Записать();
Пример с использованием набора записей и менеджера записи:
Код 1C v 8.х
НаборЗаписей = РегистрыСведений.CRM_Напоминания.СоздатьНаборЗаписей();
Отбор = НаборЗаписей.Отбор;
Отбор.Объект.Установить(Объект.Ссылка);
Отбор.Завершено.Установить(Ложь);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
Если ЗадаватьВопрос Тогда
ТекстВопроса = "Завершить все напоминания для " + Строка(Объект.Ссылка) + " ?";
Ответ = Вопрос(ТекстВопроса,РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да);
Иначе
Ответ = КодВозвратаДиалога.Да
КонецЕсли;
Если Ответ = КодВозвратаДиалога.Да Тогда
Для каждого Запись Из НаборЗаписей Цикл
РегистрСведенийМенеджерЗаписи = РегистрыСведений.CRM_Напоминания.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(РегистрСведенийМенеджерЗаписи, Запись);
РегистрСведенийМенеджерЗаписи.Прочитать();
Если РегистрСведенийМенеджерЗаписи.Выбран() Тогда //напоминание небыло удалено
Если НЕ РегистрСведенийМенеджерЗаписи.УдалитьПоИстеченииСрока Тогда
РегистрСведенийМенеджерЗаписи.Завершено = Истина;
РегистрСведенийМенеджерЗаписи.Записать();
Иначе
РегистрСведенийМенеджерЗаписи.Удалить();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
А вот пример через менеджер записи:
Код 1C v 8.х
МенеджерЗаписи = РегистрыСведений.НоменклатураКонтрагентов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Контрагент = Контрагент;
МенеджерЗаписи.Номенклатура = СтрокаТаблицыТовары.Номенклатура;
МенеджерЗаписи.ХарактеристикаНоменклатуры = СтрокаТаблицыТовары.ХарактеристикаНоменклатуры;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
Вес = МенеджерЗаписи.ВесНоменклатурыКонтрагента;
КонецЕсли;