11.11.2009, 16:06 | #1 |
Участник
|
Find для Common-а
Задача: Метод принимает тип Common (заполненный), нужно узнать есть ли такая запись в таблице. Проблема в том, что мы не знаем какие поля для таблицы являются ключевыми ...
Самое реальное решение задачи, которое приходит мне на ум, это определить некий аналог метода find на базе common-а, для необходимых таблиц (это около 20 таблиц). Может быть, будут какие ни будь другие идеи? Скорость работы является достаточно критичным параметром.
__________________
PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. |
|
11.11.2009, 16:16 | #2 |
Участник
|
Ну, если есть гарантия, что на таблице есть ключевое поле(я), то можно их найти с помощью DictTable
И построить запрос указывая эти поля. Но вообще если у вас заполнена вся запись Common на входе, то возможно там заполнен и RecID? Тогда по нему |
|
11.11.2009, 16:16 | #3 |
Мрачный тип
|
Только по RecID и индексом по нему ...
Common, как и xRecord, для модификации пользователю недоступны
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
11.11.2009, 16:17 | #4 |
Участник
|
Посмотрите как реализованы методы Global::record2dynaKey и Global::dynaKey2record
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: 3oppo (1). |
11.11.2009, 16:25 | #5 |
Участник
|
Если будете делать так написали, то обязательно оберните всё это дело в Map.
На ум пришла ещё такая идея. Повесить уникальный индекс на нужные поля и попытаться вставить запись. Если такая уже есть, то вызовется исключение, которое можно перехватить, если нужно. Может ещё кто подскажет, как не вставляя запись вызвать такую проверку на уникальность (не уверен точно, сработает ли validateWrite) |
|
11.11.2009, 16:28 | #6 |
Участник
|
Цитата:
Думал.. Это долго.
__________________
PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. |
|
11.11.2009, 16:30 | #7 |
Участник
|
Зачем?
__________________
PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. |
|
11.11.2009, 16:33 | #8 |
Боец
|
Хы, интересно.
Мы не знаем, в какой таблице ищем. А что мы ищем - знаем? Т.е. у нас на входе: 1) Common 2) Некие критерии Вопрос - что предасталяют собой критерии? Если критерии - это значения каких-то полей, то что даст набор ключевых полей. К примеру, критерий поиска = ["ItemId1", "ItemName111"] - 2 поля ключевые поля таблицы = [ItemId] - 1 поле И что с этим делать? В любом случае искать придется по связке ItemId+ItemNam, и не важно - ключевой это набор или нет. |
|
11.11.2009, 16:38 | #9 |
Участник
|
|
|
11.11.2009, 16:44 | #10 |
Ищущий знания...
|
На мой взгляд поиск по RecId (как рекомендовал kashperuk) в Вашем случае, самое нормальное, другое трудно себе представить...
Не понятно как передать параметры (не в каком виде, а в каком порядке)... Не известно каких типов будут эти ключевые поля (string, date, int и т.п), что бы потом правильно подставить их в запрос... и ещё много можно придумать неизвестностей. а если говорить про поиск по RecId, то написали бы в классе SysDictTable статический метод find(TableId _tableId, RefRecId _recId, boolean _forUpdate = false) и думаю должно заработать.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
11.11.2009, 16:51 | #11 |
Участник
|
Что-то я не пойму.
У нас есть ReсId для поиска (или всё-таки нету?) Но нет уверенность, что этот RecId в нашу таблицу вставлен? |
|
11.11.2009, 16:57 | #12 |
Ищущий знания...
|
может кому пригодиться ради спортивного интереса создал у себя следующее:
1. В классе SysDictTable метод find(): X++: static Common find(TableId _tableId, RefRecId _recId, boolean _forUpdate = false) { Common common; DictTable dictTable; ; if (_recId != 0) { dictTable = new DictTable(_tableId); common = dictTable.makeRecord(); common.selectForUpdate(_forUpdate); select firstOnly common where common.RecId == _recId; } return common; } X++: static void testFindCommon(Args _args) { InventTable inventTable; Common common; ; select firstonly inventTable; // без forUpdate --> common = SysDictTable::find(inventTable.TableId, inventTable.RecId); info(strFmt('До update - %1', common.(fieldNum(InventTable, ItemId)))); // без forUpdate <-- // с forUpdate --> ttsbegin; common = SysDictTable::find(inventTable.TableId, inventTable.RecId, true); common.(fieldNum(InventTable, ItemId)) = common.(fieldNum(InventTable, ItemId)) + 'Тест'; common.doUpdate(); ttscommit; info(strFmt('После update - %1', common.(fieldNum(InventTable, ItemId)))); // с forUpdate <-- }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: 3oppo (1), propeller (1). |
11.11.2009, 17:02 | #13 |
Участник
|
Жалко, что нет возможность расширять класс Common, а то c кучи таблиц можно было бы снести метод findRecId
|
|
|
За это сообщение автора поблагодарили: 3oppo (1). |
11.11.2009, 17:08 | #14 |
Участник
|
Задача вроде ясно описана.
Поиск по RecID не интересует, так как его нет.
__________________
PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. |
|
11.11.2009, 17:10 | #15 |
Ищущий знания...
|
а можно и не расширять, а если понадобиться воспользоваться способом, который я описал выше и в преть не писать на всех таблицах метод findRecId
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
11.11.2009, 17:15 | #16 |
Участник
|
|
|
11.11.2009, 17:21 | #17 |
Ищущий знания...
|
приношу свои извинения за оффтоп
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
11.11.2009, 17:27 | #18 |
Участник
|
Есть все поля которые нужны для поиска нужной записи.. (можно сказать, что все из прайм индекса)
__________________
PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. |
|
11.11.2009, 17:31 | #19 |
Участник
|
Если вы будете пользоваться таким методом, вы потеряете статическуй типизацию метода find со всеми последствиями:
Не надо использовать такиме общие методы в конкретном коде. |
|
|
За это сообщение автора поблагодарили: 3oppo (1). |
11.11.2009, 17:35 | #20 |
Участник
|
Знаю что не очень хорошо.. Поэтому и ищу альтернативу. Но похоже что её нет..
__________________
PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. |
|