среда, 31 июля 2013 г.

Axapta. Parts

Рассмотрим гибкий инструмент, предусмотренный в системе Microsoft Dydamic AX, Parts. С его помощью можно легко помещать различную информацию из лабиринта связанных таблиц на форму, пользуясь объектами Query. Это и смотрится симпатично, и делается все в несколько перетаскиваний и кликов.

Допустим на Вашей форме присутствует Grid, отображающий записи в таблице FilmTable, и стоит задача отображать информацию о студии, которая выпустила выделенный фильм (Таблица SudioTable).

1) Создаем Query.
Для начала создадим объект Query, например, с названием StudioOfFilm, чтобы было понятно, для чего он собственно нужен. В нем необходимо создать Data Source для таблицы, откуда мы будем доставать информацию, то есть StudioTable.

Если нам нужно отображать еще и информацию о директоре студии, которая содержится в таблице DirectorsTable, то в датасорсе таблицы StudioTable нужно создать дочерний датасорс, назначить ему таблицу DirectorsTable и настроить в созданном датасорсе соответствующие Relations для связи с таблицей StudioTable. Например StudioTable_ds.DirectorName == DirectorsTable.Name. Но при этом необходимо учитывать условие, что поле Name в таблице DirectorsTable должно быть индексом.

We need to go deeper.

Замечание: Для группы Fields каждого датасорса нужно выставить свойство Dynamic в значение Yes.

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

В значении свойства Query в InfoPart выберите созданный вами Query (StudioOfFilm), а затем в разметке вашей части (Layout) создайте группы для соответствующих таблиц. В них можно выбрать нужный датасорс и группу полей таблицы, которые следует отобразить. При необходимости можно создавать поля в ручную. (Есть возможность использования Display методов).

Дело почти сделано.

3) Создаем MenuItem.
Дело осталось за малым. Создаем MenuItem типа Display, задать ему Object типа Info Part (Наша InfoPart) и перетащить его в Parts нашей формы. FormPart будет создан автоматически. В нем нужно выбрать DataSource формы и Relation, по которой этот датасорс связан с главным датасорсом запроса Query.

Пурурум, все готово)

понедельник, 29 июля 2013 г.

WebGL. Загрузка текстур. Особенность Chrome

    Чтобы использовать текстуры в WebGL, их нужно для начала создать, а затем инициализировать. Делается это примерно так:

gl - объект типа WebGL Context

// Инициализация текстуры
function initTex(texture)
{
gl.bindTexture(gl.TEXTURE_2D,texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,texture.image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);
gl.bindTexture(gl.TEXTURE_2D, null);
}

// Создание текстуры
// Возвращает объект типа текстура
function createTex(image_name)
{
var image = new Image();
var texture = gl.createTexture();
image.src = image_name;
texture.image = image;
image.onload = function()
{
initTex(texture);
}
return texture;
}

// И собственно, как это потом выглядит в коде
texture[0] = createTex("pic/back_01.jpg");

Замечание!!!!
Вызов метода gl.createTexture(); обязательно должен производиться вне тела функции initTex();. Из-за такого в буферах начинали путаться текстуры, и общая картина смотрелась довольно забавно. Но одно дело забавно, а другое дело, что текстуры не на своих местах.

Google Chrome


С ним было много заморочек. Например:

При стандартных настройках безопасности у хрома нет возможности загрузки некоторых локальных ресурсов. По-этому, чтобы проверить работоспособность вашей программы на Хроме, разрабатывайте ее на сервере. В серьезных проектах это естественно будет так. Но вдруг вы просто решили потестить маленький примерчик, создали локальный html файл, и вдруг видите черный квадрат вместо текстуры. Это именно оно и есть.

Надеюсь, это кому-нибудь пригодится)))

среда, 24 июля 2013 г.

Axapta. Задание диапазона у DataSource

Существует как минимум два решения для этой проблемы. Нужное следует подбирать исходя из задачи.

1) Использование переменной для Range;
2) Обращение на прямую к DataSource.

Первый вариант удобен, если вам нужно задать статичный диапазон, который не будет изменяться во время работы с формой.

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

Использование переменной Range

Для начала заведем переменную типа QueryBuildRange, которая будет отвечать за диапазон конкретного поля в датасорсе:

QueryBuildRange qbRange;

Ее нужно инициализировать следующим образом:

qbRange = 
(YourTable_ds.query().dataSourceTable(tableNum("YourTable")).findRange(fieldNum(YourTable, YourField)));
if  (qbRange == null) 
{
    qbRange = 
    YourTable_ds.query().dataSourceTable(tableNum("YourTable")).addRange(fieldNum(YourTable, YourField));
}

Затем нужно задать список значений нашему Range:

qbRange.value(strFmt('%1,%2,%3,%4,%5,%6',
                    queryValue(value1),
                    queryValue(value2),
                    queryValue(value3),
                    queryValue(value4),
                    queryValue(value5),
                    queryValue(value6)));

(Тип переменных value% должен совпадать с типом поля в таблице)

И  выполнить executeQuery у нашего DataSource.

Обращение на прямую к DataSource


В перегруженном executeQuery вашего DataSource сделайте примерно такое:

str s = strFmt('(RangeField != YourTable.OtherField)');
    this.query().dataSourceTable(tableNum(YourTable)).addRange(fieldNum(YourTable,RangeField)).value(s);
super();

воскресенье, 14 июля 2013 г.

Шпаргалка для всего

Одно милое существо скинула мне офигенную штуку) Офигенная шпоргалка для всего)
http://overapi.com/
Мило, и все в одном месте)

суббота, 13 июля 2013 г.

Ruby On Rails. Установка под линукс


Вот собственно инструкция:

1) sudo apt-get install curl

2) \curl -L https://get.rvm.io | bash

3) gedit ~/.bashrc

4) Добавляем в конец файла

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

5) source ~/.bashrc

6) type rvm | head -1

Результат выполнения команды:

rvm is a function

7) rvm pkg install openssl

8) Устанавливаем ruby

rvm install 1.9.3 --with-openssl-dir=$HOME/.rvm/usr

9) Затем выберите версию, которую вы хотите использовать -

rvm use 1.9.3

10) Теперь можно установить Rails

gem install rails


Удачного дня)