Tõmbame voolu tarbimist koomale

Windows 7 ja Windows Server 2008 R2 operatisoonisüsteemidega tuleb kaasa tore programm, mis jagab soovitusi ja annab teada, kust on arvuti voolutarbimise pealt võimalik kokku hoida. Selleks tuleb administraatorina käivitada käsurida nagu pildil(Pilt 1) näha on ja sisestada sinna käsk.

powercfg /energy

Pilt 1. Käivita käsurida administraatorina

Tulemuseks on c:\windows\system32\ asuv fail energy-report.html, mis tuleb avamiseks Desktopile kopeerida.

Pilt 2. energy-report.html

Minu meelest on tegemist päris kasuliku tööriistaga.

Exceli makro abil valitud lahtrite sisu andmebaasi saatmine

Hiljuti tekkis mul vajadus võtta Excelist andmed ja sisestada need andmebaasi. Lihtne oleks see asi olnud siis kui kõik Exceli failides olevad andmed oleksid ühessuguse asetusega sest siis saaksin kasutada SQL Serveri importimise tööriista. Kuna minul olid väärtused laiali erinevates tulpades ja erinevates ridades tuli midagi kavalamat väljamõelda.

Esimene samm…

Excelist andmebaasile ligipääsemiseks on vaja luua andmebaasi ühendus ja VbScript’is käib see järgnevalt:

Sub Andmebaasi ()
    '--Andmebaasi ühenduse objekt--'
    Set oConn = CreateObject("ADODB.Connection")

    '--Andmebaasi ühenduse connection string--'
    sConnectionString = "Provider=SQLOLEDB.1;Data Source=SERVER\ANDMEBAASIMOOTOR;Initial Catalog=TEST"

    '--Loome andmebaasi ühenduse--'
    oConn.Open sConnectionString, "kasutajanimi", "parool"

    '--Lihtne käsklus--'
    oConn.Execute "INSERT INTO TestTabel (tulp1,tulp2) VALUES ('Esimene','Teine')"

   '--Sulgeme ühenduse--'
   oConn.Close
   Set oConn = Nothing

End Sub

Olulised punktid

  • Rida 6 kus me määrame, millise andmebaasiga ühenduda. Näiteks masinas nimega TEST kus on SQL Server 2008 Express installeeritud on Data Source väärtuseks “TEST\sqlexpress”. Samamoodi on oluline valida õieti Initial Catalog, mis määrab andmebaasi nime kuhu soovitakse ühenduda s.t hetkel TEST
  • Rida 9 et õieti saaksid märgitud andmebaasiga ühendumiseks vajalikud kasutajanimi ja parool

Teine samm …

Valitud teksti andmebaasi lisamiseks võib käituda mitut moodi, aga mina otsutstasin selle kasuks, et lasen skriptil For tsükkli abil oma valikutest iga rea kohta insert lause teha.

Pilt 1 - Excel data

Ülaltoodud pildil on näidisandmed ja sealt on mul vaja sisestada andmebaasi kas Tulp1-Tulp2 andmed või Tulp1-Tulp3 andmed nagu toodud Piltidel 2 ja 3

Pilt 2. - Valikuvõimalus 1

Pilt 2 - Valikuvõimalus 2

Selleks, et vajalikud andmed kätte saada kirjutasin järgmised read

'--Insert lause algus--'
sInsertValues = "Insert into TestTabel(Number1,Number2) values "

If Selection.Areas.Count Mod 2 = 0 Then '--Kui valikualasi on rohkem kui üks ja need on paaris--'
    '--Käib läbi kõikide valikualade paaride--'
    For j = 1 To Selection.Areas.Count Step 2
         '--Käib läbi kõikide valikualade paaride väärtuste ja loob insert lause ning saadab selle andmebaasi---'
         For i = 1 To Selection.Areas(j).Cells.Count
              oConn.Execute = sInsertValues & "('" & Selection.Areas(j).Cells(i).Value & "','" & Selection.Areas(j + 1).Cells(i).Value & "')"
         Next
    Next
ElseIf Selection.Areas.Count > 1 Then
    MsgBox "Wrong relations count"
Else
    '--Kui tegemist on kõrvuti asetsevate tulpadega mis on ühes valikualas--'
    For Each codeRow In Selection.Rows
        oConn.Execute = sInsertValues & "('" & codeRow.Columns(1).Value & "','" & codeRow.Columns(2).Value & "')"
    Next
End If

Selles koodis toimub küll palju segast, aga põhimõtteliselt on nii, et Exceli valikuala/d saab kätte Selection attribuudi alt. Kui on valitud mitte kõrvuti asuvad read või tulbad siis tuleb kasutada Areas atribuuti, mis võimaldab erinevatel valikualadel vahet teha.

Olulised punktid

  • Antud koodi miinuseks on see, et kui näiteks Pilt 1 toodul andmetest valida väärtused A2 ja A4 ning siis B2 ja B4 ei pane ta kokku mitte A2 ja B2 vaid A2 ja A4, sest valimise järjekord on siin oluline.

Kolmas samm…

Paneme loodud koodijupid kokku.

Sub Andmebaasi ()
    '--Andmebaasi ühenduse objekt--'
    Set oConn = CreateObject("ADODB.Connection")

    '--Andmebaasi ühenduse connection string--'
    sConnectionString = "Provider=SQLOLEDB.1;Data Source=SERVER\ANDMEBAASIMOOTOR;Initial Catalog=TEST"

    '--Loome andmebaasi ühenduse--'
    oConn.Open sConnectionString, "kasutajanimi", "parool"

    '--Insert lause algus--'
    sInsertValues = "Insert into TestTabel(Number1,Number2) values "

    If Selection.Areas.Count Mod 2 = 0 Then '--Kui valikualasi on rohkem kui üks ja need on paaris--'
        '--Käib läbi kõikide valikualade paaride--'
        For j = 1 To Selection.Areas.Count Step 2
            '--Käib läbi kõikide valikualade paaride väärtuste ja loob insert lause ning saadab selle andmebaasi---'
            For i = 1 To Selection.Areas(j).Cells.Count
                oConn.Execute = sInsertValues & "('" & Selection.Areas(j).Cells(i).Value & "','" & Selection.Areas(j + 1).Cells(i).Value & "')"
            Next
        Next
    ElseIf Selection.Areas.Count > 1 Then
        MsgBox "Wrong relations count"
    Else
        '--Kui tegemist on kõrvuti asetsevate tulpadega mis on ühes valikualas--'
        For Each codeRow In Selection.Rows
            oConn.Execute = sInsertValues & "('" & codeRow.Columns(1).Value & "','" & codeRow.Columns(2).Value & "')"
        Next
    End If

    '--Sulgeme ühenduse--'
    oConn.Close
    Set oConn = Nothing

End Sub

Sedasi sain mina omad asjad tehtud …

Põnev SQL Server 2008 käsk

SQL Server 2008 tõi endaga kaasa süntaksi muudatuse, mille abil on oluliselt lihtsam sisestada tabelisse mitu rida korraga;

Vanasti käis see nii;

USE YourDB
GO

INSERT INTO MyTable (FirstCol, SecondCol) 
VALUES ('First',1);
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('Second',2);
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('Third',3);
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('Fourth',4);
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('Fifth',5);

GO

Või nii:

USE YourDB
GO

INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5

GO

Uue käsu abil on süntaks lühem ja minumeelest ka üsna lihtsalt arusaadav:

USE YourDB
GO

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)

GO

Hyper-V virtuaalmasinasse bootimine

Üks põhilisi omadusi, mis ajendas mind Hyper-V lahendust proovima on Windows 7 ja Windows Server 2008 R2 võime bootida VHD failist js see, et sama failiformaati kasutab ka Hyper-V. Bootimine VHD faili muudab kõvaketta operatsioone küll mõnevõrra aeglasemaks, fikseeritud suurusega failide puhul ca 5% ning dünaamiliselt suurust muutvate failide puhul veidi rohkem, kuid reaalses elus seda ei märka. Seevastu hiljem arvutile puhta Windowsi peale panek on aga oluliselt lihtsam ning backupi tegemine, mis on lihtsalt VHD ümberkopeerimise vaev.

Hyper-V virtuaalmasin “pärismasinaks”

Mina alustasin nii, et lõin uue virtuaalmasina nimega “Clean” installisin sinna peale kõik uuendused ning panin masina kinni. Kopeerisin loodud .vhd faili uude asukohta ning lõin uue virtuaalmasina nimega “Development”, kuhu peale installisin Visual Studio 2010, SQL Server Express 2008 R2, Office 2010, Expression Studio 4.0 ning kõik teised vajalikud programmid. Aega kulus sellepeale tund, kuid tulemusena on mul olemas kaks virtuaalmasinat üks täiesti puhata installiga ning teine igati sobilik arendustegevuseks.

Installatsioon
Bootiva süsteemi ülesseadmiseks teen kõigepealt Copy-Paste ja loon koopia “Development’” masina VHD failist.

Seejärel loon uue virtuaalmasina ja sean selle kõvakettaks kopeeritud D:\Boot.vhd faili.

Virtuaalmasina ülesseadmine bootivaks masinaks

Käivitan virtuaalmasina ning sealt andministraatorina käsurea ning sisestan järgmised read.

  • cd /
  • cd Windows\system32\sysprep
  • sysprep /oobe /generalize /shutdown


Peale käskude täitmise lõppemist lülitab virtuaalmasin ennast välja, ning on valmis riistvara draivereid installima.

Bootimise menüüsse kirje lisamine

Põhimasinas tuleb andministraatorina käivitada käsurida ning sinna sisestada.

  • bcdedit /copy {current} /d “Uus boot”
  • bcdedit /set {guid} device vhd=[D:]\Boot.vhd
  • bcdedit /set {guid} osdevice vhd=[D:]\Boot.vhd
  • bcdedit /set detecthal on

Esimene käsk kopeerib hetke installatsiooni boodi kirje uude kirjesse nimege “Uus boot” ning tagastab unikaalse identifikaatori GUID, mida tuleb järgnevates käskudes kasutada õige VHD fail seadmiseks. Minu puhul siis D:\Boot.vhd fail.

Peale käskude sisestamist on uus masin põhimõtteliselt ülesseatud. Arvutile restarti tehes leiame bootimise menüüst valiku “Uus boot” ning peale riistvara ülesseadmist on meil olemas Windowsi operatsioonisüsteem, kus on kõik vajalikud programmid juba installitud.

WPF DataGrid 2 – Lahtri teksti kopeerimine

Täna puutusin kokku DataGrid kontrolliga ja pidin uurima kuidas saaks kopeerida lahtrite väärtusi Ctrl-C klahvikombinatsiooni abil.Tuli välja, et selleks peab elemendil seadma kolm atribuuti.

  • SelectionUnit=”Cell” – ühe lahtri kaupa valmine.
  • SelectionMode=”Extended” – Võmaldab valida mitut lahtrit
  • ClipboardCopyMode=”ExcludeHeader” – ei lisa tekstile veeru nime
...
<DataGrid Name="dG" SelectionUnit="Cell" SelectionMode="Extended" ClipboardCopyMode="ExcludeHeader">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridHyperlinkColumn Header="Link" Binding="{Binding FullName}">
            <DataGridHyperlinkColumn.ElementStyle>
                <Style TargetType="TextBlock">
                    <EventSetter Event="Hyperlink.RequestNavigate" Handler="Request" />
                </Style>
            </DataGridHyperlinkColumn.ElementStyle>
       </DataGridHyperlinkColumn>
   </DataGrid.Columns>
</DataGrid>
...

Tulemus on näha alltoodud piltidel.

DataGrid - Kopeerimine


Datagrid - Copy-Paste Excelisse


Ja nii saabki DataGridist teksti mujale kopeerida.

WPF DataGrid 1 – Lingi kuvamine ja avamine

WPF DataGridis lingi kuvamine ei ole nii lihtne kui see võiks olla. Minu suureks imestuseks ei avane DataGridHyperlinkColumn‘l klikkides midagi.
Minu leitud lahendus sellele probleemile on toodud allpool.

Näide 1

<DataGrid Name="dG">
    <DataGrid.Columns>
        <DataGridHyperlinkColumn Header="Link" Binding="{Binding Link}">
            <DataGridHyperlinkColumn.ElementStyle>
                <Style TargetType="TextBlock">
                    <EventSetter Event="Hyperlink.RequestNavigate" Handler="Request"/>
                </Style>
             </DataGridHyperlinkColumn.ElementStyle>
        </DataGridHyperlinkColumn>
         ....
   <DataGrid.Columns>
</DataGrid>

Nagu näha tuleb DataGridHyperlinkColumn veerule lisada Style elemendi EventSetter‘i abil Hyperlink.RequestNavigate sündmus(Näide1 rida 06) ning selle kuular(Näide1 rida 07), et saaksime koodis käivitada protsessi(Näide 2, rida4), mis avaks lingi.

Näide 2

    ...
    private void Request(object sender, RequestNavigateEventArgs e)
    {
       Process.Start(new ProcessStartInfo(e.Uri.OriginalString));
    }
    ...

Process.Start() meetod selgitab ise välja millega antud linki avada. Veebiaadressi korral avatakse vaikebrauser, .xls faili puhul Excel.

Hyper-V error ja lahendus

Proovisin täna oma kodusel arvutil(Windows Server 2008 R2) Hyper-V tööle saada, ja kõik läks hästi. Kuid peale uue virtuaalmasina loomist selgus, et see ei taha kohe mitte töötada.

Hyper-V error

Peale Hyper-V uuesti installimise ja restartimise ning pooletunnise otsimise erinevate Google tulemuste seast leidsin lõpuks lahenduse. Piisab ainult oma tulemüüris lubada sissetulev TCP port 2179

Follow

Get every new post delivered to your Inbox.