Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #79813
    gkereki
    Participante

      Hola, tengo un caso en que hay items simples y complejos. Ej: una bicicleta esta compuesta de 2 ruedas, cada una de las cuales estan compuestas por 28 rayos y 1 aro mismo. Necesitaría poder hacer una consulta que me diga cuangos aros y rayos necesitaría para hacer una bicicleta.

      Tengo una tabla:
      tarjetas (id_tarjeta, tarjeta)

      y Tarj_comps (id_tjr_comp, cantidad, articulo, id_tarjeta_padre, id_tarjeta_comp)

      Como datos de ejemplo tendria (los articulos simples no irían en las tarjetas, sino directamente en los componentes):
      Tarjetas:
      1,Bicicleta
      2, Manubrio
      3, Rueda

      TARJ_COMPS:
      (1,2,,1,3): esto sería que una bicicleta tiene 2 tarjetas de tipo rueda
      (2,18,’RAYO’,3,
      ): esto sería que una rueda (tarjeta 3) tiene 18 rayos
      (3,1,’ARO’,3,
      ): esto sería que la rueda (tarjeta 3) tiene 1 aro
      (4,1,
      ,1,2): esto sería que la bicicleta tiene 1 tarjeta de tipo manubrio.

      Como les decía antes, necesitaría saber cuánto de cada artículo básico (los tarj_comps que no tienen id_tarjeta_comp) necesito para hacer una bicicleta.

      Estuve haciendo algunas pruebas pero no he tenido suerte. He podido sacar el “listado” de anidamiento, pero no multiplicar cada componente por su cantidad (es decir, que si la bicicleta tiene 2 ruedas y cada rueda 18 rayos, necesito 36 rayos en total). ¿Podrán ayudarme?

      Gracias y saludos,
      Griselda

      #79814
      DanielB
      Participante

        a ver si esto te sirve

        select sum(a.cantidad), a.id_tjr_comp, t.TARJETA, a.articulo
        from
        (SELECT ID_TJR_COMP, CANTIDAD, ID_TARJETA_COMP, tc.id_tarjeta_padre, tc.ARTICULO
        FROM TARJ_COMPS tc
        CONNECT BY PRIOR ID_TARJETA_COMP=ID_TARJETA_PADRE) a, tarjetas t, tarj_comps tc1
        where t.ID_TARJETA=a.id_tarjeta_padre
        and tc1.ID_TARJETA_COMP=t.ID_TARJETA
        group by a.id_tjr_comp, t.TARJETA, a.articulo
        order by a.id_tjr_comp

        #79815
        DanielB
        Participante

          SORRY LO ANTERIOR NO ESTA BIEN

          a ver esta

          select articulo_basico.articulo_b, articulo_basico.cantidad * nvl(tc1.cantidad,1)
          from (SELECT distinct ID_TJR_COMP, CANTIDAD, ID_TARJETA_COMP, tc.id_tarjeta_padre, tc.ARTICULO,
          nvl(t.TARJETA, articulo) articulo_b
          FROM TARJ_COMPS tc
          , tarjetas t
          where t.ID_TARJETA(+)=tc.ID_TARJETA_comp
          CONNECT BY PRIOR ID_TARJETA_comp=id_tarjeta_padre) articulo_basico, tarj_comps tc1
          where articulo_basico.ID_TARJETA_PADRE=tc1.ID_TARJETA_COMP(+)

          aqui el unico tema es que no debiera haber tarjetas que tengan como tarjeta_comps otra tarjeta, excepto el principal(en el ejemplo la bicicleta)
          y a su vez todo elemento que lleve valor en articulo no debe tener hijos en tarj_comps

          saludos

          #79817
          DanielB
          Participante

            solamente los articulos sin id_tarjeta_comp

            select articulo_basico.articulo_b, articulo_basico.cantidad * nvl(tc1.cantidad,1), articulo_basico.id_tarjeta_comp
            from (SELECT distinct ID_TJR_COMP, CANTIDAD, ID_TARJETA_COMP, tc.id_tarjeta_padre, tc.ARTICULO,
            nvl(t.TARJETA, articulo) articulo_b
            FROM TARJ_COMPS tc
            , tarjetas t
            where t.ID_TARJETA(+)=tc.ID_TARJETA_comp
            CONNECT BY PRIOR ID_TARJETA_comp=id_tarjeta_padre) articulo_basico, tarj_comps tc1
            where articulo_basico.ID_TARJETA_PADRE=tc1.ID_TARJETA_COMP(+)
            and articulo_basico.id_tarjeta_comp IS NULL

            #79825
            gkereki
            Participante

              Hi, primero que nada GRACIAS!

              Estuve probando y el problema es que el mismo componente podría ser usado en más de una tarjeta. Es decir, volviendo al ejemplo de la bicicleta, si luego tuviera también “bicicleta de niño” que tiene 2 ruedas, 1 manubrio y 1 bocina de superman, al hacer el conteo, traería 4 ruedas, 2 manubrios, 1 bocina …

              ¿Me explico?

              Esta complicado …… de alguna manera habría que poder restringir a que arranque a partir de una cierta tarjeta (de ahí para abajo) de forma tal de no considerar las otras …

              Yo hice la prueba poniendo esto:

              select articulo_b, sum( cantidad)
              from (
              select articulo_basico.articulo_b,
              articulo_basico.cantidad * nvl(tc1.cantidad,1) cantidad,
              articulo_basico.id_tarjeta_comp
              from (SELECT distinct ID_TRj_COMP,
              CANTIDAD,
              ID_TARJETA_COMP,
              tc.id_tarjeta_padre,
              tc.ARTICULO,
              nvl(t.TARJETA, articulo) articulo_b
              FROM TARJ_COMPS tc
              , tarjetas t
              where t.ID_TARJETA(+)=tc.ID_TARJETA_comp
              start with id_tarjeta_padre=89
              CONNECT BY PRIOR ID_TARJETA_comp=id_tarjeta_padre) articulo_basico,
              tarj_comps tc1
              where articulo_basico.ID_TARJETA_PADRE=tc1.ID_TARJETA_COMP(+)
              and articulo_basico.id_tarjeta_comp IS NULL)
              group by articulo_b

              Y me trajo de más …
              Te cuento los datos que tengo:
              Tarjeta 90:
              articulo A, 7 unidades
              B: 5 unids
              C: 3 unids

              Tarjeta 1:
              A, 1 unidad
              D, 1 unidad

              Tarjeta 89:
              Tarjeta 1, 1 unidad
              Tarjeta 90, 3 unidades
              articulo E, 3 unidades
              articulo F, 2 unids
              articulo C, 7 unids

              El resumen de artículos de la tarjeta 89 debería ser:
              A, 22 unidades
              B, 15
              C, 16
              D, 1
              E, 3
              F, 2

              Sin embargo me da:
              A, 53
              B, 35
              C, 28
              D, 4
              E, 3
              F, 2

              Supongo que eso es porque la misma tarjeta 1, por ejemplo, está usada en otras tarjetas también …

              Gracias,

              #79839
              gkereki
              Participante

                YA LE ENCONTRE LA VUELTA!!!

                Con el prior cant se puede obtener la cantidad de la tarjeta padre y con eso multiplicar a los hijos ….

                select id_tarjeta, articulo, sum(cant_mult) cantidad
                from (
                select sys_connect_by_path(t.id_tarjeta_padre,’/’) path,
                substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2,
                decode(instr( substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2),’/’),
                0,length(substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2))+1,
                instr( substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2),’/’)-1)) id_tarjeta,
                instr( substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2),’/’) in_str,
                t.id_trj_comp,
                articulo,
                cantidad cant_lin,
                id_tarjeta_comp,
                id_tarjeta_padre,
                nvl(prior cantidad,1)* cantidad cant_mult
                from tarj_comps t
                –start with id_tarjeta_padre=117
                connect by prior id_tarjeta_comp = id_tarjeta_padre)
                where articulo is not null
                group by id_tarjeta, articulo

                Gracias!!!
                Griselda

              Visualizando 6 posts - 1 até 6 (de 6 do total)
              • Você deve fazer login para responder a este tópico.