Aby to było jakoś spójne ja bym to zrobił mniej więcej tak:
W systemie eksportującym dane:
- Tworzę listę rekordów które będę chciał wyeksportować. Będzie to jedno query, bez znaczenia czy będzie to jeden rekord, wiele, grupa. To już musisz tylko ustalić jakieś warunki w zapytaniu aby takie rekordy otrzymać jak chcesz. Podsumowując: jedno query które utworzy jednego dataseta. No dobra, powiedzmy że będzie to kilka, kilkanaście rekordów plus jakaś grupa dodatkowo, gdyby zapytanie sql miało się jakoś bardzo mocno rozbudować a pojedyncze miałyby być bardzo proste to można przecież zrobić więcej takich zapytań a dane wyjściowe zapisać w czymś na kształt listy.
- W tej mojej liście zapamiętałbym tylko id rekordu (towaru, kontrahenta, dokumentu) bo na teraz tylko to jest potrzebne i na koniec przeniósł do jakiegoś dataseta ale to niekoniecznie.
Mała uwaga: jeśli zapytania mają być bardzo podobne można dla optymalizacji utworzyć widoki w bazie danych. Jeśli nie korzystałeś to poczytaj sobie o nich.
Gdy mam już te dane w datasetcie to należy w pierwszej kolejności zastanowić się w jaki sposób będziesz kojarzył rekordy w dwóch niezależnych systemach.
Jest kilka opcji, omówię je bardzo pokrótce:
- najprostsza, w systemie importującym ten sam towar / kontrahent / dokument ma te same id w bazie lub w ostateczności jest pole z id z naszej bazy (nazwijmy je polem z obcym Id).
- średnio skomplikowana, nie ma w bazie docelowej pola z Id naszego rekordu ale możemy towary rozpoznać np. po unikatowym kodzie EAN, kontrahentów po NIP-ie a dokumenty po numerze. Jest to do przyjęcia ale na pewno będą problemy (nie wszystkie towary mają kod EAN, kontrahenci mogą mieć różnie zapisany NIP, chociaż można to wyeliminować poprzez usuwanie wszystkiego poza cyframi (pewien problem przy nipie EU), numery dokumentów nie powinny sprawić problemów).
- nie ma żadnego powiązania, towary nie mają kodów EAN lub innych unikatowych, kontrahenci są z unikatowym nipem ale są też i detaliści i jest jedenastu Janów Kowalskich, dokumenty powinny mieć jednak unikatowe numery. Tutaj będzie trudno, można pokusić się o jakieś filtrowanie aby znaleźć odpowiednik naszego rekordu ale bez mechanizmu do ręcznego kojarzenia nierozpoznanych rekordów się nie obędzie.
I teraz w zależności od scenariusza:
- po prostu eksportujemy dane do pliku, rekord po rekordzie,
with qryTowary, SQL do
begin
Clear;
Close;
Add('SELECT Id FROM Towary WHERE Warunek = :Warunek');
ParamByName('Warunek').AsString := warunek;
Open;
First;
end;
while not qryTowary.Eof do
begin
mmoEksport.Items.Add(qryTowary.FieldByName('Id').AsString); // dla przykładu zapis danych do memo
qryTowary.Next;
end;
- tutaj także może być prosto jeśli zrzucimy odpowiedzialność za weryfikację danych oraz zarządzanie duplikatami na aplikację importującą. W zasadzie eksport może wglądać jak powyżej, tylko zamiast Id eksportujemy w pliku EAN, NIP lub numer dokumentu. Jeśli jednak system importujący w aplikacji docelowej nie ma mechanizmów weryfikujących to rozwiązanie trzecie jest także dla ciebie.
- ten przypadek wymagać będzie:
a. dostęp do bazy danych systemu importującego, zerknijmy na przykład z towarami:
with qryTowary, SQL do // na początek utworzymy sobie listę towarów do eksportu w naszej aplikacji
begin
Clear;
Close;
Add('SELECT Id, Kod, Nazwa, EAN, Opis FROM Towary WHERE Warunek = :Warunek');
ParamByName('Warunek').AsString := warunek;
Open;
First;
end;
// sam ustalisz po jakich polach chcesz poszukiwać, powiedzmy jako przykład tak (bez sensu):
while not qryTowary.Eof do // no i teraz przejedziemy się przez nie do końca
begin
with qryEksport, SQL do
begin
Clear;
Close;
Add('SELECT Id, Kod, Nazwa, EAN, Opis FROM Towary WHERE Id = :Id or Kod = :Kod or Nazwa = :Nazwa or EAN = :EAN or Opis like :Opis');
ParamByName('Id').AsInteger := qryTowary.FieldByName('Id').AsInteger;
ParamByName('Kod').AsInteger := qryTowary.FieldByName('Kod').AsInteger;
ParamByName('Nazwa').AsString := qryTowary.FieldByName('Nazwa').AsString;
ParamByName('Opis').AsString := '%' + qryTowary.FieldByName('Opis').AsString + '%'; // tą linijką zabijesz wydajność ale co zrobić
Open;
First;
end;
// teraz opis
jeśli zapytanie powyżej znajdzie jakieś rekordy to
- jeśli jest to jeden rekord to dodaj go do pliku eksportowanego
jeśli jest ich więcej
- to należy utworzyć formę na której wyświetlisz parametry twojego eksportowanego towaru (aby użytkownik jak najwięcej o nim wiedział) oraz tabelę z rekordami znalezionymi
użytkownik poprzez kliknięcie na odpowiedni rekord powinien oznaczyć ten odpowiedni
(wypadałoby albo automatycznie zapamiętać takie powiązanie albo chociaż zapytać czy to zapamiętać na przyszłość)
po skojarzeniu dodać rekord do pliku eksportowanego
w przypadku braku skojarzenia określić co dalej:
1. zapamiętać i na koniec wyświetlić z tego raport,
2. jeśli to możliwe to od razu utworzyć rekord w systemie docelowym i wykonać eksport.
qryTowary.Next;
end;
Jak widać, nie będzie to tak bardzo proste i zapewne mogą być ograniczenia które nie pozwolą na rozwiązanie problemu (np. brak dostępu do systemu docelowego).
Może coś więcej można by napisać gdybyś podał więcej informacji.