Merhaba,
SAP B1’da default olarak (örneğin kalem ana verileri ekranında OITM tablosunda) türkçe tanımları kullanırız, orjinal alanların yada udf (user defined field)’ lerin ingilizce yada diğer dillerdeki tanımları ise biraz farklı olarak tutulmakta. Bunun için OMLT ve MLT1 tabloları kullanılmakta. Bu tablo yapılarına göre veriler dil kodu ve kolon ismi ne ise ona göre tutulmaktadır. Yani;
ItemName LangCode Trans elma 8 apple elma 23 manzanas
Burada 8 ingilizce, 23 te ispanyolca için çevirili dil kodudur.
Bir malzeme kodunun tüm alanlarına ait dil tanımlarını çekmek istediğinizde ise bu verilere direkt olarak ulaşamıyorsunuz. OITM OMLT ve MLT1 tablolarına inner join atarak yazacağınız query size alan sayısı kadar satır olarak geri dönecektir. 50 kolonunuz varsa 50 satır veri olarak geri dönecektir. Fakat buradan alacağınız veriyi başka bir tabloyu güncelleme ve çıktı için kullanmaya çalıştığınızda size bir çok if le birlikte bunları yazmanıza neden olacaktır.
Bu kolonların isimleri ve o dile ait tanımlarını içeren tek satırlık bir sonuca erişmeniz sizin işinizi daha kolaylaştıracaktır. Bunun için sql de transpoze işlemini pivot clause ile yapabiliriz.
SELECT U_A, U_B,U_C,U_D
FROM
(
SELECT CAST(M.Trans as NVARCHAR(200)) AS Trans,O.FieldAlias FROM OMLT O
INNER JOIN MLT1 M ON (O.TranEntry = M.TranEntry)
WHERE O.PK = '980130001' AND M.LangCode = 8 AND O.FieldAlias IN
('U_A','U_B','U_C','U_D')
) HAUS
PIVOT
(
MAX(Trans)
FOR FieldAlias in (U_A, U_B,U_C,U_D)
)
) PIV_HAUS;
MLT1 tablosundaki Trans kolonu NTEXT tanımlıdır. Bu yüzden onu NVARCHAR data tipine çevirmemiz gerekmektedir. Onun dışında U_A … U_D kolon isimlerinin karşılıklarını verdiğinizde o malzeme kodu için o dildeki tanımları tek satırda almış olursunuz ve daha sonra da bu kolonların karşılıkları olan uygun yerlere atamalarını yapabilirsiniz.
**Dikkat etmeniz gereken bir nokta, U_A … U_D yazan kısımlarda isimlendirmeler aynı olmalı. Kolon ismi U_FFF ise ilk satırdaki SELECT in karşısında ve FOR dan sonraki sorgulanan alanlar içinde de U_FFF yazmalı.