Salvar valor de um nível para uso futuro em uma função recursiva

3 respostas
leofdasilva

Boa tarde a todos.

Estou trabalhando na minha primeira função recursiva e estou com um problema.

Essa função percorre uma tabela do banco em seus vários níveis para montar a estrutura de um Produto (igual à arvore do Windows Explorer).

Minha dúvida é:

O código percorre a tabela e faz alguns ifs para identificar se os itens tem uma estrutura. Quando esse item tem uma estrutura, eu pego a quantidade dele e salvo na variável quantSubEstrutura. Porém supomos que uma estrutura tenha 3 níveis, o produto A com a quantidade de 10, o produto B com 20 e o produto C que é o último nível com a quantidade de 30.

O que fica salvo na variável é apenas o 30. Como faço pra manter salvo os outros dois níveis? Pois preciso usá-los mais a frente?

Segue o código:

package pkg.fonte;

import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import pkg.dao.Banco;

public class Recursividade {

    //variáveis de controle de conteúdo publicas à classe Recursividade:
    private static float custo = 0;
    private static String quantSubEstrutura;

    //encapsulamento get da variável custo:
    public static float getCusto() {
        return custo;
    }

    //encapsulamento set da variável custo:
    public static void setCusto(float custo) {
        Recursividade.custo = custo;
    }

    public static void retornaCusto(String par) throws SQLException {

        //objeto de comunicação com a base de dados:
        Banco dao = new Banco();

        //lista do tipo <Encapsulamento> de retorno das consultas do banco:
        ArrayList<Encapsulamento> list;

        //verifica se existe estrutura para o parâmetro (par) informado:
        if (!dao.verificaEstrutura(par).equals("")) {

            //caso tenha estrutura, cria o objetos de formatação decimal "df":
            DecimalFormat df = new DecimalFormat("#######.#######");

            //populando o objeto "list" com o retorno da consulta ao banco:
            list = dao.listEstrutura(par);

            //for para varrer a lista "list" e tratar o conteúdo:
            for (int i = 0; i < list.size(); i++) {

                //verifica se o item da posição get(i).getB1_UM() é igual aos insumos de Matéria Prima (KG, ML, G):
                if (list.get(i).getB1_UM().equals("KG") || list.get(i).getB1_UM().equals("ML") || list.get(i).getB1_UM().equals("G")) {

                    //verifica se o item na posição list.get(i).getG1_COMP() não tem estrutura:
                    if (dao.verificaEstrutura(list.get(i).getG1_COMP()).equals("")) {

                        //exibo na tela os insumos em forma de relatório de estrutura:
                        System.out.println(list.get(i).getG1_COD() + "|"
                                + list.get(i).getG1_COMP() + "|"
                                + df.format(Float.parseFloat(list.get(i).getB1_UPRC())) + "|"
                                + df.format(list.get(i).getG1_QUANT()) + "|"
                                + df.format(list.get(i).getG1_QUANT() * Float.parseFloat(quantSubEstrutura.replace(",", "."))) + "|"
                                + quantSubEstrutura);

                    } else {//caso tenha:   

                        //se ele tiver uma estrutura, pego a quantidade dessa subestrutura e adiciono na variável "quant" para uso posterior:
                        quantSubEstrutura = df.format(list.get(i).getG1_QUANT());

                        //exibo na tela os insumos em forma de relatório de estrutura:
                        System.out.println(list.get(i).getG1_COD() + "|"
                                + list.get(i).getG1_COMP() + "|"
                                + df.format(Float.parseFloat(list.get(i).getB1_UPRC())) + "|"
                                + df.format(list.get(i).getG1_QUANT()) + "|"
                                + quantSubEstrutura);
                    }

                    //calculo para encontrar o custo desse item tomando como base sua quantidade em % convertendo em quantidade e multiplicando por seu último preço.
                    //essa variável "custo" irá acumular todos os custos de todos os produtos "custo += ..." que passarem pelo for e forem do tipo MP:
                    custo += (Float.parseFloat(list.get(i).getB1_UPRC()) * (list.get(i).getG1_QUANT() * Float.parseFloat(quantSubEstrutura.replace(",", "."))));

                    //função recursiva, chamo novamente o metodo retornaCusto() e envio o código do insumo componente "get(i).getG1_COMP()" para verificar se o mesmo também em extrutura:
                    retornaCusto(list.get(i).getG1_COMP());

                } else {

                    //caso o item seja um insumo de EB ou BM do tipo UN (unidade), verifico se ele também tem uma estrutura:
                    if (!dao.verificaEstrutura(list.get(i).getG1_COMP()).equals("")) {
                        //se ele tiver uma estrutura, pego a quantidade dessa subestrutura e adiciono na variável "quant" para uso posterior:
                        quantSubEstrutura = df.format(list.get(i).getG1_QUANT());
                    }

                    //exibo na tela os insumos em forma de relatório de estrutura:
                    System.out.println(list.get(i).getG1_COD() + "|"
                            + list.get(i).getG1_COMP() + "|"
                            + df.format(Float.parseFloat(list.get(i).getB1_UPRC())) + "|"
                            + df.format(list.get(i).getG1_QUANT()) + "|"
                            + quantSubEstrutura);

                    //calculo para encontrar o custo desse item tomando como base sua quantidade em % convertendo em quantidade e multiplicando por seu último preço.
                    //essa variável "custo" irá acumular todos os custos de todos os produtos "custo += ..." que passarem pelo for e forem do tipo EB e BM:
                    custo += (Float.parseFloat(list.get(i).getB1_UPRC()) * list.get(i).getG1_QUANT());

                    //função recursiva, chamo novamente o metodo retornaCusto() e envio o código do insumo componente "get(i).getG1_COMP()" para verificar se o mesmo também em extrutura:
                    retornaCusto(list.get(i).getG1_COMP());

                }
            }
        }
    }
}

Fico no aguardo e a disposição para mais esclarecimentos.

3 Respostas

leofdasilva

Alguém? Please?

ViniGodoy

Como você gostaria que os dados se acumulassem? Uma forma é fazer uma concatenação, ao invés de sobrescrever o dado:

quantSubEstrutura += " " + df.format(list.get(i).getG1_QUANT());

Ou será que seria o caso de quantSubEstrutura ser um List?

leofdasilva

Opa…Transformar o quantSubEstrutura em um list é uma boa!

Mais como faço por exemplo pra acessar o valor que foi criado na posição dois por exemplo?

Segue exemplo para ilustrar:

L/C              A                           B                     C
1          CÓDIGO PRODUTO             QUANTIDADE EM %       QUANTIDADE REAL
2  PRODUTO A                                 0                    0,133 -----> essa quantidade fica salva em quantSubEstrutura
3      MATERIA PRIMA A                       0,03
4      MATERIA PRIMA B                       0,018
5      MATERIA PRIMA C                       0                    0,002
6           SUB MATERIA PRIMA A              0,0005
7           SUB MATERIA PRIMA B              0,004
8           SUB MATERIA PRIMA C              0,9955

Explicando: para eu saber a quantidade real dos itens MATERIA PRIMA A e B eu faço a quantidade em % vezes a quantidade real do produto pai que seria PRODUTO A (0,133).
Então a função recursiva vai até o item A e B e faz a conta. Quando ela chega no item C, eu pergunto se ela tem uma estrutura própria ou uma subestrutura. Se sim, então eu pego a quantidade real do item MATERIA PRIMA C (0,002) e atribuo á variavel quantSubEstrutura.

Partindo do principio de que quantSubEstrutura seja uma lista, a primeira posição ficaria 0,133 e a segunda posição 0,002.

Como eu faço no meu código para saber que o nível da subestrutura (do produto MATERIA PRIMA C) acabou e agora eu não uso a posição 2 e volto pra posição 1?

Fico o aguardo. Espero que de pra entender.

Criado 21 de fevereiro de 2013
Ultima resposta 21 de fev. de 2013
Respostas 3
Participantes 2