Conversiones JDE
La siguiente funcion fue creada con el objetivo de replicar la funcion estandard de JDE para convertir entre distintas unidades de medidas.
Plataforma: DB2 5.4 for iSeries
Tablas involucradas:
F41002: Item conversion
F41003: Unit of measure standard conversion
drop function db2dtamart.JDEConvert;
CREATE function db2dtamart.JDEConvert(Item decimal(10,0), FromUOM varchar(3), ToUOM varchar(3), Units float)
returns decimal(19,4)
language sql
not deterministic
reads sql data
begin atomic
declare primaryUOM varchar(3);
declare alternativeUOM varchar(3);
declare PrimaryUnits float;
declare ToUnits float;
declare denominador float;
set denominador = 10000000;
/* This is for the sake of speed mainly */
if Units = 0 then
return 0;
end if;
if rtrim(FromUOM) = rtrim(ToUOM) then
return Units;
end if;
if FromUOM is null or ToUOM is null
or ltrim(FromUOM) = '' or ltrim(ToUOM) = '' then
return 0;
end if;
/* -----------------------------------------------------------------
we know we don't have any conversion directly between the from unit
and the to unit, so what we do is look for a conversion like so...
FromUOM to PrimaryUOM to ToUOM
----------------------------------------------------------------- */
for cfF41002 as
select f.umum fum, f.umrum frum, round(f.umconv/denominador,7) fconv, round(f.umcnv1/denominador,7) fcnv1,
t.umum tum, t.umrum trum, round(t.umconv/denominador,7) tconv, round(t.umcnv1/denominador,7) tcnv1
from pd812dta.f41002 f join pd812dta.F41002 t on t.umitm = f.umitm
where f.umitm = Item
and FromUOM in (f.umum, f.umrum)
and ToUOM in (t.umum, t.umrum)
do
/* This could be slightly simplified, but this way is easier to read I think. */
if fum = FromUOM then
set PrimaryUnits = Units * fcnv1;
else
set PrimaryUnits = (Units / fconv) * fcnv1;
end if;
if tum = ToUOM then
set ToUnits = PrimaryUnits / tcnv1;
else
set ToUnits = (PrimaryUnits * tconv) / tcnv1;
end if;
return ToUnits;
/*return ToUnits;*/
end for;
for cfF41003 as
select f.ucum fum, f.ucrum frum, round(f.ucconv/denominador,7) fconv, 1 / round( f.ucconv /denominador,7) fcnv1
from pd812dta.f41003 f
where f.ucum in ( FromUOM, ToUOM)
and f.ucrum in ( FromUOM, ToUOM)
do
/* This could be slightly simplified, but this way is easier to read I think. */
if fum = toUOM then
set ToUnits = Units * fcnv1;
else
set ToUnits = Units * fconv;
end if;
return ToUnits;
end for;
/* si llego hasta aca es que o pudo convertir*/
/*********************************************/
/* Intentamos otra conversion */
/*********************************************/
set alternativeUOM = '';
set alternativeUOM = ( select distinct ucRUM
from pd812dta.f41003
where ucUM = FromUOM
and ucRUM in ( select distinct umUM
from pd812dta.f41002
where umITM = Item)
);
if alternativeUOM is not null and alternativeUOM <> ''then
set Units = ( select db2dtamart.JDEConvert(Item, FromUOM, alternativeUOM, Units) from sysibm.sysdummy1);
set Units = ( select db2dtamart.JDEConvert(Item, alternativeUOM, ToUOM, Units) from sysibm.sysdummy1);
return Units;
end if;
set alternativeUOM = '';
set alternativeUOM = ( select distinct ucUM
from pd812dta.f41003
where ucRUM = FromUOM
and ucUM in ( select distinct umUM
from pd812dta.f41002
where umITM = Item
)
);
if alternativeUOM is not null and alternativeUOM <> '' then
set Units = ( select db2dtamart.JDEConvert(Item, FromUOM, alternativeUOM, Units) from sysibm.sysdummy1);
set Units = ( select db2dtamart.JDEConvert(Item, alternativeUOM, ToUOM, Units) from sysibm.sysdummy1);
return Units;
end if;
set alternativeUOM = '';
set alternativeUOM = ( select distinct umUM
from pd812dta.f41002
where umITM = Item
and umUM in ( select distinct ucUM from pd812dta.f41003 where ucRUM = toUOM )
and umUM not in (FromUOM)
);
if alternativeUOM is not null and alternativeUOM <> '' then
set Units = ( select db2dtamart.JDEConvert(Item, FromUOM, alternativeUOM, Units) from sysibm.sysdummy1);
set Units = ( select db2dtamart.JDEConvert(Item, alternativeUOM, ToUOM, Units) from sysibm.sysdummy1);
return Units;
end if;
return null;
end;
COMMENT ON SPECIFIC FUNCTION DB2DTAMART.JDEConvert
IS ' V1.4 - Convierte cantidades entre distintas unidades de medida' ;
Algunos ejemplos de como funciona:
El ejemplo se basa en el item: 1158607 (para el fin de este ejemplo no nos interesa que es).
Unidad de media primaria del item
select imUOM1 from pd812dta.f4101 where imITM = 1158607
Resultado: CU
Conversiones definidas para este item en particular....
select *from pd812dta.f41002 where umITM = 1158607 | ||||||
| umMCU | umITM | umUM | umRUM | umUSTR | umCONV | umCONV1 |
| 1158607 | CD | CA | 2 | 18.00000000 | 216.00000000 | |
| 1158607 | PL | CA | umUSTR | 144.00000000 | 1,728.00000000 | |
| 1158607 | 2P | CA | umUSTR | 1,440.00000000 | 17,280.00000000 | |
| 1158607 | 4P | CA | umUSTR | 3,024.00000000 | 36,288.00000000 | |
| 1158607 | PL | CD | 1 | 8.00000000 | 1,728.00000000 | |
| 1158607 | CA | CU | 3 | 12.00000000 | 12.00000000 | |
| 1158607 | KB | CU | 2.01177350 | 2.01177350 | ||
| 1158607 | KG | CU | 2.15053760 | 2.15053760 | ||
| 1158607 | LT | CU | 2.00000000 | 2.00000000 | ||
| 1158607 | PL | CU | 1,728.00000000 | 1,728.00000000 | ||
| 1158607 | 3C | CU | 2.00000000 | 2.00000000 | ||
Ahora probamos conversiones simples... solo definidas en el F41002... unidad de medida desde = UM y hacia RUM...
select umMCU, umITM, umUM, umRUM, umUSTR, umCONV, umCNV1, db2dtamart.JDEConvert(umITM, umUM, umRUM, 10) as fromUMToRUM from pd812dta.f41002 where umITM = 1158607 | |||||||
| UMMCU | UMITM | UMUM | UMRUM | UMUSTR | UMCONV | UMCNV1 | fromUMtoRUM |
| 1158607 | CD | CA | 2 | 18,0000000 | 216,0000000 | 180,0000000 | |
| 1158607 | PL | CA | 144,0000000 | 1728,0000000 | 1440,0000000 | ||
| 1158607 | 2P | CA | 1440,0000000 | 17280,0000000 | 14400,0000000 | ||
| 1158607 | 4P | CA | 3024,0000000 | 36288,0000000 | 30240,0000000 | ||
| 1158607 | PL | CD | 1 | 8,0000000 | 1728,0000000 | 80,0000000 | |
| 1158607 | CA | CU | 3 | 12,0000000 | 12,0000000 | 120,0000000 | |
| 1158607 | KB | CU | 2,0117735 | 2,0117735 | 20.1176999 | ||
| 1158607 | KG | CU | 2,1505376 | 2,1505376 | 21.5054000 | ||
| 1158607 | LT | CU | 2,0000000 | 2,0000000 | 20,0000000 | ||
| 1158607 | PL | CU | 1728,0000000 | 1728,0000000 | 17280,0000000 | ||
| 1158607 | 3C | CU | 2,0000000 | 2,0000000 | 20,0000000 | ||
Ahora probamo la inversa... unidad de medida desde = RUM y hacia UM...
select umMCU, umITM, umUM, umRUM, umUSTR, umCONV, umCNV1, db2dtamart.JDEConvert(umITM, umUM, umRUM, 10) as fromRUMToUM from pd812dta.f41002 where umITM = 1158607 | |||||||
| UMMCU | UMITM | UMUM | UMRUM | UMUSTR | UMCONV | UMCNV1 | fromRUMtoUM |
| 1158607 | CD | CA | 2 | 18,0000000 | 216,0000000 | 2160,0000000 | |
| 1158607 | PL | CA | 144,0000000 | 1728,0000000 | 17280,0000000 | ||
| 1158607 | 2P | CA | 1440,0000000 | 17280,0000000 | 172800,0000000 | ||
| 1158607 | 4P | CA | 3024,0000000 | 36288,0000000 | 362880,0000000 | ||
| 1158607 | PL | CD | 1 | 8,0000000 | 1728,0000000 | 17280,0000000 | |
| 1158607 | CA | CU | 3 | 12,0000000 | 12,0000000 | 120,0000000 | |
| 1158607 | KB | CU | 2,0117735 | 2,0117735 | 20.1176999 | ||
| 1158607 | KG | CU | 2,1505376 | 2,1505376 | 21.5054000 | ||
| 1158607 | LT | CU | 2,0000000 | 2,0000000 | 20,0000000 | ||
| 1158607 | PL | CU | 1728,0000000 | 1728,0000000 | 17280,0000000 | ||
| 1158607 | 3C | CU | 2,0000000 | 2,0000000 | 20,0000000 | ||
Otro Ejemplo convertimos 10 CU a 3C
select 1158607 as umITM, 'CU' as umUM, '3C' as umRUM, db2dtamart.JDEConvert(1158607, 'CU', '3C', 10) as fromUMToRUM from sysibm.sysdummy1 | |||
| UMITM | UMUM | UMRUM | FROMUMTORUM |
| 1158607 | CU | 3C | 5 |
Mas ejemplos de conversiones definidas en la tabla F41002...
select 1158607 as umITM, 'CU' as umUM, '3C' as umRUM, db2dtamart.JDEConvert(1158607, 'CU', '3C', 10) as fromUMToRUM from sysibm.sysdummy1 union select 1158607 as umITM, '3C' as umUM, 'CU' as umRUM, db2dtamart.JDEConvert(1158607, '3C', 'CU', 10) as fromUMToRUM from sysibm.sysdummy1 union select 1158607 as umITM, 'CA' as umUM, '3C' as umRUM, db2dtamart.JDEConvert(1158607, 'CA', '3C', 10) as fromUMToRUM from sysibm.sysdummy1 union select 1158607 as umITM, '3C' as umUM, 'CA' as umRUM, db2dtamart.JDEConvert(1158607, '3C', 'CA', 10) as fromUMToRUM from sysibm.sysdummy1 union select 1158607 as umITM, 'PL' as umUM, '3C' as umRUM, db2dtamart.JDEConvert(1158607, 'PL', '3C', 10) as fromUMToRUM from sysibm.sysdummy1 union select 1158607 as umITM, '3C' as umUM, 'PL' as umRUM, db2dtamart.JDEConvert(1158607, '3C', 'PL', 10) as fromUMToRUM from sysibm.sysdummy1 | |||
| UMITM | UMUM | UMRUM | FROMUMTORUM |
| 1158607 | CU | 3C | 5,0000000 |
| 1158607 | 3C | CU | 20,0000000 |
| 1158607 | CA | 3C | 60,0000000 |
| 1158607 | 3C | CA | 1,6667000 |
| 1158607 | PL | 3C | 8640,0000000 |
| 1158607 | 3C | PL | 0,0116000 |
Ahora vamos a utilizar conversiones que se encuentran definidas en la tabla F41003...
select ucUM, ucRUM, ucCONV from pd812dta.f41003 where 'KG' in (ucUM, uCRUM) | ||
| UMUM | UMRUM | UCCONV |
| %% | KG | 0,1000000 |
| KG | GM | 1000,0000000 |
| TN | KG | 1000,0000000 |
| KG | LB | 2,2046230 |
| CA | KG | 1,0000000 |
| KG | 100,0000000 | |
| KG | TN | 0,0010000 |
| KG | 0,0100000 | |
Por ultimo mostrarmos conversiones donde intervienen las dos tablas:
select 1158607 as umITM, 'KG' as umUM, 'CU' as umRUM, db2dtamart.JDEConvert(1158607, 'KG', 'CU', 10) as fromUMToRUM from sysibm.sysdummy1 union select 1158607 as umITM, 'CU' as umUM, 'KG' as umRUM, db2dtamart.JDEConvert(1158607, 'CU', 'KG', 10) as fromUMToRUM from sysibm.sysdummy1 union select 1158607 as umITM, 'GM' as umUM, 'CU' as umRUM, db2dtamart.JDEConvert(1158607, 'GM', 'CU', 10) as fromUMToRUM from sysibm.sysdummy1 union select 1158607 as umITM, 'CU' as umUM, 'GM' as umRUM, db2dtamart.JDEConvert(1158607, 'CU', 'GM', 10) as fromUMToRUM from sysibm.sysdummy1 | |||
| UMITM | UMUM | UMRUM | UCCONV |
| 1158607 | KG | CU | 21,5054000 |
| 1158607 | CU | KG | 4,6500000 |
| 1158607 | GM | CU | 0,0215000 |
| 1158607 | CU | GM | 4650,0000000 |

Comentarios
Enviar un comentario nuevo