Ajuda com Matriz Multidimensional

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

Moderador: Moderadores

Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com Matriz Multidimensional

Mensagem 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
Paredes01
Usuário Nível 2
Usuário Nível 2
Mensagens: 52
Registrado em: 20 Mai 2012 11:22
Localização: Mérida, Yucatán, México

Ajuda com Matriz Multidimensional

Mensagem 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
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com Matriz Multidimensional

Mensagem 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
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Ajuda com Matriz Multidimensional

Mensagem 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().
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 do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com Matriz Multidimensional

Mensagem por Poka »

Valeu Jairo, deu certo

Obrigado, um abraço

Poka
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Matriz Multidimensional

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ajuda com Matriz Multidimensional

Mensagem 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.
►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 do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com Matriz Multidimensional

Mensagem 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
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Ajuda com Matriz Multidimensional

Mensagem 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ê.
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com Matriz Multidimensional

Mensagem 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
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com Matriz Multidimensional

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Matriz Multidimensional

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com Matriz Multidimensional

Mensagem por Poka »

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

Obrigado, um abraço.


Poka
Responder