Delphi i Sfera Subiekt GT

0

Dzień dobry wszystkim,
Czy znajdzie się tutaj jakiś magik, który pomoże mi w rozwikłaniu problemu z jedną z metod Sfery dla Subiekta GT? Dokładnie chodzi o metodę NaPodstawieWielu. W dokumentacji jest napisane, że parametrem dla tej metody powinna być tablica, w której zapisane są wartości Id z tabeli dokumentów w bazie danych. W przykładzie VBA for Excel, jest to tablica Longów. Kiedy próbuję zaimplementować to w Delphi niestety nie działa. Ani zwykła tablica integer/int64/longint itp. Ani też tablica Variantowa. O ile przy zwykłej tablicy wywala błąd podczas kompilacji, że ten typ nie jest obsługiwany, to w przypadku tablicy Variantów, program się kompiluje, ale wywala błąd Niedopasowanie typów. I stoję, i nie wiem jak to dalej ugryźć. Może jakaś dobra dusza pomoże.
Kod:

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, k, iloscWZ: Integer;
  dataWyst, nrDokPelny, nrDok, wzNrPelny, oPoz, oPozNew: Variant;
  oDok: OleVariant;
  wz: array of string;
  //wzId: array of Longint;
  wzId: Variant;
begin
  ADOConnection1.Connected := True;
  oGT := CreateOleObject('InsERT.gt');
  oDodatki := CreateOleObject('InsERT.Dodatki');
  oGT.Produkt := 1;
  oGT.Serwer := 'adres';
  oGT.Baza := 'db';
  oGT.Autentykacja := 0;
  oGT.Uzytkownik := 'sa';
  oGT.UzytkownikHaslo := 'xxxx';
  oGT.Operator := 'Szef';
  oGT.OperatorHaslo := 'xxxx';
  oSGT := oGT.Uruchom(gtaUruchom,gtaUruchomNowy);
  oSGT.Okno.Widoczne := true;

  for i := 0 to Memo1.Lines.Count do
  begin
    ADOQuery1.Active := False;
    ADOQuery1.SQL.Text := 'SELECT * FROM dok__Dokument WHERE dok_DoDokNrPelny = ''' + Memo1.Lines.Strings[i] + ''' AND dok_Typ = 11;';
    ADOQuery1.Active := True;
    iloscWZ := ADOQuery1.RecordCount;
    SetLength(wz, iloscWZ);
    //SetLength(wzId, iloscWZ);
    wzId := VarArrayCreate([0, iloscWZ - 1], varInteger);

    for j := 0 to iloscWZ - 1 do
    begin
      wz[j] := ADOQuery1.FieldByName('dok_NrPelny').AsString;
      wzId[j] := ADOQuery1.FieldByName('dok_Id').AsInteger;
      ADOQuery1.Next;
    end;
    nrDokPelny := Memo1.Lines.Strings[i];
    oDok := oSGT.Dokumenty.Wczytaj(VarToStr(nrDokPelny));
    dataWyst := oDok.DataWystawienia;
    nrDok := oDok.Numer;
    oDok.Usun;

    for j := 0 to iloscWZ - 1 do
    begin
      wzNrPelny := wz[j];
      oDok := oSGT.Dokumenty.Wczytaj(VarToStr(wzNrPelny));
      for k := oDok.Pozycje.Liczba downto 1 do
      begin
        oPoz := oDok.Pozycje.Element[k];
        if oPoz.TowarSymbol = 'Symbol' then
        begin
          oPozNew := oDok.Pozycje.DodajUslugeJednorazowa;
          oPozNew.Jm := oPoz.Jm;
          oPozNew.IloscJm := oPoz.IloscJm;
          oPozNew.UslJednNazwa := 'Towar';
          oPozNew.CenaNettoPrzedRabatem := oPoz.CenaNettoPrzedRabatem;
          oPoz.Usun;
        end;
      end;
      oDok.Zapisz;
      oDok.Zamknij;
    end;
    oDok := oSGT.SuDokumentyManager.DodajFSz;
    oDok.DataWystawienia := FormatDateTime('yyyy-mm-dd', StrToDate(dataWyst));
    oDok.Numer := nrDok;
    oDok.NaPodstawieWielu[wzId];
    oDok.Zapisz;
    oDok.Zamknij;
  end;
  oSGT.Zakoncz;
  ADOConnection1.Connected := False;
end;
0

w linii 32 spróbuj zamiast varInteger dać varVariant

1

ale po co tak kombinujesz? Oczywiście że jest pewien problem z typami danych w Sferze ale nie jest to coś strasznego.

Po pierwsze, pracujesz w Delphi więc używasz wszędzie typów danych z Delphi. Dopiero przy przekazywaniu danych do kontrolki Sfery robisz rzutowanie na odpowiedni typ.

Malutki przykład, bo na więcej nie mam czasu ale to powinno ci wystarczyć:

var
  wzId: array of Integer;
begin

  SetLength(wzId, 3);
  wzId[0] := 11017; // dane z mojego Subiekta
  wzId[1] := 11018;
  wzId[2] := 11019;

  oDokFSz := oSGT.SuDokumentyManager.DodajFSz;
  oDokFSz.NaPodstawieWielu[OleVariant(wzId)];
  oDokFSz.Zapisz;
  oDokFSz.Zamknij;
0

@robertz68: Jak zwykle niezastąpiony. Co prawda jakiś błąd występuje przy zamknięciu dokumentu, ale sam dokumentu powstaje. Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1