Ir para conteúdo

POWERED BY:

Arquivado

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

Bruno Trinchão

[Resolvido] Gerador de codigo sequencial

Recommended Posts

Olá pessoal,

sou novo por aqui.

Preciso muito da ajuda de vocês. Tenho uma tabela que quando quando eu inserir os dados queria que no campo codigo fosse gerado um codigo sequencial.

EX.:

A01

A02

A03...

A23

B01

B02

B03...

B23...

C01

C02

C03

C04

 

uma sequencia que primeiro vem a letra e depois numeros. A letra vai ate Z e o numero ate 99 sendo que quando o numero chegar a 99, ompróximo registro já apareça coma letra seguinte.

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php

/**
*  Gera o próximo código sequencial 
*  com base no código informado
*/
function gera_id( $id )
{
$char = substr( $id, 0, 1 );
$num  = ( int ) substr( $id, 1 );
return ( ( $num + 1 ) > 99 ) ? sprintf( '%s00', chr( ord( $char ) + 1 ) ) : sprintf( '%s%02s', $char, $num + 1 );
}

/**
*  Testando
*/
$id = 'A00';
for( $i = 1; $i < 2600; $i++ )
{
$id = gera_id( $id );
echo $id, '<br/>';	
}

/**
 Fragmento da saída
F95
F96
F97
F98
F99
G00
G01
G02
G03
G04
G05
*/

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dica, implementando o algoritmo do Carlos Coelho, você vai selecionar o último registro da tabela, e enviar o seu código pra essa função, então vai receber o próximo pra inserir no banco

 

Carlos Coelho, implementação ficou bacana.

:clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que você fica limitado a 2600 códigos.

 

Fiz outra função que gera um total de 4569760000 códigos.

 

<?php
/**
*  Gera o próximo código sequencial 
*  com base no código informado
*/
function gera_id( $id )
{
$chars = str_split( substr( $id, 0, 4 ) );
$nums  = ( int ) substr( $id, 4 );
if( ( $nums + 1 ) > 9999 )
{
	for( $i = 3, $j = 2 ; $i >= 0; $i--, $j-- )
	{
		$char = ord( $chars[ $i ] ) + ( ( $i == 3 ) ? 1 : 0 );
		if( $char > 90 )
		{
			if( $i > 0 )
			{
				$chars[ $j ] = chr( ord( $chars[ $j ] ) + 1 );
				$chars[ $i ] = chr( 65 );
			}
		}
		else
		{
			$chars[ $i ] = chr( $char );
		}
	}
	return sprintf( '%s0000', implode( null, $chars ) );
}
else
{
	return sprintf( '%s%04s', implode( null, $chars ), $nums + 1 );
}
}
/**
*  Testando
*/
$id = 'AAAA0000';
for( $i = 1; $i <= 4569760000; $i++ )
{
$id = gera_id( $id );
echo $id, '<br/>';	
}

/**
 Fragmentos da saída

AAAA9999
AAAB0000
...
AAAZ9999
AABA0000
...
AABZ9999
AACA0000
...
AAZZ9999
ABAA0000
...
AZZZ9999
BAAA0000
...
YZZZ9999
ZAAA0000
...
ZYZZ9999
ZZAA0000
...
ZZZY9999
ZZZZ0000
...
ZZZZ9998
ZZZZ9999

*/
?>

 

Não encontrei bugs neste script, qualquer coisa é só falar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Carlos, acho que fica mais bacana fazer o seguinte, já que no alfabeto tem 26 letras, é ele pode ter mais do que 2600 registros, então os códigos iriam parar no Z99 .. sendo que o limite de cada código seria LETRA ( 0 até 99 ), verificar se a letra é a última, (Z99) , então gerar entre 100 até 199, A100 , A101, depois verificar, se o limite foi atingido novamente, ( Z199 ), então gerar entre 200 ~ 299 , assim por diante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, pegar o próxima seqüência não é difícil.

<?php
      function getRange( $code ) {
                $range = abs( array_pop( range( -1 , ( floor( substr( $code , 1 ) ) + 100 ) , 100 ) ) );
                return $range;
      }
      for( $i = 0; $i < 2600 ; $i += 100 ) {
              printf( 'from %d to %d <br />' , $i , getRange( sprintf( 'A%d' , $i ) ) );
      }

 

Saída:

from 0 to 99 
from 100 to 199 
from 200 to 299 
from 300 to 399 
from 400 to 499 
from 500 to 599 
from 600 to 699 
from 700 to 799 
from 800 to 899 
from 900 to 999 
from 1000 to 1099 
from 1100 to 1199 
from 1200 to 1299 
from 1300 to 1399 
from 1400 to 1499 
from 1500 to 1599 
from 1600 to 1699 
from 1700 to 1799 
from 1800 to 1899 
from 1900 to 1999 
from 2000 to 2099 
from 2100 to 2199 
from 2200 to 2299 
from 2300 to 2399 
from 2400 to 2499 
from 2500 to 2599 

Agora basta você verificar se está na última letra , por exemplo:

if( array_pop( range( 'A' , 'Z' ) ) == .. && .. == 99 )

Então pegar a próxima letra ( A ) e gerar as próximas letras entre '( ( range - 99 ) , range )'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia, sei que faz muito tempo que este post foi postado, mais alguém saberia me dizer, como implementaria esse gerador de códigos em um sistema de noticias, onde eu tenho duas Tabelas no Banco de Dados, uma de Cabeçalho e outra de Texto, onde eu Geraria o Código e este código seria a referencia entre as duas Tabelas. Desde já agradecido.

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.