Página 1 de 2

Posição do ROW() dentro de Achoice

Enviado: 06 Mar 2015 23:44
por microvolution
Caro Antônio, boa noite!
Uso uma função ACHOICE para cadastrar os produtos (num total de 16 por venda), mas, como o espaço da tela (visual é apertado) esse achoice trabalha entre as linhas 12 e 16, ou seja, quando ocupa 5 produtos a tela fica rolando.
Até aí tudo bem.

O problema é que, quando pressionamos ENTER em qualquer das linhas que estivermos deveria o cursor ficar entre as linhas 12 e 16.
Para isso, usamos a função ROW() para pegar a posição correta do cursor.
No clipper isso estava tudo correto, mas, no harbour, não está não
Quando pressionamos ENTER o ROW() fornece uma posição diferente (deveria ser entre 12 e 16) mas, pude observar que ele sempre vai para a linha 18.

Vejam o trecho do meu código onde esta função funciona:

Código: Selecionar todos

      do while .t.
//           ? ROW()  // só pra teste migração clipper/harbour pois na hora de se cadastrar o produto, tá ficando 6 linhas abaixo do lugar correto 6/3/15w.
//           INKEY(0) // só pra teste migração clipper/harbour pois na hora de se cadastrar o produto, tá ficando 6 linhas abaixo do lugar correto 6/3/15w.
           CAN_TECLA_F3  := .t.
           set key TECLA_CONT_ANT to
           mIND := achoice (12,01,16,77,mLINHA,.T.,'fACH_001',mIND)
           set key TECLA_CONT_ANT to CONTEUDO_ANTERIOR
           CAN_TECLA_F3  := .f.
//           ? ROW()   // só pra teste migração clipper/harbour pois na hora de se cadastrar o produto, tá ficando 6 linhas abaixo do lugar correto 6/3/15w.
//           INKEY(0)  // só pra teste migração clipper/harbour pois na hora de se cadastrar o produto, tá ficando 6 linhas abaixo do lugar correto 6/3/15w.
           if lastkey () = 27
               SALVA_CP := savescreen (0,0,maxrow (),maxcol ())
               if .not. CONFIRMA ('Confirma Dados')
                    loop
               endif
               exit
           elseif lastkey () = 13
               //? 'estou na linha 2344'        //   Somente para testes provis¢rios. Walcledson 21/2/02w // reacrescentada novamente para migração para harbour 6/3/15w
               //? mIND                          // acrescentada novamente para migração para harbour 6/3/15w
               //? row()                         // acrescentada novamente para migração para harbour 6/3/15w
               //inkey(0)                       //   Somente para testes provis¢rios. Walcledson 21/2/02w // reacrescentada novamente para migração para harbour 6/3/15w
                mCDPRODUTO := val (substr (mLINHA [mIND],01,13))
                aCDPRODUTO := mCDPRODUTO
                mDSPRODUTO := substr (mLINHA [mIND],15,32)
                mCD_GRADE  := substr (mLINHA [mIND],48,02)
                mCD_GRADE  := iif (mCD_GRADE='  ',DCI10010->DSUNIDADE,substr (mLINHA [mIND],48,02))      // Modificado p/Walcledson em 09/05/01 p/func. mt,cm,kg.
                aCD_GRADE  := mCD_GRADE
                mQT_VENDA  := val (substr (mLINHA [mIND],51,07))      // Modificado p/Walcledson em 09/05/01 p/func. mt,cm,kg.
                aQT_VENDA  := mQT_VENDA
                mVR_UNITAR := val (substr (mLINHA [mIND],59,01) +;
                              substr (mLINHA [mIND],61,03) + '.'+;
                              substr (mLINHA [mIND],65,02))
                aVR_UNITAR := mVR_UNITAR
                mLIN := row()
                * Consulta se j  existe o produto/grade na venda
                EXISTE_PRD := EXISTE_PRDUTO () // modificado o nome de EXISTE_PROD e EXISTE_PRODUTO p/ EXISTE_PRD e EXISTE_PRDUTO, pois está gerando conflito com a função EXISTE_PROGRAMA q pertence ao arquivo ROTINAS.PRG (e seus derivados, no caso ROTINAS5.PRG). 02-11-11w.
            	*? EXISTE_PRD // modificado o nome de EXISTE_PROD e EXISTE_PRODUTO p/ EXISTE_PRD e EXISTE_PRDUTO, pois está gerando conflito com a função EXISTE_PROGRAMA q pertence ao arquivo ROTINAS.PRG (e seus derivados, no caso ROTINAS5.PRG). 02-11-11w.
              //? row() // acrescentado apenas para teste de migração harbour 6/3/15w.
              //inkey(0) // acrescentado apenas para teste de migração harbour 6/3/15w.
                @ row(),01 get mCDPRODUTO picture pCDPRODUTO  when empty (mCDPRODUTO)      valid fCDPRODUTO ()  // modificado pela linha abaixo, pois na migração do clipper/harbour o cursor na hora de cadastrar um produto aparece 6 linhas abaixo do lugar correto 6/3/15w.
                *@ 16,01 get mCDPRODUTO picture pCDPRODUTO  when empty (mCDPRODUTO)      valid fCDPRODUTO ()
                *@ row(),48 get mCD_GRADE  picture pCD_GRADE  when mCD_GRADE = 'PC' .and. .not. EXISTE_PRD  valid fQT_VENDA () // modificado o nome de EXISTE_PROD e EXISTE_PRODUTO p/ EXISTE_PRD e EXISTE_PRDUTO, pois está gerando conflito com a função EXISTE_PROGRAMA q pertence ao arquivo ROTINAS.PRG (e seus derivados, no caso ROTINAS5.PRG). 02-11-11w.
                *@ row(),48 get mCD_GRADE  picture pCD_GRADE      when mCD_GRADE = 'UN' .and. .not. EXISTE_PRD  valid fCD_GRADE () // Substitu¡da pela linha abaixo. 27/1/3w: // modificado o nome de EXISTE_PROD e EXISTE_PRODUTO p/ EXISTE_PRD e EXISTE_PRDUTO, pois está gerando conflito com a função EXISTE_PROGRAMA q pertence ao arquivo ROTINAS.PRG (e seus derivados, no caso ROTINAS5.PRG). 02-11-11w.
                @ row(),48 get mCD_GRADE  picture pCD_GRADE       when .not. EXISTE_PRD  valid fCD_GRADE () // modificado o nome de EXISTE_PROD e EXISTE_PRODUTO p/ EXISTE_PRD e EXISTE_PRDUTO, pois está gerando conflito com a função EXISTE_PROGRAMA q pertence ao arquivo ROTINAS.PRG (e seus derivados, no caso ROTINAS5.PRG). 02-11-11w.
                private mQT_ESTOQ2 := nil         // Acrescentado para que qd§ o estoque estiver zerado, pe‡a senha para liberara‡Æo. Walcledson 09/09/02.
                *@ row(),52 get mQT_VENDA  picture pQT_VENDA   valid fQT_VENDA () // Modificado p/Walcledson em 27/01/03 p/func. mt,cm,kg.
                @ row(),51 get mQT_VENDA  picture pQT_VENDA   valid fQT_VENDA () // Modificado p/Walcledson em 27/01/03 p/func. mt,cm,kg.
                read
Bom, o que os Srs. acham que está acontecendo?
Grato,
MICROVOLUTION, DE PAULA
PS: grifo nosso[/b em parte do código acima
O anexo ROW 1.JPG não se encontra mais disponível
O anexo ROW 2 - ERRO.JPG não se encontra mais disponível

Posição do ROW() dentro de Achoice

Enviado: 07 Mar 2015 10:11
por JoséQuintas
Sobre o tbrowse, uma alternativa é abrir uma janela individual pro produto.

Quando passei pro Harbour usando tbrowse não tive esse problema da linha, mas tive problema na coluna, porque o alinhamento do Harbour era diferente do Clipper.
Abrindo uma janela individual resolve qualquer problema, principalmente se tiver mais informações sobre o produto, ou se tiver que acrescentar mais informações depois.

Posição do ROW() dentro de Achoice

Enviado: 07 Mar 2015 15:36
por microvolution
JOSÉQUINTAS disse: Sobre o tbrowse, uma alternativa é abrir uma janela individual pro produto.
Prezado JoséQuintas, pra mim é um prazer ter você me respondendo a alguma dúvida de nossa parte.
Bom, acho que quando responde sobre o TBROWSE está se referindo à nossa dúvida sobre ACHOICE. Estou correto né?

Prezado professor, quando o amigo sugere um TBROWSE está se referindo a uma tela à parte para que seja feito cadastro dos produtos e só após concluir que é pra sair e voltar à tela anterior que seria essa minha antiga?
E, V.Sa. poderia me passar um exemplo de como seria?

E, quanto ao ROW() tem como resolver ou realmente é um conflito?

Abraços, e aguardo vosso retorno.
Grato,
Microvolution, W. de Paula.

Posição do ROW() dentro de Achoice

Enviado: 07 Mar 2015 18:30
por JoséQuintas
No seu CASE Lastkey() == 13, os mesmos GETs, mas dentro de uma janela:

Código: Selecionar todos

SAVE SCREEN
@ 10, 5 CLEAR TO 20, 60
@ 10, 5 TO 20, 60
@ 12, 7 SAY "PRODUTO:" GET mCODIGO
...
READ
RESTORE SCREEN
Só ajustar para seu estilo/bibliotecas.

Posição do ROW() dentro de Achoice

Enviado: 08 Mar 2015 10:01
por Toledo
Amigo W de Paula, depois da linha que tem o lastkey=13 tem tantos ? e também algumas funções (EXISTE_PRDUTO()) que com certeza estão mudando o valor do ROW(), então quando chega na linha do GET o valor do ROW() não é o mesmo da hora que você pressionou Enter.

Faça um teste assim...

Logo após o lastkey()=13, incluir uma variável para receber o valor do ROW():

Código: Selecionar todos

elseif lastkey () = 13
   nLinGet:=Row()
No GET use esta variável no lugar do ROW():

Código: Selecionar todos

@ nLinGet,01 get mCDPRODUTO picture pCDPRODUTO when empty(mCDPRODUTO) valid fCDPRODUTO()
Abraços,

Posição do ROW() dentro de Achoice

Enviado: 08 Mar 2015 11:43
por microvolution
Prezado TOledo, obrigado por mais uma vez estar disposto a nos ajudar nessa migração de clipper/harbour.

[qute] Toledo disse:Amigo W de Paula, depois da linha que tem o lastkey=13 tem tantos ? e também algumas funções (EXISTE_PRDUTO()) que com certeza estão mudando o valor do ROW(), então quando chega na linha do GET o valor do ROW() não é o mesmo da hora que você pressionou Enter.[/quote]
Prezado professor, se V.Sa. observar:
1) verá que meus "?" foram incluídos apenas pra eu fazer esse teste de descobrir o que está errado. Mas, no momento do código correto, pode-se notar que os comandos PRINT (aqui abreviado com "?") não estão ativos, eles estão comentados com "//" ou "*", tanto faz... V.Sa. concorda?

2) A função EXISTE_PRD existe (segue o código dela) não tem nenhuma alteração do local do cursor. Veja:

Código: Selecionar todos

static function EXISTE_PRDUTO ()
      for mI = 1 to 15
          mCD_PROD := val (substr (mLINHA [mI],01,13))
          mCD_GRAD := substr (mLINHA [mI],48,02)
          *? 'mCD_PROD,mCDPRODUTO',mCD_PROD,mCDPRODUTO
          *? 'mCD_PROD,mCDPRODUTO,mCD_GRAD,mCD_GRADE,mLINHA[mI],01,13' ,mCD_PROD,mCDPRODUTO,substr(mLINHA[mI],01,13),mCD_GRAD,mCD_GRADE,substr(mLINHA[mI],48,02)
          *inkey(0)
          if mCD_PROD = mCDPRODUTO .and. mCD_GRAD = mCD_GRADE
               return (.t.)
          endif
      next
return (.f.)
Toledo disse:Logo após o lastkey()=13, incluir uma variável para receber o valor do ROW():
Código:

Código: Selecionar todos

elseif lastkey () = 13
   nLinGet:=Row()
No GET use esta variável no lugar do ROW():
Código:

Código: Selecionar todos

@ nLinGet,01 get mCDPRODUTO picture pCDPRODUTO when empty(mCDPRODUTO) valid fCDPRODUTO()
Bom, por incrível que parece, parece uma comentário de quem não sabe nada da linguagem o que vou dizer:
Infelizmente deu erro "undefined reference to 'NLINGET'"

Bom, aí pensei imediatamente, ah já sei, falta criar a variável como LOCAL,PRIVATE,PUBLIC... etc...

Então fiz isso no início do módulo. Deu o mesmo erro.

Ah, coloquei dentro da função em questão como LOCAL ou PRIVATE... xiiiiiii o mesmo erro.

E, agora "Toledo" o que está errado?

PS: por isso disse que parece ser uma pergunta idiota de minha parte... mas, perdoe a fragilidade!!!

Grato!

Posição do ROW() dentro de Achoice

Enviado: 08 Mar 2015 11:57
por microvolution
Prezado Toledo,

mil perdões a respeito do UNDEFINED FUNCTION

Favor desconsiderar, pois ao colocar a variável está correta eu quem digitei erroneamente assim:

Código: Selecionar todos

                @ nLinGet(),01 get mCDPRODUTO picture pCDPRODUTO  when empty (mCDPRODUTO)      valid fCDPRODUTO ()
rsrsrs esqueci de tirar o parêntesis do row() rsrsrs

Bom, mas, corrigida a minha falha, apesar que eu já sabia do resultado, o problema continua:
no momento que damos ENTER o cursor aparece na linha 18.
Apesar de se fizermos ali a entrada do produto, o cursor volta para o lugar correto (entre linha 12 e 16 - que é o tamanho do ACHOICE).

Bom, digo isso e repito, pois no clipper o código já era assim (do jeito que estava antes da criação de nLinGet e não acontecia essa falha.
Acredito que ela seja do HARBOUR.
Caso contrário, V.Sa. apresente contra-argumentos ou os demais tenham uma resposta para a função ROW() dentro do ACHOICE().

Grato, e aguardando...

Posição do ROW() dentro de Achoice

Enviado: 09 Mar 2015 09:07
por ANDRIL
Poste o conteudo da função 'fACH_001' utilizada dentro do aChoice.
Ate+

Posição do ROW() dentro de Achoice

Enviado: 09 Mar 2015 14:17
por microvolution
Prezados Senhores, conforme pedido de V.Sas. que querem ajudar-me, segue o código da função fACH_001:

Código: Selecionar todos

function fACH_001 (mPAR1)
if lastkey()=13
   return 1
elseif lastkey()=27
   return 0
endif
return 2
Está aí...
bom, paliativamente até alguém achar uma solução para resolução desse pequeno(grande) problema dentro do nosso pedido (row()/achoice()), fizemos as seguintes alterações em nosso código:

// mIND := achoice (12,01,16,77,mLINHA,.T.,'fACH_001',mIND) // mudei em 9/3/15w para a linha abaixo, pois o harbour está confundindo a função ROW() dentro da ACHOICE().

Código: Selecionar todos

//mIND := achoice (12,01,16,77,mLINHA,.T.,'fACH_001',mIND)  // mudei em 9/3/15w para a linha abaixo, pois o harbour está confundindo a função ROW() dentro da ACHOICE().
mIND := achoice (12,01,15,77,mLINHA,.T.,'fACH_001',mIND)
Com isso, sobrou uma linha (a 16) para que eu possa programar o ENTER no lugar errado que está na linha 18, volto pra linha 16. Então a alteração desse item ficou assim no código:

Código: Selecionar todos

@ 16,01 get mCDPRODUTO picture pCDPRODUTO  when empty (mCDPRODUTO)      valid fCDPRODUTO ()  // modificado pela linha abaixo, pois na migração do clipper/harbour o cursor na hora de cadastrar um produto aparece 6 linhas abaixo do lugar correto 6/3/15w. // mudei p/ 16,01 pois o harbour está confundindo a função ROW() dentro do ACHOICE() 9/3/15w.
//@ row(),01 get mCDPRODUTO picture pCDPRODUTO  when empty (mCDPRODUTO)      valid fCDPRODUTO ()  // modificado pela linha abaixo, pois na migração do clipper/harbour o cursor na hora de cadastrar um produto aparece 6 linhas abaixo do lugar correto 6/3/15w.
Por enquanto, está resolvido, o cursor cadastra o(s) produto(s) na linha 16 e quando dou ENTER para finalizar ele volta para o lugar certo (entre 12 e 15).

Mas, ainda, acredito numa solução correta.
Abraços!

Posição do ROW() dentro de Achoice

Enviado: 09 Mar 2015 17:09
por Toledo
Amigo, o correto seria colocar estes GET, que você usa quando pressiona Enter no Achoice, dentro da função fACH_001, mas como isto será mais trabalhoso, então faça o seguinte:

No início deste PRG que tem o Achoice, declare a seguinte variável:

Código: Selecionar todos

Private nLinGet:=12
Altere sua função fACH_001 para:

Código: Selecionar todos

function fACH_001(mPAR1, nElement, nRow )
nLinGet:=nRow
if lastkey()=13
   return 1
elseif lastkey()=27
   return 0
endif
return 2
No GET use esta variável no lugar do ROW():

Código: Selecionar todos

@ nLinGet,01 get mCDPRODUTO picture pCDPRODUTO when empty(mCDPRODUTO) valid fCDPRODUTO()
Acho que isto vai resolver.

Abraços,

Posição do ROW() dentro de Achoice

Enviado: 10 Mar 2015 00:17
por microvolution
Olá pessoal, foi de muita valia a ajuda. Já estamos quase corrigindo a falha. Mas, ainda não chegou.

Só gostaria de entender esses 2 elementos que são recebidos dentra da função "fACH001", e, o que eles trazem?

Agora, com a aplicação das alterações sugeridas pelo TOLEDO, a linha de digitação não mais está na linha 18, e, sim, na linha 1.
Enquanto estava na linha 18, tudo que se digitava, estava apenas apontando o ROW() para esta linha, independentemente se rolávamos para cima ou para baixo dentro do limite do ACHOICE (12 a 15/16).
Agora com essa sugestão, ele (o cursor) não fica estagnado apenas na linha 0, mas, se descermos com a seta ele vai para a linha 1, e se continuarmos a descer, para a linha 2, e se subirmos ele também sobe.

Falta pouco para concluir...
bom, em anexo, fiz um PRINTSCREEN de minha tela com as explicações aqui por mim apresentadas.

Aguardo novas alterações para finalizarmos esse erro.

Posição do ROW() dentro de Achoice

Enviado: 10 Mar 2015 08:04
por Toledo
microvolution escreveu:Agora, com a aplicação das alterações sugeridas pelo TOLEDO, a linha de digitação não mais está na linha 18, e, sim, na linha 1.
Opa, esqueci de um pequeno detalhe, altere a linha do GET para:

Código: Selecionar todos

@ 12+nLinGet,01 get mCDPRODUTO picture pCDPRODUTO when empty(mCDPRODUTO) valid fCDPRODUTO()
microvolution escreveu:Só gostaria de entender esses 2 elementos que são recebidos dentra da função "fACH001", e, o que eles trazem?
Para a função usada no Achoice é passada os seguintes parâmetros:

1º parâmetro: O modo atual do achoice()
0 = Ocioso/sem ação
1 = o usuário tentou mover o cursor antes do primeiro item superior
2 = o usuário tentou mover o cursor depois do último item inferior
3 = tecla desconhecida foi pressionada
4 = Sem itens selecionaveis

2º parâmetro: O número do elemento atual na matriz de itens.

3º parâmetro: A posição da linha relativa da barra do cursor dentro da região do Achoice na janela.

Abraços,

Posição do ROW() dentro de Achoice

Enviado: 10 Mar 2015 08:35
por ANDRIL
Toledo foi mais rápido que eu! O "problema" do não funcionamento era justamente a correção para @ 12+nLinGet.

microvolution, detalhe qual a versão do Harbour esta usando? Fiz um teste na v3.2.0 e funcionou sem problemas posicionando na linha correta com uso de ROW().

Até+

Posição do ROW() dentro de Achoice

Enviado: 10 Mar 2015 12:23
por microvolution
Prezados Toledo e demais professores!
Aqui os meus parabéns!
Deu certinho e já até alterei noutro módulo que é de cadastro de produtos e serviços (lá o problema era duplo). Não havia informado, pois, preferi informar o mais fácil...
com a ajuda desse resolvi o outro. Para não embolar renomeei função "fACH_001" para "fACH_002" e "fACH_003". para produtos e serviços, respectivamente.

Bom, agradeço por enquanto.

Finalmente, o meu próximo passo (já fiz mouse funcionar em modo console, já mudei os caracteres para terem um visual parecido com o da VisualLib - sem necesidade dela)...
preciso imprimir em USB e LPT1, pesquisei nos tutoriais, mas, não consegui ver qual é o correto, podem me passar o link do tutorial que faz com que o próprio programa imprima sem necessidade programas terceiros, com por exemplo:

Código: Selecionar todos

 set printer to lpt1
alguma coisa assim:

Código: Selecionar todos

 set printer to usb 
(*) se existir, é claro!!!

Vlw, por enquanto é só!
Microvolution, W de Paula.

Posição do ROW() dentro de Achoice

Enviado: 17 Set 2015 12:22
por rubens
Toledo..

Quando você diz
Para a função usada no Achoice é passada os seguintes parâmetros:

1º parâmetro: O modo atual do achoice()
0 = Ocioso/sem ação
1 = o usuário tentou mover o cursor antes do primeiro item superior
2 = o usuário tentou mover o cursor depois do último item inferior
3 = tecla desconhecida foi pressionada
4 = Sem itens selecionaveis

2º parâmetro: O número do elemento atual na matriz de itens.

3º parâmetro: A posição da linha relativa da barra do cursor dentro da região do Achoice na janela.
Como eu recebo esse segundo parametro dentro da função.
Eu uso uma matriz para armazenar os arquivos xml da pasta
Eu gostaria de hora que ativar a função do usuário no achoice apresentasse o nome do xml. Mas para isso preciso saber a posição atual da linha do achoice.

aciono o achoice desta forma

Código: Selecionar todos

,
nOpcao  := Achoice(06,03,nLINHADOWN,78,cLista,.t.,'TKCOMPRAXML')
A funcao TKCOMPRAXML

Código: Selecionar todos

********************************************************************************
FUNCTION TKCOMPRAXML()
LOCAL lAPAGOU := .F.
LOCAL TK:=LASTKEY()
LOCAL cFILEDANFE := cPASTAXML+mListaArq[nOpcao,1]  // Aqui eu preciso da posicao da linha no achoice para selecionar o arquivo

@ nLINHADOWN+1,04 SAY cFILEDANFE

IF MODO=0
	RETURN(2)
ELSEIF MODO=1
	KEYBOARD CHR(30)
	RETURN(2)
ELSEIF MODO=2
	KEYBOARD CHR(31)
	RETURN(2)
ELSEIF MODO=3
	DO CASE
		CASE TK = K_DEL
			IF ALERT( 'Confirma exclusao do arquivo XML: '+HB_EOL()+ cFILEDANFE +' ?', {'Sim','Nao'})=1 .AND. !ESC()
				nVEZES := 0
				WHILE FILE( cFILEDANFE )
					nVEZES++
					IF nVEZES=10
						IF ALERT('Nao consigo apagar o arquivo XML...',{'Continua','Cancela'})=2 .and. !ESC()
							EXIT
						ENDIF
						nVEZES := 0
					ENDIF
					MILLISEC(1000)
				ENDDO
				IF !FILE( cFILEDANFE )
					lAPAGOU := .T. 
					RETURN(0)
				ENDIF
			ENDIF
	ENDCASE
	RETURN(2)
ENDIF

RETURN(2)
Não estou conseguindo enviar a linha atual do achoice para a funçao...
Como posso fazer isso?

Obrigado