Tuesday, November 16, 2010

Invitation to Advertise on LinkedIn

Who needs $100 USD free advertising on LinkedIn, drop me a line in comments

Friday, November 12, 2010

Quick User Manual On Outlook Rules (Epic Fail)

Sometimes, I have to send short manuals to my AX users. This is an excerpt (kinda epic fail...)

Friday, October 29, 2010

This seems to do nothing

I have been debugging new AX2009 to which we migrated recently, and sometimes it is a real fun!

if (numberOfTransOpen == 1 ||
            (numberOfTransOpen > 1 && !printPaymentSchedule))
            // this seems to do nothing
            if (printPaymentSchedule)
                select firstonly tmpCustVendTransOpen;

Thursday, October 7, 2010

Free Axapta Training

Ladies and Gentlemen, AX trainings blog!

I find this information source on Dynamics AX very useful for those who are going to learn this ERP system for using and developing.

All trainings are well structured, so you have no chance to get lost.

Very good point to start the adventure!

Sunday, September 26, 2010

Pictures from the seminar

Some pictures from BI seminar are here.

PowerPivot in Excel 2010 looks really cool!

Thursday, September 16, 2010

Business Intelligence Seminar in Montreal, September 25

BI: SSIS, SSRS, SSAS, PowerPivot, OLAP Cubes. The event will be in Montreal, more info.

Who's going to participate?

Wednesday, September 15, 2010

Microsoft Dynamics Salary Survey 2010

Now, this is the time to participate in the annual Microsoft Dynamics Salary Survey conducted by Nigel Frank International.

It takes actually two minutes to fill in. This is in English, but it is very easy to understand.

As a prize you will get a copy of the survey results, which are a comprehensive analysis of comparative salary data in different aspects: geography, domains, positions and so on. You can see 2009 report here.

Copyright 2009 Nigel Frank International Ltd.

I am sure this job helps us a lot to improve our employment situation. So, please, enjoy!

Thursday, August 12, 2010

Value in Query range

How to use Enum values in Query ranges:

public void init()
    QueryBuildRange   criteriaOpen;
    criteriaOpen = this.query().dataSourceTable(tableNum(ProdTable)).addRange(fieldnum(ProdTable, ProdStatus));
    criteriaOpen.value("Started"); // it does not work in non-English interface!!!

    criteriaOpen.value(enum2str(ProdStatus::StartedUp)); // not enough good...

        criteriaOpen.value(QueryValue(ProdStatus::StartedUp); // now it is correct!    

Friday, May 7, 2010

Vania Kashperuk's Tutorial: refresh, reread, research, executeQuery

First of all, I have to admit that this subject was a little vague for me. This is why I read with a huge interest this new Vania's tutorial about how to use efficiently and correctly these four data source methods.

In fact, it is always much easier to acquire new knowledge on real examples, and luckily this is the case! Not only explained he step-by-step the difference between the methods but also provided us with a ready-to-use project  for Dynamics AX 2009, which can help a lot to them who have just started working with the system.

So, I highly recommend his blog to every AX developer. 

To whom it may be useful, I adapted this xpo-project to Dynamics AX 4.0

Didn't get it right? Just reread() it and refresh() your knowledge!

Tuesday, March 16, 2010

All Lables from given Layer in given Languages

Sometimes I need to see a label translations into different languages. Sometimes it is good to see all the labels that were created during the project on a given layer - like those on USR.

This job exports all labels from a given layer in given languages to an Excel file.

Here I used the two following code examples from the AXForum.info:

Firstly, the job calculates the number of labels; then, it shows progress window; finally, it opens an Excel file saved under the name like "Labels from "+#LayerId+ " in "+#English+", "+#French+", "+#Russian+".xls".

In this particular job are SYS layer and three mentioned languages used; you can easily change them to your needs.

static void SisPrintAllLabelsOnGivenLanguages(Args _args)
    // needed layer
    // all needed languages
    // label classes
    Label   lEn = new Label(#English);
    Label   lFr = new Label(#French);
    Label   lRu = new Label(#Russian);
    // start looking every label
    str 250 lId;
    int totalLabels;
    RunbaseProgress         progress;
    //Excel variables section
    COM rstAxa = new COM('ADODB.Recordset');    // ADO: Recordset
    COM flds   = rstAxa.Fields();
    COM fld;
    COM xlApp;            
    COM wbks, wbk;        
    COM wkss, wks;        
    COM rng, cell, rngCR; 
    COM font;             
    COM entCol;           
    COM actWin;           
    int i, iMax;
    // start looking every label
    lId = lEn.searchFirst('');
    while (lId)
        if (lEn.moduleId(lId) == #LayerId) // The particular label file
            // count labels
        lId = lEn.searchNext();
    print(strfmt("%1 = %2", "@SYS54695", totalLabels));
    if (totalLabels<=0)

    progress = RunbaseProgress::construct(1,null);


    // <--- create excel fields in a worksheet
    flds.Append(#LabelId, 8);
    flds.Append(#English, 8);
    flds.Append(#French, 8);
    flds.Append(#Russian, 8);

    xlApp = new COM('Excel.Application');
    wbks = xlApp.Workbooks();
    wbk  = wbks.Add();
    wkss = wbk.Worksheets();
    wks  = wkss.Item(1);
    rng  = wks.Range('A1');
    flds = rstAxa.Fields();
    iMax = flds.Count() - 1;
    for (i = 0; i <= iMax; i += 1)
        fld = flds.Item(i);
        cell = rng.Offset(0, i);
    rngCR = rng.CurrentRegion();
    font = rngCR.Font();
    cell = rng.Offset(1, 0);
    // <--- end of creating of excel fields in a worksheet

    lId = lEn.searchFirst('');
    while (lId)
        if (lEn.moduleId(lId) == #LayerId) // The particular label file
            // print to excel
            fld = flds.Item(#LabelId);  fld.Value(lId);
            fld = flds.Item(#English);  fld.Value(lEn.extractString(lId));
            fld = flds.Item(#French);   fld.Value(lFr.extractString(lId));
            fld = flds.Item(#Russian);  fld.Value(lRu.extractString(lId));
        lId = lEn.searchNext();
    // format excel worksheet
    rngCR = rng.CurrentRegion();
    entCol = rngCR.EntireColumn();
    actWin = xlApp.ActiveWindow();
    wbk.SaveAs("Labels from "+#LayerId+ " in "+#English+", "+#French+", "+#Russian+".xls");

Form Digger

FormDigger is a very useful tool. It facilitates form development substantially by allowing to search fields either by its name or label,  highligt them on the form, take a snapshot of it, and jump directly to AOT.

It should be installed as an XPO project  and then called by Alt-~.

Highly recommended!

By the way, this is the second powerful tool I use created by the same AX master - Evgeny Arlionak

Monday, March 8, 2010

Как проверяются рекомендации кандидата

Если вы, как кандидат, грамотно составили своё резюме и написали эффективное сопроводительное письмо, провели работу по их рассылке, добились собеседования и успешно его прошли, то вполне вероятно, что следующим этапом на трудном пути получения работы станет проверка ваших рекомендаций.

Вполне логично и обоснованно, что компания, рассматривающая вас как потенциального сотрудника, в первую очередь хочет получить адекватного человека и члена коллектива, а не просто грамотного специалиста. Разумеется, соответствие требованиям вакансии, условиям работы, ценностям компании и т.д. и т.п. определяется целым рядом критериев и может варьироваться достаточно широко, но определённые моменты безусловно являются базовыми, и сегодня мы их рассмотрим на примере.

При своём последнем трудоустройстве я воспользовался услугами кадрового агентства, которое после нескольких собеседований со мной одному из моих бывших руководителей позвонило, а другому направило письмо следующего содержания (перевод с английского):

Уважаемая NN!

Мне необходимо проверить рекомендации имярёк и я была бы очень благодарна, если бы Вы могли ответить на несколько вопросов о нём и его работе.

  • Каковы были его основные обязанности: задачи, размер проектов, техническое окружение и т.д.?
  • Опишите его вклад в командной/проектной работе: основные достижения и результаты.
  • Как бы Вы описали его отношение к работе: пунктуальность, организованность, мотивацию?
  • Как бы Вы описали его навыки общения, устные и письменные?
  • Как он реагирует на критику?
  • Как бы Вы описали его характер?
  • Как он ладит с другими членами команды, руководством, клиентами, пользователями?
  • На что бы Вы посоветовали обратить внимание его будущему руководителю для достижения наилучших результатов от работы с ним?
  • Рекомендовали бы Вы его нанимать на работу? Да или нет и почему?
  • Как бы Вы оценили его производительность в команде/проекте: отлично, хорошо, средне, плохо и почему?
  • Общие комментарии – всё, что Вы хотели бы добавить о его характере или профессионализме.

Можем ли мы предоставить Ваши рекомендации кандидату, а также другим потенциальным его нанимателям?


Как видим, вопросы достаточно серьёзные и, в общем-то, требующие определённого труда и времени на развёрнутые ответы. Очевидно, что люди, рекомендация которых интересует потенциальных нанимателей в первую очередь, – это ваши бывшие непосредственные руководители – чем выше по иерархии, тем лучше. Часто предоставление рекомендаций регламентировано политикой компании и может осуществляться лишь отделом кадров или первыми руководителями.

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

Понятно, что ситуации в жизни бывают разные, и не всегда удобно или возможно получить хороший отзыв от бывшего начальника. В таком случае, рекомендации других ваших коллег или партнёров могут стать альтернативой. Я, например, даже использовал рекомендации, полученные в сети LinkedIn.com. Если же вы не уверены в «качестве» какой-то своей рекомендации, лучше её совсем не предоставлять для проверки.

В целом же, если вы добрались до этапа проверки рекомендаций, то это говорит о том, что вы близки к получению работы как никогда.

Типовые вопросы на собеседовании и советы кандидату

(продолжаю делиться опытом по поиску работы отсюда — туда)

Как известно, поиск работы – это само по себе работа, сложный и многоэтапный процесс. Чтобы успешно его пройти до самого конца и получить желанную работу, следует хорошо понимать каждый из этапов: от поиска вакансий, написания резюме и совпроводительных писем до переговоров на тему зарплаты. Понимание, в свою очередь, позволит хорошо подготовиться, а значит работать более эффективно. Как говорится, тяжело в леченье – легко в гробу.

Безусловно кульминационным и определяющим моментом процесса является собеседование, или, как его сейчас называют на западный манер, – интервью. Мне всё же термин «собеседование» кажется более подходящим, так как данный вид общения предполагает вопросы с обеих сторон: нанимателя и претендента на вакансию. О вопросах к работодателю, которые стоит подготовить кандидату на должность, я расскажу как-нибудь в другой раз, а здесь же я хотел бы привести примеры реальных вопросов, к которым мой кадровый агент рекомендовал мне подготовиться перед встречей с будущим (уже теперешним) работодателем.

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


  • Что Вы знаете о нашей компании? (Ознакомьтесь с сайтом компании и соберите ключевую информацию такую, как история, размер, профиль деятельности, корпоративны ценности и т.д.)
  • Почему Вы хотите работать в нашей компании, а не у одного из наших конкурентов или какой-то другой компании?
  • Расскажите вкратце, в чём заключается работа на позиции, на которую Вы претендуете.
  • Почему Вы считаете себя идеальным кандидатом на эту позицию?
  • Каковы Ваши сильные и слабые стороны?
  • Каковы Ваши профессиональные цели в карьерном плане? Кем Вы себя видите через 5 лет?

Я рекомендую Вам обдумать эти вопросы и подготовить примеры из Вашего личного и профессионального опыта, которые могли бы подкрепить Ваши ответы на эти вопросы. Примеры КОНКРЕТНЫЕ, когда Вам приходилось сталкиваться со проблемными ситуациями, сложными клиентами, или когда Вам довелось решать технические вопросы в сжатые сроки и т.п.

Постарайтесь давать ясные и чёткие, максимально информативные ответы.

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

Во время собеседования УЛЫБАЙТЕСЬ и будьте ДИНАМИЧНЫМ и ЗАИНТЕРЕСОВАННЫМ. Не забудьте выключить свой мобильный телефон, будьте на месте минут за 10 до начала собеседования, проследите за своим внешним видом (костюм, галстук), захватите Ваше резюме с собой, а также ручку и бумагу.

Все эти вопросы ясны, как день, а рекомендации очевидны, и мы слышали их не раз, но от того они актуальными быть не перестали. Один мой хороший друг, пузатый и лысый еврей, работающий ныне генеральным директором регионального филиала одной крупной Российской компании, на собеседовании на вопрос «Кем Вы себя видите через пять лет?» ответил: «стройным блондином». Так что не забывайте оставаться самим собой! Удачи на собеседовании!

Wednesday, March 3, 2010

Как кадровые агентства читают резюме за 10 секунд и быстрее

Брэд Ремийар (Brad Remillard)

Как кадровые агентства читают резюме за 10 секунд и быстрее. 

(Перевод публикуется с любезного согласия автора, комментарии в скобках мои)

10-20 секунд на прочтение резюме?! – наверное, это покажется вам вызывающим. Некоторым кандидатам это даже кажется неуважительным – как же можно прочитать резюме за это время? Некоторые даже раздражаются на нас, специалистов по подбору персонала, когда мы говорим об этом. Надеюсь, эта статья поможет каждому понять, как же мы это делаем. Я понимаю, что не всем это понравится, и многие всё равно будут продолжать злиться, но, по крайней мере, вы сможете понять, как это происходит.

Во-первых, я хотел бы уточнить, что занимаюсь подбором персонала на протяжении 30 лет. Уверен, за это время я рассмотрел не менее 500 000 резюме. Не могу этого доказать, но небезосновательно полагаю, что это так, ибо 46 резюме в день – это довольно среднее значение. Я помню, когда я анализировал и по сотне резюме в день и большую их часть – менее чем за 20 секунд. Я бы даже сказал, что в среднем на каждое уходило 5-7 секунд.

Так что хочу заметить, что если вы слышите и читаете о «прочтении резюме за 20 секунд», то это не совсем верно, так как это даже скорее «рассмотрениерезюме за 20 секунд».

Здесь я описываю мой подход к анализу сотен резюме за короткое время; остальные могут делать это по-другому, и я буду рад вашим комментариям (см. ниже ссылку на блог автора).

Во-первых, я задаю иерархию определённых пунктов, которые должны быть в резюме обязательно, иначе – ваше резюме бракуется. То есть, вначале я просто ставлю крыжики. В основном, 80% моего времени уходит на эту выбраковку (в оригинале «нокауты»). Бывают и исключения, но здесь я имеею дело с правилом 80/20. Крыжики не суммируются: если я обнаруживаю во время просмотра вашего резюме, что какой-то из пунктов в нём отсутствует, то я вас исключаю из дальнейшего процесса.

1. Место жительства.

Если мой заказчик находится в Лос-Анджелесе, а вы нет – до свиданья. Практически никто из клиентов не захочет оплачивать ваш переезд из своего кармана, да и не думаю, что для большинства из них оно того стоит. Особенно в больших мегаполисах вроде Лос-Анджелеса. Если им всё же необходимо рассмотреть переезд кандидата, так это только для позиции, требующей какого-то совершенно уникального опыта, наличествующего у единиц. Это я могу оценить примерно за секунду.

2. Отрасль
Если мой заказчик из банковской сферы, а ваш опыт в основном в производстве – до свиданья. Эти две отрасли настолько разные, что клиент зачастую даже и обсуждать это не будет. Это верно в обоих направлениях: если вы работали в производстве, то я не собираюсь рассматривать кого-то из банковской сферы. 2-3 секунды, чтобы это определить.

3. Должностные обязанности.

Если я ищу кого-то в продажи, а вы не занимались продажами – до свиданья. В основном компании платят специалистам по подбору персонала за наиболее подходящих кандидатов. Мы никогда не ищем идеальных, но мы должны искать наиболее близких к идеальным. Клиентам не нужны специалисты по найму, которые ищут им кого-то с совершенно неподходящим профилем должностных обязанностей. 2-3 секунды, чтоб определиться с этим пунктом.

4. Уровень.

Если я ищу кандидата на должность вице-президента, а ваша должность – «менеджер среднего звена», и вы никогда не работали на уровне вице-президента – до свиданья. Бывают, конечно, и исключения, но вспомним о правиле 80/20. Опять же, заказчик мне платит за наиболее подходящего кандидата. В основном, это слишком большой прыжок с уровня руководителя среднего звена на уровень вице-президента, при прочих равных условиях. Обратное также верно: если я ищу кандидата на позицию менеджера, а вы вице-президент – до свиданья. Да, я знаю, что вы можете квалифицированно выполнять работу менеджера, но ведь понятно, что вы уже сделали карьеру в прошлом. Большая часть клиентов и специалистов по подбору персонала не горит желанием рисковать потерять вас на этой позиции, если откроется позиция вице-президента. Меньше 5 секунд, чтобы это понять.

5. Недавний опыт.

Частичный перехлёст в этом пункте. Если я ищу кого-то с опытом международных продаж в аэрокосмической отрасли, а последний раз подобную позицию в индустрии вы занимали 20 лет назад, работая с тех пор в рознице, – до свиданья. Я могу найти людей с более подходящим опытом, и это именно то, чего ждёт от меня мой заказчик. 5 секунд на это.

6. Образование.

Нравится вам это или нет, но я буду работать только с теми, кто закончил колледж, а в большинстве случаев – имеет диплом магистра. В основном это потому, что, как я уже указал выше, мне нужны для моих клиентов самые лучшие кандидаты. Разумеется, я понимаю, что само по себе образование ещё не означает, что кандидат – лучший, но это один из прочих определяющих факторов. К тому же все мои клиенты требуют кандидатов как минимум с дипломом бакалавра.

7. «Летуны».

Если вы сменили 6 работ за последние 4 года или у вас трудовая книжка «летуна» – до свиданья. Я понимаю, что есть причины для смены работ, и эти случаи попадают в те самые 20% правила 80/20. Я не могу определить понятие «летун», но я сразу его вычисляю, когда вижу в резюме. 3– 5 секунд.

8. Функциональное резюме.

Я их не читаю. Это очевидно, что функциональное резюме имеет своей целью скыть что-то, и я крайне редко трачу время на то, чтобы с ними разбираться. 1 секунда.

9. Очевидные вещи.

Резюме с опечатками, плохо оформленные, с орфографическими ошибками, излишне длинные, многословные и бессвязные. Если после их прочтения я всё равно не могу понять, чем вы занимаетесь, – до свиданья. 5-10 секунд.

После всего этого 80-100% резюме отбрасываются. Если какие-то всё же остаются, то я беру их и уже действительно внимательно читаю.

Брэд Ремийар, руководящий специалист по подбору персонала с более чем 25-летним стажем, провёл более 50 000 собеседований и участвовал в более чем 1 000 прямых поисков кандидатов (хедхантинг). Дипломированный бухгалтер и выпускник Калифорнийского государственного университета в г. Фуллертоне, Брэд ранее занимал пост президента компании CJA Executive Search, которая была признана одной из ведущих рекрутинговых фирм Южной Калифорнии. Брэд осуществлял подбор кандидатов по всей стране для компаний из списка Fortune 500. Его опыт включает в себя работу по вакансиям в высшем руководящем составе (CEO, COO, GM), продажах и маркетинге, производстве и операционном управлении, бухгалтерии, финансах, кадровом управлении и информационных технологиях.

Узнать о Брэде подробнее можно на его сайте: http://impacthiringsolutions.com, а написать свои комментарии и почитать другие его статьи – в его блоге:http://impacthiringsolutions.com/careerblog/.

Оригинал статьи находится по адресу: http://www.higherbracket.ca/article_recruiters_ten_second_resume_read_br.php

Monday, February 15, 2010

Insert containers into container

A short note about the difference between inserting and adding containers to a container.

If we use += operator to add new containers to a container, they will be added as a consequence of usual values (plainly).

static void SisTestContainer(Args _args)
    container   c;
    container   pair;
    int         i;
    pair = [1, "first"];
    c += pair;
    pair = [2, "second"];
    c += pair;
    pair = [3, "third"];
    c += pair;

    infoLog.add(Exception::Info, strfmt("conlen %1", conlen(c)));
    for (i = 0; i<= conLen(c);i++)
        pair = conPeek(c, i);
        infoLOg.add(Exception::Info, strfmt("%1; %2", conpeek(pair,1),conpeek(pair,2)));


Message (16:25:24)
conlen 6
0; 0
1; 0
first; 0
2; 0
second; 0
3; 0
third; 0

If we use conins() operator, new containers will be added as containers (structured by pairs).

static void SisTestContainer(Args _args)
    container   c;
    container   pair;
    int         i;
    pair = [1, "first"];
    c = conins(c, 1, pair);
    pair = [2, "second"];
    c = conins(c, 2, pair);
    pair = [3, "third"];
    c = conins(c, 3, pair);
    infoLog.add(Exception::Info, strfmt("conlen %1", conlen(c)));

    for (i = 1; i<= conLen(c); i++)
        pair = conPeek(c, i);
        infoLOg.add(Exception::Info, strfmt("%1; %2", conpeek(pair,1),conpeek(pair,2)));


Message (16:10:17)
conlen 3
1; first
2; second
3; third

P.S.: as Dron AKA andy mentioned, the following syntax does the same:

c += [pair];

Tuesday, February 9, 2010

Error 1075: The dependency service does not exist or has been marked for deletion

I do not know why but my Microsoft Windows Server 2003 SP2 unexpectedly refused to restart AOS instance. It gave the error:

Error 1075: The dependency service does not exist or has been marked for deletion.

It is strange because the only thing in the dependcies was Remote Procedure Call (RPC). No events in the logs.

I deinstall the AOS instance and re-install it  with SP2 right away with the same settings without restarting the server. Now it starts fine.

Monday, February 8, 2010

Error: Multiple calls to CodeAccessPermission.Assert

Multiple calls to CodeAccessPermission.Assert
(S)\Classes\BatchRun\runJob - line 166
(S)\Classes\BatchRun\do - line 54
(C)\Forms\BatchRun\Methods\doBatch - line 18

Sometimes I got this error while working with Change based alerts batch processing. After that the status of the related job in batch list changed to Executing, and the only way to get rid of it was deleting that job.

This issue arises in [Classes]BatchRun.runJob method because of absence of closing revertAssert() method in case of exceptions after calling runas() method.

So, my solution is to comment the existing call of revertAssert()...

if (batchClass.runsImpersonated())
            // Ok to assert here because the user name comes from
            // the batch table
            runAsPermission = new RunAsPermission(batch.CreatedBy);
            // BP Deviation Documented
                staticmethodstr(BatchRun, runJobStatic),

           // Alexey Voytsekhovskiy (SIS) (2010/02/08) (Demande #0074)
           // CodeAccessPermission::revertAssert();

and move it after catching all kind of exceptions:

catch (Exception::UpdateConflictNotRecovered)
        isErrorCaught   = true;
        exception       = Exception::UpdateConflictNotRecovered;

    // Alexey Voytsekhovskiy (SIS) (2010/02/08) (Demande #0074)
    // in case of exception Permssion should be revert anyway!!

It allows to avoid multiple calls to CodeAccessPermission.Assert (there is another call far in this method) and see the log of the job ended with an error.

By the way, here is a short and sweet trick with multiple calls if needed.

Tuesday, January 5, 2010

MorphX IT by Steen Andreasen

MORPHX IT by Steen Andreasen helps me a lot. I would like to have it at hand.

Just to remind the link to this very useful book in English.

There are the Russian and Danish versions for free downloading in PDF format.