| | 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. |