= Integracja z Forte = === Menu === #menu 1. [#data_source Konfiguracja źródła danych] 2. [#views_install Instalacja widoków w FORTE] 3. [#bs_connect_data_sources Tworzenie połączenia z systemami zewnętrznymi] 4. [#syncassist SyncAssist - eksport danych z eDokumentów do systemu Forte FK] 5. [#ontimer OnTimer() - import i eksport danych do/z Forte HM][[BR]] 5.1 [#ontimer_on Włączanie działania OnTimer()][[BR]] 5.2 [#wykorzystanie_ontimer Informacje o możliwościach wykorzystania procedury OnTimer()][[BR]] == Konfiguracja źródła danych == #data_source 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=;Database=;Uid=;Pwd=; }}} [[BR]][[Image(img001.png)]][[BR]]''(Rys.1 Ciąg połączenia z systemem Forte)''[[BR]] Na tym kończy się pierwszy etap integracji. == Instalacja widoków w FORTE == #views_install 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 == #bs_connect_data_sources 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: [[BR]][[Image(img002.png)]][[BR]]''(Rys.2 Połączenia z systemami zewnętrznymi)''[[BR]] Domyślnie żadne połączenie nie jest zdefiniowane. Połączenie tworzymy klikając polecenie ''Nowy''. [[BR]][[Image(forte001.jpg)]][[BR]]''(Rys.3 Okno definiowania połączenia z systemem Forte)''[[BR]] 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ć. [[BR]][[Image(forte002.jpg)]][[BR]]''(Rys.4 Okno definiowania źródła wymiany danych)''[[BR]] 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 {{{_columns_map.in}}}i 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. [[BR]][[Image(forte004.jpg)]][[BR]]''(Rys.5 Edycja zasad importu danych)''[[BR]] [[BR]][[Image(forte005.jpg)]][[BR]]''(Rys.6 Edycja zasad importu danych)''[[BR]] Po tak zdefiniowanych elementach należy przejść do odpowiedniego modułu, wybieramy przycisk Połączenie >> >> [[BR]][[Image(forte003.jpg)]][[BR]]''(Rys.7 Przyykładowe pobranie dokumentów)''[[BR]] == !SyncAssist - eksport danych z eDokumentów do systemu Forte FK == #syncassist == !OnTimer() - import i eksport danych do/z Forte HM == #ontimer 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() === #ontimer_on * 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() === #wykorzystanie_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.