Optima, przeszukiwanie kolekcji.

Optima, przeszukiwanie kolekcji.
YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Witam,
zostałem przymuszony do nauki Optimy i po dniu i pół walki nasuwa mi się kilka pytań odnośnie przeszukiwania kolekcji.

W jaki sposób można wyszukać pracownika po PESEL-u?
Próbowałem wykorzystując parametr vWhere, ale zwraca mi błąd o braku znajomości danej kolumny.
var p = (IPracownik)session.CreateObject("CDN.Pracownicy", "PRI_Pesel='75061292372'");

Zacząłem kombinować ze zwykłym query:

Kopiuj
var rs = new ADODB.RecordsetClass();
var query = "Select PRI_Kod From CDN.Pracidx Where PRI_Pesel='75061292372'";
rs.Open(query, session.Connection, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly, 1);
if (rs.RecordCount > 0)
{
  Console.WriteLine($"[KOD] {rs.Fields[0].Value}");
}

i faktycznie, to działa, tylko nie jestem pewien czy to jest najlepsze podejście.

Widziałem też, że gdzieś w tych "nowszych" bibliotekach jest DataProvider, ale jeszcze z nim nie próbowałem walczyć.

Czy byłby ktoś w stanie trochę rozjaśnić jakie powinienem mieć podejście do przeszukiwania ów kolekcji?

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2180
1

Nie polecam w ogóle pobierać danych za pomocą COMów. Zrób to czystym SQLem, ogarnij sobie jakiegoś ORMa, zrób model i potem tylko konwertuj na odpowiedni interfejs pod zapis/edycję.

Nie działa tobie PRI_Pesel, ponieważ to CDN.Pracownicy to nie jest tabela CDN.PracIdx, a tabela CDN.PracKod

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

@AdamWox Dzięki za odpowiedź!

Zrób to czystym SQLem, ogarnij sobie jakiegoś ORMa, zrób model i potem tylko konwertuj na odpowiedni interfejs pod zapis/edycję.

Gdyby to ode mnie zależało to pewnie bym tak zrobił.

Trochę nie łapię, czemu ten CDN.Pracownicy jest tylko i wyłącznie przeszukiwany przy pomocy tabeli CDN.PracKod.
Jest jakaś inna możliwość wyszukania tych pracowników po PESEL-u przy użycia obiektów COM, czy całość ogranicza się jedynie do tej tabeli?

A co z tymi DataProviderami, korzystałeś z nich?

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2180
1

Gdyby to ode mnie zależało to pewnie bym tak zrobił.

Jako programista, który rozwiązuje ten problem powinno to zależeć od ciebie. Siedzę w tym bagnie zwanym Optimą już 7 lat i nigdy nie pobierałem danych za pomocą COMów. Owszem, później, przy dodawaniu, edycji musiałem zrobić całą tą litanie z session.CreateObject() i AddNew(), ale dane mogę sobie pobierać jak chce i robić joiny do czego chce i nie jest ograniczony bibliotekami Comarch.

Trochę nie łapię, czemu ten CDN.Pracownicy jest tylko i wyłącznie przeszukiwany przy pomocy tabeli CDN.PracKod.

Przyzwyczajaj się, tutaj nie ma żadnej logiki, ponieważ te biblioteki były pisane bardzo, bardzo dawno i wtedy to sens miało. Później przyszły nowe przepisy, trzeba było coś dopisać i się zrobił bałagan.

Co do szukania po peselu to mogę zerknąć i wrócę jeśli mi się to uda. Zdecydowanie prościej jest pobierać dane bezpośrednio z bazy, zwłaszcza jeśli będziesz chciał zrobić filtry, które mają ci zwrócić więcej niż jeden element, na przykład grupa kontrahentów. Każde uzupełnienie parametru vWhere powoduje, że zwracany jest jeden obiekt, nie można tego rzutować na kolekcje.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

@AdamWox: Jeszcze raz dziękuję za odpowiedź i rozwiązywanie moich wątpliwości.

Owszem, później, przy dodawaniu, edycji musiałem zrobić całą tą litanie

Rozumiem, czyli zrobić sobie model tylko do odczytu, a zapis robić przez magiczne formułki.

Co do szukania po peselu to mogę zerknąć i wrócę jeśli mi się to uda.

Byłbym wdzięczny za inne wskazówki 🙏
Brak jakiejkolwiek dokumentacji i/lub sensownych przykładów to chyba najlepszy przykład jakości Comarchu.

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2180
1

Rozumiem, czyli zrobić sobie model tylko do odczytu, a zapis robić przez magiczne formułki.

Instalujesz Dappera, akurat ja go używam, to żaden wymóg.

Robisz sobię klasę

Kopiuj
    public class Customer
    {
        public int Id { get; set; }
        public string Code { get; set; }
        public string Name1 { get; set; }
        public string Name2 { get; set; }
        public string Name3 { get; set; }
        public string VatNumber { get; set; }
    }

Robisz sobię zapytanie

Kopiuj
select Knt_KntId [Id], Knt_Kod [Code], Knt_Nazwa1 [Name1], Knt_Nazwa2 [Name2], Knt_Nip [VatNumber] from CDN.Kontrahenci

Odpytujesz bazę

Kopiuj
public async Task<IEnumerable<Customer>> GetAll(IDbConnection db)
{
  return await db.QueryAsync<Customer>("select Knt_KntId [Id], Knt_Kod [Code], Knt_Nazwa1 [Name1], Knt_Nazwa2 [Name2], Knt_Nip [VatNumber] from CDN.Kontrahenci");
}

I masz ładne angielskie nazwy pól, ładne modele, a nie jakieś Knt_Kod, Knt_KntId

A jak chcesz dodać kontrahenta to robisz sobie obiekt z danymi z modelu Customer

Kopiuj
public void Add(IAdoSession session, Customer entity)
{
  var kontrahent = (IKontrahent)((Kontrahenci)session.CreateObject("CDN.Kontrahenci")).AddNew();
  kontrahent.Akronim = entity.Code;
  kontrahent.Nazwa1 = entity.Name1;
  kontrahent.Nazwa2 = entity.Name2;
  kontrahent.Nazwa3 = entity.Name3;
  kontrahent.Nip = entity.VatNumber;

  session.Save();
}

PS.
Co do pracowników to nie potrafię tego ogarnąć. Nie mam doświadczenia za dużego z modułem kadr, ponieważ najwięcej operuje po stronie handlu i z nim związanych. Jeśli już mam coś wyszukać obiektami COM to raczej znam Kod, identyfikator, więc nie muszę szukać po peselu.

Jeśli jeszcze opcja żebyś sobie SQLem wziął id pracownika na podstawie numeru pesel. Jakbyś używał Dappera:

Kopiuj
public async Task<IPracownik> GetPracownik(IDbConnection db, IAdoSession session)
{
  var pracownikId = await db.QueryFirstOrDefault("select PRI_PraId from CDN.PracIdx where PRI_Pesel = '70060500554'");
  var pracownik = (Pracownik)session.CreateObject("CDN.Pracownicy", $"PRa_PRaId = {pracownikId}");
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.