Página 1 de 2

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 18:40
por rochinha
Amiguinhos,

Linhares esta reportando nos grupos de que existe um bug no dbSelectArea() nas novas versões do xHarbour ou Harbour referente à área fantasma que nos permite abrir a próxima área livre sem ter de numerá-la.

Ninguém usa dbSelectArea(1)...(12)...(74). Geralmente nomeamos através do Alias que a tabela assume. Mas mudanças ocorridas podem afetar novas aberturas de áreas sem numerá-las ou nomeá-las.
Antonio Linares <antonio.fivetech@gmail.com>

Harbour Developers

Due to recent Harbour changes, this code that used to work this way:

USE CUSTOMER
? SELECT() // --> 1
DBSELECTAREA( 0 )
? SELECT() // --> used to return 2, now it is returning ZERO !!!

Has clearly changed its behavior affecting many Harbour apps.

It seems as DbSelectArea( 0 ) has changed its behavior. 

Reported by several Harbour users and confirmed by us.

many thanks

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 22:10
por JoséQuintas
Assustou, porque o Linares postou agora a pouco no harbour-devel.

Código: Selecionar todos

PROCEDURE Main

   SetMode(30,100)
   CLS
   dbCreate( "teste.dbf", { { "CODIGO", "C", 6, 0 } } )
   ? Select()
   USE TESTE
   SELECT 0
   ? Select()
   Inkey(0)

   RETURN
Aqui mostrou corretamente 1 e 2

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 22:13
por Itamar M. Lins Jr.
Olá!
Isso não vai mudar vc. Escrever e depois apagar!

Código: Selecionar todos

select a
use aquivo
select b
use aquivob
select c
use aquivoc
Mas select a, b... é a mesma coisa de 0!!! e dai ? verificou se o arquivo foi aberto antes ? Não pode! Dá erro!!!! Pois é!!!!! Verificou ?
Podendo fazer:

Código: Selecionar todos

use arquivo new
use arquivob new
use arquivoc new
Mas como verificar se o DBF já foi aberto ?

Código: Selecionar todos

IF Select(cAlias) > 0
Vai ter que ter de toda forma.
Nisso a pessoa usa?

Código: Selecionar todos

dbSelectArea(0)
use clientes
Em uma parte do programa depois ele usa em outra parte o mesmo processo para abrir

Código: Selecionar todos

dbSelectArea(0)
use clientes
Vai dar erro! vai precisa usar IF SELECT("clientes") > 0 ... redundância de código.
Esse -> dbSelectArea(0) nada mais é do que o NEW do comando USE por isso eu não usei ele nem sabia que existia.

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 22:19
por JoséQuintas
Sim, você tem toda razão, o Clipper inventou isso só pra criar problemas, por isso o Clipper não fez sucesso e a empresa acabou fechando.

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 22:25
por Itamar M. Lins Jr.
Olá!
Vc tá num forum de programadores!!!! Mostre seu código provando o contrário!
Mostre por códigos que estou errado!!!
A linguagem AMADURECE, MELHORA então fique usando GTWVG!!!!!
Ou melhor fique ai fazendo o que vc ACREDITA ser uma coisa BOA!!!!
Vc acredita que os programadores irão SUBSTITUIR as IDEs gráficas do Harbour pelo PROGRAMA que vc está fazendo ?
Vc acha que o pessoal não vai usar MOUSE para COLOCAR os CONTROLES na TELA ? Vai usar linha de comando ?
Quem já usa Hwgui/Minigui etc... não tem como usar... Só para quem ainda não sabe como é, mas se mexer em 1 linha de código que posiciona os controles já não vai poder usar mais seu programa. Já pensou nisso ?
Ele lê .PRG ? armazena posições de controle ? etc....
E fica ai pagando de bonzão

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 22:37
por JoséQuintas
Itamar M. Lins Jr. escreveu:Vc tá num forum de programadores!!!! Mostre seu código provando o contrário!
Mostre por códigos que estou errado!!!

Código: Selecionar todos

Abrearquivos( "CLIENTES", "FORNEC", "PRODUTO", "ESTOQUE", "FINANCEIRO" )
...

FUNCTION AbreArquivos( ... )

   LOCAL cFile, aList := hb_AParams()

   FOR EACH cFile IN aList
      SELECT ( Select( cFIle ) )
      USE ( cFile )
   NEXT

   RETURN .T.
Sei que não adianta, mas vamos tentar.
Já até imagino qual vai ser a resposta... que faltam testes adicionais, o que não faz parte da questão do tópico.

Qualquer programador sabe que, se a linguagem criou um recurso adicional, é porque ele pode ser útil.
Um programador não precisaria provas sobre recurso adicional.

Se acha certo... vai lá no grupo do harbour, e pede comprovação de tudo que é coisa que existe no harbour.

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 22:39
por Itamar M. Lins Jr.
Olá!
Me explique pq sou muito burro!
Onde esse código contradiz o que escrevi ?

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 22:50
por JoséQuintas
Itamar M. Lins Jr. escreveu:Me explique pq sou muito burro!
Onde esse código contradiz o que escrevi ?
Contradiz totalmente.
Sua postagem não ter a ver com o assunto do tópico, e a minha tem.
Estou mostrando uma utilidade da área zero bem prática.

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 23:00
por Itamar M. Lins Jr.
Olá!
Tá todo mundo vendo!
dbSelectArea() Cadê ?
Troca ai select() por dbSelectarea() para ver como é.
Aqui no meu deu erro com dbselectarea()

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 23:01
por Itamar M. Lins Jr.
Olá!
Bug na função dbSelectArea()
E ele vem com select()

Bug na função dbSelectArea()

Enviado: 06 Mar 2024 23:07
por Itamar M. Lins Jr.
Olá!
O bagulho nem retorno tem.

Código: Selecionar todos

DBSELECTAREA()

Change to another work area

Syntax

      DBSELECTAREA(<xArea>) -

Arguments

<xArea> Alias or work area

Description

This function moves the Harbour internal primary focus to the work area designated by <xArea>. If <xArea> is numeric, then it will select the numeric work area; if <xArea> is character, then it will select the work area with the alias name.

DBSELECTAREA(0) will select the next avaliable and unused work area. Up to 255 work areas are supported. Each work area has its own alias and record pointer, as well as its own FOUND(), DBFILTER(), DBRSELECT() and DBRELATION() function values.

Examples

      PROCEDURE Main()
         LOCAL nId
         USE tests NEW INDEX tests
         USE tests1 NEW INDEX tests1
         DBSELECTAREA( 1 )
         nId := tests->Id
         DBSELECTAREA( 2 )
         IF DBSEEK( nId )
            ? tests1->cName
         ENDIF
         DBCLOSEALL()
         RETURN

Compliance


Bug na função dbSelectArea()

Enviado: 06 Mar 2024 23:14
por Itamar M. Lins Jr.
Olá!
Aqui mostrou corretamente 1 e 2
Tá falando de DBSELECTAREA() e vc testa SELECT() ainda diz que no seu funciona. É mole ?
Pode ser o Harbour que não está na versão do GIT ?
Tá VENDO ?
Select() eu uso, sem ela como irei saber se o DBF foi aberto ou não, se ela retorna um numero quando o DBF já foi aberto!

Bug na função dbSelectArea()

Enviado: 07 Mar 2024 00:55
por JoséQuintas
Nas mensagens apagadas postei o include do harbour:

Código: Selecionar todos

#command SELECT <area>           => dbSelectArea( <(area)> )
Meu teste foi baseado nisso.

Mas fiz outro teste:

SELECT 0 funciona

dbSelectArea( 0 ) não funciona

Porque um funciona e o outro não, se no CH diz ser a mesma coisa ?
Coube mais um teste aqui, compilar usando /p pra ver o fonte gerado.

original:

Código: Selecionar todos

PROCEDURE Main

   SetMode(30,100)
   CLS
   dbCreate( "teste.dbf", { { "CODIGO", "C", 6, 0 } } )
   ? Select()
   USE TESTE
   SELECT 0
   ? Select()
   Inkey(0)

   RETURN
Compilado com /p

Código: Selecionar todos

d:\temp>type test.ppo
#line 3 "test.prg"
PROCEDURE Main

   SetMode(30,100)
   Scroll() ; SetPos( 0, 0 )
   dbCreate( "teste.dbf", { { "CODIGO", "C", 6, 0 } } )
   QOut( Select() )
   dbUseArea( .F.,, "TESTE",, iif( .F. .OR. .F., ! .F., NIL ), .F. )
   dbSelectArea( "0" )
   QOut( Select() )
   Inkey(0)

   RETURN
Itamar M. Lins Jr. escreveu:Tá falando de DBSELECTAREA() e vc testa SELECT() ainda diz que no seu funciona. É mole ?
Explicado acima. Não confunda SELECT comando, com Select() função.
Meu fonte tem os dois.

Bug na função dbSelectArea()

Enviado: 07 Mar 2024 01:09
por Itamar M. Lins Jr.
Olá!
Explicado acima. Não confunda SELECT comando, com Select() função.
O que que tem a ver ?
Tem um bug na dbselectarea() e pronto!

Bug na função dbSelectArea()

Enviado: 07 Mar 2024 01:17
por Itamar M. Lins Jr.
Olá!
Olhe a diferença do PPO dele para o seu.

Código: Selecionar todos

function main
cFile := "/home/itamar/databases/clientes"
dbUseArea( .F.,, (cFile),, iif( .F. .OR. .F., ! .F., NIL ), .F. )
QOut( SELECT() )
DBSELECTAREA( 0 )
QOut( SELECT() )
inkey(0)
Se for defeito do include std.ch não sei. Mas é diferente do seu teste.

Saudações,
Itamar M. Lins Jr.