Página 2 de 2

Enviado: 14 Fev 2005 11:58
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.

Operador macro &

Enviado: 14 Fev 2005 12:59
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

Enviado: 15 Fev 2005 17:29
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

Enviado: 15 Fev 2005 17:58
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.

Enviado: 16 Fev 2005 14:27
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

Enviado: 16 Fev 2005 15:21
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...

;*************

Enviado: 16 Fev 2005 15:32
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.

Enviado: 23 Jan 2006 21:03
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 :?)

Enviado: 24 Jan 2006 10:17
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...