Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Query do MySQL mostra "memo" em troca do conteúd


paulobergo

Pergunta

Olá pessoal... Não intrepretem, por favor, como sendo um tópico para o MySQL (até poderia ser...)

Observei um problema em obter um resultado a partir de uma query usando BDE e ODBC MySQL.

No servidor, no banco MySQL 5.0.27, existe uma função que 'traduz' a situação de uma duplicata... A função recebe a data de vencimento da duplicata, a data da liquidação e a situação (liquidada ou não) e retorna:

- Se a duplicata não foi liquidada ainda, irá retornar

"vencida" se estiver atrasada,

"vence hoje" se estiver vencendo exatamente na data de hoje e

"a vencer" se vencerá de amanhã em diante...

- Se a duplicata foi liquidada, irá retornar, simplesmente, a data em que foi liquidada.

Então, é uma função que manipula datas e retorna sempre uma string (char)... A função é esta:

DROP FUNCTION IF EXISTS `MyDataPG`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `MyDataPG`(in_vencimento date, in_data_pg date, in_pago tinyint) RETURNS varchar(10) CHARSET latin1
    NO SQL
begin
  declare resultado varchar(10) default '';
  if in_pago=0 then
    if in_vencimento<now() then
      set resultado = 'vencida   ';
    else
      if in_vencimento=now() then
        set resultado = 'vence hoje';
      else
        set resultado = 'a vencer  ';
      end if;
    end if;
  else
    set resultado = cast(in_data_pg as char(10));
    set resultado = concat(substring(resultado, 9, 2), '/',
                           substring(resultado, 6, 2), '/',
                       substring(resultado, 1, 4));
  end if;
  return resultado;
end $$
DELIMITER;
Bom, tendo os campos vencimento e data_baixa como sendo do tipo Date e o campo pago sendo do tipo TinyInt, a query a seguir:
select vencimento, data_baixa, pago, mydatapg(vencimento, data_baixa, pago) as situacao
from conta_ar
where mydatapg(vencimento, data_baixa, pago)="vencida"

union

select vencimento, data_baixa, pago, mydatapg(vencimento, data_baixa, pago) as situacao
from conta_ar
where mydatapg(vencimento, data_baixa, pago)="vence hoje"

union

select vencimento, data_baixa, pago, mydatapg(vencimento, data_baixa, pago) as situacao
from conta_ar
where mydatapg(vencimento, data_baixa, pago)="a vencer"

union

select vencimento, data_baixa, pago, mydatapg(vencimento, data_baixa, pago) as situacao
from conta_ar
where pago=1
  and data_baixa between "2011/04/01" and "2011/04/05"
Irá retornar:
+------------+------------+------+------------+
| vencimento | data_baixa | pago | situacao   |
+------------+------------+------+------------+
| 2011-01-02 | 2011-01-02 |    0 | vencida    |
| 2011-01-01 | 2011-01-01 |    0 | vencida    |
| 2011-01-03 | 2011-01-03 |    0 | vencida    |
| 2011-01-04 | 2011-01-04 |    0 | vencida    |
| 2011-01-07 | 2011-01-07 |    0 | vencida    |
| 2011-01-10 | 2011-01-10 |    0 | vencida    |
| 2011-01-12 | 2011-01-12 |    0 | vencida    |
| 2011-01-13 | 2011-01-13 |    0 | vencida    |
| 2011-01-14 | 2011-01-14 |    0 | vencida    |
| 2011-04-14 | 2011-04-25 |    0 | vence hoje |
| 2011-04-28 | 2011-04-28 |    0 | a vencer   |
| 2011-04-29 | 2011-04-29 |    0 | a vencer   |
| 2011-04-30 | 2011-04-30 |    0 | a vencer   |
| 2011-04-26 | 2011-04-26 |    0 | a vencer   |
| 2011-04-27 | 2011-04-27 |    0 | a vencer   |
| 2011-04-04 | 2011-04-05 |    1 | 05/04/2011 |
| 2011-04-01 | 2011-04-02 |    1 | 02/04/2011 |
| 2011-03-19 | 2011-04-05 |    1 | 05/04/2011 |
| 2011-04-03 | 2011-04-05 |    1 | 05/04/2011 |
| 2011-04-02 | 2011-04-05 |    1 | 05/04/2011 |
| 2011-02-23 | 2011-04-02 |    1 | 02/04/2011 |
| 2011-03-23 | 2011-04-01 |    1 | 01/04/2011 |
| 2011-03-31 | 2011-04-01 |    1 | 01/04/2011 |
| 2011-04-14 | 2011-04-01 |    1 | 01/04/2011 |
| 2011-04-21 | 2011-04-05 |    1 | 05/04/2011 |
| 2011-03-31 | 2011-04-05 |    1 | 05/04/2011 |
| 2011-03-31 | 2011-04-02 |    1 | 02/04/2011 |
+------------+------------+------+------------+
Esta query vem funcionando desde que existe a versão 5.0 do MySQL... (nem sei precisar desde quando)... E sempre funcionou tanto via BDE/ODBC, localmente ou remotamente, e também pelo ZeosBDO, PHP, PHPMyAdmin, MySQLNavigator... sem problemas... Mas, desde terça feira, uma máquina, num universo de não sei tantas outras, passou a mostrar, no lugar da coluna da situação, a palavra (MEMO) em troca do conteúdo correto... Assim...

Clicando-se no campo memo exibido, aparece o conteúdo correto... O problema acontece somente nas conexões

feitas através da dupla BDE/ODBC Conector... e desinstalar/reinstalar ambos não resolveu...

Alguém já passou por isso ou viu algo similar?

Grato por qualquer colaboração...

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

CREATE DEFINER=`root`@`localhost` FUNCTION `MyDataPG`(in_vencimento date, in_data_pg date, in_pago tinyint) RETURNS varchar(10) CHARSET latin1

select vencimento, data_baixa, pago, mydatapg(vencimento, data_baixa, pago) as situacao

from conta_ar

where mydatapg(vencimento, data_baixa, pago)="vence hoje"

eu considero um bug do mysql, pois ele considera a variavel situacao como variant

a definição de Varchar(10) para essa variavel, deixa de ser varchar e passa a ser memo, quando ultrapassa o limite de carcteres

experimente a versão mysql-essential-5.1.41-win32.msi

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas! grato pela resposta...

Com certeza, vou tentar a 5.1.41...

Mas uma coisa não entendi... quanto a ultrapassar o limite de caracteres... como a função está definida para retornar exatamente 10 caracteres, e as respostas também estão limitadas a 10 caracteres, quando ultrapassaria o limite de caracteres?

Grato!

Link para o comentário
Compartilhar em outros sites

  • 0

Já peguei cada erro, que nem a lógica explica... esse tipo de coisa me aconteceu quando do nada apareceram caracteres estranhos no campo que deveria conter apenas caracteres alfabeticos.

se voce percebeu, a cada nova versão do mysql, nada mais é do que correções de bugs das versões anteriores

OBS: para teste, abra a sua tabela pelo Mysql-Front e da uma pesquisada no campo, ou aumente o numero de caracters ou mude até mesmo o tipo e veja o que acontece.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Bom... para verificar a função, executei esta query:

select max(length(mydatapg(vencimento, data_baixa, pago))) as maximo,

min(length(mydatapg(vencimento, data_baixa, pago))) as minimo

from conta_ar

e o resultado foi maximo=10, minimo=10.

Dos 23 pcs na rede, 22 retornam o resultado da função corretamente, sempre via BDE+MysqlODBCConector, tanto nos XPs como nos Linux via Wine...

E somente um "intepreta" erradamente o resultado...

Antes de fazer a atualização no servidor, experimentarei trocar a versão do conector ODBC... posto aqui se der resultado!

Grato e abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá pessoal! olá Jhonas!

Solução!

a) Atualizar o MySQL: não deu resultado... ou seja, o pc (e apenas um) continuou a mostar "(Memo)" no lugar do resultado correto da função...

B) BDE: remover completamente e reinstalar a BDE também não resolveu...

c) Atualizar o conector ODBC... isso sim... removi a versão 3.51 - que é a que uso em todas as máquinas, inclusive as com Ubuntu+Wine - pela 5.1.8 e pronto! problema resolvido!!!

Pode marcar aí como solucionado...

Realmente, não consegui entender o que fez, de uma hora para outra, especificamente em um computador que vem funcionando desde, creio, 2004, com as mesmas características, parar de exibir uma informação da mesma forma como fazia antes...

Ainda vou postar isso na dev.mysql.com... por curiosidade...

De qualquer forma, grato pelas idéias!

A todos um abraço!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...