Fórum Alguem sabe se o Delphi tem algo assim? #177607
26/08/2003
0
Eu tenho um campo que conta a quantidade de itens em um pedido, que pode ir ate 200 itens mas o campo eh caracter de 2 posicoes, Se a qtd de itens for > que 99 numera os itens com letras
ex:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,......99, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE,......, BA, BB, BC, BD, BE,......CA, CB, CC, CD, CE,......)
Claudio_f
Curtir tópico
+ 0Posts
26/08/2003
Castilho
Gostei + 0
26/08/2003
Eniorm
tá querendo criar um gerador de senha é ?!?!?!
Gostei + 0
26/08/2003
Allen74
Quais são as letras permitidas no código? Vão de A até Z, mas estão incluídos os caracteres da língua inglesa (K,W,Y)?
A sequência começando com A, vai de A0, A1 até AZ para depois começar com B0 até BZ?
Pelas minhas contas, o item de número 200 seria representado pelo código CS ao invés de DM, se o alfabeto definido para a representação fosse:
[b:5d5a6384f3]0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ[/b:5d5a6384f3]
Por isso imaginei que algumas letras podem não estar contidas no código ou então a sequência não vai até a última letra do alfabeto.
Gostei + 0
27/08/2003
Okama
Gostei + 0
27/08/2003
Claudio_f
Eh isso mesmo, eu pretendo incluir todas as letras, inclusive (K,W,Y), A sequencia comecaria (depois do item 99) com A0, A1 ate AZ, e depois comecaria novamente com a letra B0 ate BZ.
O alfabeto seria mesmo: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.
Eu tinha pensado em fazer como o Castilho sugeriu criar uma tabela com todas as letras do alfabeto, mas penso que a gravacao de um pedido grande se tornaria muito lenta, mas se nao tiver outra maneira vou ter de fazer assim mesmo.
O banco que eu uso eh Oracle, e o sistema atual faz isso mas eh desenvolvido em um dialeto de Clipper usado pela Microsiga, e eu nao tenho acesso aos fontes para saber como ele faz.
---
Oi Okama, estou desenvolvendo um modulo a parte do sistema que usamos na empresa, mas usando a mesma base de dados, por isso nao posso alterar o tamanho e as caracteristicas dos campos.
Gostei + 0
27/08/2003
Nildo
Acho que agora seria uma hora perfeita para se auto-desafiar com esta lógica de programação.
Uma dica: Ord(´A´) = 65
Gostei + 0
27/08/2003
Allen74
Neste caso, você pode utilizar estas duas funções que criei:
function Codifica (num : integer) : string; const Alfabeto = ´0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ´; var D0,D1,Dif : integer; begin Result := ´´; Dif := 10 * Length(Alfabeto) - 100; if (num >= 0) and (num <= 99) then Result := IntToStr(num) else begin num := num + Dif; D0 := num mod Length(Alfabeto) + 1; D1 := num div Length(Alfabeto) + 1; Result := Alfabeto[D1]+Alfabeto[D0]; end; end; function Decodifica (cod : string) : integer; const Alfabeto = ´0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ´; var D0,D1,Dif : integer; begin Result := -1; Dif := 10 * Length(Alfabeto) - 100; If Length(Cod) in [1..2] then begin If Length(cod) = 1 then Cod := ´0´+Cod; D0 := Pos(Cod[2], Alfabeto) - 1; D1 := Pos(Cod[1], Alfabeto) - 1; If (D0 < 10) and (D1 < 10) then Result := D1 * 10 + D0 else Result := (D1 * Length(Alfabeto) + D0) - Dif; end; end;
A primeira irá codificar seu inteiro para uma string de dois caracteres, de acordo com as regras já estabelecidas e com o alfabeto informado. A segunda faz o caminho inverso.
O limite de representação será 1035, que corresponde a ZZ
Gostei + 0
27/08/2003
Claudio_f
Allen vou testar as tuas funcoes, valeu pela forca.
:D
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)