Ir para conteúdo

POWERED BY:

Arquivado

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

Carla Karasawa

Conversão de valor TimeStamp para String para ser utilizado em XML

Recommended Posts

Boa tarde Pessoal !

 

Estou com o seguinte problema:

 

Preciso salvar em lote informações que vem de uma aplicação desenvolvida em VB.Net.

 

A aplicação monta um XML e envia como parâmetro para uma procedure. Até aí esta fácil.

 

Porém quero manter integridade da informação fazendo comparação com o campo Timestamp. Então pretendia, antes da pessoa fazer a consulta, recuperar essa informação e mandar de volta dentro do XML, para verificar se eu posso ou não alterar essa informação.

 

Só que não estou conseguindo converter essa informação para string e depois, converter novamente para timestamp sem haver a modificação do dado.

 

Alguém pode me ajudar, por favor ?

 

Carla

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, vou tentar, afinal, o processo é bem estenso. Estou tentando resumir.

 

Como é necessário gravar todas as informações juntas de um monte de telas, guardo um dataview em sessão. Monto o Dataview com os dados da tabela (até aí, sem problema, pois o campo timestamp mantem a sua formatação padrão)

 

 

Private Function getDepositoInicialViewSessao() As DataView
		Dim lobjDtv As New DataView

		lobjDtv = Session("dtvDepositoIncial")

		If IsNothing(lobjDtv) Then
			PreencheDataView(lobjDtv)
		End If
		Return lobjDtv
	End Function

	Private Sub PreencheDataView(ByRef objDtView As DataView)
		Dim lintValorRetorno As Int32
		Try
			objDtView = (New clsDepositoInicialPRE).Consultar(lintValorRetorno, objMemoriaCalculo.Cimemoria, "")

		Catch ex As Exception
			lblMsgErro.Text = "Erro ao preencher o DataView. " & ex.Message
		End Try
	End Sub

'Aqui estou montado os XML´s para salvar os dados e enviá-los por XML.

		Public Function Salvar(ByRef pobjSqlTransaction As SqlTransaction, _
							   ByRef pintValorRetorno As Int32, _
							   ByVal pintci_memoria As Int32, _
							   ByVal pDataView As DataView) As Int32 Implements IclsDepositoInicialNEG.Salvar
			'--------------------------------------------- validações de regras de negócio (gestão)

			Const LINHA As String = "<{0}>{1}</{0}>"
			Const LINHAEXCLUSAO As String = "<item><ci_deposito>{0}</ci_deposito><ci_memoria>{1}</ci_memoria><cd_controle_atualizacao>{2}</cd_controle_atualizacao></item>"

			Const ITEM As String = "<item>"
			Const ITEM2 As String = "</item>"
			Const ROOT As String = "<root>"
			Const ROOT2 As String = "</root>"

			Dim dtvInclusao As New DataView
			Dim dtvExclusao As New DataView
			Dim dtvAlteracao As New DataView

			Dim strFiltro As String = ""

			Dim intRetorno As Integer

			Dim intValorRetorno As Int32

			FiltraDataView(dtvInclusao, pDataView, "tblInclusao", "I")
			FiltraDataView(dtvExclusao, pDataView, "tblExclusao", "E")
			FiltraDataView(dtvAlteracao, pDataView, "tblAlteracao", "A")

			Try
				If dtvInclusao.Count > 0 Then
					Dim objDrv As DataRowView
					Dim strStringXml As New System.Text.StringBuilder
					Dim objDtColum As DataColumn

					With strStringXml

						.Append(ROOT)

						For Each objDrv In dtvInclusao
							.Append(ITEM)
							For Each objDtColum In dtvInclusao.Table.Columns
								If objDtColum.ColumnName <> "ci_deposito" And objDtColum.ColumnName <> "ci_memoria" And objDtColum.ColumnName <> "cd_controle_atualizacao" Then
									If objDtColum.DataType Is GetType(System.DateTime) Then
										.AppendFormat(LINHA, objDtColum.ColumnName, Convert.ToDateTime(objDrv(objDtColum.ColumnName)).ToString("yyyyMMdd hh:mm:ss.fff"))
									ElseIf objDtColum.DataType Is GetType(System.Decimal) Then
										.AppendFormat(LINHA, objDtColum.ColumnName, Convert.ToString(objDrv(objDtColum.ColumnName)).Replace(",", "."))
									Else
										.AppendFormat(LINHA, objDtColum.ColumnName, objDrv(objDtColum.ColumnName))
									End If
								End If
							Next

							.Append(ITEM2)
						Next
						.Append(ROOT2)
					End With

					'------------------------------------------ chamada da camada de transformação
					intRetorno = Incluir(pobjSqlTransaction, pintValorRetorno, strStringXml.ToString, pintci_memoria)
					intValorRetorno += pintValorRetorno

				End If

				If dtvAlteracao.Count > 0 Then
					Dim objDrv As DataRowView
					Dim strStringXml As New System.Text.StringBuilder
					Dim objDtColum As DataColumn

					With strStringXml

						.Append(ROOT)

						For Each objDrv In dtvAlteracao
							.Append(ITEM)
							For Each objDtColum In dtvInclusao.Table.Columns
								If objDtColum.ColumnName <> "ci_memoria" Then
									If objDtColum.DataType Is GetType(System.DateTime) Then
										.AppendFormat(LINHA, objDtColum.ColumnName, Convert.ToDateTime(objDrv(objDtColum.ColumnName)).ToString("yyyyMMdd hh:mm:ss.fff"))
									ElseIf objDtColum.DataType Is GetType(System.Decimal) Then
										.AppendFormat(LINHA, objDtColum.ColumnName, Convert.ToString(objDrv(objDtColum.ColumnName)).Replace(",", "."))
' Aqui que estou tendo problema. 
									Else
										.AppendFormat(LINHA, objDtColum.ColumnName, objDrv(objDtColum.ColumnName))
									End If

								End If
							Next

							.Append(ITEM2)
						Next
						.Append(ROOT2)
					End With

					'------------------------------------------ chamada da camada de transformação
					intRetorno = Alterar(pobjSqlTransaction, pintValorRetorno, strStringXml.ToString, pintci_memoria)
					intValorRetorno += pintValorRetorno

				End If

				If dtvExclusao.Count > 0 Then
					Dim objDrv As DataRowView
					Dim strStringXml As New System.Text.StringBuilder

					With strStringXml

						.Append(ROOT)
						For Each objDrv In dtvExclusao
							.AppendFormat(LINHAEXCLUSAO, objDrv("ci_deposito"), objDrv("ci_memoria"), Conversions.TimeStampToString(objDRV("cd_controle_atualizacao")))
						Next
						.Append(ROOT2)
					End With

					'------------------------------------------ chamada da camada de transformação
					intRetorno = Excluir(pobjSqlTransaction, pintValorRetorno, strStringXml.ToString, pintci_memoria)
					intValorRetorno += pintValorRetorno
				End If
				pintValorRetorno = intValorRetorno

			Catch erro As SqlExceptionProdamSP
				Throw New SqlExceptionProdamSP(erro.MensagemErro, erro.ErrosSqlException)
			Catch erro As ExceptionProdamSP
				Throw New ExceptionProdamSP(erro.MensagemErro, erro.ErroException)
			End Try

		End Function
'Código da proc que recebe os paramêtros

CREATE PROCEDURE p_upd_deposito_inicial
      -------------------------------------------------------------------------------------------
      --                    Gerador de Stored Procedures V.1.2 Rev.73
      -------------------------------------------------------------------------------------------
      -- Função...........: Alteração na tabela DEPOSITO_INICIAL
      -------------------------------------------------------------------------------------------

      @strXml            text,
      @ci_memoria        int

AS BEGIN SET NOCOUNT ON DECLARE @CodErroSQL    integer

      DECLARE @idoc int

      EXEC sp_xml_preparedocument @idoc OUTPUT, @strXml

      SELECT  ci_deposito,
              ci_memoria,
              tp_deposito_inicial,
              cd_mes_incidencia_deposito_inicial,
              dt_deposito_inicial,
              vl_deposito_inicial,
              in_desconto_honorarios,
              in_desconto_indenizacao,
              in_desconto_juros,
              cd_usuario,
              dt_atualizacao_tabela,
              cd_controle_atualizacao
      INTO #TMP_DEPOSITO_INICIAL FROM    OPENXML (@idoc, '/root/item', 2)
       WITH (ci_deposito int,
                    ci_memoria int,
                    tp_deposito_inicial tinyint,
                    cd_mes_incidencia_deposito_inicial tinyint,
                    dt_deposito_inicial smalldatetime,
                    vl_deposito_inicial money,
                    in_desconto_honorarios char(1),
                    in_desconto_indenizacao char(1),
                    in_desconto_juros char(1),
                    cd_usuario char(7),
                    dt_atualizacao_tabela datetime, 
                    cd_controle_atualizacao timestamp)

      EXECUTE sp_xml_removedocument @iDoc

      IF EXISTS(SELECT TOP 1 1 
                  FROM #TMP_DEPOSITO_INICIAL tmp
                  LEFT JOIN deposito_inicial dep (NOLOCK) ON dep.ci_deposito = tmp.ci_deposito AND dep.ci_memoria = @ci_memoria  --AND
                       --dep.cd_controle_atualizacao = tmp.cd_controle_atualizacao
                 WHERE dep.cd_controle_atualizacao is null)
      BEGIN RAISERROR ('Há deposito alterado por outra aplicação, favor refazer o processo', 16, 1)
           DROP TABLE #TMP_DEPOSITO_INICIAL
           RETURN
      END

      -- Efetua alteração
      UPDATE dep
      SET    
             tp_deposito_inicial                  = tmp.tp_deposito_inicial,
             cd_mes_incidencia_deposito_inicial   = tmp.cd_mes_incidencia_deposito_inicial,
             dt_deposito_inicial                  = tmp.dt_deposito_inicial,
             vl_deposito_inicial                  = tmp.vl_deposito_inicial,
             in_desconto_honorarios               = tmp.in_desconto_honorarios,
             in_desconto_indenizacao              = tmp.in_desconto_indenizacao,
             in_desconto_juros                    = tmp.in_desconto_juros,
             cd_usuario                           = tmp.cd_usuario,
             dt_atualizacao_tabela                = tmp.dt_atualizacao_tabela
      FROM deposito_inicial dep
      INNER JOIN #TMP_DEPOSITO_INICIAL tmp ON dep.ci_deposito = tmp.ci_deposito AND dep.cd_controle_atualizacao = tmp.cd_controle_atualizacao
      WHERE dep.ci_memoria = @ci_memoria 


      SET @CodErroSQL = @@ERROR 
      IF (@CodErroSQL <> 0) 
      BEGIN RAISERROR (@CodErroSQL, 16, 1) 
         RETURN 
      END 
      DROP TABLE #TMP_DEPOSITO_INICIAL
      SET NOCOUNT OFF

RETURN  

END

 

 

Porém não esta funcionando.

 

Se eu forço uma conversão para string, quando o valor chega para a proc ele fica alterado e não é possível alterar.

 

Não estou sabendo lidar com essa situação.

 

Por isso queria saber algum modo de converter valor TimeStamp (sql) para String e vice-versa.

 

Se alguém conhecer a solução, por favor, me ajude.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu forço uma conversão para string, quando o valor chega para a proc ele fica alterado e não é possível alterar.

Não achei no seu código VB onde você tenta fazer esta conversão, esta em algum lugar?

 

Por isso queria saber algum modo de converter valor TimeStamp (sql) para String e vice-versa.

Você está querendo fazer esta conversão no procedure ou no VB?

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Bruno,

 

Preciso nos dois.

 

Preciso converter o valor TimeStamp no VB para String (assim posso criar o XML) e depois pegar esse valor e passar essa string para o SQL. Dentro do SQL quero pegar esta string e voltar a converter para TimeStamp para a comparação.

 

Até consegui converter de TimeStamp para String. Mas esse valor e modificado quando volto para o SQL.

 

Olha, valeu pela dedicação, tá ?

 

Abraços,

Carla

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.