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. Substitua 

    SELECT * 
    FROM processos p 
    INNER JOIN (SELECT * 
       FROM historico h
       GROUP BY h.processo_id
       HAVING MAX(h.`data`)) h1 ON h1.processo_id = p.id
    WHERE h1.`data` < minhaDate_Sub(DATE(NOW()), 15, 'D');

    Por

    SELECT * 
    FROM processos p 
    INNER JOIN (SELECT h.id, h.processo_id, h.tipo, h.observacoes, MAX(h.data) 
    	FROM historico h
    	GROUP BY h.processo_id) h1 ON h1.processo_id = p.id
    WHERE h1.`data` < minhaDate_Sub(DATE(NOW()), 15, 'D');

    Se possível troque o nome do campo `data` por outro de sua conveniência, pois data é palavra chave do MySQL e pode causar confusão.

  2. Verifique se é isso que você quer:

    SELECT * 
    FROM processos p 
    INNER JOIN (SELECT * 
       FROM historico h
       GROUP BY h.processo_id
       HAVING MAX(h.`data`)) h1 ON h1.processo_id = p.id
    WHERE h1.`data` < DATE_SUB(DATE(NOW()), INTERVAL 15 DAY);

    Onde o select 

    SELECT * 
       FROM historico h
       GROUP BY h.processo_id
       HAVING MAX(h.`data`)

    retorna os históricos com as maiores datas

    h1 é o nome da tabela gerada pelo select acima(o que busca as maiores datas)

    DATE_SUB(DATE(NOW()), INTERVAL 15 DAY)

    é a função que retorna datas com menos de 15 dias (15 é variável).

    Se quiser pode usar minha função que retorna qualquer tipo de intervalo

    DELIMITER $$
    
    USE `test`$$ -- eh o nome do banco use o seu
    
    DROP FUNCTION IF EXISTS `minhaDate_Sub`$$
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `minhaDate_Sub`(dtInicial DATE, intervalo INTEGER, tipo CHAR(1)) RETURNS DATE
    BEGIN
       DECLARE retorno DATE DEFAULT NULL;
       IF intervalo > 0 THEN
          IF tipo = 'D' THEN
             SET retorno = DATE_SUB(dtInicial, INTERVAL intervalo DAY);
          END IF;
          IF tipo = 'M' THEN
             SET retorno = DATE_SUB(dtInicial, INTERVAL intervalo MONTH);
          END IF;
          IF tipo = 'A' THEN
             SET retorno = DATE_SUB(dtInicial, INTERVAL intervalo YEAR);
          END IF;
       END IF;
       RETURN retorno;      
    END$$
    
    DELIMITER ;

    Exemplo de uso:

    SELECT * 
    FROM processos p 
    INNER JOIN (SELECT * 
       FROM historico h
       GROUP BY h.processo_id
       HAVING MAX(h.`data`)) h1 ON h1.processo_id = p.id
    WHERE h1.`data` < minhaDate_Sub(DATE(NOW()), 15, 'D');

     

  3. Proceda assim:

    Faça um backup das tabelas em questão.

    Desvincule o constraint se existir.

    Converta o campo de string para numerico varchar para int

    Os campos devem ser do mesmo tipo e tamanho nas duas tabelas.

    refaça o vinculo de constraint.

    Verifique se tudo está ok

    Se estiver ok elimine as tabelas de backup.

    Mais simples do que você está querendo fazer.

    Se você errar é so voltar o backup destas tabelas

     

  4. Normalmente eu utilizo uma tabela de histórico (cópia da estrutura da tabela que quero acompanhar, com um campo a mais que é a data hora de entrada no historico.

    CREATE TABLE IF NOT EXISTS `roupas_historico` (
      `cod_paciente` int(10) NOT NULL,
      `cod_roupa` int(15) NOT NULL PRIMARY KEY AUTO_INCREMENT
      `Descroupa` varchar(500) COLLATE utf8_bin NOT NULL,
      `horariovista` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `SaidaOuEntrada` varchar(10) COLLATE utf8_bin NOT NULL,
      dtEntradaHistorico datetime
    )

    O trigger fica assim:

    DELIMITER $$
    
    CREATE TRIGGER `nomedobanco`.`trg_log` BEFORE UPDATE ON `nomedobanco`.`teste`
       FOR EACH ROW 
    BEGIN
       INSERT INTO roupas_historico(`cod_paciente`, `cod_roupa`, `Descroupa`, `horariovista`, `SaidaOuEntrada`, dtEntradaHistorico)
       VALUES (OLD.`cod_paciente`, OLD.`cod_roupa`, OLD.`Descroupa`, OLD.`horariovista`, OLD.`SaidaOuEntrada`, NOW());
    END$$
    
    DELIMITER ;

    A gravação do log acontece antes da gravação dos dados desejados. O log recebe os dados que estavam na tabela antes de serem atualizados.

    Em minhas tabelas eu utilizo 4 campos a mais que não coloquei aqui que são:

    data hora inclusão informação

    data hora atualização informação

    identificador usuário resp inclusão

    identificador usuário resp alteração

  5. Normalmente eu opto por armazenar arquivos e fotos fora do banco. É a melhor prática.

    Quanto a evitar acessos indevidos, isto dependerá do tipo de segurança que você quiser adotar para seu servidor de arquivos.

    Na questão backup, uma rotina de backup bem feita pode fazer o backup do banco e dos arquivos num mesmo momento e com toda a segurança necessária.

  6. Tenta assim:

    SELECT
       f1.M3a,
       L.m3 AS m3Lote,
       f1.m3Verde,
       f1.m3Seca,
       pesoCarga,
       m3Carga - L.m3 AS m3Consumo,
       ROUND((pesoCarga * (m3Carga-L.m3))/ m3Carga,2) AS pesoConsumido,
       ROUND((sum(F.m3)/(m3Carga-L.m3))*100,2) AS RENDIMENTO,
       DATE_FORMAT(L.`dataInicio`,'%d/%m/%Y') AS lote_dataInicio,
       DATE_FORMAT(L.`dataFechamento`,'%d/%m/%Y') AS lote_dataFechamento,
       F.idFardoLamina AS fardolamina_idFardoLamina,
       F.m3 AS fardolamina_m3,
       F.consumoTora AS fardolamina_consumoTora,
       F.idLote AS fardolamina_idLote,
       O.nomeFornecedor AS fornecedor,
       DATE_FORMAT(NOW(),'%d/%m/%Y') as data
    FROM fardolamina F
    INNER JOIN lote L on L.idLote = F.idLote
    INNER JOIN fornecedor O on O.idFornecedor = L.idFornecedor
    INNER JOIN (SELECT f1a.idLote, sum(f1a.m3) AS M3a, 
          sum(IF(f1a.estado = 'v',f1a.m3,0)) AS m3Verde, 
          sum(IF(f1a.estado = 's',f1a.m3,0)) AS m3Seca 
       FROM fardoLamina f1a 
       GROUP BY f1a.idLote) f1 ON f1.idLote = F.idLote
    LEFT JOIN (SELECT c1.idLote, sum(c1.m3) AS m3Carga, sum(c1.tonelada) AS pesoCarga 
       FROM carga c1  
       GROUP BY c1.idLote) C on C.idLote = L.idLote
    

     

  7. Normalmente, nas tabelas mais importantes eu coloco 4 campos a mais

    Datahora inclusão registro

    Datahora alteracao registro

    id uuario resp inclusao

    id usuario resp alteracao

    Também crio uma tabela historico com a mesma estruturada tabela em questão e com um campo a mais

    Datahora inclusao no historico

    Cada alteracao feita na tabela original dispara um trigger que alimenta a tabela historico com os dados antes de serem alterados

     

    Quando uma alteração

  8. Por favor post apenas códigos de sql. Este é um site de MySQL e não de PHP ou outra linguagem.

    Quando a sua query

    SELECT * FROM item_pedido i INNER JOIN produto p ON i.id_pedido = '".$id."' AND i.id_produto = p.prod_id ORDER BY p.prod_descricao

    1) Use a cláusula ON somente para o relacionamento entre tabelas. Passe o  

    i.id_pedido = '".$id."' AND

    Para a cláusula WHERE que é o local apropriado.

    2) Verifique se existem índices para 

    id_produto na tabela item_pedido ;

    prod_id na tabela produto (creio que deva ser o primary key desta tabela)

    prod_descricao na tabela produto (creio que deva ser unike key para esta tabela)

×
×
  • Criar Novo...