Página 1 de 2

#translate USE ... => MyUse(...)

Enviado: 09 Fev 2017 16:03
por fladimir
Pessoal, quebrei um pouco a cabeça mas não estou acertando a sintaxe pra fazer um Translate pro comando USE

Tipo quero pegar tudo o q passa pelo USE e antes manipular isso em uma variavel, exemplo (não sei se o q quero é possível)

Código: Selecionar todos

#translate  USE [<cDatabase> ;
     [INDEX <cIndexFiles,...>] ;
     [ALIAS <cAlias>] ;
            [EXCLUSIVE | SHARED] ;
            [NEW] ;
            [READONLY] ;
       [VIA <cRDD>] ;
  [CODEPAGE <cCodePage>] ;
[CONNECTION <nConnection>]] =>   MyUse( aqui não exatamente como coloco pra pegar cada item do comando USE)

function MyUse( ........ aki não sei)

Quero alimentar nesse ponto uma variavel publica ou statica // não defini ainda qual a melhor opcao, acho q STATIC talvez.
Tipo aTabelas

aadd( aTabelas, { aki quero colocar cada parametro do comando USE tipo cDatabase, cIndex... etc } )

E nessa parte o Use normal ou DBUSEAREA()
return nil
Alguém saberia?

#translate USE ... => MyUse(...)

Enviado: 09 Fev 2017 16:42
por Kapiaba

#translate USE ... => MyUse(...)

Enviado: 09 Fev 2017 17:20
por fladimir
Obrigado João... então eu vi as orientações, tb tenho um manual aki mas não da certo, fiz algumas combinações, mas mais tarde tento novamente, deve ser alguma "VIRGULA" q estou esquecendo.

[] 's

#translate USE ... => MyUse(...)

Enviado: 09 Fev 2017 18:59
por JoséQuintas
Um chute: se está definindo vários parâmetros, vai ter que usá-los na conversão, não pode deixar nenhum de fora.

#translate USE ... => MyUse(...)

Enviado: 09 Fev 2017 22:04
por fladimir
Deve ser isto...

Se fosse pra saber USE -> DBUseArea como q faz akela jogada q tipo quando gera o PPO mostra q o comando use na verdade muda pra DBUseArea... lembra? To falando bobagem?

Pq se eu olhar como o Use vira o DbUseArea talvez resolva..

O q pega é akela parte EXCLUSIVE | SHARED.... como migro isso pra MyUse(......, ?????)

#translate USE ... => MyUse(...)

Enviado: 09 Fev 2017 23:14
por Vlademiro
O EXCLUSIVE/SHARED são marcadores especiais. Por exemplo :

Código: Selecionar todos

#command SET MESSAGE TO <n> [<cent: CENTER, CENTRE>] => ;
Set( _SET_MESSAGE, <n> ) ; Set( _SET_MCENTER, <.cent.>

Note que a variável lógica “cent” é verdadeira caso o programador digite CENTER ou CENTRE. Portanto, podemos criar uma cláusula opcional que pode ser escrita de diferentes
formas.

O comando USE poderia ser definido assim:

Código: Selecionar todos

#comand USE <(dbf)> [<nw: NEW>] =>;
<dbUseArea( <.nw.>, NIL , <(dbf)> )
O marcador de correspondência funciona assim: se o programador digitou “NEW”,
então a variável “nw” irá receber o valor lógico verdadeiro, caso contrário (se o programador
omitiu a cláusula), essa variável (“nw”) irá receber o valor falso. Note, no nosso exemplo acima,
que a variável nw foi atrelada a cláusula NEW através da correspondência [<nw: NEW>] e que
ela foi usada no lado direito dessa forma <.nw.>.

Estou atualizando o ebook e lá tem um capítulo destrinchando o pré-processador. Para baixar clicar no link a seguir. Esse assunto está nas páginas 612 à 614. https://pctoledo.org/forum/downlo ... hp?id=4442

Agora, como vc está criando algo novo, eu acho melhor vc não recriar o comando USE, mas deveria criar o comando MYUSE. Porque vc corre o risco de sobrepor o comando USE original nos seus programas. Só depois de tudo testado vc poderia ver se vale a pena sobrepor o comando ou não.

#translate USE ... => MyUse(...)

Enviado: 10 Fev 2017 00:43
por fladimir
Entendi...

Agora antes de eu continuar pq então... dentro do raciocionio a rotina abaixo não funciona... tipo RODA normal sem parar no Debug...

Código: Selecionar todos

#command DBSEEK( <xpar> ) => MyDbSeek( <xpar> )

func teste()
   If Produto->( DBSEEK(cCodigo) )
     alert('achou')
   else
	   alert('nao achou')
   endif
return

func MyDbSeek(xPar)
   altd()
   cAlias := alias()
return dbseek(xPar)

Agora se eu rodar como uma funcao normal sem fazer o Translate funciona

Código: Selecionar todos

func teste()
   If Produto->( MyDBSEEK(cCodigo) ) //--------> Percebam q não estou usando Translate mas chamando minha funcao q ai o ALTD() é chamado...
    	   alert('achou')
   else
	   alert('nao achou')
   endif
return

func MyDbSeek(xPar)
   altd()
   cAlias := alias()
return dbseek(xPar)
OU seja, parece q o Translate não funcionou...

Ambos testes compilam sem erros.

#translate USE ... => MyUse(...)

Enviado: 10 Fev 2017 07:58
por rubens
Bom dia Fladimir...

Veja que você não usou o Translate e sim o #command.. Eu tentei criar um commando wAlert para usar com a função Alert... Quando cria um novo #command se não mandar os parametros exatamente do jeito que o original não funciona daí passei o usar a #translate funcionou que é uma beleza... acho que ele nem se preocupa com o Case Sensitive também, e tem que verificar também que o #command e o #translate só vão funcionar no prg que foi declarado... por isso aquela questão do include .ch em todos os prgs..

Meu translate ficou assim dentro de um .ch

Código: Selecionar todos

#Translate Alert => wAlert
#Translate Hb_Alert => wAlert
e minha função wAlert

Código: Selecionar todos

Function wAlert( cMessage, aOptions )
Local lValue := .t.
hb_Default( @aOptions, {'Sim'})
cMessage :=  StrTran( cMessage, ';', hb_eol() )
If Len( aOptions ) = 1
	wapi_MessageBox( wapi_GetActiveWindow(), cMessage,'Alerta', WIN_MB_ICONEXCLAMATION )
Else
	lValue := wapi_MessageBox( wapi_GetActiveWindow(), cMessage, "Confirmacao",  WIN_MB_YESNO + WIN_MB_ICONQUESTION + WIN_MB_DEFBUTTON1 ) == IDYES	
EndIF
Return IF(lValue,1,2)
Com o Translate não precisa ter o mesmo escopo da função original.

Olha uns exemplos

Código: Selecionar todos

#command @ <row>, <col> PROMPT <prompt>								 ;
				    [MESSAGE <msg>]								 ;
				    [NIVEL <niv> ]								 ;
				    [WHEN <cond> ]								 ;
				    [FUNC <func> ]								 ;
				    [<botao:BOTAO> ]							 ;
				    [TAM <tam> ]								 ;
				    [<chr:CHR> ]								 ;
	 => _MenuTo(, <row>, <col>,  <prompt>							,;
						    <msg>								,;
						  [ <niv>  ]							,;
						  [ <.botao.> ]						,;
						  [ <tam> ]						    ,,;
						  [ <.chr.> ]							,;
						  [ <cond> ]						    ,,;
						  [ <func> ]  )						;;
	    SETPOS(<row>,<col>+LEN(<prompt>)-1)


// Nao esquecer de definir a variavel <v>.
#command MENU TO <Pos> [<botao:BOTAO>] [TAM <tam>] [<ajusta:AJUSTA>] [<chr:CHR>] [LINHAS <linhas>] [<cor:COLOR>] [<ver:VERTICAL>] [<hor:HORIZONTAL>];
	 => <Pos> := _MenuTo( {|_1| if(PCount() == 0, <Pos>, <Pos> := _1)} ,,,,,,[<.botao.>],[<tam>],[<.ajusta.>],[<.chr.>],,[<linhas>],,[<.cor.>],[<.ver.>] [!<.hor.>] )

#translate BOTAO()			  ;
	 =>	 _MenuTo(,,,,,,.T.,,,)

#translate BOTAO( <Pos> )		    ;
	 =>	 _MenuTo( {|_1| if(PCount() == 0, <Pos>, <Pos> := _1)} ,,,,,,.T.,,,)

#translate BOTAO( <Lin>, <Col>, <Texto> )			;
	  => SETPOS( <Lin>, <Col> )				    ;;
		  _Say( <Texto>,,,.T.,,10)

#translate BOTAO( <Lin>, <Col>, <Texto> ,[<a>] [,<Tam>] )			 ;
	 =>	 _MenuTo(,<Lin> ,<Col> ,<Texto> ,,,,[<Tam>],, )


#translate ACHOICE( <Lin>, <Col>, <Lin_F>, <Col_F>, <Matriz> )			;
	 =>	ACHOICE( <Lin>, <Col>, <Lin_F>, <Col_F>, <Matriz>,,, )

#translate ACHOICE( <Lin>,<Col>,<Lin_F>,<Col_F>,<Matriz>,[<Cond>] )	 ;
	 =>	ACHOICE( <Lin>,<Col>,<Lin_F>,<Col_F>,<Matriz>,[<Cond>],, )

#translate ACHOICE( <Lin>,<Col>,<Lin_F>,<Col_F>,<Matriz>,[<Cond>], [<UDF>] )  ;
	 =>	ACHOICE( <Lin>,<Col>,<Lin_F>,<Col_F>,<Matriz>,[<Cond>], [<UDF>], )


#translate ACHOICE( <Lin>						,;
				<Col>									,;
				<Lin_F>									,;
				<Col_F>									,;
				<Matriz>									,;
				[<Cond>]									,;
				[<UDF> ]									,;
				[<Pos> ]									);
	 =>	 _MenuTo([{|_1| if(PCount() == 0, <Pos>, <Pos> := _1)}]	,;
				<Lin>									,;
				<Col>									,;
				<Matriz>									,;
				"ACHOICE"									,;
														,;
														,;
				<Col_F>-<Col>-1							,;
														,;
														,;
			    [<Cond>]									,;
			    <Lin_F>+1-<Lin>								,;
			    [<UDF>]									 )


#translate  ROUND( <nValor>,<nDecimals> ) ;
	   => _ROUND( <nValor>,<nDecimals> )

/***
*  @..GET
*/

#xtranslate   .GET_POS	 =>	  \[LEN(GetList),1]

#command @ <row> , <col>  GET <var> ;
		  [<clauses,...>]		 ;
		  PASSWORD			 ;
		  [<moreClauses,...>]	 ;
							 ;
	 => @ <row> , <col>  GET <var> ;
		  [<clauses>]			 ;
		  SEND reader := {|oGet|  ;
			  GetPassword(oGet) };
			  [<moreClauses>]

#command @ <row>, <col> GET <var>								  ;
				    [PICTURE <pic>]							  ;
				    [VALID <valid>]							  ;
				    [WHEN <when>]							  ;
				    [MSG <msg>]							  ;
				    [SEND <send>]							  ;
														  ;
	 => SetPos( <row>, <col> )								  ;
	  ; AAdd(												  ;
		 GetList,{										  ;
		 _GET_( <var>, <"var">, <pic>, <{valid}>, <{when}> ):display();
		   ,[<msg>]} )										  ;
		[; GetList.GET_POS:<send>]
Rubens

#translate USE ... => MyUse(...)

Enviado: 10 Fev 2017 09:46
por fladimir
Pessoal... desculpem... meu erro foi completa desatenção....
Depois de ler as dicas dos colegas e do Rubens em particular, eu revisei o codigo e pensei... ta tudo aparentemente certo, pq não funciona... ai pensei... vou pegar esta declaração #translate e colocar no CH foi ai q PRESTEI atenção ao fato de q a declaração estava abaixo da rotina/função q estou usando pra testar...kkkk foi mal...

Estava assim...

Código: Selecionar todos

function teste...
...
return

#translate ....   //--------------> como estava abaixo da function Teste não era visto/executado.

function MyDbSeek()
return ....
Como a funcao teste vai exectuar o translate se o translate esta depois... kkkkk mudei pro inicio e deu certo

Agora vou continuar pra fazer o #translate do Use => MyUse

Vlw pessoal.

#translate USE ... => MyUse(...)

Enviado: 10 Fev 2017 10:23
por fladimir
Uma observação

se fizer:

Código: Selecionar todos

#translate DbSeek(<xpar>) => MyDbSeek(<xpar>)

function MyDbSeek(xPar)
...
return DbSeek(xPar)
Vai entrar num LOOP

Então teria q ser

algo tipo

Código: Selecionar todos

function MyDbSeek(xPar)
     SEEK xPar
return Found()

#translate USE ... => MyUse(...)

Enviado: 02 Mar 2017 01:49
por fladimir
Pessoal, consegui fazer sem dar erro mas não funciona...

Estou fazendo esta tentativa de mudar a chamada do comando USE para uma função MyUse() devido o LETODB para não ter q mudar em todo o sistema tendo q acrescentar em cada Use Tabela Use cPath + Tabela...

Código: Selecionar todos

	#command USE [<cDatabase>] ;
				     INDEX <cIndexFiles> ;
				     ALIAS <cAlias> ;
				            EXCLUSIVE | SHARED ;
				            NEW ;
				            READONLY ;
				       VIA <cRDD> ;
				  CODEPAGE <cCodePage> ;
				CONNECTION <nConnection> => ;
				MyUse( <cDatabase>, <cIndexFiles>, <cAlias>, EXCLUSIVE, NEW, READONLY, <cRDD>, <cCodePage>, <nConnection>)

*************************************************************************************************************************************
function MyUse( <cDatabase>, <cIndexFiles>, <cAlias>, EXCLUSIVE, NEW, READONLY, <cRDD>, <cCodePage>, <nConnection>)
     
  Alert('To aki')  //--> Não cai aki.
   IF Empty( cPath )
	   RDDSETDEFAULT( "DBFCDX" )
	ELSE
	   cPath := "//" + cPath + IiF( ":" $ cPath, "", ":" + ALLTRIM( STR( nPort ) ) )
	   cPath += Iif( Right(cPath,1) == "/", "", "/" )
	   RDDSETDEFAULT( "LETO" )
	ENDIF...
      
  DbUseArea(...) // aki vou colocar as variaveis relativas
return
Se deixo assim compila sem erros mas não passa pelo MyUse

#translate USE ... => MyUse(...)

Enviado: 02 Mar 2017 08:07
por Jairo Maia
Olá Fladimir,

Tente alterar as linhas 9 e 10 para esta forma (passar o => para a frente de MyUse ):

Código: Selecionar todos

CONNECTION <nConnection> ;
            => MyUse( <cDatabase>, <cIndexFiles>, <cAlias>, EXCLUSIVE, NEW, READONLY, <cRDD>, <cCodePage>, <nConnection>)
Na função MyUse(), também eu mudaria a linha:

Código: Selecionar todos

function MyUse( <cDatabase>, <cIndexFiles>, <cAlias>, EXCLUSIVE, NEW, READONLY, <cRDD>, <cCodePage>, <nConnection>)
Para:

Código: Selecionar todos

function MyUse( cDatabase, cIndexFiles, cAlias, EXCLUSIVE, NEW, READONLY, cRDD, cCodePage, nConnection)

#translate USE ... => MyUse(...)

Enviado: 02 Mar 2017 08:16
por fladimir
Obrigado Jairo...

Fiz as mudanças sugeridas, compilou, mas ao executar não passa pelo MyUse()

Não sei o q pode ser.

#translate USE ... => MyUse(...)

Enviado: 02 Mar 2017 19:32
por fladimir
Alguém poderia testar ?

Como não deu erro não teria q passar pela função MyUse ()?

#translate USE ... => MyUse(...)

Enviado: 02 Mar 2017 20:01
por Toledo
Não testei, mas tenta o seguinte:

Código: Selecionar todos

#command USE <(cDatabase)> ;
            [INDEX <(index1)> [, <(indexN)>]] ;
            [ALIAS <cAlias>] ;
            [<ex: EXCLUSIVE>] [<sh: SHARED>] ;
            [<nw: NEW>] ;
            [<ro: READONLY>] ;
            [VIA <cRDD>] ;
            [CODEPAGE <cCodePage>] ;
            [CONNECTION <nConnection>] => ;
         MyUse( <(cDatabase)>, <(cAlias)>, iif( <.sh.> .OR. <.ex.>, ! <.ex.>, NIL ), <.nw.>, <.ro.>, <cRDD>, <cCodePage>, <nConnection>) ;
         [; dbSetIndex( <(index1)> )] ;
         [; dbSetIndex( <(indexN)> )]

*************************************************************************************************************************************
function MyUse( cDatabase, cAlias, lEXCLUSIVE, lNEW, lREADONLY, cRDD, cCodePage, nConnection)
  
 Alert('To aki') //--> Não cai aki.
 IF Empty( cPath )
  RDDSETDEFAULT( "DBFCDX" )
 ELSE
  cPath := "//" + cPath + IiF( ":" $ cPath, "", ":" + ALLTRIM( STR( nPort ) ) )
  cPath += Iif( Right(cPath,1) == "/", "", "/" )
  RDDSETDEFAULT( "LETO" )
 ENDIF...
   
DbUseArea( lNEW, ;
           cRDD, ;
           cDatabase, ;
           cAlias, ;
           lEXCLUSIVE, ;
           lREADONLY, ;
           cCodePage, ;
           nConnection )

return
Abraços