Merhaba,

Bugünkü yazımızda ERP projelerinde canlı kullanıma geçiş için en önemli aşamalardan biri olan veri aktarımından bahsedeceğim.

Projelerimden birinde stok kartlarını aktaracaktık. DMF’ i kullanmayı denedim. Ancak hem DMF hakkında yeterli anlaşılır doküman olmayışı hem de karmaşık yapısından dolayı DMF kullanmak cazip gelmedi. Ayrıca süre kısıtımız da vardı ve stok kartları hızlı bir şekilde aktarılmalıydı. Daha sonra Excel add-in i kullanmayı düşündüm. Tek tablo içeren veri aktarımlarını birkaç kere excel ile yapmıştım. Ama sürekli geliştirme yapılan ortamlarda excel ile veri aktarımı yaparken anlamsız hatalar ortaya çıkabiliyor ve bu hatalar ancak full CIL derlemesi ile düzeliyor. Ayrıca 2012 versiyonunun yeniliklerinden olan yeni tablolardan dolayı stok kartı oluşturmak için birçok tabloya kayıt atmamız gerekiyor ve bunların sırasının takibi de ayrı bir zorluk ortaya çıkarıyor. Son çare olarak job yazmayı tercih ettim. Her ne kadar best practice lere uymasa da bazen işleri halletmek için standartlardan vazgeçmek gerekiyor 🙂

 

Örnek olarak Ürün tipi ürün olan (varyantsız) stok kartlarının aktarımını sağlayan jobı paylaşacağım. Öncelikle aktarmak istediğiniz verileri excelde uygun formatta oluşturmalısınız. AX tarafında da excel de oluşturulan kayıtları import etmek için bir tablo oluşturmalısınız. Bu tabloda ürün veri yönetimindeki tabloların içerdiği alanların EDT sini kullanmanız size kolaylık sağlayacaktır. Bütün stok kartları için aynı olacak verileri tablonuza almanıza gerek yoktur. Job da insert esnasında kod ile belirtebilirsiniz. Örneğin kullanacağımız ara tablo aşağıdaki gibi olsun:

 

Tablomuzu oluşturduktan sonra excel dosyamızı csv (virgülle ayrılmış) formatında kaydetmeliyiz. Kaydettiğimiz dosyayı AX’ ın yüklü olduğu makineye kopyalayalım ve aşağıdaki jobı exceldeki verileri ara tablomuza almak için kullanalım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
static void SDImportProductTemp(Args _args)
{
    #File
    TextIo                  io;
    container               c;
    SDImportProductTemp       import;
    ;
    delete_from import;
    io = new TextIo("C:\\Stok Kartları.csv", #io_read);
    if (!io)
    {
        throw error("Error reading file");
    }
    io.inFieldDelimiter(';'); //This can be any delimiter, I'm just using Semicolon as an example
    io.inRecordDelimiter(#delimiterCRLF); //CRLF = Carriage Return Line Feed
    ttsbegin;
    while (io.status() == IO_Status::Ok)
    {
        c = io.read();
        if (io.status() != IO_Status::Ok)
        {
            break;
        }
        import.clear();
        import.ItemId                    = conPeek(c, 1);
        import.ItemName                  = conPeek(c, 2);
        import.ItemType                  = conPeek(c, 3);
        import.ItemGroupId               = conPeek(c ,4);
        import.InventModelGroupId        = conpeek(c, 5);
        import.InventUnitId              = conpeek(c, 6);
        import.TaxItemGroupPurch         = conpeek(c, 7);
        import.TaxItemGroupSales         = conpeek(c, 8);
        import.insert();
    }
    ttscommit;
    info("bitti");
}

Verilerimizi aratablomuza aldıktan sonra sıra geldi ürün veri yönetimi tablolarına kayıt atmaya. Bunun için de aşağıdaki jobı kullanalım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
static void SDCreateProducts(Args _args)
{
    EcoResDistinctProduct                 ecoResDistinctProduct;
    EcoResProductIdentifier               ecoResProductIdentifier;
    SDImportProductTemp                  import;
    EcoResStorageDimensionGroupProduct  ecoResStorageDimensionGroupProduct;
    EcoResTrackingDimensionGroupProduct ecoResTrackingDimensionGroupProduct;
    InventTable                         inventTable;
    InventTableModule                   inventTableModule;
    InventItemSetupSupplyType           inventItemSetupSupplyType;
    EcoResStorageDimensionGroupItem     ecoResStorageDimensionGroupItem;
    EcoResTrackingDimensionGroupItem    ecoResTrackingDimensionGroupItem;
    InventModelGroupItem                inventModelGroupItem;
    InventItemGroupItem                 inventItemGroupItem;
    InventDim                           inventDim;
    InventDimCombination                inventDimCombination;
    ;
    try
    {
        ttsBegin;
        while select import
        {
        select firstOnly inventTable where inventTable.ItemId == import.ItemId;
            if(inventTable) continue;
            //DistinctProduct
        ecoResDistinctProduct.clear();
        ecoResDistinctProduct.initValue();
        ecoResDistinctProduct.ProductType               = EcoResProductType::Item;
        ecoResDistinctProduct.DisplayProductNumber      = import.ItemId;
        ecoResDistinctProduct.SearchName                = import.ItemName;
        if (ecoResDistinctProduct.validateWrite())
        {
            ecoResDistinctProduct.insert();
            ecoResProductIdentifier.clear();
            ecoResProductIdentifier.initValue();
            ecoResProductIdentifier.ProductNumber = import.ItemId;
            ecoResProductIdentifier.Product = ecoResDistinctProduct.RecId;
            ecoResProductIdentifier.insert();
            //Depolama boyut grubu verileri
            ecoResStorageDimensionGroupProduct.clear();
            ecoResStorageDimensionGroupProduct.initValue();
            ecoResStorageDimensionGroupProduct.Product = ecoResDistinctProduct.RecId;
            ecoResStorageDimensionGroupProduct.StorageDimensionGroup = EcoResStorageDimensionGroup::findByDimensionGroupName("T/D").RecId;
            if (ecoResStorageDimensionGroupProduct.validateWrite())
            {
                ecoResStorageDimensionGroupProduct.insert();
            }
            //İzleme boyut grubu verileri
            ecoResTrackingDimensionGroupProduct.clear();
            ecoResTrackingDimensionGroupProduct.initValue();
            ecoResTrackingDimensionGroupProduct.Product = ecoResDistinctProduct.RecId;
            ecoResTrackingDimensionGroupProduct.TrackingDimensionGroup = EcoResTrackingDimensionGroup::findByDimensionGroupName("BOŞ").RecId;
            if (ecoResTrackingDimensionGroupProduct.validateWrite())
            {
                ecoResTrackingDimensionGroupProduct.insert();
            }
            //Ürün isimleri
            EcoResProductTranslation::createOrUpdateTranslation(ecoResDistinctProduct.RecId, import.ItemName, import.ItemName);
            //Ürünlerin şirkete serbest bırakılması
            inventTable.clear();
            inventTable.initValue();
            inventTable.initFromEcoResProduct(ecoResDistinctProduct);
            inventTable.ItemId = import.ItemId;
            inventTable.NameAlias = import.ItemName;
            if (inventTable.validateWrite())
            {
                inventTable.insert();
                //Stok modeli grubu verileri
                inventModelGroupItem.clear();
                inventModelGroupItem.initValue();
                inventModelGroupItem.ItemDataAreaId = inventTable.dataAreaId;
                inventModelGroupItem.ItemId = inventTable.ItemId;
                inventModelGroupItem.ModelGroupId = "FIFO";
                inventModelGroupItem.ModelGroupDataAreaId = curext();
                inventModelGroupItem.insert();
                //Madde grubu verileri
                inventItemGroupItem.clear();
                inventItemGroupItem.initValue();
                inventItemGroupItem.ItemDataAreaId = inventTable.dataAreaId;
                inventItemGroupItem.ItemId = inventTable.ItemId;
                inventItemGroupItem.ItemGroupId = import.ItemGroupId;
                inventItemGroupItem.ItemGroupDataAreaId = curext();
                inventItemGroupItem.insert();
                //Ürün detay verileri - stok hareketleri için
                inventTableModule.clear();
                inventTableModule.initValue();
                inventTableModule.ItemId = inventTable.ItemId;
                inventTableModule.ModuleType = ModuleInventPurchSales::Invent;
                inventTableModule.insert();
                //Ürün detay verileri - satınalma için
                inventTableModule.clear();
                inventTableModule.initValue();
                inventTableModule.ItemId = inventTable.ItemId;
                inventTableModule.ModuleType = ModuleInventPurchSales::Purch;
                inventTableModule.TaxItemGroupId = import.TaxItemGroupPurch;
                inventTableModule.insert();
                //Ürün detay verileri - satış için
                inventTableModule.clear();
                inventTableModule.initValue();
                inventTableModule.ItemId = inventTable.ItemId;
                inventTableModule.ModuleType = ModuleInventPurchSales::Sales;
                inventTableModule.TaxItemGroupId = import.TaxItemGroupSales;
                inventTableModule.insert();
                //Ambar maddeleri
                InventItemLocation::createDefault(inventTable.ItemId);
                //Tedarik tipi kurulumu
                inventItemSetupSupplyType.clear();
                inventItemSetupSupplyType.initValue();
                inventItemSetupSupplyType.ItemId = inventTable.ItemId;
                inventItemSetupSupplyType.ItemDataAreaId = inventTable.DataAreaId;
                inventItemSetupSupplyType.insert();
                //Ürün depolama boyut grubu
                ecoResStorageDimensionGroupProduct = EcoResStorageDimensionGroupProduct::findByProduct(ecoResDistinctProduct.RecId);
                if (ecoResStorageDimensionGroupProduct.RecId)
                {
                    ecoResStorageDimensionGroupItem.clear();
                    ecoResStorageDimensionGroupItem.initValue();
                    ecoResStorageDimensionGroupItem.ItemDataAreaId = inventTable.DataAreaId;
                    ecoResStorageDimensionGroupItem.ItemId = inventTable.ItemId;
                    ecoResStorageDimensionGroupItem.StorageDimensionGroup   = ecoResStorageDimensionGroupProduct.StorageDimensionGroup;
                    ecoResStorageDimensionGroupItem.insert();
                }
                //Ürün izleme boyut grubu
                ecoResTrackingDimensionGroupProduct = EcoResTrackingDimensionGroupProduct::findByProduct(ecoResDistinctProduct.RecId);
                if (ecoResTrackingDimensionGroupProduct.RecId)
                {
                    ecoResTrackingDimensionGroupItem.clear();
                    ecoResTrackingDimensionGroupItem.initValue();
                    ecoResTrackingDimensionGroupItem.ItemDataAreaId = inventTable.DataAreaId;
                    ecoResTrackingDimensionGroupItem.ItemId = inventTable.ItemId;
                    ecoResTrackingDimensionGroupItem.TrackingDimensionGroup = ecoResTrackingDimensionGroupProduct.TrackingDimensionGroup;
                    ecoResTrackingDimensionGroupItem.insert();
                }
            }
            inventDim.clear();
            inventDim = InventDim::findOrCreate(inventDim);
        }
      }//end while.
        ttscommit;
    }
    catch
    {
        error("Hata!");
        return;
    }
    info("Bitti!");
}

Job çalıştırıldıktan sonra serbest bırakılan ürünler formundan aktardığımız stok verilerini kontrol edebiliriz.