| 1 | = [wiki:DeployerGuide Przewodnik wdrożeniowca] > Integracja z Forte HM przy pomocy procedury !OnTimer = #ontimer |
| 2 | |
| 3 | |
| 4 | 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. |
| 5 | |
| 6 | === Włączanie działania !OnTimer() === #ontimer_on |
| 7 | |
| 8 | * Mając odpowiednie uprawnienia administratora w systemie Forte HM Z lewego panelu wybieramy menu Ustawienia. |
| 9 | * Po otwarciu się w prawym panelu okna z danymi Ustawień przechodzimy do ''Ustawienia > Firma > Parametry pracy''. |
| 10 | * W prawym panelu przechodzimy do ''Wykonywanie procedur > !OnTimer''. |
| 11 | * Po zaznaczeniu !OnTimer wybieramy edytuj i wybieramy TAK, a następnie zapisujemy. |
| 12 | |
| 13 | === Informacje o możliwościach wykorzystania procedury !OnTimer() === #wykorzystanie_ontimer |
| 14 | Mając już włączony mechanizm wykonywania raportu !OnTimer musimy wykonać raport. |
| 15 | Raport jest opcjonalny, gdyż wszystkie niezbędne instrukcje można oczywiście ująć w !OnTimerze. |
| 16 | |
| 17 | HMF ofertuje wiele możliwości wykonania procedur. Są to: |
| 18 | * 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). |
| 19 | * 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. |
| 20 | |
| 21 | |
| 22 | 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. |
| 23 | 1. W systemie Forte Handel uruchamiamy z menu VBA > VBA IDE. Uruchamia się środowisko programowania VBA, w którym utworzymy skrypt integracyjny. |
| 24 | 2. Otwieramy UserElement z lewego Panelu >> pokazuje się okno kodu VBA. |
| 25 | 3. Wprowadzamy kod VBA skryptu: |
| 26 | {{{ |
| 27 | Private Sub GenerateZO() |
| 28 | |
| 29 | |
| 30 | ' Deklaracje zmiennych |
| 31 | Dim oFactory As Object |
| 32 | Dim oRec As Object 'Rekord danych |
| 33 | Dim nError |
| 34 | |
| 35 | Dim sDocumentType As String ' Typ dokumentu |
| 36 | Dim sDesc As String ' Opis dokumentu |
| 37 | Dim sClientCode As String 'Nazwa kontrahenta |
| 38 | Dim sProductCode As String 'Kod produktu |
| 39 | Dim sQuantity As String ' Ilosc |
| 40 | Dim sPrice As String ' Cena netto |
| 41 | |
| 42 | Dim sPath As String ' ścieżka katalogu z plikami wyeksportowanymi z eDokumentów |
| 43 | Dim sBkpPath As String ' ścieżka katalogu, do którego odczytane i przetworzone pliki |
| 44 | ' zostaną przeniesione po zakończonym procesie |
| 45 | Dim sName As String ' nazwa pliku |
| 46 | Dim sFileName As String ' kompletna ścieżka do pliku |
| 47 | Dim iFileNum As Integer ' znacznik pliku do operacji Input, Line Input |
| 48 | Dim sBuf As String ' Bofor stringu odczytanego z pliku |
| 49 | Dim iCounter As Integer ' Licznik przebiegu po liniach pliku |
| 50 | Dim iNumber As Integer ' Licznik przebiegu po liniach pozycji produktu w pliku |
| 51 | Dim oFileSystem As Object ' Obiekt do operacji na plikach |
| 52 | |
| 53 | Set oFileSystem = CreateObject("Scripting.FileSystemObject") |
| 54 | |
| 55 | sPath = "C:\Users\ztestowy\dane\" |
| 56 | sBkpPath = "C:\Users\ztestowy\dane\done\" |
| 57 | sName = Dir$(sPath & "*.txt") ' Pobranie listy plików w katalogu |
| 58 | |
| 59 | Do While sName <> "" ' Jeżeli/dopóki istnieją pliki w katalogu to wykonaj dalsze operacje |
| 60 | sFileName = sPath & sName ' Ustawienie pełnej ścieżki dokumentu |
| 61 | |
| 62 | iFileNum = FreeFile() |
| 63 | |
| 64 | iCounter = 1 ' Licznik przebiegu po liniach pliku |
| 65 | iNumber = 0 ' Licznik przebiegu po pozycjach dokumentu. |
| 66 | ' Dopuszczalne wartości dla jednej pozycji dokumentu to 0-2 |
| 67 | ' 0 - symbol produktu |
| 68 | ' 1 - ilość |
| 69 | ' 2 - cena netto |
| 70 | Open sFileName For Input As iFileNum |
| 71 | |
| 72 | ' Tworzenie obiektów deklaracji danych |
| 73 | Set oFactory = Application.PropertyAp("HFactory") |
| 74 | Set oRec = oFactory.NewObject("BIORec") ' Rekord danych, który zostanie wstawiony do systemu |
| 75 | |
| 76 | sDocumentType = "ZMO" ' Typ dokumentu: Zamówienie obce |
| 77 | nError = oRec.SetField("typDk", Trim(sDocumentType)) ' Ustawienie typu dokumentu |
| 78 | |
| 79 | Do While Not EOF(iFileNum) |
| 80 | Line Input #iFileNum, sBuf |
| 81 | |
| 82 | Select Case iCounter |
| 83 | Case Is = 1 ' Wywołanie identyfikatora kontrahenta |
| 84 | |
| 85 | sClientCode = "" & Trim(sBuf) |
| 86 | nError = oRec.BeginSection("danekh") |
| 87 | nError = oRec.SetField("KhKod", Trim(sClientCode)) |
| 88 | nError = oRec.EndSection() |
| 89 | Case Is = 2 ' Opis dokumentu |
| 90 | sDesc = Trim(sBuf) |
| 91 | nError = oRec.SetField("opis", Trim(sDesc)) |
| 92 | Case Is > 2 ' Pozycje dokumentu |
| 93 | |
| 94 | |
| 95 | Select Case iNumber |
| 96 | Case Is = 0 ' Kod produktu |
| 97 | sProductCode = Trim(sBuf) |
| 98 | nError = oRec.BeginSection("Pozycja dokumentu") |
| 99 | nError = oRec.SetField("kod", Trim(sProductCode)) |
| 100 | |
| 101 | Case Is = 1 ' Ilość |
| 102 | sQuantity = Trim(sBuf) |
| 103 | nError = oRec.SetField("ilosc", Trim(sQuantity)) |
| 104 | |
| 105 | Case Is = 2 ' Cena netto |
| 106 | sPrice = Trim(sBuf) |
| 107 | nError = oRec.SetField("cena", Trim(sPrice)) |
| 108 | nError = oRec.EndSection() |
| 109 | |
| 110 | End Select |
| 111 | |
| 112 | iNumber = iNumber + 1 ' Inkrementacja licznika |
| 113 | If iNumber > 2 Then |
| 114 | iNumber = 0 ' Resetowanie wartości licznika |
| 115 | End If |
| 116 | |
| 117 | |
| 118 | End Select |
| 119 | |
| 120 | iCounter = iCounter + 1 |
| 121 | |
| 122 | Loop |
| 123 | |
| 124 | Dim oFunction As Object |
| 125 | Set oFunction = oFactory.NewObject("BFunkcja") |
| 126 | |
| 127 | ' Wywołanie generowania dokumentu |
| 128 | Dim DocumentID As Long |
| 129 | DocumentID = oFunction.ImportZO(oRec) ' GENEROWANIE DOKUMENTU ZAMÓWIENIA OBCEGO |
| 130 | |
| 131 | Close iFileNum ' Zamykanie pliku |
| 132 | |
| 133 | oFileSystem.MoveFile sFileName, sBkpPath & sName ' Przeniesienie pliku do katalogu bkp |
| 134 | |
| 135 | sName = Dir() |
| 136 | Loop |
| 137 | |
| 138 | End Sub |
| 139 | |
| 140 | }}} |
| 141 | 4. Aby wywołać powyższy skrypt dodajemy w tym samym module metodę: |
| 142 | {{{ |
| 143 | Private Sub MainDoc_TryToOpen(ByVal Category As String, ByVal Group As String, Name As String, ByVal ActionType As AmOpenAction, Cancel As Boolean) |
| 144 | 'Procedura ta wykonywana jest w momencie uruchamiania okna bądź raportu |
| 145 | |
| 146 | If Name = "OnTimer" Then GenerateZO |
| 147 | End Sub |
| 148 | }}} |
| 149 | |
| 150 | W takim przypadku w momencie każdorazowego uruchomienia procedury !OnTimer uruchomi się metoda GenerateZO i pliki w katalogu zostaną wczytane do bufora systemu HMF. |