XSDecimal sayı aktarımında access violation

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

XSDecimal sayı aktarımında access violation

Mesaj gönderen veliadiguzel »

SAP ile web servis uygulmasında baya bir yol kat ettik (delphi forum saolsun) ama gene bir sıkıntı XSDecimal tanımlanmış alana veri ataması yapıp servise yollamaya çalışıyorum ama sürekli access violation hatası alıyorum.

Kod: Tümünü seç

var
  FHurda: HurdaSoap;
  FKantar_OkuResult: WideString;
  Fln_kantar: ZSD_S_KANTAR;
  Ftb_yrddet: ArrayOfZMM_S_KANTAR_D;
  Ftb_return: ArrayOfBAPIRET2;
  i: integer;
  XsDec: TXSDecimal;
begin
  try
    Fln_kantar := ZSD_S_KANTAR.Create;
    //procedure Kantar_Oku(const ln_kantar: ZSD_S_KANTAR; const tb_yrddet: ArrayOfZMM_S_KANTAR_D; const router: WideString; const App_host: WideString; const client: Smallint; const langu: WideString; const password: WideString; const systemnum: Smallint; const user: WideString; out Kantar_OkuResult: WideString;
    //                         out tb_return: ArrayOfBAPIRET2); stdcall;
    with Fln_kantar do
    begin
      FISNO := edFisNo.Text;
      try
        XsDec := TXSDecimal.Create;
        XsDec.DecimalString := Format('%d', [StrToInt(edAgirlik.Text)]);
        TARTIM := XsDec;
        ShowMessage(TARTIM.DecimalString);
      finally
        XsDec.Free;
      end;
      OPERATOR := edOperator.Text;
      FISRF := edKantarId.Text;
      KANTAR := edKantarNo.Text;
      MEINS := 'KG';
    end;
    FHurda := (RIO as HurdaSoap);
    FHurda.Kantar_Oku(Fln_kantar, Ftb_yrddet, edRouterStr.Text, edAppHost.Text,
      StrToInt(edClient.Text), 'TR', edPassword.Text, StrToInt(edSysNum.text),
      edUser.Text, FKantar_OkuResult, Ftb_return);
  finally
    Fln_kantar.Free;
  end;

Fhurda.kantar_oku yı cagırdıgım anda hata alıyorum TARTIMIiptal edip deniyorum kantaroku calısıyor bu sefer de normal olarak saop hata veriyo. yaptıgım işlemde bir terslik varmı acaba. aktarmadan sonraki showmesage de değeri görüyorum normal olarak. teşekkürler.
Veli ADIGÜZEL
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: XSDecimal sayı aktarımında access violation

Mesaj gönderen orhancc »

Kod: Tümünü seç

FHurda := (RIO as HurdaSoap);
Bunun bu şekilde create edildiğinden emin misin ? FHurda gerçekten oluşturulmuş mu kontrol et bence.
Kullanıcı avatarı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

Re: XSDecimal sayı aktarımında access violation

Mesaj gönderen veliadiguzel »

Birkaç değişiklik yaptık structor(fln_kantar) olarak değilde ayrı ayrı değişkenlerle yolladık veriyi sorun çözüldü. Normalda Bir structor(fln_kantar) icinde yolluyorduk bir şekilde c# serviste veriler kayboluyormuş.

Kod: Tümünü seç

  with Fln_kantar do
  begin
    XsDec := TXSDecimal.Create;
//    FISNO := edFisNo.Text;
    XsDec.DecimalString := Format('%d', [StrToInt(edAgirlik.Text)]);
//    TARTIM := XsDec;
//    OPERATOR := edOperator.Text;
//    KANTAR := edKantarNo.Text;
//    FISRF := edKantarId.Text;
//    MEINS := 'KG';
  end;
  FHurda := (RIO as HurdaSoap);
  FHurda.Kantar_Oku(edFisNo.Text,fln_kantar,XsDec, Ftb_yrddet, edRouterStr.Text, edAppHost.Text,
    StrToInt(edClient.Text), 'TR', edPassword.Text, StrToInt(edSysNum.text),
    edUser.Text, FKantar_OkuResult, Ftb_return);
  XsDec.Free;
Veli ADIGÜZEL
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: XSDecimal sayı aktarımında access violation

Mesaj gönderen me_turan@mynet.com »

Veli adıgüzel arkadaşım cok eski bir konuymuş bu. tam 6 yıl sonra tekrar hortlattım :) ama bende aynı problemi yaşadım ve senin yazdığın kodda create gördüm. Olay create etmekteymiş. Create edince problemsiz calısıyor. tşkler.. sayende buldum çözümü :)
Kullanıcı avatarı
veliadiguzel
Üye
Mesajlar: 197
Kayıt: 09 Tem 2003 02:11
Konum: Gebze/Kocaeli
İletişim:

Re: XSDecimal sayı aktarımında access violation

Mesaj gönderen veliadiguzel »

Ne demek sevindim.
Veli ADIGÜZEL
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: XSDecimal sayı aktarımında access violation

Mesaj gönderen me_turan@mynet.com »

var
mkod:TxsDecimal;
mhl:Array of TxsDecimal;
begin

SetLength(mhl, 10);
for k:=1 to 10 do
begin
mkod.XSToNative(m2deger.takbismahkod.Items[k]);
mhl[k]:= mkod;
showmessage(mhl[k].nativetoxs); // önce 1452 ve sonra 1453 mesajlarını veriyor.
end ;

ShowMessage(mhl[2].NativeToXS); 1453 mesajını veriyor
ShowMessage(mhl[3].NativeToXS); 1453 mesanını veriyor

en son mhl[5] = 'bes'; dedigimde mhl[1.2.3.4] hepsini bes yapıyor.

buna cözüm bulabilen bi arkadas varmı...en son atanan degeri dizenin tüm üyelerine atıyor.. cıldırtcak benii :)
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: XSDecimal sayı aktarımında access violation

Mesaj gönderen ertank »

Merhaba,

Öncelikle kod yazacağınız zaman "Tam Editör & Önizleme" butonunu tıklayarak ve ilgili kod parçacıklarını butonlar yardımı ile kod bloğu arasına koyarak forumu kullanmanızda fayda var. Kodlar bu şekilde çok daha kolay okunabilir oluyor.

Bununla birlikte begin..end arasında kalan kodları en az iki boşluk bırakarak içeriden (indent) yazmanız kodun çok daha okunaklı olmasını sağlayacaktır.

Sorunuzda kullandığınız Delphi sürümünü bildirmemişsiniz. Aşağıdaki örnek Delphi 10.2 Tokyo ile çalışmaktadır.

Paylaştığınız kod ile ilgili birden fazla hatanız var.
1- MHL değişkeni boyutu 10 adetlik büyütüldüğü zaman birinci eleman 0 (sıfır) son eleman 9 numaralı olmaktadır.
2- MHL değişken türü TXSDecimal olduğu için Create edilmeden kullanılamaz. Siz kodun herhangi bir yerinde bunu yapmamışsınız.
3- Her ne kadar 'bes' değerini kabul etse de TXSDecimal özünde ondalıklı değer iletişimi için kullanılır. Eğer özel bir sebebiniz yok ise 'bes' değerini normal string şeklinde iletişim kurmanızda fayda var.

Ben aşağıdaki kod ile sorun yaşamadan ilgili indeks verilerini okuyabildim.

Kod: Tümünü seç

uses
  Soap.XSBuiltIns;

procedure TForm1.Button1Click(Sender: TObject);
const
  Rakamlar: Array of string = ['1450', '1451', '1452', '1453', '1454', '1455', '1456', '1457', '1458', '1459', '1460'];
var
  Mhl: Array of TXSDecimal;
  I: Integer;
begin
  SetLength(Mhl, 10);

  for I := 0 to 9 do // Index sıfır tabanlıdır
  begin
    Mhl[I] := TXSDecimal.Create();  // TXSDecimal öncelikle create edilmelidir
    Mhl[I].XSToNative(Rakamlar[I+1]);
    ShowMessage(Mhl[I].NativeToXS);
  end;

  ShowMessage(Mhl[2].NativeToXS);
  ShowMessage(Mhl[3].NativeToXS);

  // İşimiz bitince hafızayı temizlemeliyiz
  for I := Low(Mhl) to High(Mhl) do
  begin
    Mhl[I].Free();
  end;
end;
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: XSDecimal sayı aktarımında access violation

Mesaj gönderen me_turan@mynet.com »

Kod: Tümünü seç

mhl[1].create;
denemiştim. ama aslında denemem gereken şey

Kod: Tümünü seç

mhl[1]:=TxsDecimal.create;
miş..
teşekkürler :)
şu an kullandığım bilgisayarda delphi yok fakat yarın ilk işim bunu denemek olacak :)
Cevapla