Página 1 de 1

Dúvidas com Arrays

Enviado: 19 Abr 2005 17:45
por Junior
Olá amigos... espero q estejam todos bem... pra quem já me conhece, to retornando aos poucos ao Fórum, pra quem não me conhece, MUITO PRAZER, frequento esse Fórum há anos, desde ha tempos do nosso saudoso fórum dos programadores...

Bom, seguinte... pepinos.... como não sou muito amiguinho de arrays, vetores e matrizes, etc... peço ajuda.

Tenho as seguintes informações :

Código: Selecionar todos

UNIDADE    CENTRO 
NEGOCIO    CUSTO    VALOR
----------------------------------- 
FORJARIA  -  40102  -   10,00
FORJARIA  -  40104  -   20,00
FORJARIA  -  40102  -   10,00
USINAGEM  -  40105  -   40,00
FORJARIA  -  40102  -   60,00
USINAGEM  -  40108  -   80,00

Eu to precisando, deixar isso assim num Relatório :

FORJARIA  - 40102 - 80,00 ( soma de 60,00 + 10,00 + 10,00 )
            40104 - 20,00

USINAGEM  - 40105 - 40,00
            40108 - 80,00                   

Ate ai tranquilo, isto esta sendo feito hj em dia em Base temporaria, porémmmmmmmmmmmmm eu quero passar isso prs ARRAY, pra ficar mais simples e pratico.

Como faço ??? se alguém puder me dar uma dica de como montar uma array desse tipo, acredito q seja bidirecional, e tb imprimir os valores, agradeceria mto...

Fico no aguardo pessoal, brigadão desde já.

Abraços.

Enviado: 19 Abr 2005 19:14
por Grings
.

Enviado: 19 Abr 2005 20:40
por Junior
Ola Grings, obrigado pela atenção, mas acho q vc não entendeu a minha dúvida.

A dúvida é como montar a Array, a lógica já funciona, porém com arquivo temporário, dbf temporário aonde os valores da base são somandos conforme o centro de custo.

Quero passar isso pra uma matriz/array, e a partir disso trabalhar os dados, somando e imprimindo.

Sei q começo por :

aTotal := {}
aScan({Centro de Custo, bla bla bla})

mas como termino ? alias, como devo proceder o codigo inteiro ?

a dúvida ainda esta de pé.... :-o

Enviado: 19 Abr 2005 23:19
por Irineu
Ola Junior, como vai ?

Jr. eu utilizo assim:

m_array := {}
do while .not. eof()
..........pego os campos que mecessito aqui

.........pesquiso em m_array se exite o campo que nao quero duplicar

.........se existir, apenas modifico o valor

.........se nao exitir, adiciono na matriz

skip
enddo

No seu caso acredito que voce tera que comparar as duas colunas da matriz, pois uma voce apenas nao que que apareca o nome quando duplicado e na segunda coluna voce nao quer duplicar nomes.

Enviado: 20 Abr 2005 00:53
por Dudu_XBase
Boa Noite Senhores!
Complementando a resposta do Irineu.
Junior não esqueça que a Matriz tem limites de elementos, se sua rotina exceder essa capacidade aparecerá um run time error.
Em relatórios utilizo dessa forma para totalizar por grupos no finais, agrupando os valores nas matrizes.

Código: Selecionar todos

aMatriz := {}
while !eof()
  // Pesquiso na Matriz Unidade e Centro de Custo
  nPos := ascan (aMatriz, {|x| x[1]+x[2] == UNIDADE+CENTRO})

  if (nPos == 0) // senão encontrar adiciono
    aadd ( aMatriz, {UNIDADE,CENTRO,VALOR})
  else // se Encontrar eu somo
    aMatriz [nPos,3] := aMatriz [nPos,3] + VALOR
  endif

  dbskip()
enddo
   
// Para ordenar por Unidade e Centro de Custo...
aSort(aMatriz,,,{|x,y| x[1]+x[2] < y[1]+y[2]})   

// Para imprimir
if len(aMatriz) > 0
  Set Device to Printer
  cUnidade := ""
  For i:=1 to len(aMatriz)
    if cUnidade <> aMatriz[i,1]
      if i=1
        cUnidade := aMatriz[i,1]
      endif
      ? "Unidade "+cUnidade
      cUnidade := aMatriz[i,1]
      ? " "
    endif

    ? aMatriz[i,2]+"-"+str(aMatriz[i,3],10,2)
 
  Next
  Eject
  Set Device to Screen
Endif

Enviado: 20 Abr 2005 15:31
por Junior
Obrigado a todos pela ajuda, em especial ao meu amigo de net Dudu... era exatamente isso, deu certo sim... apenas fiz algumas mudanças no teu código mas a essencia continua.

A rotina é mto complexa, dentro de uma Ficha de Custo aonde são apresentados os Componentes do Produto tenho que somar as Unidades de Negócio, Fundição, Forjaria, Trat.Térmico e Usinagem, e ainda pra piorar tenho que cascatear tudo isso em Centro de Custos e ver qual o valor pra cada um referente ao Faturamento Total, urgh...

A rotina e a lógica já funcionavam, ou seja, tenho uma rotina que faz isso em Banco de Dados temporário, mas o tempo de execução é mto mais lento que uma array.... por isso precisei mudar.

Ah, e os elementos não passam de 4096 não... entao to longe do erro de RunTime.

Brigadão !