Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Gerar código com zeros à esquerda


Gabriel Cabral

Pergunta

Bom dia galera...então...estou com um problema grave na geração de código incremental....

uso tabela dbf [sim...já estou largando ela, é que neste caso preciso usá-la]

e tenho algumas condições nessa geração de código....

o campo deve ter 5 caracteres sempre....então, se o número do código não tiver 5 caracteres, ele deve ser preenchido com zeros à esquerda....até aí tudo bem...

mas ele só preenche com zeros à esquerda caso eu digite algo no DBEdit....pois há a possibilidade do usuário digitar um código, sem seguir a ordem...

se eu deixo a DBEdit vazia, para prencher com o próximo número, usando o SELECT MAX, ele não preenche com zeros....

exemplo....a tabela está vazia....tenho a condição de que se ela estiver vazia, o campo é preenchido com 00001.

Lembrando que esse campo é string

então clico em novo, deixo vazia a DBEdit do codigo e clico em gravar...

O campo é preenchido com 00001.

Em seguida, clico em Novo, preencho o código com 2, e clico em gravar....o campo é preenchido com 00002

Depois, se clico em novo, deixo a DBEdit vazia e clico em gravar, o campo é preenchido com 3, e não com 00003.

vou postar aqui os códigos que estou utilizando para isso...

se alguém conseguir me ajudar, ficarei muito grato.

Botão Gravar - Evento OnClick

procedure TfrmCadForn.btnGravarClick(Sender: TObject);
var i: integer;
begin

if dm.tblCadForn.RecordCount = 0 then
    txtCadForn_CodForn.Text := '00001';


  if not (txtCadForn_CodForn.Text = '') then
  begin
    for i:=1 to txtCadForn_CodForn.MaxLength - length(txtCadForn_CodForn.Text) do
      txtCadForn_CodForn.Text := '0' + txtCadForn_CodForn.Text;
  end;


with dm.QueryBuscaForn do
begin
  Close;
  SQL.Clear;

  SQL.Add('SELECT * FROM FINAFOR.dbf');
  SQL.Add('WHERE FORCOD = :pCODIGO');

  ParambyName('pCODIGO').AsString := txtCadForn_CodForn.Text;
  Open;

  if not(IsEmpty) then
  begin
    ShowMessage('       Registro já existente!');
    frmCadForn.btnAlterarClick(Sender);
  end
  else
  begin
    dm.tblCadForn.Post;
    dm.tblCadForn.Last;
  end;
end;

end;
Evento BeforePost
procedure Tdm.tblCadFornBeforePost(DataSet: TDataSet);
begin


  if not tblCadForn.FieldByName('FORCOD').IsNull then
    Exit;

  QueryMaxForn.DatabaseName := tblCadForn.DatabaseName;
  QueryMaxForn.SQL.Clear;
  QueryMaxForn.SQL.Add('SELECT MAX (FORCOD) FROM FINAFOR.dbf');
  QueryMaxForn.Open;

  try
    tblCadForn.FieldByName('FORCOD').AsString := FloatToStr(StrToFloat(QueryMaxForn.Fields[0].AsString)+1);
    finally
    QueryMaxForn.Close;
  end;

end;

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Não há nada de mal em usar .dbf...

Inclusive, você pode usar autoinc nas suas tabelas .dbf, apenas observando que não conseguiria mais abrí-las com o Clipper ou dBaseIIIPlus, pois elas passariam a ser VisualDbase7...

Bom... quando ao seu código... eu iria talvez preferir usar isso:

No OnExit do campo Codigo no form:

Try

codigoEdit.Text := FormatFloat('00000', StrToInt(codigoEdit.Text));

Except

ShowMessage('O Código digitado não é válido. Será preenchido com zeros!');

codigoEdit.Text := '00000';

End;

Ok?

Espero haver ajudado...

Link para o comentário
Compartilhar em outros sites

  • 0

não consigo usar autoincremento nas tabelas dbf....pelo menos no database desktop eu não consigo colocar isso...

E quanto ao código, não deu muito certo, não....

o problema seria mesmo quanto a prencher com zeros o max+1.....pois o programa só pega o max+1 e não preenche com zeros...

e quando o código digitado não for válido, não pode preencher tudo com zeros :lol:

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

O DatabaseDesktop só permite autoincremento nas tabelas Paradox...

Então, seria melhor você se familiarizar com a criação/alteração de tabelas usando TSQL, no DBExplorer (vem com o Delphi também)...

Em troca de criar uma tabela no DatabaseDesktop, use uma query... exemplo:

create table ":acme:produtos.dbf"

(idproduto autoinc,

nome char(40),

unidade char(3)

);

Quanto ao código ser preenchido com zeros, ficaria por sua conta validar isso também...

Assim, se o código ficou inválido, você não deverá gravá-lo...

No evento OnClick do botão Confirmar, poderia colocar:

Begin

If CodigoEdit.Text='00000' then

Begin

CodigoEdit.SetFocus; // Focar novamente o campo Código ou outro...

Exit;

End;

{}

// * Resto da procedure para salvar o registro...

.

.

End;

Outra coisa importante é que embora você possar ter alguma dificuldade em implementar um código "auto-incremento" agora, os benefícios que isso irá trazer serão imensos... pois isso de numeração automática não poderia, nesta altura do campeonato, estar tomando o seu tempo de desenvolvimento... e a outra coisa é a definição de chave única na tabela, que também evita que você fique perdendo tempo e matutando com coisas que já têm a solução pronta, no mínimo, uns 10 anos atrás...

Ok?

* (pessoal... me ajuda aí... acho que a primeira vez que vi um campo autoinc foi com paradox quando escrevia programas em turbo-pascal lá pelo de 1994 eu acho... mas acho que o Paradox surgiu ainda nos anos 80... agora... quando surgiu o campo autoinc?)

Link para o comentário
Compartilhar em outros sites

  • 0
O DatabaseDesktop só permite autoincremento nas tabelas Paradox...

Então, seria melhor você se familiarizar com a criação/alteração de tabelas usando TSQL, no DBExplorer (vem com o Delphi também)...

Em troca de criar uma tabela no DatabaseDesktop, use uma query... exemplo:

create table ":acme:produtos.dbf"

(idproduto autoinc,

nome char(40),

unidade char(3)

);

Quanto ao código ser preenchido com zeros, ficaria por sua conta validar isso também...

Assim, se o código ficou inválido, você não deverá gravá-lo...

No evento OnClick do botão Confirmar, poderia colocar:

Begin

If CodigoEdit.Text='00000' then

Begin

CodigoEdit.SetFocus; // Focar novamente o campo Código ou outro...

Exit;

End;

{}

// * Resto da procedure para salvar o registro...

.

.

End;

Outra coisa importante é que embora você possar ter alguma dificuldade em implementar um código "auto-incremento" agora, os benefícios que isso irá trazer serão imensos... pois isso de numeração automática não poderia, nesta altura do campeonato, estar tomando o seu tempo de desenvolvimento... e a outra coisa é a definição de chave única na tabela, que também evita que você fique perdendo tempo e matutando com coisas que já têm a solução pronta, no mínimo, uns 10 anos atrás...

Ok?

* (pessoal... me ajuda aí... acho que a primeira vez que vi um campo autoinc foi com paradox quando escrevia programas em turbo-pascal lá pelo de 1994 eu acho... mas acho que o Paradox surgiu ainda nos anos 80... agora... quando surgiu o campo autoinc?)

Eu, particularmente, prefiro criar uma sequence a criar um campo auto-incremento.

Uma sequence e uma trigger pra rodá-la e pronto.

Sem muito trabalho, mas como a tabela do amigo é dbf, aí fica difícil, sem SGDB.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Gabriel Cabral,

você falou que o campo é string, então utilize esta função:

function StrZero(Valor:string; QtdZero:integer):String;
var
  I,Tamanho:integer;
  aux: string;
begin
  aux:=Valor;
  Tamanho:=length(Valor);
  Valor:='';
  for I:=1 to QtdZero-tamanho do
  Valor:=Valor+'0';
  aux:=Valor+aux;
  StrZero:=aux;
end;
pra chamar é simples: (apenas exemplo)
var inc, campo : string;
begin
  inc := '2'
  campo := StrZero(inc,5);
  // resultado será: '00002'

Abs. Progr'amador.

Editado por Progr'amador
Link para o comentário
Compartilhar em outros sites

  • 0

Então 'Progr'amador', mas isto funcionaria com o código max+1 ???

por exemplo....o código máximo da tabela é 00001...

então eu vou cadastrar outro registro...deixo o DBEdit vazio, o programa seleciona o max [00001] e soma 1, resultando no código 2 [sem zeros..q é como está ficando]...

com essa função o 2 fica 00002 tambem ou só funciona se eu digitar o 2 no DBEdit???

Obrigado

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

fuciona de qualqer forma,

adptando pro seu código, ficaria tipo assim:

procedure Tdm.tblCadFornBeforePost(DataSet: TDataSet);
begin


  if not tblCadForn.FieldByName('FORCOD').IsNull then
    Exit;

  QueryMaxForn.DatabaseName := tblCadForn.DatabaseName;
  QueryMaxForn.SQL.Clear;
  QueryMaxForn.SQL.Add('SELECT MAX (FORCOD)+1 FROM FINAFOR.dbf');
  QueryMaxForn.Open;

  try
    tblCadForn.FieldByName('FORCOD').AsString := StrZero(QueryMaxForn.Fields[0].AsString,5);
    finally
    QueryMaxForn.Close;
  end;

end;

Veja que coloquei o incremento diretamente na Select: SELECT MAX (FORCOD)+1

Abs. Progr'amador.

Link para o comentário
Compartilhar em outros sites

  • 0
Mas colocando este incremento no Select não da certo, dá??!! Porque o FORCOD é string....não seria uma concatenação desse jeito que está aí??

hum!!! realmente, você ta usando dbf, por exemplo com SQLServer, MySQL e alguns outros quando se usa a função MAX +1, ele já entende que se trata valor numerico, não sei se pro dbf tem alguma função de converta isso para numeric, ou sei la outro tipo, mas de qualer forma então, vamos fazer isso forma mesmo,

Tenta assim:

procedure Tdm.tblCadFornBeforePost(DataSet: TDataSet);
begin


  if not tblCadForn.FieldByName('FORCOD').IsNull then
    Exit;

  QueryMaxForn.DatabaseName := tblCadForn.DatabaseName;
  QueryMaxForn.SQL.Clear;
  QueryMaxForn.SQL.Add('SELECT MAX (FORCOD) FROM FINAFOR.dbf');
  QueryMaxForn.Open;

  try
    tblCadForn.FieldByName('FORCOD').AsString := StrZero(IntToStr(StrToInt(QueryMaxForn.Fields[0].AsString)+1)),5);

    finally
    QueryMaxForn.Close;
  end;

end;

Abs. Progr'amador.

Editado por Progr'amador
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...