quarta-feira, 27 de agosto de 2014

Reporting Services - Girar Imagem usando VB.NET

Um recurso interessante do reporting services é a possibilidade de execução de código VB.NET no seu relatório. Com isto em mãos podemos resolver inúmeras situações com pouco código. Imagine então a situação em que você possui uma imagem para ser adicionada no seu relatório. Porém o cliente precisa que esta imagem seja visualizada em um grau diferente, como por exemplo, na vertical. Não existe uma propriedade do componente de imagem na qual possa ser configurada esta alteração. Felizmente, via programação, resolvemos isto de forma bem simples, conforme mostrado abaixo.

Primeiro, vamos adicionar a referência da classe Drawing no relatório (opção Propriedades)



E vamos adicionar nosso código para girar a imagem




Function GirarImagem(ByVal imageDB As Byte()) As Byte()

        Dim ms As System.IO.Stream = New System.IO.MemoryStream(imageDB)
        ms.Seek(0, System.IO.SeekOrigin.Begin)

        Dim imgObj As System.Drawing.Bitmap = New System.Drawing.Bitmap(ms)
        imgObj.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipXY)

        Dim ms2 As System.IO.MemoryStream = New System.IO.MemoryStream()
        imgObj.Save(ms2, System.Drawing.Imaging.ImageFormat.Bmp)
        Dim bitmapData As Byte() = ms2.ToArray()

        Return bitmapData

End Function


Note que a função espera um parâmetro de imagem do tipo [Byte()], pois neste nosso exemplo o relatório busca a imagem como um campo no banco de dados (VarBinary)



Desta forma, vamos alterar a expressão do objeto de imagem para executar nossa função



E o resultado



Ref: Rotate Flip Types

[]s

terça-feira, 19 de agosto de 2014

JQuery AutoComplete - IE Performance

Um dos mais úteis componentes da lista do JQuery UI sem dúvida é o AutoComplete. Porém, existe um problema conhecido de performance ao usar este componente no [Internet Explorer] quando a lista de informações passa de 1000 registros.

Observando mais de perto este problema podemos perceber que no IE a [renderização] dos dados é a causa do problema e não a quantidade de informações da lista em si.

Desta forma, se você estiver passando por este problema no IE poderá alterar o atributo [source] do componente para executar uma função específica criada por você para justamente [limitar] a quantidade de dados de retorno que será renderizada no Browser.

Segue um exemplo:

No momento da transformação do seu TextBox em um Lookup, adicione a chamada da sua função (CustomAutoCompleteFn)


with ($("#TEXTBOXID")) {
        autocomplete({
            source: function (reg, responseFn) { CustomAutoCompleteFn(reg, responseFn) },
            delay: 0,
            minLength: 2
        });
}


E a função em si:


function CustomAutoCompleteFn(req, responseFn) {
    // LIMITANDO A LISTA DE RESULTADOS POR RETORNAR OS 40 PRIMEIROS
    var b = new Array();
    var re = $.ui.autocomplete.escapeRegex(req.term);
    var matcher = new RegExp("\\b" + re, "i");
    var a = $.grep(listInfo, function (item, index) {
        r = matcher.test(item.value);
        return r;
    });
    b = a.slice(0, 40);
    responseFn(b);
}


O interessante desta função é que você mesmo efetua o filtro no seu Array de informações (var listInfo) e retorna para ser renderizado no Browser apenas a quantidade que deseja, através da linha [b = a.slice(0, 40)].

Desta forma sua performance fica garantida mesmo com uma lista de informações extensa.

Fonte: JQuery Forum

[]