piątek, 27 lutego 2015

Cz4: Metody

Uff, nie rozumiem, nie rozumiem...za wcześnie się za to zabrałem. Ale z ciekawości zajrzałem np. tutaj (szukając w google najłatwiejszego przykładu: http://geekswithblogs.net/joycsharp/archive/2008/02/15/simple-c-delegate-sample.aspx albo... tutaj, bajka o metodach, polecam: http://www.codeproject.com/Articles/1629/NET-Delegates-A-C-Bedtime-Story

Cz3: Dziedziczenie

Ciekawy przyklad na blogu http://invisibleblocks.com
class A     {
  public A()  {
              Console.WriteLine(“in A”);
              }
        }
class B : A {
  public B()  {
              Console.WriteLine(“in B”);
              }
            }
class C : B {
  public C() {
              Console.WriteLine(“in C”);
             }
            }
new C();
Pytanie, co zostanie zwrócone? Odpowiedź autora blogu invisibleblocks: “in A, in B, in C”, without me typing out : base(). C# inherits constructors automatically, and the superclass constructors run before subclass constructors.

czwartek, 26 lutego 2015

Cz2 zmagań z C# - base oraz this (w konstruktorach)...

CD mojego pamiętnika zmagań z C#. Najprostrze objaśnienia znalazłem na stronach dotnetperls:
base w konstruktorach - odwołanie do konstruktora parenta.
public class A // To jest moja klasa bazowa (base).
{
    public A(int value)
    {
 Console.WriteLine("Klasa base A()");
    }
}

public class B : A // Ta klasa dziedziczy z klasy A,
{
    public B(int value)
 : base(value)
    {
 // najpierw wywoływany jest konstruktor bazy.
 // ... następnie wykonany jest konstruktor B
 Console.WriteLine("Pochodna klasa B()");
    }
}

class Program
{
    static void Main()
    {
 // Tworzy nową instancję/wystąpienie klasy  A, klasy bazowej.
 // ... następnie wywołuje klasę B, która wykona konstruktor bazy.
 A a = new A(0);
 B b = new B(1);
    }

Przykład z Video Pragim Technologies:
public class ParentClass
{
    public ParentClass()
    {
      Console.WriteLine(”ParentCass Constructor caI1ed");
    )
    public ParentClass(string Message) //TEN KONSTRUKTOR ZOSTANIE WYWOŁANY
    {
      Console.WriteLine(Message);
    )
}
public class ChildClass : ParentClass
(
    public ChildClass() : base(”Derived class controlling Parent class”) //UWAGA "base"
    (
    Console.WriteLine(”ChildClass Constructor called”);
    )
}
public class Program
(
    public static void Mamo
    (
       ChildClass CC = new ChildClass;
    }

} 
Rezultat: Derived class controlling Parent class.
ChildClass Constructor called. A teraz keyword this... pozwala konstruktorom odwoływać się do konstruktorów tej samej klasy. Przykład z dotnetperls:
using System;

class Mouse
{
    public Mouse()
 : this(-1, "")
    {
 // Ten pierwszy konstruktor wywoła drugi konstruktor z parametrami (-1, "").
    }

    public Mouse(int weight, string name)
    {
 // Constructor implementation.
 Console.WriteLine("Constructor weight = {0}, name = {1}",
     weight,
     name);
    }
}

class Program
{
    static void Main()
    {
 
 Mouse mouse1 = new Mouse();
 Mouse mouse2 = new Mouse(10, "Sam");
    }
}

Rezultat

Constructor weight = -1, name =
Constructor weight = 10, name = Sam


wtorek, 24 lutego 2015

Cz1 zmagań z C#_ Ternary i Null Coalescing Operator

Postanowiłem codziennie zrobić jakiś mały kroczek, dziś zmagałem się z operatorami: https://msdn.microsoft.com/en-us/library/ms173224.aspx

??, Null coalescing opearor http://www.dotnetperls.com/null-coalescing
Ciekawostka z Wikipedii:
 
return some_Value ?? some_Value2 ?? some_Value3;

"Once a non-null value is assigned to number, or it reaches the final value (which may or may not be null), the expression is completed."

 ?: Ternary opeartor.( conditional operator, inline if (iif), or ternary if)
np przykład tutaj. http://csharp-video-tutorials.blogspot.co.uk/2012/06/part-5-c-tutorial-common-operators.html
bool IsNumber10 = Number == 10 ? true : false;
przykład z wikipedii:

//condition ? first_expression : second_expression;
 
static double sinc(double x) 
{
     return x != 0.0 ? Math.Sin(x)/x : 1.0;
}
Interesująca składnia źródło: stackoverflow
x = foo ? 1 :
    bar ? 2 :
    baz ? 3 :
          4;

piątek, 13 lutego 2015

Czyszczenie danych skopiowanych do excela.

1. Czy wszystkie daty i wartości są rzeczywiście datami (czy też ciągami tekstowymi?) . Zawsze sprawdzałem to stawiając dodatkową kolumnę z formuła istext albo isnumber. Tym razem dla szybkiego sprawdzenia stosuję np. =SUMPRODUCT(--(ISTEXT(AI3:AI109)))  - która zwróci info w ilu przypadkach w komórkach wystąpiły śmieci.
2. W przypadku, gdy Excel część dat potraktował jak daty a część jak łańcuchy tekstowe, cały zakres dat zaznaczam i traktuję makrem:


Sub PoprawDaty()

For Each cell In Selection
    If IsDate(cell.Value) And cell.NumberFormat <> "yyyy-mm-dd" Then
        With cell
         .NumberFormat = "yyyy-mm-dd"
         .Value = DateValue(.Value)
        End With
    End If
 Next cell

End Sub
Działa.
Czasetm zdarza się też, że dane liczbowe wklejone z innego źródła (ACE SQL, baza danych mainframe, tabelka w przeglądarce) są traktowane jak tekst i dopiero po edycji (kliknięciu i zaakceptowaniu, F2 i enter) nagle Excel przyjmuje prawidłowy format. Przecież nie będziemy klikać kilka tysięcy razy. W moim przypadku, np. w przypadku danych, które prawidłowo powinny być w formacie "Currency" działa coś takiego (jest to przeróbka kodu powyższego):


Sub PoprawWartosci()

For Each cell In Selection
   ' If IsNumeric(cell.Value) And cell.NumberFormat <> "#,##0.00 $" Then
        With cell
         .NumberFormat = "#,##0.00 $"
         .Value = CCur(.Value)
        End With
    'End If
 Next cell

 End Sub

A tutaj wariant, który poprawia konkretną kolumnę w konkretnej tabeli(fragment kodu):
Dim oListObj As ListObject
Set oListObj = Worksheets("Oferta").ListObjects("Table3")

For Each Cell In oListObj.ListColumns("wartosc").Range
   'If Not IsNumeric(Cell.Value) And Cell.NumberFormat = "#,##0.00 $" Then

        With Cell
            If .Value <> "" Then
                .NumberFormat = "#,##0.00 $"
                .Value = CCur(Val(.Value))
            End If
        End With

 Next Cell

Zdarza się, że Excel nie traktuje tekstów jak teksty, wtedy na początku każdej komórki dodaję apostrof:

Sub DodajApostrofPoLewej()


    Dim c As Range
        
    Application.ScreenUpdating = False
        For Each c In Selection
         If Left(c, 1) <> "'" Then c.Value = "'" & c.Value
        Next
    Application.ScreenUpdating = True

End Sub
Zdarza się też, że dane skopiowane ze strony internetowej zawiarają puste komórki, a excel twierdzi, że jednak jest w nich coś (Count w pasku stanu nie równa się 0)i nie chce liczyć zakresów zawierających takie komórki. Mój trik, to wpisanie do wszystkich pustych komórek wartości 0 a następnie usunięcie wszystkich zer :
Sub clean_up()


    Selection.Replace What:="", Replacement:="0", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

    Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False



End Sub
3. Teraz pozostaje np. opracowanie wartości, które nie są liczbowe, np. w kolumnie okres w miesiącach występują liczne teksty "Okres zakończy się dnia: dd.mm.yyyy". Przydadzą się tutaj funkcje VBA Mid, Split i ostatecznie DateSerial, oto przykład:
Function ConvertLastToDate(c As String, StartDate As Date)
    
    Dim y, m, d, LastPiece As String
    Dim WrdArray As String
    Dim WordArray As Variant
    
'sprawdź czy termin realizacji jest wart numeryczną

    If IsNumeric(c) = False Then
    
    
    
        'odetnij  datę z Data zakończenia 31.12.2014 *)
        
            LastPiece = Mid(c, InStrRev(c, " ") + 1)
        
        'podziel na kawałki oddzielone kropkami
        
            WordArray = Split(LastPiece, ".")
            d = WordArray(0)
            m = WordArray(1)
            y = WordArray(2)
        
        'sklej w postaci daty excela
        
           EndDate = DateSerial(CInt(y), CInt(m), CInt(d))
        
        'odejmij od daty zakończenia i podaj w miesiącach
            
           ConvertLastToDate = (Year(EndDate) - Year(StartDate)) * 12 + (Month(EndDate) - Month(StartDate))
           
    ElseIf IsNumeric(c) = True Then
    
        ConvertLastToDate = CInt(c)
        
    End If
    

End Function

* Inne kombinacje odcinania lub pobierania odciętych kawałków tekstów z komórki:
Function GetLast(c As String)
    GetLast = Mid(c, InStrRev(c, " ") + 1)
End Function

Function CutOffLast(c As String)
    CutOffLast = Left(c, InStrRev(c, " ") - 1)
End Function

Function GetFirst(c As String)
    GetFirst = Left(c, InStr(c, " ") - 1)
End Function
cdn.

poniedziałek, 9 lutego 2015

C# underground...

Po intensywnym kursie, czas podtrzymać i rozszerzyć wiedzę:
1. Narzędzia: SharpDevelop w wersji starszej 4.3, działającej jeszcze w XP, w wersji przenośnej portableapps.com (ponoć pod linuxem będzie działać Xamarin Studio/Mono Develop). (Może też być nodepad++ i plugin https://csscriptnpp.codeplex.com/releases/view/611223)
2. Na youtube: Użytkownik kudvenkat oferuje naprawdę świetne kursy dla początkujących (serie C#, ASP.NET, Linq).
3. Android: do odtwarzania kursów w mp4 potrzebny jest pan i zoom: można uzyskać dzięki niepozornej aplikacji Picturen Lite.
Future:
?Nemerle (rozwinięcie języka C#): https://sites.google.com/site/gibekm/programming/nemerle