Announcements
cancel
Showing results for
Did you mean:
Creator

## Pick last 4 values from another table

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.

1 Solution

Accepted Solutions

Maybe this:

```Prd_Ord:
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)
Max(Counter) AS MaxCounter
Resident Prd_Ord
Group By P_Material;
//===========================================================================

MapP:
mapping
if(SubStringCount(V,'|')>3, left(V,index(V,'|',4)-1),V) as V;
concat(PrdOrd, '|',-Counter) as V
Resident Prd_Ord
Group by P_Material;

MapQ:
Resident Prd_Ord;

Billing:
SubField(B_PrdOrd,'|') as B_PrdOrd;
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,
] ;

```

talk is cheap, supply exceeds demand
8 Replies
Partner - Creator III

Hi Girish,

Could you test the script below and come back to know if it's your expected result :

Prd_Ord:

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:

BillNo, B_Material, P_PrdOrd

B1, M1, P1

B2, M2, P2

B3, M3, P3

B4, M4,

B5, M5,

];

François

Partner - Creator III

I get this table:

See attached qvw for a possible solution.

talk is cheap, supply exceeds demand
Creator
Author

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)

Resident Prd_Ord

Group By P_Material;

//===========================================================================

Billing:

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:
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)
Max(Counter) AS MaxCounter
Resident Prd_Ord
Group By P_Material;
//===========================================================================

MapP:
mapping
if(SubStringCount(V,'|')>3, left(V,index(V,'|',4)-1),V) as V;
concat(PrdOrd, '|',-Counter) as V
Resident Prd_Ord
Group by P_Material;

MapQ:
Resident Prd_Ord;

Billing:
SubField(B_PrdOrd,'|') as B_PrdOrd;
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,
] ;

```

talk is cheap, supply exceeds demand
MVP

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:

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;

Partner - Creator III

Hi Girish,

Can you mark a post as correct to close this issue?

Thanks,

BR,

François

Creator
Author

Too Good Gysbert Wassenaar.

Thank you very much. It resolves our issue.

Community Browser