terça-feira, 26 de agosto de 2014

Internal Error occured executing stored procedure when creating session for the AOS

Continuando minha saga para colocar o serviço da AOS no ar depois de uma atualização do ambiente de homologação, me deparei com um outro erro que também me deu um trabalhinho para resolver: Object Server 01: Internal Error occured executing stored procedure when creating session for the AOS.
Este erro ocorreu quando tentava iniciar o serviço, ao ler a mensagem logo percebi que o problema estava na base de dados ou no acesso a mesma, pois o AX estava tentando executar uma SP e não conseguia, então comecei a rever os acessos do usuário bcproxy, as permissões no banco de dados, até que resolvi dar uma pesquisada no site da microsoft sobre o tal problema e acabei tropeçando neste artigo: http://support.microsoft.com/kb/937756 e então dei uma olhada nas duas stored procedures que são descritas no artigo: CreateServerSessions e CreateUserSessions. Elas estavam lá, mas ao verificar as permissões das ditas cujas percebi que o usuário do servidor atual não tinha permissão de execução, bastou adicionar a permissão que tudo voltou ao normal!
Segue abaixo uma imagem para ajudar a entender o problema:












Fica a dica!

Não é possível editar um registro de Tabela de Mensagens de Fluxo de Trabalho

Hoje estava atualizando o ambiente de homologação do Dynamics AX 2009, tudo funcionou certinho depois da atualização com exceção do WorkFlow!
Ao checar o log do trabalho em lote do fluxo de trabalho me deparei com o seguinte erro:
Não é possível editar um registro de Tabela de Mensagens de Fluxo de Trabalho (WorkflowMessageTable). Identificação de mensagem de fluxo de trabalho:{00000000-0000-0000-0000-000000000000}, {00000000-0000-0000-0000-000000000000}. Bloqueio.
Eu chequei todas as configurações do workflow e tudo estava correto, até que resolvi alterar o tempo de recorrência do trabalho em lote que estava sendo executado a cada 1 minuto, mudei para 3. Problema resolvido, acredito que o trabalho em lote não estava conseguindo concluir a tarefa e causando um bloqueio na tabela.

Fica a dica!

segunda-feira, 25 de agosto de 2014

Publicar conteúdo com código fonte destacado com SyntaxHighlighter

Muitas vezes que navego entre blogs de tecnologia encontro muito código fonte no meio da publicação, mas nunca dei muita atenção no que havia por de trás da formatação do trecho de código que sempre é destacado do conteúdo do post e muito bem identado, com a numeração das linhas e muito mais.
Foi então que precisei utilizar este tipo de formatação aqui no blog e corri atrás de informações sobre tal tecnologia. Logo de cara já percebi que teria que mecher com CSS, mas procurei algum plugin para instalar no Blogger, mas só achei para o WordPress. Continuando a pesquisa encontrei um conteúdo muito interessante no site da google: https://code.google.com/p/syntaxhighlighter/, mas na página tinha uma informação dizendo que o conteúdo era antigo e indicando o site do projeto SyntaxHighlighter: http://alexgorbatchev.com/SyntaxHighlighter/.

Trata-se de uma biblioteca muito completa e funcional, você pode apenas referenciar os arquivos .js e .css direto do site do projeto ou se preferir fazer o download da biblioteca toda, jogar em seu servidor e apontar para os arquivos.

A biblioteca conta com sintaxe para diversas linguagens, inclusive você pode facilmente incluir novas linguagens à biblioteca

Visite o site do projeto e veja alguns exemplos!

http://alexgorbatchev.com/SyntaxHighlighter/manual/installation.html
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/

Dialog box com lookup

Recentemente trabalhei em uma customização onde precisava chamar uma tela para selecionar um valor e devolver este valor para o form de origem. Então utilizei o objeto DIALOG, bem fácil de trabalhar e economiza bastante código. Segue um exemplo bem simples de sua utilização:

    void clicked()
    {
        Dialog              dialog; //Objeto dialog
        DialogField         field; //Campo texto para o dialog
        VendPaymMode        pMode; //Instanciando um campo de uma tabela 
    ;
      super();
      dialog = new Dialog("Nome da janela"); //Criando um novo dialog
      dialog.addText("Selecione uma opção:"); //Um texto estático
      field = dialog.addField(typeid(VendPaymMode)); //campo texto vinculado com um campo de uma tabela
      field.value(pMode); // Setando os valores do campo da tabela no campo dialog
      dialog.run();
      if(dialog.closedOk())
      {
        if(field.value())
        {
            element.AlteraCamposDasLinhas(field.value()); //utilizando o valor selecionado
        }else{
            error("Nenhum método de pagamento selecionado para a alteração múltipla.");
        }
      }else{
        warning("Operação cancelada pelo usuário.");
      }
    }