Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Dear Experts,
I have two tables as shown below.
First table is showing Production order Details & second is showing Billing Table.
In few Billing No, Production order is linked, but in few it is missing.
We have a requirement - If Production Order is missing in Billing Table then pick last 4 (descending order) production orders of same material & populate in the Billing Table.
Please suggest how to map the requirement. Sample qvw is attached herewith.
Maybe this:
Prd_Ord:
LOAD *, AutoNumber(PrdOrd,P_Material) as Counter
INLINE [
PrdOrd, P_Material, P_Qty
P1, M1, 10
P2, M2, 20
P3, M3, 30
P100, M1, 1000
P200, M2, 2000
P300, M3, 3000
P4, M4, 40
P5, M4, 50
P6, M4, 60
P7, M4, 70
P8, M4, 80
P9, M4, 90
P10, M4, 100
P11, M5, 110
P12, M5, 120
P13, M5, 130
];
//===========================================================================
Join (Prd_Ord)
Load P_Material,
Max(Counter) AS MaxCounter
Resident Prd_Ord
Group By P_Material;
//===========================================================================
MapP:
mapping
LOAD P_Material,
if(SubStringCount(V,'|')>3, left(V,index(V,'|',4)-1),V) as V;
LOAD P_Material,
concat(PrdOrd, '|',-Counter) as V
Resident Prd_Ord
Group by P_Material;
MapQ:
mapping LOAD PrdOrd, P_Qty
Resident Prd_Ord;
Billing:
LOAD *, Applymap('MapQ',B_PrdOrd) as B_Qty;
LOAD B_Material,
SubField(B_PrdOrd,'|') as B_PrdOrd;
LOAD BillNo,
B_Material,
if(len(trim(B_PrdOrd)),B_PrdOrd,ApplyMap('MapP',B_Material)) as B_PrdOrd
INLINE [
BillNo, B_Material, B_PrdOrd
B1, M1, P1
B2, M2, P2
B3, M3, P3
B4, M4,
B5, M5,
] ;
Hi Girish,
Could you test the script below and come back to know if it's your expected result :
Prd_Ord:
LOAD * INLINE [
PrdOrd, B_Material, P_Qty
P1, M1, 10
P2, M2, 20
P3, M3, 30
P4, M4, 40
P5, M4, 50
P6, M4, 60
P7, M4, 70
P8, M4, 80
P9, M4, 90
P10, M4, 100
P11, M5, 110
P12, M5, 120
P13, M5, 130
];
Join
Billing:
LOAD * INLINE [
BillNo, B_Material, P_PrdOrd
B1, M1, P1
B2, M2, P2
B3, M3, P3
B4, M4,
B5, M5,
];
François
I get this table:
See attached qvw for a possible solution.
Thanks Gysbert Wassenaar,
But we wanted to fetch (last 4) production orders where the link was missing.
Just modify & twisted you solution a little bit & get the desired results.
I want to know is there any better way to handle this requirement? .
Regards,
Girish.
//===========================================================================
Prd_Ord:
LOAD *, AutoNumber(PrdOrd,P_Material) as Counter INLINE [
PrdOrd, P_Material, P_Qty
P1, M1, 10
P2, M2, 20
P3, M3, 30
P100, M1, 1000
P200, M2, 2000
P300, M3, 3000
P4, M4, 40
P5, M4, 50
P6, M4, 60
P7, M4, 70
P8, M4, 80
P9, M4, 90
P10, M4, 100
P11, M5, 110
P12, M5, 120
P13, M5, 130
];
//===========================================================================
Join (Prd_Ord)
Load P_Material, Max(Counter) AS MaxCounter
Resident Prd_Ord
Group By P_Material;
//===========================================================================
Billing:
Load BillNo, B_Material INLINE [
BillNo, B_Material, B_PrdOrd
B1, M1, P1
B2, M2, P2
B3, M3, P3
B4, M4, 0
B5, M5, 0
] Where B_PrdOrd = 0; // Because we want to populate only missing orders
//===========================================================================
//Join(Billing)
Left Join
Load PrdOrd AS B_PrdOrd, P_Material AS B_Material, P_Qty AS B_Qty //
Resident Prd_Ord
Where MaxCounter - Counter <= 3;
//===========================================================================
Billing1: // Load Billing table with renaming fields where Prd Ord link is exist
NoConcatenate
Load BillNo AS BillNo1, B_Material AS B_Material1, B_PrdOrd AS B_PrdOrd1 INLINE [
BillNo, B_Material, B_PrdOrd
B1, M1, P1
B2, M2, P2
B3, M3, P3
B4, M4, 0
B5, M5, 0
] Where B_PrdOrd <> 0;
//===========================================================================
Left Join // Left Join to get Prd ord Qty
Load PrdOrd AS B_PrdOrd1, P_Material AS B_Material1, P_Qty AS B_Qty1
Resident Prd_Ord;
//===========================================================================
Join(Billing) // Join the BIlling1 table with (main) Billing Table
Load BillNo1 AS BillNo, B_Material1 AS B_Material, B_PrdOrd1 AS B_PrdOrd, B_Qty1 AS B_Qty
Resident Billing1;
//===========================================================================
Maybe this:
Prd_Ord:
LOAD *, AutoNumber(PrdOrd,P_Material) as Counter
INLINE [
PrdOrd, P_Material, P_Qty
P1, M1, 10
P2, M2, 20
P3, M3, 30
P100, M1, 1000
P200, M2, 2000
P300, M3, 3000
P4, M4, 40
P5, M4, 50
P6, M4, 60
P7, M4, 70
P8, M4, 80
P9, M4, 90
P10, M4, 100
P11, M5, 110
P12, M5, 120
P13, M5, 130
];
//===========================================================================
Join (Prd_Ord)
Load P_Material,
Max(Counter) AS MaxCounter
Resident Prd_Ord
Group By P_Material;
//===========================================================================
MapP:
mapping
LOAD P_Material,
if(SubStringCount(V,'|')>3, left(V,index(V,'|',4)-1),V) as V;
LOAD P_Material,
concat(PrdOrd, '|',-Counter) as V
Resident Prd_Ord
Group by P_Material;
MapQ:
mapping LOAD PrdOrd, P_Qty
Resident Prd_Ord;
Billing:
LOAD *, Applymap('MapQ',B_PrdOrd) as B_Qty;
LOAD B_Material,
SubField(B_PrdOrd,'|') as B_PrdOrd;
LOAD BillNo,
B_Material,
if(len(trim(B_PrdOrd)),B_PrdOrd,ApplyMap('MapP',B_Material)) as B_PrdOrd
INLINE [
BillNo, B_Material, B_PrdOrd
B1, M1, P1
B2, M2, P2
B3, M3, P3
B4, M4,
B5, M5,
] ;
Prd_Ord:
LOAD purgechar(PrdOrd, 'P') as PrdOrdSort, * INLINE [
PrdOrd, B_Material, P_Qty
P1, M1, 10
P2, M2, 20
P3, M3, 30
P4, M4, 40
P5, M4, 50
P6, M4, 60
P7, M4, 70
P8, M4, 80
P9, M4, 90
P10, M4, 100
P11, M5, 110
P12, M5, 120
P13, M5, 130
];
left join (Prd_Ord)
Billing:
LOAD * INLINE [
BillNo, B_Material, P_PrdOrd
B1, M1, P1
B2, M2, P2
B3, M3, P3
B4, M4,
B5, M5,
];
Final_Prd_Ord:
load BillNo, B_Material, PrdOrd, P_Qty, id
where len(trim(P_PrdOrd))>0 or id <= 4;
NoConcatenate load *, if(peek(B_Material)<>B_Material, 1, peek(id)+1) as id
resident Prd_Ord
order by B_Material, PrdOrdSort desc;
DROP Table Prd_Ord;
Hi Girish,
Can you mark a post as correct to close this issue?
Thanks,
BR,
François
Too Good Gysbert Wassenaar.
Thank you very much. It resolves our issue.