Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fernando Mello

[Resolvido] Númeração Sequencial

Recommended Posts

Olá Pessoal,

 

Acabei de me cadastrar nesse conceituado site sombre diversas linguagens... e no meu caso é o PHP.

 

Sou iniciante em PHP, e por isso as minhas dúvidas postas aqui pode sem meio simples para quem já mexe legal com o desenvolvimento.

 

Eu fiz um formulários de cadastro com diversos campos e os mesmos são armazenados em um BD Myssql. Até ai esta tudo em ordem... faço o cadastro e ele é armazenado.

 

A minha dúvida é seguinte:

 

Após fazer o cadastro, eu clico no botão SALVAR e os dados vão para o BD. Depois disse gostaria que fosse gerando uma sequecia de número. Exemplo. A numeração começa assim 2010-000001, quando fizer outro cadastro gera o número 2010-000002 e assim por diante...

 

Confesso que não sei como fazer isso ! Se alguém puder me ajudar eu agradeço.

 

Fiquem com Deus !

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, a solução menos indolor para o seu caso seria, no banco de dados, a coluna marcada como PRIMARY KEY (chave primária) possuir o atributo ZEROFILL cpm comprimento de 6 (ou mais, ou menos, depende).

 

Assim, quando você inserir, atribuindo NULL à coluna desse índice, para que o AUTO INCREMENT da coluna defina o próximo valor automaticamente, dentre os argumentos de VALUE, do INSERT INTO, no banco, todos os caracteres "que sobrarem" serão preenchidos com zero, daí o sugestivo nome "zero fill" :D

 

Quanto ao 2010, na frente do ID, você REALMENTE precisa que o ano apareça dessa forma, nessa informação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá obrigado pela sua atenção...

 

Eu já tenho uma tabela chamada confiance no BD .... eu crio isso na mesma tabela, ou crio uma outra tabela ?

 

O número 2010-000001, se fosse possível eu gostaria de colocar sim o 2010 , ou qualquer outro informação antes do número para identicar que esse numero é de uma outra unidade.

 

Na verdade esse sistema que estou fazendo na NET , é um formulário que vai gerar "CARTÕES" saúde.... então é um formulários com todos os dados do paciente e quando clicar em gravar dados, será gerado um número, e esse número deve ser sequencial.

 

No caso do 2010 como falei é porque um unidade em uma cidade já usa o numero sequencial exemplo 0000001 e na outra cidade que vou implantar pela web, seria o 2010 para diferenciar a numeração !!!

 

Obrigado.... desculpe a minha ignorância .... mas sou iniciante em PHP !!! rsrsrsr

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, nesse caso, a coisa muda um pouco, para melhor, acredito eu.

 

Primeiro você teria de ter uma tabela onde cadastraria as unidades. Uma tabela simples, com uma coluna para a chave primária, outra para o código da unidade e uma terceira para uma descrição.

 

Podem haver outras mais, para abrigar endereço, CEP, telefone..., mas é opcional.

 

Então, na sua tabela confiance você mantém a coluna da chave primária intacta e adiciona outras colunas, a exemplo, cartão e unidade

 

A coluna cartão deverá abrigar os códigos dos mesmos e a coluna unidade o ID da unidade vindo da outra tabela.

 

No formulário, você pode fazer um menu dropdown onde o atributo value de cada option é o ID das unidades cadastradas no sistema e o "rótulo", isto é, a parte visível, o campo correspondente a descrição.

 

Lembre-se que os atributos não podem começar com números, logo, adicione um prefixo em texto.

 

Em síntese, você faria uma consulta sobre a tabela unidades, retornaria um array e montaria o menu em loop.

 

Depois de preenchido o formulário, o programa que receber removeria o prefixo do campo, para trabalhar apenas com o ID numérico.

 

Uma vez com esse ID, você faria uma consulta na tabela confiance para selecionar o maior valor [ MAX() ] do campo cartao onde (WHERE) a unidade corresponder com esse valor vindo do dropdown.

 

Então, você adiciona +1 à esse valor e insere o registro. Os zeros à esquerda seriam atribuídos automaticamente graças ao atributo ZEROFILL da coluna cartao

 

E, por fim, para montar o número final do cartão,que seria prefixado pelo código da unidade, bastaria retornar esse mesmo valor vindo do dropdown concatenado ao número gerado (o que você adicionou +1).

 

NOTA: O atributo ZEROFILL, se você usar o phpMyAdmin, você o encontra no menu dropdown Atributos quando estiver criando/alterando um campo de uma tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kra em relação a isso eu não gosto de utilizar campos AutoIncrement,por que se cadastrar um cliente por engano

e o cliente for excluido eu não vou poder reutilizar aquela numeração...

Eu faria assim

 

Estrutura da tabela

 

-- confiance --

id <-- esse sim autoincrement

numero <-- coloca tipo int

e o resto dos teus campos :D

O php faria assim

 

<?php
$busca = mysql_query("SELECT * FROM `confiance` ORDER BY id DESC LIMIT 1";
$array = mysql_fetch_array($busca);
$ulti  = $array["numero"];
$numero = $ulti+1; // Peguei o ultimo numero e somei 1
?>
Dai pra poder começar o sistema funcionar do jeito que você quer e so você inserir um registro

manualmente com o campo numero com valor "20100000"

dai o proximo registro que estaria valendo seria "20100001".

 

E meio que cambiarra mais comigo da certo :D

 

 

Xi quando eu postei o post do imaggens ainda não tava aqui,mais ta valendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

utilizaria mesma ideia do jeimysons... deixa o id autoincremente normalmente e cria um outro campo pode ser ate varchar ai você concatena o ano + ID gerado pelo autoincrement com o mysql_insert_id()... assim você fica com seu formato e garante que nao vai repetir a numeração e facilita tb para trocar no proximo ano

Compartilhar este post


Link para o post
Compartilhar em outros sites

manualmente com o campo numero com valor "20100000"

dai o proximo registro que estaria valendo seria "20100001".

Mas veja que a sua solução falha justamente na parte mais importante para ele. O 2010 não é um ano ou um número fixo e sim o código da unidade.

 

Assim como nas contas bancárias em que temos a Agência, é um número único que reprsenta a unidade física do banco.

 

Por exemplo, aqui na minha cidade, no Centro perto de onde trabalho, tem uma agência do Banco do Brasil cujo "ID" é 0308. Todas as contas dessa agência possuem esse número. Já na sua cidade pode e deve ser diferente.

 

No caso dele, todas as matrículas de clientes de, sei lá, Mogi das Cruzes (SP) vai ter prefixo diferente das de Caxias (RS), mesmo que o final do código seja o mesmo:

 

Exenplificando:

 

Supondo que Mogi tenha o código 1038 e Caxias 3810 pode perfeitamente existir as matrículas 1038000001 e 3810000001

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meus amigos como o Imaggens comentou é isso mesmo !!!

 

Vou explanar aqui melhor o que será realmente para tentar simplificar o entendimento para todos...

 

Estou com um formulário chamado cadastro.php que tem o seu banco em Mysql associado a tabela chamada "confiance" que é o nome do laborátorio na cidade. Esse formulário tem os campos do cadastro do paciente, se preferirem podem acessar para um melhor entendimento www.simsinam.com.br/confiance/cadastro.php. Até ai esta tudo ok.... faço o cadastro normalmente , depois clico em "SALVAR" e o cadastro é gravado na tabela "confiance" normalmente... como falei meus amigos até ai soube fazer !!!! rsrsrsrs

 

A lógica é o seguinte. Esse sistema é uma novidade para o laboratório que estou trabalhando... aqui em Piracicaba a unidade funciona com um sistema local feito em VB com o formulário igual e o próprio sistema gera o número de cartão que vai ser impresso no cartão do Cliente(paciente). Mais o laboratório resolveu fazer isso na WEB... ai criei o formulário e o BD que como comentei esta funcionando, mais agora não consigo gerar o número sequencial do cartão. A unidade em campinas é a unidade 2010... e os cartões que serão gerados em PHP baseado nos dados cadastrados nos banco irão seguir a seguinte sequencia. 2010-000001, 2010-00002, 2010-00003 e assim por diante , lembrando que 2010 é o numero da unidade e o restante será o numero do cartão.

 

Como sou iniciante em PHP confesso que não estou sabendo fazer isso... eu fiz alguma coisa meio simples mais esta gerando números aleatórios.... veja o exemplo....

 

www.simsinam.com.br/confiance/gera1.php vai abrir uma numeração... e se você atualizar a página ele gera outra numeração ..... bom isso eu consegui fazer... mas a idéia é como comentei acima !

 

Bom meus amigos desde já agradeço !!!

 

Fiquem com Deus !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quiser a numeração sequencial, como eu expus no post #4 acredito lhe atender. Apenas perceba que eu te dei a vara e a isca, pescar o peixe é contigo. ;)

 

Agora se quiser fazer um código ALEATÓRIO ÚNICO você tem duas opções:

 

Fazer o campo referente ao cartão ser ÚNICO (UNIQUE)

 

Ou

 

Ao invés de selecionar o maior valor de cartão, com MAX() e adicionar um, criar uma função/método de classe que gere um código aleatório e depois busque-o no banco, se já existir, volta e gera outro (e consulta de novo), se não existir, retorna ele.

 

Ambos os casos tem seus prós e contras.

 

No primeiro caso, mexendo na estrutura do banco, é válido para uma tabela com não muitos registros, visto que marcar um campo como UNIQUE faz com que, a cada novo INSERT/UPDATE a tabela INTEIRA seja consultada para apenas verificar aquele valor.

 

O pró desse método é que, numa tabela "pequena e leve", é basta apenas tratar o erro retornado.

 

No segundo caso, o pró é que você não se prende ao tamanho do BD, nem hoje nem amanhã, pois a comparação poderia ser feita com um simples in_array()

 

O contra é possibilidade, principalmente com o aumento do número de registros no BD, de serem necessárias muitas consultas sequenciais a cada novo código aleatório gerado, o que pode acabar pesando seu script.

 

Claro que você pode programar uma tarefa que atualize diariamente um arquivo local de cache com todos os códigos e buscar dele, ao invés do BD, mas daí fugimos do escopo do tópico, entrando numa análise de performance.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Imaggens

 

Obrigado pelo suporte que esta me dando como iniciante em PHP;

 

Bom eu fiz o seguinte e parece que esta dando certo ... Após um cadastro ele já esta gerando um número aultomático... esta gerando 10.0000001 ! Até ai beleza...

 

Criei uma tabela de teste como os seguintes campos:

 

id    int(11) auto...      
nome  varchar(20)       
registro  varchar(20)

Depois fiz um pequeno código , segue :

 

<?php
require("conexao.php");
$nome = $_POST["txtnome"];
$sel = mysql_query("SELECT * FROM teste ORDER BY id DESC LIMIT 1");
$l = mysql_fetch_array($sel);
$id = $l[id];
$posicao = $id+1;
$posicao2 = (int)$posicao;
$vr = str_pad($posicao2, 2010, "0", STR_PAD_LEFT);  
$data_atual = date("y");
$registro = $data_atual.".".$vr;
$sqlinsert = "INSERT INTO teste(id, nome, registro) VALUES ('','$nome','$registro')";
mysql_query($sqlinsert) or die("Não foi possivel inserir");
echo "Número gerando com sucesso !";
?>

Fazendo isso de teste , já deu certo, o numero esta sendo gerando....

 

Meu amigo , não sei agora aonde estou errando ...pois não consigo colocar 2010 e sim esta gerando 10 e outra coisa e que não esta dando sequencia... sempre que faço um novo cadastro ele gera 10-000001 e em seguinda ele gera em um novo o mesmo número 10-0000001 e não 10-0000002 ....

 

O que será que fiz de errado no código ?

 

Obrigado !

 

Fique com Deus !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, você está se confundindo e, por conseguinte, me confundindo também.

 

Pelo que você expôs no segundo post deu a entender que o prefixo (2010) seria o código da unidade, variante entre elas. Eu trabalhei uma explicação em cima desse conceito.

 

Mas agora, por esse código demonstrativo, está dando a entender que, de fato, você quer um ano, tal qual pressuposto pelo jeimysons no post #5

 

Pelo que você demonstrou ser o seu formulário (em http://www.simsinam.com.br/confiance/cadastro.php) a implementação do sugerida no post #4, apesar de adequada, jamais funcionaria, visto que, o que acredito ser o menu com as unidades (Unidades Confiance), sequer possui atributos value, como sugeri, para que você pudesse correlacionar informações das unidades com os cartões em tabelas distintas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu amigo, desculpe, se não fui bem claro... mais a sua lógica esta correta... na verdade 1010 é o numero da unidade.... sim .... só fiz o código para como teste para pegar o ano.... para ver se funcionava... e deu certo ....

 

<?php

require("conexao.php");

$nome = $_POST["txtnome"];

$sel = mysql_query("SELECT * FROM aula ORDER BY id DESC LIMIT 1");

$l = mysql_fetch_array($sel);

$id = $l[id];

$posicao = $id+1;

$posicao2 = (int)$posicao;

$vr = str_pad($posicao2, 10, "0", STR_PAD_LEFT);

$data_atual = date("y");

$registro = $data_atual.".".$vr;

$sqlinsert = "INSERT INTO aula(id, nome, registro) VALUES ('','$nome','$registro')";

mysql_query($sqlinsert) or die("Não foi possivel inserir");

echo "Número do cartão gerado com sucesso!";

?>

 

E feito assim deu certo... já esta gerando o numero sequencialmente 2010-000001, 2010-0000002 e assimpor diante !!!

 

Desculpe se lhe confundi.... mas como falei a sua lógica é correta... e esse código eu fiz só de teste e por sinal deu certo!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estarei marcando como Resolvido.

 

Qualquer necessita extra, desde que no mesmo contexto, nos avise, por MP, para reverter o status do tópico e prosseguir com o desenvolver do tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.