SALVAR E APAGAR INFORMA?ÕES DA TABELA

MOUSER 04/04/2014 17:40:08
#436914
Galera, estou com um probleminha muito simples, mas que não consigo resolver, criei um sistema de vendas, ele registra todos os produtos selecionados na tabela carrinho de compras, mas estou tendo dificuldade de jogar a tabela inteira na outra tabela chamada CompraFinalizada, estou usando os códigos direto no VB.NET, mas agora pretendo usar o código do SQL para fazer isso por mim e gravar na vareavel, alguem sabe como se faz esse procedimento, e assim que salvar da tabela carrinho de compras para o comprafinalizada, ele tem que apagar todos os registros da tabela Carrinho depois que salvou na CompraFinalizada ou se por acaso o rapaz só queria uma cotação e no final cancelou as compras, clicar em cancelar compras e apagar todos os registros contidos na tabela Carrinho de compras, alguem lembra desta função? Desculpa fazerem perder tempo com algo simples...
DUMMIES 04/04/2014 18:53:52
#436916
Não sei se entendi direito.
Mas para popular outra tabela com dados de uma já existente você pode fazer assim (diretamente no banco):

insert into tabela_destino
select * from tabela_origem
where num_pedido = 11111

Na sintax acima só funciona se a estrutura das duas tabelas forem iguais.
Depois disso faça assim para apagar os dados da primeira tabela:

delet from tabela_origem
where num_pedido = 11111


Se não for bem isso que tenha dúvida, então retorne.
MOUSER 05/04/2014 19:40:52
#436940
Vou tentar criar uma lógica e aplicar isso... Obrigado!
FILMAN 06/04/2014 14:59:24
#436951
Resposta escolhida
Não entendi muito bem o que você quer!

Primeiro você quer fazer isso via código da aplicação ou via banco(procedure) mesmo?

[txt-color=#e80000]via código aplicação vb.net: [/txt-color]
Inicialmente para todos os casos você deve ter o código (handle ou ID) ou seja código chave do pedido em uma variável.

Ao clicar no botão cancelar
você vai usar uma query DELETE que será igual o que o nosso amigo DUMMIES disse:
DELETE FROM SuaTabela WHERE ID_PEDIDO = Código_da_variavel_comentada_acima


Ao clicar no botão confirmar
você vai usar uma query SELECT e uma query INSERT
Inicialmente você gravará uma consulta em um DataTable ou DataSet ou ViewState (prefiro o DataTable)

SELECT * FROM SuaTabela WHERE ID_PEDIDO = Código_da_variavel_comentada_acima
[ô]Faça a estrutura de retorno no seu gosto, porém terá que realizar uma gravação na tabela de compras definitiva

[ô]Suponho que retornou um DataTable
For Each rw As DataRow in dtResultado.Rows
Dim qSQL As String = [Ô]INSERT INTO SuaTabelaDefinitiva VALUES ([Ô] & rw([Ô]Campo1) & [Ô],[Ô] & rw([Ô]Campo2[Ô]) & [Ô])[Ô]

[ô]Aqui você chama a função para gravação da query acima
Next



[txt-color=#e80000]via código SQL Server procedure: [/txt-color]
Essa procedure tem 3 parametros
@TIPO que receberá o tipo de execução
1=Cancelar(quando clicar no botão cancelar)
2=Confirmar(quando clicar no botão confirmar)

@COD_PEDIDO que receberá o código do pedido

@RESULTADO que retornará se a procedure deu certo ou não
0=Erro
1=Tudo ocorreu como esperado

CREATE PROCEDURE FINALIZAVENDA (
@TIPO CHAR(1), -- 1=Cancelar / 2=Confirmar
@COD_PEDIDO INTEGER,
@RESULTADO bit OUTPUT -- 0=Erro / 1=TudoCerto
)

AS BEGIN TRY

BEGIN TRANSACTION


--Campos das Tabelas (No caso as tabelas devem ser identicas eu creio)
DECLARE @CAMPO1 VARCHAR(100)
DECLARE @CAMPO2 INTEGER

SET @RESULTADO = 1

IF @TIPO = 1
BEGIN

--Somente Exclui os itens
BEGIN TRY

DELETE FROM SuaTabela WHERE ID_PEDIDO = @COD_PEDIDO

END TRY
BEGIN CATCH

SET @RESULTADO = 0

END CATCH

END
ELSE
BEGIN

BEGIN TRY

--Cursor para percorrer as linhas da tabela
DECLARE C_TABELA1 CURSOR FOR SELECT Campo1, Campo2 FROM SuaTabela WHERE ID_PEDIDO = @COD_PEDIDO

OPEN C_TABELA1;

FETCH NEXT FROM C_TABELA1
INTO @CAMPO1, @CAMPO2

WHILE @@FETCH_STATUS = 0
BEGIN

--Lembre-se que não estou direcionando os campos, pois creio que as tabelas estão identicas
--Caso os campos esteja fora de ordem você pode passar os campos no INSERT também
--INSERT INTO SuaTabelaDefinitiva (CAMPO1,CAMPO2) VALUES (@CAMPO1,@CAMPO2)

INSERT INTO SuaTabelaDefinitiva VALUES (@CAMPO1,@CAMPO2)

FETCH NEXT FROM C_TABELA1
INTO @CAMPO1, @CAMPO2
END

CLOSE C_TABELA1
DEALLOCATE C_TABELA1

END TRY
BEGIN CATCH

DEALLOCATE C_TABELA1
SET @RESULTADO = 0

END CATCH

--Exclui os itens após gravação na tabela
BEGIN TRY

--Somente eclui os itens caso não tenha ocorrido erro no código acima
IF @RESULTADO = 1
DELETE FROM SuaTabela WHERE ID_PEDIDO = @COD_PEDIDO

END TRY
BEGIN CATCH

SET @RESULTADO = 0

END CATCH
END

IF @RESULTADO = 0
BEGIN
ROLLBACK
END
ELSE
BGIN
COMMIT
END

END TRY
BEGIN CATCH
ROLLBACK
SET @RESULTADO = 0
END CATCH


Lembro que fiz tudo correndo e deve ser adaptado ao seu caso! Só estou querendo ajudar.
Outra coisa deve executar a procedure na sua aplicação pesquise por executar procedure vb.net que encontrara muitas coisas

Qualquer duvida poste ai
NILSONTRES 06/04/2014 19:59:36
#436953
A Dica do DUMMIES, funciona.
Mas não aconselho esse tipo de procedimento, se vc utilizar transações até que pode ser, mas o correto mesmo, e mais simples, é vc criar um campo de Status, e depois da venda finalizada ou cancelada definir esse Status.
Exemplo: 0=iniciada, 1=Finalizada, 2= cancelada
MOUSER 06/04/2014 20:18:04
#436954
vou estar usando os métodos, tanto no Script do SQL Server como também na aplicação do VB.NET, em um tópico anterior, eu tinha a duvida de passar item por item de uma tabela para a outra, consegui resolver, mas tentei fazer o mesmo carregando a tabela inteira, desta vez apresentou um erro. Vou tentar aplicar as logicas aplicadas aqui. Tanto no Script tanto no VB.Net. Eu postei no tópico SQL pq uso as mesmas funções no sql no próprio vb.net. Para mim fica mais fácil relacionar erros de conexão ou busca.
MOUSER 06/04/2014 20:21:32
#436955
Sempre tive dor de cabeça com PROCEDURES, mas vou aplicar este script ao sistema... Obrigado!
FILMAN 07/04/2014 22:47:23
#436999
Vou passar um método pra você usar procedure que não vai ter mais erros!

Adapte o método ao seu gosto é basicamente uma ideia:

Public Sub AbrirConexao()
Try
If _conn.State = ConnectionState.Open Then
_conn.Close()
End If
_conn.Open()

Catch ex As Exception
[ô]Coloque sua mensagem de erro aqui

End Try
End Sub

Public Function ExecutarComando(ByVal querySQL As String, ByVal cmd As SqlCommand) As Integer
Dim _linhasAfetadas As Integer

Try

AbrirConexao()

cmd.Connection = _conn
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = querySQL

_linhasAfetadas = cmd.ExecuteNonQuery
_conn.Close()

Catch ex As Exception
If _conn.State = ConnectionState.Open Then _conn.Close()
_linhasAfetadas = -1

End Try
End Function




Para Utilizar a função você vai fazer o seguinte

No Exemplo que eu passei você vai ter 3 parâmetros

Dim _cmd As New SqlCommand

_cmd.Parameters.Add([Ô]@TIPO[Ô], SqlDbType.Char).Value = 1 [ô]Para Cancelar
_cmd.Parameters.Add([Ô]@COD_PEDIDO[Ô], SqlDbType.Int).Value = 123 [ô]Código do Pedido
_cmd.Parameters.Add([Ô]@RESULTADO[Ô], SqlDbType.Bit).Direction = ParameterDirection.Output

Dim result As Integer = ExecutarComando([Ô]NOME_SUA_PROCEDURE_AQUI[Ô], _cmd)

If result = -1 then
MessageBox.Show([Ô]Erro[Ô])
Else
MessageBox.Show([Ô]Ok[Ô])
[ô]Lembre-se pode ser que retorne 0(zero) e se retornar zero também deu erro para o seu caso
End If

Tópico encerrado , respostas não são mais permitidas