Página 1 de 2

select omitindo campos da tabela em base de dados MySQL

Enviado: 04 Jul 2014 01:58
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?

select omitindo campos da tabela em base de dados MySQL

Enviado: 04 Jul 2014 12:31
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...

select omitindo campos da tabela em base de dados MySQL

Enviado: 04 Jul 2014 12:39
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 15 Jul 2014 17:04
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?

select omitindo campos da tabela em base de dados MySQL

Enviado: 16 Jul 2014 17:07
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 29 Jul 2014 23:22
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 30 Jul 2014 09:42
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 30 Jul 2014 13:04
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 16 Ago 2014 21:26
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?

select omitindo campos da tabela em base de dados MySQL

Enviado: 23 Ago 2014 18:17
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 23 Ago 2014 18:36
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 23 Set 2014 10:33
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 23 Set 2014 11:30
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.

select omitindo campos da tabela em base de dados MySQL

Enviado: 23 Set 2014 11:41
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

select omitindo campos da tabela em base de dados MySQL

Enviado: 23 Set 2014 11:54
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.