Version 26 (modified by jachtelik, 12 years ago)

--

Integracja z Forte

  1. Konfiguracja źródła danych
  2. Instalacja widoków w FORTE
  3. Tworzenie połączenia z systemami zewnętrznymi
  4. SyncAssist - eksport danych z eDokumentów do systemu Forte FK
  5. OnTimer() - import i eksport danych do/z Forte HM
    5.1 Włączanie działania OnTimer()
    5.2 Informacje o możliwościach wykorzystania procedury OnTimer()

Konfiguracja źródła danych

Pierwszym krokiem integracji jest zdefiniowanie odpowiedniego źródła danych do baqzy danych systemu FORTE HANDEL. Do tego celu przechodzimy do Ustawień > Panel Sterowania > Pozostałe ustawienia > Źródła danych. W otwartym oknie wybieramy Nowe, a następnie definiujemy parametry połączenia.

  • Identyfikator źródła danych - wprowadzamy nazwę połączenia, przykładowo FORTE_HANDEL.
  • Sterownik - wybieramy sterownik połączenia, np. MsSQL lub ODBC.
  • Ciąg połączenia - ciąg połączenia do bazy danych. Dla MsSQL może to być np.
    Server=<adres serwera bazy danych np. 192.168.0.1>;Database=<nazwa bazy danych>;Uid=<uużytkownik>;Pwd=<hasło>;
    



(Rys.1 Ciąg połączenia z systemem Forte)

Na tym kończy się pierwszy etap integracji.

Instalacja widoków w FORTE

Idąc dalej musimy przygotować na bazie danych systemu FORTE HANDEL. W tym celu mając uprawnienia w systemie Ms SQL Server do tworzenia obiektów na bazie danych wykonujemy skrypt z lokalizacji:public_html/apps/edokumenty/modules/Settings/BSConnectSettings/install/sql/externals/symfonia_forte_handel/01_install_relations_crt.sql:

Tworzenie połączenia z systemami zewnętrznymi

Kolejnym krokiem w tym procesie jest modyfikacja pliku config.inc. Należy dodać lub zmodyfikować wpis w tym pliku:

define('SYNC_ACTIVE','NEW');

Po ponownym zalogowaniu w systemie pojawia się przycisk w menu Narzędzia > Połączenia z systemami zewnętrznymi. Widok przycisku przedstawia poniższy rysunek:



(Rys.2 Połączenia z systemami zewnętrznymi)

Domyślnie żadne połączenie nie jest zdefiniowane. Połączenie tworzymy klikając polecenie Nowy.



(Rys.3 Okno definiowania połączenia z systemem Forte)

W nowo otwartym oknie należy wypełnić pola:

  • Nazwę połączenia z systemem zewnętrznym - nazwa musi być unikalna,
  • Wybrać identyfikator systemu SYMFONIA_FORTE
  • Wskazać źródło wymiany. Jeżeli nie istnieje to można utworzyć.



(Rys.4 Okno definiowania źródła wymiany danych)

W źródle wymiany wprowadzamy:

  • unikalną nazwę,
  • wybieramy typ z listy rozwijanej (opis poniżej),
  • źródło danych (dla typu DB),
  • nazwa schematu w bazie Forte (najczęściej będzie to edokumenty - również dla połączeń typu DB)
  • ścieżkę składu (dla typów XML i CUSTOM_XML)
  • klasę (dla typu CUSTOM_XML)

Źródło wymiany danych może być następujących typów:

  • DB - Wymiana poprzez bazę danych. Wymaga istnienia dedykowanych widoków lub odpowiednich zapytań SQL
  • XML - wymiana danych poprzez pliki XML. Podaje się ścieżkę do katalogu będącego składem plików
  • CUSTOM_XML - jw. z tą różnicą, że wymagana jest dedykowana klasa PHP do obsługi takiego transferu.

Gdy posiadamy już połączenie z systemem zewnętrznym należy skopiować pliki map np.

cp APP_DATA/var/tpl/sync/SYMFONIA_FORTE_HANDEL_columns_map.ini APP_DATA/etc/sync/

a następnie zmienić nazwę skopiowanego pliku w katalogu sync na <IDENTYFIKATOR_Z_BS_CONNECT_SYSTEMS>_columns_map.ini np. 1_columns_map.ini, gdzie jest identyfikator połączenia z okna połączeń z systemami zewnętrznymi.

Przykładowa zawartość takiego pliku to:

[CONTACT]
nazwa = name_1
skrot = name_2
kodpocz = code__
rejon = woj___
ulica = street
dom = bldnum
lokal = fltnum
miejscowosc = city__
nip = nip___
pesel = pesel_
regon = regon_
kraj = countr
fax = faxnum
email = email_
www = www___
telefon1 = ph_num
telefon2 = ph_num
nazwisko = cntprs
imie = cntprs
Uwagi = notes_

[DOCUMENT]
data = data__
terminplat = paytrm
kod = symbol
netto = netto_
vat = vat___
brutto = brutto
dctype = dctype
acorid = acorid

[PRODUCT]
kod = symbol
nazwa = name__
jm = unitid
vat = vat_id
katalog=pgr_id
stanmin = quamin
cena_zakupu = purcst
cena_sprzedazy = netto_

[FKELEMENT]
lp = prior_
kodtw = symbol
opis = dscrpt
jm = unitnm
ilosc = quantm
cenanetto = netto_
vat_id = vat_id
kodtw = depsym
opis = depnam
opis = mname_

To jeszcze nie wszystko. Należy również ustawić zasady importu dla danego modułu. Otóż wchodzimy w Połączenia z systemami zewnętrznymi, wybieramy połączenie, edytujemy je - przechodzimy do zakładki Synchronizacja. W tej zakładce wybieramy np. Produkty i dajemy edytuj. W nowym oknie wybieramy akcję i edytujemy ją. Wprowadzamy tam zasady, wg których przebiegnie dalsza akcja.



(Rys.5 Edycja zasad importu danych)



(Rys.6 Edycja zasad importu danych)

Po tak zdefiniowanych elementach należy przejść do odpowiedniego modułu, wybieramy przycisk Połączenie >> <Nazwa połączenia> >> <akcja do wykonania>



(Rys.7 Przyykładowe pobranie dokumentów)

SyncAssist - eksport danych z eDokumentów do systemu Forte FK

<TODO>

OnTimer() - import i eksport danych do/z Forte HM

W systemie Forte (HM) dostępny jest mechanizm wywoływania procedur. Jest to zestaw różnych procedur. Jedną z nich jest OnTimer(). Jest to swego rodzaju Raport, który jest uruchamiany w określonych interwałach czasu.

Włączanie działania OnTimer()

  • Mając odpowiednie uprawnienia administratora w systemie Forte HM Z lewego panelu wybieramy menu Ustawienia.
  • Po otwarciu się w prawym panelu okna z danymi Ustawień przechodzimy do Ustawienia > Firma > Parametry pracy.
  • W prawym panelu przechodzimy do Wykonywanie procedur > OnTimer.
  • Po zaznaczeniu OnTimer wybieramy edytuj i wybieramy TAK, a następnie zapisujemy.

Informacje o możliwościach wykorzystania procedury OnTimer()

Mając już włączony mechanizm wykonywania raportu OnTimer musimy wykonać raport. Raport jest opcjonalny, gdyż wszystkie niezbędne instrukcje można oczywiście ująć w OnTimerze.

HMF ofertuje wiele możliwości wykonania procedur. Są to:

  • język raportów AmBasic - język skryptowy własny dostępny w Handlu Forte, który umieszczamy bezpośrednio w raporcie, jest kombinacją języka VB oraz C, nie posiada dobrej dokumentacji (ta co jest, to załączam do niniejszej instrukcji).
  • język VBA, czyli Visual Basic For Applications - produkt wykorzystywany przez Microsoft m.in. w produktach pakietu Office. Jest dość okrojona wersja Visual Basic-a, ale do tych potrzeb jest po prostu rewelacyjna.

Na potrzeby integracji sugeruje się wykorzystać język VBA. Import danych do Forte HM (na przykładzie generowania dokumentu Zamówienia Obcego przedstawiam poniżej.

  1. W systemie Forte Handel uruchamiamy z menu VBA > VBA IDE. Uruchamia się środowisko programowania VBA, w którym utworzymy skrypt integracyjny.
  2. Otwieramy UserElement z lewego Panelu >> pokazuje się okno kodu VBA.
  3. Wprowadzamy kod VBA skryptu:
    Private Sub GenerateZO()
    
    
    ' Deklaracje zmiennych
    Dim oFactory As Object
    Dim oRec As Object 'Rekord danych
    Dim nError
    
    Dim sDocumentType As String ' Typ dokumentu
    Dim sDesc As String ' Opis dokumentu
    Dim sClientCode As String 'Nazwa kontrahenta
    Dim sProductCode As String 'Kod produktu
    Dim sQuantity As String ' Ilosc
    Dim sPrice As String ' Cena netto
    
    Dim sPath As String ' ścieżka katalogu z plikami wyeksportowanymi z eDokumentów
    Dim sBkpPath As String  ' ścieżka katalogu, do którego odczytane i przetworzone pliki
                            ' zostaną przeniesione po zakończonym procesie
    Dim sName As String ' nazwa pliku
    Dim sFileName As String ' kompletna ścieżka do pliku
    Dim iFileNum As Integer ' znacznik pliku do operacji Input, Line Input
    Dim sBuf As String ' Bofor stringu odczytanego z pliku
    Dim iCounter As Integer ' Licznik przebiegu po liniach pliku
    Dim iNumber As Integer ' Licznik przebiegu po liniach pozycji produktu w pliku
    Dim oFileSystem As Object ' Obiekt do operacji na plikach
    
    Set oFileSystem = CreateObject("Scripting.FileSystemObject")
    
    sPath = "C:\Users\ztestowy\dane\"
    sBkpPath = "C:\Users\ztestowy\dane\done\"
    sName = Dir$(sPath & "*.txt") ' Pobranie listy plików w katalogu
    
    Do While sName <> "" ' Jeżeli/dopóki istnieją pliki w katalogu to wykonaj dalsze operacje
            sFileName = sPath & sName ' Ustawienie pełnej ścieżki dokumentu
            
            iFileNum = FreeFile()
    
            iCounter = 1 ' Licznik przebiegu po liniach pliku
            iNumber = 0 ' Licznik przebiegu po pozycjach dokumentu.
                        ' Dopuszczalne wartości dla jednej pozycji dokumentu to 0-2
                        ' 0 - symbol produktu
                        ' 1 - ilość
                        ' 2 - cena netto
            Open sFileName For Input As iFileNum
    
            ' Tworzenie obiektów deklaracji danych
            Set oFactory = Application.PropertyAp("HFactory")
            Set oRec = oFactory.NewObject("BIORec") ' Rekord danych, który zostanie wstawiony do systemu
    
            sDocumentType = "ZMO" ' Typ dokumentu: Zamówienie obce
            nError = oRec.SetField("typDk", Trim(sDocumentType)) ' Ustawienie typu dokumentu
    
            Do While Not EOF(iFileNum)
                            Line Input #iFileNum, sBuf
                            
                            Select Case iCounter
                                    Case Is = 1 ' Wywołanie identyfikatora kontrahenta
                                            
                                            sClientCode = "" & Trim(sBuf)
                                            nError = oRec.BeginSection("danekh")
                                                    nError = oRec.SetField("KhKod", Trim(sClientCode))
                                            nError = oRec.EndSection()
                                    Case Is = 2 ' Opis dokumentu
                                            sDesc = Trim(sBuf)
                                            nError = oRec.SetField("opis", Trim(sDesc))
                                    Case Is > 2 ' Pozycje dokumentu
                                            
                                            
                                            Select Case iNumber
                                                    Case Is = 0 ' Kod produktu
                                                            sProductCode = Trim(sBuf)
                                                            nError = oRec.BeginSection("Pozycja dokumentu")
                                                            nError = oRec.SetField("kod", Trim(sProductCode))
                                                            
                                                    Case Is = 1 ' Ilość
                                                            sQuantity = Trim(sBuf)
                                                            nError = oRec.SetField("ilosc", Trim(sQuantity))
                                                            
                                                    Case Is = 2 ' Cena netto
                                                            sPrice = Trim(sBuf)
                                                            nError = oRec.SetField("cena", Trim(sPrice))
                                                            nError = oRec.EndSection()
                                       
                                            End Select
                                            
                                            iNumber = iNumber + 1 ' Inkrementacja licznika
                                            If iNumber > 2 Then
                                                    iNumber = 0 ' Resetowanie wartości licznika
                                            End If
                                    
                                    
                            End Select
                            
                            iCounter = iCounter + 1
                            
                Loop
    
                    Dim oFunction As Object
                    Set oFunction = oFactory.NewObject("BFunkcja")
                    
                    ' Wywołanie generowania dokumentu
                    Dim DocumentID As Long
                    DocumentID = oFunction.ImportZO(oRec) ' GENEROWANIE DOKUMENTU ZAMÓWIENIA OBCEGO
    
                    Close iFileNum ' Zamykanie pliku
                    
                    oFileSystem.MoveFile sFileName, sBkpPath & sName ' Przeniesienie pliku do katalogu bkp
                    
                    sName = Dir()
    Loop
    
    End Sub
    
    
  4. Aby wywołać powyższy skrypt dodajemy w tym samym module metodę:
    Private Sub MainDoc_TryToOpen(ByVal Category As String, ByVal Group As String, Name As String, ByVal ActionType As AmOpenAction, Cancel As Boolean)
     'Procedura ta wykonywana jest w momencie uruchamiania okna bądź raportu
     
     If Name = "OnTimer" Then GenerateZO
    End Sub
    

W takim przypadku w momencie każdorazowego uruchomienia procedury OnTimer uruchomi się metoda GenerateZO i pliki w katalogu zostaną wczytane do bufora systemu HMF.

Załączniki