Ir para conteúdo
Fórum Script Brasil

Denis Courcy

Moderadores
  • Total de itens

    3.089
  • Registro em

  • Última visita

Tudo que Denis Courcy postou

  1. Você leu este tópico? Acentuação
  2. 'Pompeu' , Seguindo o código apresentado, temos duas procedures. Uma para o sócio e outra para o dependente que será chamada pela procedure do sócio. Você deverá chamar a Storage Procedure assim: CALL cria_relatorio; Abaixo o código da procedure do sócio: DELIMITER $$; DROP PROCEDURE IF EXISTS `pompeu`.`cria_relatorio`$$ CREATE PROCEDURE `pompeu`.`cria_relatorio` () BEGIN DECLARE r_id INTEGER; DECLARE r_tiposocio INTEGER; DECLARE r_ntitulo CHAR(3); DECLARE r_codigo INTEGER; DECLARE r_nome CHAR(50); DECLARE socio_eof INTEGER DEFAULT 0; DECLARE cur_socio CURSOR FOR SELECT id, tiposocio, ntitulo, codigo, nome FROM socios ORDER BY nome; DECLARE CONTINUE HANDLER FOR NOT FOUND SET socio_eof = 1; OPEN cur_socio; FETCH cur_socio INTO r_id, r_tiposocio, r_ntitulo, r_codigo, r_nome; WHILE NOT socio_eof DO INSERT INTO cria_relatorio (id, tiposocio, ntitulo, codigo, nome) VALUES (r_id, r_tiposocio, r_ntitulo, r_codigo, r_nome); CALL Cria_relatorio_dep(r_id, r_ntitulo); FETCH cur_socio INTO r_id, r_tiposocio, r_ntitulo, r_codigo, r_nome; END WHILE; CLOSE cur_socio; END$$ DELIMITER;$$ O código para o dependente é:DELIMITER $$; DROP PROCEDURE IF EXISTS `pompeu`.`Cria_relatorio_dep`$$ CREATE PROCEDURE `pompeu`.`Cria_relatorio_dep` (p_idsocio INTEGER, ntitulo CHAR(3)) BEGIN DECLARE r_idsocio INTEGER; DECLARE r_codigo_d INTEGER; DECLARE r_nome_d CHAR(50); DECLARE r_dtnasc CHAR(10); DECLARE r_grau_parentesco CHAR(15); DECLARE r_status CHAR(7); DECLARE depen_eof INTEGER DEFAULT 0; DECLARE cur_dependente CURSOR FOR SELECT idsocio, codigo, nome, dtnasc, grau_parentesco, `status` FROM dependentes WHERE idsocio = p_idsocio AND ntitulo = p_ntitulo ORDER BY codigo; DECLARE CONTINUE HANDLER FOR NOT FOUND SET depen_eof = 1; OPEN cur_dependente; FETCH cur_dependente INTO r_idsocio, r_codigo_d, r_nome_d, r_dtnasc, r_grau_parentesco, r_status; WHILE NOT depen_eof DO INSERT INTO cria_relatorio (idsocio, codigo_d, nome_d, dtnasc, grau_parentesco, `status`) VALUES (r_idsocio, r_codigo_d, r_nome_d, r_dtnasc, r_grau_parentesco, r_status); FETCH cur_dependente INTO r_idsocio, r_codigo_d, r_nome_d, r_dtnasc, r_grau_parentesco, r_status; END WHILE; CLOSE cur_dependente; END$$ DELIMITER;$$ Este código pode ser otimizado.
  3. 'Pompeu', Tecnicamente você não precisa de criar a tabela cria_relatorio nem criar a storage procedure, pois a query abaixo já resolverá seu problema: SELECT s.id, s.tiposocio, s.ntitulo, s.codigo, s.nome, d.codigo, d.nome, d.dtnasc, d.grau_parentesco, d.status FROM socios s LEFT JOIN dependentes d ON where d.idsocio = s.ID AND d.ntitulo = s.ntitulo ORDER BY s.nome Mas, se você quer armazenar os valores na tabela então use esta queryINSERT INTO cria_relatorio (id, tiposocio, ntitulo, codigo, nome, codigo_d, nome_d, dtnasc, grau_parentesco, status) SELECT s.id, s.tiposocio, s.ntitulo, s.codigo, s.nome, d.codigo, d.nome, d.dtnasc, d.grau_parentesco, d.status FROM socios s LEFT JOIN dependentes d ON where d.idsocio = s.ID AND d.ntitulo = s.ntitulo ORDER BY s.nome Se ainda assim, necessitar da storage procedure tal como foi gerada no código DELPHI, então aguarde um pouco para que eu possa passar para o código para SQL.
  4. Oi, 'Pompeu' Para facilitar, poderia, por favor, publicar as estruturas das tabelas: socios, cria_relatorio e dependentes? Obrigado.
  5. AB = base 16 = hexadecimal = 171 em decimal ou 10101011 12 = base 3 calculando, temos: 00 = 0 01 = 1 02 = 2 10 = 3 11 = 4 12 = 5 em base decimal. Em binário = 101 Resolvendo a multiplicação, temos: 10101011 * 101 = 1101010111 Verificando 171 * 5 = 855. 855 em binario é: 1101010111. Fácil, não?
  6. AB * 12 = C06 C06 em binário é:110000000110 Dica: use a calculadora do windows no modo científico. altere para hexadecimal, faça a conta e depois, no resultado, altere para binário.
  7. Causa possível: A quantidade de campos não bate com a quantidade de valores que estão sendo inseridos na tabela. Exemplo: Imagine esta tabela: DROP TABLE IF EXISTS table1; CREATE TABLE table1 ( columnId INT AUTO_INCREMENT PRIMARY KEY, column1 VARCHAR( 50 ), column2 VARCHAR( 50 ), column3 VARCHAR( 50 ) ); Inserindo os valores corretamente temos (4 campos)INSERT INTO table1 VALUES ( 1, "test1", "test2", "test3" ); Inserindo valores incorretamente e causando o erro apresentado (3 campos):INSERT INTO table1 VALUES ( 2, "test4", "test5" );=> ERROR 1136 (21S01): Column count doesn't match value count at row 1 Solução possível: Rever toda a instrução de insert para saber onde está faltando campo ou virgula
  8. No Windows: Se você já tibver um serviço instalado. O MySQl não vai conseguir instalar um novo mesmo que você desinstale a versão anterior do windows. Por isso use o programa de linha de comando sc delete "Service Name" onde "Service Name" é o nome do serviço (por default é MySQL). Se você estiver instalando no windows 2000 ou 2003 copie este programa de um xp e rode-o na máquina desejada. No Linux: Não sei.
  9. Oi, 'huerta' ! Acho que estou com raciocícnio curto, hoje. E ainda não entendi o que você quer. Seria isto? SELECT TB.*, CS.DataConsulta FROM TB_trabalhador TB LEFT JOIN PRONTUARIO PT ON (PT.CodTrabalhador=TB.cd_trab) LEFT JOIN CONSULTA CS ON (CS.CodProntuario=PT.CodProntuario) WHERE TB.cpf = '5588545454' OR (TB.cpf = '5588545454' AND CS.DataConsulta = DATE_FORMAT(CURRENT_DATE, 'd%/m%/Y%')) Vai trazer o cpf ou cpf acompanhado da data.
  10. Oi, 'huerta' ! Use OR ou XOR no lugar do AND. No seu caso o OR é melhor, pois vai pegar a data e/ou o cpf. Outro ponto sua busca em DATE_FORMAT(CS.DataConsulta, 'Y%-m%-d%') = CURRENT_DATE sempre causará table scan. Inverta a busca para CS.DataConsulta = DATE_FORMAT(CURRENT_DATE, <seu-formato-de-data>) e coloque esta busca como a primeira na cláusula WHERE. Exemplo, imaginando que seu-formato-de-data seja dd/mm/aaaa: SELECT TB.*, CS.DataConsulta FROM TB_trabalhador TB LEFT JOIN PRONTUARIO PT ON (PT.CodTrabalhador=TB.cd_trab) LEFT JOIN CONSULTA CS ON (CS.CodProntuario=PT.CodProntuario) WHERE CS.DataConsulta = DATE_FORMAT(CURRENT_DATE, 'd%/m%/Y%') OR TB.cpf = '5588545454' assim sua query será otimizada. Crie índice pela data para agilizar a busca se esta query for executada de forma constante.
  11. Oi, 'danielrgoes' Faça assim: SELECT DAY(data_inclusao) FROM teste WHERE cod_teste = 4.
  12. Oi, 'henriqueelias' Você definiu release como um nome de campo. Porém release é palavra chave do MySQL. Para usar este nome como nome de campo você deverá escrevê-lo entre crases, assim: `release`
  13. Oi, 'xalatan'! Não conheço nenhuma ferramenta que possa recuperar seus dados. Quem trabalha com MySQL, principalmente usando o engine InnoDB, deve fazer backup com mysqldump ou outra ferramenta comercial. Deve, também, manter o log binário ativado e apontado para outro HD, para evitar este tipo de problema. Creio que em seu caso, só resta chorar pelos dados perdidos.
  14. Denis Courcy

    duvida em query

    Esta é uma função definida pelo usuário (UDF), também conhecida como storage function. Diferente da storage procedure que não retorna valor, este tipo de código sempre retornará um valor. Neste caso, retornará um valor do tipo decimal.Vou comentar cada linha. drop function if exists multa_a_pagar; /*exclui a função se ela já existir */ delimiter @ /*determina que o caracter @ será usado como delimitador de campos */ CREATE function multa_a_pagar (aluguer int) /* cria a função passando um valor inteiro como parâmetro */ returns decimal(4,2) /* informa o tivo de valor a ser retornado pela função */ begin /* inicio do corpo da função */ declare modal char(1); /*declara variaveis */ declare hoje date; declare m_d decimal(4,2); declare d_a date; declare dias_multa int; select modalid,data_aluguer /* executa um select que criará um arquivo */ into modal,d_a from alugueres where num_aluguer=aluguer; select multa_diaria into m_d from modalidades where modalid=modal; set hoje = now(); set dias_multa = hoje - d_a -1; /*atribui valor a uma variavel */ return (dias_multa * m_d); /* retorna um valor */ end; /* encerra o corpo da função */
  15. Denis Courcy

    duvida em query

    Faça assim: SELECT cb.n_conta, cb.saldo_dispon, SUM(cc.valor_em_credito) AS credito_cartao FROM contas_bancarias cb INNER JOIN cartoes_credito cc ON cc.n_conta = cb.n_conta GROUP BY cb.n_conta HAVING cb.saldo_dispon < sum(cc.valor_em_credito);
  16. Denis Courcy

    duvida em query

    Executar a query deste jeito implica em avaliar toda a tabela em busca do maior valor, ou seja, executar um table scan. Que, dependendo do tamanho da tabela, levará muito tempo para ser executado, mesmo que haja um índice para este campo.
  17. Denis Courcy

    duvida em query

    Tente:select cod_filme, max(multa) from alugueres group by cod_filme; Se você quer para um filme específico, então use:select max(multa) from alugueres where cod_filme = ofilmequequero;
  18. Oi, 'alexandremanowar' No MySQL as operações com hora (todas elas) estão limitadas ao máximo de 838:59:59. Minha sugestão é que você crie um campo para armazenar os dias do saldo de horas (extract(hour from saldo) / 24)
  19. alter table tabela1 drop primary key, add primary key (campo_da_chave) Complementando o que foi dito nos posts anteriores, não há como alterar campos de nenum índice. Sempre que necessitar modificar um campo em um índice, há a necessidade de remover o índice (drop index) e criar outro.
  20. Você estará certo se souber que ele usa innodb como engine para estas tabelas. Como ele não informou, o correto é fazer o que passei.
  21. Oi, Paulo. Vamos por partes: O Pompeu te informou isto mas o mes está invertido com o ano. O correto seria assim SELECT * FROM nomedatabela ORDER BY ano, mes .Mas ainda está errado, pois como disse o Marcus Nunes Como você já deve ter cadastrado como extenso não há a necessidade de trocar o campo mes de string para numérico. Basta usar a função FIELD (mais informações sobre esta e outras funções consulte o manual do MySQL) Como o ASC é padrão não há a necessidade de informar que a ordenação será ascendente. A consuta correta ficará assim:SELECT ano, mes FROM nomedatabela ORDER BY ano, FIELD(mes, 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outrubro', 'Novembro', 'Dezembro');
  22. Oi, 'Geminy' Desculpe a demora na resposta. Só hoje tive tempo de buscar uma solução para seu problema. A solução passa por uma tabela temporária em memória. Esta tabela deve ser criada sem índice primário para não "estragar" a ordenação que você precisa. O código fica assim: create temporary table aux(id int unsigned)engine=memory; insert into aux(id) values (5),(2),(8),(12),(18),(14),(31),(76),(35),(37),(42),(43),(48),(49),(56),(55),(61),(58),(62),(65); select straight_join a.id, x.titulo from aux a inner join x_tesouros x on x.x.qid = a.id; drop table aux; Não esqueça de execurar a última linha (drop table) somente após você terminar de usar o select. Isto fará a liberação da memória, da área ocupada pela tabela temporária.
  23. Oi, 'imgcom' A lógica é esta: IF(valor <= 125, 100, IF(valor <= 165, 150, 180)) Pode colocar como um atributo calculado ou na cláusula WEHRE de seu SELECT. Exemplo 1SELECT IF(valor <= 125, 100, IF(valor <= 165, 150, 180)) FROM minha tabela Exemplo 2SELECT * FROM minhatabela where campo = IF(valor <= 125, 100, IF(valor <= 165, 150, 180))
×
×
  • Criar Novo...