Mostrando postagens com marcador xml. Mostrar todas as postagens
Mostrando postagens com marcador xml. Mostrar todas as postagens

Gerando Gráficos em ASP.NET

Um componente que gosto de utilizar para gerar gráficos é o FusionCharts. Através dele é possível criar gráficos animados e interativos em Flash como gráficos em pizza, barra, colunas, funil, linha, área, bolha, etc. Além de trabalhar com ASP, ASP.NET, PHP, JSP, ColdFusion, Ruby on Rails, Python e HTML puro, pode-se utilizar em conjunto com bancos de dados como SQL Server, Oracle, MySQL, PostgreSQL, etc... O seu funcionamento consiste em apenas gerar o XML (em tempo de execução ou não) e indicar qual o gráfico. Vamos à prática...



Acesse o site da FusionCharts e baixe o pacote com os gráficos (na versão trial vem apenas os gráficos comuns - os mais complexos vem na versão paga). No arquivo baixado vem os SWF's dos gráficos, exemplos de XML's a serem gerados para cada gráficos, o JavaScript a ser incorporado na página e demais documentos (qualquer dúvida veja na pasta Code > CSNET que contêm um exemplo em ASP.NET e contêm todos os arquivos que irá precisar). Para nosso exemplo, vamos gerar um gráfico em pizza.

Crie um Web Site e adicione as pastas conforme a estrutura abaixo:

Adicione no App_Code as classes Util.cs e DbConn.cs. Na Bin adicione a referência à DLL da FusionCharts.dll, na Graficos adicione o SWF do gráfico que iremos gerar (no caso escolha o Pizza3D.swf) e na pasta Js adicione o FusionCharts.js. Todos esses arquivos são encontrados no ZIP que baixou no mesmo caminho dito anteriormente.

Adicione uma página ASPX agora e adicione no body ou no head o script:
<script language="Javascript" type="text/javascript" src="js/FusionCharts.js"></script>

Também adicione um Literal (Controle) no local onde deverá surgir o gráfico. Para fins didáticos coloque o ID do controle como GraphPizza. Agora tudo será no Code-Behind... Adicione os namespaces Utilities e InfoSoftGlobal usando a cláusula using. Em seguida criamos um método onde é gerado o XML e encapsulado sobre o SWF da seguinte forma:

public void CriarGraficoPizza3D()
{
    string strXML = "<graph showNames='1' caption='Tipos de Clientes' decimalPrecision='0'>";
    strXML += "<set name='Alvos' value='10' color='ED1C24'/>";
    strXML += "<set name='Prospects' value='5' color='FFFF00'/>";
    strXML += "<set name='Clientes' value='2' color='00E600'/>";
    strXML += "</graph>";
    GraphPizza.Text = FusionCharts.RenderChart("Graficos/Pizza3D.swf", "", strXML, "GraficoPizza3D", "400", "300", false, false);
}

No caso, gero todo o XML contendo os dados a serem apresentados e o passo por parâmetro ao método do FusionCharts para renderizá-lo e exibi-lo. Bem simples, não? Esse é o exemplo mais fácil... Há várias formas de apresentá-lo bem como suas opções fazem com que apresente mais variantes. O mais difícil (quer dizer trabalhoso) é gerar o XML...

NfseUtil - Utilitário e Código-fonte de Aplicativo que Assina e Envia os XMLs para emissão da Nota Fiscal Eletrônica

Depois de nos matarmos para entender o funcionamento, noites em claro para testes e mais testes, a SEFAZ - Salvador disponibilizou uma DLL e um conjunto de códigos-fonte para realizar todo o processo de assinatura e envio. Agora é mão na roda para quem irá começar a implementar. Para quem já passou por esse sofrimento agora é só descanço... Para mais informações acesse aqui. Abaixo tem os links dos principais arquivos para o utilitário, documentos e XMLs de exemplo:

Usando Certificado Digital para Nota Fiscal Eletrônica no Windows Server 2003/2008

Desde que lançaram a nota fiscal eletrônica, nós programadores ficamos com receio do uso das leitoras e cartões nos sistemas operacionais para a assinatura do XML usando o certificado digital. Geralmente os servidores usufruem de alguma versão do Windows Server para acomodar as aplicações web (que realizam o processo de assinatura) além de proporcionar mais robustez e qualidade diante dos trabalhos. Mas as leitoras e cartões simplesmente não funcionam como deveriam! Incompatibilidade... dizem.
Enfim... como fazer? Simplesmente é só usar outro sistema operacional!

"Mas como vou usar se meu servidor é Windows Server e não posso instalar outro SO?" (Você se perguntando)

Resposta: Use os dois através de uma máquina virtual! Há vários tipos e para vários gostos ficando a critério do que você for utilizar. Recomendo o VMware! Ele dispõe de duas versões (há outras que você pode optar também) que são ótimas para uso: Player e Server. Em resumo, a Player é limitada pois seu uso é simples mas não deixa de ser útil.

Vamos ao processo que será bem simples:
  1. Instale uma das versões do VMware;
  2. Instale um Windows 2000/XP/Vista nela contanto que seja compatível com sua leitora/cartão (a instalação é bem simples e sem dificuldades - é mais fácil do que quando vai instalar no computador "de verdade" bastando seguir o Wizard dela);
  3. Agora conecte a leitora do cartão no PC. Note que no Windows Server não acontecerá nada, mas no Windows interno começará a instalação;
  4. Em seguida espete o cartão na leitora;
  5. Abra o utilitário da leitora (através do Windows da máquina virtual) e verá que o cartão foi lido corretamente.
Pronto! Daí basta compartilhar uma pasta entre o Windows Server e a máquina virtual (através do VMWare se faz isso) e, enquanto no Windows Server vai jogando os XMLs nessa pasta, o Windows MV (da máquina virtual) vai assinando/enviando. Bem louco, não? Mas funciona! Pode até ter o Linux virtualizando um Windows que a leitora irá funcionar.

Processo de Assinatura de Rps/Lote - Nota Fiscal Eletrônica

Lendo aquele bolo de especificação da ABRASF muitos devem perguntar: "Certo, sei quais campos colocar no XML mas qual a ordem do processo de assinatura?". A documentação não fica claro realmente como e qual a melhor forma de assinar. Realize a seguinte ordem:
  1. Gere o XML da Rps e assine;
  2. Se for enviar mais de uma Rps em um mesmo lote, repita o passo 1 para cada Rps;
  3. Anexe todas as Rps já assinadas no XML do Lote;
  4. Assine o Lote e faça o envio.
Seu XML de envio deve ficar semelhante à figura abaixo:


Para fazer a assinatura dos XMLs, utilize a função abaixo:

private XmlDocument AplicaAssinatura(string xml, string uri)
{
try
{
// Obtem o certificado
X509Certificate2 X509Cert = ObtemCertificado();
// Cria um documento XML para carregar o XML
XmlDocument docXML = new XmlDocument();
docXML.PreserveWhitespace = true;
// Carrega o documento XML
docXML.LoadXml(xml);
// Cria o objeto XML assinado
SignedXml signedXml = new SignedXml(docXML);
// Assina com a chave privada
signedXml.SigningKey = X509Cert.PrivateKey;
// Atribui o método de canonização
signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
// Atribui o método para assinatura
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2000/09/xmldsig#rsa-sha1";
// Cria a referencia
Reference reference = new Reference();
// Pega a URI para ser assinada
XmlAttributeCollection _Uri = docXML.GetElementsByTagName(uri).Item(0).Attributes;
foreach (XmlAttribute _atributo in _Uri)
{
if (_atributo.Name == "id")
reference.Uri = "#" + _atributo.InnerText;
}
// Adiciona o envelope à referência
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Atribui o método do Hash
reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#sha1";
// Adiciona a referencia ao XML assinado
signedXml.AddReference(reference);
// Cria o objeto keyInfo
KeyInfo keyInfo = new KeyInfo();
// Carrega a informação da KeyInfo
KeyInfoClause rsaKeyVal = new RSAKeyValue((System.Security.Cryptography.RSA)X509Cert.PrivateKey);
KeyInfoX509Data x509Data = new KeyInfoX509Data(X509Cert);
x509Data.AddSubjectName(X509Cert.SubjectName.Name.ToString());
keyInfo.AddClause(x509Data);
keyInfo.AddClause(rsaKeyVal);
// Adiciona a KeyInfo
signedXml.KeyInfo = keyInfo;
// Atribui uma ID à assinatura
signedXml.Signature.Id = "Assigned" + uri;
// Efetiva a assinatura
signedXml.ComputeSignature();
// Obtem o XML assinado
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Adiciona o elemento assinado ao XML
docXML.DocumentElement.AppendChild(docXML.ImportNode(xmlDigitalSignature, true));
// Retorna o XML
return docXML;
}
catch (Exception erro) { throw erro; }
}

O parâmetro URI é o nome da tag geral que deve ser assinada de um XML, no caso deverá assinar as tags InfRps (cada uma) e LoteRps. A função ObtemCertificado já foi exibida aqui em um tópico anterior que serve para captura do certificado digital.

Criar RSS

Depois de muito tempo voltei a escrever alguns artigos. Pouco tempo disponível e algumas prioridades... Bem, esse tópico, apesar de simples, é de bem ajuda para que desejar gerar RSS dinamicamente. O código é bem simples: apenas Response!
Crie uma página que irá exibir o RSS e coloque o seguinte código no Page_Load:

StringBuilder rss = new StringBuilder();
rss.AppendLine("<rss version="2.0">");
rss.AppendLine("<channel>");
rss.AppendLine("<title>Thiago Marçal</title>");
rss.AppendLine("<link>http://thiagomarcal.blogspot.com/</link>");
rss.AppendLine("<description>Blog que compartilha idéias e código-fontes à comunidade.</description>");
rss.AppendLine("<language>pt-br</language>");
SqlDataReader dr = consulta("SELECT * ");
while (dr.Read())
{
        rss.AppendLine("<item>");
        rss.AppendLine("<title>" + Funcoes.RemoveHTML(Server.HtmlDecode(dr["titulo"].ToString())) + "</title>");
        rss.AppendLine("<description>" + Funcoes.RemoveHTML(Server.HtmlDecode(dr["texto"].ToString())) + "</description>");
        rss.AppendLine("<link>" + dr["link"].ToString() + "</link>");
        rss.AppendLine("<pubDate>" + DateTime.Parse(dr["data"].ToString()).ToString("dd/MM/yyyy HH:mm:ss") + "</pubDate>");
        rss.AppendLine("</item>");
}
rss.AppendLine("</channel>");
rss.AppendLine("</rss>");
dr.Close();
Response.ContentType = "text/xml";
Response.Write(rss.ToString());

Bem simples, não? O método Funcoes.RemoveHTML remove qualquer tag HTML que contenha na string. Eu criei uma bem simples baseada em expressão regular. Você pode criar a seu gosto...