E-Fatura için UBL data oluşturma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mmg » 12 Oca 2020 08:19

Merhaba,

Ben entegratör firmanın UBL datasını örnek almıştım ve o datanın header kısmını kendi datama uygulamaya çalışmıştım. Fakat header kısmı ile ilgili yeteri bilgiye sahip olmadığım için sanırım hatalı tanımlamalar yaptığım için datayı yükleyemedim. Son anda sizin bana gönderdiğiniz örnekteki header kısmını olduğu gibi aldım ve datayı oluşturdum ve entegratör portalına hatasız bir şekilde UBL datayı yükleyebildim. Bu kısım biraz ezbere oldu ama işim çok acele olduğu için benim için önemli olan şu an için sonuca gitmekti. Tekrar teşekkürler yardımlarınız için.

varyemez
Üye
Mesajlar: 253
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen varyemez » 08 Mar 2020 07:31

Yeni başlık açmayayım da burada sorayım, hem de teşekkür edeyim. UBL datasını yardımlarınızla oluşturdum. Fakat bazı bilgileri ini dosyadan okuyorum , firma bilgileri, adres vs. gibi.. Haliyle bunlar tr karakter içeriyor. XML içine atınca da karakter sorunu çıktı ortaya.. Nasıl çözerim?

3ddark
Üye
Mesajlar: 81
Kayıt: 14 Eyl 2010 09:55
Konum: İstanbul

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen 3ddark » 08 Mar 2020 08:00

varyemez yazdı:
08 Mar 2020 07:31
Yeni başlık açmayayım da burada sorayım, hem de teşekkür edeyim. UBL datasını yardımlarınızla oluşturdum. Fakat bazı bilgileri ini dosyadan okuyorum , firma bilgileri, adres vs. gibi.. Haliyle bunlar tr karakter içeriyor. XML içine atınca da karakter sorunu çıktı ortaya.. Nasıl çözerim?
Sorununuz karakter kodlamasindan kaynaklı. Ben gönderdiğim XML içinde encoding UTF8 olarak ayarladım ve Türkçe karakterleri sorunsuz olarak ekliyorum.

Siz debug ile dosyadan okuduğunuz veriyi kontrol edin. Sizin ini dosyası kodlamasina bakın.
Unicode ANSI string farkı olabilir.

Bunları kontrol edin.
Ayrıca kod içinde dosyadan okuduğunuz bilgi yerine kod içine sabit Türkçe karakter ekleyerek deneyin sorunun dosyadan ini dosyasından olup olmadığını kontrol edersiniz.
PostgreSQL - Delphi - Linux :!:

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen ertank » 09 Mar 2020 06:59

varyemez yazdı:
08 Mar 2020 07:31
Yeni başlık açmayayım da burada sorayım, hem de teşekkür edeyim. UBL datasını yardımlarınızla oluşturdum. Fakat bazı bilgileri ini dosyadan okuyorum , firma bilgileri, adres vs. gibi.. Haliyle bunlar tr karakter içeriyor. XML içine atınca da karakter sorunu çıktı ortaya.. Nasıl çözerim?
Merhaba,

XML dosyası standart olarak UTF-8 kodlamaya sahiptir. Eğer XML dosyasını daha önce verilen XMLDoc nesnesi kullanarak üretiyor iseniz ihtimal INI dosyası içinden okuduğunuz karakterler bozuk olabilr. Bunu kontrol ettiniz mi?

Oluşturulan XML dosyasını Notepad++ gibi bir uygulama ile açıp UTF-8 formatında incelediğinizde karakter sorunu yok ise bu defa XML dosyasını web servise göndermeden önce okur iken UTF-8 kullanmayıp doğru kayıtlı karakterleri hafızaya bozuk okuyor olabilirsiniz.

Kullandığınız Delphi sürümü son sürümlerden birisi ise dosya okuma rutinlerinin nerede ise hepsi alternatif encoding kullanarak (Ansi, UTF-8 vb) dosya okumayı destekler. Delphi 7 standart Ansi formatında okur. Biraz ek kod yazarak yine UTF-8 formatında okuyabilirsiniz.

Kullandığınız Delphi sürümü ve sorunlu olduğuna inandığınız kodunuzu paylaşabilir misiniz?

varyemez
Üye
Mesajlar: 253
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen varyemez » 09 Mar 2020 10:16

delphi 10.3.3 community , win 10 kullanıyorum
Bu kısmı notepad ile yazıp dosya.ini şeklinde kaydettim (daha sonra veritabanından alınacak)

Kod: Tümünü seç

[FIRMAMIZ]
bizimWebSitesi=www.itstools.biz.tr
bizimVergiNo=33333333
bizimMukellefTipi=TCKN
bizimTicaretSicilNo=333
bizimMersisNo=11111
bizimFirmaUnvani=BALIKLI ECZANESİ
bizimAdres=Küçükbalıklı Mah. Ali Galip Yaldız cad.
bizimKapiNo=123
bizimIlce=xxxx   
bizimSehir=bbbbb
bizimPostaKodu=16250  
bizimUlkeKodu=TR 
bizimUlke=TÜRKİYE 
bizimVergiDairesi=ULUDAĞ VD
bizimTel=0 224 xxxxx
bizimFax=0 224 xxxxx    
bizimEPostaAdresi=aaaa@gmail.com
Aşağıdaki gibi de okuyup kullanıyorum değerlleri

Kod: Tümünü seç

procedure TFaturaUBL.FormActivate(Sender: TObject);
VAR
ini:TCustomIniFile;
begin
ini:=TIniFile.Create(extractfilepath(Application.ExeName)+'\efatura.ini');
bizimWebSitesi:=ini.ReadString('FIRMAMIZ','bizimWebSitesi','');
bizimVergiNo:=ini.ReadString('FIRMAMIZ','usernbizimVergiNo','');
bizimMukellefTipi:=ini.ReadString('FIRMAMIZ','bizimMukellefTipi','');
bizimTicaretSicilNo:=ini.ReadString('FIRMAMIZ','bizimTicaretSicilNo','');
bizimMersisNo:=ini.ReadString('FIRMAMIZ','bizimMersisNo','');
bizimFirmaUnvani:=ini.ReadString('FIRMAMIZ','bizimFirmaUnvani','');
bizimAdres:=ini.ReadString('FIRMAMIZ','bizimAdres','');
bizimKapiNo:=ini.ReadString('FIRMAMIZ','bizimKapiNo','');
bizimIlce:=ini.ReadString('FIRMAMIZ','bizimIlce','');
bizimSehir:=ini.ReadString('FIRMAMIZ','bizimSehir','');
bizimPostaKodu:=ini.ReadString('FIRMAMIZ','bizimPostaKodu','');
bizimUlkeKodu:=ini.ReadString('FIRMAMIZ','bizimUlkeKodu','');
bizimUlke:=ini.ReadString('FIRMAMIZ','bizimUlke','');
bizimVergiDairesi:=ini.ReadString('FIRMAMIZ','bizimVergiDairesi','');
bizimTel:=ini.ReadString('FIRMAMIZ','bizimTel','');
bizimFax:=ini.ReadString('FIRMAMIZ','bizimFax','');
bizimEPostaAdresi:=ini.ReadString('FIRMAMIZ','bizimEPostaAdresi','');
ini.Free;
......
zaten gerisi sizin kodlar....

Node3 := Node2.AddChild('cac:PartyName');
Node3.AddChild('cbc:Name').Text := bizimFirmaUnvani;

Node3 := Node2.AddChild('cac:PostalAddress');
Node3.AddChild('cbc:StreetName').Text := bizimAdres; //UZUN
Node3.AddChild('cbc:BuildingNumber').Text := bizimKapiNo; //1
Node3.AddChild('cbc:CitySubdivisionName').Text := bizimIlce; //PENDİK
Node3.AddChild('cbc:CityName').Text := bizimSehir; //İSTANBUL
Node3.AddChild('cbc:PostalZone').Text := bizimPostaKodu; //34123
Node4 := Node3.AddChild('cac:Country');
Node4.AddChild('cbc:IdentificationCode').Text := bizimUlkeKodu; //TR
Node4.AddChild('cbc:Name').Text := bizimUlke; //TÜRKİYE

Node3 := Node2.AddChild('cac:PartyTaxScheme');
Node4 := Node3.AddChild('cac:TaxScheme');
Node4.AddChild('cbc:Name').Text := bizimVergiDairesi;
***********************************
oluşan xml i notepad ile açtığımda görüntü böyle: Notepad++ ile bakmadım

Kod: Tümünü seç

<cac:PartyIdentification>
				<cbc:ID schemeID="MERSISNO">3682909944400001</cbc:ID>
			</cac:PartyIdentification>
			<cac:PartyName>
				<cbc:Name>BALIKLI ECZANESÄ°</cbc:Name>
			</cac:PartyName>
			<cac:PostalAddress>
				<cbc:StreetName>Küçükbalıklı Mah. Ali Galip Yaldız cad.</cbc:StreetName>
				<cbc:BuildingNumber>119</cbc:BuildingNumber>
				<cbc:CitySubdivisionName>Osmangazi</cbc:CitySubdivisionName>
				<cbc:CityName>BURSA</cbc:CityName>
				<cbc:PostalZone>16250</cbc:PostalZone>
				<cac:Country>
					<cbc:IdentificationCode>TR</cbc:IdentificationCode>
					<cbc:Name>TÃœRKÄ°YE</cbc:Name>
				</cac:Country>


ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen ertank » 09 Mar 2020 11:38

İNİ dosyanızı elle oluşturduğunuz için karakter kodlaması ne olduğunu bilemiyoruz. Kodunuzu hiç "DEBUG" ettiniz mi? Örneğin;

Kod: Tümünü seç

bizimFirmaUnvani:=ini.ReadString('FIRMAMIZ','bizimFirmaUnvani','');
satırı çalıştıktan sonra bizimFirmaUnvani değişkeni değeri ne oluyor? Türkçe karakterleri doğru mu baktınız mı?

Yüksek ihtimal İNİ dosyasını UTF-8 karakter kodlaması ile kayıt ettiniz. Delphi kodu kullanarak TIniFile.WriteString() fonksiyonu kullanmadığınız için okunan veriyi manuel UTF-8 -> Unicode dönüşümü yaptırmanız gerekiyor. Bunu aşağıdaki şekilde yapmanız mümkün:

Kod: Tümünü seç

bizimFirmaUnvani:=UTF8ToString(RawByteString(ini.ReadString('FIRMAMIZ','bizimFirmaUnvani','')));
Ancak size tavsiyem İNİ dosyası formatını Notepad++ uygulaması kullanarak UTF-8'den Ansi'ye dönüştürmeniz (Encoding menüsü -> Convert to ANSI) ve bu şekilde kayıt etmeniz. Böylece mevcut kodunuzu değiştirmeden Türkçe karakterler ile okuma yapabilirsiniz.

Cevapla