DUVIDA EM COPIAR E INSERIR DADOS NA MESMA TABELA

VINICIUSVB 11/08/2011 13:15:47
#381377
Pessoal boa tarde

Alguem pode me dizer como faço para copiar dados em uma tabela e inserir estes dados nesta mesma tabela novamente mas determinando o valor do campo codigo? Tentei mais ou menos assim:



Dim CODIGO_COTACAO AS string
Dim CODIGO_COTACAO_ATUAL AS string = ME.TxtCODIGO.Text

[Ô]INSERT INTO TBCotacaoDetalhes(CODIGO_COTACAO, CODIGO_PRODUTO, QUANTIDADE) SELECT TBCotacaoDetalhes.CODIGO_PRODUTO, TBCotacaoDetalhes.QUANTIDADE [Ô] &
[Ô] FROM TBCotacaoDetalhes WHERE TBCotacaoDetalhes.CODIGO_COTACAO =[ô][Ô] & CODIGO_COTACAO & [Ô][ô][Ô]


Faço a pesquisa na tabela com a clausula WHERE CODIGO_COTACAO = CODIGO_COTACAO, MAS AO INSERIR NOVAMENTE NA TABELA EU QUERO DEFINIR NOVAMENTE OUTRO CODIGO_COTACAO PARA ESTES PRODUTOS. Não sei se expliquei direito.

FABIOPAGANINI 11/08/2011 13:22:30
#381378
Resposta escolhida
não. nao explicou muito bem não. mas vamos ver;
vc quer duplicar o registro, isto?
ou seja, após a alteração manter os dois registro?
e o codigo que voce quer mudar é como se fosse um versionamento?
VINICIUSVB 11/08/2011 13:34:34
#381382
Isso mesmo! Eu quero duplicar os registros, mas é como se fosse inserí-los novamente mas com outro codigo sequencial:

TABELA
CODIGO_COTACAO CODIGO_PRODUTO QUANTIDADE OUTROS CAMPOS
0001 0002 100
0001 0004 150

0002 0002 100
0002 0004 150


Como se eu tivesse cadastrando novamente os mesmos produtos mas o codigo do cadastro diferente.
FABIOPAGANINI 11/08/2011 14:04:12
#381393
hum. isto se chama versionamento.
outra coisa, na hora da consulta, do produto 2 por exemplo, devera vir apenas o ultimo não? ou ambos?
se for apenas o ultimo, vc poderia muito bem fazer um [Ô]order by Codigo-cotaçao desc[Ô], mas é mais lento do que criar um novo campo chamato [Ô]Ativo[Ô] , onde na consulta vc busca apenas os ativos. mas entao vamos ao trabaho.

então é assim,
na hora de inserir, vc precisa do codigo da versao do produto, eu chamo esta coluna de versao, mas neste caso vc esta chamando de Codigo_Cotacao.
adicione uma coluna chamada Ativo, pode ser booleando, ou int, da forma que o seu banco trabalha.

na hora do cadastro de um novo registro, o Ativo sera sempre True, ou 1.

quando voce for ler este registro para edição, faça assim (select * from tabela where ativo = 1 and codigo_produto = @codigo order by codigo_cotacao desc)

vc vai ler todas as suas variaveis da tabe,a mas a importante aqui é a versao.
entao faça:

CodigoCotacao = leitor([ô]Codigo_Cotacao[ô])

na hora de salvar, vc vai ter um update e depois um insert.
entao faça assim:

[Ô]update tabela set ativo = 0 where codigo_produto = @codigo_produto[Ô] [ô] veja que aqui vc esta desativando as versoes anteriores

agora vc precisa inserir um novo registro

entao faça assim:

CodigoCotacao = CodigoCotacao + 1 [ô][ô][ô] mesmo que CodigoCotacao +=1, apenas para melhor entendimento.
[ô]insert into Tabela (CodigoCotacao, Ativo, bla, bla,bla,bla) values (@Codigocotacao, 1, bla,bla,bla,bla)[ô]





VINICIUSVB 11/08/2011 14:30:31
#381400
Fábio obrigado pela resposta. Eu entendi mais ou menos. Neste momento estou um pouco ocupado e depois com calma vou analizar melhor sua resposta. Mas veja bem, meu sistema consiste em uma tela de cotações de produtos, onde tenho o cabeçalho com as informações gerais (Codigo da cotação, solicitante, data, e outras) e abaixo eu tenho um grid com campos de Codigo, Descrição do produto, Quantidade, Preço 1, Preço, 2 e Preço3.

No momento em que o usuário começar a fazer esta cotação se por algum motivo os produtos que ele vá cotar forem os mesmos de uma cotação realizada em outra ocasião ele fará uma pesquisa destas cotações. Encontrada esta cotação ele irá importar os produtos desta cotação para esta nova cotação que ele está elaborando ao invés de ter que inserí-los novamente. Ou seja, dar o Select nesta tabela com o codigo da cotacao escolhida e o resultado inserir (duplicar) com o codigo da cotacao em que ele estará fazendo neste momento. Este codigo eu pegaria do TxtCODIGO mesmo. Entendeu? Eu pensei em localizar estes registros na tabela e armazená-los em um DataTable e depois salvá-los no banco, mas também não consegui.

Valeu pela atenção!
FABIOPAGANINI 11/08/2011 14:41:50
#381404
pois é, é que eu nao intendi ainda a natureza do seu problema.

entao vou fazer algumas perguntas, com as respostas posso ja montar um código mais específico.

Que tipo de consulta é feito para exibir os registros no grid?
que tipo de registro não pode ser exibido nesta consulta?

todos os produtos que pertence a um grupo (Cotação) permanecerão no novo grupo após a alteração de qualquer um dos registro neste grupo? ou seja, duplicar todos os registros do grupo 1 para o grupo 2 no momento que um unico item do grupo um fui transformado em grupo 2?
VINICIUSVB 11/08/2011 16:47:30
#381450
Aí vai!

Para listar os registros no grid: (vou simplificar)

SELECT CODIGO_PRODUTO, QUANTIDADE FROM TBDetalhesCotacao WHERE TBDetalhesCotacao.CODIGO_COTACAO = [Ô]0002[Ô]
______________________________________________________________
CODIGO_PRODUTO QUANTIDADE
0002 100
0003 100
0005 150

Estes produtos pertence à cotação de numero 0005. Agora eu quero pegar estes produtos e duplicar na mesma tabela só que atualizando para o codigo da cotação que está sendo elaborada (importação de dados), vamos supor que seja a cotação de numero 0020 (cotação em andamento). Depois de gravar estes produtos selecionados já com o codigo da cotação em andamento eu pretendo dar um .FILL para listar no grid de produtos da cotacao em andamento estes produtos para que eu possa fazer a edição dos demais dados como lançamento dos preços. Neste caso estou usando dataset tipado.

Meu problema é o sequinte: eu poderia transferir os produtos listados no grid 2 para o grid 1. Só que eu estou udando um componente de grid que não é o nativo do visual studio e já tentei e procurei de todas as formas fazer isso via codigo, inclusive através da propriedade datasource. Por isso estou vendo se tem jeito de ser desta forma. Senão, ou se for complicado demais, ou então não for uma maneira correta de se fazer desta forma eu continuarei a procurar um outro jeito. O problema de se usar componentes de terceiros é isso. Nem sempre agente encontra foruns como esse aqui que nos dá estes suportes. Principalmente quando agente é aprendiz e está aprendendo na raça, como é o meu caso.

Ah, e para piorar eu não sei inglês.


Valeu Fábio! Obrigado mesmo pelo apoio. Fico aguardando resposta de você e dos outros também.
VINICIUSVB 11/08/2011 16:49:02
#381452
Desculpe! Uma correção: [Ô]Estes produtos pertence à cotação de numero [Ô]0002[Ô] conforme informado na instrução SQL.
FABIOPAGANINI 11/08/2011 17:27:03
#381465
Cara, eu estou a dois anos trabalhando em um framework, ele ajudaria muito neste caso, mas como ele não esta completo ainda, nao posso disponibilizar ele para a comunidade.
em breve ele estará ajudando muito o pessoal do .net.
mas entao vamos ver se com classes e coleções de classes conseguimos resolver o seu caso.

   

Public Class Cotacao
Public Property CodigoCotacao As Integer
Public Property CodigoProduto As Integer
Public Property Quantidade As Integer
Friend Property CodigoCotacaoOriginal As Integer


[ô][ô][ô] <summary>
[ô][ô][ô] Abre todos os produtos de uma cotacão
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]Cotacao[Ô]>Codigo da cotação</param>
[ô][ô][ô] <returns>Colecao de cotacoes para o produto</returns>
[ô][ô][ô] <remarks>Lembrando que este array podera ser anexado ao seu datasource que os dados aparecerao no grid</remarks>
Public Function Open(Cotacao As Integer) As Cotacao()
Dim cotacoes As New List(Of Cotacao)()



[ô]Claro que o datareader vc vai implementar conforme o seu banco de dados, conexao e etc
Dim dr As New Data.SqlClient.SqlDataReader()

[ô]a partir daqui que a leitura é feita apos o dr devidamente setado
Using leitor As IDataReader = dr
While leitor.Read
Dim ct As New Cotacao()
ct.CodigoCotacao = leitor([Ô]Codigo_Cotacao[Ô])
ct.CodigoProduto = leitor([Ô]Codigo_Produto[Ô])
ct.Quantidade = leitor([Ô]Quantidade[Ô])
[ô]esta propriedade nos sera util para saber se o original foi modificado ou nao
ct.CodigoCotacaoOriginal = ct.CodigoCotacao

cotacoes.Add(ct)
End While
End Using


[ô]pronto, aqui neste ponto ja temos certeza que retornamos todos os items para o codigo de cotacao informado
Return cotacoes.ToArray()
End Function


[ô][ô][ô] <summary>
[ô][ô][ô] Esta função insere novos registros para cada produto caso alguma das cotações forem alterada
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]Cotacoes[Ô]> a coleção de cotaçoes com os produtos</param>
[ô][ô][ô] <returns>verdadeiro se alguma alteraçao foi realizada, falso se nenhuma alteração foi fieta</returns>
[ô][ô][ô] <remarks>Como ocorrera a modificação das proriedades nao me foi compreendido, podemos rever isto</remarks>
Public Function Save(Cotacoes As Cotacao()) As Boolean

Dim alterado As Boolean = False
Dim NovaCotacao As Integer = 0
For Each item As Cotacao In Cotacoes
[ô]verificando item por item e vendo se algum deles esta com o codigo de cotação diferente do original
If (item.CodigoCotacao <> item.CodigoCotacaoOriginal) Then
NovaCotacao = item.CodigoCotacao
alterado = True
Exit For
End If
Next
If (alterado) Then
For Each item As Cotacao In Cotacoes
[ô]verificando item por item e vendo se algum deles esta com o codigo de cotação diferente do original
If (item.CodigoCotacao <> item.CodigoCotacaoOriginal) Then
[ô]alterando o codigo de cotacao para o novo codigo de cotação para todos os produtos
item.CodigoCotacao = NovaCotacao
Insert(item)
Exit For
End If
Next
End If
Return alterado
End Function


Public Sub Insert(cotacao As Cotacao)
[ô]implementar o seu command conforme o seu banco de dados, conexao e etc
Dim command As IDbCommand
[ô]O adequado é trabalhar com parametros, mas para simplificar, vamos assim mesmo
command.CommandText = [Ô]insert into tbDetalhesCotacao (codigo_cotacao, codigo_produto, quantidade) values ([Ô] & cotacao.CodigoCotacao & [Ô],[Ô] & cotacao.CodigoProduto & [Ô],[Ô] & cotacao.Quantidade & [Ô])[Ô]
command.ExecuteNonQuery()
End Sub


End Class






Não intendi ainda o como vai ser feito a modificação dos parametros,
pode me especificar a tela de input? o como um codigo de cotaçao sera mudado pelo usuário?nisto podemos a base desta classe, trabalhar ja na função que irá salvar o conteudo
VINICIUSVB 11/08/2011 17:58:18
#381482
Cara vc fez isso tudo só para me ajudar! Não queria incomodar assim.

Mas vamo lá. Tudo funcionará assim: o usuário clica em novo, no TxtCODIGO gera o código da cotação, ele preenche os dados gerais. Na hora de inserir os produtos ele faria esta importação caso ele saiba que irá refazer uma cotação. Importados os registros e listados no grid principal ele fica editável. Daí ele lança os preços em cada linha do grid correspondente ao produto. No evendo row.update chama o metodo que atualiza a linha de dados do grid. Como eu estou usando dataset tipado e o datasource deste grid é TBCotacaoDetalhesBindingSource eu uso o código [Ô]TBCotacaoDetalhesTableAdapter.Update(BDadosDataSet.TBCotacaoDetalhes[Ô] para atualizar na tabela.

Valeu!
FABIOPAGANINI 11/08/2011 18:10:42
#381484
não é incomodo. gosto de exercitar a mente.

mas ainda nao intendi a sua dificuldade. vc ja esta conseguindo chamar o rowupdate,
neste metodo não consegue tratar todos os outros registros?
ou vc queria que no TBCotacaoDetalhesTableAdapter.Update(BDadosDataSet.TBCotacaoDetalhes ele nao atualizasse e sim inserisse?

pq quando vc esta com uma ligação entre o Datasource e o banco, o update realmente vai atualizar os próprios registros,
e por isto, a atualização tera que ser feita manualmente, conforme te mostrei na classe:
ex:

dim registros a object = classe.open(2)
...
...
Datagridview1.datasource = registros
...
..

[metodo que atualiza a linha de dados do grid]

registros(e.rowindex).quantidade = e.value

...
...
...
[ TBCotacaoDetalhesBindingSource ]

classe.save(registros)




Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas