Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Irenko

[Resolvido] Atualizar campo ID

Recommended Posts

Tenho em uma tabela gravado um documento de numero 1501 esse documento tem 05 items que é identificado na tabela com o campo (ID) sendo:

 

ID 1 = XXXXXXXX

ID 2 = YYYYYYYY

ID 3 = NNNNNNNN

ID 4 = BBBBBBBB

ID 5 = CCCCCCCC

 

preciso de uma rotina para que quando eu deletar um desses items, supondo o

ID 3 o código atualize o campo (ID) da tabela automaticamente ficando:

 

ID 1 = XXXXXXXX

ID 2 = YYYYYYYY

ID 3 = BBBBBBBB

ID 4 = CCCCCCCC

 

No caso acima o ID 4 passa a ser o ID 3

 

Uso ADO banco access. Isso é possível?

 

Meu código para alterar é o abaixo: Como adapta-lo?

 

Set OP = New ADODB.Command

With OP

.ActiveConnection = Banco1

.CommandText = "UPDATE Movimento SET Disp = '" & ComboDisp.text & "',Origem = '" & ComboOrigem.text & "',Destino = '" & ComboDestino.text & "',[OF] = '" & TxtOF.text & "',Obra = '" & TxtObra.text & "',Fabrica = '" & TxtFab.text & "',Posicao = '" & TxtPos.text & "',Quant = '" & TxtQT.text & "',[Desc] = '" & TxtDesc.text & "',[Req] = '" & TxtReq.text & "',CSobra = '" & TxtSobra.text & "' where LM = '" & NrLista & "' and ID = " & Lb_Iditem & ";"

.Execute

End With

Set OP = Nothing

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até tem, mas dependendo do tanto de registros que você tiver vai ficar lento.

A solução que eu vejo é essa:

 

tabela.MoveFirst
while(not(tabela.EOF))
lastID=tabela("ID")
tabela.MoveNext
  if(lastID - tabela("ID") = 2) Then
	 tabela.Edit
	 tabela("ID")=lastID + 1
	 tabela.Update
  End If
Wend

ps: não testei

 

Então como eu falei, se você tiver muitos registros vai ficar lento. Veja se é realmente necessario fazer isso...

 

Flw

 

Ata-

Compartilhar este post


Link para o post
Compartilhar em outros sites

A quantidade de items não é grande. Bom o meu procedimento para deletar é o abaixo:

 

Private Sub CmdMenos_Click()

If MsgBox("Você tem certeza que deseja deletar esse item da LM?", vbYesNo + vbQuestion) = vbYes Then

Banco1.BeginTrans

Banco1.Execute "DELETE FROM Movimento WHERE LM = '" & NrLista & "' and ID = " & Lb_Iditem & ";"

Banco1.CommitTrans

MsgBox "Item deletado!", vbExclamation

End If

End Sub

 

Agora eu não sei é adaptar a sua sugestão no mesmo. Pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamo lá então. :D

Você tem um RecordSet? (em SQL eu não consegui pensa alguma forma de fazer isso)

Você só vai te que altera 'tabela', por seu RecordSet, e mudar uma linha ali.

 

 

Private Sub CmdMenos_Click()
If MsgBox("Você tem certeza que deseja deletar esse item da LM?", vbYesNo + vbQuestion) = vbYes Then
Banco1.BeginTrans << q q é isso ?
Banco1.Execute "DELETE FROM Movimento WHERE LM = '" & NrLista & "' and ID = " & Lb_Iditem & ";"
Banco1.CommitTrans << e isso ?
MsgBox "Item deletado!", vbExclamation


SEU_RECORDSET.Move (Lb_Iditem-1, 0) 'move para um registro anterior ao que excluiu  | se ali não der certo com 0 poe 1.
While(not(SEU_RECORDSET.EOF))
  lastID = SEU_RECORDSET!ID
  SEU_RECORDSET.MoveNext
	If(SEU_RECORDSET!ID - lastID >= 2)Then
	  SEU_RECORDSET.EditMode
	  SEU_RECORDSET!ID=lastID + 1
	  SEU_RECORDSET.Update
	End If
Wend

End If
End Sub

Ve se você entendeu ai, se deu certo, qualquer coisa fala ai que a gente ve o que pode fazer

 

Flw

 

Ata-

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu q q é isso ?

Uma transação pode ser definida como um conjunto de operações(alteração,inclusão,exclusão,atualização,etc.) realizadas nos dados de uma aplicação em um dado momento. Uma transação tem o seu início no início de uma sessão e o seu término no encerramento da sessão (fechamento do programa ou operação.).

 

O ínicio de uma nova transação é marcada pela diretiva BeginTrans , o encerramento pela diretiva CommitTrans e o Cancelamento da transação pela diretiva RollBack.

 

O processamento da transação é realizado pelo objeto Workspace definido em uma sessão.Então temos:

 

* BeginTrans - Inicia uma nova Transação

* CommitTrans - Encerra a transação atual e salva as alterações realizadas durante o processamento.

* RollBack - Encerra a transação atual e restaura os dados a sua posição quando do inicio da transação.

 

Caro amigo não consegui fazer funcionar o seu codigo sugerido, o que vem a ser (lastID) no codigo q você me passou?

Veja bem, estou fazendo em VB não sabia que ia ser tão dificil a atualização desse campo. Se você tiver mais uma sugestão, por favor post.

Compartilhar este post


Link para o post
Compartilhar em outros sites

SEU_RECORDSET.Move (Lb_Iditem-1, 0) 'move para um registro anterior ao que excluiu  | se ali não der certo com 0 poe 1.
   While(not(SEU_RECORDSET.EOF))
	 lastID = SEU_RECORDSET!ID
	 SEU_RECORDSET.MoveNext
	   If(SEU_RECORDSET!ID - lastID >= 2)Then
		 SEU_RECORDSET.EditMode
		 SEU_RECORDSET!ID=lastID + 1
		 SEU_RECORDSET.Update
	   End If
   Wend

 

lastID é uma variavel, que guarda a posição de agora, para que quando eu mova para a proxima eu possa fazer SEU_RECORDSET!ID - lastID. Entendeu ?

Tipo:

ID

01 <atual que vai ser guardado

02 <proximo que vai comparar | qndo chegar ao fim do while, ele vai se tornar o atual

03

05

 

atualID | proximo | diferença | muda?

01 .....| 02 .....| 1 ........| NAO

02 .....| 03 .....| 1 ........ | NAO

03 ..... | 05 .....| 2 ........ | SIM (o proximo passa a ser 4)

O código funciona assim, registro_atual - registro_anterior, se for maior do que 2 a diferença quer dizer que não esta na sequencia, ele vai fazer o campo ID do registro_atual ficar com o valor do ID do registro anterior +1, ou seja vai ficar na sequencia.

 

Esse exemplo aqui é a mesma coisa, só que é feito com uma List, coloca quaisquer numeros na lista

List1.ListIndex = 0
 
 For I = 0 To List1.ListCount - 2
   lastID = List1.List(List1.ListIndex)
   List1.ListIndex = List1.ListIndex + 1
	 If (Abs(List1.List(List1.ListIndex) - lastID) >= 2) Then
	   List1.List(List1.ListIndex) = lastID + 1
	 End If
 Next
Faz ai para você ver.

 

Mas deu algum erro?ou não funcionou mesmo? quais os resultados ?

Eu não sei se você pode mecher em um campo auto-numérico, talvez foi por isso que não funcionou.

Qualquer coisa volta ae =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz assim não sei se esta correto: um dos erros apontei no codigo outro é a variavel lastID que fica vazia. O campo ID da minha tabela é do tipo integer e não é de auto numeração a mesma é feita via codigo.

 

Private Sub CmdMenos_Click()

Dim lastID As String

If MsgBox("Você tem certeza que deseja deletar esse item da LM?", vbYesNo + vbQuestion) = vbYes Then

Banco1.BeginTrans

Banco1.Execute "DELETE FROM Movimento WHERE LM = '" & NrLista & "' and ID = " & Lb_Iditem & ";"

Banco1.CommitTrans

MsgBox "Item deletado!", vbExclamation

 

Set IDLista = New ADODB.Recordset

IDLista.Open "SELECT [OF],Req,Desc,Quant,Disp,LM,[iD],Origem,Destino,Posicao,Obra,Fabrica FROM Movimento WHERE LM Like '%" & NrLista & "%'ORDER BY ID", Banco1, adOpenKeyset, adLockPessimistic

 

IDLista.Move 0 = (Lb_Iditem - 1) ====> aqui mudei era assim SEU_RECORDSET.Move (Lb_Iditem-1, 0) e não aceitava na virgula.

 

While (Not (IDLista.EOF))

lastID = IDLista!id

IDLista.MoveNext

If (IDLista!id - lastID >= 2) Then

IDLista.EditMode=================>erro aqui (Uso invalido da propriedade)

IDLista!id = lastID + 1

IDLista.Update

End If

Wend

 

 

End If

End Sub

 

Amigo, fico grato pela paciencia pode ser eu que não esteja sabendo colocar as coisas certas neste procedimento

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hnm... acho que coloquei o Update errado :D

 

IDLista.Open "SELECT [OF],Req,Desc,Quant,Disp,LM,[ID],Origem,Destino,Posicao,Obra,Fabrica FROM Movimento WHERE LM Like '%" & NrLista & "%'ORDER BY ID", Banco1, adOpenKeyset, adLockPessimistic
Acho que você pode retornar só o campo ID, você só vai mecher nele. a nao ser que você vá usar para outra coisa.

 

 

IDLista.Move 0, Lb_Iditem - 1' == tenta usar sem parenteses aqui  ==
'(verifica esse Move, se ele esta indo pra onde ele é pra ir, senão muda por IDLista.MoveFirst)

While (Not (IDLista.EOF))
lastID = IDLista!id
IDLista.MoveNext
If (IDLista!id - lastID >= 2) Then
  IDLista.Update(ID,lastID + 1) '(se aki der o msm erro que deu no Move tira os parenteses)
  'IDLista.Update ID,lastID + 1 
End If
Wend

tenta agora.

 

Qualquer coisa pode voltar. não tenha medo de perguntar.

 

Flw

Ata-

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK amigo, problema resolvido!! Fico grato.

 

Uma outra dúvida em SQL. Estou tentando inserir mais um item em uma tabela. Veja bem, tenho esse documento q refere-se a variavel (NrLista), esse doc tem 20 items preciso inserir mai um no mesmo. Estou usando a instrução abaixo mas esta dando erro (Erro de sintaxe na instrucao INSERT INTO). Não sei se pode usar uma clausura WHERE na mesma, seria isso?

 

CommandText = "insert into Movimento (Disp,Origem,Destino,OF,Obra,Fabrica,Posicao,Quant,Desc,Req,CSobra,ID,LM) values ('" & ComboDisp.text & "','" & ComboOrigem.text & "','" & ComboDestino & "','" & TxtOF.text & "','" & TxtObra.text & "','" & TxtFab.text & "','" & TxtPos.text & "','" & TxtQT.text & "','" & TxtDesc.text & "','" & TxtReq.text & "','" & TxtSobra.text & "','" & Lb_ID.Caption & "','" & NrLista & "' where LM = '" & NrLista & "')"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. Não pode usar o WHERE, pensa assim pra você deleta você precisa de algum valor como referencia ( WHERE ID = 10 por exemplo, ou nao.. mas iria excluir toda a tabela.), na consulta também e pra editar você tambem precisa de um valor como referencia, mas para inserir, você está inserindo, você não precisa de um valor referencia.

'O intrução inseri esse registro ali onde o ID é 1' fica esquisito

 

É só tirar o WHERE que deve funcionar http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

flw

 

Ata-

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.