Skocz do zawartości

[Sfera] Zdeserializowany plik .epp, co dalej?

Polecane posty

Być może taka opcja jest gdzieś już w samym Subiekcie ale nie udało mi się niczego takiego znaleźć, dokumentacja Sfery też mi nie pomogła w tej kwestii więc kieruję pytanie tutaj :).

W ramach "szkolenia" napisałem sobie mały program który generuje pliki .epp faktur zakupowych na podstawie plików .xml dostawcy (niezależny od Sfery/Subiekta). Kolejnym etapem jest stworzenie rozwiązania własnego obserwującego wybraną ścieżkę w poszukiwaniu nowych plików .epp i automatycznie zaciągającego je do bazy. Aktualnie znajduje się na etapie:

object[] epp = InsERT.Moria.Narzedzia.EPP.EppSerializerUtils.DeserializujObiektyZPliku(e.FullPath);

Funkcja zwraca listę obiektów o nadrzędnym typie InsERT.Moria.Narzedzia.EPP.Typy z listą pól pliku .epp. Czy istnieje klasa potrafią przerobić obiekty tych typów na obiekty właściwe posiadające funkcję Zapisz() czy trzeba będzie przepisywać pola ręcznie? Na EppSerializerUtils trafiłem dzięki IntelliSense szperając w InsERT.Moria.Narzedzia, obiektu tego nie ma w bibliotece klas dokumentacji Sfery, niestety dalej już utknąłem i samodzielnie nie potrafię znaleźć rozwiązania innego niż ręczne przepisywanie którego za wszelką cenę wolałbym uniknąć.

Edytowane przez Paweł Sikowski
Link to postu

Może Pan skorzystać z interfejsów IWysylkaDanychDokumentow oraz IWysylkaDanychAsortymentow. W pierwszym z nich jest metoda WypelnijNaPodstawieDanychEpp, która jako parametry przyjmuje obiekt biznesowy dokumentu, który chcemy wypełnić (czyli np. IDokumentSprzedazy, IZamowienieOdKlienta etc), obiekty pobrane z pliku EPP (które ma Pan dostępne w tej tablicy object[] zwróconej przez metodę DeserializujObiektyZPliku, należy sobie tylko je odpowiednio odfiltrować np. metodą LINQ OfType<T>()) oraz kilka dodatkowych parametrów określających zachowanie się importu (jakie daty ustawiać na dokumencie, po czym synchronizować klientów oraz asortyment). Należy pamiętać, że taki wypełniony obiekt biznesowy należy potem zapisać (tak samo jak w aplikacji gdzie pojawia nam się formatka dokumentu).

W przypadku asortymentu jest prościej bo do metody OdbierzDaneAsortymentu przekazujemy po prostu dane z pliku EPP (wygenerowane jak wyżej) oraz parametry odbioru danych. Metoda ta sama automatycznie zapisuje odebrany asortyment, a w wyniku zwraca tylko ewentualne błędy. Do parametru referencyjnego powiazaniaAsortymentow metoda ta wpisuje powiązania między asortymentami, które zostały odczytane z pliku EPP, ale nie udało się "fizycznie" powiązać obu asortymentów ze sobą. Najczęsciej taka sytuacja występuje wtedy gdy asortyment powiązany nie istnieje bo zostanie odczytany z pliku EPP w jednym z kolejnych kroków odczytu.

Link to postu
  • 3 tygodnie później...

Przerwa świąteczna pokrzyżowała trochę moje plany szybkiego rozwiązania problemu ale dzięki Pana pomocy udało mi się doprowadzić program do prawidłowej kompilacji i uruchomienia, wystąpiły jednak komplikacje których nie potrafię sam rozwiązać.

Moim celem jest stworzenie programu który będzie działał w zasadzie identycznie do funkcji "Dodaj na podstawie" z menu "Komunikacja". Niezbędna jest mi do tego możliwość wprowadzania dokumentu zakupu nawet jeżeli w bazie nie istnieje jeszcze podmiot który wystawił taką fakturę lub asortyment który znajduje się na fakturze. Z asortymentem nie ma problemu - można dodać go przy pomocy  IWysylkaDanychAsortymentow przed zapisaniem samego dokumentu. Co jednak zrobić z podmiotem? Aktualnie procedura wygląda następująco:

// info, logistykaNaglowek, pozycje oraz asortyment
// wyodrębione wcześniej z pliku przy pomocy InsERT.Moria.Narzedzia.EPP.EppSerializerUtils.DeserializujObiektyZPliku()

IWysylkaDanychDokumentow importDokumentu = _sfera.PodajObiektTypu<IWysylkaDanychDokumentow>();

InsERT.Moria.ModelDanych.KategoriaDokumentu kategoria = importDokumentu.OdbierzKategorieDokumentu(logistykaNaglowek);
InsERT.Moria.ModelDanych.Konfiguracja konfiguracjaDokumentu = kategoria.Konfiguracje.First();
IDokumentyZakupu dokumentDoWypelnieniaMgr = _sfera.PodajObiektTypu<IDokumentyZakupu>();
IDokumentZakupu dokumentDoWypelnienia = dokumentDoWypelnieniaMgr.Utworz(konfiguracjaDokumentu);
importDokumentu.WypelnijNaPodstawieDanychEpp(dokumentDoWypelnienia, logistykaNaglowek, info, pozycje, DataImportEpp.Orygnalne, InsERT.Moria.Klienci.SposobSynchronizacjiKlientow.Symbol, SposobSynchronizacjiAsortymentu.Symbol, asortymenty);
dokumentDoWypelnienia.Zapisz();
Rozszerzenia.WypiszBledy(dokumentDoWypelnienia);

Podając takiej funkcji dokument o podmiocie wystawiającym którego nie ma jeszcze w bazie wywołanie funkcji "WypiszBledy" (funkcja z przykładu "Walidacja, błędy i ostrzeżenia"  instrukcji do sfery nexo) zwraca następujący komunikat:

Podmiot dla tego dokumentu jest wymagany.
 na polach:
DokumentDZ.Podmiot

Gdy spróbowałem dodać ten sam dokument ale już po dodaniu tego konkretnego kontrahenta ręcznie otrzymałem w zamian informację, że wymagane jest pole "magazyn" dla pozycji dokumentu, także wydaje mi się że jest tutaj jakiś problem z wybraną konfiguracją dokumentu.

Edytowane przez Paweł Sikowski
Link to postu

Faktycznie metody wypełniające dane podmiotów na podstawie danych zdeserializowanych z pliku EPP nie są "usferycznione". Mamy zapisane dodanie ich do API w jednej z najbliższych wersji.

Na ten moment mogę jedynie polecić samodzielne utworzenie podmiotu i wypełnienie go zdeserializowanymi danymi. Metoda WypelnijNaPodstawieDanychEPP zakłada, że odpowiedni asortyment oraz podmiot będą już zapisane w bazie. Dokładnie tak samo dzieje się to przy odbiorze dokumentu w samej aplikacji - najpierw zaczytywane są asortymenty oraz podmioty, w przypadku gdy któregoś z nich brakuje są dopisywane do bazy i dopiero potem program przystępuje do głównego importu dokumentu.

Jeśli chodzi o magazyn lub oddział to należy samemu zapewnić ich ustawienie na tworzonym dokumencie. Również odniosę się tutaj do aplikacji, w której działa to tak samo - magazyn/oddział nie jest w żaden sposób wczytywany z pliku EPP tylko dokument jest wystawiany na magazyn/oddział ustawiony w kontekście.

  • Dziękuję 1
Link to postu
×
×
  • Dodaj nową pozycję...