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

Autoincremento em tabela dbf


Gabriel Cabral

Pergunta

Ae galera....tudo certo?!!!

eu procurei aqui e em outros lugares sobre autoincremento em tabela dbf mas não encontrei naaaada

então vou postar aqui o que tentei fazer e não deu certo pra vocês poderem analisar e tentar me ajudar...

como no database desktop não tem a opção de um campo de tabela dbf ser autoincremento, preciso fazer isso na mao....então tentei o seguinte:

procedure Tdm.tblCadProBeforePost(DataSet: TDataSet);
begin

  if not tblCadPro.FieldByName('PROCOD').IsNull then
    Exit;

  dm.Query1 := dm.Query1.Create(nil);
  try
    dm.Query1.DatabaseName := tblCadPro.DatabaseName;
    dm.Query1.SQL.Add('SELECT MAX (PROCOD) FROM ESTAPRO.dbf');
    dm.Query1.Open;
    try
    tblCadPro.FieldByName('PROCOD').AsInteger := dm.Query1.Fields[0].AsInteger+1;
    finally
      dm.Query1.Close;
    end;
  finally
    dm.Query1.Free;
  end;
end;

end.

Mas ele está selecionando não o código do ultimo registro, mas o código maior entre todos os registros

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

procedure Tdm.tblCadProBeforePost(DataSet: TDataSet);

begin

if not tblCadPro.FieldByName('PROCOD').IsNull then

Exit;

dm.Query1 := dm.Query1.Create(nil);

try

dm.Query1.DatabaseName := tblCadPro.DatabaseName;

dm.Query1.SQL.Add('SELECT MAX (PROCOD) FROM ESTAPRO.dbf');

dm.Query1.Open;

try

tblCadPro.FieldByName('PROCOD').AsInteger := dm.Query1.Fields[0].AsInteger+1;

finally

dm.Query1.Close;

end;

finally

dm.Query1.Free;

end;

end;

end.

Mas ele está selecionando não o código do ultimo registro, mas o código maior entre todos os registros

dm.Query1.SQL.Add('SELECT MAX (PROCOD) FROM ESTAPRO.dbf');

É exatamente isso que este comando esta fazendo ( SELECT MAX (PROCOD) ) ... ele vai pegar o registro de maior valor que existir na tabela e acrescentar mais 1.

ou voce fazer uma contagem dos registros e acrescentar mais 1

dm.Query1.SQL.Add('SELECT COUNT (PROCOD) FROM ESTAPRO.dbf');

OBS: desta maneira ele contará os registros independente do valor de PROCOD... da outra maneira voce não corre o risco de ter valores duplicados.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
então... é que eu tenho uma tabela aqui em que os valores dos códigos não estão ordenados...

e eu queria pegar o codigo do ultimo registro e acrescentar 1

assim, a partir daí, os codigos ficariam ordenados.

Gabriel ... se voce usar

dm.Query1.SQL.Add('SELECT COUNT (PROCOD) FROM ESTAPRO.dbf');

e a sua tabela estiver ordenada e começando pelo numero 1 , então voce terá sempre o contador de registros igual ao numero de PROCOD, no qual voce acrescentaria + 1 para o proximo valor.

entretanto se a sua tabela estiver ordenada e começando por outro numero que não seja o 1, ou tenha pulado a sequencia, então voce poderá ter valores duplicados para o PROCOD, coisa que não aconteceria se voce usar

dm.Query1.SQL.Add('SELECT MAX (PROCOD) FROM ESTAPRO.dbf');

porque, idependentemente dos registros estarem ou não ordenados, voce terá sempre o ultimo valor maximo de PROCOD acrescentado de + 1, e neste caso voce nunca teria valores repetidos.

existem outras maneiras de se fazer um campo autoincremento... pesquise no forum

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Então, Jhonas....acabou que deu certo com o select max.....

toda vez que eu salvo um registro, ele incrementa o código corretamente....

mas se clico em um dos botoes de navegação de registro [primeiro, anterior, proximo ou ultimo], logo apos clicar em salvar, o programa acusa erro de violação de acesso.

não sei porque....não sei o que pode estar acontecendo pra dar esse erro...

uma das mensagens que apareceram foi essa

Project winsuperm.exe raised exception class EAccessViolation with message 'Access violation at address 0048343C in module 'winsuperm.exe'. Read of address 202020A4'

já apareceram outras mensagens com esse mesmo corpo, só mudavam os numeros de endereço.

Link para o comentário
Compartilhar em outros sites

  • 0

Tente apontar para o primeiro ou último registro após salvar seu registro. Talvez o ponteiro esteja meio que "perdido".

Uma outra solução para seu problema, seria apontar para o último registro e somá-lo. Meu teste ficou assim:

Se você usar uma Query:

dm.Query1.SQL.Add('SELECT * FROM ESTAPRO.dbf ORDER BY PROCOD');
dm.Query1.Open;
dm.Query1.Last;
tblCadPro.FieldByName('PROCOD').AsInteger := dm.Query1.FieldValues['CODPROD'] + 1;
Se você usar uma tabela: Primeiro, sete a propriedade IndexFieldNames como CODPROD, assim ela vai ordenar sua tabela pelo código.
tblCadPro.Open;
tblCadPro.Last;
tblCadPro.FieldByName('PROCOD').AsInteger := tblCadPro.FieldValues['PROCOD'] + 1;

Link para o comentário
Compartilhar em outros sites

  • 0

procedure TfrmCadPro.btnGravarClick(Sender: TObject);
begin

  txtAux.SetFocus;

  //deixar campos bloqueados
  txtCadPro_CodPro      .ReadOnly := True;
  txtCadPro_Secao       .ReadOnly := True;
  txtCadPro_DataCad     .ReadOnly := True;
  txtCadPro_Desc        .ReadOnly := True;
  txtCadPro_Estoque     .ReadOnly := True;
  txtCadPro_UndVen      .ReadOnly := True;
  txtCadPro_Icms        .ReadOnly := True;
  txtCadPro_EstMin      .ReadOnly := True;
  txtCadPro_EstMax      .ReadOnly := True;
  txtCadPro_PreCus      .ReadOnly := True;
  txtCadPro_Vml         .ReadOnly := True;
  txtCadPro_PreVen      .ReadOnly := True;
  txtCadPro_CodForn1    .ReadOnly := True;
  txtCadPro_CodForn2    .ReadOnly := True;
  txtCadPro_CodForn3    .ReadOnly := True;
  txtCadPro_CodForn4    .ReadOnly := True;
  txtCadPro_Fracao      .ReadOnly := True;
  txtCadPro_UndCompra   .ReadOnly := True;
  txtCadPro_Local       .ReadOnly := True;
  txtCadPro_CodOrigem   .ReadOnly := True;
  txtCadPro_DiasVal     .ReadOnly := True;
  txtCadPro_PreOfe      .ReadOnly := True;
  txtCadPro_DataIniOfe  .ReadOnly := True;
  txtCadPro_DataFinOfe  .ReadOnly := True;
  txtCadPro_EstoqPrat   .ReadOnly := True;
  txtCadPro_QtdeMinPrat .ReadOnly := True;
  txtCadPro_TotalComp   .ReadOnly := True;
  txtCadPro_TotalVend   .ReadOnly := True;
  txtCadPro_DataUlt     .ReadOnly := True;
  txtCadPro_FornUlt     .ReadOnly := True;
  txtCadPro_QtdeUlt     .ReadOnly := True;
  txtCadPro_PreUlt      .ReadOnly := True;
  txtCadPro_DataEnt     .ReadOnly := True;
  txtCadPro_QtdeEnt     .ReadOnly := True;
  txtCadPro_DataSai     .ReadOnly := True;
  txtCadPro_QtdeSai     .ReadOnly := True;

  btnNovo               .Enabled := True;
  btnGravar             .Enabled := False;
  btnAlterar            .Enabled := True;
  btnExcluir            .Enabled := True;
  btnBuscar             .Enabled := True;
  btnPrimeiro           .Enabled := True;
  btnAnterior           .Enabled := True;
  btnProximo            .Enabled := True;
  btnUltimo             .Enabled := True;
  btnSair               .Enabled := True;

  //impedir que o campo receba o foco com o Tab
  txtCadPro_CodPro      .TabStop := False;
  txtCadPro_Secao       .TabStop := False;
  txtCadPro_DataCad     .TabStop := False;
  txtCadPro_Desc        .TabStop := False;
  txtCadPro_Estoque     .TabStop := False;
  txtCadPro_UndVen      .TabStop := False;
  txtCadPro_Icms        .TabStop := False;
  txtCadPro_EstMin      .TabStop := False;
  txtCadPro_EstMax      .TabStop := False;
  txtCadPro_PreCus      .TabStop := False;
  txtCadPro_Vml         .TabStop := False;
  txtCadPro_PreVen      .TabStop := False;
  txtCadPro_CodForn1    .TabStop := False;
  txtCadPro_CodForn2    .TabStop := False;
  txtCadPro_CodForn3    .TabStop := False;
  txtCadPro_CodForn4    .TabStop := False;
  txtCadPro_Fracao      .TabStop := False;
  txtCadPro_UndCompra   .TabStop := False;
  txtCadPro_Local       .TabStop := False;
  FrameConEstoq         .TabStop := False;
  ProEstSim             .TabStop := False;
  ProEstNao             .TabStop := False;
  FrameCotacao          .TabStop := False;
  ProCotSim             .TabStop := False;
  ProCotNao             .TabStop := False;
  txtCadPro_CodOrigem   .TabStop := False;
  FrameBalanca          .TabStop := False;
  ProPesSim             .TabStop := False;
  ProPesNao             .TabStop := False;
  FramePesUnd           .TabStop := False;
  ProUnpPeso            .TabStop := False;
  ProUnpUnidade         .TabStop := False;
  txtCadPro_DiasVal     .TabStop := False;
  FrameBalancaCaixa     .TabStop := False;
  ProBalSim             .TabStop := False;
  ProBalNao             .TabStop := False;
  txtCadPro_PreOfe      .TabStop := False;
  txtCadPro_DataIniOfe  .TabStop := False;
  txtCadPro_DataFinOfe  .TabStop := False;
  txtCadPro_EstoqPrat   .TabStop := False;
  txtCadPro_QtdeMinPrat .TabStop := False;
  txtCadPro_TotalComp   .TabStop := False;
  txtCadPro_TotalVend   .TabStop := False;
  FrameUltCompra        .TabStop := False;
  txtCadPro_DataUlt     .TabStop := False;
  txtCadPro_FornUlt     .TabStop := False;
  txtCadPro_QtdeUlt     .TabStop := False;
  txtCadPro_PreUlt      .TabStop := False;
  FrameUltMovEst        .TabStop := False;
  txtCadPro_DataEnt     .TabStop := False;
  txtCadPro_QtdeEnt     .TabStop := False;
  txtCadPro_DataSai     .TabStop := False;
  txtCadPro_QtdeSai     .TabStop := False;

  ProEstSim             .Checked := False;
  ProEstNao             .Checked := False;
  ProCotSim             .Checked := False;
  ProCotNao             .Checked := False;
  ProPesSim             .Checked := False;
  ProPesNao             .Checked := False;
  ProUnpPeso            .Checked := False;
  ProUnpUnidade         .Checked := False;
  ProBalSim             .Checked := False;
  ProBalNao             .Checked := False;



dm.tblCadPro.Post;
          
dm.Query2.Close;
dm.Query2.SQL.Clear;

dm.Query2.SQL.Add('SELECT * FROM ESTAPRO.dbf');


dm.tblCadPro.Close;

end;
O erro q dá quando clico em qualquer um dos botoes de navegação de registro, se dá nas linhas do codigo a seguir:
procedure TfrmCadPro.btnUltimoClick(Sender: TObject);
var
controlaEst, cotacao, arqBal, pesUnd, balCaixa: string;

begin
dm.tblCadPro.Open;     //exceto aqui
dm.tblCadPro.Last;      //e aqui

controlaEst := txtCadPro_ControlaEst.Text;
cotacao     := txtCadPro_Cotacao.Text;
arqBal      := txtCadPro_ArqBal.Text;
pesUnd      := txtCadPro_PesUnd.Text;
balCaixa    := txtCadPro_BalCaixa.Text;

if (controlaEst = 'S') then
  begin
    ProEstSim.Checked := True;
  end

else if (controlaEst = 'N') then
  begin
    ProEstNao.Checked := True;
  end
else
  begin
    ProEstSim.Checked := False;
    ProEstNao.Checked := False;
end;


if (cotacao = 'S') then
  begin
    ProCotSim.Checked := True;
  end

else if (cotacao = 'N') then
  begin
    ProCotNao.Checked := True;
  end
else
  begin
    ProCotSim.Checked := False;
    ProCotNao.Checked := False;
end;


if (arqBal = 'S') then
  begin
    ProPesSim.Checked := True;
  end

else if (arqBal = 'N') then
  begin
    ProPesNao.Checked := True;
  end
else
  begin
    ProPesSim.Checked := False;
    ProPesNao.Checked := False;
end;


if (pesUnd = 'P') then
  begin
    ProUnpPeso.Checked := True;
  end

else if (pesUnd = 'U') then
  begin
    ProUnpUnidade.Checked := True;
  end
else
  begin
    ProUnpPeso.Checked := False;
    ProUnpUnidade.Checked := False;
end;


if (balCaixa = 'S') then
  begin
    ProBalSim.Checked := True;
  end

else if (balCaixa = 'N') then
  begin
    ProBalNao.Checked := True;
  end
else
  begin
    ProBalSim.Checked := False;
    ProBalNao.Checked := False;
end;

todos os botoes de navegação possuem esse codigo...

serve para, na navegação, o RadioButton ficar selecionado de acordo com o que está gravado no banco...

não sei porque aponta isso no erro

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

  • 0

Este código salva alguma coisa? Só estou vendo o Post, mas cadê os campos da tabela rebendo os dados??? Bem, vamos ao que interessa... Você está tentando navegar pela tabela tblCadPro, certo?! Não trabalho com bases Paradox, mas talvez não seria por causa desse Close no final? Tente navegar pelos registros com a tabela aberta, pra ver o que acontece.

E qual é a linha que é apontada no erro?

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

  • 0

Mas veja....

estou abrindo a tabela antes de navegar nela...

procedure TfrmCadPro.btnUltimoClick(Sender: TObject);
var
controlaEst, cotacao, arqBal, pesUnd, balCaixa: string;

begin
dm.tblCadPro.Open;     //exceto aqui
dm.tblCadPro.Last;

mesmo dessa forma, se eu der um close ao gravar a tabela, dá aquele erro de violação de acesso.....

a única coisa q deu certo foi não fechar a tabela depois de gravar.

(???????)

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...