Clipper On Line • Ver Tópico - criar expressão para Ascan

criar expressão para Ascan

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

criar expressão para Ascan

Mensagempor Mau_S » 07 Nov 2018 12:53

Ola Pessoal, meu primeiro post e estou precisando de uma ajuda para criar uma expressão para um array usando o Ascan e assim retornar a posição da informação dentro de um Array.

Segue o exemplo

_aDados := {}

AADD(_aDados,{"Produto","Descricao","00034001","00024401","00325801"})

Assim dentro do Array _aDados eu vou ter

_aDados[1][1] Produto
_aDados[1][2] Descricao
_aDados[1][3] 00034001
_aDados[1][4] 00024401
_aDados[1][5] 00325801

Numa condição que me meu codigo de um fornecedor é o abaixo atribuido a variavel _cFor, aonde o _cFor vai variar de conteudo dentro dos tres codigos acima
_cFor := "00024401"

Como seria a expressão para identificar a posição do conteudo _cFor dentro desse array. Eu sei que nesse exemplo fixo o _cFor que eu citei vai estar sempre na
posição 4, mas esse array do exemplo vai ser dinamico, ou seja, os codigos dentro dele vai sempre variar. Eu vou zera-lo e alimenta-lo a cada looping do meu programa

Vou retornar a posição na variavel _nPos

_nPos := Ascan(_aDados,{|x|x[01] == _cfor})

No caso acima esta errado retorna sempre 0 e eu não sei como montar a expressão de forma correta para retornar a posição correta do codigo.

Agradeço a ajuda

obrigado
Mau_S
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 3
Data de registro: 07 Nov 2018 11:06
Cidade/Estado: Cerquilho SP
Curtiu: 1 vez
Mens.Curtidas: 0 vez

criar expressão para Ascan

Mensagempor Mau_S » 07 Nov 2018 13:58

Obrigado, mas não funcionou.

No meu exemplo o Ascan deveria retornar a posição 4(_aDados[1][4]) aonde se encontra o conteudo "00024401" e mesmo montando a expressão conforme seu exemplo ele retorna posição 0
Mau_S
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 3
Data de registro: 07 Nov 2018 11:06
Cidade/Estado: Cerquilho SP
Curtiu: 1 vez
Mens.Curtidas: 0 vez

criar expressão para Ascan

Mensagempor Mau_S » 07 Nov 2018 15:30

Cara, muito obrigado por essa idéia, mas nem vai ser preciso tanto.

vendo o seu codigo de como voce tratou o aDados eu vi o meu erro. O meu ascan não funcionou porque ao inves de passar o _aDados como eu fiz eu devo passar
Ascan(_aDados[1],...... porque é a primeira "linha" do array somente.

Muitissimo obrigado :{
Mau_S
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 3
Data de registro: 07 Nov 2018 11:06
Cidade/Estado: Cerquilho SP
Curtiu: 1 vez
Mens.Curtidas: 0 vez

criar expressão para Ascan

Mensagempor JoséQuintas » 07 Nov 2018 17:25

Que conversa mais doida.

Se quer comparar o elemento 4, coloca 4 e não 1.

nPos := AScan( aDados, { | x | x[ 4 ] == cFor } )

IF nPos != 0
   ? aDados[ nPos, 1 ]
   ? aDados[ nPos, 2 ]
   ? aDados( nPos, 3 ]
   ? aDados[ nPos, 4 ]
   ? aDados[ nPos, 5 ]
ENDIF
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor JoséQuintas » 07 Nov 2018 17:29

E se quer comparar os elementos 3, 4 e 5, coloca 3, 4, e 5

nPos := AScan( aDados, { | x | x[ 3 ] == cFor .OR. x[ 4 ] == cFor .OR. x[ 5 ] == cFor } )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor juniorcamilo » 05 Mai 2021 11:32

JoséQuintas escreveu:E se quer comparar os elementos 3, 4 e 5, coloca 3, 4, e 5

nPos := AScan( aDados, { | x | x[ 3 ] == cFor .OR. x[ 4 ] == cFor .OR. x[ 5 ] == cFor } )


bom dia José Quintas!

como eu faria uma ascan com expressão para saber se dentro de uma matriz tem conteúdo, ou seja, c em uma posição da matriz não esta em branco?
Avatar de usuário

juniorcamilo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 10 Nov 2006 08:12
Cidade/Estado: Pará
Curtiu: 29 vezes
Mens.Curtidas: 2 vezes

criar expressão para Ascan

Mensagempor JoséQuintas » 05 Mai 2021 12:38

Acabo de pensar numa alternativa sobre como decidir isso.
Já comentei antes: codeblock é como função sem nome.
Pense numa função pra isso e coloque igual no codeblock.

Pensando no FOR/NEXT
FOR nCont = 1 TO Len( aDados )
   e := aDados[ nCont ]
   Compara( e )
NEXT


Pensando no FOR/EACH
FOR EACH e IN aDados
   Compara( e )
NEXT


A função:
FUNCTION Compara( e )

   RETURN e[ 1 ] < e[ 2 ]


Isso acima em codeblock, retira o nome da função e o conteúdo é o próprio return.
{ | e | e[ 1 ] < e[ 2 ] }


FUNCTION Compara( e ) foi convertido pra | e |
e o RETURN e[ 1 ] < e[ 2 ] foi convertido pra e[ 1 ] < e[ 2 ]
O resultado de ASCAN() vai ser o primeiro que retornar verdadeiro, a posição dele.

Esse "não está em branco", ficou confuso se é combinado com o anterior, ou apenas ver se está em branco, ou ver se um ou todos estão em branco, etc.
Dependendo do que está querendo, por ser assim com .AND., ou com .OR., ou outra coisa

Empty( e[ 3 ] ) .AND. Empty( e[ 4 ] ) .AND. Empty( e[ 5 ] )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor JoséQuintas » 05 Mai 2021 12:40

Ok, vi depois que é no fórum Clipper, o exemplo de FOR/EACH não vale pra Clipper, só pra Harbour, mas já fica sabendo que existe a opção.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor juniorcamilo » 06 Mai 2021 07:45

JoséQuintas escreveu:Esse "não está em branco", ficou confuso se é combinado com o anterior, ou apenas ver se está em branco, ou ver se um ou todos estão em branco, etc.


EMPTY() MESMO, ou seja, exemplo basico!
...
aMatriz := {{},{},{},{}}
for nCont = 1 to Len(aMatriz[1])
    if !empty(Matriz[3,nCont])
       exit
    endif
next
....

como ficaria isso no ascan? sei q esta no forum de clipper! mas pode apresentar se necessário também para xharbour!

desde ja agradeço pela atenção!
Avatar de usuário

juniorcamilo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 10 Nov 2006 08:12
Cidade/Estado: Pará
Curtiu: 29 vezes
Mens.Curtidas: 2 vezes

criar expressão para Ascan

Mensagempor JoséQuintas » 06 Mai 2021 12:09

...
aMatriz := {{},{},{},{}}
for nCont = 1 to Len(aMatriz[1])
    if !empty(Matriz[3,nCont])
       exit
    endif
next
....


Tentar entender.... porque acho que o FOR/NEXT tá errado, talvez só a inversão 3,nCont, pra nCont,3 ou talvez mais que isso.

A impressão que tenho é que está querendo ver os arrays de dentro e não o array de fora.

FOR nCont = 1 TO Len( aMatriz )
   Funcao( aMatriz[ 1 ] )  // processa um elemento por vez, que tem 4 arrays
NEXT
...
FUNCTION Funcao( e )

   FOR nCont = 1 TO Len( e[ 1 ] )
      IF ! Empty( e[ 3 ] ) // olha se no array 3, a mesma posição do 1 está vazia
         EXIT
     ENDIF
   NEXT
...
RETURN Nil
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor JoséQuintas » 06 Mai 2021 12:19

...
aMatriz := {{},{},{},{}}
for nCont = 1 to Len(aMatriz[1])
    if !empty(Matriz[3,nCont])
       exit
    endif
next
....


Ok, ainda tentando entender...
Parece que pega da matriz 1, se na matriz 3 não estiver vazio.

nPos := hb_AScan( aMatriz[ 3 ], { | e | ! Empty( e ) } )
? aMatriz[ 1 ][ nPos ]
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor JoséQuintas » 06 Mai 2021 12:24

Ou pra simplificar, ainda tentando entender...
{ aLista1, aLista2, aLista3, aLista4 }, onde cada um é um array

aMatriz := { {}, {}, {}, {} }
aLista1 := aMatriz[ 1 ]
aLista2 := aMatriz[ 2 ]
aLista3 := aMatriz[ 3 ]
aLista4 := aMatriz[ 4 ]
nPos := ASCan( aLista3, { | e | ! Empty( e ) } )
? aLista1[ nPos ]


É o mesmo anterior, apenas dei nome a cada lista.
É o que o seu FOR/NEXT sugere sobre o que está querendo fazer.
Neste aqui chamei de lista1,2,3,4, mas no anterior usei direto aMatriz[ 1 ] e aMatriz[ 3 ]
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor JoséQuintas » 06 Mai 2021 12:39

Precisa confirmar sobre o array.
Poderia ser:

{ { codigo, codigo, codigo }, { nome, nome, nome }, { valor, valor, valor } )


ou

{ { codigo, nome, valor }, { codigo, nome, valor }, { codigo, nome, valor } )


Pra achar qual tem valor zero, depende de como ele está distribuído, se da primeira forma ou da segunda.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor JoséQuintas » 06 Mai 2021 12:54

No primeiro caso, que cada campo está numa lista, é pesquisar na LISTA DE VALORES, e pegar o nome da LISTA DE NOMES

nPos := AScan( array[ 3 ], { | e | e != 0 } ) // pesquisa a coluna 3=lista de valores
cNome := array[ 2 ][ nPos ] // pega da coluna 2=lista de nomes


No segundo caso, é olhar cada um da LISTA, e pegar o CAMPO NOME dessa lista

nPos := ASCan( array, { | e | e[ 3 ] != 0 } ) // pesquisa na lista geral em cada elemento, a coluna 3=valor
cNome := array[ nPos ] [ 2 ] // pega da lista geral coluna 2=nome


Chamando de lista, e do que tem em cada lista, parece ficar mais claro

Nota: array[ nPos, 2 ] e array[ nPos ][ 2 ] são equivalentes, pode escrever dos dois jeitos.
Mas array[ nPos, 2 ] é diferente de array[ 2, nPos ], são posições diferentes.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

criar expressão para Ascan

Mensagempor juniorcamilo » 07 Mai 2021 09:40

   
  if AScan( aMatEntrada[27],{ | e | ! Empty( e ) }) # 0
       ........
  endif



funcionou perfeitamente!
obrigado pela excelente aula!
Avatar de usuário

juniorcamilo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 10 Nov 2006 08:12
Cidade/Estado: Pará
Curtiu: 29 vezes
Mens.Curtidas: 2 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro