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é....

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 !