Página 1 de 1

Erro na função ACHOICE()

Enviado: 04 Jan 2008 19:14
por Hasse
Boa tarde colegas.

Implantei a versão 1.1.0 e dá pau na função ACHOICE().

Voltando para a versão 0.99.70 funciona normal.

Na versão 1.1.0 esta função sofreu modicações bem profundas. Na linha 112 ela invoca a função THROW(). E é justamente nela é que ocorre o erro, conforme abaixo:

Código: Selecionar todos

      Tipo de Mensagem ..............: BASE
      Número do Erro ................: 1.127
      Descrição .....................: Argument error: <acMenuItems> should contain string values
      Objeto do Erro ................: ACHOICE
      Erro do DOS ...................: 0
      Área de Trabalho ..............: 3
      Nome do Arquivo ...............: 
      Módulo ........................: THROW.................... :Linha... 0                   
                                       ACHOICE.................. :Linha... 112  
Posso substituir ela pela mesma da versão 0.99.70 até que saia a sua correção ?

Neste caso bastaria compilar via make_b32.bat ?

Enviado: 04 Jan 2008 19:31
por sygecom
Hasse, post um codigo com exemplo onde ocorre o erro. eu estou usando aqui ACHOICE sem problemas !!!

Enviado: 04 Jan 2008 22:32
por Hasse
Tenho várias ocorrência. Acredito que devo ter umas 20, e destas testei 8 e TODAS dão erro. Selecionei duas bem características:

Ocorrência 1:

Código: Selecionar todos

DECLARE v_cvnome[300],v_cvcod[300]
conta = 0
FOR i=1 TO 300       conta = conta + 1
    v_cvnome[i] = SUBS(CONTEUDO,01,19) + COD
    SKIP 2
    IF TIP != "CV"
       EXIT
    ENDIF
NEXT
ASORT(v_cvnome)
FOR i=1 TO conta
   v_cvcod[i]  = RIGHT(v_cvnome[i],3)
   v_cvnome[i] = LEFT(v_cvnome[i],19) + "-" + SUBS(v_cvnome[i],20)
NEXT i
SET CURSOR ON

DO WHILE .T.
   SELE 3
   @ 06,06 TO 20,32
   n_opcao := ACHOICE(08,08,18,30,v_cvnome)        && <<-- AQUI OCORRE O ERRO.
   IF n_opcao = 0
      EXIT
   ENDIF
   c_busca = "CV"+v_cvcod[n_opcao]
   ...
   ...
Ocorrência 2:

Código: Selecionar todos

nExam = 900
DECLARE v_exnome[nExam]
conta = 0
FOR i=1 TO nExam
    conta = conta + 1
    v_exnome[i] = SUBS(CONTEUDO,01,28) + COD
    SKIP
    IF TIP != "EX"
       EXIT
    ENDIF
NEXT

SET CURSOR ON
DO WHILE .T.
   M_tela = SAVESCREEN(03,11,17,47)
   @ 03,11 CLEAR TO 17,47
   @ 03,11 TO 17,47 DOUBLE
   n_opcao = ACHOICE(04,14,16,44,v_exnome)    && <<-- AQUI OCORRE O ERRO.
   SETCOLOR(cornow)
   RESTSCREEN(03,11,17,47,M_tela)
   IF n_opcao = 0
      EXIT
   ENDIF
   c_exame = READVAR()
   &c_exame = RIGHT(v_exnome[n_opcao],3)
   KEYBOARD CHR(13)
   EXIT
ENDDO
...
...

Enviado: 05 Jan 2008 16:59
por Hasse
Caros colegas.

Encontrei o ERRO e a solução. É o seguinte !!!!

Ao se criar Matrizes de tamanho fixo elas são preenchidas automaticamente com o valor NIL. A seguir o meu sistema preenchia a matriz com os dados, mas ficavam algumas posições (???) com o valor NIL.

O ACHOICE antigo descartava automaticamente estas posições, avaliando somente as preenchidas com STRINGS. O ACHOICE da versão 1.1.0 é mais exigente e aceita SOMENTE STRINGS.

Desta forma temos 2 caminhos:

1-Usamos o sistema antigo e antes de preencher a matriz com os nossos dados ela deve ser toda preenchida com "" (string vazia) com a função AFILL(). O ACHOICE descarta todas as posições com string vazio.

2-Criamos uma matriz o (zero) usando a atribuição v_dtnome := {}, e depois no preenchimento dos dados usamos a função AADD(). Desta forma criamos a matriz do tamanho exato dos nossos dados.

As 2 formas são suportadas pelo novo ACHOICE.

Obrigado pela atenção de todos, muito especialmente do colega Sygecom, que sempre está atento e prestativo.

Enviado: 06 Jan 2008 14:59
por sygecom
Hasse, talvez por isso que nunca deu problema comigo, desde no clipper eu sempre inicie vazio ( v_dtnome := {} ) e sempre preenchi com AADD().