06.09.2006, 19:42 | #1 |
Moderator
|
Пользовательский генератор строк-перечислений для критерия запроса в Axapta
Пользователям Axapta в нашей компании иногда приходится создавать различные журналы для произвольных подмножеств элементов некоторых справочников. Например, необходимо сторнировать амортизацию для некоторого списка карточек ОС, причем коды карточек (инвентарные номера) идут не подряд и поэтому задание критерия выбора таких карточек посредством указания диапазона вида "ПерваяКарточка..ПоследняяКарточка" не представляется возможным. Можно использовать только вариант задания критерия в виде строки, в которой коды карточек перечислены через запятую. Для 5-10 карточек это сделать несложно, но как быть, если карточек 100 или 200?
Как задача решается сейчас? Пользователь присылает мне список нужных карточек в виде столбца в файле Excel. Я окружаю эти данные некоторым количеством "шаманских" формул и получаю большую длинную строку, состоящую из кодов этих карточек, разделенных запятыми. Затем делю эту большую строку на подстроки такого размера, чтобы они помещались в поле "Критерий" формы задания параметров запроса, после чего создаю в этой форме необходимое количество новых строк (в полях "Таблица" и "Поле" задаю соответственно "Основные средства" и "Инв. номер ОС") и далее при помощи серии из нескольких "копипастов" (Copy/Paste) вручную "перебрасываю" данные из Excel в ячейки колонки "Критерий". После всех этих манипуляций я формирую нужный журнал и "возвращаю" его заинтересованному пользователю для проверки, редактирования и разноски. В целом, задача и для меня достаточно рутинна, но все же не так утомительна, как для пользователя, который не владеет этой технологией. И вот сегодня мне в очередной раз "всё это надоело" и я решил наконец облачить своё несложное "ноу-хау" в форму инструкции, пригодную для использования широкой пользовательской общественностью. Итак, рассмотрим построение генератора строк "своими руками" в русской версии Excel . Для этого нам потребуется чистый рабочий лист. Если он уже приготовлен, то выполните на нём следующие шаги: 1.В ячейку A1 введите строку: Элементы списка 2.В ячейку B1 введите строку: Строки критериев 3.Ячейка С1 должна оставаться пустой 4.В ячейку D1 введите максимально допустимое кол-во символов в строке критерия. В моей Аксапте это значение равно 250. Если вы не уверены в этом значении для вашей системы, то можете спросить у IT-специалистов, эксплуатирующих вашу Axapta, о "размере EDT Range". Помимо ввода значения, для дальнейшего удобства установите для ячейки D1 выравнивание по центру. 5.В ячейку E1 введите строку: <= максимально допустимое кол-во символов в строке критерия 6.В ячейку B2 введите (скопируйте отсюда) формулу: =ЕСЛИ( ИЛИ( ЕПУСТО(C1), (ДЛСТР(A2)+1+C1)>$D$1 ), A2, B1 & "," & A2) (ВАЖНО: если у вас в качестве разделителя списка в Windows используется точка с запятой, а не запятая, как у меня, то замените в этой формуле первые три запятые на точки с запятой. Самую последнюю запятую во фрагменте формулы & "," & трогать не надо!) 7.В ячейку C2 введите формулу: =ДЛСТР(B2) 8.В ячейку D2 введите формулу: =C3<C2 9.Встаньте на ячейку A2 и выполните команду меню: Окно \ Закрепить области 10.Выделите диапазон A1 : D2 и выполните команду меню: Данные \ Фильтр \ Автофильтр Ваш шаблон готов. Для его пробы следует скопировать некоторый столбец данных в колонку A, начиная с ячейки A2. После выполнения этой операции скопируйте формулы, находящиеся в ячейках диапазона B2 : D2, в ячейки, расположенные под этим диапазоном до строки, определяемой последней непустой ячейкой в колонке A. Самый быстрый из известных мне способов такого развертывания формул вниз заключается в следующем: выделите мышкой диапазон B2 : D2, после чего наведите мышку на правый нижний угол ячейки D2, так чтобы курсор принял форму крестика, и выполните двойной щелчок. Выполнив всё вышеперечисленное, отфильтруйте колонку D по значению "ИСТИНА". На экране останутся только необходимые вам строки. Далее последовательно копируете ячейки из колонки B в ячейки колонки "Критерий" формы задания параметров запроса в Axapta. Всё. Сохраните ваш Excel'ный генератор для будущего использования. В дальнейшем вы просто будете стирать старые значения в колонке A и помещать в нее новые наборы данных, не забывая добавлять или удалять формулы в колонках В,С,D в соответствии с количеством значений в колонке A. P.S. ----------- Для английской версии Excel формулы для ячеек B2 и C2 будут выглядеть соответственно как =IF( OR( ISBLANK(C1), (LEN(A2)+1+C1)>$D$1 ), A2, B1 & "," & A2) и =LEN(B2) А колонку D в случае английской версии надо будет фильтровать по значению TRUE. Ну и, конечно же, зарегистрированные пользователи Форума могут не делать описанную выше "самостоятельную работу", а сразу воспользоваться прилагаемым файлом CriteriaGenerator.xls СОВЕТ: Если вы себя чувствуете не очень уверенно при поштучном копировании ячеек из колонки "B" Excel в ячейки колонки "Критерий" Axapta (некоторый "страх" может возникать из-за того, что в ячейке Excel содержится формула, а в "Критерий" попадает вычисленный результат этой формулы, который к тому же не виден полностью), то можно сначала выделить и скопировать все нужные ячейки из колонки "B" Excel в Блокнот (Notepad) и далее уже из Блокнота поштучно копировать эти полностью видимые строки в ячейки-критерии Axapta. Последний раз редактировалось Gustav; 15.09.2006 в 09:17. |
|
|
За это сообщение автора поблагодарили: mau (1), kvg6 (1). |
06.09.2006, 23:39 | #2 |
Аманд
|
Цитата:
Пользователь присылает мне список нужных карточек в виде столбца в файле Excel
И возможно сначала отфильтровать по более крупному критерию или всё-таки найти объединящий критерий для этих списков и т.д. |
|
07.09.2006, 09:55 | #3 |
Moderator
|
Цитата:
Сообщение от Vals
А откуда пользователи берут эти инв. номера?
Копипаст из гридов Axapta в таблицы Excel выполняется существенно проще, чем в обратном направлении. Пользователи (бухгалтеры) что-то выкачивают из Axapta, анализируют, тасуют-сортируют в Excel'е эти карточки по своим, только им одним ведомым, соображениям и потом желают поместить их в один журнал и выполнить с этими карточками определенные действия (сторнировать, переоценить и т.п.) Разумное желание? Вполне. Рассмотрим живой пример возникновения такого рода потребности работы на "неорганизованном" подмножестве карточек. К фирме в результате слияния присоединилась другая фирма, которая раньше была самостоятельным субъектом со своей деятельностью, балансом, расчетными счетами и т.п. Основные средства присоединяемой компании брались на баланс основной компании как раз на этапе внедрения Axapta в последней. В спешке переходного периода не все нюансы были учтены правильно и впоследствии возникла необходимость в проведении соответствующих корректирующих операций. ОС из присоединяемой фирмы, которые попали под эту "раздачу", относятся к совершенно разным группам, имеют разные сроки использования, имеют самые разнообразные даты ввода в эксплуатацию и т.п. - т.е. поиск некоторого объединяющего их в рамках запроса короткого критерия крайне затруднителен (если вообще возможен) и усилия, затрачиваемые на попытку поиска такого критерия, вряд ли можно считать оправданными. Сколько времени вам потребовалось на чтение и воплощение (если воплощали) моего "ноу-хау" из первого поста? Думаю, минут 15-20, вряд ли больше. А дальше будет еще быстрее - ведь генератор уже готов. Не думаю, что успешный поиск "серебрянного" короткого критерия в сложной "неорганизованной" ситуации будет также быстр, а на заведомо неуспешный так и время тратить нечего. Цитата:
Сообщение от Vals
И возможно сначала отфильтровать по более крупному критерию или всё-таки найти объединящий критерий для этих списков и т.д.
Если вопрос, то нет, нельзя (см. выше). Если утверждение (пожелание), то опять-таки см. выше. Но не понятно при этом, как, например, "СНАЧАЛА отфильтровать" - кнопка "Выбор" нам, скажем так, "предоставляется" перед расчетом тех же ОС всего "один раз" и за этот "один раз" мы и должны задать все наши критерии отбора. Разве не так? |
|
07.09.2006, 11:58 | #4 |
Участник
|
Получается, что есть некий бизнес-процесс (анализ, сортировка, принятие решений на их основе), у которого на входе Аксапта и на выходе Аксапта.
Мне кажется, имеет смысл реализовать этот бизнес-процесс в Axapta. А затем пользователям набор галочек (принцип действия аналогичен полю "Немедленная поставка" - пользователь сам набирает строки для обработки), по которым они смогут наложить фильтр и выполнить массовую операцию. |
|
07.09.2006, 17:48 | #5 |
Moderator
|
Цитата:
Сообщение от Atani
Получается, что есть некий бизнес-процесс (анализ, сортировка, принятие решений на их основе), у которого на входе Аксапта и на выходе Аксапта.
Цитата:
Сообщение от Atani
Мне кажется, имеет смысл реализовать этот бизнес-процесс в Axapta. А затем пользователям набор галочек (принцип действия аналогичен полю "Немедленная поставка" - пользователь сам набирает строки для обработки), по которым они смогут наложить фильтр и выполнить массовую операцию.
Ну, и для для полной, надеюсь, ясности - еще один, уже совсем "разжёваный", примерчик (расписывал, считайте, в течение всего дня, отнимая кванты времени у святых перекуров! о!). Итак, есть некий столбик значений, неважно где: в Блокноте, в Excel'е... Положим для простоты, что в Блокноте (мы знаем, что всегда легко можем сделать переброску Блокнот <=> Excel). Не смотрите, что для примера взяты числа, идущие подряд (для таких чисел мы, естественно, бы использовали критерий вида 1..10). Считайте, что это как бы не сами значения, а их индексы в списке... ну, вы меня поняли! ): 1 2 3 4 5 6 7 8 9 10 Этот столбик "значений" нужно загнать в колонку "Критерий" таблицы на закладке "Условия" формы задания параметров запроса (SysQueryForm). Вариантов два: - либо создать в этой таблице 10 новых строк и скопировать эти 10 значений по отдельности в 10 ячеек колонки "Критерий" ("по отдельности" - потому что, ну, нельзя, увы, это сделать "как в Excel'е" - копированием диапазона ячеек); - либо перечислить эти 10 значений в одной строке через запятую и использовать только одну строку таблицы для задания критерия (а не 10). Первый способ с 10-ю строчками нам явно не интересен (потому что: а если их будет 100 или 1000?). Поэтому остановимся на втором. Как можно быстро получить строку во втором способе вручную? Например, за два шага так: - пробежаться по концам всех строчек и поставить запятую, используя клавиши "запятая" и "СтрелкаВниз": 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 - затем встать в конец первой строки и, используя клавиши "Delete" и "End", удалить все переводы строки, превратив исходный столбец в необходимую "строку через запятую": 1,2,3,4,5,6,7,8,9,10 Всё неплохо. Я и говорю выше, что для "5-10 значений" такой способ вполне работает. Что будет, если значений - 100? 1 2 3 ... 98 99 100 Наверное, этот столбец тоже можно достаточно резво, если напрячься и хорошо размять пальцы, превратить в строку: 1,2,3,...,98,99,100 (обращаю внимание, что многоточие в середине этой строки ничего общего с двумя точками (..), использующимися при задании диапазона для критерия запроса, не имеет) Однако, в резвой пляске своей пальцами по клавиатуре мы так увлеклись, что радостно проскочили рубеж "250 символов", который является ограничением на длину нашей критериальной строки. Строку нужно резать. В каком же месте? Самый простой способ - это попробовать скопировать ее в ячейку "Критерий" и, встав в конец строки в ячейке, посмотреть, сколько символов в нее поместится, после чего "округлиться" от конца влево до позиции перед ближайшей запятой, запомнить элемент, на котором мы остановились, а правый остаток строки стереть. Итак, вставляем строку: 1,2,3,...,98,99,100 Помещается: 1,2,3,...,84,85,86,8 Стираем последние два символа: ,8 Возвращаемся к исходной строке и удаляем из нее уже размещенное в ячейке "Критерий" начало с 1 по 86 В следующую ячейку "Критерий" (в следующей строке таблицы) вставляем остаток исходной строки: 87,88,89,...,98,99,100 Нравится вам объем работы, который вы к этому моменту, скрипя зубами, проделали вручную? Думаю, нет. И мне - нет. А те, кто решил сразу воспользоваться "генератором", уже пьют вторую чашку кофе и курят не первую сигарету... И их журнал уже почти разнесся... P.S. Кто захочет проверить помещаемость в "Критерий" самостоятельно, то вот вся полная строка от 1 до 100 (я вставил пробел после каждого 25-го элемента, потому что иначе безпробельная строка не влезает в экран): 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50, 51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75, 76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100 Последний раз редактировалось Gustav; 07.09.2006 в 17:58. |
|
07.09.2006, 18:08 | #6 |
Аманд
|
Цитата:
Копипаст из гридов Axapta в таблицы Excel выполняется существенно проще, чем в обратном направлении. Пользователи (бухгалтеры) что-то выкачивают из Axapta, анализируют, тасуют-сортируют в Excel'е эти карточки по своим, только им одним ведомым, соображениям и потом желают поместить их в один журнал и выполнить с этими карточками определенные действия (сторнировать, переоценить и т.п.) Разумное желание? Вполне
Можно было бы разобраться, что они там в экселе делают, чего не могут в аксапте? Вот эта чёрная дыра и породила такое решение. Второе, о вопросе присоединения других фирм и ввода информации. Беспорядок внесли в справочники и т.д. (не говорю о проводках) необходимо точнее прорабатывать такие процедуры. |
|
08.09.2006, 06:21 | #7 |
Мрачный тип
|
Господа, Вам нужен нормальный наглядный множественный неформализуемый обычными критериями выбор (т.е. как юзеру в голову взбредет), а не бешеная строка перечислений для критерия запроса ?
Их есть у меня : 1 новая таблица (RefTableId,RefRecId,UserId,SessionId) со статическими методами триггерной реакции (триггер - не объект БД имеется ввиду, а аналог действия микроэлектронного компонента, а данном случае передача TableId/RecId из помечаемой таблицы и вставка/удаление в случае отсутствия/наличия соответственно в нашей таблице пометок),проверки наличия и очистки пометок по таблице. В таблице, по которой нужно сделать выбор , заводится edit метод с типом NoYes обрабатывающий наличие ссылки на текущую запись текущей таблицы в нашей таблице пометок. Далее Вы этот edit метод можете запихать в любой грид и обрабатывать помеченные записи(ссылки на них будут храниться в заведенной таблице пометок) как Вашей душе угодно (проходите по хранимым ссылкам на помечаемую таблицу, создаете программно критерий и пихаете его дальше в свои запросы). Наглядно, понятно и страхолюдных перечислений для критерия запроса пользователю делать не придется В аттачменте пример использования подобного (форма выбора) для функции частичного копирования строк нескольких складских журналов в один новый журнал Последний раз редактировалось TasmanianDevil; 08.09.2006 в 06:47. |
|
08.09.2006, 09:25 | #8 |
Moderator
|
уфф... "вечер перестает быть томным"...
Цитата:
Сообщение от TasmanianDevil
Господа, Вам нужен нормальный наглядный множественный неформализуемый обычными критериями выбор (т.е. как юзеру в голову взбредет), а не бешеная строка перечислений для критерия запроса ?
Нам нужно испуганной девочке, которая с Аксаптой работает без году неделя, дать возможность САМОСТОЯТЕЛЬНО быстро отобрать в журнал 200 элементов справочника, не поддающихся коротким критериям, с тем, чтобы она к утру успела выполнить задание, которое ее выдали в срочном порядке. А так она смотрит на этот список и почти плачет, соображая что может быть к утру она только половину этого списка вручную и заведет. А умные программисты и администраторы уже давно разошлись по домам или по пивнушкам... И помощи ждать неоткуда... Повторяю еще раз - речь идет об эффективном при необходимости использовании СТАНДАРТНОГО ФУНКЦИОНАЛА! |
|
08.09.2006, 10:40 | #9 |
Мрачный тип
|
Понял , девочку пожалел в душе и удалился
|
|
08.09.2006, 10:56 | #10 |
Microsoft Dynamics
|
Интересно, а нельзя девочку научить самой пользоваться стандартной формой запроса? Вроде бы не квантовая физика, и не намного сложнее, чем вбивать те же циферки в Excel...
__________________
You should use Bing before asking dumb questions. |
|
08.09.2006, 11:13 | #11 |
Moderator
|
Цитата:
Сообщение от Jabberwocky
Интересно, а нельзя девочку научить самой пользоваться стандартной формой запроса?
Цитата:
Сообщение от Jabberwocky
Вроде бы не квантовая физика, и не намного сложнее, чем вбивать те же циферки в Excel...
Ей нужно эти "циферки" переместить из Excel в SysQueryForm и желательно побыстрее. (неужели я так путанно и неподробно расписал всё выше? ) |
|
08.09.2006, 11:29 | #12 |
Аманд
|
Цитата:
Можно. Мы и учим ее пользоваться СТАНДАРТНОЙ формой.
Цитата:
Сообщение от Gustav
Повторяю еще раз - речь идет об эффективном при необходимости использовании СТАНДАРТНОГО ФУНКЦИОНАЛА!
А я хочу, чтобы вы занялись причиной проблемы Какие такие шаманства они в Ёкселе производят? Их можно сделать стандартным функционалом? Какие доработки для этого потребуется? И будет Вашей девушке счастье и загорятся её глазки Последний раз редактировалось Vals; 08.09.2006 в 11:53. |
|
08.09.2006, 11:43 | #13 |
злыдень
|
Цитата:
Сообщение от Vals
И будет Вашей девушке счастье и загорятся её глазки
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
08.09.2006, 12:00 | #14 |
Moderator
|
Дорогой Vals, мне кажется, мы с Вами изначально рассуждаем в несколько разных плоскостях, т.е. так... (очень грубая аналогия): я излагаю свою технологию замены перегоревшей лампочки, а Вы стараетесь направить меня на изучение причин ее перегорания. Я, в принципе, не против подобного знания, но тема-то затевалась как раз из-за технологии, а свершившийся факт перегорания - это как бы исходное условие задачки. Наверное, я выбрал не очень удачный пример с ОСами, а Вы за него прямо так и ухватились...
Наверное, для абсолютной "независимости" примера от стандартных бизнес-процессов следовало бы взять нечто такое, для отбора чего по критерию не нашлось бы нужных полей в БД и, соответственно, отсутствовала бы иная, нежели перечисление через запятую, возможность задания критерия отбора элементов справочника для формирования журнала. Давайте же что-нибудь такое "иное" изобразим прямо сейчас на скорую руку... О! Пусть это будет, например, некий список сотрудников предприятия (подмножество таблицы EmplTable), попавших в медвытрезвитель (на всякий случай уточняю, что Axapta установлена на ликеро-водочном заводе) после очередной корпоративной вечеринки. Пусть по факту предоставленных этим медицинским учреждением услуг с каждого из этих сотрудников необходимо удержать из зарплаты некоторую сумму (для отражения чего в системе и будем формировать журнал). Считается, что список отличившихся поступает из милиции в виде столбца Excel. Нормально так? Нейтрально? Не бросается тень на основные средства? Цитата:
Сообщение от Vals
Можно было бы разобраться, что они там в экселе делают, чего не могут в аксапте?
|
|
08.09.2006, 12:08 | #15 |
Аманд
|
Цитата:
Сообщение от Recoilme
Не факт. Могут и уволить )) И вместо девушек будут дружно трудиться симпатичные роботы-обработчики ))
На той работе встретит принца на белом гелендвагене ну и пошло-поехало |
|
08.09.2006, 12:18 | #16 |
Аманд
|
Я не бросаю тень сомнения на ваше решение, поверьте
Вообще у Вас должен быть журнал (в любой форме) куда пользователи вносят замечания по эксплуатации системы |
|
08.09.2006, 12:24 | #17 |
Microsoft Dynamics
|
Средствами стандартного функционала Ваша задача не решается. Самое простое решение с минимумом модификаций, которое лежит на поверхности:
1. Создать пользовательскую таблицу из одного поля, в котором будут храниться коды строк журнала. 2. Сгенерировать шаблон Excel на эту таблицу. 3. Внести список кодов в шаблон и импортировать в Аксапту. 4. Создать запрос, с exists join журнала с созданной таблицей. Работы на час разработчику...
__________________
You should use Bing before asking dumb questions. |
|
08.09.2006, 12:28 | #18 |
Moderator
|
Цитата:
Сообщение от Vals
Вообще у Вас должен быть журнал (в любой форме) куда пользователи вносят замечания по эксплуатации системы
Ок. Тема пошла в офф-топик. Я останавливаюсь. Спасибо всем поучаствовавшим P.S. Цитата:
Сообщение от Jabberwocky
Средствами стандартного функционала Ваша задача не решается.
Последний раз редактировалось Gustav; 08.09.2006 в 12:34. |
|
08.09.2006, 12:44 | #19 |
Microsoft Dynamics
|
Цитата:
Сообщение от Gustav
Гы. "Опять 25". А я каким ее решил?
__________________
You should use Bing before asking dumb questions. |
|
08.09.2006, 12:45 | #20 |
Аманд
|
С вытрезвителем жизненно: В результате Счастливого случая произошёл прорыв пивопровода...
|
|
|
|