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

(Resolvido) Atualizar dados do BD automaticamente


Bruno Dias

Pergunta

Pessoal,

Preciso fazer uma forma de executar uma instrução dentro de uma condicional Do While para atualizar "automaticamente" alguns registros do BD.

Seria por exemplo, mais ou menos assim:

- Abre a página

- Verifica com "SELECT * FROM lotes WHERE status_lote = Reservado"

- Na condicional "Do While Not rsLote.Eof" tem q executar o "UPDATE lotes SET status_lote = 'Liberado' WHERE id_lote = X ", lembrando q o "X" seria o numero do id do registro de cada lote que estaria como "Reservado".

- Finaliza instrução, fala que fou tudo alterado e etc...

Cheguei neste script:

<!--#include file="conexao.inc"-->

<%

Dim rsLote, sqlLote, codTipo, DataFim

DataFim = Date - 3

Call AbreBanco

codTipo = "Reservado"

sqlLote = "SELECT * FROM lotes WHERE status_lote = '" + codtipo + "' ORDER BY data_lote DESC"

Set rsLote = Banco.Execute(sqlLote)

Do While Not rsLote.Eof

if rsLote("data_lote")> DataFim then

Dim rsAtual, strAtual, varId, varStatus, varNum, varData, varObs, Cont

varId = rsLote("id_lote")

varStatus = "Liberado"

varNum = 0

varData = "-"

varObs = "-"

Cont = 1

strAtual = "UPDATE lotes SET status_lote = '" + varStatus + "', con_lote = " + varNum + ", data_lote = '" + varData + "', obs_lote = '" + varObs + "' WHERE id_lote = " + varId + " "

Set rsAtual = Banco.Execute(sqlLote)

Set rsAtual = Nothing

end if

Cont = Cont + 1

rsLote.MoveNext

Loop

Response.Write("Atualizações com sucesso.")

If rsLote.Eof then

Response.Write("Sem atualizações.")

End if

rsLote.Close

Call fechaBanco

Set rsLote = Nothing

%>

Do jeito que está, o browser retorna:

Microsoft VBScript runtime error '800a000d'

Type mismatch: '[string: "UPDATE lotes SET sta"]'

/admin/exp_res.asp, line 33

A linha 33 é a linha da instrução do "strAtual = ..."

alguém pode me ajudar ?

Obs: A conexão com o BD está ok, por utilizo o mesmo INC para outras páginas.

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

use o & ao invés do + para colocar as variaveis

outro detalhe

strAtual = "UPDATE lotes SET status_lote = '" + varStatus + "', con_lote = " + varNum + ", data_lote = '" + varData + "', obs_lote = '" + varObs + "' WHERE id_lote = " + varId + " "
Set rsAtual = Banco.Execute(sqlLote)
tente
strAtual = "UPDATE lotes SET status_lote ='"&varStatus&"', con_lote = "& varNum & ", data_lote = '" & varData & "', obs_lote = '" & varObs & "' WHERE id_lote =&varId
Set rsAtual = Banco.Execute(strAtual)

Link para o comentário
Compartilhar em outros sites

  • 0

Bareta ... a esecução do UPDATE tá perfeito!

Agora estou com um problema no na condicional IF, não está rodando.

Era pra ver se a data cadastrada é menor q a data atual, se for executa, senão pula o registro.

<!--#include file="conexao.inc"-->

<%

'Dim rsLote, sqlLote, codTipo, DataFim

DataFim = Date

Call AbreBanco

codTipo = "Reservado"

sqlLote = "SELECT * FROM lotes WHERE status_lote = '" + codtipo + "' ORDER BY data_lote DESC"

Set rsLote = Banco.Execute(sqlLote)

Do While Not rsLote.Eof

if DataFim > rsLote("data_lote") then

Dim rsAtual, strAtual, varId, varStatus, varNum, varData, varObs, Cont

varId = rsLote("id_lote")

varStatus = "Liberado"

varNum = 0

varData = " "

varObs = " "

strAtual = "UPDATE lotes SET status_lote ='"&varStatus&"', con_lote = "&varNum& ", data_lote = '" &varData& "', obs_lote = '" &varObs& "' WHERE id_lote ="&varId&""

Set rsAtual = Banco.Execute(strAtual)

Set rsAtual = Nothing

end if

rsLote.MoveNext

Loop

rsLote.Close

Call fechaBanco

Set rsLote = Nothing

%>

Na condicional IF inversa, a execução acontece, sendo "DataFim < rsLote("data_lote")", só que ele apaga todos os registros, inclusive os que são menores que a DataFim.

Tem ideia?

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

  • 0

Voce tem que virificar como ta o formato de Data.

Date retorna DD/MM/AAAA , se for um banco de dados SQL retorna AAAA/MM/DD

então voce tem que formatar as datas para o formado DD/MM/AAAA depois verificar usando

if (DateValue(DataFim)>=DateValue(data_lote)) then

Link para o comentário
Compartilhar em outros sites

  • 0

Caraca, esta foi dificil ...

Caçando na net achei uma jogada de transformação que um cara fez dos valores de recuperação do registro com SPLIT, separando os valores pelo "/".

Apliquei um Session.LCID pra deixar o Date() em formato padrão, aí apliquei a conversão do registro do BD de MM/DD/AAAA para DD/MM/AAAA e testei a condição com DateDiff.

Olha como ficou:

<!--#include file="conexao.inc"-->

<%

Session.LCID = 1046

Dim rsLote, sqlLote, codTipo, DataFim

DataFim = Date()

Call AbreBanco

codTipo = "Reservado"

sqlLote = "SELECT * FROM lotes WHERE status_lote = '" + codtipo + "' ORDER BY data_lote"

Set rsLote = Banco.Execute(sqlLote)

Do While Not rsLote.Eof

data= split(rsLote("data_lote"),"/")

data_convertida=data(1)&"/"&data(0)&"/"&data(2)

DataTeste = DateDiff("d", data_convertida, dataFim)

if dataTeste > 3 then

Dim rsAtual, strAtual, varId, varStatus, varNum, varData, varObs, Cont

varId = rsLote("id_lote")

varStatus = "Liberado"

varNum = 0

varObs = " "

strAtual = "UPDATE lotes SET status_lote ='"&varStatus&"', con_lote = "&varNum& ", obs_lote = '" &varObs& "' WHERE id_lote ="&varId&""

Set rsAtual = Banco.Execute(strAtual)

Set rsAtual = Nothing

end if

rsLote.MoveNext

Loop

rsLote.Close

Call fechaBanco

Set rsLote = Nothing

%>

Valeu galera, obrigado pela ajuda !

Abraço!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...