quarta-feira, 9 de novembro de 2011

Data por extenso

Ola pessoal!


Uma sacada bacana que eu aprendi outro dia com um amigo.

Pra gerar a data por extenso eu utilizava uma função, mas esse amigo me mostrou uma grande sacada que a Borland fez ;-)

Em apenas uma linha você obtém a data por extenso: FormatDateTime('dddddd',now);

Os incríveis 6 (d)'dês" retornam a data por extenso sem precisar de nenhuma função adicional.


Abraços, Emanuel

terça-feira, 8 de novembro de 2011

Problema com o arquivo midas.dll

Ola pessoal


Estava com esse problema a uma semana, sofrendo pra saber o porque.

Peguei o arquivo na internet. Coloquei na pasta Systems do Windows. No home do projeto. Em tudo que é lugar :-s

Até que li um post em um blog (desculpe! mas não me lembro o nome) que me salvou a vida.

O blog dizia o seguinte:

A partir do Delphi 6, sempre que vocês utilizam ClientDataSet - ele requer a biblioteca midas.

Pra vocês não sofrerem que nem eu ;-) No USES da interface adicione a biblioteca MidasLib. NÃO usem o arquivo midas.dll. Pelo menos pra mim não funcionou.


Abraços

quinta-feira, 27 de outubro de 2011

Somando valores em caixa de texto.

Ola pessoal, postando mais um probleminha no trabalho :-p


Probleminha em um site de um cliente. Um problema que ocorre muito com os programadores novos se não prestarem atenção nos detalhes. Aconteceu com os meus alunos, aconteceu agora com nosso estagiário.

E dizem que programar é fácil.

A linguagem JavaScript em questão utiliza a declaração de variáveis sem definição. Isto pode gerar alguns problemas.

Vamos ao código...

O código do formulário em HTML:


<form name="combin" action="pagina.php" method="post" OnSubmit="JavaScript:return valida_formulario()">
<input name="combinacao1" type="text" size="5" value=""/><br>
<input name="combinacao2" type="text" size="5" value=""/><br>
<input name="combinacao3" type="text" size="5" value=""/><br>
<input name="combinacao4" type="text" size="5" value=""/><br>
<input name="combinacao5" type="text" size="5" value=""/><br>
<input name="combinacao6" type="text" size="5" value=""/><br>
<input name="" type="reset" value="Limpar" />&nbsp;&nbsp;<input type="submit" name="Submit" value="Enviar" />
</form>


E abaixo o código em JavaScript que faz validação do formulário, neste caso, a soma de todos os campos tem que ser 20. Pedro: O erro estava na hora de pegar os valores, o JavaScript estava definindo as variáveis como String. Por tanto na hora de somar, na verdade estava concatenando.
Utilizei a função parseInt para resolver isso! ;-)

<script language="JavaScript">

function valida_formulario()
{
var valor1 = parseInt(document.combin.combinacao1.value);
var valor2 = parseInt(document.combin.combinacao2.value);
var valor3 = parseInt(document.combin.combinacao3.value);
var valor4 = parseInt(document.combin.combinacao4.value);
var valor5 = parseInt(document.combin.combinacao5.value);
        var valor6 = parseInt(document.combin.combinacao6.value);
var soma = 0;
        
soma = valor1+valor2+valor3+valor4+valor5+valor6;

if (soma == 20)
{
return true;
}
else
{
alert('Soma Diferente de Vinte!');
return false;
}
}
</sccript>


É isso ai! mais um post.


Abraços a todos.

terça-feira, 25 de outubro de 2011

Passagem de parâmetros para o Rave Project.

Sua aplicação deve estar já configurada e funcionando ao gerar o relatório.

Dentro do Rave Report, selecione no Tree Panel, o RaveProject.
E no Object Inspector, selecione a opção Parameters e clique no botão de assistente com os 3 pontinhos (...)
Abrira a janela Strings Editor, dentro desta janela coloque os parâmetros que deseja receber do Delphi.
Clique em OK



Adicione algun(s) Data Text, dependendo da quantidade de parâmetros que ira receber.
Selecione a propriedade DataField e clique no assistente, botão com 3 pontinho (...).
Abrira a janela Data Text Editor, na opção Project Parameters escolha um parâmetro e clique em Insert Parameter.
Clique em OK



 O Rave ja esta pronto para receber os parâmetros.

Agora! dentro do Delphi, no seu código, insira o seguinte código antes da linha de RaveProject1.Execute


//Seta o Parâmetro valortotal
RvProject1.SetParam('ptotal',FormatFloat('#,##0.00',valor_total));

//Seta o Parâmetro dataatual
RvProject1.SetParam('ptotal',FormatDateTime('dd/mm/yyyy',data));
//Executa o rave
RvProject1.Execute;

segunda-feira, 24 de outubro de 2011

Formatações mais usadas.

Boa tarde Pessoal,


Atendendo a alguns pedidos, segue abaixo as formatações que eu mais utilizo no Delphi.


Para moeda - utilizo para formatação de campo numero no rave project, Ztable, ZQuery, ADOTable a ADOQuery
  R$ #,##0.00


Para horario - utilizo em campo date/time (comum no Access) no rave project.
  hh:nn:ss


Para data - este é a mascara para o componente MaskEdit.
  !99/99/0000;1;_



Para data - este é a formatação para função FormatFloat. Comum quando trabalhamos com banco dados MySQL.
  'yyyy-mm-dd' ou 'dd/mm/yyyy'


Espero ter ajudado alunos,

Abraços, Emanuel

domingo, 23 de outubro de 2011

Criando PDF com Rave Report.

Ola


Como criar um arquivo PDF no Rave Report e abri-lo. Tenho que chamar atenção de vocês a um pequeno detalhe: utilizo a função ShellExecute para abrir o arquivo pdf, então temos que adicionar a biblioteca ShellAPI no USES.


procedure Tfrm_form1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var 
  Pdir: Pchar;
begin
    if (key = VK_F4) then
      begin
         dm.Query_bancos.Close;
         dm.Query_bancos.Open;
         RvSystem1.SystemSetups := RvSystem1.SystemSetups - [ssAllowSetup];
         RvSystem1.DefaultDest := rdFile;
         RvSystem1.DoNativeOutput := false;
         RvSystem1.RenderObject := RvRenderPDF1;
         RvSystem1.OutputFileName := 'C:\tmp.pdf';
         RvProject1.Execute;
         //ABRINDO O ARQUIVO PDF CRIADO
         GetMem(pDir,256);
         StrPCopy(pDir, 'C:\tmp.pdf'); {Aqui vc coloca o caminho + o nome do arquivo}
         ShellExecute(0, nil, 'tmp.pdf', nil, Pdir, SW_NORMAL);
         FreeMem(pdir,256);
        end;
       end;
end;

sexta-feira, 14 de outubro de 2011

Evitando digitação de virgula em componente Edit - Delphi

Procedimento para serem  usados em um componente Edit para evitar a digitação de virgula e só aceitar números.

No seu componente Edit coloque os dois códigos nos eventos OnChange e OnKeyPress.

procedure Tfrm_formulario.edt_valorChange(Sender: TObject);
var
  s:string;
  v:double;
  I:integer;
begin
  //1º Passo : se o edit estiver vazio, nada pode ser feito.
If (edt_valor.Text = emptystr) then
edt_valor.Text := '0,00';

  //2º Passo : obter o texto do edit, SEM a virgula e SEM o ponto decimal:
s := '';
for I := 1 to length(edt_valor.Text) do
if (edt_valor.text[I] in ['0'..'9']) then
s := s + edt_valor.text[I];

//3º Passo : fazer com que o conteúdo do edit apresente 2 casas decimais:
v := strtofloat(s);
v := (v /100); // para criar 2 casa decimais

//4º Passo : Formata o valor de (V) para aceitar valores do tipo 0,10.
edt_valor.text := FormatFloat('###,##0.00',v);
edt_valor.SelStart := 0;

end;

procedure Tfrm_formulario.edt_valorKeyPress(Sender: TObject;
  var Key: Char);
begin
   if NOT (Key in ['0'..'9', #8, #9, #13]) then
   begin
      key := #0;
   end;
  //Função para posicionar o cursor sempre na direita
  edt_valor.selstart := Length(edt_valor.text);
end;

sábado, 8 de outubro de 2011

Instalação do ZeosLib e RaveProject no Delphi 2010.

Ola,

Recentemente consegui a instalação do Delphi 2010, nada contra o Delphi 7, mas estava curioso de pegar uma IDE mais robusta, mais nova. Pois estou acostumado a programar em Java e as IDEs Eclipse e NetBeans fornece vários recursos que eu sinto muita falta quando estou no Delphi.

Bom! após a instalação do Embarcadero Delphi 2010 (passo o link pra vocês depois), tentei abrir alguns projetos meus e pra minha surpresa ele não vem com o Rave e precisamos instalar o Zeos. Segue abaixo o caminho das pedras.

INSTALAR RAVEPROJECT

1) http://www.4shared.com/file/q-c_JCwa/RaveReports_D2010.html


INSTALAR ZEOSLIB


1 – Faça o download do arquivo zeosdbo-7.0.0-alpha em http://zeos.firmos.at/portal.php

2 – Crie uma pasta chamada zeos7 dentro da pasta lib do rad studio. Por exemplo, meu rad studio está em c:\Arquivos de programas\codegear\rad studio\6.0\lib, então meu diretório base será:  c:\arquivos de programas\codegear\rad studio\6.0\lib\zeos7

3 – Descompacte os arquivos dentro do diretório recem criado no ítem 2.

4 – Com o delphi 2009/2010 aberto, vá em file -open project (ctrl+f11) e abra o arquivo zeosdbo.groupproj, dentro de c:\Arquivos de programas\codegear\rad studio\6.0\lib\zeos7\packages\delphi12

5 – vá ao menu project – build all projects

6 – Antes de continuar, se você estiver usando o Windows Vista ou Windows 7 com o UAC habilitado, você terá que dar permissão total para a pasta zeos7 criada, caso contrário não irá funcionar.

7 – Agora, antes da instalação vá ao menu Tools – Options – Environment Options – Delphi Options – Library – win 32 e adicione o caminho a seguir no Library Path: $(bds)\lib\zeos7\packages\delphi12\build

8 – Feito isto, minimize o delphi, abra o diretório c:\Arquivos de programas\codegear\rad studio\6.0\lib\zeos7\packages\delphi12\build, selecione todos os arquivos “.bpl” copie-os e cole-o dentro da pasta bpl do rad studio: c:\users\public\documents\rad studio\6.0\bpl

9 – Volte ao delphi vá ao menu View – Project Manager (ctrl + atl + f11). Selecione e compile as bpls abaixo, uma a uma. Para compilar, clique com o botão direto sobre o bpl. é a primeira opção(Compile).

– zcore120.bpl
– zplain120.bpl
– zparsesql120.bpl
– zdbc120.blq
– zcomponent120.bpl
– zcomponentdesign120.bpl


10 – Depois de compiladas, clique com o botão direito sobre o pacote ZComponentDesign120.bpl (o único em negrito) e clique em Install.

11 – Pronto, feche tudo (File – Close All). Crie um novo projeto e veja que os componentes já podem ser utilizados.

quarta-feira, 5 de outubro de 2011

Delphi - CheckBox no DBGrid.

Ola Pessoal,

Após um tempo de turbulência no trabalho, mais um post.


Estava desenvolvendo mais um sistema para um cliente e me deparei com uma duvida.
- Criei uma tabela nova pro cliente, com um campo Boolean.
- Coloquei um DBGrid para ele acessar essa tabela (adicionar, remover, editar e excluir).
- E um DBNavigator

Uma tabela simples mesmo, possível de controlar com um DBNavigator. Só que fiquei pensando: Porque eu não coloco um simples CheckBox pro cliente neste campo boolean, pra evitar que ele tenha que ficar digitando FALSE/TRUE. Um clique e pronto!

Vamos ao código pra fazer isso ;-)

1) Crie seu formulário, com o DBGrid conectado a tabela.
2) Selecione o seu DBGrid e acione o evento OnDrawColumnCell.
3) Coloque o seguinte código

procedure Tfrm_tarefas.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Check: Integer;
  R: TRect;
begin
  if Column.FieldName = 'concluido' then //COLOQUE O NOME DA COLUNA, NO MEU CASO 'CONCLUIDO'
  begin
    DBGrid1.Canvas.FillRect(Rect);
    Check := 0;
    if tarefasconcluido.AsBoolean = true then
      Check := DFCS_CHECKED
    else
      Check := 0;
    R:=Rect;
    InflateRect(R,-2,-2); {Diminue o tamanho do CheckBox}
    DrawFrameControl(DBGrid1.Canvas.Handle,R,DFC_BUTTON, DFCS_BUTTONCHECK or Check);
  end;
end;

4) Selecione o seu DBGrid e acione o evento OnCellClick
5) Coloque o seguinte código:


procedure Tfrm_tarefas.DBGrid1CellClick(Column: TColumn);
begin
  tarefas.Edit;
  if tarefasconcluido.AsBoolean = true then
    tarefasconcluido.AsBoolean := false
  else
    tarefasconcluido.AsBoolean := true;
  tarefas.Post;
end;


É isso ai pessoal! Bem simples e fácil

Espero ter ajudado, Abraços

sexta-feira, 26 de agosto de 2011

Teste para entrevista de emprego - Linguagem C

Bom dia Pessoal,


Ontem, eu fiz uma entrevista de emprego e pensei: porque não colocar aqui no blog? se é pra ajudar né ;-)

Bom, vamos a elas (eram 3 questões).

Primeira questão - Famosa função para calcular fatorial
Lembrando que uma função recursiva deve sempre ter três preocupações.
1. Condição de parada
2. Formula do cálculo (Na pressa eu cometi um erro aqui :-s esqueci uma multiplicação, mas que inutiliza todo o código, espero que vocês não cometam o mesmo erro que eu).
3. Retorno da função

Vamos ao código
int Fatoria(int f){
  if (f <= 0)
    return (1);
 else
    return (f * Fatorial(f - 1));
}

Segunda questão - Criar uma lista duplamente linkada (Estou pensando em escrever um post só sobre isso, o charme da linguagem C são os ponteiro e as listas linkadas são muito funcional, quando BEM estruturadas).

typedef struct palavra{
 int posicao;
 char[100] palavra_portugues;
 char[100] palavra_ingles;
 Palavra *proximo;
 Palavra *anterior;
}Palavra;

typedef struct dicionario{
 int tamanho;
 Palavra *primeiro;
 Palavra *ultimo;
} Dicionario;


Terceira questão - Usando a estrutura definida na questão 2, criar uma função que faz uma consulta.

char[100] Busca(char[100] palavra_busca){
 char[100] palavra_retorno;
 Palavra *tmp;

 tmp = Dicionario->primeiro;
 while (tmp->palavra_portugues != palavra_busca && tmp != NULL){
   tmp = tmp->proximo;
 }

 if (tmp == NULL)
   palavra_retorno = "";
 else
   palavra_retorno = tmp->palavra_ingles;

 return(palavra_retorno);
}


É isso ai! Pessoal abraços

sexta-feira, 19 de agosto de 2011

Testando IDE NetBeans para desenvolvimento em Java.

Fazendo uns estudos, navegando, vendo as novidades sobre Desenvolvimento.
Li uma reportagem sobre o novo (não tão novo, apenas pra mim :-) ) IDE para desenvolvimento em Java, o NetBeans 7.0: http://www.infoq.com/br/news/2011/05/netbeans7

O que me chamou atenção foi o editor visual (GridBagLayout) e o GlassFish Server. Já sabia que o NetBeans da suporte a desenvolvimento em C/C++, PHP e HTML, mas para essas linguagens eu utilizo o NotePad++ e acho muito bom, só que o NotePad++ não tem edição gráfica para JavaForms (Swing).

Assim baixei o programa (www.netbeans.org), instalei e fiz uma calculadora para ver todo o potencial.

Vamos a ele:

Passo 1) Baixar o NetBeans e instala-lo - lembrando que deve ter um JDK compatível já instalado.

Passo 2) Abrir o NetBeans e aqui uma coisa me desagradou, demorou bastante para carrega-lo, deve ter sido por causa da procura de atualizações e etc. Deviam deixar para o usuário fazer manualmente.

Passo 3) Criar um projeto - funciona parecido com o Eclipse ou VisualStudio, tudo gira em torno de projetos.
Para isso use CTRL + SHIFT + N.
Na janela que se abre, escolha a Categoria: Java e Projeto: Aplicativo Java. Clique no botão Próximo.
Na próxima tela defina o nome do projeto como Calculadora e clique em finalizar.

Passo 4) Criando o frontend.
Para isso, no projeto Calculadora, clique com o botão direito do mouse e escolha Novo -> Outro.
Na janela que se abre, escolha a Categoria: Formulários GUI Swing e Tipos de arquivos: Formulário JFrame. Clique no botão Próximo.
Na próxima tela defina o nome como CalculadoraUI, pacote como my.calculadora.org e clique em finalizar.

Passo 5) Na parte central do programa, vai aparecer o Frame e no canto direito os componentes (swing) que podemos trabalhar.
Adicione 3 jLabels, 3 jTextFields e 3 jButtons - não sera uma calculadora completa, apenas a operação de soma.
As disposições deles dentro do frame, fica a critério de vocês.

Passo 6) Altere o texto dos jLabels.
Para isso, clique no primeiro jLabel (provavelmente nomeado como jLabel1) com o botão direito do mouse e escolha "Editar Texto". Modifique para "Primeiro numero" e pressione  Enter.
Faça o mesmo processo no segundo label e mude para "Segundo numero".
Faça o mesmo processo para o ultimo label e mude para "Resultado".

Passo 7) Limpar o texto dos jTextFields.
Para isso, clique com o botão direito do mouse sobre o jTextFields e remova o texto deles.

Passo 8) Modificar o texto dos botões.
Para isso, clique com o botão direito do mouse sobre os jButtons e modifique para "Somar", "Limpar" e "Sair".

Passo 9) Adicionar funcionalidade aos botões.
Para isso, clique no jButton-Sair com o botão direito e escolha a opção: Eventos->Action->ActionPerformed.
Coloque o seguinte código na função criada pela IDE: System.exit(0);

Clique no jButton-Limpar com o botão direito e escolha a opção:  Eventos->Action->ActionPerformed.
Coloque o seguinte código na função criada pela IDE:
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");

Clique no jButton-Somar com o botão direito e escolha a opção:  Eventos->Action->ActionPerformed.
Coloque o seguinte código na função criada pela IDE:

float num1, num2, result;
num1 = Float.parseFloat(jTextField1.getText());
num2 = Float.parseFloat(jTextField2.getText());
result = num1 + num2;
jTextField3.setText(String.valueOf(result));

Passo 10) A nossa calculadora simples esta pronta, só falta rodar e testa-lo ;-)
Para isso, Pressione F6 ou menu Executar->Executar projeto principal...


Conclusões: Me agradou muito o GridBagLayout, sendo que escrever o código para posicionamento dos componentes swing e os eventos, toma um tempo razoável do programador, disperdicio de tempo pra mim. Agora não mais ;-)
Quanto ao GlassFish eu não testei, principalmente porque uso o TomCat. Mas me disseram que você pode ter e gerenciar os dois servers no NetBeans, isso é muito bom! Verei mais depois.
A interface do NetBeans é muito boa, limpa... acesso aos comandos é intuitivo, fácil.
Primeira impressão, dou uma nota 8,5 e começarei a utiliza-lo para programas em Java ;-)


Bom! é isso ai gente! um abração!

sexta-feira, 29 de julho de 2011

Formulário Dinâmico, adicionando varios input text

Ola,


Estavamos com uma baita dificuldade na loja hoje, desenvolvendo um site para um cliente onde deviamos criar um formulário padrão com 6 ou 7 campos e a medida que o usuário ia clicando no botão 'incluir +1', adicionavamos mais um/dois input do tipo text no formulário.

Lembro de uma certa vez, um aluno me perguntar sobre isso.

Então ai vai a forma como eu resolvi isso... Acredito que o nome certo para isso seria Formulário Dinâmico, certo? Caso não opinem que eu mudo ;-) porque busquei na internet por formulário dinâmico e não achei nada do que precisava.

Vamos ao código:

Percebam que eu usei a passagem de parâmetro pelo método GET.
Um problema que enfrento com a programação para internet é que só durante o carregamento da página é processado o código, então como aumentar a quantidade de campos de um formulário? Resolvi isso com GET, pois a informação esta sempre acessível na URL (a GOOGLE usa o mesmo método, você pode pegar a URL gerado pelo google-maps copiar e colar em qualquer navegador que funciona, dai a dica pra resolver meu problema).

<?
$quant=0;
if (isset($_GET["quant"]))
$quant = $_GET["quant"];
?>
<html>
<head>
<title> Inscrições </title>
...
Uma função em JavaScript para que ele aumente o contador 'quant', que esta armazenado em um input do tipo hidden(escondido).
...

<script language="JavaScript">
function incluir()
{
var url = window.location;
var quant = document.inscricao.quant.value;
quant++;
document.inscricao.quant.value = quant;
document.inscricao.action=url;
document.inscricao.submit();
}
</script>
...
Vejam que eu acesso as informações com GET, caso a informação esteja acessível na URL coloco no input ou deixo em vazio. E o FOR que controla a quantidade de input´s gerados.
...

<form id="inscricao" action="cadastrar.php" method="GET" name="inscricao" />
<input type="hidden" name="quant" value="<?
if (isset($_GET["quant"]))
echo $_GET["quant"];
else
echo "0";
?>">
<? for ($i=0; $i<=$quant; $i++){ ?>
&nbsp; Nome:<input type="text"  name="nome" size="70" value="<?
if (isset($_GET["nome"]))
echo $_GET["nome"];
?>"/><br/>
&nbsp; Município:<input type="text"  name="municipio" size="60" value="<?
if (isset($_GET["municipio"]))
echo $_GET["municipio"];
?>"/><br/>
<? } ?>
<br/>

<center><input type="submit" id="mais" value="Incluir + 1" onClick="javascript:incluir();"/>
<input type="reset" id="visualizar" value="Visualizar" />
<input type="reset" id="editar" value="Editar" />
<input type="reset" id="limpar" value="Limpar" />
<input type="submit" id="gravar" value="Gravar" /></center>
   </form>

Espero realmente que tenha ajudado. Essa foi a forma que encontrei de resolver.
Ainda não pensei em como salvar esses dados no banco de dados, é um numero incerto de campos a serem salvos, mas assim que implementar o código coloco para vocês aqui.
Pensando rapidamente, acho que nem sera tão difícil pois a quantidade de campos esta guardado no campo QUANT e sera acessível na URL pelo método GET.


Um grande abraço, Emanuel

quarta-feira, 20 de julho de 2011

Decodificando Data.

Ola Pessoal,


Atendendo a mais um pedido de um ex-aluno, vamos ver como decodificar uma data no Delphi.

Neste exemplo usarei a função DecodeDate(), mas existem outras formas de fazer a decodificação.
Lembrando que estou utilizando Delphi7.

Vamos a utilização deste em um programa meu:


procedure Tfrm_Formulario.FormActivate(Sender: TObject);
var
  dia, mes, ano:word;
begin
  DecodeDate(Date, ano, mes, dia);
  mske_data_inic.Text := '01/01/'+IntToStr(ano);
  mske_data_final.Text := DateToStr(now);
end;


Espero ter ajudado mais uma vez.

Abraços, Emanuel

quinta-feira, 14 de julho de 2011

Problema em salva ponto flutuante no banco de dados.

Ola pessoal,


Recebi uma duvida de um ex-aluno e achei que seria mais um dica interessante pra colocar aqui.

Acontece muito este problema dependendo da forma como você definiu seu banco de dados ou definiram(o que é comum em grandes empresas, este procedimento ser feito por um DB manager).

Sem controle do banco de dados você pode se deparar com o seguinte problema: Is not a valid floating point value.

Exemplo: "12.345,67 is not a valid floating point value"

Este problema acontece pela simples razão de o DB não aceitar o '.' na variável.

O correto seria 12345,67. Então para resolver isso, utilizo a função StringReplace no Delphi.

valor := '12.345,67';
Exemplo: dm.tabela.FiealdByName('valor').asString := StringReplace(valor,'.','',[rfReplaceAll]);
ShowMessage(valor); // Saida: 12345,67


Isso ai! até a próxima!


Abraços

domingo, 3 de julho de 2011

Inserção em banco de dados com múltiplas interfaces em rede (web, desktop, celular).

Ola pessoal,


Tentando manter um sequência de posts, mas falo para vocês! esta difícil, muito trabalho, sistemas a desenvolver, sites, estudos.

Bom! a ideia deste post me ocorreu após uma conversa com um amigo da área. Para mim é solução fácil mas que as vezes pode complicar para os novatos ou os que não estão acostumados a desenvolver sistemas em rede. Então ai vai!

Primeiro, vamos a descrição do sistema desse meu amigo, talvez se assemalha ao de vocês:

Um servidor dedicado a um Banco de Dados em MySQL.
Uma tabela principal (Ordem de Serviço) que se conecta com varias outras tabelas pelo código.
Então temos uma idéia da estrutura:
TabelaOrdemServico - CampoCódigo, ..., CampoCodCliente, CampoCodMotorista, CampoCodVeiculo;
TabelaCliente - CampoCodCliente, CampoNome, ...;
TabelaMotorista - CampoCodMotorista, CampoNome, CampoRG, ...;
TabelaVeiculo - CampoCodVeiculo, CampoDescricao, ...;
TabelaServicos - CampoCodServico, CampoDescricao, ..., CampoCodOrdemServico.

Como vocês podem perceber o Relacionamento esta definido nos Códigos e estão definidos como  AutoIncremental.

O problema do meu amigo era que várias interfaces (Web, Desktop e Celular) -terminais faziam inserções simultâneas. Ele não sabia como controla os códigos gerados para informar o usuário.

Neste caso eu não faço a exibição do código porque quem define este código é o próprio Banco de Dados. Só o faço no final da inserção.

Quem quiser exibir o código no início. Uma solução é você modificar os campos para não serem AutoIncrementais e fazer com que seu programa gere o código. Mas mesmo assim ocorreram alguns problemas em sistemas de rede.

Meus programas quando exigem a exibição do código na tela inicial, funcionam em duas etapas para controle do código.

Primeiro eu verifico o ultimo registro no banco de dados e exibo para o usuário este ultimo código + 1.
Por exemplo: se tivermos 10 registros, mostro que a próxima inserção sera á 11.
Só que se dois terminais abrirem simultaneamente, os dois exibiram o código 11.

Pra resolver isso temos a segunda etapa:
Os dois terminais estão exibindo o código 11 e quem salvar primeiro, pegara o código. O que acontecerá com o segundo terminal? Temos que estar preparado para esse caso.
Eu desenvolvo atualmente em Delphi então mostro a baixo o meu código.


if (dm.ordem_servico.Locate('codigo',codigo,[])) then
    begin
      Query_pega_ultimo_codigo.Close;
      Query_pega_ultimo_codigo.Open;
      Query_pega_ultimo_codigo.Last;
      ShowMessage('Ordem de Serviço gerado com novo código: '+IntToStr(Query_pega_ultimo_codigo.FieldByName('codigo').AsInteger + 1));
      Query_pega_ultimo_codigo.Close;
    end;

Que ele apenas faz uma verificação, caso tente salvar com código existente, ele informara o usuário que o sistemas salvou com outro código (neste caso o código 12).

É isso ai gente! Simples e rápido ;-) E funcional! O mais importante porque utilizo esta idéia em muitos programas e funciona com vários bancos de dados (access, mysql, postgre, ...).

Espero que eu tenha ajudado os novatos já que programação em rede realmente exige mais atenção do que o usual, mas que com um pouco de prática se supera isso.


Abraços

sábado, 18 de junho de 2011

Colocando mascara de moeda em um MaskEdit - Delphi7.

Algumas vezes é necessário utilizar um MaskEdit com mascara de moeda para manipular os dados antes de serem salvos no Banco de Dados.

Eu recomendo utilizar DBEdit conectado a uma tabela e definir a propriedade Currency do campo como True.
Mais fácil e mais rápido: Componente Table -> Campo (float) -> Propriedade Currency = True.

Mas, como eu disse, caso seja necessário utilizar MaskEdit ai vai a mascara que devem utilizar: R$ 999,99;0;


E caso queiram criar a sua própria mascara para um MaskEdit, ai vai algumas explicações de como utiliza-lo:


A máscara basicamente consiste de três campos, separados por ponto e vírgula. A primeira parte é a máscara propriamente dita.
A segunda parte determina se os caracteres fixos devem ser ou não salvos com a máscara (ex: /, -, (, ...).
A terceira parte da máscara representa o caracter em branco, podendo ser substituído por outro (ex: _, @, ...).

Caracteres especiais utilizados com a máscara:

! Faz com que a digitação da máscara fique parada no primeiro caracter, fazendo com que os caracteres digitados que se movam. Ex: !;0;_

> Todos os caracteres alfabéticos digitados após este símbolo serão convertidos para maiúsculos. Ex: >aaa;0;_

< Todos os caracteres alfabéticos digitados após este símbolo serão convertidos para minúsculos. Ex: <aaa;0;_

<> Anula o uso dos caracteres > e <. Ex: >aaa<>aaa;0;_

Utilizado para marcar determinado caractere não especial como fixo, não podendo sobrescrevê-lo. Ex: !\(999\)000-0000;0;_

L Caracteres alfabéticos (A-Z, a-z.) de preenchimento obrigatório. Ex: LLL;1;_

l (Letra ele minúscula) Caracteres alfabéticos (A-Z, a-z.) de preenchimento opcional. Ex: lll;1;_

A Caracteres alfanuméricos (A-Z, a-z, 0-9) de preenchimento obrigatório. Ex: AAA;1;_

a Caracteres alfanuméricos (A-Z, a-z, 0-9) de preenchimento opcional. Ex: aaa;1;_

C Exige preenchimento obrigatório com qualquer caractere para a posição. Ex: CCC;1;_

c Permite qualquer caractere para a posição de preenchimento opcional. Ex: ccc;1;_

0 Caracteres numéricos (0-9) de preenchimento obrigatório. Ex: 000;1;_

9 Caracteres numéricos (0-9) de preenchimento opcional. Ex: 999;1;_

# Caracteres numéricos (0-9) e os sinais de - ou + de preenchimento opcional. Ex: ###;1;_

: Utilizado como separador de horas, minutos e segundos. Ex: !00:00:00;1;_

/ Utilizado como separador de dia, mês e ano. Ex: !99/99/9999;1;_

; Separa os três campos da máscara.

_ Caractere usado normalmente nas posições do campo ainda não preenchidas.



Abraços e até a próxima

sexta-feira, 17 de junho de 2011

Apresentação

Ola!

Estou começando este blog com o intuito de compartilhar meus conhecimentos na programação com outros programadores (que possam eventualmente colaborar, perguntar, etc). E utiliza-lo como uma forma de guardar todo o conhecimento adquirido durante os meus anos de trabalho.

Me formei em Ciência da Computação pela UNIVAP em 2003. De lá até aqui (17/06/2011) são 8 anos de programação. Neste tempo aprendi várias linguagens de programação (Pascal, C e Java na faculdade - ASP, PHP, JavaScript, C++, SQL, PL/SQL, FORTRAN, XML, J2ME, CSV, SVN, UML, DotProject - nas empresas que trabalhei). Ou seja, uma infinidade de ferramentas que nós programadores utiliza-mos.

Um ou outro conhecimento é perdido, devido a quantidade de informação que lidamos hoje em dia. Alguns essenciais e as vezes acabo perdendo muito tempo procurando na internet, um "truque" simples por exemplo  mas que ajuda muito!
Aqui eles permaneceram acessíveis pra mim e pra outros programadores se assim desejarem.

Tentarei escrever sobre todas elas, mas darei enfase inicialmente as linguagens que trabalho hoje Delphi7 e PHP que fazem parte do meu dia-a-dia e a Java que é a minha linguagem favorita.

Aliás! Postarei material de Ubuntu também, eu gosto muito, utilizo no meu notebook. Mas terá tópicos em Windows também pois desenvolvo programas para usuários Windows, fazer o que!

Que Deus me ajude nessa encruzilhada :-)

Abraços, Emanuel