Gabriel Cabral Postado Agosto 27, 2008 Denunciar Share Postado Agosto 27, 2008 Ae galera....tudo certo?!!!eu procurei aqui e em outros lugares sobre autoincremento em tabela dbf mas não encontrei naaaadaentã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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Agosto 27, 2008 Denunciar Share Postado Agosto 27, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 27, 2008 Autor Denunciar Share Postado Agosto 27, 2008 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 1assim, a partir daí, os codigos ficariam ordenados. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Agosto 27, 2008 Denunciar Share Postado Agosto 27, 2008 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 1assim, 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 forumabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 28, 2008 Autor Denunciar Share Postado Agosto 28, 2008 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 essaProject 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Duduh_Capixaba Postado Agosto 28, 2008 Denunciar Share Postado Agosto 28, 2008 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; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 29, 2008 Autor Denunciar Share Postado Agosto 29, 2008 Eu apontei para o primeiro, apontei para o ultimo, mas continua dando o mesmo erro de violação de acesso....me falaram pra eu criar uma outra query pra selecionar tudo depois de gravar, mas também não deu certo, da sempre o mesmo erro =/ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Duduh_Capixaba Postado Agosto 29, 2008 Denunciar Share Postado Agosto 29, 2008 (editado) Posta o código que você está usando para salvar. Deve estar lá o problema. Editado Agosto 29, 2008 por Duduh_Capixaba Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 29, 2008 Autor Denunciar Share Postado Agosto 29, 2008 (editado) 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 Agosto 29, 2008 por Gabriel Cabral Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Duduh_Capixaba Postado Agosto 29, 2008 Denunciar Share Postado Agosto 29, 2008 (editado) 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 Agosto 29, 2008 por Duduh_Capixaba Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 29, 2008 Autor Denunciar Share Postado Agosto 29, 2008 (editado) realmente....eu tirei o close da tabela ao gravar....agora não dá mais erro.....mas uma vez me disseram q sempre precisa fechar a tabela depois de uma gravação....senao da uns erros.... Editado Agosto 29, 2008 por Gabriel Cabral Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Duduh_Capixaba Postado Agosto 29, 2008 Denunciar Share Postado Agosto 29, 2008 Você pode até deixar o Close após gravar, mas sempre antes de se movimentar, terá que abrir a tabela. Abraço! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Setembro 1, 2008 Autor Denunciar Share Postado Setembro 1, 2008 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.(???????) Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Gabriel Cabral
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:
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
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.