Delphi i Subiekt Sfera - jaki typ danych. Zgłupiałem całkiem!

0

Słuchajcie, całkiem zgłupiałem ze sferą w połączeniu z Delphi.
Sytuacja wygląda następująco:
Jakiś czas temu spróbowałem się z tym zmierzyć, nawet pisałem prośbę o pomoc na forum. W końcu jakoś sobie poradziłem i mam połączenie, potrafię utworzyć dokument itp. Czyli wszystko co potrzebowałem. Teraz przyszła pora aby dołączyć rozwiązanie do trochę większego mojego programu.
Oczywiście bez problemu uruchamiam program, ustawiam magazyn i biorę się za tworzenie dokumentu. Wszystko działa - albo i nie.

Przechodzę do konkretu. Tak Uruchamiam program (mam podpięty InsERT_TLB):

  try
    oGT := CreateOleObject('InsERT.GT');
    oDodatki := CreateOleObject('InsERT.Dodatki');
  except
    on e: exception do
    begin
      Application.MessageBox(Pchar('Błąd przy próbie uruchomienia Sfery dla Subiekt GT:' + #10#13 + e.message), 'Uwaga',
        mb_OK + mb_ICONERROR);
    end;
  end;

  oGT.Produkt := 1; // 1 - Subiekt
  oGT.Autentykacja := 0;
  oGT.Serwer := subiekt_baza_serwer; // zmienna kierująca na serwer SQL
  oGT.Uzytkownik := subiekt_baza_user; // user sql mający prawa do bazy
  oGT.UzytkownikHaslo := subiekt_baza_pass; // hasło usera powyżej
  oGT.Baza := subiekt_baza_baza; // nazwa bazy
  oGT.operator := subiekt_program_user; // użytkownik w Subiekt mający prawa które mnie interesują
  oGT.OperatorHaslo := oDodatki.Szyfruj(subiekt_program_pass); // hasło
  oSubiekt := oGT.Uruchom(0, 4); // start programu. 0 - uruchom a jak jest uruchomione to użyj, 4 - uruchamiaj w tle

  if not oSubiekt.Okno.Widoczne then //Aktualnie pokazuje okno, w trybie produkcyjnym będę ukrywał
    oSubiekt.Okno.Widoczne := True;

  oSubiekt.MagazynId := 1; // SEDNO SPRAWY

Jak widać, nie jest to zbyt skomplikowane.
Na końcu widać jak ustawiam odpowiedni magazyn i działa to bez problemu. Jednak gdy chciałbym to zrobić tak (a jest to niezbędne ponieważ program będzie tworzył dokumenty
na wielu magazynach):

var magazyn: Integer;
begin
  magazyn:=2;
  oSubiekt.MagazynId:=magazyn;
end;

to niestety Subiekt po uruchomieniu wyświetla okienko do ręcznego wyboru magazynu. Czyli, wie że uruchomiłem MagazynId ale nie wie jaką zmienną przekazałem.
Jest to bardzo dziwne bo w Visual Basic bez problemu działa przekazanie zmiennej jako Integer.

Oczywiście to nie koniec problemów. W czasie tworzenia dokumentu jest dokładnie to samo. Wpisanie jawnie wartości działa, poprzez zmienne już nie?

Pomoże ktoś?

0

a tak działa
magazyn:=1;
oSubiekt.MagazynId:=magazyn;
?

0

Problem częściowo rozwiązany. Okazało się że typy zmiennych w Delphi np. Integer to nie to samo co w Subiekcie. Trzeba robić konwersje.
Oto jak to rozwiązałem - dla potomnych:

function Tmain.VarToInt(const AVariant: Variant): integer;
begin
  Result := StrToIntDef(Trim(VarToStr(AVariant)), 0);
end;

function Tmain.VarToFloat(const AVariant: Variant): Double;
begin
  Result := StrToFloatDef(Trim(VarToStr(AVariant)), 0);
end;

Niestety nie poradzięm sobie jeszcze ze stringami. Znalazłem wpis @furious programming w którym zasugerował rozwiązanie:

var
  ID: OleVariant;
begin
  ID := StringToOleStr('FS 1/MAG/2017');

Niestety nie działa u mnie, dostaję błąd w czasie kompilacji: Incompatybile types: 'OleVariant' and 'PWideChar'
Nie jest to zaskoczeniem?

0
robertz68 napisał(a):

Niestety nie poradzięm sobie jeszcze ze stringami. Znalazłem wpis @furious programming w którym zasugerował rozwiązanie: […]

To jest rozwiązanie dla Free Pascala, a ze względu na różnice pomiędzy nim a Delphi, sposób ten może nie być przenośny. No i wychodzi na to, że nie jest.

0

Nie rozumiem o co chodzi, która to wersja Delphi? Przecież zwyczajne przypisanie jak poniżej działa (bez zmiennej pomocniczej też) we wszystkich Delphi z obsługą Unicode. Typ OleVariant nie jest kompatybilny z AnsiString musi być WideString.

var
  ID: OleVariant;
  s: string;
begin
  s:= 'FS 1/MAG/2017';
  ID := s;
end;
0

Delphi XE8.
Takie przypisanie działa bez problemu, tylko Subiekt tego nie rozumie. Bez wyrzucania jakiegokolwiek błędu po prostu ignoruje wartość jaką przekazuję. Pomysły mi się po prostu kończą. Użyłem kilku funkcji konwersujących i nic.
Mógłby mi ktoś prosto wytłumaczyć dlaczego taki wpis w kodzie działa:

oDokPA.DoDokumentuDataWystawienia := '2/17/2019';

a przez zmienną już nie? Co się dzieje w edytorze że zmienna przyjmuje wartości? Czy to kwestia że edytor używa zmiennych api windows np. zamiast string jest to np. LPSTR czy co*?

** to tylko wymyślony przykład aby pokazać o co mi chodzi*

0

Nie mam Subiekta więc nie sprawdzę jak to z tym jest, bo to dość dziwna sprawa ale takie pytanie InsERT_TLB generowałeś w tej samej wersji Delphi?

0

dokładnie tak. Ale żeby być pewnym wygenerował ponownie. Nie ma różnic w plikach i działaniu. Na forum subiekta wyczytałem że rzeczywiście typy danych Delphi nie są kompatybilne z typami Subiekta ale przecież musi istnieć jakaś konwersja?

0

No to nie wiem bez Subiekta nic nie sprawdzę ale może spróbuj typu ShortString albo kończ null czyli coś w stylu s:= 'FS 1/MAG/2017'#0;.
A jeszcze co do nowego TLB dla pewności przebuduj projekt.

1

Chyba odwołuję alarm jeśli chodzi o stringi, zadziałało mi gdy postanowiłem wpisać string do pola w dokumencie które na 100% przyjmuje taką wartość (akurat w moim przypadku było to pole "Odebrał"). Zmyliło mnie to że tworząc dokument podaję datę:

oDokPA.DoDokumentuDataWystawienia := '2/20/2019';  // czyli string

jednak w Visual Basic wygląda to tak:

oDokPA.DoDokumentuDataWystawienia = #02/05/2019#  // i to jest zmienna typu System.DateTime

dlatego pomyślałem sobie że utworzę takiego stringa z interesująca mnie datą i go użyję. Proste, ale jednak nie do końca.

Wychodzi na to że chyba potrzebuję datę jako olevariant. Czyli wracam do źródła :).

Jak jeszcze kogoś nie zmęczyłem to proszę o pomoc.

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