Elektroda.pl
Elektroda.pl
X
Servizza
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[vba][excel] - Zapis pliku txt na serwerze web

siwek62 17 Lip 2013 20:52 2574 8
  • #1 17 Lip 2013 20:52
    siwek62
    Poziom 11  

    Witam,
    Tworzę aplikację na bazie vba excel i danych przechowywanych w accessie, którą mogę obsługiwać ja, powiedzmy „administrator” i „klient” i utknąłem na zasadniczym z mojego punktu widzenia elemencie. Otóż idea jest taka, że bazę danych można modyfikować po stronie administratora i klienta, modyfikację danych realizuje przy pomocy zapytań sql. W związku z tym istnieje potrzeba synchronizowania danych przechowywanych w bazie. Wymyśliłem, że synchronizację przeprowadzę w taki oto sposób że wszelkie zapytania sql będą zapisywane w pliku tekstowym, który następnie będzie umieszczony na mojej stronie. Zarówno administrator jak i klient mają identyczną bazę u siebie na lokalnym dysku. Przy uruchomieniu skoroszytu pobieramy plik tekstowy ze strony i realizujemy wszystkie zapisane tam zapytania sql. Nie potrafie przy pomocy vba zapisać pliku txt. na stronie. Będę wdzięczny za podpowiedz jak to zrobić. A i jeszcze dodam, uprzedzając ewentualne uwagi, że taka synchronizacja jest do bani, że wystarczy mi zsynchronizować dane raz dziennie, nie musi to być na bieżąco, więc takie rozwiązanie byłoby ok, nic mądrzejszego nie wymyśliłem.

    0 8
  • Servizza
  • #2 17 Lip 2013 22:13
    endruse1
    Poziom 10  

    Witam
    By zapisać dane na serwerze musisz się z nim połączyć za pomocą FTP, wtedy możesz wysyłać piki i je pobierać. Link

    0
  • #3 17 Lip 2013 22:46
    marcinj12
    Poziom 40  

    Czy z tą bazą pracuje więcej niż jeden klient?
    Mowa jest o "klientach" wewnątrz jednej sieci firmowej, mającej dostęp np. do wspólnych dysków sieciowych, czy są to zupełnie obce osoby?
    Czy jest możliwość umieszczenia tej bazy danych na sieci w miejscu widocznym dla wszystkich zainteresowanych?

    0
  • Servizza
  • #4 18 Lip 2013 01:54
    siwek62
    Poziom 11  

    Klientów może być kilku, ale każdy ma osobną bazę i ja jako administrator mam osobną bazę dedykowaną dla jednego klienta. Czyli można traktować, że chodzi o jednego klienta. Dyski sieciowe odpadają, ja nie mam dostępu do sieci klienta. Dane są poufne więc nie mogą być powszechnie widoczne. Myślałem żeby każdemu klientowi stworzyć konto na mojej stronie, do którego by się łączył na zasadzie logowania. Nie musiałby nawet znać swojego loginu i hasła, dane te byłyby zapisane w jego kopii bazy. Ja dla każdego klienta miałbym kopie bazy u siebie w osobnym folderze.
    O ftp wyczytałem w sieci, i wydaje się że jest to rozwiązanie którego potrzebuje, ale za mało o tym wiem żeby móc je wykorzystać. Spróbuje wypróbować ten przykład endrusa1, ja dotarłem do trochę innego mniej czytelnego jak się wydaję. Nie chciałbym tylko w połączeniach z moją stroną używać swojego loginu i hasła, które mam do administrowania stroną. Jednak klient to nie to samo co przyjaciel.

    0
  • #5 18 Lip 2013 09:17
    endruse1
    Poziom 10  

    nie myślałeś aby zrobić to na bazie danych Mysql?

    0
  • #6 18 Lip 2013 12:16
    marcinj12
    Poziom 40  

    Czyli rozumiem, że klient A nie musi widzieć tego, co wprowadził do bazy np. klient B ??
    Z własnego doświadczenia powiem tak: jakikolwiek sposób takie synchronizacji baz jak przedstawiasz, sprawia więcej problemów niż pożytku - jeszcze w Accesie tym bardziej.

    Prosty przykład: wyobraź sobie 5 klientów, każdy ma własną bazę u siebie, w bazie jest tabela DOSTAWCY. Może mieć autonumerowane pole ID oraz ograniczenie unikalne na kodzie tego dostawcy.
    U jednego klienta będzie działało OK, ale jeżeli spróbujesz połączyć dane od kilku klientów do swojej tabeli "adminitratora" może się okazać że, dostawca o kodzie MAN50 występuje i u klienta A, i u klienta B. U klienta A może mieć ID = 1, u klienta B ID = 20.
    Próbując wykonać zapytanie wstawiające te dane do swojej bazy polegniesz, bo - po pierwsze: autonumerowanie Twojej bazy będzie inne, po drugie - ograniczenie unikalności nie pozwoli wstawić dwóch takich samych dostawców.
    Jeżeli w swojej bazie będziesz miał dostawcę pod innym numerem ID jak klient, rozjadą Ci się relacje, które też pewnie będziesz importował z bazy od klienta, na JEGO numerach ID.

    Wrzucenia na FTP to prawie to samo co wrzucenia na wspólny dysk sieciowy - możesz spróbować zrobić jedną, wspólną bazę na FTP, ale za każdym razem będzie ona pobierana, co będzie wolne.

    Ja na Twoim miejscu wykorzystałbym odpowiednie narzędzie do odpowiedniej pracy - możesz postawić zwyczajny serwer bazodanowy (SQL Server - Excel dobrze z nim współpracuje albo MySQL - instalowany prawie na każdym darmowym hostingu). Wtedy robisz jedną, wspólną bazę dostępną przez sieć + logowanie użytkowników.

    0
  • #7 18 Lip 2013 12:58
    endruse1
    Poziom 10  

    Problemem na darmowych hostingach są ograniczone prawa użytkownika bazy MySQL. Można by napisać do administratora z prośbą o zmianę uprawnień, by móc wysyłać dane bezpośrednio z aplikacji napisanej w np. vba.
    Gdyby nie dało zmienić sie uprawnień wyjściem jest napisanie skryptu php umieszczonego na ftp do którego wysyłało by sie dane z aplikacj, a on z kolei do bazy danych, oraz drugiego skryptu który odczytywał by dane z bazy i przesyłał je do naszej aplikacji.

    0
  • #8 18 Lip 2013 18:30
    siwek62
    Poziom 11  

    Nauka MySql jeszcze przedemną, na razie niewiele na ten temat wiem.
    Klient A nie widzi danych klienta B. Wspólny jest tylko kod vba, bazy w Accessie są absolutnie oddzielne, choć mają identyczną strukturę, ja po swojej stronie nie mam potrzeby łączyć jakichkolwiek danych klienta A z klientem B
    Co do konfliktów takiej synchronizacji to też dostrzegłem ten problem i wymyśliłem aby go rozwiązać w następujący sposób. Zrezygnowałem z identyfikacji wpisów według ID opartym na autonumerowaniu. Nadaję swoje numery ID (oczywiście w bazie Accessa jest kolumna autonumerowana, ale do odwołań jej nie używam). Aby uniknąć powtórzenia numerów identyfikujących przyjąłem założenie, że liczba wpisów nie przekroczy 1.000.000 w związku z tym moje wpisy mają numerację od 1 do 500.000, wpisy klienta mają numerację od 500.001 do 1.000.000.
    Widzę oczywiście niedogodność wpisania tego samego kontrahenta przez klienta i prze zemnie ale:
    1. nie wprowadzam w polach bazy unikalności wpisów, wręcz przeciwnie dopuszczam świadomie taką możliwość,
    2. możliwość zdublowania wpisu będzie istniała tylko w momencie gdy w tym samym czasie ja i klient dokona takiego wpisu
    3. używałem programów profesjonalnych opartych na bazach danych i zawsze byli kontrahenci wpisani podwójnie, wystarczyło w nazwie użyć dodatkowej spacji, myślnika itp. zakładam więc, że takiej ewentualności do końca nie da się wyeliminować. Można ewentualnie wprowadzać NIP itp ale czasami trzeba wpisać taką samą nazwę, kontrahent może mieć np. oddziały, więc ten problem mnie nie niepokoi.

    Wspólna baza mnie nie interesuje, klient musi widzieć to co ja wpiszę poprzedniego dnia, nie ma takiej potrzeby żeby pracować na bazie umieszczonej na serwerze web i nie taki jest cel mojej aplikacji. Potrafię pobrać plik tekstowy ze strony i zapisać go na lokalnym dysku następnie odczytać linia po linii i w pętli zrobić update bazy. Nie potrafię umieścić pliku na stronie, oczywiście po swojej stronie mógłbym to zrobić ręcznie, korzystając z mojego klienta ftp ale po stronie klienta musi się to dziać automatycznie bez jego ingerencji.

    Zdaję sobie sprawę, że moje pomysły są ułomne ale poruszam się w zakresie wiedzy, którą posiadam i poszerzam tą wiedzę małymi kroczkami.

    0
  • #9 19 Lip 2013 18:40
    siwek62
    Poziom 11  

    Udało mi się, nie bez kłopotów, zapisać plik na stronie. Skorzystałem z następującego kodu:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Mam w związku z tym pewne obserwacje, plik zapisuję się na serwerze jeżeli urychamiam makro w trybie Debug (F8), jak poszczam makro normalnie to się nie zapisuje. Miga jedynie okienko DOSa.

    Czy trzeba zastosować jakąś pauzę, żeby dać czas na zapisanie pliku?

    Czy okno DOSa musi migać w trakcie wykonywania funkcji?

    Gdy za pierwszym razem uruchomiłem funkcję to odezwał się Firewall z pytaniem czy blokować połączenie, dałem nie i już więcej się nie odzywa. Czy w związku z tym można to jakoś ustawić żeby na innym komputerze nie odzywał się Firewall?

    Czy jeśli będę chciał zapisać na serwerze kilkanaście plików pdf to też przy pomocy tej funkcji?

    Może jest jeszcze inny sposób zapisywania plików na serwerze?

    Pozdrawiam Tomek

    0