select omitindo campos da tabela em base de dados MySQL

Forum sobre SQL.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

select omitindo campos da tabela em base de dados MySQL

Mensagem por cjp »

Meus amigos,

Estou enfrentando um problema estranho na consulta de dados na base de dados MySQL: o select está omitindo alguns campos da tabela.

Estou testando assim:

Código: Selecionar todos

DBUSEAREA( .T.,, "SELECT * FROM ativ", "ativ")
browse()
Estranhamente, alguns dos campos da tabela não são listados.

Já verifiquei, via HeidiSQL, que os campos existem na tabela.

Por que eles não são listados?
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

select omitindo campos da tabela em base de dados MySQL

Mensagem por alxsts »

Olá!

Quantas colunas tem cada registro nesta tabela?

Pergunto isso pois o velho DBU só mostrava 64 colunas, omitindo as demais, caso existissem. Não sei se a função Browse() tem o mesmo comportamento...
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

select omitindo campos da tabela em base de dados MySQL

Mensagem por cjp »

Não chega nem perto disso. Está com 18 colunas. Veja o query de criação desta tabela:

Código: Selecionar todos

cQuery:="CREATE TABLE tarefas ("+;
          "USUARIO char(1),"+;
	      "NRTAREFA char(10),"+;
	      "DTEXIBE date,"+;
          "HREXIBE char(8),"+;
	      "DTMAXIMA date,"+;
          "PRIORIDADE int,"+;
          "INCLUIDOR char(15),"+;
		  "SOLUC char(1),"+;
		  "EXIB char(1),"+;
		  "VINCULO char(20),"+;
		  "TEMPOESTIM decimal(7,1),"+;
		  "TEMPOUSADO decimal(7,1),"+;
		  "TEMPOCOMPU decimal(7,1),"+;
		  "CAMPO char(1),"+;
          "ASSUNTO char(30),"+;
		  "DATA date,"+;
          "HORA char(8),"+;
          "TAREFA mediumtext)"
Também já testei com dbedit(), dá o mesmo problema.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

select omitindo campos da tabela em base de dados MySQL

Mensagem por cjp »

Meus amigos, será que alguém teria alguma ideia de como resolver isto?

Estou fazendo vários testes, e em vários casos dá problema.

Exemplo:

Código: Selecionar todos

DBUSEAREA( .T.,, "SELECT data,hora,acao,nrtarefa,assunto,detalhes,prioridade,tempousado,tempocompu,campo,usuario,programa FROM ativ where usuario='"+usus+"'", "athor")
browse()					
dbedit(,,maxcol()-2)
Veja como aparece o browse():

Imagem

O campo Programa, embora não esteja aparecendo na imagem, também está sendo exibido.

Mas notem que não estão aparecendo os campos nrtarefa, assunto e campo.

Agora vejam como aparece o dbedit():

Imagem

Notem que agora aparece o campo assunto, mas ainda faltam os campos nrtarefa e campo.

E o pior é que isso varia. Não está acontecendo sempre assim. Ora aparece um campo, ora outro; ora falta um, ora outro.

Alguém saberia me dizer como resolver isso?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

select omitindo campos da tabela em base de dados MySQL

Mensagem por Itamar M. Lins Jr. »

Já testou de um por um ?

Código: Selecionar todos

DBUSEAREA( .T.,, "SELECT data FROM ativ where usuario='"+usus+"'", "athor")
browse()               
dbedit(,,maxcol()-2)
Depois:

Código: Selecionar todos

DBUSEAREA( .T.,, "SELECT data,hora FROM ativ where usuario='"+usus+"'", "athor")
browse()               
dbedit(,,maxcol()-2)
Depois:

Código: Selecionar todos

DBUSEAREA( .T.,, "SELECT data,hora,acao FROM ativ where usuario='"+usus+"'", "athor")
browse()               
dbedit(,,maxcol()-2)
Qual é a versão do Harbour que está usando ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

select omitindo campos da tabela em base de dados MySQL

Mensagem por cjp »

Tenho feito vários testes, mas ainda não consegui chegar a uma conclusão sobre a causa do problema, pois cada hora o resultado é diferente.

A única causa que consegui supor por ora é que, quando o primeiro registro está vazio em determinado campo, ele omite o campo. É possível isso? E, se for realmente este o problema, como contorná-lo?

Uso o Harbour 3.2.
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

select omitindo campos da tabela em base de dados MySQL

Mensagem por Itamar M. Lins Jr. »

Sim.
Deve ser quando retornar Nil
É só trocar por "" se for caractere se for data ctod(""), numerico = 0.00

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

select omitindo campos da tabela em base de dados MySQL

Mensagem por sygecom »

No meu ponto de vista o correto é nunca usar * , sempre deve passar os nomes dos campos que deseja que retorne, até por a tabela pode mudar depois e mudar a ordem que vai retornar os campos.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

select omitindo campos da tabela em base de dados MySQL

Mensagem por cjp »

Sigo fazendo testes e obtendo diversos resultados.

Já notei que não basta preencher o campo com "", pois ainda assim ele omite. Testei colocar "----", o que parece que resolveu.

Também parei de usar *, colocando os nomes dos campos.

Um problema que ainda persiste é que, frequentemente, ele diminui o tamanho do campo. Mesmo na tabela estando, por exemplo, com char(15), ele mostra o campo com apenas 4 caracteres. Se eu dou enter em cima do campo, ele mostra o restante.

Mas será que não tem como o browse() ou o dbedit() mostrar o campo completo da tabela, como faz com o dbf?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

select omitindo campos da tabela em base de dados MySQL

Mensagem por Itamar M. Lins Jr. »

Ola!
Veja se é isso que eu estou pensando:
Uma tabela com char(40);
Quando vem no browse a coluna vem com tamanhos diferentes tipo, "JOÃO DA SILVA" ou "CONCEIÇÃO DA SILVA" os dois deveriam vim com space() = 40 e vem com tamanhos diferentes.
Se for isso, verificar se ocorre com letras acentuadas ou ocorre por qualquer motivo o tamanho vem "MARIA DA SILVA", "MARCOS DA SILVA" tipo com alltrim() ou rtrim() sendo executado nos tamanhos dos nomes.
Se esse for o problema avisar e criar um exemplo p/ mandar para o Viktor Szakats ou Midaugas...

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

select omitindo campos da tabela em base de dados MySQL

Mensagem por cjp »

Pelo que eu percebi até agora, ocorre em qualquer situação. Parece que está mesmo com alltrim(). Se o nome tem 10 caracteres, a tabela limita-se a 10, embora na tabela mesmo tenha 40. Se tiver 20, limita-se a 20. Mas pior: às vezes o nome tem 10, e a tabela se limita a 5, omitindo parte do nome. Se dou enter no nome, aparece o restante.

Vou tentar criar uma imagem disso e já posto.
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

select omitindo campos da tabela em base de dados MySQL

Mensagem por Itamar M. Lins Jr. »

Será um possível fix ?
Hi

Because FieldName() truncates name to 10 chars, browse doesn't work with ssdodbc
with tables having columnames longer than 10 chars. (and maybe with odher ssds to),
So in attachment is a quick fix of browse.
A better one should be to fix FieldName ;)

regards
Se for aceito, "comitado" no git, avisaremos.

Saudações,
Itamar M .Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

select omitindo campos da tabela em base de dados MySQL

Mensagem por Itamar M. Lins Jr. »

O fix é esse:
Arquivo browse.diff

Código: Selecionar todos

--- G:/HRB_SVN/SRC-GIT/src/rtl/browse.prg	Mon Apr 07 19:50:32 2014
+++ D:/Test/Hrb/ODBC/SddOdbc/browse.prg	Tue Sep 23 07:04:04 2014
@@ -51,7 +51,7 @@
 #include "setcurs.ch"
 
 FUNCTION Browse( nTop, nLeft, nBottom, nRight )
-
+   LOCAL aDbStr,cName
    LOCAL oBrw
    LOCAL lContinue, lAppend, lKeyPressed, lRefresh
    LOCAL n, nOldCursor, nKey
@@ -84,9 +84,11 @@
    oBrw := TBrowseDB( nTop + 2, nLeft + 1, nBottom - 1, nRight - 1 )
    oBrw:HeadSep := " " + hb_UTF8ToStrBox( "═" )
    oBrw:SkipBlock := {| nRecs | Skipped( nRecs, lAppend ) }
-
+   
+   aDbStr:=DbStruct()
    FOR n := 1 TO FCount()
-      oBrw:AddColumn( TBColumnNew( FieldName( n ), FieldBlock( FieldName( n ) ) ) )
+      cName:=aDbStr[n][1]
+      oBrw:AddColumn( TBColumnNew( cName, FieldBlock( cName ) ) )
    NEXT
 
    IF Eof()
Outro foi esse, já no GIT do Harbour 3.2/3.4

Código: Selecionar todos

2014-09-23 10:47 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
  * contrib/rddsql/sqlbase.c
    ! set maximum field size to HB_SYMBOL_NAME_LEN
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

select omitindo campos da tabela em base de dados MySQL

Mensagem por Jairo Maia »

Olá Itamar,

Quanto ao primeiro exemplo publicado no harbour-devel, acho que não se trata de correção de bug. Ele está fazendo apenas uma sugestão para ao invés de usar a função FieldName() que trunca em 10 caracteres o nome do campo, pegar o nome diretamente da matrix retornada pela função DbStruct(). Este recurso é possivel também de forma manual. Veja:
Exemplo postado:

Código: Selecionar todos

aDbStr:=DbStruct()
FOR n := 1 TO FCount()
 oBrw:AddColumn( TBColumnNew( FieldName( n ), FieldBlock( FieldName( n ) ) ) )
 cName:=aDbStr[n][1]
 oBrw:AddColumn( TBColumnNew( cName, FieldBlock( cName ) ) )
NEXT
Exemplo manual:

Código: Selecionar todos

aDbStr:=DbStruct()
FOR n := 1 TO FCount()
 cName:="Este é o Campo Número: " + Hb_NToS( n )
 oBrw:AddColumn( TBColumnNew( cName, FieldBlock( aDbStr[n,1] ) ) )
NEXT
Veja que ele mesmo diz que melhor seria corrigir a função FieldName(): A better one should be to fix FieldName
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

select omitindo campos da tabela em base de dados MySQL

Mensagem por Itamar M. Lins Jr. »

Então não é fix do Przemek ?
Veja que ele mesmo diz que melhor seria corrigir a função FieldName(): A better one should be to fix FieldName
set maximum field size to HB_SYMBOL_NAME_LEN
Se fosse eu, ainda modificaria isso:
aDbStr:=DbStruct()
nCount := fCount()
FOR n := 1 TO nCount
...
Chamar fcount() toda hora em uma tabela muito grande cai a performance.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Responder