sexta-feira, maio 20, 2011

Campo data com valor padrão no SQLite

HI,

Ainda tou engatinhando no Android, levando uns tombos, mas graças a Deus eu tou conseguindo avançar.

No exemplo de controle de despesas já coloquei um spinner para indicar o tipo de pagamento da despesa.



Agora a minha batalha é colocar o campo data dessa despesa. Estava incluindo no SQLite Manager, extensão do firefox, um campo do tipo data e selecionei para não ter valor null, e quando se faz isso, temos obrigação de informar um valor padrão. Tinha colocado SYSDATE, mas não deu certo.

Pesquisando no google, encontrei uma solução usando uma trigger para atualizar a data antes de inserir.

CREATE TABLE foo (
id NUMBER NOT NULL,
created DATE);

CREATE TRIGGER insert_date AFTER INSERT ON foo
BEGIN
UPDATE foo SET created = DATETIME('NOW') WHERE rowid = new.rowid;
END;


Só que dessa maneira aí, o campo vai ser atualizado, mesmo que eu informe a data na tela.

Modifiquei a trigger para testar se o campo está vazio, se tiver, atualiza a data atual do banco.

CREATE TRIGGER insert_date AFTER INSERT ON foo
BEGIN
UPDATE foo SET created = DATETIME('NOW') WHERE rowid = new.rowid and new.created is null;
END;

Agora vou tentar colocar o campo data no formulário.

Espero que possar ser úitl, fiquem na Paz

quarta-feira, maio 18, 2011

Android, primeiro programa com banco de dados.

HI,

Hoje consegui terminar um exemplo de uma aula sobre android da devmedia. Deu um trabalhão danado. O vídeo é do tempo que nem tinha celular com android. Mas graças a Deus e com a ajuda das pessoas que alimentam o google com conteúdo, consegui botar para funcionar. Também tive esse trabalho todo porque não manjo quase nada de Java.

Consegui avançar depois que descobrir como contornar o erro "Source not found". Achei a dica nesse blog para usar controle de exceção e ter no debug a mensagem correta do erro.

E alguns dos erros é que algumas coisas deixaram de existir no sdk atual, e tive que pesquisar como fazer da forma atual.

Alguns sites que me ajudaram:

sobre menu

tive que usar equals para passar uma long para string e testar se era igual a zero, para saber se era vazia.

Esse foi por causa de um erro ao recuperar os dados do item selecionado, tinha que mover para o primeiro, mesmo retornando apenas um resultado

Tela do Programa

Agora vou incrementá-lo. Usar pesquisa, outras tabelas, etc.

Fiquem na Paz.

terça-feira, maio 10, 2011

Exibir dados a partir de uma procedure

HI,

Hoje tive uns probleminhas para exibir o resultado de uma procedure. Um cliente criou uma procedure para retornar os dados dos clientes. Nunca tinha usado isso no Delphi. Criei rapidinho uma tela para exibir esse resultado em um componente grid.

O primeiro problema que tive, e que recorri ao google, foi quando tentei setar o componente TStoredProc para true. Deu o seguinte erro: error creating cursor handle. Pesquisando no google, descobrir que só posso dá um StoredProc1.ExecProc;. Pois bem, associei um datasource ao componente StoredProc1 e em runtime, executei o ExecProc e não mostrou nada no grid. Aí pensei, deve ser por que esse troço só serve para executar comandos que não retornam dados. Foi aí que tive a idéia de dar um select na procedure e usar o componente query.

Ficou assim: Select * from Nome_Procedure. Dei um open e mostrou os resultados no Grid. Mas aí surgiu o segundo problema. Em algumas colunas tava mostrando (BYTES) ao invés do valor do campo.

Coloquei um Label para receber o conteúdo de campo, mas não mostrou nada. Label.caption := Query.FieldByName('codigo').AsString;

Fui a procura de uma rotina para converter de bytes para integer e achei esse código.

Fiz uma adaptação e criei essa função:

function BytesToInteger(Campo: TField): integer;
var MyBuffer : ^integer;
begin
with Campo do
begin
GetMem(MyBuffer, DataSize);
try
if not GetData(MyBuffer) then
result := 0
else
result := MyBuffer^;{ Do something with the data };
finally
{ Free the space }
FreeMem(MyBuffer, DataSize);
end;
end;
end;

Testei na tela e exibiu em um label o código correto, fiquei animado. Depois eu modifiquei a consulta para converter para float, com o resultado, desanimei. Mostrou o resultado em notação científica. Se eu fosse tentar resolver isso ia ficar muito complicado o código, cheio de conversões.


Foi aí que eu tive a idéia de tratar isso na query, fazendo um type cast.

A query tava assim
select codigo, nome, limite from EXPCLIENTES

Modificando a query
select cast(codigo as integer) codigo, nome, cast(limite as double precision) limite from EXPCLIENTES

Passou a apresentar corretamente os campos no Grid.


Espero que possa ser útil.

Fiquem na Paz

segunda-feira, abril 18, 2011

Formatando seu código no blog

HI,

Tou indo domir, mas antes deixo essa dica que precisei utilizar agora para formatar o código de uma rotina em c#. Para ficar um pouco mais elegante.

Primeiro: Edite o HTML do blogspot e coloquei a formatação CSS. Pegue aqui.

Segundo: Utilize este site para formatar seu código http://www.manoli.net/csharpformat/

Terceiro: Cole o código HTML no post ( na opção Editar Html ) e pronto.
public static string GetRandomPasswordUsingGUID(int length)
{
// Get the GUID
string guidResult = System.Guid.NewGuid().ToString();

// Remove the hyphens
guidResult = guidResult.Replace("-", string.Empty);

// Make sure length is valid
if (length >= 0 || length > guidResult.Length)
throw new ArgumentException("Length must be between 1 and " + guidResult.Length);

// Return the first length bytes
return guidResult.Substring(0, length);
}

Na Visualização o código não aparece formatado. Deve ter um outro lugar para colocar o CSS, depois vejo isso.

Intel +, fiquem na Paz!!!

Retornar apenas números e letras

HI,

Estou usando Asp.net com C#

Precisei retornar apenas os números do CPF informado no TextBox, que está com mascara.

Não estava a fim de usar replace. Então pesquisei no google uma rotina que utilizasse Expressão Regularar.

Montei essa função com o que achei.
       /// <summary>
/// Retornar apenas as letras e os números da variável passada como parametro
/// </summary>
/// <param name="valor">Valor com caracteres</param>
/// <returns>Apenas número e letras</returns>
public static string RetornaNumeroLetra(string valor)
{
try
{
Regex regexObj = new Regex(@"[^0-9]");
return regexObj.Replace(valor, "");
}
catch (ArgumentException ex)
{
// Syntax error in the regular expression
throw new Exception(ex.Message);
}
}


Intel +, fiquem na Paz!!!

O Último Retorno

HI,

Quase que não consigo me logar no meu blog, hehehe. Tempão que não apareço por aqui.

Tou voltando para ficar.

Conteúdo para manter esse blog atualizado, tem um montão.

Acabei de fazer um curso de Asp.Net e tou com boas práticas para compartilhar com vocês. Espero que voltem todos, hehehe. E que apareçam mais visitantes.

Também tou estudando Android, mas por conta própria.

Intel +, fiquem na Paz!!!

segunda-feira, agosto 24, 2009

Meu Twitter

HI,

Já tem um tempão que criei meu Twitter, mas como não queria escrever se eu tava sentado no vazo sanitário ou escobando os dentes, não tava postando nada nele.

Mas agora já sei o que escrever nele ( claro que cometo um certo pecado de falar da minha vida pessoal, hehehe ). Vou postar dicas sobre tecnologia, desenvolvimento, etc. Não será apenas um instrumento de apontar para artigos aqui do blog. Terá conteúdo próprio.

Espero vocês lá: http://twitter.com/dprogrammer

Tem um post sobre download de vídeo aulas e apostilas sobre C# e Visual Basic.Net.

Até Mais

domingo, agosto 02, 2009

Apagando todos os contatos do windows mobile

HI,

Depois de alguns meses sem aparecer por aqui, sem responder aos comentários, resolvi aproveitar um novo começo de mês para voltar a atualizar esse blog e ao site de vídeos que tenho, que também foi abandonado.

Começo com uma chatice que tive ao acessar o MSN a partir do windows mobile 6, com o meu htc p4351. Quando fui realizar o login pela primeira vez apareceu uma tela de sim/não dizendo que todos o meus contatos do msn seriam incluídos nos contatos do wm. Tava precisando acessar o MSN naquele momento, então permiti.

Pensem na bagunça que ficou meus contatos. Mais de 180 contatos, hehehe. Resolvi então a excluir alguns contatos do ppc. Dois problemas: A tela de contatos do windows mobile não permite selecionar mais de um registro e o contato também será excluído do MSN, hehehe.

Resolvi excluir todos os contatos do ppc. Procurei a solução e encontrei uma maneira de fazer uma limpa geral nos contatos.

Solução: Start>Settings>Sim Manager>Menu>Delete Contacts.

Na busca em um forum encontrei a dica e usar outro programa para conversar com o MSN. Acabei instalando o Palringo. Tá perfeito agora. Ele conversa com outros serviços também.

Uma amigo passou pelo mesmo problema. Ele excluiu tudo e foi usar o msn de novo e os contatos sumiram do MSN. Ele disse que tem uma opção de recuperar os contatos no messenger.

Não testei a possibilidade de sincronizar os contatos com o outlook, excluir os contatos do MSN, deixando apenas os contatos do Telefone e mandando sincronizar de novo. Para ver se remove do ppc esses contatos que foram excluídos no pc.

Até Mais.

sábado, março 21, 2009

Retornar a data do primeiro e do último dia da semana

HI,

Estou trabalhando em uma rotina para enviar a rota da semana para os vendedores. Minha idéia foi de enviar todos os registros da semana, e não apenas do dia atual até o último dia da semana.

Então como fazer para enviar os registros que estão entre Domingo e Sábado ?

Abrir o delphi e fiz um algotimo para pegar a data do primeiro dia (Domingo) da semana e do último (Sábado) dia.

Ficou assim:

procedure TForm1.BitBtn1Click(Sender: TObject);
Var DiaSemanaHoje : Byte;
begin
DiaSemanaHoje := DayOfWeek(Date());

Edit2.Text := DateToStr(Date() - (DiaSemanaHoje - 1));
Edit3.Text := DateToStr(Date() + (7 - DiaSemanaHoje));
end;

Preciso utiliza isso no Oracle. Então lá vou eu para a home page do banco de dados (utilizo o oracle express aqui no note).

Peguei o exemplo que se encontra aqui no blog para pegar o dia da semana e bolei essa Sql:

select SYSDATE AS HOJE,
SYSDATE - (to_char(SYSDATE, 'D') - 1) AS DOMINGO,
SYSDATE + (7 - to_char(SYSDATE, 'D')) AS SABADO
from dual

Pronto. Já posso trabalhar com essa lógica no Where.

Mas aí achei um jeito mais simples, hehehe.

Pegar pelo dia da semana no ano.

Então o Where vai ficar assim (Delphi):

Sql.Add('Where to_char(SYSDATE, ''WW'') = ' + IntToStr(WeekOfTheYear(Date)));

Espero que possa ajudar mais alguém com isso.


[editando]

Mostrei esse código a um amigo que é DBA e ele me mostrou outra maneira de pegar as datas do primeiro e último dia da semana utilizando a função do NEXT_DAY do Oracle.

select sysdate AS HOJE ,
TRUNC(next_day(sysdate,'MONDAY')-8) as DOMINGO,
TRUNC(next_day(sysdate,'SATURDAY')) as SABADO
from dual

Acabei utilizando essa lógina no meu Where. É que pegando a semana do Ano deu bug, hehehe. Não retornou a Segunda e a Terça.

Where TRUNC(Data) BetWeen TRUNC(next_day(sysdate,'MONDAY')-8) and TRUNC(next_day(sysdate,'SATURDAY'))

Esse TRUNC é para retornar a data sem a parte da hora.

[/editando]

Até +

segunda-feira, março 02, 2009

Formatação de Datas no Oracle

Dica para formatar uma data no Oracle.

AM - AM ou PM
CC - Século
D - Dia da semana (1-7)
DAY - Dia da semana ('SUNDAY')
DD - Dia do mês (1-31)
DDD - Dia do ano
DY - Dia da semana abreviado ('SUN')
FM - Tira os blanks ou Zeros da esquerda
HH - Hora do dia (0-12)
HH24 - Hora do dia (0-24)
MI - Minutos da Hora
MM - Mês com 2 dígitos
MON - Mês abreviado ('NOV')
MONTH - Mês por extenso ('NOVEMBER')
PM - AM ou PM
RR - Ano com 2 dígitos - especial
RRRR - Ano com 4 dígitos
SS - Segundos do minuto(0 - 59)
SSSSS- Segundos do dia
W - Semana do Mês
WW - Semana do Ano
YEAR - Ano por extenso
YY - Ano com 2 dígitos
YYYY - Ano com 4 dígitos


Achei essa dica quando precisei semana passada pegar o dia da semana, para determinar se era dia útil, sábado ou domingo.

Exemplo: select to_char(SYSDATE, 'D') from dual

Até Mais.