Nesse exemplo criaremos um Todo List de maneira simples, principalmente para os que ainda nao esta muito familiarizado com o AngularJS.Para o nosso exemplo criaremos os arquivos index.html onde ira conter nosso codigo HTML, conforme e imagem abaixo.Nossa tela tera um contador de lembretes ao topo e um link para remover os lembretes ja finalizados, ao clicar no check-box o item ficara como concluido.Criaremos agora o app.js com nosso codigo Angular/JavaScript que ira conter as principais funcoes para carregar, adicionar e Limpar nosso Todo List.Vamos comecar com o codigo HTML criando nosso index.html:<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script> <script src="app.js"></script> <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.0.4/css/bootstrap-combined.min.css"> <style> .concluida-true { text-decoration: line-through; color: grey; } </style> </head> <!--Vinculando nosso HTML com o nosso angular app.js --> <body ng-app="mainApp"> <h2>Todo List</h2> <!--Vinculando ao nosso controller mainController --> <div ng-controller="mainController"> <!-- Exibe o contador de lembretes --> <span>{{lembretes()}} de {{todos.length}} lembretes</span> <!--Link para remover os items ja finalizados --> [ <a href="" ng-click="removeConcluidas()">Remover Finalizadas</a> ] <ul class="unstyled"> <!-- ng-repeat e um especie de For do angular para exibir a lista de Todos --> <li ng-repeat="todo in todos"> <label class="checkbox"> <input type="checkbox" ng-model="todo.concluida"> <span class="concluida-{{todo.concluida}}">{{todo.texto}}</span> </label> </li> </ul> <!-- Form para adicionar um novo, ao clicar no botao Adicionar sera chamado o adicionar() --> <form ng-submit="adicionar()"> <input type="text" ng-model="novoTexto" size="30" placeholder="Nova"> <input class="btn-primary" type="submit" value="Adicionar"> </form> </div> </body></html>E agora nosso app.js:angular.module('mainApp', []) .controller('mainController', function ($scope) { //Insere uns itens iniciais $scope.todos = [{ texto: 'Aprender Angular', concluida: true }, { texto: 'Estudar Ingles', concluida: false }]; //Adicionando uma nova Todo $scope.adicionar = function () { //Adiciona o item na variavel Todos $scope.todos.push({ texto: $scope.novoTexto, concluida: false }); //Limpa o campo apos adicionar $scope.novoTexto = ''; }; //Contador de lembretes $scope.lembretes = function () { var total = 0; angular.forEach($scope.todos, function (todo) { total += todo.concluida ? 0 : 1; }); return total; }; //Remover os itens ja concluidos $scope.removeConcluidas = function () { //Adiciona em uma nova variavel a lista de todos var antigas = $scope.todos; //Zera a variavel "todos" $scope.todos = []; //For para remover as que ja foram Concluidas angular.forEach(antigas, function (todo) { //Devolve na variavel "todos" os que nao foram concluidas if (!todo.concluida) $scope.todos.push(todo); }); }; });Como o codigo esta todo documentado, irei dispensar meus comentarios.Voce pode fazer o download do codigo aquiAte a proxima. O NVL2 do Oracle e uma extensao do NVL, bem simples de utilizar e bastante util em nosso dia-a-dia, neste post eu mostro como podera ser utilizado da melhor maneira.Algum tempo atras mencionei aqui no blog o uso do NVL no Oracle, usando NVL no Oracle, hoje vou apresentar uma extensao do NVL, o NVL2, sua sintaxe e parecida com o NVL, mas com uma diferenca, ele ira verificar se o valor e diferente de nulo, vamos aos exemplo:Sintaxe:NVL2(string, valor_se_nao_nulo, valor_se_nulo)No exemplo abaixo estamos validando se o campo CPF do cliente esta nulo, se nao estiver sera apresentado o CPF, caso esteja nulo sera apresentado o CNPJ:SELECT NVL2(CPF, CPF, CNPJ) CPF_CNPJ, Nome, CPF, CNPJ FROM CLIENTE;O resultado sera: CPF_CNPJ Nome CPF CNPJ 636.387.495-50 Cliente1 636.387.495-51 null 82.742.532/0001-69 Cliente2 null 82.742.532/0001-71 638.249.114-42 Cliente3 638.249.114-43