terça-feira, maio 31, 2011

Motorola Atrix

HI,

Como tou aprendendo a programa para o Android e sempre tive a vontade de comprar um celular com esse sistema operacional. Estava esperando o momento certo e ele tinha chegado. Estava com muita vontade de testar o programa no celular. No emulador num é a mesma coisa, hehehe. No windows mobile até dava, já que se usa uma canetinha. Mas passar o dedo na tela do computador, sem condições, hehehe.

Estava esperando para comprar um com android 2.2. E recentemente foi lançado o Motorola Atrix. Pense no desejo de comprar um, mesmo custando quase o preço de um tablet. Mas eu considero essa compra como um investimento, já que tou aprendendo para migrar um sistema de força de vendas que temos para windows mobile.

Mas não estou escrevendo apenas para falar dessa aquisição :-)

Ele tem um probleminha com SMS, hehehe. Pense, quase me causa um problemão. Enviaram SMS para mim e eu nada de receber, e era importante.

Pesquisando no google, encontrei essas soluções. Agora tá tudo blz.




Fiquem na Paz!!!

sexta-feira, maio 27, 2011

Erro 404 no IIS

HI,

Depois de um servidor windows 2003 ser formatado e o IIS instalado novamente, tive que configurar um site em aspx que estou criando.

Não funcionou, deu erro 404, de página não encontrada.

Fui almoçar e nosso gerente de T.I fez um teste colocando uma página teste.html dentro da pasta e ela foi exibida no browser. Então a configuração do endereço do site tava ok.

Pesquisando mais um pouco no google, quando voltei, por "erro 404 ASPX iis" encontrei a solução para o problema. Estava desabilitada a permissão para exibir paginas Asp.Net 2.0.

Links




é isso aí

Fiquem na Paz!!!

domingo, maio 22, 2011

Obtendo o Banco de Dados do emulador Android

HI,

Essa dica é para obter o banco de dados que está no emulador.

Acessem esse site

Precisei manipular o banco de dados para saber como excluir um campo da tabela, criar uma trigger, etc.

Não dá para usar o comando alter table drop column no android. É preciso renomear a tabela, criar uma nova com o mesmo nome, depois dá um select insert para pupular a nova tabela e depois excluir a tabela que foi renomeada.

Fica assim o comando

db.execSQL("ALTER TABLE \"main\".\"expenses\" RENAME TO \"oXHFcGcd04oXHFcGcd04_expenses\"");

db.execSQL("CREATE TABLE \"main\".\"expenses\" (\"_id\" integer PRIMARY KEY ,\"description\" text NOT NULL ,\"value\" number(9,2) NOT NULL );");

db.execSQL("INSERT INTO \"main\".\"expenses\" SELECT \"_id\",\"description\",\"value\" FROM \"main\".\"oXHFcGcd04oXHFcGcd04_expenses\";");

db.execSQL("DROP TABLE \"main\".\"oXHFcGcd04oXHFcGcd04_expenses\";");


Fiquem na Paz!!!

Definindo a data inicial do DatePickerDialog

HI,

Tinha ido dormir umas quatro da manhã tentando definir a data do Date Picker Dialog com a data que tá gravada na tabela quando se está editando o registro. Achei um exemplo, mas não consegui fazer, devia ser o sono, pois, analisando o mesmo exemplo agora de manhã depois de ter acordado ( a hora? meio dia, hehehe ), consegui botar para funcionar.

Agora quando se está editando, é exibida a data que está gravada.

Fiz com base nesse exemplo


Código que estou utilizando

@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
if (definirdata){
String _date[] = mPickDateExpense.getText().toString().split("/");
mYear = Integer.parseInt(_date[2]);
mMonth = Integer.parseInt(_date[1]) - 1; // mes vai de 0 a 11
mDay = Integer.parseInt(_date[0]);
definirdata = false;
}
return new DatePickerDialog(this,
mDateSetListener,
mYear, mMonth, mDay);
}
return null;
}


Fiquem na Paz!!!

Gravando datas no SQLite do Android

HI,

Continuo avançando aqui no exemplo expenses. Hoje consegui gravar a data no banco de dados, graças a Deus.

Depois de muita tentativa e erro e muitas pesquisas no Google, fui achando as soluções.

Primeiro erro que me deparei foi esse: java.text.ParseException: Unparseable date

Tava tentando converter a data da despesa ( uma string ) que tava no formato dd-MM-yyyy para jogar dentro de uma variável do tipo data. Só depois que percebi que tinha esquecido de trocar o traço pela barra deixando o formato assim: dd/MM/yyyy.

Código para converter uma string em data

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date datepayment = formatter.parse(datepaymentText.getText().toString());

datepaymentText é um Button.

O segundo erro que me deparei foi: java.lang.ClassCastException: java.util.Date

Pensei que o problema era na hora de gravar no campo data da tabela. Desabilitei a linha que dá um insert no banco e mesmo assim tava dando esse erro. Então deduzi que o problema era na passagem de parametro. Fiquei pensando, como é que pode passar um campo data para um metódo que tem uma variavel do tipo data e dá erro?

Pesquisando no google descobrir que ao invés de usar a biblioteca java.sql.Date, eu deveria usar java.util.Date. Depois que fiz isso, não deu mais erro.

E nessa mesma busca vi que eu deveria converter essa variável data que tá no formato dd/MM/yyyy para yyyy-MM-dd, que é o formaro do banco de dados.

O código para gravar a data no banco de dados ficou assim:

public long createExpense(Date datepayment){
ContentValues initialValues = new ContentValues();

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
dateFormat.applyPattern("yyyy-MM-dd");

initialValues.put(KEY_DATEPAYMENT, dateFormat.format(datepayment));
return mDb.insert(DB_TABLE, null, initialValues);
}

Deixei só o campo data para exemplificar.

Agora tá beleza, tá gravando e recuperando o campo data

Ficou assim a tela do programa




Espero que possa ser útil.

Páginas que me ajudaram
http://www.guj.com.br/java/76586-converter-um-campo-de-um-text-field-em-date#403825
http://www.guj.com.br/java/36076-converter-string-para-uma-data
http://stackoverflow.com/questions/754684/how-to-insert-a-sqlite-record-with-a-datetime-set-to-now-in-android-application
http://stackoverflow.com/questions/3842509/android-java-datetime-values-from-string-to-long-to-string-issue

Fiquem na Paz!!!

Escolhendo uma data com o date picker no android

HI,

Um outro componente que adicionei no formulário foi o Date Picker. O exemplo que achei coloca a data escolhida em um textview e o dialog para a escolha da data é a partir de um button.

Eu modifiquei o código para jogar a data escolhida no próprio button.

Usei o exemplo do site do android
http://developer.android.com/resources/tutorials/views/hello-datepicker.html

Que achei nesse site
http://blog.professorcoruja.com/2010/11/componente-date-picker-no-android-form.html

Fiquem na Paz.

Populando um spinner a partir de um array

HI,

Usei a dica desse site para exibir os valores em um spinner que não estão em uma tabela do banco de dados. Nesse caso, os valores são provenientes de um array.

Para obter a posição do valor selecionado basta usar: Spinner.getSelectedItemPosition()


Fontes:

How to populate a Spinner widget from an Array
http://androidforbeginners.blogspot.com/2010/01/how-to-populate-spinner-widget-from.html

Obtendo a posição do item selecionado
http://stackoverflow.com/questions/2903961/how-to-get-an-items-position-from-items-id-in-android-spinner

Criando widget Spinner
http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=5670


Fiquem na Paz

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