Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Czym jeszcze RT 2007 moze zaskoczyc?

24 views
Skip to first unread message

Jacek

unread,
Mar 15, 2009, 10:32:06 AM3/15/09
to
Witajcie.

Mam baze, ktora dziala poprawnie pod Akcesem. Pod RT 2007 sie wysypuje.
O to kod:

Sub SubiektPass()

Dim db As DAO.Database
Dim td As DAO.TableDef
Dim fd As DAO.Field
Dim prp As DAO.Property

Set db = OpenDatabase("C:\Auto serwis\Auto serwis dane.mdb")
Set td = db.TableDefs("Firma")
Set fd = td.Fields("Subiekt")
fd.Properties.Delete ("InputMask")
Set prp = fd.CreateProperty
prp.Name = "InputMask"
prp.Type = dbText
prp.Value = "Password"
fd.Properties.Append prp
fd.Properties.Refresh
td.Fields.Refresh

Set prp = Nothing
Set fd = Nothing
Set td = Nothing
db.Close
Set db = Nothing

End Sub

Mam rowniez cos takiego:

Lista.DefaulValue = 1

W przypadku Akcesa zostaje podswietlona ta wartosc na liscie. W RT zadna z
pozycji nie jest podswietlona.
Macie jakis pomysl, co jest "zle"?

P.S.
Od dluzszego czasu przymierzam sie, zeby przesiasc sie na Visual Studio i
coraz bardziej widze ku temu powody;)


Krzysztof Naworyta

unread,
Mar 15, 2009, 10:59:44 AM3/15/09
to
Juzer Jacek <ad...@moj.pl> napisał

| Mam baze, ktora dziala poprawnie pod Akcesem. Pod RT 2007 sie wysypuje.
| O to kod:
|
| Sub SubiektPass()
|
| Dim db As DAO.Database
| Dim td As DAO.TableDef
| Dim fd As DAO.Field
| Dim prp As DAO.Property
|
| Set db = OpenDatabase("C:\Auto serwis\Auto serwis dane.mdb")
| Set td = db.TableDefs("Firma")
| Set fd = td.Fields("Subiekt")
| fd.Properties.Delete ("InputMask")
| Set prp = fd.CreateProperty
| prp.Name = "InputMask"
| prp.Type = dbText
| prp.Value = "Password"
| fd.Properties.Append prp
| fd.Properties.Refresh
| td.Fields.Refresh
|
| Set prp = Nothing
| Set fd = Nothing
| Set td = Nothing
| db.Close
| Set db = Nothing
|
| End Sub

Czy sprawdziłeś w którym miejscu się wysypuje ?
Choćby poprzez umieszczenie MsgBox po każdej linijce
(choć coś takiego może "zaburzyć" działanie access'a i okaże się, że błędu
nie ma ;) )

Dla mnie jest dziwne, że w ogóle takie rzeczy jak "maska" ustawiasz w
bazie produkcyjnej.
Co to w ogóle ma dać? Ludzie będą wpisywać dane bezpośrednio do tabeli ?
Czy może chcesz w ten sposób "ukryć" dane ? To rozczaruję Cię. Maska
"password" nie szyfruje danych.
Głupia kwerenda
Select subiekt & "" from Firma
i wszystko widać !

Jeśli jednak sie upierasz, to przede wszystkim zrezygnowałbym z usuwania
Property.
Zakładając, że już wcześniej maska była ustawiona (np. ręcznie), robisz
zwykłe przypisanie:

On error resume err_exit

Set prp = fd.Properties("InputMask")
prp.Value = "Password"

(...)

exit sub

err_exit:
' jeśli Property jeszcze nie było

With fd
.properties.Append .createproperty("inputMask", dbText, "Password")
End with


Tak się to robi!
Może RT wylatuje na usuwaniu nieistniejącego prp ?

| Mam rowniez cos takiego:
|
| Lista.DefaulValue = 1
|
| W przypadku Akcesa zostaje podswietlona ta wartosc na liscie. W RT
| zadna z pozycji nie jest podswietlona.
| Macie jakis pomysl, co jest "zle"?


DefaultValue jest _stringiem_ , który określa sposób wyliczenia wartości.
Mając to na uwadze sugerowałbym następujący zapis:

Me.Lista.DefaultValue = "=1"

Może pomóc ...


--
KN

archiwum grupy:
http://groups.google.pl/advanced_group_search
(grupa: pl*msaccess)

Jacek

unread,
Mar 15, 2009, 11:25:13 AM3/15/09
to
Dnia Sun, 15 Mar 2009 15:59:44 +0100, Krzysztof Naworyta napisał(a):

> Dla mnie jest dziwne, że w ogóle takie rzeczy jak "maska" ustawiasz w
> bazie produkcyjnej.

Maska akurat tutaj, to taki sobie przyklad. Ogolnie chodzilo mi o to, zeby
zauktualizowac cos w bazie back-end. Gdy "ulepszam" swoj programik, to
czasami trzeba pozmieniac cos w bazie z danymi u klienta i chce to robic
programowo. Klient sciaga ulepszenie i przy pierwszym uruchomieniu
dokonuja sie potrzebne zmiany.


>| Mam rowniez cos takiego:
>|
>| Lista.DefaulValue = 1
>|
>| W przypadku Akcesa zostaje podswietlona ta wartosc na liscie. W RT
>| zadna z pozycji nie jest podswietlona.
>| Macie jakis pomysl, co jest "zle"?
>
>
> DefaultValue jest _stringiem_ , który określa sposób wyliczenia wartości.
> Mając to na uwadze sugerowałbym następujący zapis:
>
> Me.Lista.DefaultValue = "=1"
>
> Może pomóc ...

Nie pomoglo.
Stosuje to, gdyz mam klawisze, ktore uruchamiaja cos tam biorac dane z
listy. Zeby nie obslugiwac dla kazdego wywolania bledu, ze brak zaznaczonej
pozycji na liscie, to po prostu przy zaladowaniu formularza jest jakas
sobie wartosc zaznaczana.
Pod Akcesem jest ok, a w RT nie...

Krzysztof Naworyta

unread,
Mar 15, 2009, 11:38:24 AM3/15/09
to
Juzer Jacek <ad...@moj.pl> napisał

|| Dla mnie jest dziwne, że w ogóle takie rzeczy jak "maska" ustawiasz w
|| bazie produkcyjnej.
|
| Maska akurat tutaj, to taki sobie przyklad. Ogolnie chodzilo mi o to,
| zeby zauktualizowac cos w bazie back-end. Gdy "ulepszam" swoj
| programik, to czasami trzeba pozmieniac cos w bazie z danymi u klienta
| i chce to robic programowo. Klient sciaga ulepszenie i przy pierwszym
| uruchomieniu dokonuja sie potrzebne zmiany.

Jak przykład to przykład ...
Ale w takim razie do czego mam się ustosunkować ?
Wylatuje ? Trzeba sprawdzić na której linijce !

W RT jest to trudniejsze, ale co za przeszkoda pisać komunikaty do pliku
tekstowego ?
Jak pisałem, MsgBox raczej się nie nadaje. Jesli już to doraźnie.

||| Mam rowniez cos takiego:
|||
||| Lista.DefaulValue = 1
|||
||| W przypadku Akcesa zostaje podswietlona ta wartosc na liscie. W RT
||| zadna z pozycji nie jest podswietlona.
||| Macie jakis pomysl, co jest "zle"?
||
||
|| DefaultValue jest _stringiem_ , który określa sposób wyliczenia
|| wartości. Mając to na uwadze sugerowałbym następujący zapis:
||
|| Me.Lista.DefaultValue = "=1"
||
|| Może pomóc ...

| Nie pomoglo.
| Stosuje to, gdyz mam klawisze, ktore uruchamiaja cos tam biorac dane z
| listy. Zeby nie obslugiwac dla kazdego wywolania bledu, ze brak
| zaznaczonej pozycji na liscie, to po prostu przy zaladowaniu formularza
| jest jakas sobie wartosc zaznaczana.
| Pod Akcesem jest ok, a w RT nie...

Być może ustawiasz DefaultValue za wcześnie !
Np. Form_Open zachodzi zanim niektóre inne obiekty zostaną zainicjowane.

Zaś do ustawiania wartości dużo lepsze od .DefaultValue jest po prostu
.Value ;-)
Tym bardziej, że dla niezwiązanych kontrolek DefaultValue nie ma większego
sensu.

Dla listy proponuję:

With Me.List
if .ListCount > 0 then
.Value = .ItemData(0)
end if
end with

Przemysław Rachwał

unread,
Mar 15, 2009, 12:28:58 PM3/15/09
to
Krzysztof Naworyta wrote:

>
> Czy sprawdziłeś w którym miejscu się wysypuje ?

prawdziwi twardziele debugera nie używają!

Jacek

unread,
Mar 15, 2009, 12:50:29 PM3/15/09
to

Napisalem, ze w Akcesie mi sie nie wysypuje!

Przemysław Rachwał

unread,
Mar 15, 2009, 1:14:36 PM3/15/09
to

a wiesz po którym kroku programu?

zrób może wersję z implementacją logowania do pliku to wszystko stanie
się jasne

przypuszczam że pewne gadżety są niedostępne w środowisku runtime - ale
to wymaga poprostu sprawdzenia krokowego

jak znajdziesz przyczynę zapytaj googl-a czy to twój problem, czy może
szerszy i częściej spotykany

Jacek

unread,
Mar 15, 2009, 1:29:28 PM3/15/09
to
Chetnie zrobie logowanie do pliku, jednak nigdy jeszcze tego nie robilem.
Musze najpierw poczytac, jak sie to robi.

Jacek

unread,
Mar 15, 2009, 3:14:39 PM3/15/09
to
Dnia Sun, 15 Mar 2009 16:38:24 +0100, Krzysztof Naworyta napisał(a):

> Być może ustawiasz DefaultValue za wcześnie !
> Np. Form_Open zachodzi zanim niektóre inne obiekty zostaną zainicjowane.
>
> Zaś do ustawiania wartości dużo lepsze od .DefaultValue jest po prostu
> .Value ;-)
> Tym bardziej, że dla niezwiązanych kontrolek DefaultValue nie ma większego
> sensu.

Dla Akcesa dobrze, a dla RT za wczesnie?
Czy piszac kod nalezy rozgraniczac czy ma byc pod Akcesa, czy pod RT?
Rozumiem rozgraniczenie co do wersji Akcesa, Windowsa, czlowiek sie jakos
przyzwyczail. Czy dochodzi nastepne rozgraniczenie dotyczace RT?

Co do DefaultValue, to zmylila mnie nazwa tej wlasciwosci.

Krzysztof Naworyta

unread,
Mar 15, 2009, 3:43:10 PM3/15/09
to
Juzer Jacek <ad...@moj.pl> napisał

Słuchaj, ludzie to pisali !

RT jest pewną okrojoną wersją access'a ...
Coś odkroili, głównie funkcje projektowe, ale być może przy okazji także
pewne funkcjonalności naprawcze?
Nie wiem !

(BTW: wiesz chyba, że w RT nie można użyć czegos takiego jak np. "filtruj
wg formularza" ?)

Mnie się już w a'97 zdarzało, że pewne rzeczy przechodziły gładko w
full-wersji, a pod RT nie!
Trzeba było dojść co, kiedy ...
Domyśleć się (wymyślić) "dlaczego?", jakoś to ominąć ...

Podobnie cos czasem działa pod MDB a w MDE nie!
(rzadko bo rzadko, nawet nie potrafiłbym teraz powiedzieć co, ale tak
było!)

Jeśli liczysz, że w VS nie spotkasz tego rodzaju problemów, to z góry
mówię: naiwny jesteś ;)
Nie chodzi aby Cię zniechęcać ... Nikt nie każe programować w accessie.
Jest wiele powodów by z access'a rezygnować. Ale akurat nie te, które
przytaczasz. Te są wszędzie!

Krzysztof Naworyta

unread,
Mar 15, 2009, 3:56:34 PM3/15/09
to
Juzer Jacek <ad...@moj.pl> napisał

| Chetnie zrobie logowanie do pliku, jednak nigdy jeszcze tego nie
| robilem. Musze najpierw poczytac, jak sie to robi.

Jest pińcet sposobów pisania do pliku tekstowego.
To niemal najbardziej pierwotna forma pisania gdziekolwiek :)

Poszukaj gdzieś informacji o pierwotnych instrukcjach dostępu do pliku
tekstowego z VB.
Open, Input, Output, FreeFile, Get, Put, Random, ...
Wiele znajdziesz w samym helpie.
W necie znajdziesz gotowe klasy, upraszczające pisanie ...

Ja, jako pewną zachętę, poniżej zamieszczam bardzo prostą klasę (pisaną na
kolanie), która wykorzystuje sterowniki ISAM:
Klasanazywa się "cLog"

'*************** class cLog start *************************

Option Compare Database
Option Explicit

Dim sFileName As String
Dim sFile As String
Dim sPath As String
Dim sISAMTable As String
Dim qr As QueryDef

Private Sub Class_Initialize()

Dim db As Database

sPath = CurrentProject.path
sFile = "log" & Format(Now, "yyyymmdd") & Hex(SysCmd(609)) & ".txt"
sFileName = Join(Array(sPath, sFile), "\")
sISAMTable = "[Text;FMT=Delimited;HDR=YES;CharacterSet=1250;DATABASE=" &
sPath & "].[" & Replace(sFile, ".", "#") & "]"

Set db = DBEngine(0)(0)
If FileExists() = False Then
db.Execute "Select Now() as d, '-' as proc_name, 'data tworzenia pliku
loga' as akcja, '' as inne Into " & sISAMTable
End If

Set qr = db.CreateQueryDef("", "parameters p1 datetime, p2 text(255), p3
text(255), p4 text(255); insert into " & sISAMTable & " Values( [p1],
[p2], [p3], [p4] )")

End Sub


Private Function FileExists() As Boolean
On Error Resume Next

FileExists = (GetAttr(sFileName) >= 0)
End Function


Public Sub Log(procedura As String, akcja As String, inne As String)
With qr
.Parameters(0) = Now()
.Parameters(1) = procedura
.Parameters(2) = akcja
.Parameters(3) = inne

.Execute
End With
End Sub

'****************** class cLog end *****************

Sposób wykorzystania gdzieś w kodzie:


'**************** module1, procedure s1 *********************
Sub s1()
Dim Log As New cLogToFile

Log.Log "Module1.s1", "linia 1", "bla bla bla"

'(...) - trzykropki oznaczają jakiś Twój blok kodu ...

DoEvents
Log.Log "Module1.s1", "linia 21", "bla bla bla 2"

'(...)

DoEvents
Log.Log "Module1.s1", "linia 43", "bla bla bla 3"

'(...)

DoEvents
Log.Log "Module1.s1", "linia 58", "bla bla bla 4"

'(...)


End Sub

'**************** /module1, procedure s1 *********************

Uwagi:
Wykorzystanie ISAM nie powala prędkością ...
Tradycyjne metody otwierania pliku na pewno będą bardziej efektywne.
Ale na początek może być fajnie!
(o ile Twoja instalka instaluje także ISAM ! Co chyba jest standardem od
czasów RT'2000 ...)

Krzysztof Naworyta

unread,
Mar 15, 2009, 4:02:33 PM3/15/09
to
Juzer Krzysztof Naworyta <k.naw...@datacomp.com.pl> napisał


(...)


| Sposób wykorzystania gdzieś w kodzie:
|
|
| '**************** module1, procedure s1 *********************
| Sub s1()
| Dim Log As New cLogToFile


ciach !

oczywiście miało być:

Dim Log as New cLog

(...) ' reszta bez zmian :)

Przemysław Rachwał

unread,
Mar 15, 2009, 5:27:51 PM3/15/09
to
Krzysztof Naworyta wrote:
> Juzer Krzysztof Naworyta <k.naw...@datacomp.com.pl> napisał
>
>
> (...)
> | Sposób wykorzystania gdzieś w kodzie:
> |
> |
> | '**************** module1, procedure s1 *********************
> | Sub s1()
> | Dim Log As New cLogToFile
>
>
> ciach !
>
> oczywiście miało być:
>
> Dim Log as New cLog
>
> (...) ' reszta bez zmian :)
>

jak zobaczyłem kod to mi dosłownie szczęka opadła
pozwoliłem sobie szybko to poprawić i już nie straszy ;)

Option Compare Database

'*************** class cLog start *************************

Option Explicit

Dim sFileName As String
Dim sFile As String
Dim sPath As String
Dim sISAMTable As String

Dim sDelimiter As String

Public Property Let Delimiter(sTmp As String)
sDelimiter = sTmp
End Property

Public Property Get Delimiter() As String
Delimiter = sDelimiter
End Property

Public Property Let File(sTmp As String)
sFileName = sTmp
End Property

Public Property Get File() As String
File = sFileName
End Property

Private Sub Class_Initialize()

sPath = CurrentProject.Path


sFile = "log" & Format(Now, "yyyymmdd") & Hex(SysCmd(609)) & ".txt"
sFileName = Join(Array(sPath, sFile), "\")

sDelimiter = ";"

End Sub

Public Sub Log(procedura As String, akcja As String, inne As String)

Dim File As Long

File = FreeFile()

If Dir(sFileName) = "" Then
Open sFileName For Output As #File
Print #File, "godzina" & sDelimiter & "procedura" & sDelimiter &
"akcja" & sDelimiter & "inne"
Else
Open sFileName For Append As #File
End If
Print #File, Format(Now(), "yyyy-mm-dd hh:Nn:ss") & sDelimiter &
procedura & sDelimiter & akcja & sDelimiter & inne
Close #1 ' Close file.

End Sub

Public Sub KillLog(Optional sFile)
If IsMissing(sFile) Then
sFile = sFileName
End If

Kill (sFileName)

(c) Krzysztof Pozorek

unread,
Mar 15, 2009, 7:03:48 PM3/15/09
to
(...)

> jak zobaczyłem kod to mi dosłownie szczęka opadła

Nie wiedziałeś, że tak można?

> pozwoliłem sobie szybko to poprawić i już nie straszy ;)
>

No ale nic nie poprawiłeś. Przedstawiłeś inne rozwiązanie. No i co Cię
wystraszyło;-)

Twoje rozwiązanie jest standardowe i jak najbardziej OK. Także KN wymienił
te metody na początku. Jednak to są popularne rozwiązania do szybkiego
wyszukania w sieci, dlatego Krzysiek podał mniej nietypowy sposób z użyciem
ISAM. Jest to rozwiązanie ciekawe z tego punktu widzenia, że wiele osób nie
wie (zresztą przecież Ty też;-), że za pomocą tej metody można tworzyć
pliki.

Nie zmienia to faktu, że w kodzie użyłbym metody podanej przez Ciebie, bo
tak jest w podręczniku. Ale Access jest ciekawszy, jeśli można się
dowiedzieć, że cos można zrobić w bardziej fantazyjny sposób ;-)

K.P.


Przemysław Rachwał

unread,
Mar 15, 2009, 7:21:04 PM3/15/09
to
(c) Krzysztof Pozorek wrote:
> (...)
>> jak zobaczyłem kod to mi dosłownie szczęka opadła
>
> Nie wiedziałeś, że tak można?
>
>> pozwoliłem sobie szybko to poprawić i już nie straszy ;)
>>
>
> No ale nic nie poprawiłeś. Przedstawiłeś inne rozwiązanie. No i co Cię
> wystraszyło;-)

to że do tak banalnej czynności wykorzystano mechanizmy bazodanowe, litości

> Twoje rozwiązanie jest standardowe i jak najbardziej OK. Także KN wymienił
> te metody na początku. Jednak to są popularne rozwiązania do szybkiego
> wyszukania w sieci, dlatego Krzysiek podał mniej nietypowy sposób z użyciem
> ISAM. Jest to rozwiązanie ciekawe z tego punktu widzenia, że wiele osób nie
> wie (zresztą przecież Ty też;-), że za pomocą tej metody można tworzyć
> pliki.

może inaczej, rozwiązanie jak najbardziej poprawne, działające, tyle że
przekombinowane, osoba o małym doświadczeniu tego nie poprawi bo nie
będzie wiedzieć o co chodzi

> Nie zmienia to faktu, że w kodzie użyłbym metody podanej przez Ciebie, bo
> tak jest w podręczniku. Ale Access jest ciekawszy, jeśli można się
> dowiedzieć, że cos można zrobić w bardziej fantazyjny sposób ;-)

to czemu nie napisze nikt czegoś takiego z wykorzystaniem np. składania
tekstu polecenia shell i komendy echo? przecież się da ;)

shell("@echo to jest jakis tekst >>plik.txt")

ps. wiedziałeś że tak można?

Krzysztof Naworyta

unread,
Mar 15, 2009, 8:10:43 PM3/15/09
to
Juzer Przemysław Rachwał <przemysla...@gmail.com> napisał

||| jak zobaczyłem kod to mi dosłownie szczęka opadła
||
|| Nie wiedziałeś, że tak można?
||
||| pozwoliłem sobie szybko to poprawić i już nie straszy ;)
|||
||
|| No ale nic nie poprawiłeś. Przedstawiłeś inne rozwiązanie. No i co Cię
|| wystraszyło;-)
|
| to że do tak banalnej czynności wykorzystano mechanizmy bazodanowe,
| litości

Dlaczego aż tak Cię to oburza ?
Dlaczego "litości" ?
Ludzie siedzący w accessie właśnie z mechanizmów bazodanowych korzystają
na codzień.
Lepsze czy gorsze ? To IMO sprawa dyskusyjna.


|| Twoje rozwiązanie jest standardowe i jak najbardziej OK. Także KN
|| wymienił te metody na początku. Jednak to są popularne rozwiązania do
|| szybkiego wyszukania w sieci, dlatego Krzysiek podał mniej nietypowy
|| sposób z użyciem ISAM. Jest to rozwiązanie ciekawe z tego punktu
|| widzenia, że wiele osób nie wie (zresztą przecież Ty też;-), że za
|| pomocą tej metody można tworzyć pliki.
|
| może inaczej, rozwiązanie jak najbardziej poprawne, działające, tyle że
| przekombinowane, osoba o małym doświadczeniu tego nie poprawi bo nie
| będzie wiedzieć o co chodzi

Znów: "przekombinowane" !
Z jakiego punktu widzenia ?

Ja, jako "accessowiec" bardzo wcześnie dowiedziałem się, że mogę
podlinkować "tablicowe" pliki tekstowe jako tabele.
Szybko też zauważyłem, że do takich "tabel" mogę swobodnie dopisać kolejne
"wiersze" (!)
Całkowicie ręcznie ! Palczasto !

Cała reszta to już poszukiwanie sposobów jak to zrobić właśnie
"bazo-danowo", nie wnikając w inne niuansy !

Starałem się, aby mój przykład niósł coś edukacyjnego.
Udało się czy nie, nie mnie rozstrzygać.

Pisanie/czytanie do/z innych baz niż lokalna baza mdb to dla wielu, tak
jak mówisz, czarna magia!
A przecież to wszystko jest w helpie !
Access dlatego nazywa się "access", że jako jedna z pierwszych okienkowych
aplikacji
pozwolił na _dostęp_ do niemal dowolnych źródeł bazodanowych:
txt (rozdzielany i stałej szerokości), dbf, xls, foxpro, paradox, odbc ...
Co można ręcznie, można też z poziomu kodu.
Co ciekawsze, można wszystko zrobić z poziomu czystego SQL !

Czy uważasz, że przypominanie o tym jest pozbawione sensu ?

|| Nie zmienia to faktu, że w kodzie użyłbym metody podanej przez Ciebie,
|| bo tak jest w podręczniku. Ale Access jest ciekawszy, jeśli można się
|| dowiedzieć, że cos można zrobić w bardziej fantazyjny sposób ;-)
|
| to czemu nie napisze nikt czegoś takiego z wykorzystaniem np. składania
| tekstu polecenia shell i komendy echo? przecież się da ;)

Mylisz się!
O ile metoda "linijka po linijce" w wykonaniu Twojego kodu jest ok. 200x
szybsza od mojej propozycji (!)
to w przypadku eksportu do pliku tekstowego całej tabeli o rekordach
powiedzmy 10-50 tyś. najprawdopodobniej będzie wiele bardziej efektywnie
via SQL/ISAM niż tradycyje pisanie do pliku.
Czyli warto mieć na uwadze i jedno i drugie.
Co ktos wykorzysta? Zależy od wielu czynników.

Od nadmiaru wariantów jeszcze nikt nie umarł ;)

Krzysztof Naworyta

unread,
Mar 15, 2009, 8:50:08 PM3/15/09
to
Juzer Przemysław Rachwał <przemysla...@gmail.com> napisał


(...)


| może inaczej, rozwiązanie jak najbardziej poprawne, działające, tyle że
| przekombinowane, osoba o małym doświadczeniu tego nie poprawi bo nie
| będzie wiedzieć o co chodzi

A co osoba o małym doświadczeniu zrozumie z instrukji otwierania i pisania
do pliku, zastosowanych przez Ciebie?
Zrozumie jeszcze mniej, bo dokopanie się w helpie do tych instrukcji jest
dość trudne!
(trzeba wpisać w module "Open" i nacisnąć F1, innej drogi nie ma!)


Broniąc dalej mój kod (a raczej ideę dlaczego go opublikowałem)

1.
Jak stworzyć pusty plik tekstowy pod podaną ścieżką, używając tylko SQL:

SELECT distinct 1
INTO
[TEXT;FMT=Delimited;HDR=NO;DATABASE=F:\Katalog].[plik#txt]
from MsysObjects where 1=0

Co tu jest tajemniczego, kompletnie niezrozumiałego ?
Jedynie ciąg "Connect" w samym wyrażeniu INTO:

TEXT;FMT=Delimited;HDR=No;DATABASE=F:\Biofarm_Mobile

tłumaczenie:
-------------------------
TEXT; - użyj sterownik ISAM do tekstów
FMT=Delimited; - będzie to plik rozdzielany (taki plik nie wymaga
specyfikacji)
HDR=NO; - czy z nagłówkami? Nie!
DATABASE=F:\Katalog - w jakim katalogu?

[plik#txt] - nazwa pliku z rozszerzeniem, zamień kropkę na #

2.
Jak do istniejącego pliku dołączyć jakiś wiersz ?

Insert Into
[TEXT;FMT=Delimited;HDR=NO;DATABASE=F:\Katalog].[plik#txt]
SELECT 1 , 2.12 , date()

Ciąg "Connect" jak powyżej!
Reszta to zwykły SQL (!!!)

3.
Jak odczytać plik tekstowy ?

select * from
[TEXT;FMT=Delimited;HDR=NO;DATABASE=F:\Katalog].[plik#txt]


Co tu jest strasznego ?
Ten jeden ciąg Connect ?
Dla mnie to nie tyle straszne co PIĘKNE !

Dokładnie tak samo napiszę do DBF, ODBC, XLS ...
Jedna abstrakcja !
Nie warto znać ?

Jacek

unread,
Mar 16, 2009, 12:38:44 AM3/16/09
to
Dzieki.
Operacje na plikach nie sa mi obce;)
Myslalem, ze istnieje "cos", co z automatu, jezeli wystapi blad, to
kumunikat bledu wysle do pliku zamiast na ekran.
Znalazlem to:
http://www.alvechurchdata.co.uk/hints-and-tips/accerrorlog.html

W powyzszym przykladzie oprocz "Module1.s1:, "Linia11", " bla bla" bede
mial w logu to co wazne, czyli:
Err.Number
Err.Description

Jacek

unread,
Mar 16, 2009, 1:05:21 AM3/16/09
to
Dnia Sun, 15 Mar 2009 20:43:10 +0100, Krzysztof Naworyta napisał(a):

> Jeśli liczysz, że w VS nie spotkasz tego rodzaju problemów, to z góry
> mówię: naiwny jesteś ;)
> Nie chodzi aby Cię zniechęcać ... Nikt nie każe programować w accessie.
> Jest wiele powodów by z access'a rezygnować. Ale akurat nie te, które
> przytaczasz. Te są wszędzie!

Jezeli bede mial exeka, ktory dziala u mnie, to na 99% bedzie dzialal u
klienta i u niego 2+2 tez bedzie 4. Nie biore pod uwage "rozjechanych"
systemow, czy innych wirusow.

Piszac w Akcesie, oprocz testowania wersji koncowej pod Akcesem, dochodzi
jeszcze testowanie (i mysle, ze bardziej rozszerzone) pod RT.
Podwojna robota. No bo cos takiego prozaicznego jak Lista.Value = 1, ktore
tutaj dziala, tutaj nie dziala, to sprawdzenie takich, wydawaloby sie,
oczywistych rzeczy, ktore nie maja prawa nie dzialac, jednak nie dzialaja i
czlowiek dochodzi do wniosku, ze jak taka bazke wypusci do ludzi, to nie ma
pojecia, w jakich to roznych punktach cos tam moze nie zadzialac i pieknie
RT sie zamknie. Wstyd, jak cholera;)
Moze nie wiem, ale chyba RT nie daje mozliwosci, zeby podawal normalne
komunikaty o bledzie. Jezeli jest taka mozliwosc, to chcetnie dowiedzialbym
sie jak to osiagnac. Fajnie jest, jak czlowiek dostanie komunikat "div by
0";)
Podsumowujac: bardzo lubie Akcesa:)

Przemysław Rachwał

unread,
Mar 16, 2009, 1:47:35 AM3/16/09
to
Krzysztof Naworyta wrote:
> Juzer Przemysław Rachwał <przemysla...@gmail.com> napisał
>
> ||| jak zobaczyłem kod to mi dosłownie szczęka opadła
> ||
> || Nie wiedziałeś, że tak można?
> ||
> ||| pozwoliłem sobie szybko to poprawić i już nie straszy ;)
> |||
> ||
> || No ale nic nie poprawiłeś. Przedstawiłeś inne rozwiązanie. No i co Cię
> || wystraszyło;-)
> |
> | to że do tak banalnej czynności wykorzystano mechanizmy bazodanowe,
> | litości
>
> Dlaczego aż tak Cię to oburza ?
> Dlaczego "litości" ?
> Ludzie siedzący w accessie właśnie z mechanizmów bazodanowych korzystają
> na codzień.
> Lepsze czy gorsze ? To IMO sprawa dyskusyjna.

nie oburza, poprostu bardzo zdziwiło

>
> || Twoje rozwiązanie jest standardowe i jak najbardziej OK. Także KN
> || wymienił te metody na początku. Jednak to są popularne rozwiązania do
> || szybkiego wyszukania w sieci, dlatego Krzysiek podał mniej nietypowy
> || sposób z użyciem ISAM. Jest to rozwiązanie ciekawe z tego punktu
> || widzenia, że wiele osób nie wie (zresztą przecież Ty też;-), że za
> || pomocą tej metody można tworzyć pliki.
> |
> | może inaczej, rozwiązanie jak najbardziej poprawne, działające, tyle że
> | przekombinowane, osoba o małym doświadczeniu tego nie poprawi bo nie
> | będzie wiedzieć o co chodzi
>
> Znów: "przekombinowane" !
> Z jakiego punktu widzenia ?

ile trzeba wykonać czynności by dodać kolejną kolumnę?

>
> Ja, jako "accessowiec" bardzo wcześnie dowiedziałem się, że mogę
> podlinkować "tablicowe" pliki tekstowe jako tabele.
> Szybko też zauważyłem, że do takich "tabel" mogę swobodnie dopisać kolejne
> "wiersze" (!)

o ile plik spełnia z góry określoną specyfikację

> Całkowicie ręcznie ! Palczasto !

z poziomu podlinkowanej tabeli, zgadza się

>
> Cała reszta to już poszukiwanie sposobów jak to zrobić właśnie
> "bazo-danowo", nie wnikając w inne niuansy !
>
> Starałem się, aby mój przykład niósł coś edukacyjnego.
> Udało się czy nie, nie mnie rozstrzygać.
>
> Pisanie/czytanie do/z innych baz niż lokalna baza mdb to dla wielu, tak
> jak mówisz, czarna magia!

wyższym poziomem magii jest pisanie kwerend parametrycznych

> A przecież to wszystko jest w helpie !
> Access dlatego nazywa się "access", że jako jedna z pierwszych okienkowych
> aplikacji
> pozwolił na _dostęp_ do niemal dowolnych źródeł bazodanowych:
> txt (rozdzielany i stałej szerokości), dbf, xls, foxpro, paradox, odbc ...
> Co można ręcznie, można też z poziomu kodu.
> Co ciekawsze, można wszystko zrobić z poziomu czystego SQL !
>
> Czy uważasz, że przypominanie o tym jest pozbawione sensu ?

absolutni nie
tyle że dodanie kolejnej kolumny jest z deka kłopotliwe


> || Nie zmienia to faktu, że w kodzie użyłbym metody podanej przez Ciebie,
> || bo tak jest w podręczniku. Ale Access jest ciekawszy, jeśli można się
> || dowiedzieć, że cos można zrobić w bardziej fantazyjny sposób ;-)
> |
> | to czemu nie napisze nikt czegoś takiego z wykorzystaniem np. składania
> | tekstu polecenia shell i komendy echo? przecież się da ;)
>
> Mylisz się!
> O ile metoda "linijka po linijce" w wykonaniu Twojego kodu jest ok. 200x
> szybsza od mojej propozycji (!)
> to w przypadku eksportu do pliku tekstowego całej tabeli o rekordach
> powiedzmy 10-50 tyś. najprawdopodobniej będzie wiele bardziej efektywnie
> via SQL/ISAM niż tradycyje pisanie do pliku.
> Czyli warto mieć na uwadze i jedno i drugie.
> Co ktos wykorzysta? Zależy od wielu czynników.

dla dużych zbiorów danych można wykorzystać np. adodb.stream albo fso,
albo inny wynalazek, metod jest kilka, pisanie linia po lini jest
średnio mądre

twoje rozwiązanie było by świetne dla wszystkiego oprócz pliku tekstowego

Zbigniew Bratko

unread,
Mar 16, 2009, 2:56:21 PM3/16/09
to

Użytkownik "Przemysław Rachwał" <przemysla...@gmail.com> napisał w
wiadomości news:gpk2iv$ppb$1...@inews.gazeta.pl...

[...]


>> Nie zmienia to faktu, że w kodzie użyłbym metody podanej przez Ciebie, bo
>> tak jest w podręczniku. Ale Access jest ciekawszy, jeśli można się
>> dowiedzieć, że cos można zrobić w bardziej fantazyjny sposób ;-)
>
> to czemu nie napisze nikt czegoś takiego z wykorzystaniem np. składania
> tekstu polecenia shell i komendy echo? przecież się da ;)
>
> shell("@echo to jest jakis tekst >>plik.txt")
>
> ps. wiedziałeś że tak można?

[...]

A mógłbyś przybliżyć jak to się ma wykonać.

Rozumiem, że tekst
"to jest jakis tekst" powinien zostać dopisany na końcu pliku np.
C:\plik.txt"

Ale jak to Shell'em wywołać:

Shell(pathname[,windowstyle]) krzyczy o nie istniejącym pliku ?


Chyba, że jest to skrót myślowy, a w rzeczywistości posługujesz się
dodatkowym plikiem wsadowym.

Coś w rodzaju: Shell (PathMojBat " & argumenty)


--
Pozdrowienia
BraZby

Przemysław Rachwał

unread,
Mar 16, 2009, 3:29:36 PM3/16/09
to

shell("cmd /c @echo test > d:\plik.txt")

w zasadzie w ten sposób można wykonać każdą komendę shell-a i
przekierowć strumień danych do pliku

> tworzy lub naspisuje plik
>> dodpisuje do pliku

Zbigniew Bratko

unread,
Mar 16, 2009, 5:33:16 PM3/16/09
to

Użytkownik "Przemysław Rachwał" <przemysla...@gmail.com> napisał w
wiadomości news:gpm9d7$chk$1...@inews.gazeta.pl...

[...]

Spróbuj, czy u Ciebie to działa, u mnie nie chce:

Shell ("cmd /k test > d:\plik.txt"), vbNormalFocus

dostaję taki komunikat:

Nazwa 'test' nie jest rozpoznawana jako polecenie wewnętrzne lub
zewnętrzne, program wykonywalny lub plik wsadowy.

Moim zdaniem cmd próbuje wykonać polecenie: test
i przekierować strumień do pliku d:\plik.txt.

'_____________________________________________
Skoro bawimy się w różne sposoby pisania logów to
tytułem zabawy:

Przykładowy jednolinijkowy czteroargumentowy plik bat
C:\mojBat.bat

@ECHO %1 %2 %3 %4 >>c:\ReadMe.txt

' jednoargumentowy plik bat
C:\mojBatBis.bat

@ECHO %1 >>c:\ReadMe.txt

Wywołanie
' _____________________________________
Public Sub PiszLog( _
procedura As String, _
akcja As String, _
inne As String)
Const D1 As String = """" ' zezwala na spacje
Const D2 As String = """/" ' separator dla ver.1
Const D3 As String = "/" ' separator dla ver.2

Call Shell("C:\mojBat.bat " & _
D1 & CStr(Now()) & D2 & _
D1 & procedura & D2 & _
D1 & akcja & D2 & _
D1 & inne & D1, vbHide)

' poniżej dla jednoargumentowego pliku C:\mojBatBis.bat

Call Shell("C:\mojBatBis.bat " & _
D1 & CStr(Now()) & D3 & _
procedura & D3 & _
akcja & D3 & _
inne & D1, vbHide)

End Sub

pozostaje jeszcze problem konwersji polskich ogonków,
no i szybkośc takiego rozwiązania. Za każdym razem
wywoływane jest przecież cmd.exe

--
Pozdrowienia
BraZby

Przemysław Rachwał

unread,
Mar 16, 2009, 5:49:48 PM3/16/09
to

co to jest test?
i dobrze kombinujesz z wytlumaczeniem

i czemu /k a nie /c?


cmd jest przypadkiem ekstremalnym, wygodnym w innych sytuacjach np.
rekursywne przeszukiwanie dysku z logowaniem do pliku

dir /s *.jpg /b

wykonanie odpowiednika w VBA to trochę rzeźby

i na koniec powiedzmy że każdy z takich gadżetów ma ściśle określone
zastosowanie z pewną dozą elastyczności ale to już inny temat

Zbigniew Bratko

unread,
Mar 17, 2009, 4:50:19 AM3/17/09
to

Użytkownik "Przemysław Rachwał" <przemysla...@gmail.com> napisał w
wiadomości news:gpmhk4$qsv$1...@inews.gazeta.pl...
> Zbigniew Bratko wrote:

Ten post jest kodowany w UTF-8

Pozwolę sobie na króciutkie podsumowanie części wątku dot. cmd

>>>>>
>>>>> to czemu nie napisze nikt czegoś takiego z wykorzystaniem np.
>>>>> składania
>>>>> tekstu polecenia shell i komendy echo? przecież się da ;)
>>>>>
>>>>> shell("@echo to jest jakis tekst >>plik.txt")
>>>>>
>>>>> ps. wiedziałeś że tak można?

W podany powyżej sposób nie można
I jak widać wywołanie jest do d...

shell("@echo to jest jakis tekst >>plik.txt")

bo nic nie uzyskujemy. Taka składnia nie działa !!!

>>>> A mógłbyś przybliżyć jak to się ma wykonać.
>>>>
>>>> Rozumiem, że tekst
>>>> "to jest jakis tekst" powinien zostać dopisany na końcu pliku np.
>>>> C:\plik.txt"

[...]

>>> shell("cmd /c @echo test > d:\plik.txt")
>>>
>>> w zasadzie w ten sposób można wykonać każdą komendę shell-a i
>>> przekierowć
>>> strumień danych do pliku
>>>
>>> > tworzy lub naspisuje plik
>>> >> dodpisuje do pliku

No i to dalej nie działa, prawda ?

shell("cmd /c @echo test > d:\plik.txt")

>> Moim zdaniem cmd próbuje wykonać polecenie: test
>> i przekierować strumień do pliku d:\plik.txt.

> co to jest test?
> i dobrze kombinujesz z wytlumaczeniem

No i jak drugi Twój przykład nie działa, to mi mówisz że dobrze
kombinuję z wytłumaczeniem Twojego błędnego przykładu.
Ja wiem dlaczego to nie działa i nie muszę kombinować.
Staram się innym przybliżyć (bo testowałem Twoje rozwiązanie)
jakie występują błędy

>
> i czemu /k a nie /c?
>

Pytanie powinno brzmieć:
Dlaczego /k i vbNormalFocus w poniższym wywołaniu:


Shell ("cmd /k test > d:\plik.txt"), vbNormalFocus

Aby w ramach testowania metody zapisu do pliku poprzez cmd
dla tych osób, które nie sprawdzają, czy docelowy plik uległ zmianie,
widzieli bezpośrednio w oknie cmd, że polecenie jest błędne.


>> '_____________________________________________
>> Skoro bawimy się w różne sposoby pisania logów to
>> tytułem zabawy:

[...]

>> ' _____________________________________
>> Public Sub PiszLog( _
>> procedura As String, _
>> akcja As String, _
>> inne As String)

[...]

>>
>> End Sub
>>
>> pozostaje jeszcze problem konwersji polskich ogonków,
>> no i szybkośc takiego rozwiązania. Za każdym razem
>> wywoływane jest przecież cmd.exe
>
>
> cmd jest przypadkiem ekstremalnym, wygodnym w innych sytuacjach np.
> rekursywne przeszukiwanie dysku z logowaniem do pliku

No to teraz dopiero piszesz, że cmd jest przypadkiem ekstremalnym wygodnym
w innych sytuacjach. A jak odpisywałeś KP to z ironią stwierdziłeś:

<cyt>


shell("@echo to jest jakis tekst >>plik.txt")

ps. wiedziałeś że tak można?

</cyt>

[...]

>
> dir /s *.jpg /b
>
> wykonanie odpowiednika w VBA to trochę rzeźby

może trochę trzeba porzeźbić, ale ma się większą pewność,
że otrzymamy wszystkie pliki.
Moje pobieżne spostrzeżenia odnośnie komendy DIR:

1. Komenda DIR nie zawsze zwraca prawidłowo nazwy plików np.
C:\PlikiTest\Procesor Intel® Core™2 Duo.url
błędnie zwraca jako
C:\PlikiTest\Procesor IntelR Coret2 Duo.url
co w przypadku nazwy folderu nie pozwoli na wylistowanie jego zawartości

2. zamiast nazwy pliku Ola作手ma册kota.txt
otrzymamy: Ola??ma?kota.txt

3. Nie odczytamy zawartości folderu D:\V6(一卡多号操作手册)
bo otrzymamy komunikat
"Błąd odczytu folderu: przykładowo D:\V6(????????)\"

4. dir c:\ >c:\mojplik.txt
dla pliku c:\gżegżółą.txt otrzymam w wynikowym pliku gľegľ˘ˆĄ.txt


--
Pozdrowienia
BraZby

Przemysław Rachwał

unread,
Mar 17, 2009, 4:30:57 PM3/17/09
to
Zbigniew Bratko wrote:

1, a propo UTF i CMD, fakt to kicha
nikt normalny przynajmniej w tym kraju z tego nie korzysta, jak się
trafi jakiś oszołom to ma problem

tak na marginesie VB/VBA natywnie nie pisze w UTF ani go nie wspiera

2. nie można wejść do katalogu o nazwie z utf

F:\test>cd "V6(????????)"

F:\test\V6(????????)>

czy coś mam jezcze dodać?

3. shell("cmd /c @echo test > plik.txt") ' usunołem dysk - taki skrót
myślowy

F:\test\V6(????????)>cmd /c @echo test > plik.txt

F:\test\V6(????????)>dir
Wolumin w stacji F to WIndows
Numer seryjny woluminu: B894-7B85

Katalog: F:\test\V6(????????)

2009-03-17 21:21 <DIR> .
2009-03-17 21:21 <DIR> ..
2009-03-17 21:21 7 plik.txt
1 plik(ów) 7 bajtów
2 katalog(ów) 9 033 170 944 bajtów wolnych

F:\test\V6(????????)>

to czy uruchamiasz za pomocą shell czy z commandline - bez znaczenia

4. bo tobie nie działa - twój system twoje problemy

5. wykorzystanie @echo coś >> plik
idiotyzm porównywalny do zapisu za pomocą ISAM, ot taka mała ironia

6. shell("@echo to jest jakis tekst >>plik.txt")
czynnik ludzki, każdy się mógł pomylić ja też, idea jest poprawna i
wykorzystywana w zupełnie innych zadaniach np: logowanie akcji w
skryptach logowania bez wykorzystania cscript.exe

reszta to bicie piany

Zbigniew Bratko

unread,
Mar 17, 2009, 4:36:59 PM3/17/09
to

Użytkownik "Przemysław Rachwał" <przemysla...@gmail.com> napisał w
wiadomości news:gpp1a7$hs$1...@inews.gazeta.pl...


[...]

Z mojej strony EOT

--
Pozdrowienia
BraZby


0 new messages