DUVIDA ALTERACAO COM INSERCAO

TIAGO007 14/07/2013 01:22:40
#425992
Bom dia a todos, estou fazendo um sistema para um centro automotivo, um simples sistema para controlar serviços,
vai ter um cadastro de serviços, vendas, e serviçosVendas que seria como itens_de_venda, so que essa venda sempre tera que ser alterada uma venda em aberto que sera finalizada ao acabar todos serviços, por exemplo chego veiculo x, nesse veiculo trocou oleo motor, a atendente(usuaria) lança o serviço, depois troca de pastilha, a usuaria localiza a venda e lança serviço de troca de pastilha, no caso a usaria teria que ter total controle de alteraçao da venda tanto remover itens, ou alterar, ou adicionar itens. Bom a parte de incluir itens ja esta pronta, eu fiz da seguinte maneira gravo a venda e pego o retorno idvenda, e do gride de itens faço um lupe onde gravo os itens, Minha duvida é para alterar a venda, exemplo o usario altera um item e adiciona outro como deve ser feito, um upgrad depois um insert? vou adicionar umas imagens de umas tabelas que fiz aqui para teste. Estou usando c# mysql windowsforms, e estou fazendo o crud na mao mesmo. A imagem é so para exemplo da minha duvida, se alguem poder me ajudar sou iniciante, gostaria de saber tbm o que é melhor gravar item a item, ou como eu fiz gravar venda e itens com um loop;
ENDERSONCOSTA 14/07/2013 01:33:16
#425993
Olá, sou novato, porém acho que consigo te ajudar.

então vejamos se eu entendi, você quer editar uma venda, podendo mudar produtos vendidos e/ou deleta-los, correto?

então seria o upgrade mesmo nos produtos existentes e na venda, e caso fosse adicionar um novo produto na venda ou deletar você usaria o insert ou o delete mesmo.

você usa upgrade na venda e usa insert em novos itens.
TIAGO007 14/07/2013 01:43:17
#425994
Sim essa é minha duvida, mas to perdido em como fazer isso, exemplo sera que quando fechar a venda, tenho que contar quantos itens tem se existir a mais do que tinha faço um insert, ou c tiver menos faço o delite do que ta faltando, estou meu confuso, de como fazer isto; Obrigado pela ajuda
TIAGO007 14/07/2013 02:28:33
#425995
Me corrijam se eu estiver errado, fui beber uma agua e tavo a pensar, seria correto eu deletar pegar os dados da venda e depois que o usuario fizer as alteraçoes na venda ainda em memoria, quando fechar a venda eu deleto todos itens, da venda, e insiro novamente, ex: DELETE FROM item_venda WHERE idvenda =1 , dai essa tabela tera uma trigger para atualizar qtd produto, ai eu faço os inserte , na tabela item_venda dos itens que esta no grid em memoria, acho que seria uma soluçao, sera que estou correto, alguem faz diferente melhor, como vs fazem ?
RENATOFRAZZATO 14/07/2013 19:26:21
#426015
Não sei se eu entendi corretamente, mas e se vc fizer o seguinte:

faça uma tela com um local em que vc especifica o veículo, depois um grid que vc inserirá os itens.

esse grid conterá, por exemplo,

codigoProduto DescricaoProduto Qtde Pvenda Total
245 Pastilha de Freio 3 25 75
.... .................... .... ... ....

Depois vc insere a venda e pega o código(id) dessa venda. Com o id da venda em mãos(em uma variável)
vc faz um loop no grid inserindo os itens na tabela itens venda.
Dica: Faça isso usando transação para garantir que os dados serão totalmente inseridos.
Não precisa ficar alterando a venda, a usuária inserirá a venda depois que o serviço no veículo estiver concluído.

Espero ter ajudado .
TIAGO007 14/07/2013 22:26:41
#426018
Sim renato, essa parte ta pronta, minha venda funciona dessa maneira, so que la no auto center, eles querem que vai anotando aos poucos, fipo assim, pego uma peça a usuaria lança a peça, e grava, minutos depois pego outra peça, dai abrea a venda para alterar.
ARCADYUM 15/07/2013 00:22:28
#426019
Não é mais fácil criar uma função que agrupa essas vendas, tipo uma ordem de serviço. Eu não sei se o seu sistema já possui a nota fiscal ou se é para controle sem fins fiscais, mas acredito que seria mais adequado você trabalhar com essas informações em separado e depois realizar o fechamento de todas as operações em uma nota fiscal só.
RENATOFRAZZATO 15/07/2013 00:24:41
#426020
Então acredito que a melhor maneira é como você está pensando mesmo, isto é,
permitir que a usuária altere os itens da venda, como se fosse um cadastro.

Aí vc poderia fazer uma tela para consultar vendas e ao abrir a venda consultada
apareceria uma tela semelhante a tela que eu expliquei anteriormente com o grid contendo os itens.
Porém nessa tela vc nao poderia mudar o veículo, somemte manipular os itens.

Nessa tela teria um botao adicionar item e talvez um de remover e entao seria possível modificar os itens.
A cada item incluído vc faz um loop para verificar se esse item está no grid se estiver vc soma as quantidades senao
dá um Grid.rows.add(coluna1, coluna2, . . ., colunan), ou seja, adiciona o item no grid.

no botao salvar venda vc faz um comando delete na tabela de itens com o codigo da venda que vc está alterando, se houver
registro será deletado senao nada acontece.

Acho que sua dúvida é em como alterar né?
entao faça isso, da um delete na tabela de itens informando o codigo da venda que está sendo modificada e inclui os itens denovo.

Transacao
comando delete from itens where idvenda = id

loop
{
insert into itens (campo1,... campon) values (...);
}
commit

Essa é uma opção, não sei se a melhor, talvez alguém ae forneça outra.

Grande abraço.
LUIS.HERRERA 02/08/2013 08:22:32
#426920
Tiago vou falar como faço em casos assim:

Há duas opções, que variam em função do tipo de cadastro que uso.

1) Por exemplo um cadastro de funcionários com Telefones e e-mails (estes dois últimos são duas outras tabelas relacionadas)
Nesse caso na edição do funcionário, para ser mais fácil e rápido eu deleto todos os telefones e e-mails e incluo os que estão informados.

2) Num cadastro com dados mais complexos, como parece o seu, eu não faria isso. No DAL, na rotina de inclusão da venda ou edição, você chamaria a cada item desses serviços/produtos, um outro método JaExisteServicoProduto(int idvenda, int idItem)

Esse método irá procurar no banco se o item existe, se existir você usa chama o método Update para esse item, se não continua no Insert dele.

Veja que você está trabalhando com duas ou mais tabelas, então o Insert da venda, dentro de um loop, chama o insert do item que tem uma entidade diferente.

Agora um detalhe importante, uma venda pode ter mais de um item igual? Imagina que foi feito o balanceamento das rodas dianteiras, mas depois de tudo feito, foi detectado que as traseiras também precisariam ou outro serviço só exemplo. Nesse caso seria lançado um segundo serviço balanceamento, porém nesse caso sua estrutura de tabelas teria problema, pois o IDvenda e IDitem são chave primaria, e não seria possível incluir outro. Ou você teria de ter serviços bem específicos (balanceamento rodas dianteiras e balanceamento rodas traseiras, ou terá de incluir uma chave primaria diferente da atual, novo campo Int como chave.
Tópico encerrado , respostas não são mais permitidas