Dúvidas com Arrays

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Junior
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 19 Ago 2003 17:44
Localização: Bragança Paulista

Dúvidas com Arrays

Mensagem 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.
Source com farinha....
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

.
Editado pela última vez por Grings em 11 Dez 2009 15:31, em um total de 1 vez.
Junior
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 19 Ago 2003 17:44
Localização: Bragança Paulista

Mensagem 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
Source com farinha....
Irineu
Usuário Nível 2
Usuário Nível 2
Mensagens: 61
Registrado em: 13 Ago 2003 22:01
Localização: Curitia-PR
Contato:

Mensagem 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.
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem 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


________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle




Junior
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 19 Ago 2003 17:44
Localização: Bragança Paulista

Mensagem 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 !
Source com farinha....
Responder