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;