Página 1 de 2

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 27 Ago 2020 19:27
por Linguagemclipper
Estou usando o xHARBOUR v1.2.1
Aparece no help uma função chamada ORDFOR() que preciso usar no momento, mas o xharbour não está exergando. Já ví que tem no Harbour e no Clipper 5.3 também essa função.
No help diz assim:
Category: Database functions , Index functions
Source: rdd\dbcmd.c
LIB: xhb.lib
DLL: xhbdll.dll
Na pasta lib não existe essa lib xhb.lib, é mole? Todavia, existe o fonte em source/rdd/dbcmd.c
Já tentei linkar a lib rdds.lib, mas não deu certo.
O quê que teu tenho que fazer? Meu sistema dá incompatibilidade com o Harbour, tenho que arrumar a solução no xHarbour mesmo.
Meu programa tem vários indexações dependendo do menu selecionado, exemplo:

Código: Selecionar todos

INDEX ON CNPJ+ANO TAG TEMP TO (fINDEX1) ;
         FOR ANO=xANO ;
         ADDITIVE TEMPORARY
Daí, eu no debug faço o seguinte:

? INDEXKEY()
"CNPJ+ANO"

? ORDFOR()
ORDFOR: Função indefinida
-Enquando que era pra dar "ANO=xANO", correto?

Eu chamo uma rotina que muda o filtro do TBROWSE e depois quero ser capaz de limpar o filtro e voltar o que era antes, mas para isso eu preciso capturar os retornos de INDEXKEY() e ORDFOR() para poder recriar o índice visto que é temporário (autodestrói)

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 27 Ago 2020 22:10
por JoséQuintas
Esse INDEX FOR é recurso do SIXCDX e ADS.
O ADS foi muito usado no Harbour/XHarbour enquanto o restante não estava pronto.
Ele tem modo de compatibilidade CDX.

Também tem o ADS através de comando SQL.... vai ser muuito mais rápido, porque o acesso é diferente do acesso normal a DBF.
Se é pra quebrar a cabeça... que seja pra melhor.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 27 Ago 2020 22:24
por Itamar M. Lins Jr.
Ola!
Na pasta lib não existe essa lib xhb.lib, é mole?
Salvo engano, xHB.lib é uma biblioteca de compatibilidade do Harbour com algumas funções do xHarbour. Basicamente somente os nomes que mudam. Dai não precisamos alterar os fontes quando migramos do xHarbour para o Harbour.

Código: Selecionar todos

tamar@itamar-desktop:~/hwgui-code$ hbmk2 -find ordfor
Núcleo Harbour (instalado):
   ordFor()
Vou ver lá no \contrib\xhb

Código: Selecionar todos

itamar@itamar-desktop:~/hb32-fontes/contrib/xhb$ grep "ordfor" -i *.prg
ttable.prg:   METHOD ordFor() INLINE ( ::alias )->( ordFor( ::Tag, ::cOrderBag ) )
Tenta ligar ela via EXTERNAL

Saudações,
Itamar M. Lins Jr.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 27 Ago 2020 22:45
por Itamar M. Lins Jr.
Ola!
Esse INDEX FOR é recurso do SIXCDX e ADS.
?
Index com clausula for ? Isso já vem do clipper.
Syntax do clipper

INDEX ON <expKey> [TAG <cOrderName>] [TO <cOrderBagName>]
[FOR <lCondition>] [ALL]
[WHILE <lCondition>] [NEXT <nNumber>]
[RECORD <nRecord>] [REST]
[EVAL <bBlock>] [EVERY <nInterval>]
[UNIQUE] [ASCENDING|DESCENDING]
[USECURRENT] [ADDITIVE]
[CUSTOM] [NOOPTIMIZE]

Código: Selecionar todos

itamar@itamar-desktop:~/hb32-fontes$ hbmk2 -find ordbag
Núcleo Harbour (instalado):
   ordBagClear()
   ordBagExt()
   ordBagName()

itamar@itamar-desktop:~/hb32-fontes$ hbmk2 -find ordkey
Núcleo Harbour (instalado):
   ordKey()
   ordKeyAdd()
   ordKeyCount()
   ordKeyDel()
   ordKeyGoto()
   ordKeyNo()
   ordKeyRelPos()
   ordKeyVal()

Código: Selecionar todos

USE tests NEW VIA "DBFCDX"
      INDEX ON tests->fName ;
         TO tests           ;
         FOR tests->fName > "CK"
      INDEX ON tests->Id TO TestId

      ORDKEY( "tests" )      // Returns: tests->fName
      SET ORDER TO 2
      ORDKEY()               // Returns: tests->Id
Saudações,
Itamar M. Lins Jr.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 00:35
por JoséQuintas
Mas ele precisa disso no Xharbour.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 11:11
por Itamar M. Lins Jr.
Ola!
O xHarbour foi copiado do Harbour.
Na época já tinha essas funções.

Código: Selecionar todos

19991205-14:22 GMT+1 Bruno Cantero <bruno@issnet.net>
  * include/rddapi.h
    source/rdd/dbcmd.c
    source/rdd/dbf1.c
    source/rdd/dbfcdx/dbfcdx1.c
    + Added dbSeek(), IndexOrd(), ordSetFocus(), ordFor(), ordKey(),
      ordNumber(), ordName() and ordBagName() functions.
  * source/rtl/dummy.prg
    - Removed dbSeek(), IndexOrd(), ordSetFocus(), ordFor(), ordKey(),
      ordNumber(), ordName() and ordBagName() functions.
Forçando a linkagem via EXTERNAL deve resolver.

Saudações,
Itamar M. Lins Jr.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 11:19
por sygecom
Celso Portiolli, :)
Já tentou verificar se falta algum .CH para o comando dar certo ? tipo

#include "std.ch"

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 12:12
por Linguagemclipper
A função que eu quero rodar é a ORDFOR(), só ela que não funciona aqui.
XHB.lib poderia ser útil se eu estivesse rodando Harbour, mas estou no xHarbour. O engraçado é que no help do xharbour diz que está na lib xhb.lib que acabei não entendendo nada porque achava que essa lib era do harbour, todavia não existe essa lib na lista do hbmake para eu selecionar.
Não sei como é que compila EXTERNAL que alguns disseram, me expliquem como é, por favor.
Enfim, descobrí outra forma de resolver meu problema porque o índice com ADDITIVE TEMPORARY só é destruído quando fechamos o banco de dados e não quando mudamos o índice, daí deu pra gravar com INDEXORD() e restaurar com ORDSETFOCUS().

Código: Selecionar todos

nORD := INDEXORD()  // SALVA O ÍNDICE ATUAL
*** [...] MUDA O FILTRO (INDEX) ETC
ORDSETFOCUS(nORD) // RESTAURA O ÍNDICE ANTERIOR
Só queria saber como linka o External porque vai acabar sendo útil para alguma tool que eu fizer esse ORDFOR() um dia.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 12:28
por sygecom
Aqui uso xHarbour 1.2.3
Fiz uma chamada do ORDFOR() e compilou, e uso as LIB comuns, mas por outro lado uso xbuild.exe em vez do hbmake, talvez o hbmake que está se atrapalhando na hora de adicionar as lib que precisa para compilar.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 15:20
por JoséQuintas
Então.... minha sugestão antiga é: usar HBMK2.EXE no XHarbour
Talvez ele gerencie melhor as LIBs do core XHarbour.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 16:32
por frazato
Tarde!
Utilizo o xharbour 0.99.70 simples!
com Hbmake v1.17
e compilou normalmente sem erro, só fiquei curioso onde utilizar isso, kkkk!

Código: Selecionar todos


Function Main()

   REQUEST DBFCDX
   RDDSETDEFAULT("dbfcdx")
   DBSETDRIVER("dbfcdx")


   set confirm    On
   set deleted    on
   set bell       off
   set scoreboard off
   set date       british
   set epoch      to 1950
   Set date format to "DD/MM/YYYY"
   Set exclusive off

   Clear

   sele 1
        use produto
        set index to produto 
	INDEX ON DESCRICAO TO C:\TEMP\LIXO for 'NESTLE'$DESCRICAO

	@ 01,00 say ORDFOR(1)
	go top
    	Dbedit(02,00,12,79)

	INDEX ON DESCRICAO TO C:\TEMP\LIXO for ESTOQUE > 0
	@ 13,00 say ORDFOR(1)
	go top
    	Dbedit(14,00,24,79)

close all
return nil



ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 16:45
por Vlademiro
Já resolveu?

No Harbour tem o comando request, para inserir uma função que não foi linkada.

Usa assim antes da Main :

Request ordfor

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 28 Ago 2020 20:06
por Itamar M. Lins Jr.
Ola!
A respeito do COMANDO EXTERNAL.
Abra lá no seu /utils/xbscript/xbscript.prg
Dá uma olhada lá dentro.

Código: Selecionar todos

   EXTERNAL RDDSYS,AFIELDS,DBEVAL,DBCLEARFILTER,DBCLOSEALL, ;
            DBCOMMIT,__DBCONTINUE,DBCREATE,DBDELETE,DBFILTER,DBGOBOTTOM,DBGOTO, ;
            DBGOTOP,__DBLOCATE,__DBSETLOCATE,__DBPACK,DBRECALL,DBRLOCK,DBRLOCKLIST,DBRUNLOCK,DBSEEK, ;
            DBSELECTAREA,__DBSETFOUND,DBSKIP,DBSETFILTER,DBSTRUCT,DBTABLEEXT,DBUNLOCK,DBUNLOCKALL,DBUSEAREA, ;
            __DBZAP,DELETED,EOF,FCOUNT,FIELDGET,FIELDNAME,FIELDPOS,FIELDPUT,FLOCK,FOUND,HEADER,INDEXORD, ;
            LASTREC,LOCK,LUPDATE,NETERR,ORDBAGEXT,ORDBAGNAME,ORDCONDSET,ORDCREATE,ORDDESTROY,ORDFOR,ORDKEY, ;
            ORDLISTADD,ORDLISTCLEAR,ORDLISTREBUILD,ORDNAME,ORDNUMBER,ORDSETFOCUS,RDDLIST,RDDNAME,RDDREGISTER, ;
            RECCOUNT,RECNO,RECSIZE,RLOCK,SELECT,USED,RDDSETDEFAULT,RDDSETDEFAULT,DBSETDRIVER
Olha lá ela sendo EVOCADA para ser linkada junto.
Em todo caso basta vc digitar ai xbscript e na linha de comando usar

Código: Selecionar todos

? ordfor()
que vai acusar área não aberta. WORKAREA NOT USE

Saudações,
Itamar M. Lins Jr.

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 29 Ago 2020 00:29
por Linguagemclipper
Na minha pasta não tem /utils/xbscript
Vou tentar o "Request ordfor", hbmk2 ou hbmake mais antigo depois, valeu! A versão 1.2.3 do xHarbour deu um bocado de incompatibilidade com minha biblioteca que compila normal na 1.2.1.
Agradeço a todos!

ORDFOR: Função indefinida (xHARBOUR v1.2.1)

Enviado: 02 Set 2020 19:19
por Linguagemclipper
Vlademiro,

Deu certo!!! No xHarbour também funciona desse jeito, apenas coloquei antes do function main como você orientou:

Código: Selecionar todos

Request ordfor
Function Main()
Para quem ficou curioso eu desenvolví uma função TBROWSE ninja que faz tudo pra mim, estou aprimorando o filtro. A função filtra qualquer campo e esses campos já podem estar filtrados antes da função ser chamada. Eu não uso o FILTER eu uso INDEX para fazer minhas filtragens porque fica muito mais rápido e dá melhor experiência para o usuário.

Código: Selecionar todos

// ----------- APLICA FILTRO -------------------
cFILTRO += " .AND. "+ORDFOR()
INDEX ON &(cCAMPO) TAG TEMP TO (fINDEX) ;
		FOR (&(cFILTRO));
		ADDITIVE TEMPORARY						
DBGOTOP()
nTOTAL := OrdKeyCount() 	  
// ---------------------------------------------
Funcionou tudo certinho agora como esperado, graças à Deus!!! Pense numa alegria agora!!! hehehe
Muito obrigado, pessoal!