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. Boa noite.

    Você pode criar esta procedure

    DELIMITER $$
    
    CREATE PROCEDURE `bd`.`exemplo`(IN variavel VARCHAR(100))
    BEGIN
       SET @preparable_stmt = CONCAT("SELECT  max(aging_liberacao) as aging_lib 
           FROM bd.gd_ob 
           WHERE projeto = '00003' AND mrp IN(", variavel, ")"); 
       PREPARE stmt FROM @preparable_stmt;
       EXECUTE stmt;
       -- DEALLOCATE PREPARE stmt;
    END$$
    
    DELIMITER ;

    e executá-la assim:

    CALL exemplo('"O08",'"OM2"');

     

  2. O MySQL não permite este tipo de validação.

    A solução que adotei em meus sistemas foi realizar toda e qualquer gravação através de procedures, que podem retornar um result set de um select.

    Veja abaixo um exemplo:

    DELIMITER $$
    
    USE `meudatabase`$$
    
    DROP PROCEDURE IF EXISTS `exemplo_crud`$$
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `exemplo_crud`(IN Acao CHAR(1), IN pidExemplo INTEGER, 
       IN pnmExemplo VARCHAR(50), IN ptxExemplo DOUBLE(6,3), IN pvlMinimo DOUBLE(8,2), IN pndExemplo CHAR(1), 
       IN pidDominioSituacao INTEGER)
    BEGIN
       DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem";
       DECLARE excecao SMALLINT DEFAULT ;
       DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1;
       IF pnmExemplo = "" OR (Acao <> "I" AND pidExemplo = ) THEN
          SET msg = "Erro na passagem de parametros";
       ELSE
          START TRANSACTION;
          /*Inclusao */
          IF Acao = "I" THEN
             INSERT INTO exemplo(nmExemplo, txExemplo, vlMinimo, ndExemplo, idDominioSituacao)
             VALUES (pnmExemplo, ptxExemplo, pvlMinimo, pndExemplo, pidDominioSituacao);
             IF excecao = 1 THEN
                SET msg = "MySQL: Erro ao inserir na tabela de exemplo";
                ROLLBACK;
             END IF;
          END IF;
       
          IF excecao <> 1 THEN
             IF Acao <> "I" THEN
                SET @idExemplo = pidExemplo;
             END IF;
             /*Alteracao*/
             IF Acao = "A" THEN
                UPDATE exemplo
                SET nmExemplo = pnmExemplo,
                    txExemplo = ptxExemplo, 
                    vlMinimo = pvlMinimo, 
                    ndExemplo = pndExemplo,  
                    idDominioSituacao = pidDominioSituacao
                WHERE idExemplo = @idExemplo;
                IF excecao = 1 THEN
                   SET msg = "MySQL: Erro ao atualizar exemplo";
                   ROLLBACK;
                END IF;
             END IF;
          END IF;
          /*Exclusao*/
          IF excecao <> 1 THEN
             IF Acao = "E" THEN
                DELETE FROM exemplo
                WHERE idExemplo = @idExemplo;
                IF excecao = 1 THEN
                   SET msg = "MySQL: Erro ao excluir exemplo";
                   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: Exemplo Incluido com sucesso";
             ELSE
                IF Acao = "A" THEN
                   SET msg = "MySQL: Exemplo Alterado com sucesso";
                ELSE
                   SET msg = "MySQL: Exemplo Excluido com sucesso";
                END IF;
             END IF;
          END IF;
       END IF;
       SELECT msg AS msg;
    END$$
    
    DELIMITER ;

     

  3. 5 horas atrás, fabioweb disse:

    O sistema não deve permitir que o aluno esteja no mesmo curso e horário.

    Existe alguma forma de resolver isso pelo MySQL?

    Segundo seu modelo, a criação de uma UNIQUE KEY, na tabela Turma, que contemple os campos idTurma, HoraInicio e Curso_IdCurso resolverá o problema.

  4.  

    Tente assim:

    1 - Pare o serviço do mysql

    2 - Salve os arquivos em outra pasta (lembre-se de salvar o database de serviço: mysql; os arquivos ib_logfile0, ib_logfile1 e ibdata1) e o seus databases

    que dependendo da versão, estão na pasta C:\Documents and Settings\All Users\MySQL\data

    3 - reinstale o mysql e reinicie o serviço

    4 - teste se esta funcionando.

    5 - se estiver funcionando pare o serviço do mysql

    6 - copie os arquivos de volta 

    7 - reinicie o serviço

     

  5. No Delphi eu uso

    mysqldump --opt --flush-logs --triggers --port=3306 --user=root --result-file=backup.sql --databases "meuBancoDeDados"

    --result era uma recomendação da MySQLA/B para formação de nomes de backups em windows. (Diferente do > no linux).

    Para recuperação de backup eu uso  o gerenciador de linha que trabalha no console do cmd

    em c:\ ou no diretório onde estiver meu backup, entro em

    mysql -u root -p

    no prompt mysql>

    eu digito source nomedomeubackup.sql

    digito enter e espero o termino

    saia com quit 

  6. Ok.

    Corrija para :

    SELECT CODPRO, NOMPRO, COMPRADO, VENDIDO, (COMPRADO - VENDIDO) AS ESTOQUE
    FROM (SELECT prd.CODPRO, prd.NOMPRO, SUM(comp.QTDE_COMPRADA) AS COMPRADO, SUM(vds.QTDVEN) AS VENDIDO
          FROM PRODUTOS prd 
          LEFT JOIN COMPRAS comp ON comp.COD_PRODUTO = prd.CODPRO
          LEFT JOIN VENDAS   vds ON vds.CODVEN       = prd.CODPRO
          GROUP BY prd.CODPRO
         ) e;

     

  7. Tenta assim:

    SELECT CODPRO, NOMPRO, COMPRADO, VENDIDO, (COMPRADO - VENDIDO) AS ESTOQUE
    FROM (SELECT prd.CODPRO, prd.NOMPRO, SUM(comp.QTDE_COMPRADA) AS COMPRADO, SUM(vds.QTDVEN) AS VENDIDO
          FROM PRODUTOS prd 
          LEFT JOIN COMPRAS comp ON comp.COD_PRODUTO = prd.CODPRO
          LEFT JOIN VENDAS   vds ON vds.CODVEN       = prd.CODPRO
         ) e;

    depois faremos a segunda parte

  8. Tenta assim:

    SELECT tbc.codcongregacao, tbc.codigocongregacao, tbc.nomecongregacao,
    (SELECT SUM(mis.valormissoes)  FROM tbcongregacao tbc1, tbmissoes mis  WHERE tbc1.codcongregacao = '1' AND tbc1.codcongregacao = mis.codcongregacao AND mis.datamissoes  BETWEEN '2016-02-01' AND '2016-02-2016') +
    (SELECT SUM(diz.valordizimo)   FROM tbcongregacao tbc2, tbdizimo diz   WHERE tbc2.codcongregacao = '1' AND tbc2.codcongregacao = diz.codcongregacao AND diz.mesdizimo    BETWEEN '2016-02-01' AND '2016-02-2016') +
    (SELECT SUM(vot.valorvoto)     FROM tbcongregacao tbc3, tabvotos vot   WHERE tbc3.codcongregacao = '1' AND tbc3.codcongregacao = vot.codcongregacao AND vot.mesvoto      BETWEEN '2016-02-01' AND '2016-02-2016') +
    (SELECT SUM(rec.valorreceita)  FROM tbcongregacao tbc4, tabreceita rec WHERE tbc4.codcongregacao = '1' AND tbc4.codcongregacao = rec.codcongregacao AND rec.mesreceita   BETWEEN '2016-02-01' AND '2016-02-2016') AS receitas,
    (SELECT SUM(des.valordespesas) FROM tbcongregacao tbc5, tbdespesas des WHERE tbc5.codcongregacao = '1' AND tbc5.codcongregacao = des.codcongregacao AND des.datadespesas BETWEEN '2016-02-01' AND '2016-02-2016') AS despesas
    FROM tbcongregacao tbc

     

    Existe forma mais inteligente de fazer isso. Mas seria necessário ver a estrutura e os dados para gerar.

  9. Vamos analisar um pouco.

    Primeiro modifique a cláusula where da forma

    WHERE month(v.dtvenda) = '2' and c.sr_deleted=''

    para 

    WHERE v.dtvenda BETWEEN 2026-02-01 AND 2016-02-29 and c.sr_deleted=''

    Vai evitar que sua consulta entre em TABLE SCAN.

    Segundo, para efeito de teste, inclua o campo calculado qtRegistros, conforme abaixo:

    SELECT v.dtvenda, c.numnven, round(sum(c.quantid*c.prcompr),2) as COMPRAS, v.totalve as VENDAS from infvenda v, 
    COUNT(v.dtvenda) AS qtRegistros

    Vai trazer a quantidade de registros somados para que você possa verificar se sua consulta está fazendo realmente o que você quer.

    Compare os qtRegistros do dia 23 com o select abaixo:

    SELECT v.dtvenda, c.numnven, round(c.quantid*c.prcompr,2) as COMPRAS, v.totalve as VENDAS 
    from infvenda v
    JOIN nvendas c on (v.dtvenda = c.dtvenda and v.numnven = c.numnven)
    WHERE v.dtvenda = '2016-02-23' and c.sr_deleted=''

     

  10. Na tabela Generalizada Clientes coloque somente os atributos que são comuns aos dois tipos de especialização que você quer e mais um atributo que informará se a especialização é Pessoa Fisica e ou Juridica. (Vou chamar de indicadorDePessoa com domínio F ou J)

    Exemplo: idCliente, indicadorDePessoa, Nome, Endereço(se for um só), etc.

    Na tabela de especialização Pessoa Fisica coloque somente os atributos que são específicos desta especialização

    Exemlo: idCliente(FK com relação 1:1 para Cliente), CPF, Sexo, Identidade, etc

    Na tabela de especialização Pessoa Jurídica coloque somente os atributos que são específicos desta especialização

    Exemplo: idCliente(FK com relação 1:1 para Cliente), CNPJ, Nome Fantasia, InscEstadual, Etc.

    Quando você criar uma compra para um cliente específico o que vai entrar é o idCliente, que será a FK para a tabela de clientes.

    Informe se precisar mais.

     

  11. Faça o último. Os primeiros são para você saber como cheguei lá:

    -- listar datas que possuem mais de um evento por data
    SELECT DATE(e2.setup) AS `dtEvent`
    FROM eventassist.event e2
    GROUP BY `dtEvent`
    HAVING COUNT(e2.event_id) > 1;
    
    -- Listar a informação dos eventos
    SELECT e1.setup, e1.event_id, e1.setup, e1.teardown, e1.event_type_id
    FROM eventassist.event e1;
    
    -- Listando o que voce quer:
    SELECT e1.setup, e1.event_id, e1.setup, e1.teardown, e1.event_type_id
    FROM eventassist.event e1 
    WHERE DATE(e1.setup) IN (SELECT DATE(e2.setup) AS `dtEvent`
       FROM eventassist.event e2
       GROUP BY `dtEvent`
       HAVING COUNT(e2.event_id) > 1);

     

×
×
  • Criar Novo...