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++){ ?>
Nome:<input type="text" name="nome" size="70" value="<?
if (isset($_GET["nome"]))
echo $_GET["nome"];
?>"/><br/>
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
sexta-feira, 29 de julho de 2011
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
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
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
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
Assinar:
Postagens (Atom)