<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUYFQHgzeCp7ImA9WhRUGUs.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886</id><updated>2012-01-31T00:45:11.680+01:00</updated><category term="MSSQL" /><category term="jQuery" /><category term="MySQL" /><category term="SQL" /><category term="php" /><category term="ADODB" /><category term="VB.NET" /><category term="ICONV" /><category term="COM" /><category term="JET SQL" /><category term="Word" /><category term="integracja" /><category term="C#" /><category term="Command" /><category term="Parameters" /><category term="VBA" /><category term="Access" /><category term="RegExp" /><category term="translacja" /><category term="cmd.exe" /><category term="vbs" /><category term="Apache" /><category term="CONF" /><category term="T-SQL" /><category term="wget" /><category term="Java Script" /><category term="akcelerator" /><category term="Excel" /><title>VBA Mania</title><subtitle type="html">&lt;i&gt;Non sunt multiplicanda entia sine necessitate&lt;/i&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://vbamania.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/jLbkt" /><feedburner:info uri="blogspot/jlbkt" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DE8AQ347fCp7ImA9WhdUFkg.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-1599949360159642801</id><published>2011-10-02T16:11:00.002+02:00</published><updated>2011-10-03T17:47:22.004+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T17:47:22.004+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VBA" /><category scheme="http://www.blogger.com/atom/ns#" term="Excel" /><category scheme="http://www.blogger.com/atom/ns#" term="ADODB" /><title>Szybkie sprawdzenie czy czy istnieje tabela o podanej nazwie</title><content type="html">ADODB daje nam szereg możliwości. Jedną z nich jest możliwość pobrania informacji o strukturze bazy do której się podłączyliśmy. Przypadkiem szczególnym takich baz są bazy plikowe czyli popularne pliki mdb i accdb. Przypadkiem jeszcze bardziej szczególnym zaś są pliki Excel-a które można traktować jak pliki bazodanowe.&lt;br /&gt;
&lt;br /&gt;
Po podłączeniu do do tkiego pliku wystarczy uruchomić jedną metodę aby uzyskać pełen komplet informacji na temat tego zo znajduje się w środku a co najważniejsze nie musimy takiego pliku otwierać za pomocą Excel-a co mogło by być naprawdę czasochłonne.&lt;br /&gt;
&lt;br /&gt;
Metoda o której mówię to &lt;b&gt;OpenSchema&lt;/b&gt;, zaś parametr odpowiadający za pobranie informacji o tabelach to: &lt;b&gt;adSchemaTables&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Przykładowy skrypt wykorzystujący ta metodę:&lt;br /&gt;
&lt;pre class="brush: vb;"&gt;Function GetTablesFromDatabase(Plik As String, Tabela As String) As Boolean
    
    Dim aRs As ADODB.Recordset
    Dim aConn As ADODB.Connection
    Dim sConn As String
    Dim e As Long
    Dim ext As String
    
    e = InStrRev(Plik, ".")
    ext = Right(Plik, Len(Plik) - e)
    
    Select Case ext
        Case "xls"
            sConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &amp;amp; Plik &amp;amp; "; Extended Properties =""Excel 8.0;HDR=Yes;IMEX=1"";"
        Case "xlsx"
            sConn = "Provider =Microsoft.ACE.OLEDB.12.0; Data Source =" &amp;amp; Plik &amp;amp; "; Extended Properties =""Excel 12.0 Xml;HDR=YES"";"
        Case "mdb"
            sConn = "Provider =Microsoft.Jet.OLEDB.4.0; Data Source =" &amp;amp; Plik &amp;amp; " ; User Id =admin; Password =;"
        Case "accdb"
            sConn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source =" &amp;amp; Plik &amp;amp; ";"
    End Select

On Error GoTo ERR_Handler:

    Set aConn = New ADODB.Connection
    With aConn
        .Mode = adModeShareDenyNone
        .CursorLocation = adUseServer
        .ConnectionString = sConn
        .Open
    
        Set aRs = aConn.OpenSchema(adSchemaTables)
    
        aRs.MoveFirst
        aRs.Filter = "TABLE_NAME='" &amp;amp; Tabela &amp;amp; "'"
    
        Do While Not aRs.EOF
            If aRs.Fields("TABLE_NAME").Value = Tabela Then
                GetTablesFromDatabase = True
                Exit Do
            End If
            aRs.MoveNext
        Loop
    
        .Close
    End With
    
    Exit Function
    
ERR_Handler:

    MsgBox Err.Description
    If aConn.State &amp;gt; 0 Then
        aConn.Close
    End If
    
End Function&lt;/pre&gt;&lt;br /&gt;
Przykładowe wykorzystanie&lt;br /&gt;
&lt;pre class="brush: vb;"&gt;Sub test()
    Debug.Print GetTablesFromDatabase("E:\Dane\user\Moje Dokumenty\zeszyt1.xls", "Arkusz1$")
End Sub&lt;/pre&gt;&lt;br /&gt;
Uzyskujemy w ten sposób informację o tym czy dany arkusz istnieje w bazie danych czy też nie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-1599949360159642801?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Mdde2Mer2COaPMQIuN9Aq1kgHAs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Mdde2Mer2COaPMQIuN9Aq1kgHAs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Mdde2Mer2COaPMQIuN9Aq1kgHAs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Mdde2Mer2COaPMQIuN9Aq1kgHAs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/9a0dBZdOT7w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/1599949360159642801/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2011/10/szybkie-sprawdzenie-czy-vzy-istnieje.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1599949360159642801?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1599949360159642801?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/9a0dBZdOT7w/szybkie-sprawdzenie-czy-vzy-istnieje.html" title="Szybkie sprawdzenie czy czy istnieje tabela o podanej nazwie" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2011/10/szybkie-sprawdzenie-czy-vzy-istnieje.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8DQH86fip7ImA9WhdUFkg.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-166403176647161216</id><published>2011-10-02T15:16:00.003+02:00</published><updated>2011-10-03T17:47:51.116+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T17:47:51.116+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vbs" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Zrzut danych z bazy do pliku tekstowego</title><content type="html">Nieraz stajemy przed wyzwaniem jak sobie poradzić w przypadku braku jakiegoś narzędzia na naszym komputerze. Z doświadczenia wiem że w korporacjach komputery są dosyć rygorystycznie ograniczane pod kątem możliwości instalacji aplikacji, co może niestety&amp;nbsp;dosyć&amp;nbsp;utrudnić życie. Dlatego też trzeba często kombinować jak tu sobie poradzić w takiej ekstremalnej sytuacji. Dobrym przykładem moze być zrzut danych z bazy do pliku tekstowego. Do wielu baz danych są dostarczane odpowiednie narzędzia jak np. BCP.EXE albo SQLCMD.EXE do MSSQL-a. Problem w tym że trzeba te narzędzia zainstalować. Rozwiązaniem tego problemu może być prosty skrypt w VBS-e pobierający dane z bazy i zrzucający do pliku. Pozwoliłem sobie coś takiego napisać:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: vb;"&gt;Dim aConn, sConn , aRs, sSQL 
Dim sPath
Dim oFld, sHeader, bHeader, sContent, sDelimiter
Dim sCharset
dim oArgs, oArg, sArg
dim oStdOut

Const adTypeText = 2
Const adSaveCreateOverWrite = 2

set oArgs=wscript.Arguments 
Set oStdOut = WScript.StdOut

sPath = ""
sCharset = "utf-8"
sDelimiter = ";"
bHeader = 0

For Each oArg In oArgs
 sArg = fGetParmName(oArg)
 select case sArg
  case "Sql", "S"
   sSQL = fGetParmValue(oArg)
  case "Path", "P"
   sPath = fGetParmValue(oArg)
  case "Conn", "C"
   sConn = fGetParmValue(oArg)
  case "Charset", "A"
   sCharset = fGetParmValue(oArg)
  case "Header" , "H"
   bHeader = fGetParmValue(oArg)
  case "Delimiter", "D" 
   sDelimiter = fGetParmValue(oArg)
 End Select
Next

On Error Resume Next
Err.Clear

Set aConn = CreateObject("ADODB.Connection")
aConn.Open sConn
If Err.Number &amp;lt;&amp;gt; 0 Then call sError

Set aRs = aConn.Execute(sSQL)
If Err.Number &amp;lt;&amp;gt; 0 Then call sError

aRs.MoveFirst
If Err.Number &amp;lt;&amp;gt; 0 Then call sError

if bHeader = "Yes" Then
 For Each oFld In aRs.Fields
  sHeader = sHeader &amp;amp; oFld.Name &amp;amp; sDelimiter
 Next
 sHeader = Left(sHeader, Len(sHeader) - 1) &amp;amp; Chr(13) &amp;amp; Chr(10)
End If

sContent = sHeader &amp;amp; aRs.GetString(, , sDelimiter)
If Err.Number &amp;lt;&amp;gt; 0 Then call sError

if sPath&amp;lt;&amp;gt; "" Then
 ExportToFile sPath, sContent
Else
 oStdOut.Write sContent
end if

aConn.Close
If Err.Number &amp;lt;&amp;gt; 0 Then call sError

set oStdOut = Nothing
Set aRs = Nothing
Set aConn = Nothing

function fGetParmName (sIn)
 fGetParmName= left(sIn, InStr(sIn,":") -1 )
 if left(fGetParmName,1) ="/" Then fGetParmName = mid(fGetParmName,2)
End Function

function fGetParmValue (sIn)
 fGetParmValue= mid(sIn, InStr(sIn,":") + 1 )
End Function

sub sError
 Wscript.Echo Err.Description
 On Error GoTo 0
 Err.Clear
 Wscript.Quit
End Sub

sub ExportToFile (sPath, sContent)
 Dim aStream 'As ADODB.Stream
 Set aStream = CreateObject("ADODB.Stream")
 With aStream
  .Open
  .Type = adTypeText
  .Charset = sCharset
  If Err.Number &amp;lt;&amp;gt; 0 Then call sError
  .Position = 0
  .WriteText sContent
  If Err.Number &amp;lt;&amp;gt; 0 Then call sError
  .SaveToFile sPath, adSaveCreateOverWrite
  If Err.Number &amp;lt;&amp;gt; 0 Then call sError   
 End With
 Set aStream = Nothing
End Sub&lt;/pre&gt;&lt;br /&gt;
Skrypt ten można uruchomić w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;eksport.vbs /Sql:"SELECT * FROM dbo.v_struktura_akt" /Conn:"DRIVER=SQL Server Native Client 10.0;SERVER=MASZYNA;UID=username;Trusted_Connection=Yes;WSID=MASZYNA;DATABASE=baza_danych;LANGUAGE=polski;" /Path:"E:\Roboczy\wynik.csv"&lt;/pre&gt;&lt;br /&gt;
dostępne są następujące parametry:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;/SQL:"select * from tabela"&lt;/b&gt; - zapytanie które chcemy uruchomić&lt;br /&gt;
&lt;b&gt;/Conn:"DRIVER=SQL Server....."&lt;/b&gt; - ciąg połączenia do bazy danych, zaletą tego rozwiązania jest to że możemy pobrać dane z praktycznie dowolnej bazy danych&lt;br /&gt;
&lt;b&gt;/Path:"d:\katalog\plik.csv"&lt;/b&gt;&amp;nbsp;- ścieżka do pliku w którym chcemy przechowywać wynik. W przypadku gdy nie podamy pliku wynik zostanie przekierowany do strumienia &lt;b&gt;STDOUT&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;/Charset:"utf-8"&lt;/b&gt; - domyślny marametr strony kodowej w której zapiszemy plik. Standardowo jest utf-8, ale można zastosować dowolną stronę kodową obsługiwaną przez ADODB.Stream np. windows-1250&lt;br /&gt;
&lt;b&gt;/Header:"Yes"&lt;/b&gt; - dodaje wiersz z nagłówkami&lt;br /&gt;
&lt;b&gt;/Delimiter:";"&lt;/b&gt; - ustala znak podziału poszczególnych kolumn&lt;br /&gt;
&lt;br /&gt;
Mała uwaga: jeżeli chcemy wyłączyć Banner w programie CSCRIPT&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.&lt;/pre&gt;&lt;br /&gt;
Wykonajmy polecenie&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;cscript //NoLogo //S&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-166403176647161216?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lfn0Gj71tD9p_a_7nGEYgikXMTA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lfn0Gj71tD9p_a_7nGEYgikXMTA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lfn0Gj71tD9p_a_7nGEYgikXMTA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lfn0Gj71tD9p_a_7nGEYgikXMTA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/VnOWaGnrT6Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/166403176647161216/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2011/10/zrzut-danych-z-pazy-do-pliku-tekstowego.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/166403176647161216?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/166403176647161216?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/VnOWaGnrT6Y/zrzut-danych-z-pazy-do-pliku-tekstowego.html" title="Zrzut danych z bazy do pliku tekstowego" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2011/10/zrzut-danych-z-pazy-do-pliku-tekstowego.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYHR3c_eip7ImA9WhZXEks.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-8127373116109407140</id><published>2011-05-01T18:16:00.003+02:00</published><updated>2011-05-01T18:25:36.942+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-01T18:25:36.942+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VB.NET" /><title>Automatyczne łączenie aplikacji i bibliotek w jeden plik podczas kompilacji</title><content type="html">Zastanawiałem się w jaki sposób mógł bym sprawić żeby mój projekt odwołujący się do kilku bibliotek zewnętrznych nie był zbieraniną plików a jednym wygodnym do użycia plikiem. Głównym motywatorem takiego działania jest fakt że to aplikacji przeznaczona do pracy z linii poleceń.&lt;br /&gt;
&lt;br /&gt;
Żeby wykonać scalić wszystkie pliki w jedną całość skorzystałem z narzędzia ILMerge.exe dostępnego na stronach &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&amp;amp;displaylang=en"&gt;Microsoft&lt;/a&gt;. Po ściągnięciu i zainstalowaniu możemy korzystać z tego narzędzia standardowo za pomocą linii poleceń i np. wykonać komendę:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;ilmerge /target:exe /out:Aplikacja.exe 
        Program.exe ClassLibrary1.dll ClassLibrary2.dll&lt;/pre&gt;&lt;br /&gt;
Dzięki takiej operacji z trzech plików robi nam się jeden, ale tu uwaga - parametr &lt;b&gt;/target:exe&lt;/b&gt; wskazuje na to że plik wynikowy będzie uruchamiany z linii poleceń, można też użyć opcji &lt;b&gt;/target:winexe&lt;/b&gt; - dzięki czemu stworzymy aplikację okienkowa lub &lt;b&gt;/target:library&lt;/b&gt; - dzięki czemu stworzymy bibliotekę.&lt;br /&gt;
&lt;br /&gt;
Oczywiście takie łączenie da nam jak najbardziej prawidłowy plik, lecz na dłuższą metę nie jest to wygodne. Rozwiązaniem było by takie zmodyfikowanie naszego projektu aby łączenie nastąpiło automatycznie po skomplikowaniu projektu. Taką możliwość możemy uzyskać dzięki ręcznej modyfikacji pliku projektu *.vbproj polegającej na dodaniu następującej sekcji:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://pastebin.com/L1eGGKYP"&gt;http://pastebin.com/L1eGGKYP&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Taka konstrukcja sprawi że po wykonaniu opeacjii Build zostanie wykonana komenda ILMerge z parametrami. Dodatkowo dodałem parametr /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 sprawiający że ILMerge bedzie działał z .NET w wersji 4.0&lt;br /&gt;
&lt;br /&gt;
Dodanie takiej sekcji działa również w pliku projektu stworzonego w wersji Visual Studio Express .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-8127373116109407140?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hG3tHRaVvI6cZJx_oPXzdM-Lrwc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hG3tHRaVvI6cZJx_oPXzdM-Lrwc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hG3tHRaVvI6cZJx_oPXzdM-Lrwc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hG3tHRaVvI6cZJx_oPXzdM-Lrwc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/8w24HYKrsqg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/8127373116109407140/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2011/05/automatyczne-aczenie-aplikacji-i.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/8127373116109407140?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/8127373116109407140?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/8w24HYKrsqg/automatyczne-aczenie-aplikacji-i.html" title="Automatyczne łączenie aplikacji i bibliotek w jeden plik podczas kompilacji" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2011/05/automatyczne-aczenie-aplikacji-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQEQ3Y9eSp7ImA9WhZQEk8.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-1594750841769172714</id><published>2011-04-19T16:44:00.001+02:00</published><updated>2011-04-19T16:45:02.861+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-19T16:45:02.861+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Access" /><category scheme="http://www.blogger.com/atom/ns#" term="JET SQL" /><title>Wielokrotny wybór w dialekcie JET SQL (Access)</title><content type="html">Często zdarza mi się korzystać z konstrukcji IIF(warunek,wartość dla prawda,wartość dla fałsz) z pozycji kwerend w Access-e. Taka przykładowa kwerenda mogła by wyglądać np. tak:&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;SELECT t1.pole, IIF(t2.pole_w = 'TAK', 1,0) as FLAGA 
FROM TABELA_1 as t1 join TABELA_2 as t2 on t1.id = t2.id
&lt;/pre&gt;&lt;br /&gt;
Problem zaczyna się w momencie gdy musimy sprawdzić kilka niezależnych warunków i na podstawie takiego wyboru określić wynik końcowy. Oczywiście można zagnieżdżać IIF-y, ale to nie jest ani ładne, ani czytelne a tym bardziej wygodne. Idealnym rozwiązaniem było by zastosowanie CASE WHEN .... THEN .... ELSE END, ale JET SQL nie udostępnia nam bezpośrednio tego typu rozwiązania. Daje nam za to coś podobnego i działającego de fakto tak samo. jest to instrukcja SWITCH. Nasz wcześniejszy przykład możemy sobie rozbudować np. tak&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;SELECT t1.pole
, SWITCH(t2.pole_w = 'TAK', 1, t2.pole_w = 'NIE' ,0, t2.pole_w = 'NIE WIEM', -1, t2.pole_w = 'INNA ODPOWIEDŹ', -2) as FLAGA 
FROM TABELA_1 as t1 join TABELA_2 as t2 on t1.id = t2.id
&lt;/pre&gt;&lt;br /&gt;
W tym momencie jak widzimy mamy kilka opcji bez zbędnego komplikowania, ale to nie koniec możliwości ;)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;SELECT t1.pole
, SWITCH(t2.pole_w = 'TAK', 1, t2.pole_w = 'NIE' ,0, t2.pole_w = 'NIE WIEM', -1, t2.pole_w = 'INNA ODPOWIEDŹ', -2, t2.pole_w in ('A','B','C'), 'ABC' , 1=1, 'COKOLWIEK INNEGO') as FLAGA 
FROM TABELA_1 as t1 join TABELA_2 as t2 on t1.id = t2.id
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;t2.pole_w in ('A','B','C')&lt;/b&gt; - to klasyczne sprawdzenie czy element jest w podanym zbiorze&lt;br /&gt;
&lt;b&gt;1=1&lt;/b&gt; - to ostatni warunek logiczny będący zawsze prawdą i wykonany w momencie gdy którykolwiek z wcześniejszych nie został uwzględniony.&lt;br /&gt;
&lt;br /&gt;
I tu małą uwaga: jeżeli SWITCH natrafi na kryterium które jest spełnione to zwraca wartość i kończy sprawdzanie.&lt;br /&gt;
&lt;br /&gt;
Jako ciekawostkę podam że w instrukcji SWITCH można jako zbiór danych podzapytanie np.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;t2.pole_w in (SELECT KLUCZ FROM SLOWNIK)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
a jak znam życie to pewnie można też dać podzapytanie skorelowane, ale sprawdzenie tego pozostawiam już czytelnikom&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-1594750841769172714?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DaTo0lMnjYcIH6mWonXURebHl1c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DaTo0lMnjYcIH6mWonXURebHl1c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DaTo0lMnjYcIH6mWonXURebHl1c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DaTo0lMnjYcIH6mWonXURebHl1c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/fMsSN43SVMM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/1594750841769172714/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2011/04/wielokrotny-wybor-w-dialekcie-jet-sql.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1594750841769172714?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1594750841769172714?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/fMsSN43SVMM/wielokrotny-wybor-w-dialekcie-jet-sql.html" title="Wielokrotny wybór w dialekcie JET SQL (Access)" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2011/04/wielokrotny-wybor-w-dialekcie-jet-sql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUBRX8zeyp7ImA9WhZQEk8.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-3764885983697128946</id><published>2011-04-19T16:26:00.001+02:00</published><updated>2011-04-19T16:27:34.183+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-19T16:27:34.183+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cmd.exe" /><category scheme="http://www.blogger.com/atom/ns#" term="MSSQL" /><title>Mapowanie dysku sieciowego z pozycji T-SQL-a</title><content type="html">Dziś pokażę w jaki prosty sposób zmapować dysk sieciowy z poziomu MSSQL-a. Jest to szczególnie przydatne w momencie jak&amp;nbsp;chcemy&amp;nbsp;pobrać jakiś plik ze zdalnego serwera zabezpieczonego za pomocą loginu i hasła np. w celu załadowania za pomocą&amp;nbsp;BULK INSERT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;xp_cmdshell 'cmd /c IF EXIST W: net use W: /DELETE'
xp_cmdshell 'cmd /c net use W: \\maszyna\udzial haslo /USER:maszyna\login /PERSISTENT:YES'

 BULK INSERT dbo.tabela
   FROM 'W:\plik.txt'
   WITH
   (
   FIELDTERMINATOR =';',
   ROWTERMINATOR ='\n',
   FIRSTROW = 2,
   CODEPAGE = 1250
   )&lt;/pre&gt;&lt;br /&gt;
jeżeli z jakiegoś powodu nie chcemy angażować dysku sieciowego, to wykorzystamy UNC&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql;"&gt;xp_cmdshell 'cmd /c IF EXIST \\maszyna\udzial net use \\maszyna\udzial /DELETE'
xp_cmdshell 'cmd /c net use W: \\maszyna\udzial haslo /USER:maszyna\login /PERSISTENT:YES'

 BULK INSERT dbo.tabela
   FROM '\\maszyna\udzial\plik.txt'
   WITH 
   (
   FIELDTERMINATOR =';',
   ROWTERMINATOR ='\n',
   FIRSTROW = 2,
   CODEPAGE = 1250
   )&lt;/pre&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-3764885983697128946?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hQvJ32id9X347URXHyP7wKQFHrw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hQvJ32id9X347URXHyP7wKQFHrw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hQvJ32id9X347URXHyP7wKQFHrw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hQvJ32id9X347URXHyP7wKQFHrw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/Vy9jQTpA0cA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/3764885983697128946/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2011/04/mapowanie-dysku-sieciowego-z-pozycji-t.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/3764885983697128946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/3764885983697128946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/Vy9jQTpA0cA/mapowanie-dysku-sieciowego-z-pozycji-t.html" title="Mapowanie dysku sieciowego z pozycji T-SQL-a" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2011/04/mapowanie-dysku-sieciowego-z-pozycji-t.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcFR3g4cSp7ImA9Wx9UGUU.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-624606733482405391</id><published>2011-02-17T23:00:00.000+01:00</published><updated>2011-02-17T23:00:16.639+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-17T23:00:16.639+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Excel" /><title>Synchronizacja tabeli z polem w Excelu</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/PE59qxQy_5g/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PE59qxQy_5g?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/PE59qxQy_5g?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;Taka mała magiczna sztuczka dla tych, którzy by chcieli bez użycia kodu VBA zsynchronizować tabelę w Excelu z filtrami umieszczonymi w polach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-624606733482405391?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4IP_yYS4do-NqGAuvrM2z4_ItlQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4IP_yYS4do-NqGAuvrM2z4_ItlQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4IP_yYS4do-NqGAuvrM2z4_ItlQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4IP_yYS4do-NqGAuvrM2z4_ItlQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/wNGz0IZbYjc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/624606733482405391/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2011/02/synchronizacja-tabeli-z-polem-w-excelu.html#comment-form" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/624606733482405391?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/624606733482405391?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/wNGz0IZbYjc/synchronizacja-tabeli-z-polem-w-excelu.html" title="Synchronizacja tabeli z polem w Excelu" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2011/02/synchronizacja-tabeli-z-polem-w-excelu.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUFR3Yyeyp7ImA9Wx9UGUo.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-753760137356519117</id><published>2011-02-17T21:56:00.000+01:00</published><updated>2011-02-17T21:56:56.893+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-17T21:56:56.893+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VBA" /><title>Gwiazdki w InputBox-e</title><content type="html">Czytając dzisiaj posty na forum dyskusyjnym &lt;a href="http://www.goldenline.pl/forum/2243476/gwiazdki-w-inputboxie/s/1#40772278"&gt;goldenline.pl&lt;/a&gt; natrafiłem na bardzo elegancki sposób realizacji tytułowych gwiazdek w InputBox-e. Rozwiązanie opiera się o API Windows i wygląda następująco:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: vb;"&gt;Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
                                                      ByVal ncode As Long, _
                                                      ByVal wParam As Long, _
                                                      lParam As Any) As Long
Private Declare Function GetModuleHandle Lib "kernel32" _
                                         Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function SetWindowsHookEx Lib "user32" _
                                          Alias "SetWindowsHookExA" (ByVal idHook As Long, _
                                                                     ByVal lpfn As Long, _
                                                                     ByVal hmod As Long, _
                                                                     ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" _
                                             (ByVal hHook As Long) As Long
Private Declare Function SendDlgItemMessage Lib "user32" _
                                            Alias "SendDlgItemMessageA" (ByVal hDlg As Long, _
                                                                         ByVal nIDDlgItem As Long, _
                                                                         ByVal wMsg As Long, _
                                                                         ByVal wParam As Long, _
                                                                         ByVal lParam As Long) As Long
Private Declare Function GetClassName Lib "user32" _
                                      Alias "GetClassNameA" (ByVal hwnd As Long, _
                                                             ByVal lpClassName As String, _
                                                             ByVal nMaxCount As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Private Const EM_SETPASSWORDCHAR = &amp;HCC
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
Private Const HC_ACTION = 0
Private hHook  As Long



Public Function NewProc(ByVal lngCode As Long, _
                        ByVal wParam As Long, _
                        ByVal lParam As Long) As Long
    Dim RetVal
    Dim strClassName As String
    Dim lngBuffer As Long
    If lngCode &lt; HC_ACTION Then
        NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
        Exit Function
    End If
    strClassName = String$(256, " ")
    lngBuffer = 255
    If lngCode = HCBT_ACTIVATE Then
        RetVal = GetClassName(wParam, strClassName, lngBuffer)
        If Left$(strClassName, RetVal) = "#32770" Then
            SendDlgItemMessage wParam, &amp;H1324, EM_SETPASSWORDCHAR, Asc("*"), &amp;H0
        End If
    End If
    CallNextHookEx hHook, lngCode, wParam, lParam
End Function



Public Function InputBoxDK(Prompt, _
                           Optional Title, _
                           Optional Default, _
                           Optional XPos, _
                           Optional YPos, _
                           Optional HelpFile, _
                           Optional Context) As String
    Dim lngModHwnd As Long
    Dim lngThreadID As Long
    lngThreadID = GetCurrentThreadId
    lngModHwnd = GetModuleHandle(vbNullString)
    hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)
    On Error Resume Next
    InputBoxDK = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
    UnhookWindowsHookEx hHook
End Function

Sub PasswordBox()

    If InputBoxDK("Proszą wprowadzić hasło", "Wymagane hasło") &lt;&gt; "ania" Then
        MsgBox "Niestety, to nie było prawidłowe hasło."
    Else
        MsgBox "Hasło prawidłowe! Zapraszamy."
    End If

End Sub

&lt;/pre&gt;&lt;br /&gt;
Moim skromnym zdaniem rozwiązanie jest świetne gdyż nie musimy korzystać z dedykowanego userforma, co w wielu przypadkach jest idealnym rozwiązaniem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-753760137356519117?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PBxpOk1fMN1YCm0I3vKvsvx10LY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PBxpOk1fMN1YCm0I3vKvsvx10LY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PBxpOk1fMN1YCm0I3vKvsvx10LY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PBxpOk1fMN1YCm0I3vKvsvx10LY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/B4GDRDRKqlo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/753760137356519117/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2011/02/gwiazdki-w-inputbox-e.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/753760137356519117?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/753760137356519117?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/B4GDRDRKqlo/gwiazdki-w-inputbox-e.html" title="Gwiazdki w InputBox-e" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2011/02/gwiazdki-w-inputbox-e.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkECSH89fyp7ImA9Wx9QEk4.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-2177187325330348784</id><published>2010-12-25T00:51:00.001+01:00</published><updated>2010-12-25T00:51:09.167+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-25T00:51:09.167+01:00</app:edited><title>Nowość w CreateWorkspace wprowadzona od wersji Access 2007</title><content type="html">&lt;a href="http://msdn.microsoft.com/en-us/library/bb221018(v=office.12).aspx"&gt; &lt;br /&gt;
&lt;blockquote&gt;CreateWorkspace Method [Access 2007 Developer Reference]&lt;/a&gt;: "ODBCDirect workspaces are not supported in Microsoft Office Access 2007. Setting the type argument to &lt;span style="font-weight:bold;"&gt;dbUseODBC&lt;/span&gt; will result in a run-time error. Use ADO if you want to access external data sources without using the Microsoft Access database engine."&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
Oznacza to ni mniej ni więcej to że nie da się wykonać następującego kodu: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: vb;"&gt;Sub dbOpenDynamicX()

Dim wrkMain As Workspace
Dim conMain As Connection
Dim qdfTemp As QueryDef
Dim rstTemp As Recordset
Dim strSQL As String
Dim intLoop As Integer

' Create ODBC workspace and open connection to
' SQL Server database.
Set wrkMain = CreateWorkspace("ODBCWorkspace", _
"admin", "", dbUseODBC)

' Note: The DSN referenced below must be configured to 
'       use Microsoft Windows NT Authentication Mode to 
'       authorize user access to the Microsoft SQL Server.    
Set conMain = wrkMain.OpenConnection("Publishers", _
dbDriverNoPrompt, False, _
"ODBC;DATABASE=pubs;DSN=Publishers")

' Open dynamic-type recordset.
Set rstTemp = _
conMain.OpenRecordset("authors", _
dbOpenDynamic)

With rstTemp
Debug.Print "Dynamic-type recordset: " &amp; .Name

' Enumerate records.
Do While Not .EOF
Debug.Print "    " &amp; !au_lname &amp; ", " &amp; _
!au_fname
.MoveNext
Loop

.Close
End With

conMain.Close
wrkMain.Close

End Sub &lt;/pre&gt;&lt;br /&gt;
Skutkuje to tym że nie możemy stworzyć obiektu &lt;span style="font-weight:bold;"&gt;wrkMain&lt;/span&gt; służącego nam podczas otwierania połączania. &lt;br /&gt;
Jaki z tego płynie wniosek: piszmy od razu w ADO jeżeli zamierzamy korzystać z zewnętrznej bazy danych w naszym projekcie Accessowym.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-2177187325330348784?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/V_R0erEMfwbbU5SwtliLMOxwOcs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V_R0erEMfwbbU5SwtliLMOxwOcs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/V_R0erEMfwbbU5SwtliLMOxwOcs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V_R0erEMfwbbU5SwtliLMOxwOcs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/MEn9pQhyjnI" height="1" width="1"/&gt;</content><link rel="related" href="http://msdn.microsoft.com/en-us/library/bb221018(v=office.12).aspx" title="Nowość w CreateWorkspace wprowadzona od wersji Access 2007" /><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/2177187325330348784/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/12/nowosc-w-createworkspace-wprowadzona-od.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2177187325330348784?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2177187325330348784?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/MEn9pQhyjnI/nowosc-w-createworkspace-wprowadzona-od.html" title="Nowość w CreateWorkspace wprowadzona od wersji Access 2007" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/12/nowosc-w-createworkspace-wprowadzona-od.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcBQn4_eSp7ImA9Wx5bFkk.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-8842603592485071127</id><published>2010-11-01T22:41:00.001+01:00</published><updated>2010-11-01T22:47:33.041+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-01T22:47:33.041+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Access" /><title>Design navigation UI with Access 2010</title><content type="html">&lt;object style="background-image:url(http://i3.ytimg.com/vi/vkMzkhVfK6Y/hqdefault.jpg)"  width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vkMzkhVfK6Y?fs=1&amp;amp;hl=pl_PL"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/vkMzkhVfK6Y?fs=1&amp;amp;hl=pl_PL" width="425" height="344" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
Kolejna bardzo ciekawa funkcja moim zdaniem w Accessie. Dzięki takiej kontrolce w łatwy sposób możemy budować nawet zaawansowane struktury w bardzo szybki i intuicyjny sposób.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-8842603592485071127?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QUfqS-UV569leDGoFo6j8M6dlGY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QUfqS-UV569leDGoFo6j8M6dlGY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QUfqS-UV569leDGoFo6j8M6dlGY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QUfqS-UV569leDGoFo6j8M6dlGY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/jj6u2ENJxWM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/8842603592485071127/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/11/design-navigation-ui-with-access-2010.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/8842603592485071127?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/8842603592485071127?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/jj6u2ENJxWM/design-navigation-ui-with-access-2010.html" title="Design navigation UI with Access 2010" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/11/design-navigation-ui-with-access-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcGSX4zeip7ImA9Wx5bFkk.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-6979740369677193963</id><published>2010-11-01T22:14:00.002+01:00</published><updated>2010-11-01T22:47:08.082+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-01T22:47:08.082+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Access" /><title>Access 2010 - The Web Browser Control Feature</title><content type="html">&lt;object style="background-image:url(http://i4.ytimg.com/vi/GHoy6hsAltc/hqdefault.jpg)"  width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/GHoy6hsAltc?fs=1&amp;amp;hl=pl_PL"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/GHoy6hsAltc?fs=1&amp;amp;hl=pl_PL" width="425" height="344" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
Nowe kontrolki takie jak prezentowany Web Browser otwierają zupełnie nowe możliwości przez starym poczciwym Accessem :)&lt;br /&gt;
&lt;br /&gt;
z ciekawostek mogę podać fakt w jaki sposób mozemy operować tą kontrolką, która de fakto jest osadzonym internet explorerem. Zrobimy to dzięki obiektowi Object znajdującego się wewnątrz kontrolki Web Browser-a. np.&lt;br /&gt;
&lt;pre class="brush: vb;"&gt;Me.myWebBrowserControl.Object.Navigate myUrl&lt;/pre&gt;pozwoli nam na swobodne nawigowanie do dowolnie wybranej strony. Korzystanie z metody POST również będzie się odbywać za pomocą tego obiektu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-6979740369677193963?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iDoAAkz8bFDVCqcDUU9TndTYdbI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iDoAAkz8bFDVCqcDUU9TndTYdbI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iDoAAkz8bFDVCqcDUU9TndTYdbI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iDoAAkz8bFDVCqcDUU9TndTYdbI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/zlhJyyXQesM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/6979740369677193963/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/11/access-2010-web-browser-control-feature.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/6979740369677193963?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/6979740369677193963?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/zlhJyyXQesM/access-2010-web-browser-control-feature.html" title="Access 2010 - The Web Browser Control Feature" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/11/access-2010-web-browser-control-feature.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QEQnY6eyp7ImA9Wx5UE0g.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-1106305488690717329</id><published>2010-10-17T23:26:00.003+02:00</published><updated>2010-10-17T23:35:03.813+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-17T23:35:03.813+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VBA" /><title>Wysyłanie maila za pomocą CDO</title><content type="html">&lt;p&gt;Biblioteka CDO obecna w systemie Windows świetnie nadaje się do masowego wysyłania wiadomości mailowych za pomocą za pomocą wszelakiej maści skryptów. Przykładowy skrypt wysyłający wiadomość HTML z osadzonym obrazkiem i dwoma załącznikami znajduje się w kodzie poniżej:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:fb0b552a-d473-49f8-a304-f07ac66bd009" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: vb;"&gt;Option Explicit

' skracamy sobie trochę długość w ustawieniach
Private Const cdo_conf As String = "http://schemas.microsoft.com/cdo/configuration/"

Const cdoSendUsingPickup = 1 'wyslij wiadomość do katalogu z którego podejmie ją serwer
Const cdoSendUsingPort = 2 ' wysyłaj wiadomości na port serwer-a
Const cdoAnonymous = 0 'brak
Const cdoBasic = 1 'jawny tekst
Const cdoNTLM = 2 'NTLM
Const cdoRefTypeId = 0
Const cdoRefTypeLocation = 1

Sub CDO_Mail_Small_Text()

Dim strbody As String
Dim iMsg   As Object 'CDO.Message
Dim iConf  As Object 'CDO.Configuration
Dim Flds As Object

Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")

iConf.Load -1    ' CDO Source Defaults
Set Flds = iConf.Fields

' ustawienie parametrów serwera z którego korzystamy
With Flds
.Item(cdo_conf &amp;amp; "sendusername") = "user" 'login
.Item(cdo_conf &amp;amp; "sendpassword") = "xxxxxx" 'hasło
.Item(cdo_conf &amp;amp; "smtpserver") = "poczta.o2.pl" 'serwer SMTP
.Item(cdo_conf &amp;amp; "smtpserverport") = 465 ' port
.Item(cdo_conf &amp;amp; "sendusing") = cdoSendUsingPort 'metoda wysyłania
.Item(cdo_conf &amp;amp; "smtpauthenticate") = cdoBasic 'metoda uwieżytelnienia
.Item(cdo_conf &amp;amp; "smtpusessl") = 1 ' kodowany kanał
.Update
End With

strbody = "Hi there" &amp;amp; vbNewLine &amp;amp; vbNewLine &amp;amp; _
"This is line 1" &amp;amp; vbNewLine &amp;amp; _
"This is line 2" &amp;amp; vbNewLine &amp;amp; _
"This is line 3" &amp;amp; vbNewLine &amp;amp; _
"This is line 4"


With iMsg.Fields
' priorytet
.Item("urn:schemas:mailheader:X-MSMail-Priority") = "High" ' Dla Outlook 2003
.Item("urn:schemas:mailheader:X-Priority") = 2    ' Dla Outlook 2003 i innych np. Thunderbird-a
.Item("urn:schemas:httpmail:importance") = 2 ' Dla Outlook Express

' własny nagłówek
.Item("urn:schemas:mailheader:X-myfield") = "Email-Okay"
.Update
End With

With iMsg
Set .Configuration = iConf

' wielu odbiorców
.To = "user@gazeta.pl; user@gmail.com"
.CC = "" ' kopia
.BCC = "" ' ukryta kopia
.From = "user@o2.pl"       ' istotne wysyłamy w kontekście konkretnego konta pocztowego
.Subject = "Raport"         ' temat
.TextBody = strbody         ' wiadomość w postaci tekstu, jest niezależna od tej w HTML-u
' wiadomość w HTML-u. obrazek jako źródło ma ustawione cid:header.gif - ten sam nagłówek został dodany w kolejnej sekcji
.HTMLBody = "&amp;lt;img src='cid:header.gif'&amp;gt;&amp;lt;br&amp;gt;" &amp;amp; Replace(strbody, vbNewLine, "&amp;lt;BR&amp;gt;" &amp;amp; vbNewLine)

' dodanie załącznika
.AddAttachment "d:\msg\indeksowanie.xlsm"
.AddAttachment "d:\msg\import_status.xlsx"

' dodaie obrazka wykorzystanego w wiadomości HTML
.AddRelatedBodyPart "d:\msg\header.gif", "header.gif", cdoRefTypeId

.Send ' wyślij
End With

End Sub&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeżeli chcielibyśmy manipulować zawartością w zależności od adresata to od razu powiem – jest taka możliwość o czym opowiem w kolejnym odcinku.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-1106305488690717329?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3dchSeKwQ-_4Ff6bXItLwKDrL70/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3dchSeKwQ-_4Ff6bXItLwKDrL70/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3dchSeKwQ-_4Ff6bXItLwKDrL70/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3dchSeKwQ-_4Ff6bXItLwKDrL70/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/K2ehCOTntJI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/1106305488690717329/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/10/wysyanie-maila-za-pomoca-cdo.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1106305488690717329?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1106305488690717329?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/K2ehCOTntJI/wysyanie-maila-za-pomoca-cdo.html" title="Wysyłanie maila za pomocą CDO" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/10/wysyanie-maila-za-pomoca-cdo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEMSHY9cSp7ImA9Wx5UE0k.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-84067202733708389</id><published>2010-10-17T22:51:00.001+02:00</published><updated>2010-10-17T22:51:29.869+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-17T22:51:29.869+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apache" /><title>WAMP i SKYPE</title><content type="html">&lt;p align="justify"&gt;Platforma WAMP nie chce działać popranie w momencie gdy jakiś program zajmie jej porty 80 i 443. Coś takiego może się zdarzyć jak korzystamy z programu SKYPE który domyślnie podczas startu nasłuchuje na tych portach. Możemy to wyłączyć w aplikacji SKYPE, tak aby nie mieć z tym problemu w przyszłości.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Om2Kdnd1Ulo/TLthyEtMkPI/AAAAAAAAAoA/Kzp2boAuUPs/s1600-h/skype_konfiguracja%5B6%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="skype_konfiguracja" border="0" alt="skype_konfiguracja" src="http://lh4.ggpht.com/_Om2Kdnd1Ulo/TLthzGFwDrI/AAAAAAAAAoE/uawGxIV8BOg/skype_konfiguracja_thumb%5B4%5D.png?imgmax=800" width="202" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Po wyłączeniu tej opcji należy uruchomić ponownie Skyp-a, o czym jesteśmy informowani. Na końcu zaś możemy już uruchomić Apache bez żadnych problemów.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-84067202733708389?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x-6VR6qaOgcgaQwo3S9oOPu4eNc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x-6VR6qaOgcgaQwo3S9oOPu4eNc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x-6VR6qaOgcgaQwo3S9oOPu4eNc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x-6VR6qaOgcgaQwo3S9oOPu4eNc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/wMNv1dCJIZQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/84067202733708389/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/10/wamp-i-skype.html#comment-form" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/84067202733708389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/84067202733708389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/wMNv1dCJIZQ/wamp-i-skype.html" title="WAMP i SKYPE" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_Om2Kdnd1Ulo/TLthzGFwDrI/AAAAAAAAAoE/uawGxIV8BOg/s72-c/skype_konfiguracja_thumb%5B4%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/10/wamp-i-skype.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4CSH46fyp7ImA9Wx5WEEs.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-8420048853484703942</id><published>2010-09-21T12:56:00.001+02:00</published><updated>2010-09-21T13:02:49.017+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-21T13:02:49.017+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VBA" /><category scheme="http://www.blogger.com/atom/ns#" term="Excel" /><category scheme="http://www.blogger.com/atom/ns#" term="RegExp" /><title>Funkcja VBA do wyłuskiwania teksu</title><content type="html">W dzisiejszym odcinku pokażę gotową funkcję umożliwiającą wyłuskiwanie tekstu na podstawie wzorca RegExp. Funkcja ta jest niezwykle prosta, a zarazem niezwykle użyteczna, gdyż ma o wiele szersze możliwości niż standardowe rozwiązania obecne w VBA lub Excel-u.&lt;br /&gt;
&lt;pre class="brush:vb"&gt;Function RegExpString(sString As String, pattern As String, _
                      Optional iMath As Integer = 0, _
                      Optional bIgnoreCase As Boolean = True, _
                      Optional bGlobal As Boolean = True) As String

    Dim oRegExp As Object
    Dim oMatches As Object

    On Error GoTo ERR_Handler:

    If pattern = "" Then
        RegExpString = ""
        Exit Function
    End If

    If sString = "" Then
        RegExpString = ""
        Exit Function
    End If
    
    Set oRegExp = CreateObject("vbScript.RegExp")
    With oRegExp
        .IgnoreCase = bIgnoreCase
        .Global = bGlobal
        .pattern = pattern
        Set oMatches = .Execute(sString)
    End With

    If oMatches.Count - 1 &amp;lt; iMath Then
        RegExpString = ""
        Exit Function
    End If
    
    RegExpString = oMatches(iMath).Value

END_Handler:

    Set oRegExp = Nothing

     Exit Function

ERR_Handler:

    RegExpString = ""

    Resume END_Handler:

End Function&lt;/pre&gt;&lt;pre class="brush:vb"&gt;&lt;/pre&gt;Parametry funkcji to:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;sString&lt;/b&gt; - tekst w którym wyszukujemy&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;pattern&lt;/b&gt; - Wzorzec wykorzystany do wyszukiwania&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;iMath&lt;/b&gt; - numer przypisania w kolekcji ze wszystkimi pasującymi elementami. Może się okazać że mamy ich więcej niż jedno trafienie&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bIgnoreCase&lt;/b&gt; - Ignoruj wielkość liter&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bGlobal&lt;/b&gt; - badaj wszystkie możliwe kombinacje w ciągu&lt;/li&gt;
&lt;/ul&gt;Przykład wykorzystania to np.:&lt;br /&gt;
&lt;pre class="brush:vb"&gt;Debug.Print RegExpString("ala ma psa, a kot to fafik","ala ma ?(kota|psa)")&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-8420048853484703942?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9EMlrIjpqC_oXL1cRnrJwsIvXOg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9EMlrIjpqC_oXL1cRnrJwsIvXOg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9EMlrIjpqC_oXL1cRnrJwsIvXOg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9EMlrIjpqC_oXL1cRnrJwsIvXOg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/UFER0vATDVA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/8420048853484703942/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/09/funkcja-vba-do-wyuskiwania-teksu.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/8420048853484703942?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/8420048853484703942?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/UFER0vATDVA/funkcja-vba-do-wyuskiwania-teksu.html" title="Funkcja VBA do wyłuskiwania teksu" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/09/funkcja-vba-do-wyuskiwania-teksu.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEFRH4-eSp7ImA9Wx5XEEg.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-2646960866995567936</id><published>2010-09-09T20:56:00.001+02:00</published><updated>2010-09-09T20:56:55.051+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-09T20:56:55.051+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="integracja" /><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="MSSQL" /><title>Eksport danych z MSSQL-a bezpośrednio do MySQL-a</title><content type="html">Dziś pokażę w jaki prosty sposób wyeksportować dane za pomocą jednego polecenia SQL. Wykorzystamy do tego mechanizm LINKED SERVER obecny w MSSQL-u.&lt;br /&gt;
Pierwszym krokiem jest stworzenie &amp;nbsp;łącza&amp;nbsp;do zdalnej maszyny:&lt;br /&gt;
&lt;pre class="brush:sql"&gt;/****** Object:  LinkedServer [MYSQL]    Script Date: 09/09/2010 20:33:31 ******/
IF  EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'MYSQL')
 EXEC master.dbo.sp_dropserver @server=N'MYSQL', @droplogins='droplogins'
GO

/****** Object:  LinkedServer [MYSQL]    Script Date: 09/09/2010 20:33:31 ******/
EXEC master.dbo.sp_addlinkedserver 
 @server = N'MYSQL', 
 @srvproduct=N'MySQL', 
 @provider=N'MSDASQL', 
 @provstr=N'Driver=MySQL ODBC 5.1 Driver;SERVER=localhost;UID=root;PWD=tajnehaslo;DATABASE=sprzedaz;PORT=3306;CHARSET=utf8'
 /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin 
 @rmtsrvname=N'MYSQL',
 @useself=N'True',
 @locallogin=NULL,
 @rmtuser=NULL,
 @rmtpassword=NULL&lt;/pre&gt;&lt;br /&gt;
załóżmy że mamy tabelkę w bazie zdefiniowaną jako:&lt;br /&gt;
&lt;pre class="brush:sql"&gt;CREATE TABLE [dbo].[tab_import](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [O1] [varchar](30) NULL,
 [L1] [varchar](70) NULL,
 [O2] [varchar](30) NULL,
 [L2] [varchar](70) NULL,
 [O3] [varchar](30) NULL,
 [L3] [varchar](70) NULL,
 [O4] [varchar](30) NULL,
 [L4] [varchar](70) NULL,
 [O5] [varchar](30) NULL,
 [L5] [varchar](70) NULL,
 CONSTRAINT [PK_tab_import] PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY]&lt;/pre&gt;&lt;br /&gt;
Posiadamy również tabelkę po stronie MySQL-a zdefiniowaną jaką&lt;br /&gt;
&lt;pre class="brush:sql"&gt;CREATE TABLE `tab_import` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `O1` varchar(30) DEFAULT NULL,
  `L1` varchar(70) DEFAULT NULL,
  `O2` varchar(30) DEFAULT NULL,
  `L2` varchar(70) DEFAULT NULL,
  `O3` varchar(30) DEFAULT NULL,
  `L3` varchar(70) DEFAULT NULL,
  `O4` varchar(30) DEFAULT NULL,
  `L4` varchar(70) DEFAULT NULL,
  `O5` varchar(30) DEFAULT NULL,
  `L5` varchar(70) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;/pre&gt;i chcemy przetransferować dane z bazy MSSQl do bazy MySQL. Skorzystamy w takim przypadku z możliwości INSERT INTO ... SELECT&lt;br /&gt;
&lt;pre class="brush:sql"&gt;INSERT INTO openquery (MYSQL,'select * from test.tab_import where 1 = 0')
                      (O1, L1, O2, L2, O3, L3, O4, L4, O5, L5)
SELECT     O1, L1, O2, L2, O3, L3, O4, L4, O5, L5
FROM         tab_import AS tab_import_1&lt;/pre&gt;Ciekawostką w tym układzie jest konstrukcja zagnieżdżonego SELECT-a wykorzystywanego przez OPENQUERY. warunek w tym zapytaniu filtruje wszystkie rekordy gdyż de fakto nie są one nam do niczego potrzebne. Podobna sztuczka nie jest wskazana w przypadku gdybyśmy chcieli wykonać DELETE lub UPDATE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-2646960866995567936?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/auIbRSWv17oongFEwYCWLhI_6yE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/auIbRSWv17oongFEwYCWLhI_6yE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/auIbRSWv17oongFEwYCWLhI_6yE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/auIbRSWv17oongFEwYCWLhI_6yE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/Qyu_Ixouk8Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/2646960866995567936/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/09/eksport-danych-z-mssql-bezposrednio-do.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2646960866995567936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2646960866995567936?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/Qyu_Ixouk8Q/eksport-danych-z-mssql-bezposrednio-do.html" title="Eksport danych z MSSQL-a bezpośrednio do MySQL-a" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/09/eksport-danych-z-mssql-bezposrednio-do.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YCRHw6cCp7ImA9Wx5QF08.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-3910001208455313203</id><published>2010-09-06T01:25:00.001+02:00</published><updated>2010-09-06T01:26:05.218+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-06T01:26:05.218+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Excel" /><title>Formatowanie warunkowe</title><content type="html">&lt;object height="344" style="background-image: url(http://i2.ytimg.com/vi/AyiciOeS5l4/hqdefault.jpg);" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/AyiciOeS5l4?fs=1&amp;amp;hl=pl_PL"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/AyiciOeS5l4?fs=1&amp;amp;hl=pl_PL" width="425" height="344" allowscriptaccess="never" allowfullscreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
Formatowanie warunkowe w Excel 2010&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-3910001208455313203?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bJ0R7iC_GD8dgYzzoqNnq4_cn3Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bJ0R7iC_GD8dgYzzoqNnq4_cn3Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bJ0R7iC_GD8dgYzzoqNnq4_cn3Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bJ0R7iC_GD8dgYzzoqNnq4_cn3Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/Qzgk34uOVu4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/3910001208455313203/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/09/formatowanie-warunkowe.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/3910001208455313203?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/3910001208455313203?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/Qzgk34uOVu4/formatowanie-warunkowe.html" title="Formatowanie warunkowe" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/09/formatowanie-warunkowe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4AR3wzfip7ImA9Wx5XFEw.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-2717714236072928119</id><published>2010-09-05T23:35:00.003+02:00</published><updated>2010-09-13T23:22:26.286+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-13T23:22:26.286+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="MSSQL" /><title>Dodatki i usprawnienia dla MSSQL w wersji Express</title><content type="html">&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;MSSQL w wersji&amp;nbsp;Express&amp;nbsp;to ciekawa baza, tyle że pozbawiona wielu użytecznych narządzi. Dzięki kilku dodatkom praca z tą wersją bazy będzie o wiele prostsza i zaoszczędzi nam&amp;nbsp;mnóstwa&amp;nbsp;pracy.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Automatyzacja&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/Articles/93522/Automating-Backups-on-SQL-Server-Express-Version.aspx"&gt;Automating Backups on SQL Server Express Version - CodeProject&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://expressmaint.codeplex.com/"&gt;ExpressMaint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Shulder-y&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.sqlteam.com/article/scheduling-jobs-in-sql-server-express"&gt;Scheduling Jobs in SQL Server Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lazycoding.com/products.aspx"&gt;SQLScheduler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/alex_papadimoulis/archive/2005/11/10/Express-Agent-for-SQL-Server-Express_3A00_-Jobs_2C00_-Jobs_2C00_-Jobs_2C00_-and-Mail.aspx"&gt;Express Agent for SQL Server Express: Jobs, Jobs, Jobs, and Mail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Dodatki&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sites.google.com/site/sqlprofiler/"&gt;Profiler for Microsoft SQL Server 2005/2008 Express Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.sqlteam.com/mladenp/archive/2007/07/01/60245.aspx"&gt;Enabling Database Mail on SQL Server Express&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Menadżery&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://toadforsqlserver.com/index.jspa"&gt;Toad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-2717714236072928119?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j2pQaCMeeBx4srYz-aSTZnGZ9RQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j2pQaCMeeBx4srYz-aSTZnGZ9RQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j2pQaCMeeBx4srYz-aSTZnGZ9RQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j2pQaCMeeBx4srYz-aSTZnGZ9RQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/KRFDXIzfC9g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/2717714236072928119/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/09/dodatki-i-usprawnienia-dla-mssql-w.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2717714236072928119?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2717714236072928119?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/KRFDXIzfC9g/dodatki-i-usprawnienia-dla-mssql-w.html" title="Dodatki i usprawnienia dla MSSQL w wersji Express" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/09/dodatki-i-usprawnienia-dla-mssql-w.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IBSXk4eyp7ImA9Wx5QEUk.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-1277307460577757143</id><published>2010-08-30T00:45:00.002+02:00</published><updated>2010-08-30T08:25:58.733+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-30T08:25:58.733+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="JET SQL" /><title>Określenie daty zakończenia miesiąca w SQL-u</title><content type="html">Dziś pokażę jak określić koniec miesiąca dla dowolnej daty. Wykorzystam tu pewną sztuczkę związaną z dodawaniem dat za pomocą funkcji DATEADD oraz wyciąganiem części składowych za pomocą funkcji YEAR i MONTH.&lt;br /&gt;
&lt;pre class="brush:sql"&gt;declare @dstop as datetime
set @dstop = getdate()
set @dstop =  dateadd(d,-1,dateadd(mm,1,convert(datetime,cast(year(@dstop) as nvarchar(4)) + '-' + RIGHT('0' + cast(MONTH(@dstop) as nvarchar(4)),2) + '-01',120)))

select @dstop&lt;/pre&gt;&lt;br /&gt;
Algorytm postępowania jest następujący:&lt;br /&gt;
Wyciągamy Rok i miesiąc i na podstawie tego sklejamy datę określającą pierwszy dzień miesiąca&lt;br /&gt;
dodajemy miesiąc do tak otrzymanej daty&lt;br /&gt;
dodajemy -1 dzień do otrzymanej wcześniej sumy&lt;br /&gt;
&lt;br /&gt;
Inna metoda to:&lt;br /&gt;
&lt;pre class="brush:sql"&gt;declare @dstop datetime
set @dstop = getdate() + 1
set @dstop =  dateadd(d,-day(dateadd(m,1,@dstop)),dateadd(m,1,@dstop))

select @dstop&lt;/pre&gt;Sposób ten zaprezentował kolega Bartosz Ślepowroński &lt;a href="http://www.goldenline.pl/forum/1881692/miesiace-z-przedzialu-dat/s/2#35710136"&gt;w tym wątku&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Z powodzeniem ten sposób można zastosować w innych dialektach SQL np. JET&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-1277307460577757143?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EW7YJh9fUxkg9HYBWh3xcUJyPDM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EW7YJh9fUxkg9HYBWh3xcUJyPDM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EW7YJh9fUxkg9HYBWh3xcUJyPDM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EW7YJh9fUxkg9HYBWh3xcUJyPDM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/c-tF9_PDHc4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/1277307460577757143/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/08/okreslenie-daty-zakonczenia-miesiaca-w.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1277307460577757143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1277307460577757143?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/c-tF9_PDHc4/okreslenie-daty-zakonczenia-miesiaca-w.html" title="Określenie daty zakończenia miesiąca w SQL-u" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/08/okreslenie-daty-zakonczenia-miesiaca-w.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcCQno-fSp7ImA9Wx5RGUk.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-5073262470259730014</id><published>2010-08-27T23:52:00.001+02:00</published><updated>2010-08-27T23:54:23.455+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-27T23:54:23.455+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VBA" /><title>Sprawdzenie czy plik jest otwarty przez inny program</title><content type="html">Znalazłem ciekawy kawałek kodu w internecie do sprawdzenia czy dany plik nie został otwarty w innej aplikacji. np. plik Excel-a. Kod ten wykorzystuje API Windows.&lt;br /&gt;
&lt;pre class="brush:vb"&gt;Option Explicit

'===========================================

'http://www.xcelfiles.com/IsFileOpenAPI.htm

'===========================================

'// Note we use an Alias here as using the Actual
'// function name will not be accepted! ie underscore= "_lopen"
Private Declare Function lOpen _
                          Lib "kernel32" _
                              Alias "_lopen" ( _
                              ByVal lpPathName As String, _
                              ByVal iReadWrite As Long) _
                              As Long

Private Declare Function lClose _
                          Lib "kernel32" _
                              Alias "_lclose" ( _
                              ByVal hFile As Long) _
                              As Long

'// Don't use these...here for Info only

Private Const OF_SHARE_COMPAT = &amp;H0
Private Const OF_SHARE_DENY_NONE = &amp;H40
Private Const OF_SHARE_DENY_READ = &amp;H30
Private Const OF_SHARE_DENY_WRITE = &amp;H20

'// Use the Constant below
'// OF_SHARE_EXCLUSIVE = &amp;H10
'// OPENS the FILE in EXCLUSIVE mode,
'// denying other processes AND the current process both read and write
'// access to the file. If the file has been opened in any other mode for read or
'// write access _lopen fails. This is important as if you open the file in the
'// current process = Excel BUT loose its handle
'// then you CANNOT open it again in the SAME session!
Private Const OF_SHARE_EXCLUSIVE = &amp;H10

'If the Function succeeds, the return value is a File handle.
'If the Function fails, the return value is HFILE_ERROR = -1

Private Function IsFileAlreadyOpen(strFullPath_FileName As String) As Boolean
'// Ivan F Moala
'// http://www.xcelfiles.com
    Dim hdlFile As Long
    Dim lastErr As Long
    hdlFile = -1
    '// Open file for Read/Write and Exclusive Sharing.
    hdlFile = lOpen(strFullPath_FileName, OF_SHARE_EXCLUSIVE)
    '// If we can't open the file, get the last error.
    If hdlFile = -1 Then
        lastErr = Err.LastDllError
    Else
        '// Make sure we close the file on success!
        lClose (hdlFile)
    End If
    '// Check for sharing violation error.
    IsFileAlreadyOpen = (hdlFile = -1) And (lastErr = 32)
End Function

Private Function LastUser(strPath As String) As String
'// Code by Helen from http://www.visualbasicforum.com/index.php?s=
'// This routine gets the Username of the File In Use
'// Credit goes to Helen for code &amp; Mark for the idea
'// Insomniac for xl97 inStrRev
'// Amendment 25th June 2004 by IFM
'// : Name changes will show old setting
'// : you need to get the Len of the Name stored just before
'// : the double Padded Nullstrings

    Dim strXl  As String
    Dim strFlag1 As String, strflag2 As String
    Dim i As Integer, j As Integer
    Dim hdlFile As Long
    Dim lNameLen As Byte

    strFlag1 = Chr(0) &amp; Chr(0)
    strflag2 = Chr(32) &amp; Chr(32)

    hdlFile = FreeFile
    Open strPath For Binary As #hdlFile
    strXl = Space(LOF(hdlFile))
    Get 1, , strXl
    Close #hdlFile
    j = InStr(1, strXl, strflag2)
    
#If Not VBA6 Then
    '// Xl97
    For i = j - 1 To 1 Step -1
        If Mid(strXl, i, 1) = Chr(0) Then Exit For
    Next
    i = i + 1
#Else
    '// Xl2000+
    i = InStrRev(strXl, strFlag1, j) + Len(strFlag1)
#End If

    '// IFM
    lNameLen = Asc(Mid(strXl, i - 3, 1))
    LastUser = Mid(strXl, i, lNameLen)

End Function
&lt;/pre&gt;Wykorzystanie przykładowe znajduje się w kodzie poniżej:&lt;br /&gt;
&lt;pre class="brush:vb"&gt;Sub TestAPI()
'// We can use this for ANY FILE not just Excel!
    Dim t      As String
    t = "C:\Users\Przemek\Documents\pivot from db.xls"
    If IsFileAlreadyOpen(t) Then
        MsgBox t &amp; " is already Open" &amp; vbCrLf &amp; "By " &amp; LastUser(t), vbInformation, "File in Use"
    Else
        MsgBox "File is NOT open", vbInformation
    End If
End Sub&lt;/pre&gt;Trzeba zaznaczyć że funkcje są zadeklarowane jako prywatne i nie będą widoczne poza modułem w który zostały wklejone. Jeżeli ktoś chciał by je wykorzystać w innym miejscu konieczna może się okazać zmiana Private na Public.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-5073262470259730014?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6lVX4DLMtzgsP_z3R6LPtO_kUbs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6lVX4DLMtzgsP_z3R6LPtO_kUbs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6lVX4DLMtzgsP_z3R6LPtO_kUbs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6lVX4DLMtzgsP_z3R6LPtO_kUbs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/uEHv5h8lILE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/5073262470259730014/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/08/sprawdzenie-czy-plik-jest-otwarty-przez.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/5073262470259730014?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/5073262470259730014?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/uEHv5h8lILE/sprawdzenie-czy-plik-jest-otwarty-przez.html" title="Sprawdzenie czy plik jest otwarty przez inny program" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/08/sprawdzenie-czy-plik-jest-otwarty-przez.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcMQng6cSp7ImA9Wx5RGUk.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-1493215470191358018</id><published>2010-08-26T20:12:00.004+02:00</published><updated>2010-08-27T23:54:43.619+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-27T23:54:43.619+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="MSSQL" /><title>MSSQL i polskie nazwy miesięcy i dni tygodnia</title><content type="html">W MSSQL-u w bardzo prosty sposób można uzyskać poprawną polską nazwę miesiąca. wystarczy tylko wykonać prostą instrukcję przed wykonaniem głównego zapytania. Chodzi o wymuszenie języka w jakim będą prezentowane dane przez MSSQL. robimy to tak:&lt;br /&gt;
&lt;pre class="brush:sql"&gt;SET LANGUAGE Polish&lt;/pre&gt;Zaś wykorzystanie możemy zobaczyć tutaj:&lt;br /&gt;
&lt;pre class="brush:sql"&gt;select DATENAME (mm,GETDATE()) as [miesiąc], DATENAME (dw,GETDATE()) as [dzień]&lt;/pre&gt;Sprawdzenie aktualnego języka możemy za pomocą zmiennych systemowych &lt;span style="font-weight:bold;"&gt;@@language&lt;/span&gt; i &lt;span style="font-weight:bold;"&gt;@@langid&lt;/span&gt;.&lt;br /&gt;
&lt;pre class="brush:sql"&gt;SELECT @@language, @@langid&lt;/pre&gt;No i możemy również zmienić domyślny język dla loginu za pomocą menagment Studio: Security -&gt; Logins -&gt; Wybrany login , właściwości -&gt; General -&gt; Default Language.&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Om2Kdnd1Ulo/THasVWVcwpI/AAAAAAAAAnw/u2SL4PWOM68/s1600/zmiana_j%C4%99zyka.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 287px;" src="http://2.bp.blogspot.com/_Om2Kdnd1Ulo/THasVWVcwpI/AAAAAAAAAnw/u2SL4PWOM68/s320/zmiana_j%C4%99zyka.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5509780676907156114" /&gt;&lt;/a&gt;&lt;br /&gt;
Lub za pomocą T-SQL-a&lt;br /&gt;
&lt;pre class="brush:sql"&gt;ALTER LOGIN sa WITH DEFAULT_LANGUAGE = Polish;&lt;/pre&gt;Pełną informację o dostępnych językach uzyskamy zaś po wykonaniu komendy:&lt;br /&gt;
&lt;pre class="brush:sql"&gt;select * from sys.syslanguages&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-1493215470191358018?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/039nKS8vXHd1kx139Jr-eBsCfog/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/039nKS8vXHd1kx139Jr-eBsCfog/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/039nKS8vXHd1kx139Jr-eBsCfog/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/039nKS8vXHd1kx139Jr-eBsCfog/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/PEsjF4fHZuE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/1493215470191358018/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/08/mssql-i-polskie-nazwy-miesiecy-i-dni.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1493215470191358018?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/1493215470191358018?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/PEsjF4fHZuE/mssql-i-polskie-nazwy-miesiecy-i-dni.html" title="MSSQL i polskie nazwy miesięcy i dni tygodnia" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Om2Kdnd1Ulo/THasVWVcwpI/AAAAAAAAAnw/u2SL4PWOM68/s72-c/zmiana_j%C4%99zyka.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/08/mssql-i-polskie-nazwy-miesiecy-i-dni.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8HQH09fCp7ImA9Wx5SFkQ.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-8397672835118485437</id><published>2010-08-13T11:12:00.001+02:00</published><updated>2010-08-13T11:13:51.364+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-13T11:13:51.364+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="MSSQL" /><title>Now Available: SQL Server Migration Assistant for MySQL! - Brian Swan - Site Home - MSDN Blogs</title><content type="html">&lt;a href="http://blogs.msdn.com/b/brian_swan/archive/2010/08/12/now-available-sql-server-migration-assistant-for-mysql.aspx"&gt;Now Available: SQL Server Migration Assistant for MySQL! - Brian Swan - Site Home - MSDN Blogs&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Bardzo ciekawe narzędzie służące do migrowania bazy danych MySQL do MSSQL-a. Dzięki temu kreatorowi można wykonać to zadanie w miarę szybko i bezboleśnie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-8397672835118485437?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZDZYP_KWPdmdUjRv4jwZwi2DN3Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZDZYP_KWPdmdUjRv4jwZwi2DN3Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZDZYP_KWPdmdUjRv4jwZwi2DN3Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZDZYP_KWPdmdUjRv4jwZwi2DN3Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/XIBWEuA2VUQ" height="1" width="1"/&gt;</content><link rel="related" href="http://blogs.msdn.com/b/brian_swan/archive/2010/08/12/now-available-sql-server-migration-assistant-for-mysql.aspx" title="Now Available: SQL Server Migration Assistant for MySQL! - Brian Swan - Site Home - MSDN Blogs" /><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/8397672835118485437/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/08/now-available-sql-server-migration.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/8397672835118485437?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/8397672835118485437?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/XIBWEuA2VUQ/now-available-sql-server-migration.html" title="Now Available: SQL Server Migration Assistant for MySQL! - Brian Swan - Site Home - MSDN Blogs" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/08/now-available-sql-server-migration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ESXk9cCp7ImA9Wx5SFkQ.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-2531267589049995571</id><published>2010-08-09T07:51:00.001+02:00</published><updated>2010-08-13T11:13:28.768+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-13T11:13:28.768+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Coding Horror: A Visual Explanation of SQL Joins</title><content type="html">&lt;a href="http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html"&gt;Coding Horror: A Visual Explanation of SQL Joins&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Bardzo proste wyjaśnienie istoty Joinów w SQL-u&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-2531267589049995571?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uWS5Fft4DRPTDPFn17zTrbTa4OI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uWS5Fft4DRPTDPFn17zTrbTa4OI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uWS5Fft4DRPTDPFn17zTrbTa4OI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uWS5Fft4DRPTDPFn17zTrbTa4OI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/mGUL8O1LMZ4" height="1" width="1"/&gt;</content><link rel="related" href="http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html" title="Coding Horror: A Visual Explanation of SQL Joins" /><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/2531267589049995571/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/08/coding-horror-visual-explanation-of-sql.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2531267589049995571?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2531267589049995571?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/mGUL8O1LMZ4/coding-horror-visual-explanation-of-sql.html" title="Coding Horror: A Visual Explanation of SQL Joins" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/08/coding-horror-visual-explanation-of-sql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIBRX8yeyp7ImA9WxFaFEg.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-4667781014864702648</id><published>2010-07-18T14:50:00.002+02:00</published><updated>2010-07-18T14:52:34.193+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-18T14:52:34.193+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cmd.exe" /><category scheme="http://www.blogger.com/atom/ns#" term="wget" /><title>Wykorzystanie wget.exe do pobierania danych raportowych</title><content type="html">&lt;a href="http://vbamania.blogspot.com/2010/07/logowanie-do-formularza-web.html"&gt;W poprzednim poście&lt;/a&gt; pisałem o możliwości pobrania danych ze strony która wymaga logowania za pomocą loginu i hasła wpisywanego do formularza. Rozwiązanie bazowało na kodzie w VBA, co w pewnych sytuacjach jest nieco kłopotliwe do wykorzystania.&lt;br /&gt;
&lt;br /&gt;
Dziś chciał bym przedstawić rozwiązanie bazujące na narzędziu &lt;b&gt;wget.exe&lt;/b&gt; dostępnego dla platformy *nix jaki Windows. Narzędzie dla Windows jest do pobraniu np.  &lt;a href="http://gnuwin32.sourceforge.net/packages/wget.htm"&gt;tu&lt;/a&gt;. Narzędzie to nie wymaga instalowania, wystarczy że skopujemy plik &lt;b&gt;wget.exe&lt;/b&gt; do jakiegoś katalogu.&lt;br /&gt;
&lt;br /&gt;
Metoda jaką się posłużymy wymaga posiadania wiedzy o tym co jest przesyłane do strony z której chcemy coś pobrać. Przeglądarki webowe komunikują się z serwerami za pomocą komunikatów tekstowych które możemy podejrzeć za pomocą odpowiedniego narzędzia. Jednym z takich narzędzi może być rozszerzenie do przeglądarki&amp;nbsp;Firefox: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3829/"&gt;LiveHeader&lt;/a&gt;. Rozszerzenie to pokazuje pełną komunikację między przeglądarką a serwerem na poziomie nagłówków. Dzięki temu można podejrzeć co jest wysyłane do serwera WWW np. po naciśnięciu guzika wyślij lub loguj. Dla przykładu to co zaobserwujemy po&amp;nbsp;kliknięciu&amp;nbsp;Loguj w przeglądarce:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Om2Kdnd1Ulo/TELy8ReexfI/AAAAAAAAAm8/t8krw_6QSss/s1600/01.png" imageanchor="1"&gt;&lt;img border="0" height="239" src="http://3.bp.blogspot.com/_Om2Kdnd1Ulo/TELy8ReexfI/AAAAAAAAAm8/t8krw_6QSss/s320/01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Na tym rysunku widzimy adres strony jaką wywołaliśmy po&amp;nbsp;wyciśnięciu Loguj&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Om2Kdnd1Ulo/TELy8hXKoGI/AAAAAAAAAnA/vnNRKnWdr0s/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/_Om2Kdnd1Ulo/TELy8hXKoGI/AAAAAAAAAnA/vnNRKnWdr0s/s320/02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;A tu widzimy jaki nagłówek został przesłany do serwera.&lt;/div&gt;&lt;br /&gt;
Uzbrojeni w takie informacje możemy wykorzystać pewne specyficzne mechanizmy narzędzia wget.exe do zalogowania a następnie do pobrania raportu.&lt;br /&gt;
&lt;br /&gt;
Przykładowy skrypt takiej znajdujący się np. w pliku &lt;b&gt;webget.cmd&lt;/b&gt; to:&lt;br /&gt;
&lt;pre class="brush:plain"&gt;@ECHO OFF
wget --save-cookies cookies.txt --post-data "login=janek&amp;amp;password=123456789" -q "http://localhost/index.php?k=auth&amp;amp;a=auth&amp;amp;target="
wget --load-cookies cookies.txt --post-data "filtr_1=201006&amp;amp;filtr_2=844&amp;amp;sekcja=b&amp;amp;raport_n=compl&amp;amp;=undefined" --output-document=raport.csv -q "http://localhost/?k=raporty&amp;amp;a=GetReport&amp;amp;content=xls"
&lt;/pre&gt;&lt;br /&gt;
Wyjaśnienia mogą wymagać poszczególne opcje jakie zostały użyte podczas takiej operacji:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;--save-cookies cookies.txt - zapisuje wszystkie informacje pobrane podczas logowania do pliku&lt;/li&gt;
&lt;li&gt;--post-data "dane=vos" - wysyła dane do serwera udając formularz. Dane które są w przykładzie pochodziły z rysunku 2&lt;/li&gt;
&lt;li&gt;-q - wget.exe działa w trybie cichym, to znaczy że nie będzie wyświetlał wszystkich komunikatów&lt;/li&gt;
&lt;li&gt;"http://strona/" - adres URL strony którą pobieramy&lt;/li&gt;
&lt;li&gt;--load-cookies cookies.txt - pobieramy informacje o logowaniu z wcześniej przygotowanego pliku&lt;/li&gt;
&lt;li&gt;--output-document=raport.csv - zapisujemy wynik w pliku o konkretnej nazwie&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Proszę zauważyć że zarówno dane dla --post-data jaki zam adres URL znajdują się między znakami " " - jest to konieczne do prawidłowego działania skryptu&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-4667781014864702648?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xelwGSzcc48Tx6EArwT39226R0I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xelwGSzcc48Tx6EArwT39226R0I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xelwGSzcc48Tx6EArwT39226R0I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xelwGSzcc48Tx6EArwT39226R0I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/rU4MNQC6GA4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/4667781014864702648/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/07/wykorzystanie-wgetexe-do-pobierania.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/4667781014864702648?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/4667781014864702648?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/rU4MNQC6GA4/wykorzystanie-wgetexe-do-pobierania.html" title="Wykorzystanie wget.exe do pobierania danych raportowych" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_Om2Kdnd1Ulo/TELy8ReexfI/AAAAAAAAAm8/t8krw_6QSss/s72-c/01.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/07/wykorzystanie-wgetexe-do-pobierania.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIARX8_fCp7ImA9WxFaE0Q.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-2146326807146819698</id><published>2010-07-17T20:24:00.005+02:00</published><updated>2010-07-17T20:49:04.144+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-17T20:49:04.144+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Access" /><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="ICONV" /><title>Szybkie przekodowanie pliku teksowego</title><content type="html">Częstą zmorą podczas pracy z plikami jest ich kodowanie. Czasem można sobie poradzić ręcznie jakimś prostym narzędziem np. &lt;b&gt;Notepad++&lt;/b&gt;, czasem importujemy plik do Access-a i eksportujemy w żądanym kodowaniu. Te metody się sprawdzają do momentu gdy nie zderzymy się z plikiem wielkości ~1GB. Cóż można wtedy zrobić? Ano skorzystać z dobrodziejstw darmowego narzędzia ICONV dla platformy &lt;b&gt;Win32&lt;/b&gt; czyli Windowsa.&lt;br /&gt;
Pierwotnie narzędzie to było dostępne dla systemów rodziny *nix, lecz w chwili obecnej możemy się cieszyć że jest dostępne też dla nas szarych użytkowników okieek.&lt;br /&gt;
&lt;br /&gt;
Pliki wykonywalne Iconv można ściągnąć z adresu: &lt;a href="http://gnuwin32.sourceforge.net/packages/libiconv.htm"&gt;http://gnuwin32.sourceforge.net/packages/libiconv.htm&lt;/a&gt;. Do wyboru mamy paczkę zip lub instalator exe. W zależności od wyboru ściągamy żądany plik i wypakowywujemy lub instalujemy.&lt;br /&gt;
&lt;br /&gt;
Załóżmy że plik iconw.exe znajduje się w katalogu: c:\dekoder\, zaś pliki do dekodowania znajdują się w katalogu d:\pliki\. To jak wykorzystać to narzędzie do tego żeby przekodować nasze pliki np. ze strony kodowej UTF-8 do CP1250 (Strona kodowa Windows). Należy wykonać polecenie z wiersza poleceń:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:plain"&gt;c:\dekoder\iconv.exe -f UTF-8 -t CP1250 d:\pliki\plik.txt &gt; d:\pliki\plik.cp1250.txt&lt;/pre&gt;&lt;br /&gt;
Konstrukcja taka to proste wykonanie instrukcji iconv z przekierowaniem strumienia "&gt;" do nowego pliku. Jest niezwykle wydajna i na średniej klasy sprzęcie przekodowanie pliku o wielkości setek megabajtów zajmuje tylko kilkanaście sekund.&lt;br /&gt;
&lt;br /&gt;
Lista dostępnych stron kodowych jest dostępna po wykonaniu polecenia:&lt;br /&gt;
&lt;pre class="brush:plain"&gt;c:\dekoder\iconv.exe -l &lt;/pre&gt;&lt;br /&gt;
Jednym z ciekawszych zastosowań takiej metody jest przekodowanie pliku przed importem do MSSQl-a. Jest to konieczne gdyż MSSQL nie wspiera tak jakbyśmy chcieli. Cóż można zrobić? ano można użyć procedury systemowej &lt;b&gt;xp_cmdshell&lt;/b&gt; to przekonwertorownia pliku.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql"&gt;declare @cmd varchar(2000)
set @cmd = 'c:\dekoder\iconv.exe -f UTF-8 -t CP1250 d:\pliki\plik.txt &gt; d:\pliki\plik_cp1250.txt'
exec xp_cmdshell @cmd
&lt;/pre&gt;&lt;br /&gt;
Jeżeli nie będziemy mieli aktywnej procedury &lt;b&gt;xp_cmdshell&lt;/b&gt; możemy ją włączyć w następujący sposób:&lt;br /&gt;
&lt;pre class="brush:sql"&gt;EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-2146326807146819698?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IP-aJ1IqtbvyU88h7YiqnN1bcBE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IP-aJ1IqtbvyU88h7YiqnN1bcBE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IP-aJ1IqtbvyU88h7YiqnN1bcBE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IP-aJ1IqtbvyU88h7YiqnN1bcBE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/xn-A_e_bwpY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/2146326807146819698/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/07/szybkie-przekodowanie-pliku-teksowego.html#comment-form" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2146326807146819698?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/2146326807146819698?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/xn-A_e_bwpY/szybkie-przekodowanie-pliku-teksowego.html" title="Szybkie przekodowanie pliku teksowego" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/07/szybkie-przekodowanie-pliku-teksowego.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ACR3kzcSp7ImA9WxFbEUU.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-6740775262754907650</id><published>2010-07-03T22:42:00.000+02:00</published><updated>2010-07-03T22:42:46.789+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-03T22:42:46.789+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VBA" /><title>Konwertowanie UTF-8 do Unicode w VBA</title><content type="html">Kiedyś znalazłem kod do konwertowania tekstu w UTF-8 do Unicode. Przydaje się to czasem podczas przetwarzania danych ze stron web.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:vb"&gt;Private Const CP_UTF8 = 65001

Private Declare Function MultiByteToWideChar Lib "kernel32" ( _
                                             ByVal CodePage As Long, ByVal dwFlags As Long, _
                                             ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, _
                                             ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long

Public Function sUTF8ToUni(bySrc() As Byte) As String
' Converts a UTF-8 byte array to a Unicode string
    Dim lBytes As Long, lNC As Long, lRet As Long

    lBytes = UBound(bySrc) - LBound(bySrc) + 1
    lNC = lBytes
    sUTF8ToUni = String$(lNC, Chr(0))
    lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC)
    sUTF8ToUni = Left$(sUTF8ToUni, lRet)
End Function&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-6740775262754907650?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3QZW0C2yUeEvolUX7A89O9YPOBM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3QZW0C2yUeEvolUX7A89O9YPOBM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3QZW0C2yUeEvolUX7A89O9YPOBM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3QZW0C2yUeEvolUX7A89O9YPOBM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/JlV2-y81p-w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/6740775262754907650/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/07/konwertowanie-utf-8-do-unicode-w-vba.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/6740775262754907650?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/6740775262754907650?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/JlV2-y81p-w/konwertowanie-utf-8-do-unicode-w-vba.html" title="Konwertowanie UTF-8 do Unicode w VBA" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/07/konwertowanie-utf-8-do-unicode-w-vba.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIER3gzeCp7ImA9WxFbEUg.&quot;"><id>tag:blogger.com,1999:blog-1257796280950692886.post-4284846869247378511</id><published>2010-07-03T13:23:00.001+02:00</published><updated>2010-07-03T13:28:26.680+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-03T13:28:26.680+02:00</app:edited><title>Logowanie do formularza web</title><content type="html">Dziś zaprezentuję metodę logowani się do stron internetowych/intranetowych zabezpieczonych formularzem logowania. Jest to w zasadzie standardowy sposób zabezpieczania aplikacji przed nieautoryzowanym dostępem. O ile jest to dobre z punktu widzenia security, to z punktu widzenia usera który musi klikać w ileś tam formularzy dziennie jest to droga przez mękę.&lt;br /&gt;
&lt;br /&gt;
Dlatego proponuję ułatwić sobie życie za pomocą poniższego zestawu:&lt;br /&gt;
&lt;pre class="brush:vb"&gt;Function httpSessionRequest(theStep, method, url, data, cookie, viewState)

    Dim HTTPReferrer As String
    Dim postVars As String
    Dim XMLHTTP As Object
    Dim strHeaders As String
    Dim hArr() As String
    Dim kk As Long
    Dim theCookie As String
    Dim mycookie As String


    If Len(cookie) = 0 Then cookie = "dummy=dummy;"
    HTTPReferrer = Trim(url)
    postVars = Trim(data)

    Set XMLHTTP = CreateObject("MSXML2.serverXMLHttp")
    XMLHTTP.Open method, Trim(url), False

    If UCase(method) = "POST" Then
        XMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    End If
    
    XMLHTTP.setRequestHeader "Referer", HTTPReferrer    'just in case the server cares
    XMLHTTP.setRequestHeader "Cookie", "excuse the Microsoft bug"
    XMLHTTP.setRequestHeader "Cookie", cookie

    XMLHTTP.send postVars

    'wait for response
    While XMLHTTP.readyState &amp;lt;&amp;gt; 4
        XMLHTTP.waitForResponse 1000
    Wend
    strHeaders = XMLHTTP.getAllResponseHeaders()

    hArr = Split(strHeaders, "Set-Cookie: ")
    For kk = 1 To UBound(hArr)
        theCookie = Left(hArr(kk), InStr(hArr(kk), "path=/") - 2)
        mycookie = mycookie &amp;amp; " " &amp;amp; theCookie
    Next

    If Len(mycookie) = 0 Then mycookie = cookie

    Select Case CInt(theStep)
        Case 1
            httpSessionRequest = mycookie
        Case 2
            httpSessionRequest = XMLHTTP.responsetext
        Case 3
            httpSessionRequest = XMLHTTP.responseStream
        Case 4
            httpSessionRequest = XMLHTTP.responseBody
        Case 5
            httpSessionRequest = XMLHTTP.responseXML
        Case 6
            httpSessionRequest = XMLHTTP
        Case Else
            httpSessionRequest = XMLHTTP.responsetext
    End Select

    Set XMLHTTP = Nothing
End Function

Public Function URLEncode( _
   StringVal As String, _
   Optional SpaceAsPlus As Boolean = False _
) As String

  Dim StringLen As Long: StringLen = Len(StringVal)

  If StringLen &amp;gt; 0 Then
    ReDim result(StringLen) As String
    Dim i As Long, CharCode As Integer
    Dim Char As String, Space As String

    If SpaceAsPlus Then Space = "+" Else Space = "%20"

    For i = 1 To StringLen
      Char = Mid$(StringVal, i, 1)
      CharCode = Asc(Char)
      Select Case CharCode
        Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
          result(i) = Char
        Case 32
          result(i) = Space
        Case 0 To 15
          result(i) = "%0" &amp;amp; Hex(CharCode)
        Case Else
          result(i) = "%" &amp;amp; Hex(CharCode)
      End Select
    Next i
    URLEncode = Join(result, "")
  End If
End Function

Function WriteStream(file As String, body)
    Dim oStream As Object
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write body
    oStream.SaveToFile "D:\header_.gif"
    oStream.Close
    Set oStream = Nothing
End Function

Sub test()

    Dim Filename As String
    Dim baseURL As String, url1 As String, url2 As String, url3 As String
    Dim Data1 As String
    Dim nodata As String, noCookie As String, noViewState As String
    Dim theCookie As String
    Dim finalHTML As String
    Dim bytes() As Byte

    baseURL = "http://192.168.1.103/"    'This is to fix any broken images in the output.

    url1 = baseURL &amp;amp; "index.php" ' strona służąca do pobrania sesji
    url2 = baseURL &amp;amp; "?k=auth&amp;amp;a=auth&amp;amp;target=" ' strona logowania
    url3 = baseURL &amp;amp; "static/images/header.gif" ' strona

    Data1 = "login=rachwprz&amp;amp;password=thepass"

    theCookie = httpSessionRequest(1, "GET", baseURL, nodata, noCookie, noViewState)
    finalHTML = httpSessionRequest(2, "POST", url2, Data1, theCookie, noViewState)
    
    bytes = httpSessionRequest(4, "POST", url3, Data1, theCookie, noViewState)

    Filename = "D:\header_.gif"
    
    If Dir(Filename) &amp;lt;&amp;gt; "" Then Kill (Filename)

    WriteStream Filename, bytes

    
End Sub&lt;/pre&gt;&lt;br /&gt;
Dla wyjaśnienia dodam tylko:&lt;br /&gt;
funkcja &lt;b&gt;httpSessionRequest&lt;/b&gt; - jest uniwersalną metodą logowania i pobierania danych ze strony web za. W zależności od parametru &lt;b&gt;theStep&lt;/b&gt; uzyskamy pożądany efekt. Przykładem może być pobranie wartości binarnej a następnie zapisanie jest za pomocą &lt;b&gt;WriteStream&lt;/b&gt;&lt;br /&gt;
parametry przekazywane za pomocą metody &lt;b&gt;POST&lt;/b&gt; nie muszą być traktowane funkcją &lt;b&gt;URLEncode&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257796280950692886-4284846869247378511?l=vbamania.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2_bNiOkfdG9enatAsgs-NzVVrg0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2_bNiOkfdG9enatAsgs-NzVVrg0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2_bNiOkfdG9enatAsgs-NzVVrg0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2_bNiOkfdG9enatAsgs-NzVVrg0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/jLbkt/~4/61nFzet_EZU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vbamania.blogspot.com/feeds/4284846869247378511/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://vbamania.blogspot.com/2010/07/logowanie-do-formularza-web.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/4284846869247378511?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1257796280950692886/posts/default/4284846869247378511?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/jLbkt/~3/61nFzet_EZU/logowanie-do-formularza-web.html" title="Logowanie do formularza web" /><author><name>Przemysław Rachwał</name><uri>https://profiles.google.com/111533420077668774596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vbamania.blogspot.com/2010/07/logowanie-do-formularza-web.html</feedburner:origLink></entry></feed>

