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. Pelo que notei este seu campo "número" é do tipo char ou varchar. Então, verifique se você não pode usar a função REPLACE para obter o que deseja. Exemplo Select REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE '%5134657%' order by Data Desc Função Replace segundo manual do mysql
  2. Legal! é isso mesmo. Só um detalhe que não parece muito mas em tabela muito populadas pode gastar um espaço considerável. Observe seu código quando você usou `codigo_id` int(11) NOT NULL auto_increment, você poderia ter usado `codigo_id` int(10) unsigned NOT NULL auto_increment, já que seu autoincrement não vai trabalhar com números negativos. Usar tipo unsigned pata inteiros economiza o byte de sinal que os números não unsigned necessitam. 1 byte parece pouco, mas em 100.000 registros serão 100.000 bytes a menos. att Denis Courcy
  3. Se seu SO for windows Desligue a maquina que teve o HD formatado acidentalmente e retire o HD Em outra máquina baixe da internet e instale um programa chamado undelete. coloque o HD formatado acidentalmente como slave desta maquina. Com o utilitário undelete procure pela pasta \mysql\data - se você está usando uma versão do mysql anterior a 4.1. se estiver usando versão acima, procure em \arquivos de programas\mysq\mysq 5\data recupere todos os arquivos desta pasta. Boa sorte. att Denis Courcy
  4. Oi, Kogima! Você tem três caminhos para solucionar este problema. O primeiro independe de versão ou engine (tipo de tabela) do Mysql. O Lado ruim é que se você estiver usando tabelas não transacionais tipo myisam e houver uma falha durante esta transação, então você ficará com tabelas inconsistentes. A técnica consiste em você deletar os dados da tabela filha e depois deletar os dados da tabela mãe. Exemplo: Sejam as tabelas Nota_Fiscal e Tabela Item_da_nota_fiscal. Para deletear os dados da nota fiscal de número 1 seria assim: DETELE FROM Item_da_nota_fiscal WHERE Numero_Nota = 1; DELETE FROM Nota_Fiscal WHERE Numero_Nota = 1; A segunda técnica você deverá estar usando a versão 4.1x ou superior (de preferência a versão 5.x) do MySQL com tabelas tipo Tansacionais INNODB ou MAXDB. Consiste em alterar a estrutura da tabela Item_da_nota_fiscal para a inclusão de constraints deste tipo: ALTER TABLE Item_da_nota_fiscal ADD CONSTRAINT FK_Item_da_nota_fiscal FOREIGN KEY(Numero_Nota) REFERENCES Nota_Fiscal (Numero_Nota) ON DELETE CASCADE ON UPDATE CASCADE; Constraint permite que uma exclusão ou atualização na tabela pai se reflita na tabela filha. Assim o comando de delete só se aplicaria a tabela pai. Outra vantagem deste tipo de comando é que você não conseguirá incluir nenhum item na tabela filha sem que antes você inclua na tabela pai. Ou seja, Tem que haver um registro na tabela pai para que haja um registro na tabela filha. O comando de deleção seria: DELETE FROM Nota_Fiscal WHERE Numero_Nota = 1; A terceira forma novamente independe de tipo de tabela mas depende de você estar usando uma versão 5.x do MySQL. Consiste em utilizar triggers. Triggers são gatilhos que são disparados quando um evento de inclusão, alteração ou exclusão ocorre em uma tabela do banco de dados. Então, você criaria uma trigger conforme eu mencionei no tópico http://scriptbrasil.com.br/forum/index.php?showtopic=109864, adaptando as suas necessidades e, depois, você usaria somente o comando de deletar na tabela pai, conforme exemplo 2. É só. Tente fazer e havendo dúvidas relate novamente. Quanto a estruturação de suas tabelas, sugiro que você leia sobre normalização de banco de dados e havendo dúvidas abra novo tópico para discutirmos a respeito. att Denis Courcy
  5. Oi, etcho! Tente SELECT * FROM tabela Where NOT nome LIKE "%cancelado%" AND block = "YES"; att Denis Courcy
  6. Oi,osgregs! Vou utilizar o usuário "my_user" de seu exemplo. Se este usuário possuir direito de acesso(GRANT) a todas as tabelas e todos os bancos (equivalente ao root, mas somente para os comandos INSERT, DELETE, UPDATE e SELECT) você só necessita apontar o banco de dados em seus comandos DML. Por exemplo: Tenho os bancos BD_1 e BD2. No BD_1, tenho as tabelas A_1 e A_2 e no BD_2 tenho as tabelas B_1 e B_2. Se estou no banco BD_1 e desejo utilizar tabelas do BD_2 em um select, faço assim. SELECT * FROM BD_2.B_1; Se preciso relacionar tabelas do BD_1 com tabelas do BD_2 faço assim: SELECT * FROM BD_1.A_1 a INNER JOIN BD_2.B_1 b ON a.campo1 = b.campo1; att Denis Courcy
  7. Oi, Giuliano! A referência a controles de fluxos está, no manual da versão 4.1x, no capítulo 11.1.9 - Flow Control Constructs; na versão 5.0x, está no catítulo 17.2.10. Abaixo coloco a sintaxe correta. Outra coisa, Suponho que "quaAco" e "empresa" sejam atributos(campos) da tabela "compra_acoes". Pois se não forem, então a lógica está errada, também. Código: DELIMITER | CREATE TRIGGER atualiza_est_acoes AFTER UPDATE ON compra_acoes FOR EACH ROW BEGIN IF old.empresa <> new.empresa or old.quaAco <> new.quaAco THEN UPDATE estoque_acoes set quantidade = quantidade - old.quaAco WHERE empresa = old.empresa; UPDATE estoque_acoes set quantidade = quantidade + new.quaAco WHERE empresa = new.empresa; END IF; END; | DELIMITER; Nota: Procure, neste forum, o tópico "Busca Por Fonemas" de minha autoria e veja a sintaxe de diversos "operadores de controle de fluxo". Att Denis Courcy
  8. Que SO (sist operacional) você tinha antes e qual está agora? Como você fez a transferência de arquivos do BD antigo para o novo? Motivo das perguntas: Estou tentando avaliar se não está faltando informação. att Denis Courcy
  9. Denis Courcy

    Contador E User On

    Forum errado. att Denis Courcy
  10. Olá desconhecido! Você não vai conseguir fazer o que deseja deste jeito. O GROUP BY by está reclamando do uso da função agregadora COUNT dentro de outra função agregadora SUM. Isto não é permitido. A solução para este caso passa por alguns passos: 1 criar uma tabela temporaria e carregando para ela os valores de um select que conte o que você deseja; 2 dar um select na tabela temporária somando os dados desejados e 4 destruir a tabela temporária. Aqui no forum, na mensagem http://scriptbrasil.com.br/forum/index.php?showtopic=109658 eu expliquei como fazer isto. Pesquise, faça e, havendo dúvidas, coloque de novo no forum para avaliarmos. att Denis Courcy
  11. Oi, Giuliano! Utilize uma trigger parecida com esta que uso para trilha de auditoria: DELIMITER $$; DROP TRIGGER `meubancodedados`.`trUPDLogCartaoDeCredito`$$ create trigger `trUPDLogCartaoDeCredito` BEFORE UPDATE on `cartaodecredito` for each row BEGIN insert into trilha_audit.cartaodecredito (Acao, CartaoID, NM_Cartao, Taxa, VL_Minimo, Incluido_EM, Incluido_POR, Alterado_EM, Alterado_POR) values ('A', OLD.CartaoID, OLD.NM_Cartao, OLD.Taxa, OLD.VL_Minimo, OLD.Incluido_EM, OLD.Incluido_POR, OLD.Alterado_EM, OLD.Alterado_POR); END; $$ DROP TRIGGER `meubancodedados`.`trDELLogCartaoDeCredito`$$ create trigger `trDELLogCartaoDeCredito` BEFORE DELETE on `cartaodecredito` for each row BEGIN insert into trilha_audit.cartaodecredito (Acao, CartaoID, NM_Cartao, Taxa, VL_Minimo, Incluido_EM, Incluido_POR, Alterado_EM, Alterado_POR) values ('D', OLD.CartaoID, OLD.NM_Cartao, OLD.Taxa, OLD.VL_Minimo, OLD.Incluido_EM, OLD.Incluido_POR, OLD.Alterado_EM, OLD.Alterado_POR); END; $$ DELIMITER;$$ Estas instruções ocorrem momento antes de atualizar o banco principal "meubancodedados". O banco "trilha_audit" possui as mesmas tabelas (com as mesmas estruturas) do banco original (não todas. Somente as que necessito auditar). Como a operação é em bases transacionais, tipo innodb, e dentro de uma transação, então se não gravar no banco original, esta é desfeita, também. Isto não vale para quem usa base não transacional, como myisam, por exemplo. No seu caso, substitua BEFORE UPDATE por BEFORE INSERT Para saber mais sobre triggers leia http://dev.mysql.com/doc/refman/5.1/en/triggers.html. att Denis Courcy
  12. Oi, Raphael! Utilize uma stored procedure e você terá todos estes recursos. att Denis Courcy
  13. Então de novo houve mudanças nas configurações originais. Leia no manual do mysql como ajustar o valor da variavel wait_timeout para 28800 que é o valor padrão dela. (Não lembro de cabeça como se faz e não tenho o mysql aqui no trabalho.) Depois reporte sucesso ou fracasso. att Denis Courcy
  14. O erro reportado é "errcode: 2013, error: Lost connection to MySQL server during query"? Se sim, Dê uma olhada no log de erro do MySQL e em suas configurações. Este erro acontece em alguns casos quando há um timeout da conexão. Isto é, conexões idle são interrompidas pelo MySQL após um wait_timeout, neste caso, quando o client envia uma requisição após este evento, a mensagem é exibida. O Log de erro (arquivo.err no diretório de dados), conterá mais informações que permitirão depurar melhor o problema. Se Não informe o erro, código do erro e tudo o que puder para ajudar a analisar. leia http://dev.mysql.com/doc/refman/5.0/en/gone-away.html att Denis Courcy
  15. Oi, Mário! O modo mais limpo de realizar esta operação é: 1 fazer o backup do(s) banco(s) atual(is) com mysqldump. 2 parar o serviço do mysql 3 desinstalar a versão atual 4 instalar a nova versao 5 iniciar o serviço do mysql 6 recuperar o backup. O manual do mysql 4.1 em portugês informa como proceder. Dê uma olhada e informe as dúvidas. Nota: sobre backup e restauração de backup vide mensagem http://scriptbrasil.com.br/forum/index.php?showtopic=109791 aqui no forum. att Denis Courcy
  16. Oi, Ediglei! O escrito abaixo é uma tradução de um original em inglês para este tipo de problema se você estiver usando Innodb. Se seu padrão é MyIsam, então provavelmente suas tabelas estão corrompidas e voce necessitará utilizar o myisamchk para recuperá-las. Avalie e informe sucesso ou fracasso. att Denis Courcy
  17. Se a mensagem que você está recebendo é: Access denied for user: '@unknown' to database mysql e se você está usando o Mysql 5.x, então Crie o usuário root @%, com todos os privilégios, que por default não criado. Se não for isso, informe que tipo de mensagem está recebendo. att Denis Courcy
  18. Oi, Ricardo! A primeira e segunda perguntas serão respondidas em conjunto. 1 No Windows utilize o mysqldump para fazer o backup. É a ferramenta mais segura para fazer backup. Principalmente entre plataformas. mysqldump --opt --triggers --port=3306 --user=root --result-file=backup.sql --databases meubancodedados Note que estou usando --result-file=backup.sql em vez de >backup.sql. Isto porque você necessita obter o padrão correto para mudança de linha que no DOS/WINDOWS é /r/n e no LINUX/UNIX é /n somente. A restauração do backup tanto no windows como no linux quanto é do mesmo modo. entre no mysql pela linha de comando a seguir. mysql -u root -p onde -p é a password do root. No prompt do mysql digite source backup.sql aguarde o termino do backup e encerre a sessão mysql com "quit". É só isso. att Denis Courcy
  19. Que tipo de ferramente (linguagem, etc) você está usando para manipular estes dados? Esta não é uma mensagem padrão do mysql. att Denis Courcy
  20. Denis Courcy

    Relacionamentos

    Não. Não tem nada haver com MySQL. Uso tabelas complexas com especialização/generalização, tabelas de domínios, agregações e outras técnicas e meu MySQL responde direitinho ao que propus em meu modelo. Mas o DBDesigner também vai te dar tudo o que você quer. Só não vai exibir graficamente do jeito que você gostaria. Pode usá-lo sem susto. É uma boa ferramenta. att Denis Courcy
  21. EXATAMENTE!!!!! att Denis Courcy P.S. Não esquece de testar, pois não tenho o MySQL aqui no trabalho e fiz esta função "de cabeça". A explicação dela está no tópico "Carregando Variáveis Para Tratar No Where " aqui no forum. http://scriptbrasil.com.br/forum/index.php?showtopic=108429
  22. Oi Fernando, Nada como uma boa noite de sono para melhorar os pensamentos. Achei uma nova solução, mais inteligente que a primeira, pois não haverá a necessidade de usar uma tabela temporária e, conseqüentemente, diminuirá o tempo de processamento. Esta solução passa pela criação de uma Stored Function (se é que podemos chamar assim). Então vamos lá: Criando a Função delimiter $$ CREATE FUNCTION MinhaFuncao (cod_cliente CHAR(50)) RETURNS CHAR(50) DETERMINISTIC BEGIN DECLARE MeuSQL CHAR(50); IF cod_cliente >= 500000 SET MeuSQL = ‘SELECT RazaoSocial FROM PA0022 WHERE Codigo = cod_cliente’; ELSE SET MeuSQL = ‘SELECT RazaoSocial FROM PA0042 WHERE Codigo = cod_cliente’; END IF; PREPARE TESTE FROM @MeuSQL; EXECUTE TESTE; RETURN RazaoSocial; END $$ Use a função assim: SELECT DATE_FORMAT(DtMovimento, '%d/%m/%y') DATA, CodOperacao 'T.O.', NDocumento NF, Transacao TR,CodCliFornec 'CLI/FORN', MinhaFuncao(CodCliFornec) 'RAZAO SOCIAL', FORMAT(preço, 2) preço, FORMAT(CtMedPonderado, 2) 'C.M.P.', FORMAT(QtMovimentada, 3) QTD, FORMAT(Saldo, 3) SALDO FROM PA0111 M WHERE Codigo = '$codigo' AND `NLocal` = '$local'; Testa e informe o resultado. att. Denis Courcy
  23. Sim. É possivel. Não Conheco o PHP ainda. Mas, no Delphi, você só pode passar uma instrução SQL por vez. Tente passar uma instrução sql por vez. Se o PHP continuar chiando, crie uma tabela ioiô (temporária e física no banco de dados) somente para este tipo de ação. att Denis Courcy Até amanhã.
×
×
  • Criar Novo...