Autor Tópico: Gerador de código do tipo: AA0001A01  (Lida 1587 vezes)

Robert Berbert

  • Expert
  • *****
  • Mensagens: 769
  • Desenvolver é sempre estar se atualizando.
    • Conesoft
    • Email
Gerador de código do tipo: AA0001A01
« Online: Julho 11, 2012, 02:20:56 pm »
Pessoal eu fiz um código para gerar códigos: de AA0001A01 até ZZ9999Z99

Vou disponibilizar aqui para qualquer que decidir utilizar. Talvez até dê para melhorar o código, mas este funciona direitinho.

Código: [Selecionar]
$check_sql = "SELECT CHA001_ID"
   . " FROM cha001 ORDER BY CHA001_ID DESC LIMIT 1";
sc_lookup(rs, $check_sql);

if (isset({rs[0][0]}))
{
$cha = {rs[0][0]};
// Array de Letras
$alfa = array("A", "B", "C", "D", "E",
  "F", "G", "H", "I", "J",
  "K", "L", "M", "N", "O",
  "P", "Q", "R", "S", "T",
  "U", "V", "W", "X", "Y","Z"
  );

// Variável de teste, descomente para testar o código.
//$cha = "BZ9999Z99";

// Tamanho array de letras
$count = count($alfa);

// Validações Final do código
$final = $cha[7].$cha[8];
$final = (int) $final;
$final = $final + 1;
if ($final < 10) {
$final = 0 . $final;
}
else if($final == 100) {
$final = "00";
}

// Validações Meio do código
$meio = $cha[2].$cha[3].$cha[4].$cha[5];
$meio = (int) $meio;
if ($meio < 10) {
$meio = "000".$meio;
}
elseif ($meio < 100) {
$meio = "00".$meio;
}
elseif ($meio < 1000) {
$meio = "0".$meio;
}

// Verifica Letra 3
for ($i=0; $i<$count; $i++) {
if ($alfa[$i] == $cha[6]) {
$alfa3 = $alfa[$i];
$alfa2 = $cha[1];
$alfa1 = $cha[0];
if ($final == "00" && $i < 25) {
$alfa3 = $alfa[$i+1];
}
else if ($i == 25 && $final == "00") {
$alfa3 = $alfa[0];
$meio = $meio+1;
if ($meio < 10) {
$meio = "000".$meio;
}
elseif ($meio < 100) {
$meio = "00".$meio;
}
elseif ($meio < 1000) {
$meio = "0".$meio;
}
}
if ($i == 25 && $final == "00" && $meio == 10000) {
$meio = "0001";
// Verifica Letra 2
for ($j=0; $j<$count; $j++) {
if ($alfa[$j] == $cha[1]) {
if ($j == 25) {
$alfa2 = $alfa[0];
// Verifica Letra 1
for ($k=0; $k<$count; $k++) {
if ($alfa[$k] == $cha[0]) {
$alfa1 = $alfa[$k+1];
}
}
}
else {
$alfa2 = $alfa[$j+1];
}
}
}
}
}
}

// Código pronto
$chamaCode = $alfa1.$alfa2.$meio.$alfa3.$final;
sc_set_global($chamaCode);
// Visualização de teste, descomente para visualizar o teste.
// echo $chamaCode;
}
else
{
$chamaCode = "AA0001A01";
sc_set_global($chamaCode);
}

Abração galera.

Robert Berbert
-- Design ou programador eis a questão.

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:Gerador de código do tipo: AA0001A01
« Responder #1 Online: Outubro 06, 2012, 11:15:12 am »
Irmão, não sei bem o pq vc escolheu criar um codigo assim mas tá legal..

eu fiz uma com 4 linhas...


esse cria um hash da datatime com 10 digitos.... a quantidade de digitos vc escolhe... o certo é que nunca vc conseguirá repetir o codigo..

function SetNumeroAp($id_ap) // aqui eu recebo o ID da tabela que quero um código
{
   $numero_ap = strtoupper(substr(md5(time()),0,10)); // gero o código com 10 digitos
   sc_exec_sql("UPDATE autoriza_pagamento SET numero_ap = '$numero_ap' WHERE id_ap = $id_ap");// mando ele para minha tabela

Prontinho... Mais uma modelo

Flow
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Robert Berbert

  • Expert
  • *****
  • Mensagens: 769
  • Desenvolver é sempre estar se atualizando.
    • Conesoft
    • Email
Re:Gerador de código do tipo: AA0001A01
« Responder #2 Online: Outubro 08, 2012, 12:11:03 pm »
aiuehuaehui, Eu escolhi não foi meu cliente que escolheu. Você acha que me daria ao trabalho de fazer isso se não fosse obrigado. xD
-- Design ou programador eis a questão.

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:Gerador de código do tipo: AA0001A01
« Responder #3 Online: Outubro 08, 2012, 12:23:05 pm »
Eu imaginei.

Agora esse meu hash quando criado para varios registros em apenas 1( um) click
Seria interessante usar um sleep(1); no for ou wile, para dar um time de 1 segundo a cada
Codigo.
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775