buscar nomes dos campos de uma tabela dinamicamente

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

elaineosm
Usuário Nível 1
Usuário Nível 1
Mensagens: 21
Registrado em: 04 Jul 2019 13:14
Localização: BM/RJ

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por elaineosm »

boa tarde!
Alguem sabe informar se existe alguma função do harbour para buscar o nome dos campos de um arquivo dbf para que eu possa armazenar em um vetor estes nomes com seus respectivos valores?
desde já agradeço.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por Jairo Maia »

Não sei se entendi direito, mas se a ideia for pegar os campos e valores de um determinado registro do DBF, após posicionar no registro faça:

Código: Selecionar todos

aVetor := {}

For x=1 To FCount()

 cNomeCampo := Field( x )
 nValorCampo := &cNomeCampo.
 AaDd( aVetor, { cNomeCampo, nValorCampo } )
 
Next
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)
elaineosm
Usuário Nível 1
Usuário Nível 1
Mensagens: 21
Registrado em: 04 Jul 2019 13:14
Localização: BM/RJ

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por elaineosm »

Olá,
Na verdade eu precisaria pegar todos os nomes e valores dos campos. Teria como fazer isto ? Eu poderia posicionar em campo por campo sem informar manualmente?
obg
elaineosm
Usuário Nível 1
Usuário Nível 1
Mensagens: 21
Registrado em: 04 Jul 2019 13:14
Localização: BM/RJ

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por elaineosm »

deu certo amigo.
mt obg!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por JoséQuintas »

Pequeno ajuste na rotina pra não precisar de macro:

Código: Selecionar todos

aList := {}
FOR nCont = 1 TO FCount()
   AAdd( aList, { FieldName( nCont ), FIeldGet( nCont ) } )
NEXT
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por Jairo Maia »

JoséQuintas escreveu:Pequeno ajuste na rotina pra não precisar de macro
Obviamente mesmo nos tempos atuais, se preocupar com velocidade da aplicação é uma preocupação que sempre deve existir.

Porém, substituir macros por Funções, DISCORDO!!!

Salvo se você me apresentar elementos técnicos para isso, e se sim, sem dúvida, dou a mão à palmatória.

PS: Macros, são resolvidas em primeira instância (LOCALMENTE), enquanto uso de funções necessitam "varredura" para encontrar e receber o retorno delas.
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por JoséQuintas »

Jairo Maia escreveu:Porém, substituir macros por Funções, DISCORDO!!!
Salvo se você me apresentar elementos técnicos para isso, e se sim, sem dúvida, dou a mão à palmatória.
Em nenhuma outra linguagem existe macro, porque será?
Variáveis pra macro necessitam declaração especial, geralmente PRIVATE ou PUBLIC.
Conteúdo de macro não pode ser validado em tempo de compilação.

Macro tem conteúdo desconhecido.
É melhor trabalhar com conteúdo desconhecido, ou com conteúdo conhecido?

E dependendo do processo, pode mudar de horas pra segundos, mesmo nas máquinas atuais.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por Jairo Maia »

Olá José,
JoséQuintas escreveu:Em nenhuma outra linguagem existe macro, porque será?
Variáveis pra macro necessitam declaração especial, geralmente PRIVATE ou PUBLIC.
Conteúdo de macro não pode ser validado em tempo de compilação.
Isso não deprecia tecnicamente em nada o uso de macro substituição.
JoséQuintas escreveu:Macro tem conteúdo desconhecido.
É melhor trabalhar com conteúdo desconhecido, ou com conteúdo conhecido?
Macro tem conteúdo variável, não desconhecido.
JoséQuintas escreveu:E dependendo do processo, pode mudar de horas pra segundos, mesmo nas máquinas atuais.
De horas prá segundos? Nunca vi isso, e sempre usei e ainda uso macros. Essa questão é a que sempre dizem, mas ainda não me deparei com isso. Acho que depende muito onde aplicar o uso de macros.

Li uma vez e não me lembro onde, mas me pareceu correto: "A velocidade do uso de macros é idêntica a velocidade de declaração de variável, ela nada mais faz que atribuir um novo valor a uma variável". Sei lá...
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)
Ranier
Usuário Nível 2
Usuário Nível 2
Mensagens: 80
Registrado em: 02 Abr 2019 09:01
Localização: Goiania/Goias

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por Ranier »

Jairo Maia escreveu:Li uma vez e não me lembro onde, mas me pareceu correto: "A velocidade do uso de macros é idêntica a velocidade de declaração de variável, ela nada mais faz que atribuir um novo valor a uma variável". Sei lá...
Macros têm que ativar um analisador léxico, compilar a macro, verificar erros e trazer o resultado.

Função, FieldName, por exemplo, é compilada nativamente, para ser usada, precisa uma pesquisa e uma CALL, somente.

Façam as contas...
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por JoséQuintas »

Jairo Maia escreveu:Li uma vez e não me lembro onde, mas me pareceu correto: "A velocidade do uso de macros é idêntica a velocidade de declaração de variável, ela nada mais faz que atribuir um novo valor a uma variável". Sei lá...
Usar uma vez é uma coisa.
Pegue um arquivo grande.

Código: Selecionar todos

USE arquivo
? "macro inicio:" + Time()
DO WHILE ! Eof()
   FOR nCont = 1 TO FCount()
      cCampo := FieldName(nCont)
      xValor := &cCampo
   NEXT
  SKIP
ENDDO
? "macro fim:" + Time()

? "função inicio:" + Time()
GOTO TOP
DO WHILE ! Eof()
   FOR nCont = 1 TO FCount()
      cCampo := FieldName(nCont)
      xValor := FieldGet( nCont )
   NEXT
   SKIP
ENDDO
? "função final:" + Time()
Por exemplo, um arquivo com valores de entradas e saídas, aonde pode fazer cálculos usando várias vezes a macro, pode ser pior.
Ou um plano de contas contábil, com entradas/saídas para cada mês do ano: entrada01 a 12, saida01 a 12, seriam 24 vezes usando macro, no mínimo, a diferença vai aumentando conforme a quantidade de vezes que usa.

Num caso isolado, não se percebe diferença, mas num uso mais pesado a diferença é grande.

Talvez esteja pensando só no uso individual, de uma rotina simples, e não numa rotina que faz uso intensivo de macro.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por Jairo Maia »

JoséQuintas escreveu:Talvez esteja pensando só no uso individual, de uma rotina simples, e não numa rotina que faz uso intensivo de macro.
Sim. Troquei Time() por DateTime() e testei sua função usando um DBF com 19 campos por registro, e com 51.526 registros:

Código: Selecionar todos

macro inicio: 10/16/19 12:03:47.490
macro fim: 10/16/19 12:03:50.360

função inicio: 10/16/19 12:03:50.360
função final: 10/16/19 12:03:52.108
Conclusão: Com macro deu quase 3 segundos, sem a macro deu quase 2 segundos. Tem que ter cuidado mesmo onde e quando usar macro.
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

buscar nomes dos campos de uma tabela dinamicamente

Mensagem por JoséQuintas »

Jairo Maia escreveu:Com macro deu quase 3 segundos, sem a macro deu quase 2 segundos. Tem que ter cuidado mesmo onde e quando usar macro.
Depende o ponto de vista.
Nesse caso 1 segundo representa 50% mais demorado.
E num uso simples.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder