středa 23. prosince 2015

MS SQL - odstranění konce řádku ve stringovém sloupci

SELECT 
      REPLACE(REPLACE([url], CHAR(13), ''), CHAR(10), '')
  FROM [dbo].[adresar]

Poznámka
Tento postup ale nelze použít na sloupce typu text. (Argument data type text is invalid for argument 1 of replace function.)

Zdroj:
http://stackoverflow.com/questions/951518/replace-a-newline-in-tsql

úterý 22. prosince 2015

Jaký je rozdíl mezi voláním
    
                this.ConfigureClient(this.Client, this.token);
                try
                {
                    var task = await this.Client.PostAsJsonAsync(WebApiQuery.SyncAddressBook, new AddressBookXmlSync() { XmlXontent = addressBookXml });
                }
                catch (AggregateException ex)
                {
                    Console.WriteLine(ex);
                }

a tímto způsobem ?
                
                this.ConfigureClient(this.Client, this.token);
                var task = this.Client.PostAsJsonAsync(WebApiQuery.SyncAddressBook, new AddressBookXmlSync() { XmlXontent = addressBookXml });
                task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);

                try
                {
                    task.Wait();
                    var result = task.Result;
                }
                catch (AggregateException ex)
                {
                    Console.WriteLine(ex);
                }

čtvrtek 17. prosince 2015

Stormware Pohoda a číslo objednávky

Použití konstrukce níže není správné.


<inv:numberOrder>
<typ:ids>123456</typ:ids>
</inv:numberOrder>



Stačit přidat pouze číslo objednávky, které může obsahovat i nečíselné znaky.
  
<inv:numberOrder>1500000004</inv:numberOrder>
nebo třeba
<inv:numberOrder>obj 2006010457</inv:numberOrder>


Inspirovat se můžete na stránce http://www.stormware.cz/xml/samples/version_2/import/Faktury/invoice_01_v2.0.xml kde jsou příklady některých XML faktur.
typ:ids se podle mě používá pro číselníkové hodnoty jako třeba středisko, činnos, předkontace atp. (hodnota musí být zadaná v databázi Pohody)

pátek 11. prosince 2015

Jak shodit Visual Studio 2013

pokud se Vám povede vyrobit nějaký takovýto atribut
public class ExceptionFilterAttribute : ExceptionFilterAttribute
Vznikne Vám takováto chyba
Circular base class dependency involving 
Pokud si jí ale nevšimnete a pokusíte se tento atribut přiřadit nad některou metodu, tak to vaše Visual Studio neustojí a padne na držku ;)

pátek 4. prosince 2015

c# Outlook Contact default value of birthday

Problém u kontaktu v Outlooku je, že jeho výchozí hodnota Narozenin je {1. 1. 4501 0:00:00} takové krásné číslo.

if (contactItem.Birthday == new DateTime(1420062624000000000))

Pokud se má kdekoli v Outlooku zobrazit nevyplněné datum (Nikdy) tak použijeme tuto konstantu:
new DateTime(1420062624000000000)
         
Checking if Outlook ContactItem has Birthday datahttp://stackoverflow.com/questions/1192564/checking-if-outlook-contactitem-has-birthday-data

Outlook Form Regions (.ofs)

Pro vytvoření Regionu můžete použít také designer, který je součástí Developer kitu pro Outlook. (Doporučuji)
Výhodou tohoto řešení je, že si na formulář nataháte políčka (což je možné i v designeru Visual studia). Rozdíl je ale v tom, že tyto pole jsou již namapované na vlastnosti editované entity nebo její UserProperty. A tudíž se i při uložení karty ukládají a při zrušení editace záznamu se zmeny zahodí. Nemusíte se o to strat v kódu (pokud se Vám vůbec podaří přijít na to jak toto realizovat) Nedokázal jsem totiž detekovat ukládání již existující entity při editaci. A ani zahození změn při opouštění formuláře.

Uložit oblast formuláře

potom ve visual studiu naimportujete tento formulář
nebo ho můžete znovu otevřít v Outlooku upravit a zpátky nahrát do Projektu Visual studia

Outlook má ale svou vlastní hlavu

- a tu je potřeba přepnout.
Pokud si myslíte, že mu nastavíte jak má být region veliký tak se pletete. Formulář totiž nemá vlastnost Height. Jedinou vlastnost kterou jsem našel a zkusil nastavit byla InsideHeight.
// this.OutlookFormRegion.Form.InsideHeight = 500.2;

Ta je ale nejspíš pouze pro čtení a v regionu dojde k chybě.
Je potřeba vypnout AutoLayout a outlook zachová rozměry ovladacích prvků tak jak jste je nastavili v designeru outlooku.


this.OutlookFormRegion.EnableAutoLayout = false;



Obrázky


Obrázek pak nastavite v kontextovém menu Upřesnit vlastnosti / vlastnost - Picture

Podporované formáty
Bitmap - *.bmp, *.dib
Jpeg - *.jpg
GIF - *.gif
Ikony - *.ico, *.cur
Metafile - *.wmf *.emf





Zdroje:
http://stackoverflow.com/questions/27974673/resize-outlook-form-region

Na diskuzích se doporučuje používat pro regiony tento framework
https://www.add-in-express.com/

čtvrtek 3. prosince 2015

Aplikace, které instaluji do Androidu jako první

Aplikace které instaluji jako první

  1. Mobile Security & Antivirus 
  2. Remember the milk  - je potřeba v nastavení upravit vychozí hodnoty pro úkoly výchozí datum dokdy na nikdy
  3. Toggl
  4. ClockworkTomato
  5. Llama
  6. DropBox
  7. Google Drive
  8. Blogger
  9. Sleep as Droid
  10. MHDroid
  11. Waze
  12. Mapy.cz
  13. Glympse
  14. Meteor
  15. Aladin
  16. Google Chrome
  17. Total commander
  18. Kalorické tabulky
  19. můj tmobile
  20. Barcode scanner
  21. VLC
  22. Pushbullet

Ostatní aplikace

  1. Skype
  2. Whatsup
  3. Viber
  4. Facebook
  5. Twitter
  6. VLC remote
  7. Kindle
  8. Alza media
  9. DailyRoads Voyager
  10. Můj vodafone

Čitelnost kódu

Která z variant Vám příjde čitelnější ?

ListInfo lst; 
lst = manager.GetLists().Data.FirstOrDefault(l => l.Name == "ListName"); 
if (lst == null)
{
      lst = manager.GetLists().Data.First();
}

var lst = manager.GetLists().Data.FirstOrDefault(l => l.Name == "ListName") ?? manager.GetLists().Data.First();



var lists = manager.GetLists().Data;
var lstInfo = lists.FirstOrDefault(l => l.Name == "ListName") ?? lists.First();
return lstInfo;


var lists = manager.GetLists().Data;
var lstInfo = lists.FirstOrDefault(l => l.Name == "ListName");
return lstInfo ?? lists.First();

středa 18. listopadu 2015

MS Outlook Regiony

MS Outlook Regiony

Pro přidání regionu se zobrazí wizard, který Vás provede jeho vytvořením.
 



Problémy nastanou až s jeho registrací aby se správně zobrazoval i na jiných počítačích než na tom kde ho vyvýjíte. FormRegion je totiž potřeba zapsat do windows registrů
Ve všech návodech se dočtete, že je potřeba vytvořit XML soubor (manifest), který popisuje nový region.
Pokud ale používáte k vývoji VSTO tak se jako manifest použije soubor s příponou *.vsto ve kterém je definice regionu popsána.
Potom už zbývá ve windows registrech vytvořit klíč ve kterém budou hodnoty jako název, popis a cesta k manifestu. A druhý klíč pro FormRegiony ve kterém bude pro typ zprávy kterou náš region rozšiřuje uvedena hodnota jaký region je definován ve kterém manifestu.
Důležité je aby hodnota (=BT.AddIn.Outlook) pro namespace regionu byla stejná jako název klíče (BT.AddIn.Outlook) viz. obrázek
Jinak volaný region nenalezde definici manifestu a nebude to fungovat.
Pokud máte chybu v hodnotě registru a hledáte vsto manifest někde kde není. Outlook Vám po spuštění vyhodí tuto chybu.
Zdroje:

Windows registry
https://msdn.microsoft.com/en-us/library/bb386106.aspx#outlookentries

Tutorial:
https://msdn.microsoft.com/en-us/library/bb226713(v=office.12).aspx
https://msdn.microsoft.com/en-us/library/aa942741%28v=vs.80%29.aspx?f=255&MSPPError=-2147217396
http://www.informit.com/articles/article.aspx?p=1327185&seqNum=4

Setup for AddIn
https://msdn.microsoft.com/en-us/library/cc442767.aspx

Video:
https://www.youtube.com/watch?v=iQm-dUVwMoY

Addin Sample Code
https://www.microsoft.com/en-us/download/confirmation.aspx?id=771

Message class ID
https://msdn.microsoft.com/en-us/library/office/ff861573.aspx

Pokud narazíte na nějaké nestovnalosti v článku nebo máte při vývoji AddInu problém zkuste se mě klidně zeptat. Pokud budu vědět rád poradím.

čtvrtek 5. listopadu 2015

Moq HttpContextu

public static HttpContextBase FakeHttpContext()
 {
 var context = new Mock<HttpContextBase>();
 var request = new Mock<HttpRequestBase>();
 var response = new Mock<HttpResponseBase>();
 var session = new Mock<HttpSessionStateBase>();
 var server = new Mock<HttpServerUtilityBase>();
 var user = new Mock<IPrincipal>();
 var identity = new Mock<IIdentity>();


request.Expect(req => req.Url).Returns(new Uri("http://www.seznam.cz"));
 request.Expect(req => req.ApplicationPath).Returns("~/");
 request.Expect(req => req.AppRelativeCurrentExecutionFilePath).Returns("~/");
 request.Expect(req => req.PathInfo).Returns(string.Empty);
 response.Expect(res => res.ApplyAppPathModifier(It.IsAny<string>()))
 .Returns((string virtualPath) => virtualPath);
 user.Expect(usr => usr.Identity).Returns(identity.Object);
 identity.ExpectGet(ident => ident.IsAuthenticated).Returns(true);

 context.Expect(ctx => ctx.Request).Returns(request.Object);
 context.Expect(ctx => ctx.Response).Returns(response.Object);
 context.Expect(ctx => ctx.Session).Returns(session.Object);
 context.Expect(ctx => ctx.Server).Returns(server.Object);
 context.Expect(ctx => ctx.User).Returns(user.Object);

 return context.Object;
 }


Zdroj:
http://stackoverflow.com/questions/1228179/mocking-httpcontextbase-with-moq

pátek 30. října 2015

Výměna žárovky předního světla Peugeot 207

Deset minut


  1. Otevřít motor
  2. Sundat gumové víčko žárovek
  3. Uvolnit pružinu. A úplně ji vyndat. Přes kabely se pak líp vytahuje žárovka
  4. Šroubovákem opatrně odpáčit konektor. (rukou to jde dost blbě)
  5. Vyměnit žárovku čurapajzlíkem nahoru
  6. Nacvaknout pružinku a zajistit žárovku
  7. Připojit konektor černý drátek nahoru k čurapajzlíku na žárovce.
  8. Vyzkoušet světla
  9. Vrátit zpátky gumové víčko žárovek
  10. Zavřít motor


čtvrtek 29. října 2015

Jak v systému nastavit akci po kliku na mailto: odkaz a jak ho správně vytvořit

Nastavení systému

Aby reagoval na kliknutí na odkaz protokolu mailto:, se dá ve Win8 nastavit v:
Ovládací panely / Programy / Výchozí programy / Otevírat určený typy souborů vždy pomocí konkrétního programu
Na konci seznamu je část protokoly kde najdete položku s názvem MAILTO
dvojklikem můžete zvolit jinou aplikaci.

Zdroj:
http://www.nextofwindows.com/how-to-change-default-mailto-behavior-in-windows-8

Jak správně sestavit link

  • Pokud URL bude obsahovat mezery tak nebude správně fungovat.
  • Pokud nahradíte mezery znakem '+' promítne se Vám například do těla e-mailu
  • Je zapotřebí zakódovat URL pomocí HTML entit a nahradit tak např. mezery za %20
Příklad:
<a href="mailto:prijemce@example.com?subject=Ahoj%20Jak%20Se%20Mas&body=Kouknmi%20se%20na%20Web%20http%3A%2F%2Fwww.verebro.com%2F.">Share Link By Email</a>

Zdroje:

čtvrtek 15. října 2015

Přístup k privátním property


using Microsoft.VisualStudio.TestTools.UnitTesting;
var po = new PrivateObject(client);
var password = po.GetFieldOrProperty("password").ToString();
var result = po.Invoke("privateMethodName", new { argument = "jmeno" });
po.Invoke()
Assert.AreEqual("TajneHeslo", password);
Assert.AreEqual("vysledek Metody", result);

mailchimp.com vs. 10minutemail.com

Potřeboval jsem vyzkoušet jak funguje MailChimp tak jsem si založil e-mail na deset minut na 10minutemail.com ale kucí v MailChimpu to mají pod kontrolou a odesílání pozastaví a pěkně si na právě založený účet posvítí ;)

We've temporarily stopped sending for a quick human review.
Our automated abuse prevention system, Omnivore, has detected either a prohibited action (such as having multiple accounts, sending unsolicited email) or prohibited content that conflicts with our acceptable use policy.
For more information regarding prohibited actions and prohibited content please review our acceptable use policy in full.
Takže velké odesílání se nekoná. Bodejť by ne, máte totiž možnost poslat 12,000 zpráv na  2,000 e-mailových adres. A to vše úplně zdarma. Teda ne zdarma, ale za vaši platnou e-mailovou adresu.

MailChimp

Struktura MailChimpu je tvořena:
Lists - seznamy E-mailových adres. Prostřednictvím API ale není možné je zakládat a musíte do správy účtu ručně.
InterestGrouping - Adresy z listu je možné dělit do skupin zájmu. Pokud přidáte uživatele do seznamu, může mu být odeslán e-mail ve kterém si zvolí které skupiny ho zajímají. Můžete nastavit jestli může vybrat pouze jednu nebo i několik.

API

Aby jste mohli komunikovat s MailChimp pomocí API musíte si nechat zdarma vygenerovat API klíč ve tvaru 22fcac64f0f90ff4960d88bcc8ee2602-us11
us11 na konci je identifikace datacentra se kterým máte povoleno komunikovat. od toho se potom odvíjí URL adresa kam budete směřovat požadavky https://us11.api.mailchimp.com/3.0/

Na Nuget_u je k dispozici balíček (install-package MailChimp.NET) s MailChimpManager_em
tahle knihovna vám ušetří spoustu práce s implementací vlastní komunikace se servrem prostřednictvím REST API.
GitHub projektu je například zde https://github.com/danesparza/MailChimp.NET/blob/master/MailChimp/MailChimpManager.cs

středa 14. října 2015

Postup zpracování zakázky

Opchodník vs. Zákazník
Zjištění požadavků zákazníka na implementovaný systém.
Výsledkem je podepsání smlouvy zpracované právníkem za cca 5-7tic. (Ta první. Pro dalšího použijete pravděpodobně tu stejnou)

Zákazník vs. Analytik
Zákazník nastíní Analytikovi požadavky na poptávaný systém.
Analytik rozpracuje požadavky tak aby jim archytekt mohl dobře porozumět. Vytvoří minimální řešení které bude zákazníkovi k užitku a vyčlení části které jsou zbytečné nebo složité. (Dokonalý systém je ten ze kterého nejde nic odebrat.)

Analytik  vs. Architekt
Analytik od Architekta obdrží zadání které rozpracuje do UML a návrhových vzorů. Podle tohoto návrhu vytvoří rozpočet podle historycké znalosti jak dlouho týmu trvá jednotlivé stavební bloky (Tabulka, datová vrstva, repository, Controller, page, ...) vytvořit.
Analytik si s klientem potvrdí rozsah prací a podepíše smlouvu která obsahuje jak rozpočet tak rozsah prací.

Architekt vs. Scrum Team
Architekt po schválení realizace projektu přednese požadavky na řešení Scrum Teamu který je poté realizuje

Freelancer
Pokud pracuješ na volné noze je to trošku paranojidní být Analytik, Architekt, Scrum master a Developer v jednom. Ale má to i své kouzlo

pondělí 12. října 2015

MS SQL vs. MySQL



Sloupec v MySQL který povoluje ukládat jen hodnoty z výčtu

[mycol] set('1','2','3','4','5','6') default NULL,


Alternativní zápis pro MS SQL který umožňuje také pouze hodnoty z výčtu

Create table [enum_tbl] (
[enum_nr] tinyint NOT NULL CHECK (enum_nr IN('1','2','3','4','5','6','7','8','9','10'))
)

Create table [enum_tbl2] (
[enum_nr] tinyint NULL CHECK (enum_nr IN('1','2','3','4','5','6','7','8','9','10'))
)


Problém při přepisu aplikace z MySQL na MS SQL je v tom že pokud používáte UTF-8
tak každá stringová hodnota pro MS SQL musí obsahovat prefix N'hodnota'.
Čimž se trochu komplikuje vytváření SQL příkazů.


REPLACE

'collate utf8_bin'  => ''
'int(11)' => 'int'
'varchar' => 'nvarchar'
'unsigned' =>''
'auto_increment' => 'IDENTITY(1,1)'

PHP 
'<?' => '<?php'
sqlsrv_query($objConn, $strQueryIN, $params)

NumRows
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$stmt = sqlsrv_query( $objConn, $strQueryIN, $params, $options);

Dotaz je potřeba volat s Options = Scrolable, aby bylo možné použít sql_num_rows

mysql_num_rows($result) =>

 if( sqlsrv_fetch( $result ) === false) {
     die( print_r( sqlsrv_errors(), true));
  }
    $REcount = sqlsrv_num_rows($result) !== false
? sqlsrv_get_field($result, 0)
: 0;


FetchArray
mysql_fetch_assoc($result) => sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)

Result
mysql_result($result, 0) => sqlsrv_get_field($result, 0)

if(sqlsrv_num_rows($result)===false) {

if ($REcount!==false)


Last Insert ID
mysql_insert_id() => mssql_insert_id()

 function mssql_insert_id() {
    $id = 0;
    $res = MSSQLQuery($conn, "SELECT @@identity AS id");
    if ($row = mssql_fetch_array($res, MSSQL_ASSOC)) {
        $id = $row["id"];
    }
    return $id;
  }


mysql_real_escape_string

function mssql_escape($str)
{
    if(get_magic_quotes_gpc())
    {
        $str= stripslashes($str);
    }
    return str_replace("'", "''", $str);
}

Zdroje:
http://php.net/manual/en/intro.mssql.php
http://stackoverflow.com/questions/1434298/sql-server-equivalent-to-mysql-enum-data-type
http://dev.mysql.com/doc/refman/5.0/en/set.html
http://stackoverflow.com/questions/12880567/equivalent-of-mysql-insert-id-for-ms-sql-server
http://stackoverflow.com/questions/2146546/mysql-real-escape-string-alternative-for-sql-server
http://php.net/manual/en/function.sqlsrv-fetch-array.php
http://php.net/manual/en/function.sqlsrv-num-rows.php
http://php.net/manual/en/function.sqlsrv-get-field.php


čtvrtek 8. října 2015

Repository TestCase

Testovací scénáře pro Repository
Repository má klasicky 4 operace - vytvoření, načtení, upravení a smazání. Každou z nich ale musíme otestovat na minimálně dvě krajní situace abychom si ověřili chování v těchto případech. Úspěšné vrácení záznamu po jeho načtení z DB nebo selhání a vyhození vyjímky při pokusu smazat záznam, který je zamčený, nebo na něj uživatel nemá práva.

Každé vytvoření, nebo úprava záznamu má ale určité pravidla pro validaci záznamu, které je možné do databáze uložit. Například délky textových řetězců, povinnost vyplnit některý údaj (not null), formát datumu, číselné datové typy, atp. To nám počet scénářů navyšuje.

Výhodou ale může být použití DataDriven Testů, kdy se jednomu testu předává více testovacíh hodnot. Tímto můžeme pokrýt jedním testem velké množství scénářů testování krajích hodnot.

Kupříkladu entita  musí mít vyplně:
  • datum vytvoření
  • id uživatele který ji založil
  • potom typ záznamu musí být jedna ze dvou variant
  • a pokud odpovídá variantě 1 tak musí být vyplněna ještě poznámka
Create - Vytvoření záznamu
  • Záznam se podaří vytvořit
  • Záznam se vytvořit nepodařilo
Find - nalezne záznam podle primárního klíče
  • Záznam se podaří nalézt
  • Záznam se nalézt nepodařilo
GetAll - Získá z databáze všechny záznamy
  • V kolekci není žádný záznam
  • Podařilo se získat alespoň jeden záznam
  • Načítání se nezdařilo např. Chyba spojení s DB
Search - Získá z databáze všechny zázanamy které vyhovují podmínce
  • Nebylo nic nalezeno
  • Nalezne alespoň jeden záznam
  • Vyhledávání selhalo
Update - akualizace záznamu
  • Update záznamu se povede
  • Update se nepovede
Delete - smazání záznamu
  • Delete se povede 
  • Delete se nepovede (např. záznam byl již smazán, uživatel nemá práva k záznamu)
Pokud vezmeme 20 testovacích scénářů a budeme počítat 30 minut na implementaci jednoho dostáváme se na čas 10 hodin na implementaci testů. Jak dlouho by trvalo vašemu testerovi tuto funkčnost otestovat v hotové aplikaci?

Přenos dat z XFS do NTFS

Před několika lety jsem si koupil NAS od ZYXELu. Funguje v pořádku už několik let. Při experimentech jsem ale několikrát navodil situaci kdy jsem se nebyl schopný k souborům na disku dostat. Naštěstí existuje aplikace kterou se na disk dostanete i z Windows. http://www.ufsexplorer.com/download.php Je možné ji vyzkoušet bezplatně ale kopírovat můžete pouze soubory do velikosti myslím že pouze 500 kB. Což nestačí ani na záchranu fotek. Takže jsem si musel koupit licenci. Kdyby tedy někdo chtěl stahnout data z jeho XFS disku tak se klidně ozvěte :)

Povolení FileStream na MS SQL

Je potřeba zapsat tento script a spustit ho

EXEC sp_configure filestream_access_level, 2

RECONFIGURE
Nastavení pomocí SQL Server Configuration Manager_u nezabralo ani po restartu serveru

čtvrtek 24. září 2015

CodeReview - není k ničemu

Když dělají dva totéž, nikdy to není totéž.
Překvapivě i když jste to vy sami jen o nějaký den, týde či měsíc starší.

Tím se ukazuje důležitost toho, aby po Vás váš kód někdo prošel, zaťukal si na čelo a řek "Můžeš mi prosím tě vysvětlit rozdíl mezi těmito dvěma propertama?" Pokud nemáte kolegu, který by to pro Vás udělal, tak hold před každým commitem musíte otevřít každý upravený soubor a podívat se co jste změnili a jestli o řádek vedle není metoda, kterou by jste mohli refaktorovat.


public bool IsPossibleToLogin
{
 get
 {
  return this.BaseAddress != null
  && !string.IsNullOrEmpty(this.BaseAddress.ToString())
  && !string.IsNullOrEmpty(this.UserName) 
  && !string.IsNullOrEmpty(this.Password);
 }
}

public bool IsSetLogin
{
 get
 {
  return !string.IsNullOrEmpty(this.UserName)
  && !string.IsNullOrEmpty(this.Password)
  && !string.IsNullOrEmpty(this.BaseAddress.ToString());
 }
}


První krok refaktoringu
Nahradit výpočet v druhé proprty výpočtem v první, protože je robustnější a kontroluje i jestli je vyplněna adresa. Označení property jako Obsolet dáte kolegů nebo partnerům kteří vaši knihovnu používají najevo, že plánujete tuto property odstranit, čím ji mají nahradit a kdy ji odstaníte.

public bool IsPossibleToLogin
{
 get
 {
  return this.BaseAddress != null
  && !string.IsNullOrEmpty(this.BaseAddress.ToString())
  && !string.IsNullOrEmpty(this.UserName) 
  && !string.IsNullOrEmpty(this.Password);
 }
}

[Obsolete("Duplicitní property. Použíjte property IsPossibleToLogin. Ve verzi 1.4.5 bude odstraněna.")]
public bool IsSetLogin
{
 get
 {
  return this.IsPossibleToLogin;
 }
}

Druhý krok refaktoringu
Odstraníme reference na obsolet propertu, které se nám po buildu zobrazí v [Error listu].

Třetí krok refaktoringu
Odstraníme obsoleteproperty.

středa 16. září 2015

Ftp vs. WebDeploy

Způsobů jak dostat hotový projekt na produkční server je několi. V tomto blogpostu porovnám jaký je rozdíl mezí FTP a WebDeployem.

FTP
Pro konfiguraci tohoto způsobu potřebujete:

  • Adresu ftp serveru
  • Uživatelské jméno
  • Heslo
  • Cestu k webRoot adresáři
  • URL adresu nasazeného projektu pro otevření prohlížeče po nasazení

Jakmile toto vše zadáte do průvodce Publish profilu, máte ještě možnost nastavit že se všechny soubory mají nejdříve smazat a potom zkopírovat nové verze. To Vám o něco prodlouří dobu nasazení, protože mazání spousty malých souborů je jen o něco rychlejší než jejich nahrání zpšt na server.

WebDeploy 
Pro konfiguraci webDeploye potřebujeme podobné údaje s tím rozdílem, že namísto webroot adresáře potřebujeme znát site name což je název stránky v IIS
Z buildovaný projekt je pak zabalen do ZIP balíčku s manifestem ve kterém je uvedeno jak se má balíček nasadit na IIS. Pomocí služby WebDeploy kterou jenutné na IIS nainstalovat se balíček nakopíruje na server kde se rozbalí do požadovaného adresáře. Což je asi "trilionkrát" rychlejší než používání mazání a kopírování přes FTP.

úterý 8. září 2015

Deploy na IIS 6.1 MVC 5 .NET4.0

Do souboru Web.Config je potřeba přidat:
<modules runAllManagedModulesForAllRequests="true">

Po dvou hodinách googlení a nastavování se to rozjelo

Klíčový řádek je:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis -ir

Pak je ještě potřeba nastavit v MimeType příponu pro *.svg
image/svg+xml


<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" xdt:Transform="SetAttributes"/>
    <staticContent>
      <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
    </staticContent>
  </system.webServer> 

Zdroj:
http://stackoverflow.com/questions/21623654/issue-deploying-asp-net-mvc-5-to-iis-server

pátek 28. srpna 2015

MS Outlook Appointment (Událost)

Při ukládání Událostí v outlooku existuje malá zvláštnost u celodenních událostí.

Outlook zobrazuje v kartě jednodení celodenní událost jako od: 28.8.2015 0:00 do: 28.8.2015 0:00 ale datově si to ukládá jako od: 28.8.2015 0:00 do: 29.8.2015 0:00


var endDate = existingOutlookItem.End;
if (existingOutlookItem.AllDayEvent) 
{
   endDate = endDate.AddDays(-1);
}

Vlastnosti:

AllDayEvent
Subject
Body
Sensitivity
Location
Importance
BusyStatus
Start
End
Categories

úterý 25. srpna 2015

Návrh API a testování

Při návrhu API je potřeba stanovit kromě způsobu komunikace i časy do kterých má rozhraní reagovat. Při vývoje ji pak dobrý nápad zahrnout do testovacích scénářů i testy, které prověří rychlost API. Co je Vám platné když stihnete termín, vše v přádku nasadíte, ale první klient který použije program v praxi na svích 10.000 záznamů se výsledku dočká až druhý den?

Napište test který pomocí API založí záznam a zase ho načte. Co se stane když ho obalíte FORem a spustíte ho 10.000x ? Pomocí StopWatch si to můžete stopnout a pokud se čas přehoupne přes určitou mez tak test nechejte spadnout.

Fajným zabijákem výkonu je reflexe. Mega fajným zabijákem výkonu je reflexe v cyklu.

Určitě dobrý nápad je vyvýjet API a klientsou knihovnu v oddělených projektech od celého systému. Tím se Vám zjednoduší údržba a vývoj.
API na servrové straně a klientskou část můžete společně verzovat a společně nasazovat.
Navíc je můžete společně i testovat bez nutnosti nasazovat celý systém např UI vrstvu. Máte přece UI vrstvu zvlášť? Nebo ne?

Testování

můžete napsat test který načte z api záznam a zkontroluje jestli všechny atributy obsahují očekávané hodnoty. Co se Však ale stane pokud nasadíte novou verzi a databáze je prázdná? Test spadne.
Lepší variantou proto je vytvořit testovací netodu která založí pokaždé nový záznam a ten na serveru vyhledá a zase si ho stáhne a porovná odeslané a přijaté hodnoty mezi sebou. Otestujete jak vytvoření záznamu, tak jeho stažení a porovnáním hodnot mezi sebo zkontrolujete jestli to co odesíláte se vám vrátí.
Klasický případ je že odešlete DateTime včetně času, server ale časovou složku zahazuje a ukládá pouze datum. Nebo datum vrací v jiném formátu.

Každou entitu se kterou je možné prostřednictvím API pracovat by měli pokrýt minimálně 4 testy (CRUD). Víše zmíněný test pokrývá dvě ze čtyřech.

středa 19. srpna 2015

Active Window Title Watch

class Program
    {
        static void Main(string[] args)
        {
            while(true)
            {
                Console.WriteLine(GetActiveWindowTitle());
                Thread.Sleep(1000);
            }
        }

        [DllImport("user32.dll")]
        static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

        private static string GetActiveWindowTitle()
        {
            const int nChars = 256;
            StringBuilder Buff = new StringBuilder(nChars);
            IntPtr handle = GetForegroundWindow();

            if (GetWindowText(handle, Buff, nChars) > 0)
            {
                return Buff.ToString();
            }
            return null;
        }
    }

Zdroj:
http://stackoverflow.com/questions/115868/how-do-i-get-the-title-of-the-current-active-window-using-c
http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

čtvrtek 13. srpna 2015

WinForm Localization (Globalization)


Ve vlastnostech formuláře
ve skupině Design nastavit vlastnost Localizable na true
Přepnout vlastnost Language z default na češtinu.
Upravit text některého z prvků které chcete lokalizovat. (tím se vytvoří další Resource File *.cs-CZ.resx)




Zkopírujte z výchozího resource souboru klíče i s hodnotou a přeneste je do Google Translatoru. Nechte si je přeložit do zvoleného jazyka a zase je zkopírujte. Tentokát ale do nového resource souboru. (pokud tam něco už je tak to přepište, nebo předtím smažte) Nesprávně přeložené hodnoty opravte a soubor uložte.



Pokud potřebujete přepnout Jazyk je nutné nastavit CurrentUICulture hned před inicializací formuláře. CurrentCulture kvuli lokalizaci stringů není potřeba měnit. Má ale vliv na chování některých metod jako např. ToLongDateString()



label1.Text = DateTime.Now.ToLongDateString();

public Form1()
        {
            
            //Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("Fr");
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("Fr");
            InitializeComponent();
        }

Pokud změníte CurrentUICulture až po inicializaci formuláře musíte provést lokalizaci ručně.
        private void button1_Click(object sender, EventArgs e)
        {
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("Fr");

            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            resources.ApplyResources(this.button1, "button1");
        }

Seznam kódů
https://msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx

Video:
Globalization of a WinForms App in 2 minutes
https://www.youtube.com/watch?v=SNIyP1QQdVs

Články:
http://www.zive.cz/clanky/poznavame-c-a-microsoft-net---74-dil--lokalizace/sc-3-a-130695/default.aspx

čtvrtek 23. července 2015

SyntaxHighlighter

Do Html šablony je potřeba vložit odkazy na Javascripty a CSS podle návodu níže.
je jsem ještě použil jiné thema

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>

Použití v článku je pak jednoduché obalení tagem kde hodnota brush se může lišit podle jazyka např.
csharp, js, html, ...

<pre class="brush:js"></pre>


Zdroj:
http://oneqonea.blogspot.cz/2012/04/how-do-i-add-syntax-highlighting-to-my.html
http://alexgorbatchev.com/SyntaxHighlighter/manual/installation.html

DateTime a verze Windows

Co Vám vrátí za hodnotu tento kus kódu pokud jsou zrovna Vánoce (24. prosince 2015)?

var datum = DateTime.Now.ToString();

Odpověď může být různá v závislosti na nastavení vašeho operačního systému a jeho verzi.
Ve výchozím nastavení je totiž na Windows 8 krátký format data, který se používá v metodě ToString() nastaven na hodnotu d. M. rrrr jinak tomu ale bylo ve Windows 7 kde je hodnota d.M.rrrr (bez mezer)


[Test]
        public void LEARN_DateTime_ToString_Format()
        {
            // ARRANGE
            string format = "d.M.yyyy H:mm:ss";
            var provider = new CultureInfo("cs-CZ");            
            var shortDatePattern = provider.DateTimeFormat.ShortDatePattern;
            var longTimePattern = provider.DateTimeFormat.LongTimePattern;

            // ACTION   
            var cultureFormat = string.Format("{0} {1}", shortDatePattern, longTimePattern);

            // ASSERT
            Assert.AreEqual(cultureFormat, format);
        }

středa 22. července 2015

Code First relace M ku N


Zdroj:
http://stackoverflow.com/questions/11382783/entity-framework-code-first-many-to-many-mapping-table

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{    
    modelBuilder.Entity<Recipe>()
        .HasMany(x => x.Members)
        .WithMany(x => x.Recipes)
    .Map(x =>
    {
        x.ToTable("Cookbooks"); // third table is named Cookbooks
        x.MapLeftKey("RecipeId");
        x.MapRightKey("MemberId");
    });
}
Problém je že pokud používáte Context který dědí např z  IdentityDbContext<User>
tak je potřeba aby se při vytváření modelu zavolalo base.OnModelCreating(modelBuilder);
Jinak při migraci obdržíte několik chybových zpráv ve smyslu, že tabulky související s Identitou nemají nastaveny primární klíče.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}

úterý 23. června 2015

AdSense - První zážitky

Zkouším přidat na své dva blogy Google AdSense.
Hned při přihlášení do AdSense mi Google oznámí že nůj účet byl zablokován.
Druhé zjištění pokud používáte Adblock
a) na mích stránkách si ho povolte! ;)
b) povolte si ho i na blogger.com protože pokud si nastavíte AdSense a budete chtít změnit rozložení blogu, tak se marně budete snažit přidat gadget, který se po uložení nezobrazí - nezobrazí se proto že ho Adblock skryje. Jakmile jsem si povolil reklamu na bloggeru tak sem jich tam měl hned sedm.
c) povolte si Adblock i na doméně svého blogu - jinak se Vám nezobrazí. Mě se reklama nezobrazila, ale vyhradilo se pro ni místo. Na reklamu ale neklikejte, jinak vám zablokují váš účet.

Google Publisher Toolbar
Určitě doporučuji nainstalovat extension do Chromu
https://chrome.google.com/webstore/detail/google-publisher-toolbar/omioeahgfecgfpfldejlnideemfidnkc/related
Potom co si v nastavení Extension nastavíte seznam svých webů tak Vám překryje banery na webu a zamezí tomu aby jste na ně klikly. Navíc ještě zobrazí informace o reklamě a statistiky klikání

Stručně
http://www.zbynekmlcoch.cz/informace/texty/pocitace-internet/jak-funguje-google-adsense-a-vydelavani-penez-vkladanim-reklamy-do-stranek

AdSense je velmi tvrdý
Google adsense mi vymazal účet. Bez varování, bez vyplacení peněz na účtě a možnosti odvolání.
Příjde mi to od nich jako dost sprosté jednání.
Přiznám se, že nejsem svatý a občas jsem na reklamu na svých stránkách klikl, ale jenom proto, že jsem četl
v jejich podmínkách, že reklama může být vymazána, pokud na ni nikdo nekliká. Proto jsem na ni klikl, řekněme
2-4 týdně, protože jsem měl ze začátku nízkou sledovanost webu. Netušil jsem, že kvůli takové prkotině my zruší
účet i s penězi, které jsem tam měl naspořeno.
Pokud by byli fér, tak by mě na to alespoň upozornily, nebo ne?
A neříkám to jenom já, ale stalo se to i jinému týpkovi, kterému jeho bratr klikl 2x z jeho počítače na adsese
reklamu a účet mu zablokovali.
Píše se v diskuzi na http://diskuse.jakpsatweb.cz/?action=vthread&forum=14&topic=161819

Doporučuji přečíst:
https://support.google.com/adsense/answer/1348754?hl=cs#q1
http://www.sovavsiti.cz/weblog/54/radost-z-adsense

Zdroje:
http://www.zive.cz/clanky/adsense-a-analytics-jak-si-vydelat-na-webu/google-adsense-vam-vydela-prinejmensim-na-hosting/sc-3-a-141400-ch-60153/default.aspx

pátek 19. června 2015

Code Signe Certifikát

Certifikát můžete koupit třeba od kSoftware

http://codesigning.ksoftware.net/#read_more
$95,- / rok cca 2.295,- Kč
Postup instalace

*.p12 převedete na PFX takto

  • Nainstalovat certifikát do Windows a povolit jeho Export
  • WinKey + R / napiš Mmc / Ctrl+M přidat snap-in Certifikáty 
  • osobní/ certifikáty / Pravý klik na certifikát / všchny úkoly / Exportovat (Ano, Exportovat primární klíč)
Pak přidej *.pfx do projektu na záložce Signing a projekt zkompiluj. Já pak obdržel chybovou hlášku:
Warning 6 Cannot import the following key file: cert.pfx. The key file may be password protected. To correct this, try to import the certificate again or manually install the certificate to the Strong Name CSP with the following key container name: VS_KEY_B0E46663412EF159 PodepisovanyProjekt
Vygooglil jsem tento post a několikrát to podle něj zkoušel


Run.bat"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -i cert.pfx VS_KEY_B0E46663412EF159
smaže kontejner
sn.exe -d VS_KEY_B0E46663412EF159 
Bohužel pro mě to ale nefungovalo.

Comodo technická podpora

Napsal jsem na technickou podporu Comodo a ti mě odkázali na tento článek
https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/619/0/object-already-exists-error-in-visual-studio-20052008

Postup instalace podle tohoto článku:
  1. Naimportovat *.p12 soubor do úložiště certifikátu (prostě ho nainstalujete)
  2. Potom si ho vyexportujte do PFX (Pochopil jsem to tak, že po instalaci je naimportován jako KeySpec=1 [neptejte se mě co to znamená nevím to])
  3. Pak certifikát z úložiště jednoduše smažeme
  4. Pomocí příkazu "C:\Windows\System32\certutil.exe" -importPFX -user "cert.pfx" AT_SIGNATURE znovu naimportujeme do úložiště certifikátů.
  5.  Nyní by měl mít KeySpec=2 
  6. Tím ale práce ještě nekončí. Tento certifikát si znovu vyexportujte do PFX a až tento přidejte ve vlastnostech projektu na záložce Signing pro podepisování knihoven.
  7. Projekt zbuildujte a chyba je pryč a knihovny jsou podepsány.

Poznámky:
Z technické podpory mi ještě poslali jeden odkaz. Pokud vaše heslo obsahuje znak ^ tak ho musíte zdvojit ^^ jinak Vám to bude hlásit neplatné heslo protože ^ je řídící znak. Všiměte si že když v CMD stisknete např. Ctrl + V tak se do řádky vloží ^V
https://chentiangemalc.wordpress.com/2012/10/23/case-of-the-certutil-import-refusing-the-correct-password/

Závěrem

Pokud Vám tento článek v něčem pomohl, budu rád pokud mi to napíšete do komentáře. Pokud najdete nějakou chybu, nebo máte připomínku tak mi napište a já článek opravím, aby se se stejnou chybou nemuseli mordovat ostatní co si ho přečtou. 

čtvrtek 4. června 2015

Vypněte si historii ve Skypu

Dneska mi psla collerX jesi může vyzkoušet jednu chybu Skypu
http://www.novinky.cz/internet-a-pc/bezpecnost/371317-staci-poslat-kratky-text-a-skype-je-mimo-provoz.html Můžu to vyzkoušet?

Cooler to pak zkusil a opravdu to zablokuje skype. Pokud uchováváte historii tak už ho pak ani nezapnete. proto doporučuji změnit nastavení soukromí a Uchování historie nastavit na bez historie.

středa 27. května 2015

Reference na projekty

Pokud nemůžete přijít na to proč nejde zbuildit projekt ikdyž máte všechny referenční knihovny přidané do referencí a zobrazuje se u nich žlutý trojúhelníček, zkontrolujte cílový Framework projektu. Musí být všechny stejné


Zdroj:
http://stackoverflow.com/questions/8314109/missing-reference

Check the target framework of your application, might be you´re building for the client profile but the referenced assembly requires the full framework.

pondělí 4. května 2015

Povolení hibernace ve Win 8


Postup:
  1. stiskni Win + W
  2. Napiš 'power'
  3. Změnit akce tlačítek napájení
  4. kliknout nahoře na 'změnit nastavení které není nyní k dispozici'
  5. zaškrtnout 'Přeponout do režimu hibernace'

Zdroj
http://www.pcworld.com/article/2016932/how-to-enable-hibernate-mode-in-windows-8.html

čtvrtek 30. dubna 2015

Instalace software



Je to prácička tak na dvě hodinky. Já jsem během toho zvládnul ještě nainstalovat aktualizace BIOSu a vyměnit vyreklamované SSD. Docela příjemně mě překvapilo že TS Bohemia má dohodu s Transcendem, že SSD disky mění kus za kus. Do druhého dne jsem ho měl k vyzvednutí na prodejně.

Bohužel mě dost zklamalo když jsem ho musel jít reklamovat po druhé. Chtěl jsem si v TSB domluvit že mi ten disk dají hned ale to nešlo. Prý se na to musí podívat technik, který schválí výměnu.


Základní aplikace
  1. Windows 8.1 nebo Windows 10 - stažení ISO nebo vytvoření bootovací USB Flash
  2. Google Chrome
  3. TotalCommander
  4. .NET Framework 3.5 - vyžaduje ho Windows Essentials
  5. Windows Essentials - (MovieMaker, Writter) Nutno instalovat před Antivirem jinak jejich instalace selže. Čti dál 
  6. Eset Smart Security
  7. Skype
  8. VLC
  9. Visual Studio 2015 Community
  10. MS SQL Express With Tools x64 (ExpressAndTools 64BIT\SQLEXPRWT_x64_ENU.exe)
  11. Dropbox Přesunout složku na disk D (data)
  12. Google Drive Přesunout složku na disk D (data)
  13. Acrobat reader 
  14. Firefox
  15. IrfanView - Skenování
  16. Paint .NET
  17. Notepad ++
  18. TeamViewer
  19. Fiddler
  20. WinMerge
  21. Audacity
  22. PSPad
  23. WinRar
  24. 7Zip
  25. Free Mind
  26. ImageResizer
Vývoj
  1. NetBeans IDE 8.0
  2. Inno Setup
  3. Advanced Installer
  4. dbForge Studio Express for MySQL
Ostatní
  1. Ashampoo Burning Studio FREE
  2. Picasa
  3. Cold Turkey
  4. Recuva
  5. Ashampoo Snap 3
  6. FastStone Capture
  7. PDFCreator
  8. Citrix Receiver

Virtualizace
Arduino
  1. Arduino
  2. Fritzing
Účetnictví
  1. Pohoda
  2. Money S3

středa 29. dubna 2015

Windows Live Writer

Windows Live Writer
Novou informací pro mě bylo zjištění, že k Bloggeru je možné se připojit pomocí Windows Live Writeru a články psát z pohodlí desktopové aplikace s příjemným wysiwyg editorem.

Nainstalovat Microsoft Essentials kterých je WLW součástí je trošku problém pokud máte nainstalovaný například antivir Eset. Instalace prostě skončí chybou, která říká, že máte nastavit Firewall, což ale nejde protože ho spravuje Eset.

Další překvapení zažijete při přihlašování k Blogu. I přesto, že jste si 100% jistí, že zadáváte jméno a heslo správně se nepřihlásíte. Je to tím že Google zablokuje váš pokus o přihlášení a pošle vám e-mail. V něm se můžete prokliknout na stránku (https://www.google.com/settings/security/lesssecureapps) kde povolíte “starším” aplikacím, které nepodporují bezpečnější komunikaci, aby se mohli taky připojit.Zmatený obličejhttps://support.google.com/accounts/answer/6010255?hl=cs

Pokud máte ale zapnuté dvoufázové ověření (pomocí SMS)
Pro účty s aktivovaným dvoufázovým ověřením toto nastavení není k dispozici. U těchto účtů je pro přístup z méně bezpečných aplikací požadováno heslo pro konkrétní aplikaci.

Windows Live Writer-OpenPomocí dialogu Soubor / Otevřít nejnovější příspěvek Můžete editovat i starší příspěvky




Zdroj:
http://www.thewindowsclub.com/configure-windows-live-writer-for-blogger-and-enhance-it-using-plugins

neděle 19. dubna 2015

Import do Pohody

Chyby

Velikost písmen
Obálku dokumentu se nepodařilo ověřit podle schématu.
Reason: The element 'dat:DataPackItem' is used but not declared in the DTD/Schema.
Pohoda totiž používá pro názvy elementů na začátku malá písmena.

Chybí prefix
dataPack namísto dat:dataPack
pokud Vám chybí prefixy, musíte při serializaci předat serializerů seznam namespace a jejich prefixů.

Chybí povinný atribut
Obálku dokumentu se nepodařilo ověřit podle schématu.
Reason: Required attribute 'application' is missing.

Hodnota atributu application se zobrazuje v seznamu XML Log, stejně tak jako název PC ze kterého byl import proveden, uživatelské jméno přihlášeného uživatel do účetnictví a číslo (ID) dataPacku

Chyba: Tento balíček není určen pro tuto jednotku.
Snažíte se importovat soubor který obsahuje rozdílné IČO od IČa vyplněném v účetní jednotce

dat:DataPackItem nesmí být prázdný
Obálku dokumentu se nepodařilo ověřit podle schématu.
Reason: Element cannot be empty according to the DTD/Schema.

Probíhá zpracování ...Zpracování bylo dokončeno.Výsledek: Ok
Odpověď uložena v: C:\Pohoda_Import\Response\FV4.xmlVýsledek importu položek:
ID: CM001: Ok
Minimální importovatelný datapack faktury
<?xml version="1.0" encoding="windows-1250"?><dat:dataPack id="FV20150001" ico="12345678" version="2.0" application="OdvezTo.Eu"note="Faktura byla exportována ze systému OdvezTo.Eu"xmlns:inv="http://www.stormware.cz/schema/version_2/invoice.xsd" xmlns:typ="http://www.stormware.cz/schema/version_2/type.xsd" xmlns:dat="http://www.stormware.cz/schema/version_2/data.xsd"><dat:dataPackItem id="CM001" version="2.0"><inv:invoice version="2.0"><inv:invoiceHeader><inv:invoiceType>issuedInvoice</inv:invoiceType><inv:date>2014-10-14</inv:date></inv:invoiceHeader></inv:invoice></dat:dataPackItem></dat:dataPack> 

Závažnou chybou je také nesprávná znaková sada (CodePage) datového souboru.
Pokud máte XML například v UTF-8 (výchozí znaková sada .NET) a pokusíte se ho naimportovat
a v hlavičce XML máte uvedeno <?xml version="1.0" encoding="windows-1250"?>
Vrátí vám Pohoda nic neříkající chybovou hlášku:

Probíhá zpracování ...Zpracování bylo dokončeno.Výsledek: Error Odpověď uložena v: C:\Users\zbynek.sulc\Downloads\Response\FVObj20150005 (2).xmlObálku dokumentu se nepodařilo ověřit podle schématu. 


Validace podle schmatu
Pokud máte chybu ve struktuře XML dokumentu neprojde validací a nezbyde Vám nic jiného než soubor otevřít a chybu najít ručně. Jste si jisti že máte všechno správně a stejně aplikace hlásí chybu? K této chyba může dojít i proto, že máte rozdílné znakové sady. v XML sice uvádíte windows-1250, ale do souboru jste ho zapsali jako UTF-8 což je defaultní znaková sada .NET Frameworku.


Probíhá zpracování ...



Zpracování bylo dokončeno.

Výsledek: Ok 

Odpověď uložena v: C:\Users\zbynek.sulc\Downloads\Response\FVObj20150005 (3).xml



Výsledek importu položek: 
ID: Usr01 (001): Error 'Element content is invalid according to the DTD/Schema.Nepodařila se validace dokumentu podle schématu.'

Tuto chybu napříkald obdržíte pokud si nevšimnete že inv:homeCurrency v 
inv:invoiceSummary a v části inv:invoiceItem mají různý typ a tudíž i atributy.

v summary je to typ:typeCurrencyHome 
v Items pak typ:typeCurrencyHomeItem

Aby Vás udrželi vývojáři ze Stormware v bdělém stavu a zvíšili Vám hladinu adrenalinu tak tuto nekonzistenci opakují i na Adrese
addressType a myAddress


Další záludností je délka textu DTD Schema říká že:
<xsd:element name="text" type="typ:string90" minOccurs="0">
<xsd:annotation>
<xsd:documentation>Text položky.</xsd:documentation>
</xsd:annotation>
</xsd:element>
Takže
<xsd:simpleType name="string90">
<xsd:annotation>
<xsd:documentation>Řetězec o délce 90 znaků.</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="90"/>
</xsd:restriction>
</xsd:simpleType>


Pokud máte nějaké otázky klidně je napište do komentáře nebo na můj e-mail.
Instalačku Pohody můžete bez registrace stáhnout z adresy http://www.stormware.cz/pohoda/start.aspx