Ir para conteúdo
Fórum Script Brasil

Denis Courcy

Moderadores
  • Total de itens

    3.089
  • Registro em

  • Última visita

Posts postados por Denis Courcy

  1. Faça assim:

    SELECT tbCidades.nome AS Cidade, tbFiliais.nome AS Filial, tbProdutos.nome AS NomeProduto,
    SUM(IF(tbVendas.formapgto "C", 1,0)) AS VendasCartao,
    SUM(IF(tbVendas.formapgto "D", 1,0)) AS VendasDinheiro,
    SUM(IF(tbVendas.formapgto IN ('C',"D"), 1,0)) AS VendasTotal
    FROM cidades tbCidades
    INNER JOIN filiais tbFiliais ON tbFiliais.idCidade = tbCidades.idCidade
    INNER JOIN produtos tbProdutos ON tbProdutos.idFilial = tbFilial.idFilial
    INNER JOIN vendas tbVendas ON tbProdutos.idProduto = tbVendas.idProduto
    WHERE  tbCidades.nome='Rio de Janeiro' AND tbFiliais.nome='Copacabana'  AND tbVendas.data='15/11/2017'
    GROUP BY Cidade, Filial, NomeProduto

     

  2. Abaixo segue um exemplo de uma storage procedure que uso em meus sistemas:

    DELIMITER $$
    
    USE `meubancodedados`$$
    
    DROP PROCEDURE IF EXISTS `minhaprocedure_crud`$$
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `minhaprocedure_crud`(IN Acao CHAR(1), IN pidCampo INTEGER, IN pnmCampo VARCHAR(50), IN 
       pidUsuarioRespInclusao INTEGER, IN pidUsuarioRespAlteracao INTEGER)
    BEGIN
       DECLARE msg VARCHAR(1000) DEFAULT "MySQL: Sem mensagem";
       DECLARE excecao SMALLINT DEFAULT 0;
       DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1;
       IF pnmCampo = "" OR (Acao <> "I" AND pidCampo = 0) THEN
          SET msg = "MySQL: Erro na passagem de parametros";
       ELSE
          START TRANSACTION;
          /*Inclusao*/
          IF Acao = "I" THEN
             INSERT INTO minhaTabela(nmCampo, idUsuarioRespInclusao, dhInclusaoInformacao)
             VALUES (pnmCampo, pidUsuarioRespInclusao, NOW());
             IF excecao = 1 THEN
                SET msg = "MySQL: Erro ao inserir na tabela de minhaTabela";
                ROLLBACK;
             END IF;
          END IF;
       
          IF excecao <> 1 THEN
             IF Acao <> "I" THEN
                SET @idCampo = pidCampo;
             END IF;
             /*Alteracao*/
             IF Acao = "A" THEN
                UPDATE minhaTabela
                SET nmCampo = pnmCampo,
                    idUsuarioRespAlteracao = pidUsuarioRespAlteracao
                WHERE idCampo = @idCampo;
                IF excecao = 1 THEN
                   SET msg = "MySQL: Erro ao atualizar minhaTabela";
                   ROLLBACK;
                END IF;
             END IF;
          END IF;
          /*Exclusao*/
          IF excecao <> 1 THEN
             IF Acao = "E" THEN
                DELETE FROM minhaTabela
                WHERE idCampo = @idCampo;
                IF excecao = 1 THEN
                   SET msg = "MySQL: Erro ao excluir minhaTabela";
                   ROLLBACK;
                END IF;
             END IF;
          END IF;
            
          /*Se tudo deu certo, então finaliza confirmando a gravacao.*/
          IF excecao <> 1 THEN
             COMMIT;
             IF Acao = "I" THEN
                SET msg = "MySQL: minhaTabela Incluido com sucesso";
             ELSE
                IF Acao = "A" THEN
                   SET msg = "MySQL: minhaTabela Alterado com sucesso";
                ELSE
                   SET msg = "MySQL: minhaTabela Excluido com sucesso";
                END IF;
             END IF;
          END IF;
       END IF;
       SELECT msg AS msg;
    END$$
    
    DELIMITER ;

     

  3. Em 16/09/2017 at 09:50, Markus Magnus disse:

    Então não precisa nem criar o campo DatMes só faz assim.

    
    SELECT * FROM `suatabela` WHERE DATE_FORMAT(Data, '%Y-%m') = '2017-09';

     

    Fazendo desta forma (usando função na representação de um campo e comparando-o com um literal) você corre um grande risco de que sua busca vire um TABLE SCAN, ou seja ela não usará índices e poderá demorar muito.

    Eu substituiria a função pelo LIKE e, melhor ainda, pelo BETWEEN .

    Exemplo: 

    SELECT * FROM `suatabela` WHERE `data` LIKE "2017-09%";

    ou 

    SELECT * FROM `suatabela` WHERE `data` BETWEEN "2017-09-01" AND "2017-09-30";

    Desta forma você aproveitará todo o potencial de seus índices.

  4. Tente assim:

    DELIMITER $
    DROP PROCEDURE CRIAR_CONSULTA$
    CREATE PROCEDURE CRIAR_CONSULTA(IN IDPAC INT, IN IDMED INT, IN IDHOS INT)
    BEGIN
    DECLARE msg VARCHAR(200) DEFAULT '';
    DECLARE excecao SMALLINT DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1;
        start transaction;
        if (IDPAC > 0 AND IDMED > 0 AND IDHOS > 0) THEN
            INSERT INTO CONSULTA (IDCONSULTA, ID_PACIENTE, ID_MEDICO, ID_HOSPITAL, DATA) 
            VALUES(NULL, IDPAC, IDMED, IDHOS, CURTIME());
            IF excecao = 1 THEN
                SET msg = "Erro ao inserir na tabela usuario" AS Msg;
                ROLLBACK;
            END IF;  
        ELSE SET excecao =1;
             SET msg = 'INSIRA OS DADOS CORRETAMENTE';
            ROLLBACK;
        END IF;
        IF excecao = 0 THEN
           SET msg = 'DADOS INSERIDOS COM SUCESSO';
           COMMIT;
        END IF;
        SELECT msg AS mensagem;
    END$
    DELIMITER ;

     

  5. Salvar em um só registro?

    Se você modelou corretamente a tabela de orcamento receberá os dados gerais e a de item_orcamento receberá um registro para cada item daquele orçamento.

    A gravação pode ocorrer de uma única vez, através de uma storage procedure com controle de sucesso ou fracasso de gravação.

    Passe o modelo de dados para o forum de MySQL e veremos o que pode ser feito.

    Depois, você poderá retornar a este forum para saber como integrar a linguagem de programação com o banco.

  6. Remova esta linha de seu código:

    DECLARE pcodven int; 

    Você já declarou esta variável como parâmetro. A Redeclaração como variável ordinária anula os dados vindos como parâmetro e o select perde o valor que deveria ser usado na cláusula where

  7. Faça assim:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `verificapagamento`(IN pinfcodigo INT, IN ppagcodigo INT, IN pvencodigo INT, IN pvalor DOUBLE)
    BEGIN
     
       DECLARE valorvenda DOUBLE;
       DECLARE somavalores DOUBLE;
       DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem";
       DECLARE excecao SMALLINT DEFAULT 0;
       DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1;
       
       SELECT venvalortotal INTO valorvenda FROM venda WHERE vencodigo = pvencodigo;
     
       SELECT COALESCE(SUM(valor),0) INTO somavalores FROM informaformapgto WHERE vencodigo = pvencodigo;
     
       IF somavalores > valorvenda THEN
          SET mensagem = "Valor não confere";
          SELECT mensagem AS msg;
       ELSE
          START TRANSACTION;
          INSERT INTO informaformapgto(infcodigo, pagcodigo, vencodigo, valor) 
          VALUES (pinfcodigo, ppagcodigo, pvencodigo, pvalor);
          IF excecao = 1 THEN
             SET mensagem = "Erro na gravação";
             ROLLBACK;
          ELSE
             SET mensagem = "Gravado com sucesso";
             COMMIT;
          END;
          SELECT mensagem AS msg;
       END IF;
    END

    Não testei o código. Por favor informe o resultado.

  8. Proceda usando LIKE '%expressão1%expressao2%' ou mudando a forma de busca.

    Em vez de usar o LIKE, que da forma que você quer vai entrar em TABLE SCAN, use indexação por FULLTEXT.

    Com FULLTEXT você conseguirá fazer a pesquisa do jeito que você quer e deforma mais eficaz.

    Até a versão 5.6 o FULLTEXT só funcionava com engine MyISAM. A partir da versão 5.6 ele passou a funcionar em tabelas INNODB.

    https://pt.blog.marceloaltmann.com/en-using-the-mysql-fulltext-index-search-pt-utilizando-mysql-fulltext/

    Leia sobre FULLTEXT no manual de sua versão do MySQL.

×
×
  • Criar Novo...