пятница, 31 августа 2007 г.

Таблица штрафов ГИБДД, 2007

Не знаю, когда мне это понадобится. И понадобится ли вообще. А вдруггггы-гы-гы.

Таблица штрафов ГИБДД, 2007

понедельник, 27 августа 2007 г.

X++: SELECT 1

[id:042]

Логично было ожидать, что Аксапта имеет упрощенный механизм работы с данными из СУБД. В X++ встроен диалект языка SQL.

Пробуем, создай джоб: static void BLG42_SelectQuery(Args _args) { EmplTable emplTable; select firstonly emplTable; print emplTable.Name, ' - ', emplTable.BirthDate; pause; }

Вот такой результат я получил: Ваш первый запрос в Аксапте Проанализируем.
Во-первых, объявляем табличную переменную emplTable для таблицы EmplTable. Таким образом создается курсор, который пока ссылаться в никуда.
Во-вторых, выбираем первую попавшуюся запись из таблицы EmplTable с помощью оператора "select", выборку производим не через саму таблицу EmplTable, а с помощью табличной переменной emplTable; в нее же возвращается результат. Таковы правила игры. Заметим, что ключевое слово "from" писать не нужно.
В-третьих, получаем значения полей записи, на которой сейчас стоит табличная переменная emplTable.]
В-четвертых, ключевое слово «firstonly» говорит АОС-у запросить у базы данных только первую запись. Ускорение в данном случае достигается за счет сокращения объема данных, передаваемых по сети из базы данных. В общем, ключевое слово «firstonly» на уровне языка запросов T-SQL превращается в «TOP 1».

Итог
  • табличная переменная пуста, пока не установишь ее на конкретную запись;
  • запрос к базе данных выполняется с помощью оператора select;
  • строка с запросом select также должна заканчиваться на точку с запятой, ведь это все еще X++;
  • ключевое слово firstonly значит: мне нужно только одну первую строку результата запроса и как можно быстрее.

X++: аксессоры 2

[id:041]

Реализация аксессора "parmMyMoney" в предыдущем уроке может вызвать ваши справедливые возражения, ведь там происходит постоянное переприсвоение значений полю "myMoney", даже если не нужно ничего изменять. Это называется "overhead" или «непроизводительные затраты».

Однако прилагать дополнительные усилия стоит, когда изменяемое поле имеет большой размер. К примеру, контейнер; контейнер — это наш размерчик! Он может быть очень большим. В случае контейнеров стоит напрячь мозги: public container parmMyBunchOfMoney(container _myBunchOfMoney = conNull()) { if (!prmIsDefault(_myBunchOfMoney) { myBunchOfMoney = _myBunchOfMoney; } return myBunchOfMoney; } connull() возвращает пустой контейнер, здесь он используется как значение по умолчанию. Глобальный метод prmIsDefault() возвращает ноль, если параметр _myBunchOfMoney содержит что-то новенькое; и выдаст единицу, если параметр хранит значение по умолчанию.
Суть приведенного кода — изменить содержимое контейнера только тогда, когда мы прислали что-то новое.

Итог

  • запомнить шаблон аксессора parmMyBunchOfMoney
  • глобальный метод prmIsDefault определяет, содержит ли параметр метода значение по умолчанию.

X++: аксессоры 1

[id:040]

Раз уж поля класса не доступны извне, то нужно писать методы доступа к ним. Эти методы называются аксесорами, или accessor methods. Обычно они очень простые, словно ситцевые трусы.

Есть устоявшийся стандарт именования таких методов:

  • название метода должно совпадать с именем поля, для которого он является аксесором. Разница только в префиксе;
  • метод должен начинаться на префикс «set», если он используется только для установки значения поля класса;
  • метод должен начинаться на префикс «get», если он используется только для получения значения поля класса;
  • метод должен начинаться на префикс «parm», если он используется и для установки и для получения значения поля класса.

Пробуем, создай класс: class BLG40_AccessorMethods { AmountMST myMoney; public void setMyMoney(AmountMST _newValue) { myMoney = _newValue; } public AmountMST getMyMoney() { return myMoney; } public AmountMST parmMyMoney(AmountMST _newValue) { myMoney = _newValue; return myMoney; } } Расширеный тип данных AmountMST относиться к семейству вещественных чисел, его используют для хранения денежных сумм.
Примечателен метод parmMyMoney, его код является типовым для аксесоров получения/изменения значений полей. Это все теже бабушкины секреты (best practices).

Ну, и протестируем . Создай статический метод main для класса: static void main(Args _args) { BLG40_AccessorMethods cls = new BLG40_AccessorMethods(); print cls.getMyMoney(); cls.setMyMoney(45.3); print cls.getMyMoney(); print cls.parmMyMoney(100.33); pause; } Проверка работы аксесоров Заметьте, что первое обращение через метод "getMyMoney" идет к неинициализированому значению поля "myMoney". Но система сделала это за нас, для целых чисел ноль — это значение по умолчанию.

Итог

  • запомнить шаблон аксессора parmMyMoney, ибо в будущем будем делать подобное постоянное
  • целочисленные, и не только, переменные автоматически инициализируются при создании

пятница, 17 августа 2007 г.

Система: InfoLog, часть 1

[id:036]

Infolog — это диалоговая система (фрэймворк, набор классов), которую вы можете использовать для вывода сообщений информационных, предупреждающих, об ошибках.

Есть несколько глобальных методов, которые выводят сообщения в InfoLog. Пробуем. Создайте джоб: static void BLG36_Job(Args _args) {; info('А есть закурить?'); warning('Ты че такой дерзкий?'); checkFailed('Ты по понятиям не рубишь'); error('Ты по понятиям не рубишь. Ответь за пацана'); }

Выполни джоб, увидишь типовой набор фраз гопника: Вывод сообщений в Infolog

Примечателен метод "checkFailed", визуально он не отличается от "warning". Но есть особенность: метод всегда возвращает "false", что крайне удобно.
Например, есть метод "checkSomething", проверяющий некоторые условия. Он возвратит "true", если все в порядке, иначе — "false". В случае невыполнения условий проверки, нужно также выдать сообщение пользователю: boolean checkSomething() { if (I_Am_A_Moscow_Citizen) return true; else return checkFailed( 'Понаехали! Москва не резиновая'); } Здесь проверяется булево поле "I_Am_A_Moscow_Citizen"; и, если оно равно "false", метод "checkSomething" возращает "false" и выводит сообщение пользователю одним махом.

Итог:
  • InfoLog — объект для вывода сообщений пользователю;
  • глобальные методы для вывода сообщений: info, warning, checkFailed, error.
  • info — простое информационное сообщение для пользователя.
  • warning, checkFailed — предупреждающее сообщение, означает «Случилась какая-то нехорошая вещь, но жить можно».
  • error — сообщение об ошибке, означает «Все плохо, я не могу так дальше работать, это не выносимо».

понедельник, 13 августа 2007 г.

Быт: течет кран в туалете

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

К сожалению, я — плохой пластилиновых дел мастер. Попытки залатать кран той же субстанцией вызвали еще большую течь.

Но у меня высшее техническое образование, инженерный ум и мне очень хотелось спать. Используя две пластиковые бутылки, изоляционную ленту, резиновый шланг, ножницы и "бляху-муху" соорудил временное устройство: Самодельный слив
Бутылка обнимает кран, капли стекают вниз в ведро

Бляха-муха — ругательное слово; используется в значении «твою мать», «черт побери»

Говорю по-русски, но понт дороже

Русский язык не относится к вещам, которые можно изучить за две недели. Носители этого языка могут гордиться фактом обладания столь красивым инструментом.

Тем не менее, люди ввинчивают английские словечки там, где нет в этом необходимости. Для Москвы эта болезнь приняла хронический характер.

Примеры:

  • Здесь сидят наши сэйлзы (английское слово «Sales». «Продажные менеджеры тута»)
  • Наша работа — постоянный челендж (английское слово «Challenge». «У нас пашут все и без остановок»)
  • Давайте устроим глобальный илнэс (английское слово «Illness». «Товарищи, предлагаю тупо заболеть все разом»)
  • Это легче скопипастить (английская фраза «Copy — Paste». «Жми Ctrl+C, затем Ctrl+V и хватит корчить из себя стахановца»)
  • Я уже отправил вам месадж (английское слово «Message». «Предпочитаю посылать людей на хрен в письменной форме»)