22 Temmuz 2015 Çarşamba

20 Temmuz 2015 Pazartesi

AXAPTA - Stok rezervasyonu kaldırma ve ekleme

Volkan Şişman'dan öğrendiğim bu kodla stok rezervasyonu kaldırabilir ve ekleyebilirsiniz:



InventUpd_Reservation       invUpdReservation;
...
//rezervasyon kaldır
invUpdReservation = InventUpd_Reservation::newInventDim(InventMovement::construct(invTrans,InventMovSubType::None),myInventDim,200,false);
            invUpdReservation.updateNow();

...
//rezervasyon ekle
          invUpdReservation = InventUpd_Reservation::newInventDim(InventMovement::construct(invTrans,InventMovSubType::None),myInventDim,400,false);
            invUpdReservation.updateNow();


Ya da:

//rezervasyon ekle
     InventUpd_Reservation::updateReserveBuffer(journalTrans, journalTrans.Qty);

//rezervasyon kaldır
     InventUpd_Reservation::updateReserveBuffer(journalTrans, abs(journalTrans.Qty));

Ya da:

//rezervasyon kaldır
InventUpd_Reservation::newInventDim(InventTrans.inventMovement(true),InventTrans.inventDim(),-InventTrans.qty,true).updateNow();

AXAPTA - Formu açık olan invent journal kaydını post etmek

Eğer böyle bir kaydı post etmeye kalkarsanız, kaydın kullanıldığını söyleyerek size izin vermeyecektir. Volkan Şişman'dan öğrendiğim bu kod parçası kullanılan kaydın da post edebilmesine izin veriyor:

InventJournalCheckPost      journalCheckPost;
JournalForm                 journalForm;

;
...
journalForm      = JournalForm::fromArgs(args);
journalCheckPost = InventJournalCheckPost::newFromForm(args,journalForm);
journalForm.runbaseMainStart();
journalCheckPost.run();
journalForm.runbaseMainEnd(journalCheckPost,false);

15 Temmuz 2015 Çarşamba

AXAPTA - InventDimExistsJoin makrosuyla InventDim tablosuyla esnek join

 InventDim tablosuyla esnek joinler yapmak için fazla kasmanıza gerek bırakmayan bir makro var:

InventDimParm       dimParm;
InventDim           dimValues,dimJoin;
;
...
//Join where ile kullanacağımız alanları dolduruyoruz
 dimvalues.wMSLocationId = inventdim.wMSLocationId;
    if (inventdim.InventSiteId)
        dimvalues.InventSiteId = inventdim.InventSiteId;
    if (inventdim.configId)
        dimvalues.configId = inventdim.configId;
 //
InventDimParm bu alanlara göre ayarlanacak
    dimparm.initFromInventDim(dimValues);

    while select lclInventSum
        where lclInventSum.ItemId == itemId && leftQty > 0
              #InventDimExistsJoin(lclInventSum.InventDimId,dimJoin,dimValues,dimParm)



İlk parametre join yapılan tablonun ilgili InventDimId alanı, ikinci parametre InventDim tablosunun tanımlanan adı, Üçüncü paremetre ile değerler gidiyor. Dördüncü paremetre de parametre tablosu. Bu tablonun değişik kullanımları da mevcut.

30 Haziran 2015 Salı

Axapta - Grid kolonunda resim görüntülemek

Örnek tablomuzda eğer RefRecId değeri dolu ise OK değilse Cancel buton resmi göstereceğiz. Bunun için tablomuza bir display method yazıyoruz:

 display ImageRes dispIsOKImg(gzrForeSightOrderLines l)
 {
   #resAppl;
   return l.RefRecId == 0 ? #ImageError : #Image_OK;
 }


Gridinize bir Window kontrol ekleyin. Örnekteki ismi LineOK olsun. Kontrolün AlignControl özelliğini No yapın. DataMethod'a display methodumuzun adı (burada dispIsOKImg), Datasource alanına da tablomuzun adını (burada gzrForeSightOrderLines) yazıyoruz. Height ve Width alanlarına da uygun değerler verin. Ben 14 yazdım. Eğer resimleriniz çok büyükse ImageMode değerini Size to fit yapabilirsiniz.

Formu çalıştırdığınızda resimlerin sık  sık yenilendiğini göreceksiniz. Bunu engellemek için resimleri formu ilk çalıştırırken yüklemek gerekir:

ClassDeclaration metodu:
ImageList                           imageList;

Init metodu:
#resAppl
imageList = new Imagelist(Imagelist::smalliconWidth(),Imagelist::smalliconHeight());
imagelist.add(new image(#Image_OK));
imagelist.add(new image(#ImageError));
LineOK.imageList(imageList);


Display metoddaki return satırını aşağıdakiyle değiştirin:

return l.RefRecId == 0 ? 1 : 0;

resAppl makrosunun içindeki imaj listesini görmek/güncellemek için AOT->Macros->ResAppl->Düzenle.

Sistemde kayıtlı tüm imaj dosyalarını görmek için Araçlar->Geliştirme araçları->Katılaştırılmış kaynaklar (Bu terim türkçeye gerçekten çok tuhaf çevrilmiş, orijinalinde Embedded resources yazıyor ki bu çok daha anlamlı, gömülü kaynaklar olmalıydı).

16 Nisan 2015 Perşembe

1394 Firewire bağlantılı kameradan USB Bilgisayara Görüntü Aktarmak

Firewire bağlantısı olan eski bir dijital kameranız ve yeni bir bilgisayarınız varsa bir sorununuz var demektir.
Biriken kasetlerimi yeni bilgisayarıma aktarmak istediğimde önce firewire'yi USB'ye çeviren bir dönüştürücü var mı diye araştırdım. Gittigidiyor'da 3,5-TL'ye satılan yüzlerce dönüştürücü kablodan birini seçtim. Malesef ürün işe yaramadığı gibi kameramın firewire bağlantısını da yaktı.
İnternette kısa bir araştırmadan sonra bu dönüştürücülerin hiçbirinin işe yaramadığını, firewire ile USB'nin  birbirinden tamamen farklı yapıda çalışan bağlantılar olduğunu öğrendim. Aslında ihtiyacım olan sadece bir kablo değil, seri porttan USB'ye dönüştüren aygıtlar gibi gerçek bir dönüştürücü aygıttı ama öyle bir aygıta rastlamadım. Aslında rastladım ama Pinnacle Studio Moviebox adındaki bu aygıt sadece yurtdışındaki sitelerde var ve 300$ seviyelerinde.
Artık ümidimi kesmişken bir forumdaki cevap çözümüm oldu; kameranın s-video çıkışını bir USB capture aygıtına bağlayın diyordu. Gittigidiyor'da ve yurtdışı sitelerinde ufak bir araştırmadan sonra EasyCAP isimli ürünün hem ucuz olduğunu hem de bu işi vasat da olsa gördüğünü öğrendim. Yurtdışında Diamond gibi kaliteli bir markanın da böyle bir aygıtı olduğunu gördüm ancak ben kısa yol olarak Türkiye'de satılan EasyCAP ile şansımı denemek istedim.
Ürün hızlıca elime ulaştı ancak ilk dakikada ilk sürprizi yaşadım; markası EasyCAP değil, EaiserCAP idi.
İkinci sürpriz ise ürünün kutusunda yazdığı halde içinden çıkan diskte Windows 8  sürücüleri yoktu. Aygıtı Windows 7 olan bilgisayarımda denedim ve hata verdi. İnternette biraz araştırdıktan sonra aygıtın Windows 8 sürücülerini buldum. Bulduğum sürücüler EasyCAP'ın ancak buna da uyuyor. Anlaşılan ikisi de aynı yerden çıkmış ama markaları farklı. Aynı şekilde Gittigidiyor'da satılan Slink markalı aygıtlar da birebir aynı görünüyor. Ya sahte Slink veya gerçek ama aynı fabrikadan çıkıyor.
Yanında verilen Ulead Studio Capture programını kurdum. İlk denememde biraz capture yaptıktan sonra aygıtın hata verdiğini gördüm. Wizard yerine Studio'yu kullanınca bu hatadan kurtuldum.
Ardından sesi almadığını farkettim. Yine internette ufak bir araştırmadan sonra ses çıkması için Options->Video and Capture Property Settings->Source->Use PCI Audio seçeneğinin işaretli olması gerektiğini öğrendim. Burayı işaretliyordum ama işaret değişiyordu. En sonunda yine internette Ulead Studio'nun XP uyumluluk modunda çalışması gerektiğini öğrendim.
Tüm bunları yaptıktan sonra aygıt düzgün çalışmaya başladı.
Sonuç olarak benim tavsiyem EBAY'dan Diamond capture aygıtını getirtmek. Şu an bildiklerimi baştan bilseydim ben öyle yapardım.

10 Şubat 2015 Salı

C# - TC kimlik sorgulama web servisi client örneğinden COM uyumlu DLL oluşturma ve bunu App.Config dosyası olmadan kullanabilme

Bir makaleden öğrendiğim aşağıdaki direktifle DLL dosyanızın COM uyumlu olmasını sağlarsınız:


[ComVisible(true)] 

Ayrıca projenin özelliklerinde build sekmesinde Register for COM interop checkboxı işaretli olmalı.

Bunun sayesinde de COM nesnesini kullanırken Intellisense kullanabilirsiniz:

[ClassInterface(ClassInterfaceType.AutoDual)] 

 Tüm bunları yaptıktan sonra yine de bu DLL dosyasını direk kullanamazsınız. Kullanmaya kalktığınızda "OLE IDispatch exception code 0 from System.ServiceModel: ServiceModel..." gibi bir hata alırsınız. Ya app.config dosyasını EXEDosyaAdı.EXE.App.Config olarak çağıran programın olduğu klasöre kopyalayacaksınız ya da aşağıdaki kod parçasındaki kırmızı işaretli yerleri ekleyeceksiniz (Bunun için de Paul Mrozowski'den yardım aldım):

Örnekteki TC kimlik servisini C# Class Library türünde oluşturulan projenize eklemek için Service References üzerinde sağ mouse, Add Service Reference-> adres https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx ve GO yapmalısınız.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.ServiceModel;



namespace TCKimlik
{
    [ComVisible(true)] //COM nesnesi olarak görülebilmesini sağlar
    [ClassInterface(ClassInterfaceType.AutoDual)] //COM nesnesi olarak kullanırken intellisense sağlar
    [ProgId("TCKimlik.TCSorgula")] //COM nesne adı
   
    public class TCKimlikClass
    {
        public bool Dogrula(string adi,string soyadi,Int64 tc,Int32 dogumT)
        {
            bool ret = false;

            //------ APP.CONFIG dosyası gerekmemesi için.
            BasicHttpsBinding binding = new BasicHttpsBinding();
            EndpointAddress address = new EndpointAddress("https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx");

            //------ Sorgula --------
                try
            {
                Sorgula.KPSPublicSoapClient servis = new Sorgula.KPSPublicSoapClient(binding, address);

                ret = servis.TCKimlikNoDogrula(tc, adi, soyadi, dogumT);
            }
            catch
            {
            }
            return ret;
        }
    }
}


Artık bu DLL sadece .NET değil, klasik COM DLL destekleyen dillerle de kullanılabilir. Ancak bu DLL dosyasını setup olmadan taşırsanız hedef bilgisayarda regasm ile kaydetmeniz gerekir. Projenin tamamını hazır DLL ile bu ekte paylaştım.

Aşağıdaki örnekte Microsoft Visual Foxpro ile kullanımı var:

o=CREATEOBJECT("tckimlik.tcsorgula")
?o.Dogrula("METİN","EMRE",11111111111,1980)

Güncelleme:
Bazen .DLL dosyasını register ettikten sonra kullanırken "80131509 unknown com status code" hatası alabilirsiniz. Bunun için DLL'yi strong name ile imzalamanız gerekiyor.
Önce Visual Studio içinde zaten var olan SN.EXE ile bir key dosyası oluşturuyoruz:

 sn -k MyKeyFile.snk

Sonra da Visual Studio->İmzalama->Bütünleştirilmiş kodu imzala checkbox'unu seçtikten sonra MyKeyFile.snk dosyasını seçip derleme yapıyoruz.