SAP R/3 SQL DB2 BOM Explosion

ОБНОВЛЕНО

Мне нужно получить спецификацию со всеми компонентами, в настоящее время использую Tc. CK86, но это не дает достаточно информации, поэтому я хочу сделать это с помощью SQL, я работаю с оракулом и не знаю, как это сделать в DB2 R/3, у меня нет доступа к построителю запросов или быстрому просмотру. , но у меня есть доступ для чтения через SQL, сейчас я пытаюсь найти способ получить эту информацию с помощью таблиц:

  • Материал MAST для ссылки на спецификацию
  • Заголовок спецификации СТКО
  • Элемент спецификации STPO

У кого-нибудь из вас есть решение для этого?

В Oracle я сделал что-то вроде следующего:

SELECT DISTINCT LEVEL
    ,sys_connect_by_path(msil.segment1, ' @ ') AS "BOM TREE"
    ,msi.segment1
    ,lpad(' ', LEVEL, '') || msil.segment1 Cod_Component
    ,msil.item_type
    ,msil.description Desc_Component
    ,BIC.component_quantity
    ,msiL.primary_unit_of_measure
FROM mtl_system_items msi
    ,bom_bill_of_materials bom
    ,BOM_INVENTORY_COMPONENTS BIC
    ,MTL_SYSTEM_ITEMS MSIL
WHERE msi.organization_id = 332
    AND BOM.ASSEMBLY_ITEM_ID = MSI.INVENTORY_ITEM_ID
    AND BOM.ORGANIZATION_ID = MSI.ORGANIZATION_id
    AND bom.bill_sequence_id = bic.bill_sequence_id
    AND nvl(bic.disable_date, sysdate) >= SYSDATE
    AND BIC.component_ITEM_ID = MSIL.INVENTORY_ITEM_ID
    AND Bom.ORGANIZATION_ID = MSIL.ORGANIZATION_ID
    AND msil.inventory_item_status_code = 'Active'
    AND msi.inventory_item_status_code = 'Active' 
    connect BY prior bic.component_item_id = bom.assembly_item_id
    START WITH msi.segment1 = trim(:parte)
    ORDER BY 2

Я пытаюсь сделать следующее, пытаясь сделать его простым, но он дает мне ошибку в строке 18, независимо от того, что я пытаюсь, по-видимому, в DB2 мне нужно, чтобы соединение было после START, в моем рабочем примере оракула он сначала подключился , не знаю, имеет ли это значение, но независимо от того, как я это пишу, это выдает ошибку: ОШИБКА [42601] [IBM][DB2/AIX64] SQL0104N Неожиданный токен PRIOR был обнаружен после ASQ19130 'CONNECT BY. Ожидаемые токены могут включать: PRIOR.

Вот что я получил до сих пор:

SELECT DISTINCT level
    ,sys_connect_by_path(msil.stlnr, ' @ ') AS "BOM TREE"
    ,msi.stlnr as parent
    --,lpad(' ', LEVEL, '') || MSIL.MATNR Cod_Component
  --,lpad(' ', LEVEL, '') || MSIL.MATNR as Cod_Component
  ,CAST(SPACE((LEVEL - 1) * 4) || '/' || MSIL.MATNR AS VARCHAR(40)) as Cod_Component
    ,BIC.menge as qty
  ,bic.stlnr as compnumb
    ,msiL.mein as uom
FROM 
   MAST msi
    ,STKO bom
    ,STPO BIC
    ,MAST MSIL
WHERE 
BOM.STLNR = MSI.STLNR
AND BIC.STLNR = MSIL.STLNR 
START WITH msi.MATNR = 'ASQ19130'
CONNECT BY PRIOR BIC.stlnr = bom.stlnr
order by 2

person arana    schedule 14.06.2017    source источник
comment
У вас есть доступ только к серверной части DB2 или вы также можете использовать транзакции разработчика SAP (= OpenSQL)?   -  person Suncatcher    schedule 15.06.2017
comment
Руководство по DB2 есть пример.   -  person mustaccio    schedule 15.06.2017
comment
Только для серверной части db2.   -  person arana    schedule 15.06.2017
comment
@Suncatcher Теперь у меня есть доступ к SQVI, но я никогда раньше им не пользовался.   -  person arana    schedule 20.06.2017
comment
mustaccio спасибо за ваш ценный комментарий, но я также нашел пример в Интернете на страницах IBM, но он также дает мне ошибку, а также руководство не имеет отношения к структуре sap r3.   -  person arana    schedule 24.06.2017


Ответы (1)


Это то, что закончилось, и это работает для меня.

(Отредактировано для исправления)

на случай, если это кому-то понадобится:

WITH myquery (
    root,
    matnr,matd,
    bom_tree,
    lvl,
    parent_stlkn,
    stlkn,
    idnrk,
    meins, menge
) AS (
    SELECT
        m.matnr root,
        m.matnr,MAKT.MAKTX Matd,
        p.idnrk bom_tree,
        1 lvl,
        p.stlkn,
        p.stlkn,
        p.idnrk,
        p.meins, p.menge
    FROM
        mast m 
        JOIN stko k ON k.stlnr = m.stlnr AND K.STLAL=M.STLAL
        JOIN stpo p ON p.stlnr = k.stlnr,makt
        where m.stlal='01' /*and k.stlal='01'*/
        and m.matnr=MAKT.matnr
),x (
    root,
    matnr,matd,
    bom_tree,
    lvl,
    parent_stlkn,
    stlkn,
    idnrk,
    meins, menge
) AS (
    SELECT
        root,
        matnr,matd,
        bom_tree,
        lvl,
        parent_stlkn,
        stlkn,
        idnrk,
        meins, menge
    FROM
        myquery
    UNION ALL
    SELECT
        x1.root,
        x2.matnr,x2.matd,
        x1.bom_tree
         || ' @ '
         || x2.idnrk bom_tree,
        x1.lvl + 1 lvl,
        x1.parent_stlkn,
        x2.stlkn,
        x2.idnrk,
        x2.meins,x2.menge
    FROM
        myquery x1,
        myquery x2
    WHERE
        x2.matnr = x1.bom_tree
        
) SELECT 
    x.matnr,matd Description,
    marc.herkl country,
    eina.urzla country2,
    mbew.stprs comp_price,
    bom_tree,
    lvl,
    stlkn,
    idnrk comp,
    x.meins UOM,
    menge qpa
FROM
    x, marc, mbew, eina
WHERE
    root  = :p
    and mbew.matnr=marc.matnr
    and mbew.matnr=eina.matnr
    and marc.werks=1850
    and idnrk=mbew.matnr
    --and x.matnr=mbew.matnr
    and mbew.bwkey=1850
ORDER BY
    root,
    parent_stlkn,
    lvl,
    stlkn
person arana    schedule 27.02.2020
comment
Большое спасибо! - person sonium; 05.07.2021