Schamann.net

…děláme vJeci jinak…

You are currently browsing the Visual Basic category.

Když .NET blbne

Někdy se něco objeví, co je potřeba hledat: tady ukládám seznam řešení a doplňků které používám

Problém:

‚Microsoft.SqlServer.Types, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91‘

Řešení: x86: https://download.visualstudio.microsoft.com/download/pr/c26a74d5-dea2-4470-8710-f55d9fc6b1cf/f00a12b4f626a834e6ad7cc5fabe9d4c/sqlsysclrtypes.msi

x64: https://download.visualstudio.microsoft.com/download/pr/dc6a8061-56b7-4c39-950c-c0b6d938bc4c/c390e88ef49173e8c7b1b00174da2a25/sqlsysclrtypes.msi

Doplňky:

MySQL Editor for Visual Studio by: Michal Žůrek

Posted 4 months, 3 weeks ago at 13:55.

Add a comment

MySQL – tisk adresních štítků

Narazil jsem na zajímavý problém s tiskem adresních štítků z naší databáze. Potřeboval jsem odesílat více balíků z jedné zakázky na stejnou adresu. Normálně jsme tiskli jeden štítek několikrát. Ale stalo se, ze kurýr u zákazníka nevěděl kolik balíků má ve skutečnosti předat. Takže jsem chtěl udělat číslování balíků v rámci zakázky ve formátu 1z5, 2z5, atd. Řešení je tak překvapivě jednoduché, že jsem se o něj chtěl podělit.

Jasné, řešení existuje spousta a každý programátor i začátečník by si s tím nějak poradil po svém. Ale protože v našem .NET používáme pro tisky CrystalReport bylo by elegantní řešení nechat to přímo na databázi a výsledek podstrčit rovnou z MySQL. To znamená ve výsledném SELECTU chci úmyslně tolik duplicitních řádků adres, kolik mám balíků a zároveň doplnit číslování těch duplicit, aby mi vznikla kompletní sada adresních štítků.

I tady existuje několik možností přes dočasné tabulky nebo nějaké funkce, všechno mi přišlo zbytečně složité. Ale pojďme postupně.

Pokud JOINuju dvě tabulky, které mají různý počet řádků, buď mi vzniknou duplicity nebo bude něco chybět. Pojďme tedy využít těch duplicit a jen je očíslovat.

Jak na to? Důležité je vyrobit si očíslovaný seznam v jiné tabulce, která bude sloužit pro získání pořadí. Buď se dá založit nějaká dočasná tabulka, která bude seznam obsahovat, například:

CREATE TABLE max_baliku (PORADI INT(11) PRIMARY KEY)
INSERT INTO max_baliku VALUES(1),(2),(3),(4),(5)

Musí se ovšem, předem zjistit maximální počet balíků ve všech adresách (pokud tisknete štítky, tak jako my, v dávkách) které chci tisknout, a po tisku po sobě zase uklidit. To znamená čas a kódování navíc. Protože je tohle u nás celkem pravidelná věc, tak jsem jednoduše založil tabulku ciselnik_max_baliku s jediným sloupcem PORADI, který obsahuje číselník s dostatečnou rezervou (100) řádků.

Pro ucelený příklad mějme ještě tabulky adresy a baliky:

  • adresy.CISLO_ZASILKY, adresy,ADRESA
  • baliky.CISLO_ZASILKY , baliky.POCET_BALIKU

JOINovat umíme všichni a spojení 3 tabulek dáme do kupy velice rychle:

SELECT a.ADRESA, c.PORADI, b.POCET_KUSU 
FROM adresy AS a
LEFT JOIN baliky AS b ON b.CISLO_ZASILKY = a.CISLO_ZASILKY
LEFT JOIN ciselnik_max_baliku AS c ON c.PORADI = b.POCET_KUSU  

A je čas na kouzlo. Celý fígl je v tom že v klauzuli ON se nemusí používat pouze „=“ jak jsem všichni notoricky zvyklí, ale můžeme použít libovolný operátor. A pokud použiju v našem případě „<=“ vznikne přesně to co potřebuju: Očíslovaný seznam adresních štítků. Ono „<“ totiž pak bude vyhovovat všem řádkům z tabulky ciselnik_max_baliku az do hodnoty baliky.POCET_KUSU a tyto řádky do výsledku přidá a protože k nim v tabulce adres nejsou protihodnoty musí je zduplikovat. Nakonec ještě nějaký ORDER, aby se vytiskly ve správném pořadí a je hotovo.

SELECT a.ADRESA, c.PORADI, b.POCET_KUSU 
FROM adresy AS a
LEFT JOIN baliky AS b ON b.CISLO_ZASILKY = a.CISLO_ZASILKY
LEFT JOIN ciselnik_max_baliku AS c ON c.PORADI <= b.POCET_KUSU
ORDER BY a.CISLO_ZASILKY, c.POCET
Jak jsem řekl, překvapivě jednoduché a elegantní řešení, bez jakýchkoliv
dalších cyklů, selektů, funkcí a zbytečného kódování...


  • 🙂

Posted 5 months, 3 weeks ago at 00:51.

Add a comment

Licence na MSWSOCK.OCX

Po registraci objektu MSWSOCK.OCX je nutné ho ještě zaregistrovat.

Verze VB6 Profesional by měla tuto knihovnu obsahovat a zde není nutná licence.

Pro ostní verze VB6 je Licencování následné:

Do registru je nutné zapsat tuto hodnotu:
// Winsock Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d = mlrljgrlhltlngjlthrligklpkrhllglqlrk

Posted 2 years, 4 months ago at 16:26.

Add a comment

Konverze HEX >> DEC

Ve visual Basicu, zda se, chybí konverzní funkce opačná k funkci Hex. Není to pravda. Jen to není popsané v učebnici.
Hex udelá z decimílního čísla číslo Hexadecimální.

da se vytvořit jednoduchá funkce:
Function HexToDec(HexValue As String) As Long
HexToDec = Val(„&H“ & HexValue)
End Function

která převede číslo z Hexa do Decimálního formátu.

Posted 9 years, 1 month ago at 21:36.

Add a comment

Licence na MSCOMM32.OCX

Po registraci objektu MSCOMM32.OCX le nutné ho ještě zaregistrovat.

Verze VB6 Profesional by měla tuto knihovnu obsahovat a zde není nutná licence.

Pro ostní verze VB6 je Licencování následné:

Do registru je nutné zapsat tuto hodnotu:

[HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]@ = "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"
Tím je licence vytvořena a objekt pracuje správně.
MSCOMM32.OCX je knihovna pro ovládání USB a COM portu na PC.

Posted 9 years, 3 months ago at 22:47.

Add a comment