terça-feira, 30 de setembro de 2008

O DELPHI é um POETA.!

Erros inusitados que você nunca viu por ai... rsrs



É gurizada no primeiro post, não saiu artigo por causa disso ai oh ...rsrsrs

segunda-feira, 29 de setembro de 2008

Artigo Nº 14: Performance em consultas com Stored Procedures

Diante das necessidades de alta performance em aplicações WEB, um elemento que auxilia neste processo são as Stores Procedures(SP), procedimentos executados diretamente pelo BD, diminuindo significativamente o tempo para manipulação dos dados.
Veremos um exemplo de utilização de cursores no Banco Firebird, cursores são normalmente utilizados para retornar mais de um registro em uma SP, entre outras funcionalidades.
Criando nossa Stored Procedure:
CREATE PROCEDURE SP_CLIENTES (
cep integer)
returns (
nome varchar(100),
endereco varchar(100))
as
begin
for select clientes.nome,clientes.endereco from clientes
where clientes.cep = :cep
into :nome, :endereco do

suspend;

end^


O uso do for/selec/do caracteriza o uso do cursor.

Após criada nossa SP, para chamá-la basta realizarmos um simples select passando o parâmetro:
select * from sp_clientes(98910000)
Para consultas pesadas no BD, as SPs são uma ótima alternativa para aumentar a performance.

Abraço e até a próxima.



PS: O post mais comentado do blog foi simplesmente excluído pelo nosso administrador...

PS2: Tudo bem, a gente sabe que o blog não trata desse assunto, foi mesmo só pra tirar um pouco com o Azuis..., faz parte tb...

Artigo Nº 13: Carregar Lista de Dados em C#

Bom, estou voltando com um artigo sobre gridview com DataSet em C#. Como já foi dito no décimo artigo que fala sobre performance comparando DataReader e DataSet, o DataSet se torna mais lucrativo quando se trata de performance. Bom, começando temos primeiramente que configurar uma conexão com o banco de dados, iremos usar o banco de dados SQLServer conectando através do driver de conexão com o Odbc.

Cria-se uma nova classe com o nome de BancoDados e dentro desta um objeto de conexão Odbc ficando assim.

public OdbcConnection sCon;
sCon = new OdbcConnection("Driver={SQL Native Client}; Server=crack\\sqlexpress; Database=prop; Uid=sa; Pwd=123456;");

Onde dentro dos parenteses seria a string de conexão no caso com SQL Server. Criado este objeto vamos criar duas funções, uma para abrir a conexão com o banco e outra para fechar a conexão com o banco. Vamos lá então. A primeira:

// Publica para ser chamada de qualquer lugar e VOID por que não retorna nada
public void Conecta()
{
try // Tratamento de Erros
{

if (sCon.State == 0)
// Se fechada a conexão, abre ela
{
sCon.Open(); // Abre a conexão
}
}
catch (Exception e)
{
throw new Exception("Não Conectou: " + e.Message);
}
}

Pois então esta feito a primeira agora a segunda:
// Já foi explicado antes o por que do public e do void
public void Desconecta()
{
try
{
sCon.Close(); // Fecha a conexão

}

catch (Exception e)

{

t
hrow new Exception("Erro: " + e.Message);
}
}

Bom, nossa primeira classe está pronta, agora vamos para a classe que retornará dados do banco de dados para uma GridView. Cria-se uma nova classe com o nome de usuarios. Nesta vamos criar uma function apenas.

// Publica e retorna um DataSet.
public DataSet Usuarios()
{

Bom, nossa primeira classe está pronta, agora vamos para a classe que retornará dados do banco de dados para uma GridView. Cria-se uma nova classe com o nome de usuarios. Nesta vamos criar uma function apenas.

// Publica e retorna um DataSet.

Muito bom, criamos as 2 classes que vamos utilizar. Cria-se uma nova página .aspx para que assim possamos buscar os dados com a nossa classe. Adicione nesta página aspx uma gridview e nomeie ela como desejar, aqui usaremos GVUsuarios como nome dela. Agora vamos no evento OnLoad da página aspx e lá vamos chamar a nossa classe.

// Define novamente uma variável para uma classe
usuarios User = new usuarios();
// Agora diz que o DataSource da GridView é o nosso DataSet
GVUsuarios.DataSource = User.Usuarios();
// Atualiza a tabela
GVUsuarios.DataBind();

Agora abaixo vocês podem ver o resultado final, mas é claro que vocês devem definir os campos que vocês querem trazer na GridView

Teclas de Atalho Delphi

F5: Adiciona um break-point na linha selecionada

Ctrl+F7: Executa a opção de debug Evaluate/Modify para verificar o conteúdo da variável selecionada em tempo de debug.

Ctrl+F5: Adiciona um Watch para a variável selecionada em tempo de debug.

Ctrl+Shift+F11: Chama as opções do projeto.

Ctrl+Shift+I: Indentar multiplas linhas de código de uma única vez em "n" espaços (conforme o que estiver especificado em Tools/Editor Options/General/Block Indent).

Ctrl+Shift+U
: Recuar indentação em "n" espaços (ídem acima).

Ctrl+Shift+0 a 9: Inserir um Bookmark no editor de código.

Ctrl+: troque n pelo número do Bookmark.

Ctrl+Shift+0: para desmarcar um Bookmark.

Alt+G: Ir para uma determinada linha.

Ctrl+Shift+Seta (cima/baixo): Intercala entre o cabeçalho da procedure/função e a implementação da mesma.

Ctrl+Shift+C: Complementacao de Classes.

Ctrl+Shift+Up: Vai para a seção interface.

Ctrl+Shift+Down: Vai para a seção implementation.

Ctrl+Mouse: Clique com o botão esquerdo do mouse mantendo pressionada a tecla Ctrl sobre a chamada a uma procedure/function/variável para localizá-la na unit atual ou em outra unit.

Ctrl+J (Code Templates): Exibi templates de códigos.

Ctrl+Shift+J (Delphi 2006): Executar o SyncEdit para alterar variáveis com mesmo nome de uma só vez após a seleção de um bloco de código.

Ctrl+O+U: Alterna a caixa (maiúscula/minúscula) do código selecionado.

Ctrl+K+E: Converter o código selecionado para minúsculas.

Ctrl+K+F: Converter o código selecionado para maiúsculas.

Ctrl+E: Ativa a busca incremental. Sem a necessidade de teclar (Ctrl+F).

Ctrl+Shift+Setas: Mover o(s) componente(s) selecionado(s) rapidamente no form.

Ctrl+Setas: Move o componente pixel a pixel.

Shift+Setas: Redimensiona o componente pixel a pixel.

Ctrl+Alt+P
(Delphi 2006...): Seleciona a Paleta de Ferramentas possibilitando a filtragem dos componentes ao se digitar seus nomes.

Ctrl+Shift+E (Delphi 2006...): Executa o Refactoring de modificação de nomes de variáveis, procedures/functions e propriedades.

Ctrl+Shift+A
(Delphi 2006...): Executa o Refactoring Find Unit, que localiza as units onde as variáveis são declaradas e as coloca na seção uses automaticamente.

Ctrl+Shift+V (Delphi 2006...): Refactoring de declaração de variável, pressiona-se este atalho para declará-la localmente.

Ctrl+Shift+D (Delphi 2006...): Refactoring de declaração de atributo, pressiona-se este atalho para declará-lo na classe.

Ctrl+Shift+F9
(Delphi 2006...): Executa a aplicação sem a opção de depuração (Debug). A execução fica mais rápida.

Referências: Imasters, Marlos Waquim

sexta-feira, 26 de setembro de 2008

Artigo Nº 12: JavaScript Limitador e Contador de Caracteres

Bem, neste artigo mostraremos como aplicar um contador e limitador de caracteres para o componente TextBox, onde a cada caractere digitado irá informar quantos ainda faltam para atingir o limite e depois que atingido não permite digitar mais.

Montando o layout

Com a sua aplicação já criada, coloque um TextBox e logo abaixo coloque a seguinte frase:
Faltam ainda 99 caracteres.

Depois vá para o código .aspx da sua página, e procure o número da frase acima (esse número pode ser quanto a sua necessidade) e o substitua pelo seguinte código HTML:

99
É nessa tag span é que vai mostrar o número de caracteres que faltam.

Aproveitando, dentro da tag do componente TextBox, coloque o código HTML abaixo, o evento onkeyup, evento acionado depois que clicar e voltar qualquer tecla do teclado.

onkeyup="LimitarCaracter(TextBox1, ContaCaractere,'99');"
Então, quando soltar qualquer tecla, será acionado o evento e executará a função “LimitarCaracter”, passando alguns parâmetros, como por exemplo: “TextBox1” id do TextBox, “ContaCaractere” id do SPAN e “99”, número máximo de caracteres e esse número tenque ser o mesmo a do SPAN.

Caso seja necessário colocar a mesma função em outro evento, sinta-se a vontade. Ex.: onmousemove, evento quando passar o mouse sobre o TextBox.

Veja a figura 01 como que fica o código .aspx.

Figura 01: Codigo .aspx


Escrevendo a Função

Agora vamos criar a função JavaScript, para contar e limitar os caracteres. Abra o bloco de notas e salve dentro do diretório do projeto com o nome de Funcoes.js, arquivo responsável por armazenar todas as funções JavaScript do seu projeto. É uma maneira de deixar seus códigos mais organizados.

Feito isso, copie a função abaixo e salve:

function LimitarCaracter(idCampo, idContador, TamMax)
{
Caracteres = TamMax - document.getElementById(idCampo).value.length;
document.getElementById(idContador).innerHTML = Caracteres;
if(document.getElementById(idCampo).value.length >= TamMax)
{
document.getElementById(idCampo).value = document.getElementById(idCampo).value.substring(0, TamMax);
document.getElementById(idContador).innerHTML = "0";
}
}
Na linha 1, é declarado a função com o mesmo nome que foi definido no evento do TextBox, com as respectivas variáveis.

Linha 3 , aplica na variável, a subtração do número máximo pela quantidade de caracteres que já possui no TextBox, resultando no número de caracteres que ainda faltam para chegar no máximo.

Linha 4, escrever na tag SPAN, o resultado.

Linha 5, verifica se número de caracteres que já tem no TextBox é maior ou igual ao número máximo permitido.

Se for verdadeira a condição, na linha 7, escreve no TextBox somente os caracteres que não ultrapassam o número máximo, caso passa da quantidade, apaga-se todos os caracteres a partir desse. E na linha 8, escreve na tag SPAN, o número zero.

Agora vá novamente no código .aspx da sua página e dentro da tag , localizada no início do código, coloque o script abaixo, responsável por linka a página com o arquivo das funções.

Feito tudo isso, compilando o resultado é de acordo com a figura 2.

Figura 02: Resultado


Caso tenha mais de um TextBox por página para realizar esse procedimento, faça tudo da mesma maneira, mas só substitui o id do TextBox e do SPAN, por outro qualquer e coloque-os na função do evento.

Ex:
onkeyup="LimitarCaracter(TextBox2, ContaCaractere2,'999');"
Um abraço e até o próximo post. Obrigado.

quarta-feira, 24 de setembro de 2008

Delphi Tour em Porto Alegre

A Borland Latin America, distribuidora exclusiva da Embarcadero para a linha CodeGear no Brasil, realizou na terça-feira, 23, em Porto Alegre, o Delphi Tour.
O evento aconteceu na PUC-RS, das 9h às 12h45, contando com a presença do Sr. Andreano Lanusse (CodeGear/Embarcadero Evangelist Leader for Latin America), que vive atualmente na California USA e é responsável pela ferramenta de desenvolvimento de sistemas Delphi em toda a América Latina.

Andreano Lanusse, Fauzi Shubeita e Eu(Edinei Steffen)

O evento foi voltado a desenvolvedores de software, arquitetos de sistemas, líderes de projetos de software e gerentes de desenvolvimento, onde tiveram a oportunidade de conhecer os novos recursos do Delphi 2009, tais como: globalização de aplicações, criação de interfaces ricas para desktop, escalabilidade de aplicações e muito mais.

Entre as novas funcionalidades da ferramenta de desenvolvimento, o Delphi 2009 traz diversos avanços na VCL (Visual Component Library, ou Biblioteca de Componentes Visuais), permitindo a criação de aplicações com interface Ribbon (Recursos presentes no Office 2007), suporte a UNICODE (suporte a código de padrão mundial) e tradução de aplicações. Além disso, vem com o novo DataSnap framework, integrado ao dbExpress e sem dependência da tecnologia COM (Component Object Model).

E para aqueles que acreditavam que a partir da versão 2009 o Delphi não trabalharia mais com o .NET, não se preocupem segundo Andreano, no final do mês de novembro deste ano (2008) será lançado também o Delphi 2009 for .NET, incorporando as funcionalidades do Framework 3.5 da microsoft.

A empresa Embarcadero Technologies é a nova "dona" de ferramenta Delphi, onde a ferramenta só tende a crescer com mais força, pois a empresa dispõe de uma equipe com mais de 120 pessoas trabalhando no desenvolvimento e melhoramentos da ferramenta. Segundo Andreano, o Brasil ainda é considerado pequeno frente a outros países, como por exemplo a Rússia investiu neste ano, 1 milhão de licenças para distribuir entre escolas de Ensino Fundamental e Médio.

A Embarcadero Technologies Inc. auxilia desenvolvedores de aplicações e profissionais de bancos de dados fornecendo ferramentas para o design, construção e execução de aplicações de software no ambiente de preferência do cliente. Uma comunidade de mais de três milhões de pessoas ao redor do mundo e 90 empresas da Fortune 100 confiam nas linhas de produtos da CodeGear™ e da DatabaseGear™ da Embarcadero para aumentar a produtividade, a abertura da colaboração e a liberdade de inovar. Fundada em 1993 a Embarcadero tem sua sede em São Francisco, com escritórios espalhados pelo mundo.

t+
Edinei

terça-feira, 23 de setembro de 2008

Artigo Nº 11: Resolvendo o erro de acesso negado no Delphi 2007 após instalar IE 7

Quando é instalado ou atualizado e IE para a versão 7 após ter instalado o Delphi for .NET 2007 começa a dar erro de acesso negado para ver o Design, para resolver este problema é necessário adicionar uma chave nos registros do Windows.
Para abrir o arquivo de registro do Windows vá a executar->regedit, vai abrir a janela do editor de registro, vá para Meu Computador->HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Internet Explorer->Main->FeatureControl->FEATURE_OBJECT_CACHING e clique em Novo->Valor DWORD, nomeie de bds.exe e atribua valor 0. Veja imagem abaixo.

Feito isso, feche o editor, reinicie o computador e pronto.

Também existe uma solução pronta, basta baixar o arquivo deste link(http://www.stevetrefethen.com/files/FEATURE_OBJECT_CACHING.reg) e executar que faz a mesma coisa.

Até.

sexta-feira, 19 de setembro de 2008

Artigo Nº 10: Cuidados com Performance em ASP.NET

Olá a todos...
Devido a alguns problemas nesse sentido andei pesquisando sobre o assunto, e objetivo aqui não é comparar qual a melhor maneira de utilizar os dois métodos, mas apenas alertar para possíveis esquecimentos que podem trazer sério problemas de performance às aplicações .NET.

DataReader x DataSet

DataReader
- É um objeto somente leitura e adiante, ou seja, não podemos navegar aleatoriamente utilizando este objeto;
- Trabalha conectado ao banco, deste modo, enquanto estivermos utilizando-o para extração de dados do banco, estaremos "pendurados" em uma conexão;
- Trabalha apenas com uma tabela por vez, ou seja, você deve configurar a string sql para a primeira tabela, conectar no banco, coletar suas informações e desconectar do banco. Para a segunda tabela você deverá fazer tudo novamente.
Observação importante: A conexão utilizada pelo DataReader deve ser aberta e fechada manualmente (exceto quando você informa que ela deverá ser fechada automaticamente)
DataSet
- Funciona como um cache in-memory, ou seja, você terá sua tabela totalmente disponível para uso, podendo fazer acesso aleatório às rows, inserir, alterar e deletar registros à tabela;
- Trabalha desconectado do banco, deste modo, trabalharemos com os registros sem ocupar uma conexão do banco;
- Trabalha com n tabelas por vez, disponibilizando, inclusive, a possibilidade de relacionamento entre as mesmas, dentre outras funcionalidades.
Observação importante: A conexão utilizada pelo DataSet não necessita ser aberta e/ou fechada manualmente. Ao chamar o método Fill do DataAdapter a conexão é aberta, são coletados os dados solicitados e a conexão é fechada.


Observação sobre os objetos Connection: É importante ressaltar que todas as conexões abertas manualmente devem ser fechadas manualmente (exceto quando chamar o ExecuteReader utilizando o CommandBehavior.CloseConnection). As conexões abertas e não fechadas, permanecerão abertas mesmo quando seu código estiver fora de escopo. As mesmas não serão fechadas automaticamente, e nem mesmo destruídas pelo Garbage Collector.


t+
Edinei

sexta-feira, 12 de setembro de 2008

Artigo Nº 09: CPF Válido - Javascript

Achei na net e achei interessante o algorítmo...


//***********************************SCRIPT 100% DEVELOPED BY GABOWS#888***********************************\\
//if you're going to change or use this code, do not cut off these lines!
//se você vai alterar ou utilizar este codigo, não retire estas linhas!
//***********************************gabows888@yahoo.com.br***********************************\\
function criar(){
var cnpj=document.getElementById('cpf').value;
if(cnpj.length!=9){
alert("Preencha os nove campos!");
return false;
}
if(isNaN(cnpj)){
alert("Preencha somente com dados numéricos!");
return false;
}
if(cnpj!=!isNaN){
for(i=0;i<=cnpj.length;i++) total=cnpj.length; campo01=0; campo02=0; n1=cnpj.substring(0,total-8); n2=cnpj.substring(1,total-7); n3=cnpj.substring(2,total-6); n4=cnpj.substring(3,total-5); n5=cnpj.substring(4,total-4); n6=cnpj.substring(5,total-3); n7=cnpj.substring(6,total-2); n8=cnpj.substring(7,total-1); n9=cnpj.substring(8,total); tt1=parseFloat((n1*10)+(n2*9)+(n3*8)+(n4*7)+(n5*6)+(n6*5)+(n7*4)+(n8*3)+(n9*2)); div1=(tt1%11); if(div1<2){>=2){
campo01+=parseFloat(11-div1);
}
tt2=parseFloat((n1*11)+(n2*10)+(n3*9)+(n4*8)+(n5*7)+(n6*6)+(n7*5)+(n8*4)+(n9*3)+(campo01*2));
div2=(tt2%11);
if(div2<2){>=2){
campo02+=parseFloat(11-div2);
}
alert(n1+''+n2+''+n3+''+n4+''+n5+''+n6+''+n7+''+n8+''+n9+'-'+campo01+''+campo02);
return;
}
}

terça-feira, 9 de setembro de 2008

Artigo Nº 08: Customizando Calendar Extender com CSS no Rad Studio 2007

No Artigo Nº 05, foi comentado como aplicar o componente Calendar Extender do pacote Ajax Control Toolkit, agora vamos customizar o layout dele com estilo CSS.

Para começar, crie uma nova pasta chamada "estilos", dentro da pasta do projeto da aplicação. Depois, abra o bloco de notas ou notepad++ e salve esse arquivo dentro dessa pasta com o nome de "estilos.css", depois copie o código abaixo e cole no arquivo.

.calendario .ajax__calendar_container /*formatação da parte externa de onde encontra-se o corpo do calendário */

{background-color:#8080FF; border:solid 1px #004000;}

.calendario .ajax__calendar_header /*formatação do cabeçalho*/

{background-color:#ffffff; margin-bottom:3px; border:solid 1px #004000; width:170px;}

.calendario .ajax__calendar_title /*formatação do texto que encontra-se no cabeçalho*/

{color:black;}

.calendario .ajax__calendar_body /*formatação interna de onde se encontra o calendário(onde estão os dias do respectivo mês)*/

{background-color : white ;border : solid 1px #004000 ;}

.calendario .ajax__calendar_dayname /*formatação da descrição dos dias da semana*/

{text-align : center ; font-weight : bold ; margin-bottom : 4px ;margin-top : 2px ;color : blue;}

.calendario .ajax__calendar_day /*formatação dos dias do mês*/

{text-align : center ;color: black;}

.calendario .ajax__calendar_hover .ajax__calendar_day /*formatação para quando passar o mause sobre um determinado dia*/

{color: red;}

.calendario .ajax__calendar_hover .ajax__calendar_month /*formatação para quando passar mause sobre um determinado mês*/

{color: red;}

.calendario .ajax__calendar_hover .ajax__calendar_year /*formatação para quando passar o mause sobre um determinado ano*/

{color: red;}

.calendario .ajax__calendar_active /*formatação do dia, quando já possui uma data no textbox de controle*/

{background-color: #D4D0C8 ;font-weight : bold ; }

.calendario .ajax__calendar_today /*destaque para a data atual(Today)*/

{ font-weight : bold ; color : black;}

.calendario .ajax__calendar_other .ajax__calendar_day/*formatação dos dias que não pertencem ao mês selecionado*/

{color:#6A5ACD;}

.calendario .ajax__calendar_hover .ajax__calendar_today /*formatação para quando passar o mouse sobre a data atual(Today)*/

{color: #FFFFFF}

.calendario .ajax__calendar_hover .ajax__calendar_title /*formatação para quando passar o mouse sobre o texto do título*/

{color : red ; }

Salve e depois vá para o .aspx da página que você está utilizando o componente e dentro da tag HEAD, coloque o código seguinte logo abaixo da tag TITLE. Esse é o código responsável por buscar os estilos e aplicar na sua página.


Agora no design da página, selecione o componente CalendarExtender e na propriedade CssClass digite calendario, nome dado ao estilo. Daí só compilar e ver o resultado.

Mais detalhes, veja a edição 99 da revista ClubeDelphi.

Artigo Nº 07: Exemplo de Paginação GridView

Para criar uma paginação em uma GridView, adaptar o código abaixo:

segunda-feira, 8 de setembro de 2008

Artigo Nº 06: Função Javascript para ver Elefantes


Só pra ter uma noção de como é fácil ver elefantes... :]

quarta-feira, 3 de setembro de 2008

Artigo Nº 05: Usando Calendar Extender e Mask Edit do Ajax Control Toolkit no Rad Studio 2007

Adicionar os componentes ScriptManager e UpdatePanel na página.

Selecionar o ScritManager e alterar para True as propriedades EnableScriptGlobalization e EnableScriptLocalization no Object Inspector.

Alterar ou adicionar na Web.config o termo "GLOBALIZATION" por "<globalization culture="pt-BR" uiCulture="pt-BR"/>" (para traduzir o calendário em português).

Abrir o arquivo .aspx verifique se a tag "head" está como runat="server", caso não esteja, coloque-a.

OBS: o código do head deve ser alterado para todas as páginas, indiferente se terá ou não CalendarExtender.

CALENDÁRIO

Quando clicar no textbox:

Adicionar um TextBox, depois o componente CalendarExtender(para isso deve estar instalado o Ajax Control Toolkit), não precisa ser necessariamente ao lado do textbox, e sim no fim dos layout, mas dentro do UpdatePanel, isso porque o componente, no Delphi não no navegador, ocupa um espaço e assim desconfigurando o visual

Selecione o CalendarExtender e altere as seguintes propriedades:

targetcontrolid=(nome do textbox que receberá a data selecionada)

format=dd/MM/yyyy (formato da data)

firstdayofweek=Sunday (qual será o primeiro dia da semana que exibirá no calendário)

popupPosition = Rigth (como o calendário será exibido)

Quando quer colocar uma imagem para exibir o calendário:

Faça tudo da mesma forma que a de anterior

Coloque o componente ImageButton e o nome do ImageButton, colocar na propriedade PopupButtonID do "CalendarExtender".

MÁSCARA

Adicionar o componente "MaskEditExtender" da mesma forma que o "CalendarExtender" e alterar as seguintes propriedades:

TargetControlID= selecionar o textbox de controle

Selecione o TextBox e no objector Inspector procure as propriedade Extenders e altere as seguintes propriedades:

mask="99/99/9999"

masktype="Date"

No próximo artigo estaremos mostrando estilos CSS para o componente CalendarExtender;

terça-feira, 2 de setembro de 2008

Artigo Nº 04: Trabalhando com datas no Delphi .NET usando DateUtils

Uma dica muito útil para quem precisa realizar diversos cálculos com datas, seja de dias, semanas e demais.
De início declare na uses a biblioteca: DateUtils, esta possibilita várias funções de cálculo de datas, segue um exemplo de cálculo de dias, onde temos a data atual e queremos somar a mesma com determinado valor de dias:
No load da página, preencho o label com a data atual:
Label3.Text := DateTime.Now.ToString('dd/MM/yyyy');
Coloco um TextBox e outro Label onde visualizarei o resultado do cálculo, e tb um button. No click do Button vai o seguinte:
Label4.Text := IncDay(convert.ToDateTime(Label3.Text),Convert. ToInt16(TextBox1.Text)).ToString;

Existem diversas outras funções desta biblioteca, que com certeza serão uteis algum dia.

Abraço e até a próxima!

segunda-feira, 1 de setembro de 2008

Artigo Nº 03: Exibir um somatório no rodapé da datagrid

Bom... No meu primeiro post estarei disponibilizando um tutorial de como exibir o somatório de um campo do banco de dados no rodapé de uma DATAGRID, como por exemplo um campo salário. Para começo deve-se criar uma função do tipo String por exemplo : Soma : String; E nela adicionar o seguinte os comandos para realizar uma função de consulta com um command no nosso caso bdpComman e nele especificar a conexão que será utilizada para acessar o banco de dados. Segue-se o código.


bdpCom := BdpCommand.Create('SELECT SUM(HORAS) AS FEITAS FROM HORAS WHERE BOLSA = ?', Dados.CONEXAO);
try
bdpCom.Parameters.clear; // Limpa os parâmetros.
bdpCom.Parameters.Add('BOLSA', BdpType.&String); //Adiciona um parâmetro.
//====================================
bdpCom.Parameters['BOLSA'].Value := BOLSA; //Da um valor para o parâmetro criado.
bdpRead :=bdpCom.ExecuteReader;

if bdpRead.read then//Se o reader tiver algo nele, retorna o seu valor se não retorna 0.
Result := bdpRead['FEITAS'].ToString
else
Result := '0';
finally
bdpCom.free; // Libera da memória
bdpRead.free;
end;

Onde o deve-se utilizar o comando ExecuteReader do bdpCommand no componente bdpRead, e após isto uma simples verificação para ver se retornou algo da consulta onde foi realizada um SUM(CAMPO), sempre é claro lembrando de liberar da memória os componentes (após o finally). E retornando no Result a variavel dbpRead[‘FEITAS’] que é o nosso dbpReader. Após isto, vá na DataGrid e habilite a opção ShowFooter para exibir o rodapé. Agora adicione o evento ItemDataBound na DataGrid para que quando esteja sendo desenhado cada linha ele efetue o comando desejado.

Neste evento deve-se adicionar o seguinte comando:


if e.Item.ItemType = ListItemType.Footer then
// Se estiver no rodapé executa
e.Item.Cells[7].Text := Soma (Session['BOLSA'].ToString);


Primeiro se verifica se na hora de desenhar ele esta no rodapé, se sim ele joga para a coluna 7 o valor retornado pela nossa função, abaixo esta a foto do resultado final, é claro que o resto dos campos espera-se que sejam criados manualmente, alias uma ultima coisa.... Isto não funcionará caso exista paginação na datagrid pois na função ele trás logo o total e não o total das linhas que estão aparecendo.

Bom, creio que seja isto.... Até mais!

Artigo Nº 02: GridView em DELPHI .NET

Olá a todos!

Este tutorial é sobre GridView em RAD Studio .NET, ASP.NET.

- Adicionar Colunas em Tempo de Execução

Em alguns casos é necessário adicionar colunas em tempo de execução em uma GridView, isso pode ser feito adicionando um código parecido com este no evento que desejar:

var
CAMPO1, CAMPO2, CAMPO3, CAMPO4 : BoundField;
begin
  CAMPO1 := BoundField.Create;
  CAMPO2 := BoundField.Create;
  CAMPO3 := BoundField.Create;
  CAMPO4 := BoundField.Create;
  try
    CAMPO1.HeaderText := 'Código';
    CAMPO1.DataField := 'CODIGO';
    CAMPO2.HeaderText := 'Nome';
    CAMPO2.DataField := 'NOME';
    CAMPO3.HeaderText := 'Idade';
    CAMPO3.DataField := 'IDADE';
    CAMPO4.HeaderText := 'Telefone';
    CAMPO4.DataField := 'TELEFONE';
    GridView1.Columns.Insert(0,CAMPO1);
    GridView1.Columns.Insert(1,CAMPO2);
    GridView1.Columns.Insert(2,CAMPO3);
    GridView1.Columns.Insert(3,CAMPO4);
  finally
    CAMPO1.Free;
    CAMPO2.Free;
    CAMPO3.Free;
    CAMPO4.Free;
  end;
end;

Obs: Pode ser adicionado outros tipos de colunas também como ButtonColumn e definir outras propriedades.

- Recuperar Valores

Tive alguns problemas para recuperar os valores de uma gridview no começo porque quando você define que a coluna código, por exemplo, é visible=false, ele não permite pegar o conteúdo daquela coluna facilmente, mas com DataKeys é tranquilo, os códigos abaixo:
GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Item[0].ToString;

ou
GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[0].ToString;

Na gridview precisa ser preenchido a propriedade DataKeysNames, pode ir direto no código ou configurar na paleta propriedades mesmo, coloque o nome do campo que busca no BD, se quiser pode colocar mais de um(array), desde que separe com vírgula, se colocar mais de um, muda o valor -> Values[array], por exemplo, se quiser pegar o valor NOME, ficaria assim:

Ex: datakeynames="CODIGO, NOME"
//pega o código
GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[0].ToString; 
//pega o nome
GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[1].ToString; 

O evento para pegar os valores é o RowCommand, fica no mesmo estilo que datagrid, coloca um buttonfield e atribui um commandname pra ele, no evento rowcommand pode-se implementar um codigo parecido com esse:
if e.CommandName = 'EXCLUIR' then
begin
lblcontrole.text := GrVwComponentes.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[0].ToString;
Excluir;
end;


Qualquer dúvida postem ai!!