operador macro "&"

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Discussão mais boba gente.

A macro gera mais PCODE mas hoje não dá para sentir atraso no processamento, independente de como a abertura seja feita, se ela funcionar, está correto.

Existem técnicas, e cada um tem a sua, é inquestionável.

Agora explicar por que eu uso isso ou por que eu uso aquilo ai é demais né.

A se funcinou. Bola para frente.

Um código limpo, mostra um programador esperientes, macros, eu não uso em meu sistemas, em casos muitos raros. Mas para filtros ou algo do tipo, mas se ela é existe, é para ser usada, independente da forma.
Sem mais
Wagner Nunes
www.vagucs.com.br
gransoft
Usuário Nível 3
Usuário Nível 3
Mensagens: 321
Registrado em: 06 Jul 2004 17:48
Localização: UBERLÂNDIA-MG
Contato:

Operador macro &

Mensagem por gransoft »

kiko escreveu: CAMI := "C:\PROGRAMA\ATACADO\LOJA\DADOS\KARAPALIDA\LOJA1"
ARAGUARI-MG, 14 de fevereiro de 2005.

Prezado kiko,

Verifique:

CAMI := "C:\PROGRAMA\ATACADO\LOJA\DADOS\KARAPA~1\LOJA1"

Atenciosamente,
Janis Peters Grants.

Skype: gransoft
http://www.gransoft.com.br
gransoft@zipmail.com.br
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Mensagem por Hasse »

Olá amigos...

Também já apanhei muito com esta macro.

Acontece que o USE não aceita macro na linha com o operador + , ou seja:

cCam := "F:"
USE &cCam + "\CLIENTE\DADOS.DBF" && dá erro.

Use assim:

cCam := "F:"
cArq:= "\CLIENTE\DADOS"
cStr := cCam + cArq && aqui está o pulo do gato.
USE &cStr

Abraços.
Hasse
Avatar do usuário
Antonio
Usuário Nível 3
Usuário Nível 3
Mensagens: 347
Registrado em: 14 Ago 2003 17:33
Localização: Sao Paulo - SP
Contato:

Mensagem por Antonio »

Eu uso assim....

Num arquivo de cabeçalho:

#DEFINE cDirBas Left( Hb_argv(0) , Rat("\",Hb_argv(0)) ) + "basicos\"

No PRG:
Use ( cDirBas + "empresa" ) Alias "emp" Shared New

Belezinha, sem problemas.
Antonio Carlos
Harbour 3.2 (20180213)
Hwgui 2.20 3b | PostGresql 9.5 | ADO/ODBC
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Mensagem por rubens »

VOCE ESTA COMETENDO UM ERRO DE SINTAXE.. TENTE ASSIM...

CAMI := CAMI + "FINCLI.DBF"
USE &CAMI

OU ENTAO
CAMI := CAMI + "FINCLI.DBF"
USE (CAMI)

DO JEITO QUE VOCE ESTA USANDO O COMANDO VAI GERAR UMA EXECUCAO ASSIM:

USE C:\PROGRAMA\ATACADO\LOJA\DADOS\KARAPALIDA\LOJA1\+"FINCLI.DBF"

OK..

RUBENS
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
kiko
Usuário Nível 3
Usuário Nível 3
Mensagens: 145
Registrado em: 08 Jul 2004 15:24
Localização: Cianorte

Mensagem por kiko »

hail forum

problema resolvido!!!
o.O

tava acontecendo o q o hasse falou...
USE &cCam + "\CLIENTE\DADOS.DBF" && dava erro msmw

naum foi preciso colocar #define e nem verificar o tamanho das pastas..e nem erra erro de sintaxe tb...

eh isso aew...obrigado pelas respostas...

;*************
Avatar do usuário
Antonio
Usuário Nível 3
Usuário Nível 3
Mensagens: 347
Registrado em: 14 Ago 2003 17:33
Localização: Sao Paulo - SP
Contato:

Mensagem por Antonio »

O uso do #DEFINE é uma questão de estética/tecnica e não culmina em obrigatoriedade, servindo somente como sugestão ou exemplo.
Antonio Carlos
Harbour 3.2 (20180213)
Hwgui 2.20 3b | PostGresql 9.5 | ADO/ODBC
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho Kiko,

O Clipper trabalha entendendo que nomes de diretórios e arquivo devem possuir no maximo 8 letras e 3 de extensão e 250 ou 255 de tamanho da linha somando os sub dos subdiretórios componentes.

Como se trata de diretórios o maximo que se pode alcançar no nome são oito caractesres e se o exemplo que voce deu realmente exista um diretório com KARAPALIDA, este não será enxergado pelo Clipper.

Faça uso de uma biblioteca que trata estes tipos de nomes como a LFN.LIB, Long File Name.LIB.

Basta pegar aqui

Lembre-se o Clipper surgiu para ser usado sob o DOS padrão( abaixo da versão 7, que vem no Win95 em diante) portanto ele não é obrigado a aceitar esta compatibilidade.

@braços :?)
Avatar do usuário
kiko
Usuário Nível 3
Usuário Nível 3
Mensagens: 145
Registrado em: 08 Jul 2004 15:24
Localização: Cianorte

Mensagem por kiko »

descobri uma outra causa pra esse problema, e assim, a soluçao tb...
eu trabalho com RDD SixNsx versao 2 com Tags.

vejam como eu faço a abertura dos arquivos de dados:

Código: Selecionar todos

CRIA_REL(INI+"REL")
aIndex:={"PE_TOSA",;
         "PE_TOTA",;
         "STRZERO(PE_CODI,7)+PE_GRAD+STRZERO(PE_CORA,2)",;
         "PE_RDAT",;
         "PE_RHIS",;
         "PE_DIAS",;
         "PE_CODI",;
         "PE_NOPR",;
         "PE_GRUP",;
         "PE_SUBG",;
         "PE_COLE",;
         "PE_GRAD+STRZERO(PE_CORA,2)",;
         "STRZERO(PE_GRUP,4)+STRZERO(PE_TOTA,10,2)",;
         "STRZERO(PE_TOTA,10,2)+STRZERO(PE_GRUP,4)"}
         "PE_FORN",;
         "PE_RCUS+STRZERO(PE_TOTA,10,2)",;
         "PE_RORI"}
IF ! Abre(INI+"REL",aIndex,"Relatorio")
   RETURN(FALSE)
ENDIF
no codigo acima existem duas chamadas de funcao, uma eh o CRIA_REL() com a estrutura do arquivo de dados, que nao é necessaria no momento, e a segunda é a funçao ABRE(), cujo codigo segue abaixo:

Código: Selecionar todos

******************************
func Abre(cCom,aIndex,cAlias)
******************************
LOCAL cAux:="",temp,f,nEvery
FOR  f=1 TO LEN(aIndex)
     cAux +=".OR. ! FILE('"+cCom+NTX+"')"
NEXT f
IF EMPTY(cAux)
   cAux=".F."
ELSE
   cAux=SUBSTR(cAux ,5)
ENDIF
IF USED()
   NEW_SELECT()
ENDIF
IF &cAux .OR. indexa .or. legal2=.T.
   IF ! USEREDE(cCom+DBF)
      mensagem("Arquivo n„o Acess¡vel !!!")
      RETURN(.f.)
   ENDIF
   cAux=STRTRAN(cAux,".OR.",".AND.")
   IF &cAux .or. indexa .or. legal2=.T.
      PACK
   ENDIF
   IF ! FILE(cCom+NTX) .OR. indexa .or. LEGAL2=.T.
      FOR  f=1 TO LEN(aIndex)
           aInd=ListAsArray(aIndex[f],";")
           IF ! ISFISCAL()
              INDEX ON &(aInd[1]) tag (ccom+strzero(F,2)) TO (cCom) eval indexbar() every ROUND(LASTREC()/10,0)
           ELSE
              INDEX ON &(aInd[1]) tag (ccom+strzero(F,2)) TO (cCom)
           ENDIF
      NEXT f
   ENDIF
ENDIF
IF ! USEREDE(cCom+DBF,cAlias,.F.)
   Mensagem(cAlias+" -> Aten‡„o: Arquivo n„o dispon¡vel !!!")
   RETURN(.F.)
ENDIF
Set Index TO (cCom+NTX)
ordlistclear()
RETURN(.T.)
ai, o que acontecia para gerar o erro: no começo da funcao ABRE, eu gero um string com os indices do banco de dados para serem abertos, e na hora de jogar essa string no &macro era quando gerava o erro.
como o rochinha falou agora a pouco, o nome do arquivo tem que ser no formato 8.3, e a linha de ateh 250 caracteres...
no exemplo que eu citei acima, o tamanho da string pra ser colocada no operador &macro passava dos 250 caracteres, e gerava o erro que me levou a abrir esse topico: &OPERATIO TOO COMPLEX.
o que eu fiz para sanar esse problema foi dividir a funçao CRIA_REL() em partes menores, para nao estourar o tamanho dos 250 caracteres. agora esta tudo tranquilo. segue abaixo o novo formato da funçao:

Código: Selecionar todos

CRIA_REL(INI+"REL")
aIndex:={"PE_TOSA",;
         "PE_TOTA",;
         "STRZERO(PE_CODI,7)+PE_GRAD+STRZERO(PE_CORA,2)",;
         "PE_RDAT",;
         "PE_RHIS",;
         "PE_DIAS",;
         "PE_CODI",;
         "PE_NOPR",;
         "PE_GRUP",;
         "PE_SUBG",;
         "PE_COLE",;
         "PE_GRAD+STRZERO(PE_CORA,2)",;
         "STRZERO(PE_GRUP,4)+STRZERO(PE_TOTA,10,2)",;
         "STRZERO(PE_TOTA,10,2)+STRZERO(PE_GRUP,4)"}
IF ! Abre(INI+"REL",aIndex,"Relatorio")
   RETURN( FALSE )
ENDIF

CRIA_RE1(INI+"RE1")
aIndex:={"PE_FORN",;
         "PE_RCUS+STRZERO(PE_TOTA,10,2)",;
         "PE_RORI"}
IF ! Abre(INI+"RE1",aIndex,"Relatorio1")
   RETURN( FALSE )
ENDIF
assim funcionou perfeitamente, pois na primeira chamada, nao vai passar o tamanho dos 250 caracteres na linha pra colocar no &macro, e na segunda chamada, eu crio o restante dos indices...ai fica supimpa!
é isso ai, obrigado pela atençao de todos e ateh a proxima...
Responder