Clipper On Line • Ver Tópico - Ajuda com Matriz Multidimensional

Ajuda com Matriz Multidimensional

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Ajuda com Matriz Multidimensional

Mensagempor Poka » 26 Fev 2018 10:43

Olá
Não estou conseguindo fazer algumas coisa com esse tipo de matriz. Alguém pode dar uma ajuda?

dois procedimentos

imagine uma matriz com 500 linhas e 30 colunas.
cada coluna representa um determinado tipo de informação

primeiro caso
percorrer todas as linhas e eliminar quando um determinado tipo de informação não satisfazer. Eliminar, não deixar como nill.

segundo caso
percorrer todas as linhas e ir copiando para outra matriz, somente algumas linhas quando a informação não satisfazer.

Obs. pegar as informações , sem problemas. Não estou conseguindo excluir ou copiar mesmo. Com matriz normal não tenho problemas, só com essa tipo multidimensional mesmo.

tentei com Adel , Acopy , mas nao deu certo

Agradeço qualquer ajuda

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com Matriz Multidimensional

Mensagempor Paredes01 » 26 Fev 2018 20:54

Hola

Ejemplo:
Voy guardando la información capturada:

AADD(aMA,{ cCOD ,; // 1
cDES ,; // 2
cMENU ,; // 3
nCANT ,; // 4
nPRECIO ,; // 5
nPUBL ,; // 6
cART22 ,; // 7
cTIPO ,; // 8
nIMP ,; // 9
nIVA ,; //10
cPROV ,; //11
nCOSTO ,; //12
nPRECIOX ,; //13
nPZAXCJA ,; //14
nPFAR ,; //15
cBARR ,; //16
cNADR ,; //17
cDEKA ,; //18
nD ,; //19
cONCO ,; //20
nDESCMAXF,; //21
nDESCMAXP,; //22
nCOSTO_P ,; //23
nCOSTO_U ,; //24
cSUN ,; //25
nIVASUN ,; //26
nIMPSUN ,; //27
nCANTOFTA,; //28
nPUBX ,; //29
cLINEA ,; //30
nDESCLIN ,; //31
xCEDULA ,; //32
xNOM ,; //33
xRECETA ,; //34
nCAJAS ,; //35
cKEY ,; //36
cIDIMSS ,; //37
cIDHRAE ,; //38
cES_CAUSE,; //39
nSolicita }) //40

elimino lo que no me sirve y lo demas lo gardo en 2 arrays difrentes para guardar e imprimir

aSiCause:={}
aNoCause:={}

Z:= 0
For Z = 1 TO Len(aMA)
If Left(aMA[Z, 1],9) = "ELIMINADO"
ADEL(aMA, Z, .T.)
Endif
Next

Y:= 0
For Y = 1 to Len(aMA)

If !Empty(aMA[Y,39])

AADD(aNoCause,{ aMA[Y, 1] ,; // 1
aMA[Y, 2] ,; // 2
aMA[Y, 3] ,; // 3
aMA[Y, 4] ,; // 4
aMA[Y, 5] ,; // 5
aMA[Y, 6] ,; // 6
aMA[Y, 7] ,; // 7
aMA[Y, 8] ,; // 8
aMA[Y, 9] ,; // 9
aMA[Y,10] ,; //10
aMA[Y,11] ,; //11
aMA[Y,12] ,; //12
aMA[Y,13] ,; //13
aMA[Y,14] ,; //14
aMA[Y,15] ,; //15
aMA[Y,16] ,; //16
aMA[Y,17] ,; //17
aMA[Y,18] ,; //18
aMA[Y,19] ,; //19
aMA[Y,20] ,; //20
aMA[Y,21] ,; //21
aMA[Y,22] ,; //22
aMA[Y,23] ,; //23
aMA[Y,24] ,; //24
aMA[Y,25] ,; //25
aMA[Y,26] ,; //26
aMA[Y,27] ,; //27
aMA[Y,28] ,; //28
aMA[Y,29] ,; //29
aMA[Y,30] ,; //30
aMA[Y,31] ,; //31
aMA[Y,32] ,; //32
aMA[Y,33] ,; //33
aMA[Y,34] ,; //34
aMA[Y,35] ,; //35
aMA[Y,36] ,; //36
aMA[Y,37] ,; //37
aMA[Y,38] ,; //38
aMA[Y,39] ,; //39
aMA[Y,40] }) //40
Endif
Next

Z:= 0
For Z = 1 to Len(aMA)
If Empty(aMA[Z, 39])
AADD(aSiCause,{ aMA[Z, 1] ,; // 1
aMA[Z, 2] ,; // 2
aMA[Z, 3] ,; // 3
aMA[Z, 4] ,; // 4
aMA[Z, 5] ,; // 5
aMA[Z, 6] ,; // 6
aMA[Z, 7] ,; // 7
aMA[Z, 8] ,; // 8
aMA[Z, 9] ,; // 9
aMA[Z,10] ,; //10
aMA[Z,11] ,; //11
aMA[Z,12] ,; //12
aMA[Z,13] ,; //13
aMA[Z,14] ,; //14
aMA[Z,15] ,; //15
aMA[Z,16] ,; //16
aMA[Z,17] ,; //17
aMA[Z,18] ,; //18
aMA[Z,19] ,; //19
aMA[Z,20] ,; //20
aMA[Z,21] ,; //21
aMA[Z,22] ,; //22
aMA[Z,23] ,; //23
aMA[Z,24] ,; //24
aMA[Z,25] ,; //25
aMA[Z,26] ,; //26
aMA[Z,27] ,; //27
aMA[Z,28] ,; //28
aMA[Z,29] ,; //29
aMA[Z,30] ,; //30
aMA[Z,31] ,; //31
aMA[Z,32] ,; //32
aMA[Z,33] ,; //33
aMA[Z,34] ,; //34
aMA[Z,35] ,; //35
aMA[Z,36] ,; //36
aMA[Z,37] ,; //37
aMA[Z,38] ,; //38
aMA[Z,39] ,; //39
aMA[Z,40] }) //40
Endif
Next

If Len(aSiCause) > 0

Alert("Cause : " + Str(Len(aSiCause)), , ,2)

nTOTAL = 0
nDEP_UNO = 0
nDEP_DOS = 0
nDEP_TRES = 0
nDEP_CUATRO = 0
IVA = 0
n15SUN = 0
n05SUN = 0

AEVAL(aSiCause,{ |X| nTOTAL += X[9] })
AEVAL(aSiCause,{ |X| IIF( X[8] = "A", nDEP_UNO += X[9], NIL ) } )
AEVAL(aSiCause,{ |X| IIF( X[8] = "E", nDEP_TRES += X[9], NIL ) } )

AEVAL(aSiCause,{ |X| IIF( X[8] = "B" , nDEP_DOS += X[ 9], NIL ) } )
AEVAL(aSiCause,{ |X| IIF( X[8] = "B" , IVA += X[10], NIL ) } )

nTOTAL = ROUND( nTOTAL, 2 )

zSTA = "1"
GRABA_NOTA(aSiCause,"1")
IMP_NOTA(aSiCause)
Endif

If Len(aNoCause) > 0

Alert("No Cause : " + Str(Len(aNoCause)), , ,2)

nTOTAL = 0
nDEP_UNO = 0
nDEP_DOS = 0
nDEP_TRES = 0
nDEP_CUATRO = 0
IVA = 0
n15SUN = 0
n05SUN = 0

AEVAL(aNoCause,{ |X| nTOTAL += X[9] })
AEVAL(aNoCause,{ |X| IIF( X[8] = "A", nDEP_UNO += X[9], NIL ) } )
AEVAL(aNoCause,{ |X| IIF( X[8] = "E", nDEP_TRES += X[9], NIL ) } )

AEVAL(aNoCause,{ |X| IIF( X[8] = "B" , nDEP_DOS += X[ 9], NIL ) } )
AEVAL(aNoCause,{ |X| IIF( X[8] = "B" , IVA += X[10], NIL ) } )

nTOTAL = ROUND( nTOTAL, 2 )

zSTA = "1"
GRABA_NOTA(aNoCause,"2")
IMP_NOTA(aNoCause)
Endif

Saludos
Paredes01
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 38
Data de registro: 20 Mai 2012 11:22
Cidade/Estado: Mérida, Yucatán, México
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Ajuda com Matriz Multidimensional

Mensagempor Poka » 27 Fev 2018 10:10

Olá

Obrigado por responder
ainda não deu certo

um exemplo seria este

matriz:={}
AADD(matriz, {"LEME","SP"})
AADD(matriz, {"CAMPINAS","SP"})
AADD(matriz, {"RIO JANEIRO","RJ"})
AADD(matriz, {"SAO PAULO","SP"})

matriz aqui tem 4 linhas e 2 colunas

FOR A:= 1 TO LEN(matriz)
   IF matriz[A,2] = "RJ"
      // eliminar a linha 3 da matriz ( não vi como fazer)
   ENDIF
NEXT


matriz aqui teria que ter 3 linhas

outro exemplo passando para outra matriz copia (já resolveria o meu problema também)

mCopia:={}

FOR A:= 1 TO LEN(matriz)
   IF matriz[A,2] <> "RJ"
      // aqui copio o que me interessa
   aadd( Mcopia,{ matriz[a,1],  Mcopia,[a,2] })
   // tem como copiar a linha e colunas sem especificar coluna por coluna? ( veja obs  abaixo)
   ENDIF
NEXT


obs:

esta matriz a cada seleção do sistema vem com linhas e colunas diferente, por isso fazendo com o ADD acima não resolve.
se não fosse multidimensional, tudo bem, é + facil
se alguém tiver + alguma idéia de como fazer?

esta matriz está sempre mudando pois vem de SELECT do FIREBIRD, e no select as vezes não tenho todos os campos para testar.
então preciso fazer mais uma seleção na matriz para depois imprimir.

Obrigado
Um abraço

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com Matriz Multidimensional

Mensagempor Jairo Maia » 27 Fev 2018 10:49

matriz:={}
AADD(matriz, {"LEME","SP"})
AADD(matriz, {"CAMPINAS","SP"})
AADD(matriz, {"RIO JANEIRO","RJ"})
AADD(matriz, {"SAO PAULO","SP"})

//matriz aqui tem 4 linhas e 2 colunas

FOR A:= 1 TO LEN(matriz)
   
  IF matriz[A,2] = "RJ"
    ADel( matriz, A )                   // eliminar a linha 3 da matriz ( não vi como fazer)
    ASize( matriz, Len( matriz ) - 1 )  // elimina o elemento da matriz
    A--                                 // decrementa o tamanho da matriz
  ENDIF

NEXT

Hb_Alert( Hb_NToS( Len( matriz ) ) )


NOTA: Não usei o terceiro elemento em ADel() porque não funciona. Pela documentação poderia ser ADel( matriz, A, .T. ). Isso eliminaria o use de ASize(), mas não funciona, e dá erro, porisso usei ASize().
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Ajuda com Matriz Multidimensional

Mensagempor Poka » 27 Fev 2018 11:03

Valeu Jairo, deu certo

Obrigado, um abraço

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com Matriz Multidimensional

Mensagempor JoséQuintas » 27 Fev 2018 11:13

Da mesma forma que faria com um array normal.... ou quase...

Em Harbour..

Eliminar elemento:

hb_ADel( array, número, .T. )

Adicionar elemento em outro array:

Aadd( aOutro, aEste[ nCont ] )

Se precisar, aClone( aEste[ nCont ] )

Observações:

- Pra eliminar elemento, melhor processar do fim pro começo pra não ter erro, e não complicar algum controle extra
- Pro AAdd(), se precisar use aClone()

o FOR EACH pode ser interessante.

FOR EACH oElement IN aSuaLista DESCEND
   IF oElement[ 4 ] != "SP"
      hb_ADel( aSuaLista, oElement:__ENumIndex, .T. )
   ENDIF 
NEXT


aOutra := {}
FOR EACH oElement IN aSuaLista
   IF oElement[ 4 ] == "SP"
      AAdd( aOutra, aClone( oElement ) )
   ENDIF
NEXT
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Matriz Multidimensional

Mensagempor asimoes » 27 Fev 2018 13:59

Usando aEval

 aEval( matriz, {|x,y| IF( x[2] = "RJ", hb_ADel( matriz, y, .T. ), ) } )


Corrigindo, tem que ser mesmo por For..Each..Descend pra dar certo conforme o Quintas esplicou.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ajuda com Matriz Multidimensional

Mensagempor Poka » 27 Fev 2018 16:27

Obrigado Quintas e Asimoes pelas explicações. Já coloquei na minha rotina aqui e deu td ok.
Nunca ia chegar nisso, mesmo consultando todos os livros que tenho aqui não conseguiria. Tem exemplos só com matriz normal.

Obrigado

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com Matriz Multidimensional

Mensagempor Eolo » 27 Fev 2018 21:06

Poka,

Deixa eu fazer uma “correção” sobre o TÍTULO do tópico: a dúvida apresentada não é sobre uma matriz MULTIdimensional, já que são somente 2 dimensões (linhas e colunas). É só uma matriz (bidimensional), como uma simples planilha do Excel.

Já uma matriz multidimensional tem outros planos, como por exemplo uma PASTA de trabalho do Excel, que contém várias planilhas, com suas respectivas linhas e colunas, cujos dados podem ser agrupados.

Pra começar, imagina a matriz VENDAS (bidimensional):
[Dia Venda Dinheiro Fiado]
dia1 100 75 25
dia2 110 60 50...
dia31 95 35 60

Quer o fiado do dia 02? VENDAS[2,4] -> segunda linha, quarta coluna.
Feito.

Agora, imagina que a matriz VENDAS tem outra dimensão, além de linhas e colunas, para conter os dados de 10 filiais. Aqui é que entra o conceito de Multidimensional: o Plano1 mostra os dados da Filial1 (com suas linhas e colunas), o Plano2 mostra a Filial2 (idem) e assim por diante.

Quer o total geral de FIADO do dia 02, incluindo todos os planos (filiais)?
É só somar:
VENDAS[1,2,4] -> fiado da filial 1, dia 2, coluna 4
+VENDAS[2,2,4] -> fiado da filial 2, dia 2, coluna 4
+VENDAS[3,2,4] -> fiado da filial 3, dia 2, coluna 4
etc.

Bão, não sei afirmar que se existe algum limite no Harbour quanto ao número de planos, nunca tentei (prefiro usar DBFs temporários), mas trabalhei com uma linguagem chamada APL, muito tempo atrás, e não tinha limite além da memória. Ou seja, você poderia incluir outro plano, como por exemplo PAÍS):
VENDAS[55,1,2,4] -> Brasil, Filial 1, dia 2, coluna 4

Ou ainda região:
VENDAS[5,55,1,2,4] -> América do Sul, Brasil, Filial 1, dia 2, coluna 4

Pra terminar, limitei a coisa ao CONCEITO, não me preocupei com sintaxe, nem entrei no mérito das funções AEVAL etc.
Agora é com você.
Avatar de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes

Ajuda com Matriz Multidimensional

Mensagempor Poka » 28 Fev 2018 09:00

Bom dia

Deixa eu fazer uma “correção” sobre o TÍTULO do tópico: a dúvida apresentada não é sobre uma matriz MULTIdimensional, já que são somente 2 dimensões (linhas e colunas). É só uma matriz (bidimensional), como uma simples planilha do Excel.


Eolo só dei um exemplo patético, essa matriz pode vir com 10, 20 30 colunas, depende da seleção do usuário para emitir relatórios.

Mas já deu certo aqui.

Obrigado

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com Matriz Multidimensional

Mensagempor Poka » 19 Mai 2018 11:29

Olá a todos

voltando ao tópico.

tenho 2 matrizes multidimensional com vários vetores

m1 e m2

quero juntar m2 com m1
tentei com acopy mas não deu certo

alguém pode dar uma ajuda?

Obrigado

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com Matriz Multidimensional

Mensagempor JoséQuintas » 19 Mai 2018 19:53

Não sei se entendi: m1 vai ficar com o que tinha mais m2?

FOR EACH oElement IN m2
   AAdd( m1, oElement )
NEXT
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Matriz Multidimensional

Mensagempor Poka » 19 Mai 2018 20:32

Valeu Quintas, deu certo, era isso mesmo que eu precisava.

Obrigado, um abraço.

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Bing [Bot], Google [Bot], Google Adsense [Bot] e 8 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