Padrão TISS

8 Comentários

Quem desenvolve aplicações voltadas para clínicas e hospitais que atendem pacientes assistidos por planos de saúde deve conhecer bem o Padrão TISS. Este padrão é “obrigatório para as trocas eletrônicas de dados de atenção à saúde dos beneficiários de planos, entre os agentes da Saúde Suplementar. O objetivo é padronizar as ações administrativas, subsidiar as ações de avaliação e acompanhamento econômico, financeiro e assistencial das operadoras de planos privados de assistência à saúde e compor o Registro Eletrônico de Saúde”.

Não vamos entrar em detalhes sobre a utilização do esquema. Apenas estamos disponibilizando nossa contribuição para os desenvolvedores e usuários. Primeiramente, desenvolvemos uma pequena aplicação para registro das guias de atendimento realizadas no prestador. O objetivo deste registro é gerar um arquivo XML contendo lote de guias no padrão TISS que será enviado a operadora do plano de saúde correspondente para faturamento. O nome da aplicação é RSFatTISS – Faturamento TISS. O padrão adotado nessa aplicação é o TISS 3.00.00. Para saber mais sobre essa aplicação acesse http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/rsfattiss-faturamento-tiss-3-00-00/. A segunda contribuição é um Validador TISS 3.00.00 de uso gratuito. Se voce tem uma aplicação que gere o arquivo XML do padrão TISS 3.0 e quer saber se seu arquivo está de acordo com o padrão, voce pode utilizar gratuitamente nosso validador. Ele verífica: a) estrutura XML do arquivo, b) o formato dos dados e c) o código hash do arquivo. Acesse o validador em www.reginaldojr.com.

É isso.

Nosso Agradecimento: 100.000 visitantes

Deixe um comentário

Há cinco anos atrás decidimos criar um espaço com o intuito de contribuir e ajudar a outras pessoas no aprendisado e solução de problemas da área de  desenvolvimento de sistemas. Surge, então, o Reginaldo Jr. Weblog. Nesse espaço publicamos material fruto da experiência acumulada ao longo de mais de 20 anos. Aqui nós disponibilizamos textos, links, dicas, projetos com código fonte e tudo que possa ajudar pessoas que desejem trilhar caminhos relacionados a construção de sistemas de informação. A proposta é prestar consultoria e auxiliar aos que necessitem de algum auxílio.

Esta semana atingimos a marca de 100 mil visitantes. Pessoas que nos visitam, pessoas que lêem nossas publicações, pessoas que adquirem nossos produtos, pessoas que registram comentários, pessoas que pedem ajuda e opinião, pessoas que nos encontram pelos diversos buscadores, pessoas que nos ligam, pessoas que nos seguem, pessoas que nos contratam para realização de serviços e, enfim, AMIGOS que, direta ou indiretamente, ajudam a manter este serviço. Nosso muito obrigado a todos. Temos registro, inclusive de visitantes de outros países e isso mostra quão útil esse trabalho tem sido.

Quero deixar também um agradecimento muito especial às pessoas que adquirem nossos produtos, seja pra estudo, seja pra uso. Através da confiança em nós depositada, essas possoas nos enviam contriuições financeiras em troca de nossos produtos sem ao menos saber a situação real do projeto. Mas Graças a Deus, temos tido muito sucesso nisso. Jamais recebemos qualquer reclamação. Isso por que esse nosso trabalho é feito com amor e dedicação. Tudo com muita qualidade de profissionalismo.

Nosso muito obrigado a todos e esperamos que os próximos visitantes também se beneficiem do que já existe e do que estar por vir. Aproveito pra anunciar atualizações em nosso conteúdo. Estaremos publicando novas matérias e disponibilizando novos projetos.

É isso…. Grande abraço a todos.

Busca Incremental em ASP.NET com Javascript

Deixe um comentário

Um recurso interessante para pesquisa de dados é a chamada “Busca Incremental”. É uma forma de implementar a pesquisa onde as informações encontradas são exibidas ao mesmo tempo que o dado de filtro é digitado no campo específico. Ou seja, na medida em que a informação procurada é digitada, a cada letra, os resultados vão sendo exibidos e filtrados de acordo com as informações ou letras que já foram digitados. Por exemplo, imagine um banco de dados de uma empresa com um cadastro de funcionários. Deve haver na empresa um sistema para cadastramento dos funcionários e nesse sistema deve ter uma tela ou módulo de pesquisa de funcionário. Uma das formas utilizadas para pesquisa é por nome. Nessa tela deve haver um campo para digitação do nome do funcionário a encontrar.  A Busca Incremental funcionaria assim: se o funcionário pesquisado se chamar ANA MARIA DOS SANTOS, quando digitar a primeira letra, no caso ‘A’, todos os funcionários que comecem com essa letra já são automaticamente exibidos, mesmo sem ter pressionado a tecla ENTER ou um botão de envio. Se em seguida, for digitada a letra ‘N’, o sistema irá exibir apenas os funcionários iniciados pelas letras ‘AN’. Na sequência, se for digitado a letra ‘A’, a nova exibição de dados será apenas os nomes iniciado pelas letras ‘ANA’. O processo segue a cada letra informada até que o resultado da pesquisa mostre apenas o nome procurado.

Em sistemas desktop, ou seja, sistemas executados localmente, esse processo é bem simples de implementar. Utiliza-se um campo texto onde os dados do filtro serão digitados e um grid onde os resultados serão exibidos. No evento OnKeyPress do campo texto (evento que é executado sempre que uma tecla for pressionada) implementa-se um algoritmo que realiza a pesquisa no banco de dados baseado nas letras já digitadas no campo texto e o resultado é, então, mostrado no grid. Sempre que uma nova letra for digitada no campo texto o algoritmo repete a pesquisa com a nova sequência de letras e atualiza o grid com os novos resultados obtidos.

A coisa se complica um pouco em sistemas web. Uma página web funciona mais ou menos assim: o usuário, utilizando um navegador web, envia uma requisição de página ao servidor web que, por sua vez, processa a solicitação e envia uma resposta à solicitação do usuário na forma de página web, de volta ao navegador do usuário. Sempre que o usuário clicar em um botão ou link, uma nova requisição é enviada ao servidor que processará a solicitação e retornará com a página de resposta. O detalhe é que o vai e vem de solicitações e respostas são na forma de página com várias informações. Na busca incremental, a digitação de cada letra no campo de pesquisa deverá enviar uma solicitação ao servidor web que, por sua vez, deve processar a pesquisa no banco de dados e devolver a página de resposta. Esse vai e vem de página inviabiliza o processo. Será preciso utilizar de recursos que minimizem esse e outros problemas. A seguir vamos descrever os problemas e as soluções que utilizamos no processo de implementação de um sistema de busca incremental.

CONTEXTO

Para implementar a busca incremental utilizamos o Cadastro Internacional de Doenças – CID 10 da Tabela Unificada do SUS. Esse cadastro possui aproximadamente 15.000 registros. Na realidade a escolha dos dados não foi o mais importante e sim a quantidade de informações. Isso para testar a eficiência do algoritmo com grande quantidade de dados.

AMBIENTE DE DESENVOLVIMENTO

O ambiente de desenvolvimento web escolhido foi ASP.NET com AJAX Extensions. Utilizamos o Visual Studio 2010 Profissional com o Service Pack 1 instalado. A instalação dessa ferramenta já vem com todos os recursos necessários. O banco de dados foi o SQL Server 2008 Express. A tabela CID foi adicionada ao banco de dados e esta tabela possui a mesma estrutura e dados da Tabela Unificada do SUS.

É importante que o leitor tenha experiência com esse ambiente uma vez que esse material não é apostila nem tutorial. Apenas apresentamos a nossa experiência na construção da solução. Quem desejar pode adquirir a solução completa, com fontes, para maior conhecimento e aprofundamento dos conceitos aqui apresentados. Para saber como, acesse http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/.

CONSTRUÇÃO DO ALGORITMO

No Visual Studio, criamos uma aplicação web vazia e adicionamos uma página do tipo WebForm onde realizamos nossos testes. Primeiramente implementamos a forma tradicional de realizar a pesquisa de CID que é colocar um TextBox e ao lado um Button. Logo abaixo, adicionamos um Grid e no evento OnClick do botão implementamos um algoritmo de pesquisa ao banco de dados com o filtro baseado na informação digitada no TextBox. Quando alguma informação for digitada no TextBox e o botão for clicado, a pesquisa é realizada e o resultado é exibido no Grid. Mas não é isso que queremos. Desejamos que o algoritmo de pesquisa ao banco de dados seja disparado a partir da digitação de cada letra ou digito no TextBox, sem a necessidade de se clicar no botão.

  1. Será necessário executar o mesmo algoritmo de pesquisa que foi implementado no botão quando for pressionada uma letra ou digito no campo de pesquisa. Para tanto, teremos que recorrer ao Javascript, no evento onKeyUp do TextBox, e neste evento será necessário executar o algoritmo de pesquisa e exibição do resultado que foi implementado no botão. Em dialeto ASP.NET; deverá ser executado um Postback quando uma tecla for pressionada no TextBox e o evento onClick do botão (que implementa a pesquisa de dados ao banco) deve ser executado no servidor para retorno dos resultados.
  2. Na forma tradicional, um clique no botão provoca uma recarga na página para exibição dos dados de retorno (PostBack). Não é interessante que haja recarga total de página a cada tecla pressionada. Para isso devemos utilizar chamada assíncrona (AJAX). Na página ASP.NET devemos incluir os componentes de chamada AJAX para que o resultado da pesquisa seja exibido sem necessidade de recarga total da página; seja na pesquisa tradicional através do botão, seja na pesquisa disparada pelo pressionar de uma tecla no TextBox.
  3. 3. Na forma de busca incremental, após qualquer pesquisa e exibição do resultado, o cursor deve estar sempre sobre o TextBox e no final da sequência de letras para permitir a digitação de novos dados. A utilização da função Focus() do TextBox coloca o cursor sobre o Textbox mas não o posiciona ao final da sequência de letras. Infelizmente, no ASP.NET não possui (ou não tenho conhecimento de) como fazer este posicionamento no final da sequência após o Focus(). Pra resolver o problema será preciso recorrer ao Javascript para posicionar o cursor ao final da sequência de letras no TextBox sempre que receber o foco da aplicação.
  4. 4. O processo de pesquisa e acesso ao banco é relativamente lento dentro desse processo de busca incremental. Então quanto menos vezes forem realizadas acessos ao banco de dados melhor. A nossa solução consiste em realizar a primeira pesquisa ao banco (quando a primeira letra for digitada no TextBox) e guardar esses resultados em memória. Quando as próximas letras forem digitadas os filtros serão realizados nos dados em memória; uma vez que o resultado da pesquisa realizada a cada letra será sempre um subconjunto dos dados do filtro anterior. Essa realização de filtro com os dados já em memória tem desempenho melhor que acessos constantes ao banco de dados.

AVALIAÇÃO DOS RESULTADOS

O processo é bem interessante e útil. Inclusive o site de busca da Google utiliza essa forma de pesquisa. No nosso contexto o procedimento apresentou desempenho satisfatório. Claro que em ambiente web a velocidade de envio de requisição e recebimento de resposta depende de fatores como: velocidade de conexão, velocidade de processamento no computador do usuário, velocidade de processamento no servidor web, etc. Quando a primeira letra é digitado no TextBox uma requisição relativamente lenta é feita ao banco de dados. A partir da segunda letra o filtro é realizado diretamente em memória e assim, o desempenho é melhor. Por conveniência, a primeira pesquisa ao banco é feita após a digitação de duas letras e dependendo do contexto podem-se utilizar mais letras na primeira pesquisa. As pesquisas realizadas com a massa de dados (15.000 registros) também atendeu a expectativa.

O leitor pode pessoalmente testar os resultados da implementação deste algoritmo. Para tanto, acesse a pesquisa de CID no meu site pessoal, http://www.reginaldojr.com/PesquisarCid.aspx. Se for possível, após a visita ao site, deixe um comentário aqui no blog com sua opinião sobre a pesquisa.

Também, quem desejar ver a implementação completa do algoritmo pode adquirir o Projeto PesqCidWeb com fontes. Para maiores informações acesse http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/.

Gravar Arquivos em Banco de Dados

2 Comentários

Uma possibilidade interessante para armazenamento de arquivo é a utilização de banco de dados para guardar os arquivos. A primeira vista, esta possibilidade parece complicada quando comparada ao armazenamento tradicional que é utilizando pastas e diretórios; forma utilizada por sistemas operacionais em seu sistema de arquivos. De fato, o armazenamento de arquivos em pastas nos CDs, DVDs, HDs, PenDrive, etc. é muito simples. Basta copiar o arquivo em alguma pasta desses dispositivos e, quando houver a necessidade, o arquivo pode ser resgatado bastando reencontrar o arquivo no local onde foi copiado anteriormente.

O problema começa quanto existe centenas ou milhares de arquivos a serem armazenados, por exemplo, as diversas monografias geradas pelos alunos de uma universidade. Armazenar é fácil. Basta copiar o arquivo gerado em uma pasta de um CD, por exemplo e guardar este CD em local seguro. Se existe milhares de arquivos espalhados em vários CDs, a dificuldade aparece quando se deseja encontrar um arquivo específico que pode estar em qualquer dos CDs. Possivelmente todos os CDs precisarão ser investigados para localização de um arquivo específico. A complexidade aumenta se a necessidade for por encontrar um arquivo que possua um certo conteúdo. Cada CD será investigado e, ainda, cada arquivo presente no CD precisará ser aberto e lido na tentativa de se identificar o assunto ou conteúdo tratado no arquivo.

Seria muito pertinente se houvesse um sistema indexador desses arquivos, ou seja, um sistema que fosse possível armazenar a localização e identificação de cada CD, bem como os arquivos que o compõe. Além disso, um resumo dos dados do arquivo poderia ser armazenado para facilitar a identificação do seu conteúdo. O sistema poderia, também, realizar pesquisas ou filtros para identificar quais arquivos satisfazem às condições passadas.

A utilização de um sistema indexador como apresentado acima já resolveria o problema de pesquisa de arquivo, aumentando a velocidade de localização. Uma vez realizada a pesquisa e localizado o arquivo procurado, basta identificar o CD onde o arquivo está e ir até ele para copiar o arquivo procurado. A questão agora é ter que ir ao CD ou qualquer outro dispositivo de armazenamento para acessar o arquivo. Poderia ser interessante que o sistema citado acima pudesse armazenar uma cópia desse arquivo. Assim não haveria necessidade de recorrer a nenhum meio físico para cópia e resgate do arquivo. Note como isso abre várias possibilidades de uso: os arquivos podem ser criados a partir de documentos, ou seja, documentos em papel podem ser transformados em arquivos digitais e serem armazenados no sistema. Esse procedimento poderia ser muito útil em escolas para armazenamento de trabalhos de alunos, fóruns judiciários para controle de processos, hospitais para armazenamento de prontuários ou qualquer lugar que gere documento que necessite de guarda prolongada. Assim o arquivo físico poderia está guardado em local seguro e o arquivo digital poderia está no sistema para leitura e impressão quando necessário. Recorrer ao arquivo físico, só quando necessário. Associado a tudo isso poderia-se utilizar algum tipo de certificação digital para garantir a validade legal do arquivo digital, mas isso é uma outra história.

De fato, um sistema capaz de armazenar arquivos é muito útil para várias aplicações. Já deve estar claro que o sistema estará fazendo o armazenamento dos arquivos e informações em um banco de dados e, assim, todos os conceitos e recursos relacionados a SGBD (Sistema Gerenciador de Banco de Dados) estão disponíveis e envolvidos no sistema. Uma grande vantagem dessa abordagem é a realização de cópia de segurança para evitar perdas; os backup’s. Passa a ser uma responsabilidade do SGBD garantir a segurança da informação e evitar perda de dados ou dos arquivos armazenados.  Quando for feito o backup do banco de dados, diretamente está sendo feito o backup dos arquivos armazenados nesse banco. A periodicidade desses backups e o local armazenado são fatores importantes que podem garantir a recuperação de dados quando ocorrer alguma falha de hardware.

Para demonstrar essa ideia, desenvolvemos o ARQDOC – Armazenamento de Documentos em Banco de Dados. Este sistema permite guardar em banco de dados arquivos diversos. O próprio usuário pode categorizar seus arquivos, associar, se for o caso, a um documento físico armazenado em uma sala e importar o arquivo digital correspondente para o banco de dados do sistema. Posteriormente o usuário pode usar o SGBD para realização de backups que estarão salvando seus dados de forma segura. O resgate de arquivos no ARQDOC também é muito simples: basta realizar pesquisa por nome do arquivo, resumo, autor, conteúdo textual de alguns tipos de arquivos, etc. Para maiores informações acesse http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/arquivamento-de-documentos-em-banco-de-dados/.

Google Maps com Javascript

4 Comentários

Em post anterior comentei sobre um componente que insere o recurso Google Maps em página ASP.NET. Este componente pode se integrar ao Visual Studio e isso facilita o seu gerenciamento. Clique aqui e leia mais. Neste post vamos utilizar o Google Maps e configurá-lo através de sua API. Isso é feito inserindo comandos Javascript em nossa página.

Separei três recursos interessantes que podem ser utilizados para enriquecer os sites e facilitar a vida dos usuários:

  1. Recurso para localização de uma localidade no mapa: se você tem um site na Internet que divulga serviços e/ou produtos, seria interessante facilitar o acesso dos usuários ao estabelecimento. Se a empresa recebe ligações de pessoas solicitando o ponto de referência para facilitar o acesso, que tal exibir um mapa no seu site apontando a localização do estabelecimento?
  2. Recurso para exibir uma possível rota entre duas localidades: como complemento ao posicionamento do estabelecimento no mapa, pode-se mostrar um caminho para o estabelecimento. O site pode mostrar a localização do estabelecimento, solicitar a localização atual do cliente e traçar uma rota no mapa.
  3. Recurso para cálculo de distância entre duas localidades e tempo de viagem: para quem trabalha com viagens pode ser interessante calcular, por exemplo, a distância entre duas cidades e tempo aproximado numa possível viagem entre elas. Além disso, utilizar essa distância para cálculos de diárias, reembolsos, etc.

Esses e outros recursos podem ser adicionados a qualquer site utilizando a API do Google Maps.  Claro que não é tudo tão simples assim. Por exemplo, no terceiro recurso sugerido, mostrar pelo Google Maps a distância entre duas localidades não é complicado. Mas, extrair essa distância para manipulação ou, por exemplo, armazená-la em um banco de dados, isso é mais complicado. A seguir, vamos mostrar como adicionar em um site os recursos citados acima utilizando a API Google Maps em Javascript.

Sugerimos utilizar o Visual Studio para realização dos experimentos. Porém, com as devidas adaptações, a maioria deles podem ser implementados em qualquer editor web. Não iremos tratar dos recursos e conceitos de desenvolvimento web e no Visual Studio. Deixamos a cargo de leitor pesquisar sobre o assunto: Visual Studio, desenvolvimento Web, HTML, CSS, Javascript, ASP.NET, Servidor WEB, etc. Vamos ao trabalho…

Na sua aplicação, crie uma página onde serão implementados os recursos do Google Maps. Para realização dos experimentos insira no corpo (entre as tags HTML <body> e </body>) da página as seguintes tags:

<script src=’http://maps.google.com/maps?file=api&v=2.x&amp;key=‘ type=’text/javascript’></script>
<div id=”mapa” style=”width: 70%; height: 480px; float:left; border: 1px solid black;”></div>
<div id=”rota” style=”width: 25%; height:480px; float:right;”></div>

Note que na primeira linha tem o parâmetro KEY. Se você for utilizar esse recurso em um servidor WEB real, deverá primeiro registrar este servidor no site da Google e receber uma chave que permitirá que seu site exiba os mapas. A chave pode ser adquirida aqui.

Localização de uma Localidade no Mapa

Após as linhas inseridas anteriormente adicione o seguinte script:

<script type=”text/javascript”>
var map;
function initialize() {
map = new GMap2(document.getElementById(“mapa”));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng( -12.977753,-38.507779), 15);
var textHtml = ‘<center><strong>Minha Marca</strong></center>';
var textHint = ‘Minha Marca‘;
var marker1 = new GMarker(new GLatLng(-12.977753,-38.507779), { draggable: false, title: textHint });
marker1.openInfoWindowHtml(textHtml);
GEvent.addListener(marker1, “click”, function () {
marker1.openInfoWindowHtml(textHtml);
});
map.addOverlay(marker1);
}
initialize();
</script>

Este script irá utilizar a DIV ‘mapa’ para mostrar um mapa e colocar uma marca em um ponto específico. Note que em vermelho tem as informações de latitude e longitude correspondente à alguma localidade. Existe várias formas de se descobrir essas coordenadas correspondente à localidade. Leia este post e os comentários que foram colocados. Nele o autor sugere uma forma de descoberta das coordenadas de uma localização e os leitores comentam essa forma ao mesmo tempo que sugere outras formas para identificar essas coordenadas. Voce de ler e escolher a forma que ache mais conveniente para você. Uma vez encontrada essas coordenadas faça a substituição no local específico do nosso script. No texto em azul você pode inserir um texto identicador para a marca inserida. A figura abaixo mostra o resultado esperado.

Como você pode ver, podemos inserir scripts em Javascript para trabalhar com a API do Google Mapas e manipular a exibição de marcas dentro do nosso mapa. Para demonstrar, adicionei o recurso ao meu site. Lá, é feita uma pesquisa por logradouro ou cep ao site dos Correios e os resultados encontrados são posicionados no mapa. Não deixe de ver. Acesse http://www.reginaldojr.com/BuscaCep.aspx.

Exibir uma Possível Rota entre Duas Localidades

Para inserir uma rota no mapa, substitua o script anterior pelo mostrado abaixo:

<script type=”text/javascript”>
var map;
var directionsPanel;
var directions;

function initialize() {
map = new GMap2(document.getElementById(“mapa”));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
directionsPanel = document.getElementById(“rota”);
directions = new GDirections(map, directionsPanel);
directions.load(“from: Rua do Carro, Salvador – Bahia, Brasil to: rua jardim santo antonio, salvador bahia“);
}
initialize();
</script>

Em vermelho estão a localização de origem e destino. Se nessas informações, possuir alguma inconsistência ou erro de digitação o mapa não será mostrado. Por isso é importante acessar o site do Google Maps para fazer testes com a origem e destino e, assim, identificar a melhor grafia para origem e destino da rota. A figura abaixo mostra uma rota traçada. Inclusive, no meu site pessoal também inseri o recurso para mostrar a rota e o mapa entre dois municípos brasileiros selecionados em caixas de seleção. Visite http://www.reginaldojr.com/RotasGoogleMaps.aspx e veja como ficou.

Distância entre Duas Localidades e Tempo de Viagem

No item anterior mostramos como exibir uma rota no mapa e um detalhamento dos caminhos que podem ser utilizados para sair do ponto A e chegar ao ponto B. O resultado exibe ainda outras informações: a distância total entre a origem e o destino,  o tempo médio para percorrer os dois pontos e a distância entre os trechos intermediários no caminho entre a origem e o destino. Pode-se, também, na origem e destino informar nomes de cidades. O Google Maps irá calcular a distância entre as cidades e o tempo estimado do percurso. Para realizar operações com estes valores basta transcrevê-los para um sistema especifico e efetuar os devidos cálculos. Assim, a princípio, a questão de cálculo da distância entre duas localidades e o tempo estimado de transporte está resolvido.

Mesmo funcionando bem, o procedimento de copiar da tela do Google Maps para o sistema específico não me parece muito elegante. Primeiro que, por ser um procedimento com interferência humana, podem ocorrer erros na transcrição. Seria interessante que o próprio sistema se conectasse ao Google Maps e extraísse os valores necessários. Pesquisando na documentação da API do Google Maps não consegui identificar uma forma automática de fazer essa leitura dos dados. Se alguém souber como, por favor, deixe seu comentário para ajudar a nós, pobres mortais. Para tentar resolver esse problema tive que apelar para um processo não muito ortodoxo. A inspiração veio desse post. O autor utiliza o conceito de raspagem de dados, ou data scrapping, que é uma forma de extrair informações diretamente da tela do computador. Leia mais sobre isso aqui. Para o nosso caso fizemos uma “raspagem de HTML” que consiste em receber dentro de um sistema o HTML gerado pelo Google Maps e pesquisar na sequência de tags e caracteres onde está nossa informação; no nosso caso, a distância entre os duas localidades e o tempo aproximado de viagem. Essa pesquisa nas tags HTML pode ser de forma sequêncial, randômica ou utilizando Expressões Regulares para fazer o casamento de expressão. Nossa opção foi pelas Expressões Regulares por parecer ter uma melhor performance. Como desejamos manipular a informação em sistema específico não faz sentido utilizar o Javascript para obter o resultado. Por isso utilizamos a linguagem C# na plataforma .NET para realizar o processo de raspagem. Quem tiver alguma observação ou proposta diferente da nossa, favor deixar um comentário.

Acompanhe o próximo post onde estaremos modelando uma aplicação que utiliza este procedimento: Cálculo de Distância e Tempo de Viagem entre Cidades Brasileiras.

Sistema de Registro de Visitantes

Deixe um comentário

Estamos disponibilizando mais esse programa. O objetivo  é controlar o acesso de pessoas que visitam estabelecimentos privativos. Através deste sistema pode-se registrar o número do documento de identificação, o destino e a imagem do visitante para posterior consultas. A imagem do visitante é capturada pela Webcam instalada no computador.

O programa foi desenvolvido em C# e .NET. O banco de dados utilizado é o Firebird. Contudo, o sistema pode ser modificado para utilização com qualquer banco de dados comercial.  A ferramenta de desenvolvimento da solução foi Visual Studio Profissional e pode ser aberta no VC# Express.

A solução foi desenvolvida em camadas e é composta de 5 projetos: um em Windows Forms, um para regras de negócios (BO), um para acesso a dados (DAO),  um para as interfaces e outro para mapeamento objeto-relacional. O projeto utiliza o NHibernate para persistência de dados.

Quem se interessar pode me mandar email ou acessar a página da aplicação para obter maiores informações.

EDWS – Sistema de Gerenciamento de Conteúdo

Deixe um comentário

Em certa oportunidade um usuário me pediu para construir um site para o estabelecimento onde trabalha. Eu perguntei qual o objetivo do site. Ele simplesmente respondeu que a chefia dele quem solicitou e ele não sabia nem por onde começar. Ele não tinha a menor idéia do que ia colocar no site. Fiz algumas sugestões de conteúdos e disse que ele deveria, primeiro, conversar com os setores do estabelecimento e colher informações para alimentar o site com notícias, fotos, informações, artigos, textos, etc.

Mas surgiu um problema: quem iria dar manutenção no site? EU? Sem chances!!!!!!! Foi aí que surgiu a idéia de construir um sistema gerenciador de conteúdo onde ele mesmo pudesse criar e gerenciar as páginas do site. A criação das páginas deveria ser bem simples, como se fosse um editor de textos. Procurei na Internet sistemas de CMS (Content Management System ou Sistema Gerenciador de Conteúdo) prontos que pudessem ajudar nessa tarefa e achei alguns: Blogs gratuitos, EVA (100% brasileiro), XOOPS, etc. Todos muito bons porém, para usuários com pouca ou nenhuma experiência, são exageradamente cheio de recuros. É bom que se diga, bons recursos. Mas para o meu problema, possivelmente eu tivesse que “dar um curso” de alguma dessas ferramentas para o usuário e o pior: ficar tirando dúvidas, etc. Sem falar nos problemas com a instalação do banco de dados.

Decidi construi algo mais simples, levando em consideração que o usuário só queria ter um local na Internet para divulgar informações. Construi o EDWS – Edição Dinâmica de WebSite. Esta primeira versão era bem limitada. Uma versão light. Tinha uns 3 layouts prontos, menu superior e lateral e dois recursos pré-formatados: uma página “Fale conosco” e uma outra para localização do estabelecimento no Google Maps. Adicionei também um contador de visita além de uns links para alguns serviços últeis: consulta de CEP e previsão do tempo. A edição das páginas era feita utilizando o FCK Editor. Já falei dele em posts anteriores. Documentação sobre este editor pode ser facilmente encontrado na Internet.

O fato é que o usuário ficou satisfeito e eu também. Ele fez o site e está no ar até hoje. Eu também gostei do resultado e decidi desenvolver outra versão para o EDWS. Nasce, então, o EDWS – Sistema de Gerenciamento de Conteúdo. Adicionei inúmeros outros recursos pré-formatados: blog, álbum, notícias, novos layouts, YouTube, etc.

Além de tudo, decidi disponibilizá-lo para quem desejar utilizar em seus trabalhos. Acho que o maior diferencial deste sistema é a simplicidade e facilidade de uso. Quem desejar conhecer mais sobre este sistema e baixá-lo pode acessar o blog que criei especialmente para este projeto: http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/edws/. Não há necessidade de adiquirir licença para utilizar a versão gratuita. Porém quem desejar suporte ou os fontes do programa poderá entrar em contato comigo para fazer-mos alguma negociação. A única limitação dessa versão gratuita é a exibição de um link para o blog do EDWS. Ah! O site da RS Consultoria & Sistemas foi feito com esta ferramenta.

É isso!

Importar Tabela Unificada SUS para Banco de Dados

4 Comentários

Quem desenvolve sistema de informações em saúde voltado para atendimento SUS certamente conhece a TABELA UNIFICADA SUS. Afinal os procedimentos hospitalares e ambulatoriais, CID´s, ocupações dos profissionais envolvidos, relacionamentos entre tabelas, valores dos procedimentos, prazos, tempos de premanência, entre outros são encontrados nessas tabelas que dão suporte a vários outros sistemas fornecidos pelo Ministério da Saúde. Quem não conhece a estrutura da Tabela Unificada SUS pode conhecer no site http://sigtap.datasus.gov.br. Esta é a forma on-line de consultar essas informações.

Recentemente eu desenvolvi um sistema de gestão em saúde que utilizava esta tabela. O Datasus disponibiliza os dados desta tabela mensalmente em arquivos textos compactados. Tivemos que criar uma maneira de importar facilmente estes dados baixando do FTP e importando para o nosso banco de dados. O próprio usuário pode disparar este processo quando tiver conhecimento da disponibilidade das informações atualizadas da tabela.

Resolvi, então, disponibilizar a solução completa e com fontes para os interessados. Este projeto é bastante rico em recursos: criação de tabelas, descompactação de arquivos, download de FTP, conexão com banco de dados, execução de scripts DDL, etc. O projeto foi desenvolvido para utilização com banco de dados Firebird, MS SQL, MySQL ou PostgreSQL.

Acesse http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/importar-tabela-unificada-sus/ e tenha maiores informações sobre o nosso projeto.

É isso.

Servidor de Aplicação em .NET

Deixe um comentário

A arquitetura em camadas tem sido amplamente adotada pelos analistas e desenvolvedores de sistemas computacionais. Isso porque esta arquitetura favorece a aplicação de vários conceitos envolvendo a engenharia de software como, por exemplo, modularidade, manutenibilidade, etc. O conceito que motivou a escrita deste post é a escalabilidade, ou seja, o desafio de construir sistemas preparados para “crescer”. Um sistema e dito escalável, por exemplo, quando seu desempenho aumenta com acréscimo de hardware. Não estou falando em ficar mais rápido por que agora ele está rodando em um servidor mais rápido do que o antigo. Estou falando em potencial de crescimento e adaptação a cenários de produção. Imagine a situação: Uma pequena empresa com poucos recursos financeiros requisitou da equipe de TI um sistema de gestão empresarial. Após levantamento de requisitos, avaliação das condições de infraestrutura, decidiu-se pela seguinte configuração: arquitetura cliente/servidor. Um servidor de banco de dados foi colocado na rede e a aplicação cliente faria solicitações a este servidor. A aplicação cliente implementava todas as regras de negócio do sistema de gestão e o servidor de banco de dados serviria apenas como repositório de dados. A princípio tudo funcionava bem: LAN com poucos usuários, poucos dados no banco… Mas a empresa cresceu. Mais usuários na rede, maior volume de dados, novas filiais, negócios via internet, novas regras de negócio, etc. Já está claro que o velho sistema precisaria ser reescrito. Talvez até em outra plataforma de desenvolvimento. Sem falar que, possivelmente, novos especialistas em TI precisarão ser contratados ou, pelo menos, os anteriores terão que passar por algum treinamento/reciclagem. Tudo isso porque não se pensou na possibilidade do sistema crescer em necessidades de regras de negócio juntamente com a necessidade de infraestrutura. A pequena empresa, hoje, tem condições para investir em mais computadores-servidores, internet, redes de longa distância. Ela tem alto volume de dados que precisam ser tratados com velocidade dentro e fora do ambiente da empresa. Eu pergunto: é qualquer sistema que pode se adaptar a esta nova realidade? O grande desafio é CONSTRUIR SISTEMAS PREPARADOS PRA CRESCER. O sistema não precisa nascer grande mas deve possuir características que, com pequenas adaptações, tenha seu potencial aumentado.

Um bom começo para quem prentende trabalhar com escalabilidade é verificar se seu sistema admite a possibilidade de trabalhar utilizando um servidor de aplicação: as aplicações clientes (desktop ou web) fazem requisições a um servidor. Neste servidor estão implementados todas as regras de negócio e esse servidor faz acesso ao banco de dados para, então, responder às solicitações. Para utilizar essa proposta, que modificações voce teria que fazer no seu sistema?

  1. Teria que reescrever o sistema em outra plataforma?
  2. Teria que efetuar algumas mudanças sim. Voce acha que dá pra fazer? Em quanto tempo?
  3. Teria que, primeiro ser treinado em ambiente em camadas pra depois pensar nisso?
  4. Teria que, primeiro mudar sua forma de programar?
  5. Teria que colocar as regras de negócio da aplicação em um só lugar para depois pensar no servidor de aplicação?
  6. Teria que modelar o sistema primeiro em orientação a objetos?
  7. Outro “teria” qualquer….

Veja que parece simples responder a esta pergunta mas não é tão imediato assim. Nem todos os sistemas são preparados para isso efetivamente. Outras respostas:

  1. Construimos o sistema com esta visão. Foi previsto que o projeto teria grande possibilidade de crescimento tanto em recursos quanto em necessidades.
  2. Sim. É só modificar o arquivo de configurações do sistema para que as aplicações clientes façam solicitações para o servidor.
  3. Sim. Só preciso modificar uma linha do sistema, recompila-lo e recoloca-lo em produção.
  4. Quantos servidores posso utilizar? Pelo menos um servidor para DAO´s e banco de dados e um outro servidor de regra. Poderiam ser mais servidores de aplicação espalhados pela rede. Depende apenas do nível de resposta que a empresa pretende ter e da disponibilidade de recursos físicos.
  5. O sistema permite dividir papéis facilmente.
  6. Outros “só se for agora” qualquer….

Se voce puder utilizar alguma dessas respostas, parabéns. Voce já está no caminho certo. É essa linha que a engenharia de software moderna quer que os novos sistemas sigam. Para aqueles que aindam não perseguem estes objetivos vou tentar passar algumas dicas como roteiro inicial a seguir.

Eu utilizava .NET 1.1 quando me fiz a seguinte pergunta: Em J2EE, pode-se configurar a utilização de um servidor de aplicação através dos EJB containers. JBoss é um exemplo de servidor de aplicação gratuito em Java. Pode-se também construir aplicações distribuidas com JavaRMI. E qual o servidor de aplicação para .NET e como construir aplicações distribuidas??? Há um tempo atrás fui a uma apresentação sobre .NET 2.0 com Visutal Studio 2005. Na saída fiz essa pergunta ao facilitador e ele me respondeu com uma palavra: “Remoting”. Ao chegar em casa me dediquei a pesquisar sobre o assunto. A seguir, deixo indicado um artigo que serviu de base para nossa trajetória sobre o assunto:

.NET Remoting – Parte 1 – Acessando informações remotamente
.NET Remoting – Parte 2 – Acessando informações remotamente

Desde então temos trabalhado para que a construção dos nossos sistemas tenham carateríscas que viabilizem a arquitetura de acesso remoto. As pessoas que acompanharam em nosso blog os post entitulados NHIbernate + Visual Studio: Construindo aplicações em camadas devem ter notado em algumas partes dos códigos e da explanação a presença de flags para utilização de servidor de aplicação. Desenvolvemos uma solução chamada RemoteServer.NET em Visual Studio com 3 projetos que casa perfeitamente com esses indicadores:

  1. RemoteServerWin: Um servidor de aplicação utilizando .NET Remoting que roda como aplicação do windows.
  2. RemoteServerService: Um servidor de aplicação, também utilizando .NET Remoting que roda como serviço do windows.
  3. RemoteServerSetup: Um instalador dos projetos anteriores.

Vamos entender o esquema abaixo numa proposta didática, porém bem próxima de uma arquitetura ideal:

No ínicio do processo temos um usuário utilizando o seu computador para fazer solicitações ao servidor web através de um navegador. O servidor web é responsável apenas pela apresentação e desenho da página web. Qualquer necessidade de processamento de regras de négocio deverá ser enviada ao servidor de negócio. A linha usuario-navegador-servidor web-servidor de negócio poderia ser subistituida por outras configurações: celular-servidor web-servidor de negócio, aplicativo windows-servidor de negócio, etc. O fato é que o servidor de negócio precisa está preparado para receber e responder a requisições remotas. Neste servidor estaria configurado o RemoteServer.NET para responder solicitações da camada de apresentação. Algumas vezes o servidor de aplicação precisaria acessar dados do banco de dados. Esse acesso, de acordo com padrões de projetos e arquitetura em camadas deveria ser através de DAO´s. Logo poderiamos ter um servidor DAO para responder requisições feitas pelo servidor de negócio. Neste servidor DAO também teria instalado o RemoteServer.NET para responder requisições remotas. Por fim, temos uma máquina como servidor de banco de dados para acesso a dados.

As possibilidades são inúmeras. Imagine um enorme volume de usuários fazendo acesso ao servidor de regra. Poderiamos colocar novos servidores de negócio pra dividir a carga ou mesmo, mais servidores de acesso a dados fazendo com que as requisições fossem aleatórias a estes servidores evitanto o engarrafamento de requisições no mesmo servidor. Poderiamos também fazer replicação sincrona de dados no banco ou mesmo, utilização de cluster para dividir a carga de acesso ao banco de dados. Tudo dependendo do potencial do parque de informática da empresa e necessidade de acesso rápido ás informações. Adicionemos a tudo isso uma dose de XML Web Service para que outra aplicações possam conectar-se diretamente a seu servidor de regras via web.

As aplicações que voce desenvolve suporta essas possibilidades?  Isso é ESCALABILIDADE.

Na nossa página de Sistemas c/ Fontes estamos disponbilizando a solução RemoteServer.NET para aqueles que desejarem adquirir e ampliar seus horizontes. Vale lembrar que o RemoteServer.NET sozinho não faz milagre. A aplicação como um todo deve ser pensada para suportar esses requisitos. O primeiro passo é repensar seus conceitos em desenvolvimento e pesquisar soluções que sejam multi-utilizáveis.

Quem desejar adiquirir esse e outros produtos entre em contato. Teremos o maior prazer em responder. Voce estará contribuindo para manter nossas pesquisas bem como, a qualidade das nossas publicações.

É isso.

Visual Studio + NHibernate: Construindo aplicações em camadas – (cont. VI)

5 Comentários

No post anterior criamos as classes que vão dar suporte às regras de negócio da nossa aplicação. Neste post, que é o último desta série, vamos criar a nossa camada de apresentação. Não pretendo aqui esgotar o assunto sobre isso, nem mesmo desenvolver todos os recursos do sistema. O que iremos fazer é dá uma idéia inicial sobre a comunicação entre as camadas e criar um protótipo web que possa servir de base para o trabalho do desenvolvedor.

Até o momento tudo que fizemos foi puramente conceitual. E, de posse dos conceitos, utilizamos o RSClass para gerar os códigos. Destaque para algumas bibliotecas que encapsulam funcionalidades ligadas ao NHibernate, visando diminuir a codificação e proporcionar ganho em reaproveitamento de código. Daqui pra frente quem manda é a critatividade e a prática do programador para desenvolver a aplicação de acordo com os requisitos de sistemas definidos no projeto. Eu considero que é deste ponto que se inicia o trabalho de codificação efetivamente, visto que, até o momento, utilizamos geradores de código para criar as camadas que darão suporte a nossa aplicação. Eu utilizo essa prática em todo sistema corporativo que desenvolvo. Claro que a medida que vão surgindo outras necessidades, tanto as bibliotecas, quanto o RSClass vão sofrendo adaptações. Por exemplo, desde quando comecei a escrever esta série algumas mudanças foram feitas no RSClass e nas bibliotecas. Isso é fácil de entender: a medida que vamos trabalhando, vamos aprendendo e aprimorando nossos hábitos e conceitos. Isso faz parte do ser humano: fazer hoje, melhor que ontem.

Então vamos iniciar os trabalhos. Abra a nossa solução no Visual Studio na solução da agenda e adicione um novo projeto. Uma vez me perguntaram se este projeto poderia ser em windows forms. Claro que sim. Pode ser qualquer projeto de GUI: web, windows forms ou console, inclusive web service. A camada de apresentação é o local onde o usuário final irá interagir com seu sistema. Quem define isso é o documento de requisitos. No nosso caso será um projeto web. Adicione um Web Site ou um Empty Web Application. Eu prefiro utilizar Web Application. Qual a diferença? Bom… Eu começei no VS 2003 e ele já utilizava o conceito de web application. Eu gostava porque os arquivos .cs não precisavam ser colocados no site em produção. Ele gerava uma única .dll que implementava todas as classes. No web site, temos que colocar em produção os arquivos .cs que serão compilados, gerando as dll’s, em tempo de execução. Vantagem e desvantagem: Na web application qualquer modificação precisa ser recompilada. No web site modificações podem ser feitas diretamente no arquivo em produção. A compilação será feita automaticamente. Por outro lado, na web application tem como evitar a ação de pessoas não autorizadas nos códigos-fontes da  sua aplicação, enquanto no web site não tem como impedir diretamente. Teria que ser via sistema operacional. Enfim, veja o que é melhor. Fiquei com web application… Adicionei um projeto web application vazio com nome “AgendaTelefonica”. Aliás, tem que ser este nome por que o proxímo passo é usar o RSClass que vai depender disso.

E este é o próximo passo: gerar um protótipo da aplicação pelo RSClass. Acesse o menu Gerar->Protótipo WebApplication e configure como mostrado a seguir:

O RSClass vai gerar as páginas web correspondente a cada tabela. Essas páginas estarão com as opções de inclusão, alteração, exclusão e consulta completamente funcionais. Ainda no RSClass, gere a classe BOAcces. Marque a opcão na tela principal e clique em °Gerar Classes”. Essa classe irá fazer as requisições à camada de negócio. Todas as chamadas à camada de negócio deverá ser feita através dessa classe.

De volta ao Visual Studio, os arquivos (e pastas) gerados precisarão passar por duas etapas:

  1. No projeto, clique em “Show All Files“, selecione todos os arquivos gerados (inclusive as pastas Images e Diversos), clique em um deles com o botão direito do mouse e selecione “Include In Project“.
  2. Agora, selecione cada página .aspx e .master e, com o botão direito do mouse, acione “Convert to Web Application“.

Ainda no Visual Studio, precisamos adicionar algumas referências em nossa aplicação web. Clique no botão direito do mouse sobre o nome do projeto e selecione “Add Reference…”. Selecione a guia Soluction/Project e, nessa guia, selecione os projetos BO, Interface e OR (não selecione o DAO, porque? lembra?) e clique em ‘OK’. Lembre da obediência a hierarquia em cadamas que discutimos anteriormente. A camada de apresentação só pode fazer requisições à camada de negócio. Nunca à camada DAO. Lembra, também, da Regisoft Library? Vamos precisar dela. Adicione as bibliotecas Regisoft.dll, Regisoft.web.dll e Regisoft.Web.UI.WebControls. São bibliotecas com recursos diversos: tratamento e validação de strings, manipulação de javascript, limpeza automática de campos da tela, atribuição automática de valores dos objetos O/R a campos da tela, componentes da toolbox que eu adicionei alguns novos recursos e muito outros.  Como voce já sabe, todas essas bibliotecas são encontradas na pasta onde voce instalou o RSClass. E se quiser conhecê-las melhor, sugiro adquirir os fontes e verificar pessoalmente. Adicione, também, referência à biblioteca de componentes AJAX: AjaxControlToolkit.dll

Além dessas, vamos precisar da biblioteca que conecta o banco de dados Firebird: FirebirdSql.Data.FirebirdClient.dll. O NHibernate vai precisar dela pra fazer a conexão com o banco de dados da nossa aplicação. Por tanto adicione referência a ela também. Falando sobre o NHibernate,  vamos falar um pouco sobre sua configuração. Está feita no arquivo Web.Config, presente na aplicação web. O RSClass fez a configuração pra nós no momento que geramos o protótipo da aplicação. Dê uma olhada nesse arquivo. Adicionalmente existe a configuração da biblioteca de mapeamento. Fica como exercício, identificar no Web.Config essas configurações.

Finalmente defina a página “Index.apx” como a página inicial. Clique sobre o arquivo e selecione a opção “Set As Start Page“. Clique também sobre o projeto web e selecione a opção “Set As Startup Project“. Voce está pronto a executar a aplicação e pode fazer isso. Quando abrir, não se preocupe com login e senha. Essa tela inicial é simulação. Pode digitar qualquer valor nesses campos que vai aceitar. Agora navegue pelas páginas geradas e veja como o RSClass é poderoso. Faça algumas operações de inclusão, alteração e exclusão e verifique que tudo funciona. Volte às páginas no Visual Studio e analise o código ASP.NET e o código em C# correspondente. Entenda a estrutura dos códigos; os eventos, a estrutura das páginas, os componentes utilizados, etc.

É preciso ficar claro que o RSClass não vai nem tem a intensão de gerar a aplicação inteira. Ele apenas gerar uma estrutura mínima para que o programador começe a trabalhar. Aqui nós geramos um protótipo, mas a ferramenta pode gerar páginas individualmente com layout diversos. Além disso, o gerador tem alguns layouts que podem ser utilizados em lugar desse protótipo. Futuramente pretendo iniciar uma série de posts sobre o RSClass visando aprimorar o conhecimento dos interessados na ferramenta. A intenção é apresentar dados técnicos de como melhor utilizar a ferramenta.

Uma vez iniciada a aplicação, possivelmente haja a necessidade de criar novos métodos em nossa regra de negócio. Vamos agora ilustrar como deve ser realizada essa operação seguindo a arquitetura da solução. A seguir, ilustramos 3 metódos com formas diferentes de fazer seleção de dados. O primeiro faz uma seleção a partir de um método herdado da classe BaseDAO. O segundo foi construído utilizando a linguagem do Hibernate, a HQL. O terceiro faz uma seleção utilizando um outro recurso do NHibernate chamado Critéria. Sempre que for inserir código nos DAOs certamente voce irá utilizar um dos três caminhos. Note que os métodos apresentados só tem o papel de selecionar dados do banco. Não existe qualquer validação ou regra de negócio nesses métodos. Entendido isso, pode, então adicionar as linhas em UfDAO.cs, uma vez que os métodos são relacionados à classe Uf.

public Uf SelecionarPorSigla(string sigla)
{
return this.SelecionarPor(“Sigla”, sigla);
}
public IList<Uf> ListarPorDescricao(string descricao)
{
string hql = @”select uf from Uf uf
where uf.Descricao like :descricao
order by uf.Descricao”;
IQuery query = Get<ISession>().CreateQuery(hql);
query.SetAnsiString(“descricao”, descricao + “%”);
return query.List<Uf>();
}
public IList<Uf> ListarPorSigla(string sigla)
{
ICriteria crit = Get<ICriteria>()
.Add(Expression.InsensitiveLike(“Sigla”, sigla, MatchMode.Start))
.AddOrder(Order.Asc(“Descricao”));
return crit.List<Uf>();
}

Recaptulando, criamos 03 métodos DAO´s. Um com critéria, outro com HQL (Hibernate Query Language) e outro utilizando um método nativo da classe BaseDAO. Veja que o controle da sessão do Hibernate vem do Get<ISession>() e o critéria vem do Get<ICriteria>(). Ambos implementados no BaseDAO. Veja também que com a utilização da nossa bilbioteca a construção de métodos de acesso a dados com Hibernate é bem facilitada. Abra tambem a interface IUfDAO.cs e adicione as seguintes linhas:

Uf SelecionarPorSigla(string sigla);
IList<Uf> ListarPorDescricao(string descricao);
IList<Uf> ListarPorSigla(string sigla);

Qualquer novo método que for adicionado nos DAO´s deverá também adicionar a declaração na interface correspondente. Agora abra o UfBO.cs e adicione as seguintes linhas:

public Uf SelecionarPorSigla(string sigla)
{
if (sigla == string.Empty || sigla == null)
throw new ExceptionRS(“Necessário informa a sigla”);
return ufDAO.SelecionarPorSigla(sigla);
}
public IList<Uf> ListarPorDescricao(string descricao)
{
if (descricao == string.Empty || descricao == null)
throw new ExceptionRS(“Necessário informa a descricao”);
return ufDAO.ListarPorDescricao(descricao);
}

public IList<Uf> ListarPorSigla(string sigla)
{
if (sigla == string.Empty || sigla == null)
throw new ExceptionRS(“Necessário informa a sigla”);
return ufDAO.ListarPorSigla(sigla);
}

Na regra de negócio nos fazemos chamadas aos nóvos métodos do DAO. Adicionamos uma pequena regra que determina que os parêmetros de entrada não podem ser vazio ou nulos. Todas essas validações podem ser colocadas aqui. Eu diria que DEVEM. Mas há quem coloque apenas na página web através dos componentes ASP.NET de validações. Eu costumo validar os dados de entrada tanto na tela com os componentes de validação, quanto no objeto de négocio. Isso por que caso eu esqueça de validar na tela de entrada certamente no objeto de negócio, uma excessão será gerada. Um detalhe: nem os métodos criados no DAO precisam ser expostos como métodos no BO. Só se deve fazer isso quando algum método criado no DAO necessitar ser utilizado na camada de apresentação. Em algum momento, um metódo no DAO pode ser criado apenas pra se utilizado no BO. Então não há necessidade de expor o método no BO. Mas, claro se tiver que expor para camada de apresentação, cria-se o metódo no BO e adiciona as referências na Interface correspondente. Como fizemos no IUfDAO.cs, vamos fazer o mesmo com IUfBO.cs. Abra-o e adicione as seguintes linhas:

Uf SelecionarPorSigla(string sigla);
IList<Uf> ListarPorDescricao(string descricao);
IList<Uf> ListarPorSigla(string sigla);

No IUfBO já existe métodos declarados. São os métodos que podem ser chamados na camada de apresentação. Agora nós adicionamos mais 03 métodos para serem utilizados. Após estes procedimentos, os novos métodos já estão disponíveis para utilização na página. Fica como exercício: modificar a página para localizar dados por descrição. Dica: O RSClass possui outros layouts de página para serem gerados. Cada layout tem uma finalidade bem definida. Em posts futuros estaremos falando sobre esses recursos.

É possível modificar os arguivos gerados para que os DAO´s, BO´s e banco de dados possam rodar em um servidor de aplicação em uma arquitetura distribuida.  O servidor web e/ou outros programas desktop estariam executando em outras máquinas fazendo solicitações ao servidor que estaria executando as regras de negócio (servidor de aplicações). Mas isso é assunto de posts futuro.

Não esqueça de baixar o código fonte completo deste tutorial em  http://tutorialagendatelefonica.googlecode.com.

CONCLUSÃO

Desenvolver sistema é um trabalhoso. Mas este desgaste pode ser bem diminuido. Padrões de projetos, geradores de código, pesquisas e toda a engenharia de software podem ser aliados nessa tarefa de desenvolver bons programas.

Aproveito para indicar nossa área de Sistemas c/ Fontes. Adiquira um projeto completo para auxiliar no seu estudo e contribuir em nossas pesquisas.

Desde já agradeço a todos e até os próximos.

Older Entries

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.