Página 1 de 1

Ajuda com Matriz Multidimensional

Enviado: 26 Fev 2018 10:43
por Poka
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

Ajuda com Matriz Multidimensional

Enviado: 26 Fev 2018 20:54
por Paredes01
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

Ajuda com Matriz Multidimensional

Enviado: 27 Fev 2018 10:10
por Poka
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

Código: Selecionar todos

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:={}

Código: Selecionar todos

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

Ajuda com Matriz Multidimensional

Enviado: 27 Fev 2018 10:49
por Jairo Maia

Código: Selecionar todos

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().

Ajuda com Matriz Multidimensional

Enviado: 27 Fev 2018 11:03
por Poka
Valeu Jairo, deu certo

Obrigado, um abraço

Poka

Ajuda com Matriz Multidimensional

Enviado: 27 Fev 2018 11:13
por JoséQuintas
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.

Código: Selecionar todos

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

Código: Selecionar todos

aOutra := {}
FOR EACH oElement IN aSuaLista
   IF oElement[ 4 ] == "SP"
      AAdd( aOutra, aClone( oElement ) )
   ENDIF
NEXT

Ajuda com Matriz Multidimensional

Enviado: 27 Fev 2018 13:59
por asimoes
Usando aEval

Código: Selecionar todos

 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.

Ajuda com Matriz Multidimensional

Enviado: 27 Fev 2018 16:27
por Poka
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

Ajuda com Matriz Multidimensional

Enviado: 27 Fev 2018 21:06
por Eolo
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ê.

Ajuda com Matriz Multidimensional

Enviado: 28 Fev 2018 09:00
por Poka
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

Ajuda com Matriz Multidimensional

Enviado: 19 Mai 2018 11:29
por Poka
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

Ajuda com Matriz Multidimensional

Enviado: 19 Mai 2018 19:53
por JoséQuintas
Não sei se entendi: m1 vai ficar com o que tinha mais m2?

Código: Selecionar todos

FOR EACH oElement IN m2
   AAdd( m1, oElement )
NEXT

Ajuda com Matriz Multidimensional

Enviado: 19 Mai 2018 20:32
por Poka
Valeu Quintas, deu certo, era isso mesmo que eu precisava.

Obrigado, um abraço.


Poka