quarta-feira, 17 de agosto de 2011

Redirecionamento com Javascript


                Quando trabalhamos com scripts do lado do servidor (como ASP, JSP e PHP) é muito fácil fazer o redirecionamento, mas quando temos apenas HTML podemos utilizar o Javascript para fazer o redirecionamento, abaixo segue o exemplo:
<html>
    <head>
        <title>Teste de Redirecionamento</title>
    </head>
    <body onload='javascript:window.location="http://www.facebook.com/pages/Tudo-que-%C3%A9-interessante/153714048015357"'>
    </body>
</html>
                Faço uso do evento onload dentro da tag BODY (este evento ocorre antes de carregar a pagina), dentro do evento eu desvio para o endereço que eu quero com a função window.location.

sexta-feira, 17 de junho de 2011

Combo Box no WPF – Propriedades DisplayMemberPath e SelectedValuePath

                Muitas vezes queremos fazer um combo box onde mostraremos para o usuário um valor, mas internamente queremos utilizar outro. O combo box do WPF oferece uma forma muito fácil de fazer isso usando duas propriedades DisplayMemberPath e o SelectedValuePath.
                Abaixo segue o trecho do XAML do combo box, este combo box vai retornar o nome de alguns fabricantes:

<combobox displaymemberpath="ds_Fabricante" height="24" isenabled="True" itemssource="{Binding}" margin="92,0,66,200" name="cbFabricante" selectedvaluepath="cd_Id" selectionchanged="cbFabricante_SelectionChanged_1" verticalalignment="Bottom">
</combobox>
                Destaco as propriedades ItemsSource, onde coloquei o valor {Binding}, isso para que eu possa colocar dentro do código a chamada para a procedure que vai carregar este combo box, na propriedade DisplayMemberPath eu coloco o nome do campo que eu quero que apareça para o usuário(no caso o nome do fabricante do equipamento – ds_Fabricante) e na propriedade SelectedValuePath eu coloco o nome do campo que eu quero utilizar dentro do meu programa(cd_Id é o código do fabricante na tabela).
                Agora segue o código que coloquei para alimentar o combo box:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
  using (SqlConnection conexao = new SqlConnection(@"String de Conexão com o Banco de dados"))
  {
    DataSet ds = new DataSet();
    SqlCommand cmd = new SqlCommand("exec pro_getFabricante", conexao);
    SqlDataAdapter sqlDA = new SqlDataAdapter(cmd);
    sqlDA.Fill(ds);
    cbFabricante.DataContext = ds.Tables[0].DefaultView;
    }
  }

                Está procedure está sendo executada no evento Loaded do formulário, no SqlCommand repare que eu executo uma procedure que está no banco de dados, está procedure pode ser substituída por um select e depois, na ultima linha, preencho o DataContext do combo box com o retorno da procedure. Segue a imagem de como fica o combo box:



                Para pegar o valor selecionado no combo box segue o código que foi configurado no evento SelectionChanged (este evento ocorre sempre que o valor do combobox for alterado)  e a imagem do alerta exibido:
private void cbFabricante_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
  MessageBox.Show("Código selecionado: " + cbFabricante.SelectedValue); 
}


Referencias:
Documentação da Microsoft (ComboClass)
Stackoverflow -Binding WPF ComboBox to a Custom List
C# Corner - WPF ComboBox
Macoratti - WPF - Preenchendo uma Combobox

sexta-feira, 18 de março de 2011

Usando as API's do Android para Pegar a Latitude e Longitude

        Para acessar o GPS nas API’s do Android precisamos utilizar duas classes :
                    LocationManager;
                    Location.
        Segue abaixo um exemplo de uso das classes:
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
   double lat = location.getLatitude();
   double lon = location.getLongitude();
}
else 
    Toast.makeText(MainActivity.this, "Sem Latitude e longitude !", Toast.LENGTH_SHORT).show();

        A latitude e longitude retornada pelos métodos getLongitude() e getLatitude() estão em graus decimais, este objeto (location) tem varios métodos para trazer dados do GPS, como getSpeed() para trazer a velocidade.
        Insira no arquivo de configuração do seu aplicativo(AndroidManifest.xml) a autorização para acessar o GPS com a seguinte linha:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
</uses-permission>

Referências:
Documentação da classe Location
Documentação da classe LocationManager
Exemplo de uso dessas classes

sexta-feira, 4 de março de 2011

Mensagem de Alerta no Android

         É comum nas API’s de desenvolvimento uma forma de dar alertas para o usuário, com a API de desenvolvimento do Android não é diferente, foi criado a classe Toast  (a tradução seria brinde).
         Ela possui um método estático chamado makeTest onde definimos a mensagem, o contexto onde ela vai aparecer (normalmente a janela que o usuário está) e o tempo que a mensagem vai ficar na tela. Segue a definição da função :
public static Toast makeText (Context context, CharSequence text, int duration)
 

         Para definir o tempo de exibição da janela na tela, a classe Toast tem duas constantes :
   
                 Toast.LENGTH_LONG – Tempo longo de exibição;
                 Toast. LENGTH_SHORT – Tempo curto de exibição.

         Após definir a mensagem é só chamar o método show(), segue a definição :
public void show ()

        Segue um exemplo para chamar a função e a tela exibida :

Toast.makeText(MainActivity.this, "É obrigatório o preenchimento da UF !", Toast.LENGTH_LONG).show();
 






Referência:
Documentação oficial da classe Toast
Tutorial para iniciar o desenvolvimento na plataforma Android



segunda-feira, 29 de novembro de 2010

Usando RadioGroup no Android

                Neste artigo vou demonstrar como recuperar um valor selecionado, selecionar um valor e algumas propriedades do RadioGroup.
                Para demonstrar o uso do RadioGroup vamos usar como exemplo um campo muito comum em aplicações de cadastro, o Estado Civil. Este campo pode ter os seguintes valores solteiro(a), casado(a), separado(a), divorciado(a) e  viúvo(a), abaixo segue o exemplo da tela e o bloco do arquivo de layout.

<radiogroup android:id="@+id/rgEstadoCivil" android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="vertical">
    <radiobutton android:checked="true" android:id="@+id/rbSolteiro" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Solteiro(a)">
    </radiobutton>
    <radiobutton android:id="@+id/rbCasado" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Casado(a)">
    </radiobutton>
    <radiobutton android:id="@+id/rbSeparado" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Separado(a)">
    </radiobutton>
    <radiobutton android:id="@+id/rbDivorciado" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Divorciado(a)">
    </radiobutton>
    <radiobutton android:id="@+id/rbViuvo" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Viúvo(a)">
    </radiobutton>
</radiogroup>
                O que vale destacar aqui são as propriedades do RadioGroup, android:id="@+id/rgEstadoCivil" e android:orientation="vertical" onde :
                               android:id : é a identificação do componente dentro do nosso programa, @+id é a classe que os componentes ficarão agrupados, depois da /(barra) vem o nome do componente,  que no nosso caso é rgEstadoCivil (mas abaixo irei mostrar no que este atributo se transforma). É importante lembrar que este nome deve ser único;
                               android:orientation: é a orientação dos radiobuttons, ela pode ter dois valores “vertical” ou “horizontal”.
                Outro ponto a ser observado é que todos os radiobutton devem estar dentro da tag RadioGroup, isto é fundamental para que dentro do nosso programa possamos identificar quem foi selecionado e para o próprio sistema controlar qual radiobutton vai estar selecionado, ou seja, quando o usuário clicar em um ele desmarca o outro.
                Dos RadiosButtons vamos destacar as propriedades android:id="@+id/rbSolteiro", android:text="Solteiro(a)" e android:checked="true":
                               android:id: é a mesma coisa do RadioGroup, alias funciona igual para qualquer componente;
                               android:text: é o texto que vai identificar o radiobutton (texto do lado da bolinha);
                               android:checked: para selecionar o radiobutton, está propriedade somente aceita os valores "true" e "false", lembrando que apenas um radiobutton pode estar como true e o valor default é false (essa propriedade na verdade só precisa ser definida para o radiobutton que vai iniciar selecionado, que neste caso foi o primeiro, solteiro).
                Agora vamos ver como fazer para verificar o radiobutton selecionado, mas antes vamos olhar o trecho gerado no arquivo R.java do nosso radiogroup e dos radiosbuttons :
public final class  R {
   //...  
   public static final class id {
       public static final int rbCasado=0x7f05002d;
       public static final int rbDivorciado=0x7f05002f;
       public static final int rbSeparado=0x7f05002e;   
       public static final int rbSolteiro=0x7f05002c;
       public static final int rbViuvo=0x7f050030;
       public static final int rgEstadoCivil=0x7f05002b;
   }
   //...
}
                Repare que foi criado uma classe chamada R e dentro dela outra chamada id (lembre-se da propriedade android:id onde colocamos o @+id, serve para criar esta classe, não é obrigatório o uso do id, pode ser qualquer nome), dentro dela temos as constantes com os nomes atribuídos no arquivo de layout para o radiogroup e os radiosbuttons com valores em hexa decimal. Este arquivo é gerado para facilitar nosso desenvolvimento, ao invés de usarmos este numero vamos utilizar os componentes através das constantes. Abaixo segue o código para verificar qual é o radiobutton selecionado:
                              
RadioGroup rgEstadoCivil = (RadioGroup) findViewById(R.id.rgEstadoCivil);
switch (rgEstadoCivil.getCheckedRadioButtonId()) {
    case R.id.rbSolteiro:
        Toast.makeText(MainActivity.this, "Solteiro selecionado !", Toast.LENGTH_SHORT).show();
        break;
    case R.id.rbCasado:
        Toast.makeText(MainActivity.this, "Casado selecionado !", Toast.LENGTH_SHORT).show();
        break;
    case R.id.rbSeparado:
        Toast.makeText(MainActivity.this, "Separado selecionado !", Toast.LENGTH_SHORT).show();
        break;
    case R.id.rbDivorciado:
        Toast.makeText(MainActivity.this, "Divorciado selecionado !", Toast.LENGTH_SHORT).show();
        break;
    case R.id.rbViuvo:
        Toast.makeText(MainActivity.this, "Viúvo selecionado !", Toast.LENGTH_SHORT).show();
        break;
}
           
                A primeira função que vamos destacar é o findViewById. Este comando serve para localizar o componente e retornar o objeto que foi atribuído a ele, no nosso caso um checkbox.
                Depois usamos o método getCheckedRadioButtonId(), este método retorna o id do radiobutton selecionado, onde podemos fazer a comparação com as constantes geradas no arquivo R.java, conforme o exemplo demonstra. Também podemos recuperar o componente radiobutton com a função findViewById (igual fizemos com o radiogroup, se precisar fazer alguma alteração especifica). O objeto Toast  e a função makeText serve para dar um alerta para o usuário, farei um artigo a respeito dessa classe em breve.          
                Agora vamos deixar um radiobutton selecionado abaixo segue o código :
rgEstadoCivil.check(R.id.rbSolteiro);
                Aqui a única função é a check, onde você passa a identificação do radiobutton, ele vai marcar o que você passou e deixar o restante desmarcado.

Referências:

quinta-feira, 28 de outubro de 2010

Função para Calcular a Distancia entre Duas Coordenadas no SQL Server (Transact-SQL)

                Em sistemas de logística temos sempre que calcular a distancia entre pontos e geralmente temos tabelas com endereço dos pontos ou as coordenadas do endereço, sempre que temos que saber a distancia usamos ferramentas de roteirização para calcular o trajeto e informar a distancia. Esse tipo de solução pode ter um custo alto de processamento, velocidade e financeiro já que algumas ferramentas cobram por acesso a sua base.
                Para evitar custos desnecessários podemos fazer este calculo no banco de dados, ao invés de usar a ferramenta de roteirização. A vantagem de usar esta abordagem é que mais rápido, podemos usar o comando order by (sem precisar recorrer a código para ordenar pelo mais próximo ou mais distante) e não tem custo, porem poderemos ter problemas se os pontos estiverem muito próximos já que o calculo será feito em linha reta sem levar em consideração o trajeto.
                Primeiro vamos criar a função para calcular a distancia entre dois pares de coordenadas, estes pares devem estar em graus decimais. Esta função é a mesma que eu criei no artigo Função em Delphi para Calcular a Distância Entre Dois Pares de Coordenadas (Latitude e Longitude) convertida nas funções do Transact-SQL.
                Segue o script para criar a função:
-- =============================================
-- Author:        Wagner Carmo da Silva
-- Create date:   20/10/2010 17:24
-- Description:   Calcula a distância em quilometros
-- =============================================
CREATE FUNCTION [fun_CalcDistancia] 
(
     @latIni float, -- Latitude do ponto inicial
     @lonIni float, -- Longitude do ponto inicial
     @latFim float,-- Latitude do ponto final
     @lonFim float -- Longitude do ponto final
)
RETURNS float
AS
BEGIN
     DECLARE @Result AS FLOAT
     DECLARE @arcoA AS FLOAT
     DECLARE @arcoB AS FLOAT
     DECLARE @arcoC AS FLOAT
     DECLARE @auxPI AS FLOAT

     SET @auxPi = Pi() / 180
     SET @arcoA = (@lonFim - @lonIni) * @auxPi
     SET @arcoB = (90 - @latFim) * @auxPi
     SET @arcoC = (90 - @latIni) * @auxPi
     SET @Result = Cos(@arcoB) * Cos(@arcoC) + Sin(@arcoB) * Sin(@arcoC) * Cos(@arcoA)
     SET @Result = (40030 * ((180 / Pi()) * Acos(@Result))) /360

     RETURN Round(@Result,2)
END
                Esta função retorna o valor em quilômetros arredondando duas casas, se precisar aumentar a precisão do calculo basta alterar este trecho do código RETURN Round(@Result,2) , número 2 é a quantidade de casas decimais depois da virgula basta aumentar este número para aumentar as casas, se quiser deixar com precisão total basta remover a função round (RETURN @Result).
                Agora vou mostrar um select que mostra uso dessa função :

SELECT
     cd_Empresa,
     nr_Latitude,
     nr_Longitude,
     fun_CalcDistancia(-23.479483, -46.749340, nr_Latitude, nr_Longitude) AS nr_Distancia
FROM tbl_Empresas
ORDER BY fun_CalcDistancia(-23.479483, -46.749340, nr_Latitude, nr_Latitude)

                Repare que eu usei a função até mesmo para ordenar o resultado, neste caso ele traz o mais próximo, para inverter isto basta usar o desc depois do order by.
                Importante é não esquecer que o calculo é em linha reta, isso deve ser usado quando os pontos tem uma boa distancia, ou seja, o caminho não vai interferir muito na distancia do ponto.

Referências:

terça-feira, 19 de outubro de 2010

Função Para Converter Graus Decimais em Graus Minutos e Segundos no Javascript

                Quem trabalha com mapas vive precisando fazer conversões de coordenadas, com o crescimento das ferramentas de mapas para Web essas conversões devem ser feitas no Javascript, abaixo segue a função que eu desenvolvi para exibir as coordenadas que a ferramenta de mapa retorna em graus para exibir em graus minutos e segundos:
function showCoordenadasMinutos(gDec, x) {
    var graus;
    var minutos;
    var aux;
    var segundos;
    var milisegundos;
    var direcao;

    // Separa os graus
    graus = parseInt(gDec);

    // Pega a fração dos graus e converte em minutos
    aux = (graus - gDec) * 60;
    minutos = parseInt(aux);

    // Pega a fração dos minutos e converte em segundos
    aux = (aux - minutos) * 60;
    segundos = parseInt(aux);

    // Pega a fração dos segundos e converte em milisegundos
    milisegundos = parseInt((aux - segundos) * 60);

    // Essa parte eu verifico se é o eixo X ou Y para substituir o simbolo de negativo  pelas iniciais de norte ou sul para o eixo Y, leste ou oeste para o eixo X
    if (x) {
        // Eixo X
        if (graus < 0)
            direcao = "O";
        else
            direcao = "L";
    } else {
        // Eixo Y
        if (graus < 0)
            direcao = "S";
        else
            direcao = "N";
    }
    // Devolvo a string formatada, a função Math.abs é para retornar o valor absoluto // (retirar o valor negativo) já que estou usando a notação norte, sul, leste ou oeste
    return Math.abs(graus) + "° " + minutos + "' " + segundos + "." + milisegundos + "'' " + direcao;
}

Como eu precisava criar uma função para exibir os dados para o usuário eu substitui o valor negativo pelas inicias dos pontos cardeais e coloquei as aspas simples, se quiser deixar no padrão NMEA basta juntar o grau o minuto colocar o ponto e juntar o segundo e o milissegundos.
Se quiser usar esta função para retornar um valor de ponto flutuante no padrão NMEA substitua o retorno da função pelo debaixo :

return ((graus * 100) + minutos) + (((segundos * 100) + milisegundos) / 10000);
 

E remova o parâmetro x da função e o trecho de código que verifica qual é a direção da coordenada.