mojaSymfonia FORUM
https://forum.mix-soft.pl/

Pervasive - Wprowadzanie kursu walut?
https://forum.mix-soft.pl/viewtopic.php?f=15&t=5334
Strona 1 z 4

Autor:  grabber [ 2013-11-26, 11:21 ]
Tytuł:  Pervasive - Wprowadzanie kursu walut?

Witam, chciałem spytać się czy istnieje możliwość dodania przy pomocy raportów własnego wpisu do kursu walut...?

Autor:  rafal [ 2013-11-26, 11:35 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

o jakim programie piszesz?

Autor:  grabber [ 2013-11-26, 12:06 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Oczywiście chodzi o Symfonia Handel 2013.

Autor:  rafal [ 2013-11-26, 12:35 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Kod:
int sub DodajKurs(string sWaluta, string sData, float fKurs)

   BaseWL wl
      wl.Clear()
      wl.SetField("data",      sData )
      wl.SetField("waluta",    sWaluta )
      wl.SetField("kurs",    fKurs )
      wl.SetField("kurss",   fKurs )
      wl.SetField("kursk",   fKurs )
      wl.Insert()
      wl.DoUpdate()
endsub

DodajKurs("EUR","2012-10-01",4.0)


UWAGA Rozwiązanie ingeruje w dane programu

Autor:  grabber [ 2013-11-26, 13:24 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Cytuj:
UWAGA Rozwiązanie ingeruje w dane programu

Czyli rozumiem że jak za rok uszkodzi mi się baza z zupełnie innego powodu, to sage powie mi że to moja wina bo:
11 miesięcy, 4 dni, 7h, 23min temu wprowadziłem ręcznie prawidłowo kurs do programu i to pewnie tego wina...?

Tak czy inaczej bardzo dziękuje za kod...

Autor:  grabber [ 2013-11-26, 20:14 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Sorry że truje ale proszę jeszcze o jedną informacje:
- Chcę pobrać z bazy ostatnią (najnowszą) datę kursu walut jaka została wpisana
ale kiedy pobieram z nowo otwartego wskaźnika tabeli to odczytuje mi najstarszy wpis...

Jak zrobić aby odczytał mi aktulany ostatni wpis?

Bardziej szczegółowo:
Kod:
string data
BaseWL wl
data = wl.GetField("data")
message data


Jak odczytać inny wiersz niż pierwszy po otwarciu tabeli?

Autor:  rafal [ 2013-11-26, 23:05 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Istnieje funkcja KursWaluty

Kod:
Print KursWaluty("EUR")


Możesz także sam czytać z bazy

Kod:
float sub Kurs(string sWaluta, string sData)

   BaseWL wl

   wl.SetKey( "waluta" )
   wl.SetKeySeg( "waluta", sWaluta)
   wl.SetKeySeg( "data", sData)
   
   if !wl.GetRec( EQ ) then Kurs = wl.GetField( "kurs" )

endsub

Print Kurs("EUR","2013-11-26")


Tylko pamiętaj, że w jednym dniu waluta może mieć kilka kursów.

Autor:  grabber [ 2013-11-27, 18:40 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Wiem wiem że waluta może mieć różne wartości jednego dnia...
Mi potrzebne tylko aby sprawdzić czy w danym dniu ktoś już wprowadzał kurs...
A jeśli nie to zostanie pobrany z nbp i doda się sam do listy :)
Wiem że to lenistwo... ;P

Autor:  rafal [ 2013-11-27, 18:51 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Ciekawy jestem jak będziesz pobierał kursy w NBP. Masz już jakiś pomysł?

Autor:  grabber [ 2013-11-27, 19:15 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Napisałem aplikacje (nie związaną z symfonią) która pobiera z nbp ostatni kurs waluty EURO (w tym przypadku bez parametru)
lub kurs dowolnej waluty z dowolnego dnia podawany jako parametr aplikacji
czyli ShellExecute("x:\application.exe EUR 01012014")
Całość zapisuje do pliku w postaci: 1 linijka WALUTA, 2 linijka DATA, 3 linijka ŚREDNI KURS
Dalej pozostaje już odczytać plik w symfonii...

Autor:  rafal [ 2013-11-27, 20:00 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Napisz jak Twoja aplikacja pobiera kurs z NBP. Moze uda sie to zaimplementowac w AmBasicu.

Wystarczy Execute(). ShellExecute jest do otwierania Np. Pliku JPG za pomoca domyslnego programu.

Kod:
ShellExecute("c:\zdjecie.jpg")


Poza tym przy execute raport leci dalej i nie czeka az Twoja aplikacja sciagnie kurs. Tak wiec moze cos sie wysypac.
Poszukaj na forum sposobu na uruchomienie zewnetrznej aplikacji i poczekanie na jej zamkniecie.

Autor:  grabber [ 2013-11-27, 20:48 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Spokojnie... znam oba polecenia ShellExecute i Execute.
A napisałem ShellExecute bo akurat często używam go w innych językach...

Co do samego sposobu pobierania z NBP to:
Aby dostać aktualny (ostatni) kurs wystarczy:
1. Pobrać plik dane z adresu: http://www.nbp.pl/kursy/xml/LastA.xml
2a. Rozdzielić do tablicy kolejno wszystkie linijki z pliku i poszukać stringu <kod_waluty>EUR</kod_waluty>
jeśli się znajdzie to należy przyjąć że następna linijka będzie zawierać <kurs_sredni> "wartość waluty" </kurs_sredni>
więdz wyciągamy wartość pomiędzy ciągiem <kurs_sredni> a </kurs_sredni>
lub
2b. Jeśli można wczytać cały plik do jednego stringa to użyć RegExp
aby pobrać ciąg liczbowy pomiędzy <kod_waluty>EUR a </kurs_sredni>
....(nie wspominam tu oczywiście o sprawdzaniu błedów i ewentualne porównywanie z poprzednimi kursami w celu upewnienia się czy czasem waluta z 4.2019 zmieniła wartość na 174.4323...)
Kwestia pobierania z innych dat wymaga dodatkowo sprawdzenia w pliku http://www.nbp.pl/kursy/xml/dir.txt
wybranego pliku XML dla danego dnia... ale to nie problem więc jeśli zaczniesz zabawę z pisaniem tego w AMBasicu
to Ci pomogę...

(PS. Czasem lepiej zrobić ShellExecute i zrobić timer w oczekiwaniu na rezultat programu
niż blokowanie całej aplikacji do czasu zakończenia procesu... który nie zawsze musi się skończyć ;)
(Czy w AM są jakieś timery, countery lub tym podobne??
bo jak nie to pozostaje tylko porównanie wartości zwracanych przez funkcje Time)

Autor:  wrob [ 2013-11-27, 22:51 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Soreki ze sie wtrace do waszej dyskusji ale nurtuje mnie pytanie:
Ale po co zaczynac to robić? - juz dawno (od ponad 4 lat) takie rozwiania są napisane do symfonii (od paru rożnych firm )- korzystające pliku xml z nbp i wget albo dispatch ie

( Kontakt w stopce - zmodyfikowane przez Administrator FORUM)

i nawet sage ma na stronie swoj dodatek tez (w rozwiązaniach dodatkowych)- wiec wybor jest spory

co do regexp - popelnilem taka wersja w ambasicu i dziala sprawnie od lat ale teraz ostatnio jednak uważam ze lepiej do parsowania uzyc biblioteki XMLdom - szybciej sie czyta i ladniej wyglada programistyczne - biblioteka jest zazwyczaj w kazdym windowsie gdzies a jak nie ma to mozna sobie pobrac np stad http://www.microsoft.com/en-us/download ... px?id=3988

Autor:  grabber [ 2013-11-28, 07:07 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

:) Pewnie że łatwiej użyć rozwiązania innych... ale dawać sage za taką przyjemność 400 netto...?
Nie że jestem zboczony ale chyba wole wydać te pieniądze na inne przyjemności :)
Co do sposobu to oczywiste że najbardziej logiczne jest użyć MSXML... bo po to XML był stworzony...
Ale w przypadku gdy program ma odczytać jedną małą wartość float z pliku
to powoływanie specjalnie obiektu MSXML jest w tym przypadku tak samo wydajne jak regexp
czy bardziej proste rozwiązania.
Zasada jest taka że zawsze należy oceniać wielkość przedsięwzięcie do opłacalności
używania zewnętrznych rozwiązań... Jak to powiadał wujek Sam:
Nie pytaj co twój Windows może zrobić dla Ciebie, zapytaj co tym możesz zrobić za twojego windowsa...

Autor:  rafal [ 2013-11-28, 11:31 ]
Tytuł:  Re: Pervasive - Wprowadzanie kursu walut?

Kod:
limit 200000

float sub PobierzKurs(string sWaluta, string sData)

   date dDataNBP
   dDataNBP.FromStr( sData )

   dispatch fso = "Scripting.FileSystemObject"
   dispatch req = "Microsoft.XmlHttp"
   dispatch xml = "Microsoft.XMLDOM"
   dispatch tmpFile
   dispatch dNull
   
   dispatch xmlPOZYCJE
   dispatch xmlPOZYCJA
      dispatch xmlKOD_WALUTY
      dispatch xmlKURS_SREDNI


   string sWybranyXML   
   string tmp = KatalogFirmy() + "kurs.tmp"// plik tymczasowy
   string url = "http://www.nbp.pl/kursy/xml/dir.txt"
   int iPozycje   

   req.open ("GET", url, 0)
   req.send
   
   fso.CreateTextFile( tmp, 1 )
   tmpFile = fso.OpenTextFile( tmp, 2 )
   tmpFile.Write( req.responseText )
   tmpFile.Close
   
   tmpFile = dNull
   
   tmpFile = fso.OpenTextFile( tmp, 1 )
      
   while !tmpFile.AtEndOfStream
      buf = tmpFile.ReadLine      
      if find regular (using "a???z%s%2.2d%2.2d", mid((using "%d", dDataNBP.Year ),3,2), dDataNBP.Month, dDataNBP.Day) then sWybranyXML = buf
   wend

   xml.async = 0
   xml.Load( "http://www.nbp.pl/kursy/xml/" + sWybranyXML +".xml" )

   xmlPOZYCJE = xml.getElementsByTagName("pozycja")

   for iPozycje = 0 to iPozycje > xmlPOZYCJE.length - 1

      xmlPOZYCJA = xmlPOZYCJE.item( iPozycje )

      if xmlPOZYCJA.getElementsByTagName("kod_waluty").item(0).text == sWaluta then
   
         PobierzKurs = val(xmlPOZYCJA.getElementsByTagName("kurs_sredni").item(0).text)

      endif

   next iPozycje

endsub

print PobierzKurs("EUR","2013-11-27")

Strona 1 z 4 Strefa czasowa UTC+1godz. [letni]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/