domingo, 26 de maio de 2013

Cursor em SQL-Server (Números Primos)

Lembrando que um cursor deve ser usado somente quando não é possível resolver o que se necessita com apenas SELECT, Para o nosso exemplo de Cursor, utilizo números que estão em uma "Tabela" e quero saber quais deles são primos.


DECLARE @ID        INT
DECLARE @DESCRICAO VARCHAR(100)
DECLARE @DIVISOR   INT
DECLARE @PRIMO     BIT
--Declaração de um Cursor.
DECLARE CUR CURSOR FOR SELECT 1 ID,'Um'   DESCRICAO  UNION ALL
                       SELECT 2,   'Dois'            UNION ALL
                       SELECT 3,   'Tres'            UNION ALL
                       SELECT 4,   'Quatro'          UNION ALL
                       SELECT 5,   'Cinco'           UNION ALL
                       SELECT 6,   'Seis'            UNION ALL
                       SELECT 7,   'Sete' 
--Abrindo um Cursor para uso.
OPEN CUR
--Leitura da tupla do cursor dentro das variáveis
FETCH NEXT FROM CUR INTO @ID, @DESCRICAO
--Caso exista dados no Select do Cursor
WHILE @@FETCH_STATUS = 0
BEGIN  
    SET @PRIMO   = 1     --Número é primo
    SET @DIVISOR = @ID-1 
    WHILE @DIVISOR > 1
    BEGIN
       IF @ID % @DIVISOR = 0 
       BEGIN
          SET @PRIMO = 0 --Número não é primo
          BREAK
       END
       SET @DIVISOR = @DIVISOR -1
    END
    IF @PRIMO = 0 PRINT 'O número '+@DESCRICAO+' não é primo!'
    ELSE          PRINT 'O número '+@DESCRICAO+' é primo!'
    --Leitura da tupla do cursor dentro das variáveis
    FETCH NEXT FROM CUR INTO @ID, @DESCRICAO
END
--Fechando um cursor.
CLOSE CUR            
--Liberando o cursor da memória (obrigatório)
DEALLOCATE CUR                       

Resultado:

O número Um é primo!
O número Dois é primo!
O número Tres é primo!
O número Quatro não é primo!
O número Cinco é primo!
O número Seis não é primo!
O número Sete é primo!

sábado, 25 de maio de 2013

Preenchendo texto a direita com caracter

Neste exemplo vamos preencher um texto com algum caracter (*) a direita:

DECLARE @NUMBER VARCHAR(20)
DECLARE @COUNT  INTEGER

SET @NUMBER = 'Texto'
SET @COUNT  = 10

SELECT '1234567890' AS FORMATED UNION ALL
SELECT @NUMBER + REPLICATE('*',@COUNT - LEN(@NUMBER)) 

Resultado:

FORMATED
-----------
1234567890
Texto*****

Formatando Números com Zeros a Esquerda em SQL-Server

No exemplo abaixo vamos realizar uma formatação numérica com zeros a esquerda usando SQL-Server
Conforme a variável @COUNT informamos qual o tamanho do número:


DECLARE @NUMBER VARCHAR(20)
DECLARE @COUNT  INTEGER

SET @NUMBER = '1234'
SET @COUNT  = 8

SELECT REPLICATE('0',@COUNT - LEN(@NUMBER)) + @NUMBER AS FORMATED


Resultado:

Apenas Números em SQL-Server

Acontece de encontrarmos situações para:
>> Corrigir dados já persistidos por um sistema
>> Precisarmos validar um arquivo de carga para efetivarmos no banco de dados

Uma dessas validações é exatamente retirar dados não numéricos de um texto, segue um código para deixar apenas números a partir de um texto:


DECLARE @TEXTO VARCHAR(MAX)
SET @TEXTO = 'abc123dc4fda$%#'

DECLARE @INDEX SMALLINT
SET @INDEX = PATINDEX('%[^0-9]%', @TEXTO)
WHILE @INDEX > 0
BEGIN
   SET @TEXTO = STUFF(@TEXTO, @INDEX, 1, '')
   SET @INDEX = PATINDEX('%[^0-9]%', @TEXTO)
END
SELECT @TEXTO AS NUMERO

Resultado:

Trabalhando com Datas (Listagem de Meses para uma caixa de seleção)

Usando SQL-Server, segue código que nos retornará uma listagem dos Meses


SET LANGUAGE 'Brazilian'
DECLARE @MESES TABLE (ID VARCHAR(2), MES VARCHAR(10))
DECLARE @NUM INT
SET @NUM = 0
WHILE @NUM < 12 
BEGIN
   INSERT INTO @MESES
   SELECT REPLICATE('0',2-LEN(CAST(@NUM+1 AS VARCHAR(2))))+
          CONVERT(VARCHAR,@NUM+1)
         ,DATENAME(MONTH,DATEADD(MONTH, @NUM, 0))
   SET @NUM = @NUM + 1
END

SELECT * FROM @MESES


Resultado

quarta-feira, 1 de maio de 2013

Usando AJAX com ASP - [ComboBox | DropDownList | Select ]

Em ASP (Active Server Pages) o uso do AJAX (Asynchronous JavaScript e XML) serve para realizarmos processamentos em paralelo em outra página ASP, ou seja, a partir de uma página ASP usando AJAX iniciar um processamento de outra pagina ASP na qual o resultado é redirecionado para página chamadora.

Vemos na imagem abaixo:

Para o uso do AJAX que é um JavaScript Assíncrono, devemos utilizar um objeto JavaScript chamado XMLHttpRequest;
Temos no trecho de código abaixo que o JavaScript irá realizar [ xmlhttp.send(); ] uma requisição usando Assíncrona com POST de um processamento que ocorrerá na página "Processa.asp" [ xmlhttp.open("POST","Processa.asp",true); ].
Ao término do processamento [ xmlhttp.onreadystatechange...com...(xmlhttp.readyState==4 && xmlhttp.status==200) ]é recomentado realizar alguma ação com base no resultado [ xmlhttp.responseText ] do processamento.


var xmlhttp;
//Criando o Objeto AJAX
if (window.XMLHttpRequest){
    //IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
}else{
    // code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

//Quando terminar o processamento
var resultado = "";
xmlhttp.onreadystatechange = function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        resultado = xmlhttp.responseText;
    }
};

//Chamada do processamento Assíncrono
xmlhttp.open("POST","Processa.asp",true);
xmlhttp.send();

Antes de realizarmos o carregamento de uma combo precisamos saber o que escrever de código na nossa página Processa.asp de modo que a variável resultado contenha alguma informação;
A resposta é simples: Tudo que for escrito através de [ Response.write ];

Neste exemplo temos no html do asp a seguinte estrutura:


    Estados do Sul do Brasil: <select id='selUFSul' name='selUFSul'></select>

E em nossa página ASP Processa.asp o seguinte trecho

    //Pagina Processa.asp
    Reponse.Write "<option value=PR>Paraná</option>" 
    Reponse.Write "<option value=SC>Santa Catarina</option>" 
    Reponse.Write "<option value=RS>Rio Grande do Sul</option>" 
Em resumo quando AJAX chama a pagina Processa.asp, tudo que é armazenado em memória do buffer (Response.Write) é capturado por xmlhttp.responseText onde esse dado pode ser uma estrutura html podendo o programador popular com combo select conforme codigo abaixo:

xmlhttp.onreadystatechange = function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        resultado = xmlhttp.responseText;
        documento.getElementById('selUFSul').innerHTML = resultado;
    }
Enfim teremos a combo populada.