Você está na página 1de 5

Comandos SLQ dim sSql as string sSql="UPDATE BAIXAPED SET ESTOQUE=(SELECT ESTOQUE FROM PRODUTO P WHERE P.COD = BAIXAPED.

COD)"

SELECT * FROM PRODUTOS WHERE ESTOQUE <= ESTOQUEMINIMO;

public static bool AtualizaEstoque(int codigoProduto, float qtde) { bool bAtualiza = false; string strSql = "UPDATE TBPRODUTO SET ESTOQUE=(ESTOQUE-@QTDE) WHERE ID_PRODUTO=@CODIGO"; try { MySqlConnection conexao = new MySqlConnection("minha conexao"); MySqlCommand comando = new MySqlCommand(strSql, conexao); comando.Parameters.AddWithValue("@CODIGO", codigoProduto); comando.Parameters.AddWithValue("@QTDE", qtde); bAtualiza = (comando.ExecuteNonQuery() == 1); }catch { } return bAtualiza; }

public void baixaEstoque(string quantidade) {

string SQL = "UPDATE produto SET qtd_estoque = qtd_estoque - "+quantidade+" WHERE codigo = @codigo"; cmd.CommandText = SQL; MySqlParameter pC = new MySqlParameter("@codigo", codigo); cmd.Parameters.Add(pC); bd.AtualizarRegistro(SQL, cmd); cmd.Parameters.Clear(); if (bd.Cont > 0) { bd.Cont = 0; }

Utilizando cursores

Antigamente, na utilizao dos arquivos textos e flat files, como o dBase, o acesso aos dados era realizado seqencialmente. Caso o desenvolvedor necessitasse acessar vrios registros de uma s vez era necessria a utilizao de um lao (comando While, por exemplo) para acessar os registros necessrios... por
Lawrence Carvalho
6 22 1 0

Hello world! Este meu primeiro artigo no Linha de Cdigo (se que ser aprovado). J Antigamente, na utilizao dos arquivos textos e flat files, como o dBase, o acesso aos dados era realizado seqencialmente. Caso o desenvolvedor necessitasse acessar vrios registros de uma s vez era necessria a utilizao de um lao (comando While, por exemplo) para acessar os registros necessrios. Com o advento dos novos SGBDs (em especial o SQL Server) isso no mais necessrio, pois com o modelo relacional de banco de dados, so acessados vrios registros de uma s vez atravs dos comandos SELECT, UPDATE e DELETE. O nmero de registros retornados depende do tamanho da tabela e da forma com que so buscados em conjunto com a clusula WHERE, que realiza uma filtragem nos dados selecionados. Contudo, existem situaes em que trazer os registros de uma s vez no conveniente ou possvel para realizar certos tipos de operaes, onde necessrio obter resultado de cada linha uma a uma. Nestes casos os SGBDs atuais fornecem um recurso bastante interessante, chamado cursor. O cursor uma instruo SELECT que ser acessada linha a linha atravs de um lao While e alguns comandos especficos para cursores e utilizado normalmente em procedimentos armazenados (stored procedures). Ento vamos a prtica! Para este exemplo ser utilizado o modelo abaixo, que contm uma tabela de clientes, vendas, produtos e itens da venda. Neste modelo, a venda gravada juntamente com os seus itens, mas seu estoque no baixado enquanto a venda no finalizada. Ser criado um procedimento armazenado chamado finaliza_vendas, que alterar o campo situao da venda (VenSit) de 0 (aberta) para 1 (finalizada) e neste momento sero baixados todos os produtos do estoque (tabela produtos, coluna prodqtdest) de acordo com o que foi inserido na tabela itens (campo ivqtd). Primeiramente para iniciar a utilizao de um cursor necessrio definir a instruo SELECT que ele acessar. No nosso exemplo, buscar todos os itens da venda que deve ser finalizada (varivel @VenCod), conforme abaixo.

-- Select utilizado para o cursor SELECT ProdCod, IVQtd FROM Itens WHERE VenCod = @VenCod recomendado que voc execute o SELECT no Query Analyser para verificar se o resultado o esperado. Aps isso, deve ser utilizado o comando DECLARE, que serve para declarar variveis e o cursor. A varivel @VenCod ser um parmetro do procedimento, logo no necessita declarao. Abaixo est a declarao do cursor. --Declarando cursor

DECLARE CurItens --Nome do cursor


CURSOR FOR -- Select utilizado para o cursor SELECT ProdCod, IVQtd FROM Itens WHERE VenCod = @VenCod Realizada a declarao do cursor necessrio realizar a abertura dele buscando o primeiro registro. Para isto sero declaradas variveis que recebero o cdigo do produto e a quantidade vendida, atravs do comando FETCH. O comando FETCH NEXT traz a prxima linha do SELECT, contudo o comando FETCH pode ser usado em conjunto com outras clusulas para outros comportamentos, como o FETCH PRIOR (Anterior), FETCH FIRST (Primeiro), FETCH LAST (ltimo), entre outros. --Declarando variveis

DECLARE @ProdCod INTEGER, @IVQtd MONEY


--Abrindo cursor OPEN CurItens --Atribuindo valores do select nas variveis FETCH NEXT FROM CurItens INTO @ProdCod, @IVQtd Este comando definiu os valores da primeira linha de retorno, contudo o cursor utilizado para acessar vrias linhas. Para isso ser utilizado um lao (WHILE) em conjunto com a varivel global do SQL Server @@FETCH_STATUS. Esta varivel retorna 0 (zero) caso o ltimo comando de FETCH tenha sido executado com sucesso e tenha retornado dados e 1 caso no haja mais dados (EOF fim de arquivo). Por fim utilizamos os comandos CLOSE , para fechar o cursor e DEALLOCATE, para eliminlo da memria, pois caso o procedimento seja executado novamente, pode apresentar erro na declarao do cursor, caso o cursor ainda exista. O lao descrito abaixo: --Iniciando lao

WHILE @@FETCH_STATUS = 0
BEGIN --Prxima linha do cursor FETCH NEXT FROM CurItens INTO @ProdCod, @IVQtd END --Fechando e desalocando cursor CLOSE CurItens DEALLOCATE CurItens De posse do cdigo do produto e da quantidade em estoque podemos baixar o estoque na tabela de produtos com o cuidado de no deixarmos os estoque negativo, o que poderia ser feito atravs de uma restrio de domnio (check) na tabela de estoque, entretanto neste exemplo utilizaremos uma verificao com um SELECT na tabela de

estoque. Caso o estoque no fique negativo, o comando para baixar o estoque realizado, caso contrrio ser levantado um erro com o comando RAISERROR. --Iniciando lao

WHILE @@FETCH_STATUS = 0
BEGIN IF (SELECT ProdQtdEst - @IVQtd FROM Produtos WHERE ProdCod = @ProdCod) >= 0 UPDATE Produtos SET ProdQtdEst = ProdQtdEst - @IVQtd WHERE ProdCod = @ProdCod ELSE RAISERROR(Estoque insuficiente!, 15, 1) --Prxima linha do cursor FETCH NEXT FROM CurItens INTO @ProdCod, @IVQtd END --Fechando e desalocando cursor CLOSE CurItens DEALLOCATE CurItens Para finalizar, caso tudo tenha ocorrido com sucesso, devemos finalizar a venda propriamente dita, mudando o campo VenSit de 0 para 1. Uma prtica muitssimo recomendada trabalhar com transao, pois caso um item d problemas os demais que j teriam sido baixados devem ser retornados. Desta forma o procedimento completo ficaria como descrito abaixo: --Procedimento para finalizao de uma venda CREATE PROCEDURE finaliza_venda (@VenCod INTEGER) AS --Declarando cursor

DECLARE CurItens --Nome do cursor


CURSOR FOR -- Select utilizado para o cursor SELECT ProdCod, IVQtd FROM Itens WHERE VenCod = @VenCod --Declarando variveis

DECLARE @ProdCod INTEGER, @IVQtd MONEY


--Iniciando transao
BEGIN TRANSACTION

--Abrindo cursor OPEN CurItens --Atribuindo valores do select nas variveis FETCH NEXT FROM CurItens INTO @ProdCod, @IVQtd --Iniciando lao

WHILE @@FETCH_STATUS = 0
BEGIN IF (SELECT ProdQtdEst - @IVQtd FROM Produtos WHERE ProdCod = @ProdCod) >= 0 UPDATE Produtos

SET ProdQtdEst = ProdQtdEst - @IVQtd WHERE ProdCod = @ProdCod ELSE BEGIN --Desfazendo o que foi realizado anteriormente ROLLBACK TRANSACTION --Levantando erro RAISERROR(Estoque insuficiente!, 15, 1) --Fechando e desalocando cursor aqui tambm, pois o return sair do procedimento CLOSE CurItens DEALLOCATE CurItens --Saindo do procedimento RETURN END --Prxima linha do cursor FETCH NEXT FROM CurItens INTO @ProdCod, @IVQtd END --Fechando e desalocando cursor CLOSE CurItens DEALLOCATE CurItens --Caso tudo tenha ocorrido OK, alterando a situao da venda UPDATE Vendas SET VenSit = 1 WHERE VenCod = @VenCod --Confirmando transao COMMIT TRANSACTION Bom pessoal, por hora isso. Espero que o artigo seja aceito e que eu posso escrever mais por aqui. Um grande abrao!
Read more: http://www.linhadecodigo.com.br/artigo/876/utilizando-cursores.aspx#ixzz2VOTknGE1

Você também pode gostar