quarta-feira, 26 de maio de 2010

Campos de observações da nota fiscal eletrônica

No XML da nota fiscal eletrônica encontramos algumas tag´s para informações adicionais ou observações, são elas:

<infAdProd>

<infCpl>

<infAdFisco>

Muitos possuem dúvida sobre o conteúdo que deve ser informado nestas tag´s, resolvemos então publicar este post com algumas digas:

Na tag <infAdProd> podemos colocar as seguintes informações:

  • Complemento de descrição dos produtos
  • Informações de interesse do fisco, tais como:
      • Leis que regulamentam uma redução de base de cálculo do ICMS ou um Diferimento
      • Qualquer tipo de informação de interesse do fisco que tenha ligação diretamente com um determinado item

Na tag <infCpl> pode-se informar qualquer tipo de observação que seja do interesse do contribuinte, ou seja, conteúdo livre.

Na tag <infAdFisco> deve-se informar textos de interesse do fisco, tais como:

  • Leis gerais que não tenham ligação somente com um único item, mas geral, como por exemplo:
      • Nota Fiscal Eletrônica Emitida por Optante do Simples Nacional
      • Nota Fiscal de Complemento de ICMS
      • etc.

Fica ai nossa dica do tipo de informação que pode ser enviada nestas tag´s.

Preenchimento de NF-e para optantes do Simples Nacional

Veja: http://www.robertodiasduarte.com.br/preenchimento-de-nf-e-para-optantes-do-simples-nacional/

Publicar Post no Blogspot com Windows Live Write

Quando iniciei meus blogs no Blogspot, senti uma dificuldade em postar exemplos de códigos fontes. Por indicação do meu irmão (Édson) passei a utilizar o Windows Live Write que facilita muito o trabalho de publicação de posts, principalmente para códigos fontes.

É bem simples, basta instalar o MS Windows Live Write, e depois baixar um puglin para inserção de códigos, que já tem template para vários tipos de linguagem, veja o link:

http://gallery.live.com/liveItemDetail.aspx?li=10d724ab-0d28-4c78-8310-a6e2cfdef891&bt=9&pl=8

Além desta opção o Windows Live Write dispõe de diversas ferramentas que facilitam muito nossa vida, uma delas o corretor ortográfico da MS.

Atribuir conteúdo a uma variável do tipo DateTime – Serie manipulando datas (C#)

Atribuir conteúdo a uma variável do tipo DateTime no C# é muito simples, veja como:

DateTime data;
data = DataTime.Parse("19/05/2010 16:21");
Console.WriteLine(data); //Resultado 19/05/2010 16:21

Dica para tratamento de exceção no C#

Estava com um problema no tratamento de exceções do C#, pois em alguns pontos da aplicação a mensagem retornada dentro da propriedade Message da classe Exception não era a mensagem original gerada no ponto onde ocorreu a falha, isso me levou a efetuar pesquisas, e identifiquei o seguinte...

Uma prática muito utilizada é criarmos nossos try/catch e não tratarmos as exceções nas camadas de baixo nível da aplicação (como por exemplo a camada de banco de dados), desta forma somente forçamos o retorno da exceção para a camada de alto nível (por exemplo a camada de interface) para que ela faça o tratamento.Veja:

public void Teste()
{
   try
   {
      throw new DivideByZeroException("Uma exceção de divisão por zero foi forçada.");
   }
   catch (DivideByZeroException ex)
   {
      throw (ex);
   }
   catch (Exception ex)
   {
      throw (ex);
   }
}


Nos catch´s utilizamos o throw para reportar a exceção para a camada executora, assim na hora de tratarmos a exceção na camada de alto nível, não temos a certeza de qual o tipo de exceção que está sendo retornado, se IOException, se DivideByZeroException, se Exception, desta forma efetuamos o tratamento com a classe genérica que é a Exception para evitar falhas e interrupção da execução do aplicativo. Exemplo:



try
{
   oObj.Teste();
}
catch (Exception ex)
{
   global::System.Windows.Forms.MessageBox.Show(ex.Message);
}


O grande problema é que na ex.Message pode ocorrer de termos como retorno o seguinte conteúdo: "Exception has been thrown by the target of an invocation" e não o erro de divisão por zero forçado no código de exemplo anterior "Uma exceção de divisão por zero foi forçada.", deixando difícil a identificação da exceção para o usuário como para o programador.



Por não sabermos o tipo de exceção que será retornado e não termos que tratar todos os tipos de exceção existentes, pois são vários, podemos utilizar a seguinte solução:



try
{
   oObj.Teste();
}
catch (Exception ex)
{
   global::System.Windows.Forms.MessageBox.Show((ex.InnerException != null ? ex.InnerException.Message : ex.Message));
}


Sempre que não tivermos a certeza do tipo de exceção que será retornado, tratemos ela utilizando o conteúdo da InnerException, se for diferente de null, pegamos o conteúdo da propriedade Message dela, caso contrário continuamos com o Message da Exception.



Reforço que nem sempre a InnerException possui conteúdo, por isso que verificamos se ela é diferente de null, se for basta pegar o seu conteúdo que vamos ter o a informação original da exceção.

Comparar datas do tipo DateTime – Sério manipulando datas (C#)

Na hora de comparar datas no C# podemos utilizar:

If (data1 > data2)
{
   //Maior
}
If (data1 < data2)
{
   //Menor
}
If (data1 == data2)
{
   //Igual
}


Mas a forma mais utilizada entre os programadores C# para manter a idéia da orientação a objeto é:



if (DateTime.Compare(data1,data2) > 0)
{
   //data1 maior que data2
}
if(DateTime.Compare(data1,data2) < 0)
{
   //data1 menor que data2
}
if(DateTime.Compare(data1,data2) = 0)
{
   //data1 igual a data2
}


Ainda não consegui nos meus testes ver ganho de performance entre as duas formas de comparação, mas fica ai registrado esta dica.

domingo, 23 de maio de 2010

Erro PostgreSQL: Incorrect checksum in control file

Hoje tivemos um problema com o servidor de banco de dados PostgreSQL de um cliente. Neste servidor estava instalado o sistema operacional Linux Fedora 5, e o mesmo foi corrompido por conta de uma troca de componente do equipamento, para ser mais específico as memórias e a placa de rede.

Após a corrupção do SO, não conseguimos mais acesso as informações do banco de dados, e para nossa infelicidade o backup disparado automaticamente todas as noites também estava com 3 tabelas de grande importância corrompidas, impossibilitando a restauração.

Tentamos por horas a fio colocar o banco de dados no ar novamente em outro equipamento com o Linux, mas tudo em vão, todas as vezes que tentavamos subir o serviço do PostgreSQL tinhamos como retorno o seguinte erro: FATAL: Incorrect checkshum in control file.

Efetuamos diversas pesquisas na internet e chegamos a conclusão que o problema estava no sistema operacional que deveria ser de 64 bit´s como era o anterior que foi corrompido. Desta forma formatamos o equipamento e instalamos o SO Fedora 8 64 bits para efetuar o teste, mas mesmo assim o erro persistia. Depois de uma exaustiva busca, encontramos em um site a informação de que a versão do PostgreSQL deveria ser a mesma em que os arquivos estavam sendo executados antes da corrupção.

Buscamos e encontramos um banco rodando com a mesma versão que era a 8.1.9 do PostgreSQL, copiamos as pastas dos dados e executamos o serviço. Pronto, banco funcionando, fizemos o backup dos dados e restauramos no novo equipamento com o novo SO e novo PostgreSQL versão 8.1.20.

Fica ai então nossa dica para quem passar pelo mesmo problema. Tem que utilizar a mesma versão do banco para conseguir subir o serviço.

quarta-feira, 12 de maio de 2010

Dicionário da língua portuguesa

Buscando na internet um dicionário da língua portuguesa de utilização livre, encontrei uma ótima opção para consulta on-line, que é o Aulete Digital. Aqueles que fazem freqüentemente o uso de dicionários valem testar.

Para utilizá-lo será necessário um prévio cadastro no site.

http://www.auletedigital.com.br/