| 143 |  |  | 
                        | 144 |  | 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. | 
                        | 145 |  |  | 
                        | 146 |  | === Włączanie działania !OnTimer() === #ontimer_on | 
                        | 147 |  |  | 
                        | 148 |  | * Mając odpowiednie uprawnienia administratora w systemie Forte HM Z lewego panelu wybieramy menu Ustawienia. | 
                        | 149 |  | * Po otwarciu się w prawym panelu okna z danymi Ustawień przechodzimy do ''Ustawienia > Firma > Parametry pracy''. | 
                        | 150 |  | * W prawym panelu przechodzimy do ''Wykonywanie procedur > !OnTimer''. | 
                        | 151 |  | * Po zaznaczeniu !OnTimer wybieramy edytuj i wybieramy TAK, a następnie zapisujemy. | 
                        | 152 |  |  | 
                        | 153 |  | === Informacje o możliwościach wykorzystania procedury !OnTimer() === #wykorzystanie_ontimer | 
                        | 154 |  | Mając już włączony mechanizm wykonywania raportu !OnTimer musimy wykonać raport. | 
                        | 155 |  | Raport jest opcjonalny, gdyż wszystkie niezbędne instrukcje można oczywiście ująć w !OnTimerze. | 
                        | 156 |  |  | 
                        | 157 |  | HMF ofertuje wiele możliwości wykonania procedur. Są to: | 
                        | 158 |  | * 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). | 
                        | 159 |  | * 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. | 
                        | 160 |  |  | 
                        | 161 |  |  | 
                        | 162 |  | 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. | 
                        | 163 |  | 1. W systemie Forte Handel uruchamiamy z menu VBA > VBA IDE. Uruchamia się środowisko programowania VBA, w którym utworzymy skrypt integracyjny. | 
                        | 164 |  | 2. Otwieramy UserElement z lewego Panelu >> pokazuje się okno kodu VBA. | 
                        | 165 |  | 3. Wprowadzamy kod VBA skryptu: | 
                        | 166 |  | {{{ | 
                        | 167 |  | Private Sub GenerateZO() | 
                        | 168 |  |  | 
                        | 169 |  |  | 
                        | 170 |  | ' Deklaracje zmiennych | 
                        | 171 |  | Dim oFactory As Object | 
                        | 172 |  | Dim oRec As Object 'Rekord danych | 
                        | 173 |  | Dim nError | 
                        | 174 |  |  | 
                        | 175 |  | Dim sDocumentType As String ' Typ dokumentu | 
                        | 176 |  | Dim sDesc As String ' Opis dokumentu | 
                        | 177 |  | Dim sClientCode As String 'Nazwa kontrahenta | 
                        | 178 |  | Dim sProductCode As String 'Kod produktu | 
                        | 179 |  | Dim sQuantity As String ' Ilosc | 
                        | 180 |  | Dim sPrice As String ' Cena netto | 
                        | 181 |  |  | 
                        | 182 |  | Dim sPath As String ' ścieżka katalogu z plikami wyeksportowanymi z eDokumentów | 
                        | 183 |  | Dim sBkpPath As String  ' ścieżka katalogu, do którego odczytane i przetworzone pliki | 
                        | 184 |  | ' zostaną przeniesione po zakończonym procesie | 
                        | 185 |  | Dim sName As String ' nazwa pliku | 
                        | 186 |  | Dim sFileName As String ' kompletna ścieżka do pliku | 
                        | 187 |  | Dim iFileNum As Integer ' znacznik pliku do operacji Input, Line Input | 
                        | 188 |  | Dim sBuf As String ' Bofor stringu odczytanego z pliku | 
                        | 189 |  | Dim iCounter As Integer ' Licznik przebiegu po liniach pliku | 
                        | 190 |  | Dim iNumber As Integer ' Licznik przebiegu po liniach pozycji produktu w pliku | 
                        | 191 |  | Dim oFileSystem As Object ' Obiekt do operacji na plikach | 
                        | 192 |  |  | 
                        | 193 |  | Set oFileSystem = CreateObject("Scripting.FileSystemObject") | 
                        | 194 |  |  | 
                        | 195 |  | sPath = "C:\Users\ztestowy\dane\" | 
                        | 196 |  | sBkpPath = "C:\Users\ztestowy\dane\done\" | 
                        | 197 |  | sName = Dir$(sPath & "*.txt") ' Pobranie listy plików w katalogu | 
                        | 198 |  |  | 
                        | 199 |  | Do While sName <> "" ' Jeżeli/dopóki istnieją pliki w katalogu to wykonaj dalsze operacje | 
                        | 200 |  | sFileName = sPath & sName ' Ustawienie pełnej ścieżki dokumentu | 
                        | 201 |  |  | 
                        | 202 |  | iFileNum = FreeFile() | 
                        | 203 |  |  | 
                        | 204 |  | iCounter = 1 ' Licznik przebiegu po liniach pliku | 
                        | 205 |  | iNumber = 0 ' Licznik przebiegu po pozycjach dokumentu. | 
                        | 206 |  | ' Dopuszczalne wartości dla jednej pozycji dokumentu to 0-2 | 
                        | 207 |  | ' 0 - symbol produktu | 
                        | 208 |  | ' 1 - ilość | 
                        | 209 |  | ' 2 - cena netto | 
                        | 210 |  | Open sFileName For Input As iFileNum | 
                        | 211 |  |  | 
                        | 212 |  | ' Tworzenie obiektów deklaracji danych | 
                        | 213 |  | Set oFactory = Application.PropertyAp("HFactory") | 
                        | 214 |  | Set oRec = oFactory.NewObject("BIORec") ' Rekord danych, który zostanie wstawiony do systemu | 
                        | 215 |  |  | 
                        | 216 |  | sDocumentType = "ZMO" ' Typ dokumentu: Zamówienie obce | 
                        | 217 |  | nError = oRec.SetField("typDk", Trim(sDocumentType)) ' Ustawienie typu dokumentu | 
                        | 218 |  |  | 
                        | 219 |  | Do While Not EOF(iFileNum) | 
                        | 220 |  | Line Input #iFileNum, sBuf | 
                        | 221 |  |  | 
                        | 222 |  | Select Case iCounter | 
                        | 223 |  | Case Is = 1 ' Wywołanie identyfikatora kontrahenta | 
                        | 224 |  |  | 
                        | 225 |  | sClientCode = "" & Trim(sBuf) | 
                        | 226 |  | nError = oRec.BeginSection("danekh") | 
                        | 227 |  | nError = oRec.SetField("KhKod", Trim(sClientCode)) | 
                        | 228 |  | nError = oRec.EndSection() | 
                        | 229 |  | Case Is = 2 ' Opis dokumentu | 
                        | 230 |  | sDesc = Trim(sBuf) | 
                        | 231 |  | nError = oRec.SetField("opis", Trim(sDesc)) | 
                        | 232 |  | Case Is > 2 ' Pozycje dokumentu | 
                        | 233 |  |  | 
                        | 234 |  |  | 
                        | 235 |  | Select Case iNumber | 
                        | 236 |  | Case Is = 0 ' Kod produktu | 
                        | 237 |  | sProductCode = Trim(sBuf) | 
                        | 238 |  | nError = oRec.BeginSection("Pozycja dokumentu") | 
                        | 239 |  | nError = oRec.SetField("kod", Trim(sProductCode)) | 
                        | 240 |  |  | 
                        | 241 |  | Case Is = 1 ' Ilość | 
                        | 242 |  | sQuantity = Trim(sBuf) | 
                        | 243 |  | nError = oRec.SetField("ilosc", Trim(sQuantity)) | 
                        | 244 |  |  | 
                        | 245 |  | Case Is = 2 ' Cena netto | 
                        | 246 |  | sPrice = Trim(sBuf) | 
                        | 247 |  | nError = oRec.SetField("cena", Trim(sPrice)) | 
                        | 248 |  | nError = oRec.EndSection() | 
                        | 249 |  |  | 
                        | 250 |  | End Select | 
                        | 251 |  |  | 
                        | 252 |  | iNumber = iNumber + 1 ' Inkrementacja licznika | 
                        | 253 |  | If iNumber > 2 Then | 
                        | 254 |  | iNumber = 0 ' Resetowanie wartości licznika | 
                        | 255 |  | End If | 
                        | 256 |  |  | 
                        | 257 |  |  | 
                        | 258 |  | End Select | 
                        | 259 |  |  | 
                        | 260 |  | iCounter = iCounter + 1 | 
                        | 261 |  |  | 
                        | 262 |  | Loop | 
                        | 263 |  |  | 
                        | 264 |  | Dim oFunction As Object | 
                        | 265 |  | Set oFunction = oFactory.NewObject("BFunkcja") | 
                        | 266 |  |  | 
                        | 267 |  | ' Wywołanie generowania dokumentu | 
                        | 268 |  | Dim DocumentID As Long | 
                        | 269 |  | DocumentID = oFunction.ImportZO(oRec) ' GENEROWANIE DOKUMENTU ZAMÓWIENIA OBCEGO | 
                        | 270 |  |  | 
                        | 271 |  | Close iFileNum ' Zamykanie pliku | 
                        | 272 |  |  | 
                        | 273 |  | oFileSystem.MoveFile sFileName, sBkpPath & sName ' Przeniesienie pliku do katalogu bkp | 
                        | 274 |  |  | 
                        | 275 |  | sName = Dir() | 
                        | 276 |  | Loop | 
                        | 277 |  |  | 
                        | 278 |  | End Sub | 
                        | 279 |  |  | 
                        | 280 |  | }}} | 
                        | 281 |  | 4. Aby wywołać powyższy skrypt dodajemy w tym samym module metodę: | 
                        | 282 |  | {{{ | 
                        | 283 |  | Private Sub MainDoc_TryToOpen(ByVal Category As String, ByVal Group As String, Name As String, ByVal ActionType As AmOpenAction, Cancel As Boolean) | 
                        | 284 |  | 'Procedura ta wykonywana jest w momencie uruchamiania okna bądź raportu | 
                        | 285 |  |  | 
                        | 286 |  | If Name = "OnTimer" Then GenerateZO | 
                        | 287 |  | End Sub | 
                        | 288 |  | }}} | 
                        | 289 |  |  | 
                        | 290 |  | W takim przypadku w momencie każdorazowego uruchomienia procedury !OnTimer uruchomi się metoda GenerateZO i pliki w katalogu zostaną wczytane do bufora systemu HMF. | 
                      
                        |  | 143 | [DeployerGuide/Customization/Forte/ForteOnTimer Integracja z Forte HM przy pomocy !OnTimer()] |