Przemyślenia powstałe podczas tworzenia programów w Clarionie.

sobota, 27 grudnia 2008

15 wskazówek do zwiększenia wydajności pracy z serwerem sql

Oryginalny artykuł dostępny jest pod adresem:
http://www.simple-talk.com/sql/performance/performance-tuning-tips-for-database-developers/

  1. Ustawiaj klucz główny, dla każdej tabeli którą tworzysz. Dopóki nie będziesz posiadał odpowiedniej wiedzy aby wymyślić coś lepszego, zadeklaruj go jako indeks klastrowy (warto pamiętać, że jeśli ustawimy klucz główny za pomocą narzędzia Enterprise Manager będzie on domyślnie tworzony z indeksem klastrowym).
  2. Każda kolumna, która przechowuje klucz obcy powinna posiadać indeks. Jeśli wiesz, że ten klucz będzie unikalny, wymuś na indeksie, aby też taki był.
  3. Nie indeksuj niczego więcej.
  4. Gdy odwołujesz się do obiektów w zapytaniach TSQL, zawsze podawaj kwalifikator ich właściciela (chyba że potrzebujesz innego rozwiązania). Korzystaj z DBO.SYSDATABASES zamiast samego SYSDATABASES.
  5. Na początku każdej procedury składowanej ustawiaj SET NOCOUNT (a na końcu SET NOCOUNT OFF).
  6. Dokładnie przemyśl potrzebę korzystania z blokad. Jeśli nie tworzysz oprogramowania bankowego, czy będzie miało znacznie jeśli wystąpi brudny odczyt (ang. dirty read)? Możesz zastosować NOLOCK, ale często dużo łatwiej jest ustawić na początku procedury SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, a następnie przywrócić ustawienia za pomocą READ COMMITTED na jej końcu.
  7. Pewnie słyszałeś już to milion razy, ale pobieraj tylko te kolumny i wiersze, których w danym momencie naprawdę potrzebujesz.
  8. Korzystaj z transakcji kiedy wydaje się to odpowiednie, ale nie pozwól żeby jakikolwiek użytkownik mógł wpłynąć na jej wykonanie. Osobiście staram się wykonywać wszystkie transakcje wewnątrz procedur składowanych.
  9. Jeśli tylko możesz, unikaj tabel tymczasowych. Jeżeli jednak będziesz ich potrzebować, twórz je wykorzystując jawne wywołanie CREATE TABLE #TEMP.
  10. Staraj się nie korzystać z NOT IN, zamiast tego stosuj LEFT OUTER JOIN. Nawet wtedy gdy łatwiejsze i czytelniejsze wydaje się wykorzystanie NOT IN.
  11. Jeśli upierasz się przy stosowaniu dynamicznego sql (konkatenacja stringów) wykorzystuj do tego nazwane parametry oraz SP_EXECUTESQL (zamiast EXEC), dzięki temu masz szansę na ponowne użycie planu wykonania zapytania (ang. query plan). Uproszczeniem byłoby powiedzieć, że procedury składowane są odpowiedzią na każdy problem, jednak z duża dozą prawdopodobieństwa można stwierdzić, że za ich pomocą nie da się zrobić czegoś źle.
  12. Wyrób w sobie nawyk kontrolowania swojego kodu przed oraz po każdej jego zmianie (narzędzie SQL Server Profiler). Mając na uwadze rodzaj wprowadzonych zmian, sprawdź czy wykorzystanie procesora, odczyty i zapisy serwera nie wzrosły o więcej niż 10-15%. Jeśli tak, to najprawdopodobniej procedura będzie wymagała przemyślenia.
  13. Jeśli to tylko możliwe, staraj się ograniczać liczbę zapytań kierowanych do serwera. Jedną z metod jest formułowanie zapytania tak, aby serwer za jednym razem zwrócił większy zbiór wyników.
  14. Unikaj stosowania wskazówek dla indeksów oraz złączeń.
  15. Kiedy skończysz pisanie kodu, ustaw program Profiler tak aby monitorował zapytania tylko z Twojego komputera, następnie uruchom swoja aplikację od początku do końca. Sprawdź liczbę zapisów oraz odczytów, a także liczbę odwołań do serwera. Postaraj się wychwycić nietypowe zachowania procedury. Bardzo często można zauważyć wywołania procedur już niewykorzystywanych albo wywołania podwójne. Postaraj się przeanalizować swoje spostrzeżenia razem z administratorem bazy.

Dodanie zer przed ciągiem znaków tak aby miał określoną długość

Aby dodać, np. zera przed ciągiem znaków tak aby cały ciąg miał 13 znaków, możemy posłużyć się następującymi instrukcjami:

SELECT RIGHT(REPLICATE('0', 13) + 'ciag', 13)

SELECT REPLICATE('0', 13 - CHARINDEX('.', 'ciag' + '.')) + 'ciag'

środa, 17 grudnia 2008

SQL ciag dalszy .... operacje na macierzach, łańcuchach znaków, zabawa z XML

Operacje na macierzach w SQL np mnozenie 2 macierzy o wymiarach 5x5 - robil to moze ktos z was na papierze ?
a w sql takie prosciutkie:

http://www.simple-talk.com/sql/t-sql-programming/sql-server-matrix-workbench/


polecam tez lekture innych artykułów z tej strony : http://www.simple-talk.com/default.aspx


Pierdoły o ktorych wiecznie zapominam

==========================================================
1. ComboBox - wybór z listy:
Zawartosc pola "From":
'Cywilny|#1|Grodzki|#2|Gospodarczy|#3'

==========================================================
2. Podstawowe metody easyExcel (nigdy mi sie nie chce szperac w dokumentacji):
EXLClass.Init(true,true,false) //Inicjowanie obiektu EE
(widoczny, pokazuj bledy, nowa instancja excela)
EXLClass.OpenWorkbook(sciezkadoexcela, false,,, true) //otworzenie istniejacego pliku
(sciezka, tylko do odczytu,haslo do otwarcia,haslo do zapisu,dodaj do ostatnio otwartych plikow, uaktualnienie linkow cokolwiek to znaczy)
EXLClass.AddWorkbook //nowy arkusz
EXLClass.SelectSheet(1) //wybor istniejacego arkusza
EXLClass.Write(2,1,'Lp.',false,true) //zapis do komorki 2 wiersz 1 kolumna
(wiersz, kolumna, wartosc, zapis bez formatowania, zaznaczanie komorki)
EXLClass.GetCell(2, 1, OdczytanaWartosc, Cell:Text) //pobranie wartosci z komorki
(wiersz, kolumna, wartosc, co zwrocic z komorki)
EXLClass.SelectRange(2,1,licznik+1,8) //zaznaczenie:
startrow,startcol,endrow,endcol
EXLClass.AutoFit //outodopasowanie wg ww. zaznaczenia

EXLClass.QUIT
EXLClass.Kill

=========================================================
3. Daty w excelu z Easy excel

EXLClass.Write(licznik,6,EXLClass.Date2Excel(TA:DataZwrotuWpisu),,false)
zapis - format(data,@d17)
odczyt - bez formatow

Zewnętrzny serwer SQL

czasami przyda sie przy transferach danych miedzy roznymi serwerami SQL:

EXEC sp_addlinkedserver
@server='nasza nazwa zdalnego',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='adres ip zdalnego'


exec sp_addlinkedsrvlogin
@rmtsrvname = 'nasza nazwa zdalnego - ta sama jak wyzej',
@useself = 'TRUE',
@locallogin = 'lokalny login do zdalnego',
@rmtuser = 'login do zdalnego' ,
@rmtpassword = 'haselko do zdalnego'

select * into [tabele na bierzacym serwerze] from testowy.baza.dbo.zdalnatabela


Jedna wazna uwaga - na lokalnym serwerze musimy byc zalogowani na sql Autentication
(windows logon nie dziala)

wtorek, 16 grudnia 2008

Programowianie w SQL ciekawa strona

Grzebiąc w sieci znalazłem miejsce gdzie jest opisane kilka ciekawych programików w SQL:

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1#1

wsród nich:
problem z dnia dzisiejszego w pracy jak w jendej kolumnie uzyskac zawartosc z wielu wierszy nie robiąc tego na kursorze.
Wypelnianie tabeli danymi ze zmiennej elementami oddzielonymi przecinkiem (skąd my to znamy ;))
Wyciecie ze zmiennej coś do jakiegoś znaku lub od jakiegoś nazku np wszystko do pierwszej spacji lub wszystko od ostatniej spacji

Przykład użycia instrukcji PIVOT

i wiele innych. Polecam lekturę

piątek, 5 grudnia 2008

Mind Manager

Skoro wspomniałem o VISIO chcialbym tez wspomnieć o Mind Manager. Uzywam tego programu od dluzszego czasu i sluzy mi do strukturalnego robienia notatek. Na pierwszy rzut oka jest to dosc trudne - wymaga przestawienia sie, ale po kilku dniach uzywania trudno sobie wyobrazic prace bez niego.
Wersja trial do pobrania http://www.mindjet.com/products/trials/default.aspx
Wersja Webowa :http://www.mindjet.com/products/mindmanager/web/default.aspx
przykladowe mapy (czyli notatki) mozna zobaczyc pod adresem: http://www.mindjet.com/resources/mapgallery/

Mysle ze na webową jestesmy w stanie namówic szefostwo ....

Microsoft VISIO

Sensowności stosowania nie muszę przedstawiać. Do domowego uzytku (i firmowych testów) można pobrać wersję 60 dniowa jest do pobrania spod adresu:
http://www.microsoft.com/poland/office/trial/default.mspx
trzeba sie tylko zarejestrowac i pobrac potem 200 MB instalkę. (Ewentualnie jest u mnie ;))


biorac pod uwage ze mniej wiecej co tyle czasu reinstaluje system to jest to wersja na caly czas istnienia mojej konfiguracji ;)

Standardy programowania - Wstęp

Dawno dawno temu w odległej galaktyce ... (tak to jest jak sie ciemne moce wpisuje jako backdoory). Dość dawno temu starałem sie ze znajomymi na bazie innego opracowania zastosować pewne zasady tworzenia programów. Obecnie chciałbym te zasady z Wami przedyskutować zmodyfikować i wdrożyć. Zapraszam do lektury i dyskusji.
Clarion for Windows
Development Standards
Revision 1.1PL 15.08.2005

By
Jim Morgan and Fred Schmitthammer
Wersja w języku polskim tłumaczona i weryfikowana przez
Olę Jańczak, Jacka Kosińskiego, Sławka Łopuszańskiego.
link do oryginału: http://www.clarionmag.com/col/98-04-c4devstandards.html?pFriendly=true
W odniesieniu do oryginału większośc propozycji zostało zmienionych, uwzględniono pomysły tak wielu ludzi z listy news.clarion.pik-net.pl, że trudno mi przypomnieć sobie, kto co proponował. Jednak wśród współautorów wymienić należy Piotra Rudnickiego, Mirka Sitarza oraz Grzegorza Siwca. Jeśli ktoś uważa, że powinien być wymieniony też na tej liscie to proszę o kontakt (kashiash@aip.pl).



Wprowadzenie
W dokumencie tym zajmujemy się zagadnieniami projektowania i programowania przy użyciu pakietu Clarion 4.x, i nowsze (obecnie 6.2). Dokument niniejszy bazuje na Zaleceniach Dla Programistów Interfejsu Windows – pozycji wydanej przez Microsoft Press. Wszelkich informacji nie zawartych w niniejszym dokumencie należy szukać w powyższej pozycji.
Standardy są ważne z wielu powodów. Dzięki korzystaniu ze wspólnego interfejsu użytkownika (UI) aplikacje stają się łatwiejsze do opanowania przez tegoż użytkownika. Spójne i proste projekty ekranów czynią pracę z nimi łatwiejszą i mniej stresującą. Pozwala to użytkownikowi na osiągnięcie lepszych rezultatów w korzystaniu z danego programu. Standardy programistyczne pozwalają grupie programistów na łatwiejszą współpracę w zespole. Używanie spójnego stylu kodowania zmniejsza ogólne koszty późniejszej konserwacji systemu, a także czyni łatwiejszym dokończenie czyjegoś programu bądź współużywanie bibliotek, które zostały stworzone przez innych.
Niektórzy twierdzą, iż standardy ograniczają kreatywność programistów i wymagają czasu w celu ich poznania i nauczenia się. Programiści mają jednak wiele możliwości wykazania się kreatywnością w ramach, narzuconych przez standardy. Standardów trzeba się nauczyć, to fakt, jednak zastosowanie standardowego podejścia do rozwiązywania problemów na ogół wielokrotnie rekompensuje czas, poświęcony na naukę. Ogólne korzyści, którymi są wydajność zespołu, wydajność użytkownika końcowego oraz niższe koszty konserwacji czynią stosowanie standardów niezbędnym w przypadku każdego projektu na tyle dużego, że konieczne jest zarządzanie nim.
To nie jest zamknięty dokument. Cały czas uczymy się lepszych metod. Zmiany technologiczne zachodzą ciągle. Standardy przemysłowe dotyczące UI zmieniają się również. Dokument niniejszy musi podlegać zmianom, by nadążać za bieżącymi potrzebami. Każda z osób posługujących się standardami może stworzyć propozycje zmiany, przedstawiając poniższe informacje osobie odpowiedzialnej:
Numer zmienianego standardu (lub propozycja nowego numeru).
Treść standardu
Argumentacja przemawiająca za przyjęciem nowego standardu
Argumentacja przemawiająca za odrzuceniem bieżącego standardu
Proponowane zmiany standardów zostaną rozprowadzone pośród członków komisji zajmującej się standaryzacją. Jeśli zmiany zostaną zaaprobowane, nowa wersja dokumentu zostanie udostępniona do pobrania. Obecna wersja powstała na bazie wersji sprzed 2ch lat i nowych doświadczeń, i jest w ciagłej modyfikacji wynikającej z braku czasu, postaramy sie zeby byla jak najbradziej aktualna - w koncu tylko w takiej postaci nadaje sie do wykorzystania.

Standardy programowania - Atrybuty okna

Ustawienie atrybutu centrowania dla wszystkich okien
Domyślne położenie bywa niepożądane, zwłaszcza w przypadku dużych okien.

Ustawienie atrybutu Entry Paterns dla wszystkich okien.
Pozwala na natychmiastową reakcje użytkownika.

Wszystkie okna projektowane w oparciu o siatkę 3 (szer.) X 3 (wys.). Opcja przyciągania do siatki powinna być włączona. Użyj “Options/Grid Settings” aby zmienić parametry siatki w Window Formatter.
Przyspiesza to równe ułożenie elementów okna.

Wszystkie okna powinny używać standardowego kroju Arial CE 8pt. Nie należy stosować kolorów ani stylów, chyba że jest to niezbędne.
To jest domyślne ustawienie Clariona dla Windows. Okna powinny być proste, jednolite i łatwe do prześledzenia.

Każda kontrolka, do której użytkownik ma dostęp powinna mieć przyporządkowany unikatowy klawisz skrótu.
Użyj znaku ‘&’ do określenia klawisza skrótu dla dostępu bez użycia myszy.

Każda grupa kontrolek powinna być obwiedziona prostokątem (group box).
Grupuj skojarzone tematy ze sobą, gdy w ramach zakładki istnieje kilka grup.

Wszystkie opisy pól i wskazówki powinny być wyrównane do lewej strony.
Spójność.

Każdy ekran powinien mieć przypisany identyfikator pomocy (Help ID).
Używany do tworzenia haseł pomocy dla danego ekranu.

W tekstowych opisach pól czy elementach menu stosuj Wielkią literę na początku wyrażenia, pozostałe wyrazy z małej. Po każdym opisie umieszczaj dwukropek (np.’Kod pocztowy:’).
Kombinacja wielkich i małych liter jest łatwiejsza do przeczytania.

Typ obramowania: używaj generalnie ‘Single’, jednak dla okienek modalnych stosuj ‘Double’ a dla okienek przeglądania (Brwowsy) używaj ‘Resize’.
Pozwala to na optyczne rozróżnienie okienek różnych typów.

Maximize Box zaznaczamy tylko na oknach, których podstawowym elementem jest lista (browse), na pozostałych tj. formatkach itp. ta opcja powinna być wyłączona.


Zaznaczamy opcję System Menu

Standardy programowania - Atrybuty obiektów

Każdy przycisk paska narzędzi powinien mieć przyporządkowaną ikonę i ‘dymek’ podpowiedzi.
Spójność.

Każdy przycisk na formularzu powinien mieć ikonę oraz tekst.
Spójność.

Każde pole powinno mieć przypisany atrybut komunikatu.
Kreator tworzy ‘dymki’ automatycznie, jeśli opis pola jest w słowniku.

Każda zmienna przypisana do danego pola powinna mieć nazwę analogiczną do nazwy pola (np. ?pat:Fname)
Kod samodokumentujący się.

Nazwa każdej zmiennej przypisanej do opisu pola powinna składać się z nazwy pola, dwukropka i słowa PROMPT. (np. ?pat:Fname:Prompt)
Kod samodokumentujący się.

Nazwa każdej zmiennej przypisanej do opcji menu powinna składać się z przedrostka Mnu i nazwy wywoływanej procedury. (np. ?MnuBrwKlienci)
Kod samodokumentujący się.

Nazwa każdej zmiennej przypisanej do przycisku powinna składać się z przedrostka Btn i nazwy wywoływanej procedury (np. ?BtnBrwKlienci )
Kod samodokumentujący się.

Używaj checkboxów do opcji typu ‘Tak/Nie’. Do opisu używaj zdań twierdzących.
Spójność.

Używaj list rozwijanych typu combo-box zamiast przycisków opcji.
Spójność.
akurat ten punkt przydaloby sie przedyskutowac, co prawda chceboxy zajmuja wiecej miejsca ale program jest bardziej czytelny bo od razu widac co user ma wybrac - JK
Każdy przycisk ze skojarzonymi plikami potomnymi powinien zawierać szablon Child Files. (dostepny w klubowych szablonach)
Spójność.

Tekst etykiet (prompt) jest czarny, pisany z dużej litery i na takim samym tle jak okno.
Spójność.

Kolor czerwony (red) zarezerwowany jest dla celu podkreślenia w księgowości kwot (liczb) ujemnych.
Spójność.


Rozmiary

Wszystkie elementy okienka powinny używać ustawień danego okienka dla kroju, rozmiaru i stylu czcionki.
Spójność.

Wszystkie przyciski powinny mieć jednakowe rozmiary, domyślnie 48(szer.) X 16(wys.). Można użyć szerszych przycisków, gdy konieczne jest użycie dłuższego opisu.
Spójność.

Przyciski paska narzędzi powinny mieć jeden z dwóch rozmiarów: 24(s) X 22(w.) albo 32(s.) X 30(w.). Ikona przycisku powinna mieć rozmiary 16 X 16 lub 24 X 24.
Spójność.

Wszystkie pola tekstowe, spinboxy, i listy rozwijane powinny mieć ustawiony atrybut rozmiaru na ‘Default’. Ustawienie jest dostępne w sekcji ‘Position’ właściwości pola. Spowoduje to uzyskanie pól o wysokości 10 jednostek dla fontu 8-punktowego.
Spójność.

Wszystkie opisy pól powinny mieć ustawiony atrybut rozmiaru na ‘Default’. Ustawienie jest dostępne w sekcji ‘Position’ właściwości opisu. Spowoduje to uzyskanie opisów o wysokości 9 jednostek dla fontu 8-punktowego.
Spójność.
(te rozmiary na default warto sprawdzic, bo oryginalna dokumentacja byla pisana do MS San Serif, a teraz uzywamy Arial CE- JK
Przyciski VCR Buttons mają rozmiary 12 X 12.
Spójność.

Eliptyczne przyciski używane do wyszukiwania w bazie powinny mieć rozmiar 12W x 12H. Powinny mieć ikonę lookup’u i ‘dymek’ z opisem.
Spójność.


Rozmieszczenie

Wszystkie elementy okien dialogowych powinny być oddalone o 6 jednostek ( czyli dwa kroki siatki) od górnej bądź dolnej krawędzi okna. Wszystkie kontrolki powinny być również oddalone o 6 jednostek od spodu arkusza i od góry następnego pola. Pierwszy element na arkuszu powinien również być oddalony o 6 jedn. od spodu bądź góry arkusza.
Spójne, przejrzyste i wizualnie wyrównane okienka.

Wszystkie pola powinny być oddalone w pionie o 3 jedn. (1 krok siatki) i w poziomie o 6 jedn. (2 kroki siatki) od sąsiednich pól..
Spójne, przejrzyste i wizualnie wyrównane okienka.

Górna krawędź opisu pola powinna być umieszczona 3 jednostki (1 krok siatki) poniżej górnej krawędzi odpowiedniego pola. Opis powinien zawsze kończyć się dwukropkiem.
Spójne, przejrzyste i wizualnie wyrównane okienka.
To jest łatwe jak na promptach uzywa się rozmaru default, wtedy ich wysokośc jest mniejsza i ten punkt wtedy latwo wdrozyc – w wierszu rownac kontrolki i prompty w dół.
Wszystkie kontrolki powinny być wyrównane do lewej krawędzi okna. Przyciski stanowią wyjątek.
Spójne, przejrzyste i wizualnie wyrównane okienka.

Wszystkie kontrolki powinny być umieszczone w arkuszu właściwości formatera okienek, z wyjątkiem ogólnych przycisków, jak OK., Anuluj, Zamknij czy Pomoc, dotyczących całego okna.
Spójne, przejrzyste i wizualnie wyrównane okienka.

Nazwy ikon powinny być samoopisujące i spójne. (np., ok.ico dla ikony przycisku OK).
Spójność i łatwość zamiany ikon w całym systemie jednocześnie.
Nawet jeśli nie masz w danej chwiuli odpowiedniej ikony, wymysl dla niej nazwę taką wpisz w clarionie i skopiuj kontrolke cancel.ico pod tą nazwę. Wlasciwą ikonkę dobierzesz w przyszłości.
Wszystkie typowe przyciski powinny zawierać swoją własną ikonę. Ta opcja dostępna jest pod zakładką Extra na ekranie właściwości przycisku.
Spójność.

Wszystkie elementy okna powinny być umieszczone jeden pod drugim w pionie.
Spójność i łatwość odświeżania wyświetlanego ekranu.

Elementy powiązane ze sobą będą oddalone od siebie o 6 jednostki w poziomie i 3 jednostki w pionie (odp. 2 i 1 krok siatki). Elementy niepowiązane ze sobą będą oddalone od siebie o 9 jednostek w poziomie i 6 jedn. w pionie (odp. 3 i 2 kroki siatki).
Spójne, przejrzyste i wizualnie wyrównane okienka.

Jeśli na oknie występuje tylko jedna zakładka (General), to powinna być wyeliminowana. Jedynym wyjątkiem są okienka przeglądania danych, na których zakładka wskazuje sposób sortowania danych.
Spójne, przejrzyste i wizualnie wyrównane okienka. Uwaga: można to łatwo osiągnąć w kodzie źródłowym ekranu.

Przyciski powinny być umieszczone pod poziomo arkuszem, albo ułożone jeden nad drugim przy fragmentach, których dotyczą wykonywane przez nie akcje.
Spójne, przejrzyste i wizualnie wyrównane okienka

Przyciski poleceń odnoszące się bezpośrednio do wyświetlanych danych są zawsze umieszczane w dolnej części okna zaczynając od prawej strony przyciskiem 'Pomoc' lub w jego braku przyciskiem 'Zamknij'. Przyciski wywołujące tzw. potomków czyli okna zawierające dane podrzędne (podporządkowane) bieżącym umieszczane s± zawsze z lewej strony okna, zaczynając od góry.


Jeśli na danym ekranie znajdują się dwa lub więcej elementów typu lista (browse), to ich kolejność w zależności od hierarchii jest od góry do dołu i od lewej do prawej, a przyciski i opisy s± rozmieszczane wg wyżej wymienionych zasad w stosunku do właściwej dla nich listy (browse'a).

Standardy programowania - Wydruki

Nazwa procedury z wydrukiem to Rep.
Spójność

W menu głównym powinna być przewidziana opcja 'Wydruki', do której
powinny być 'podwieszane' wszystkie aktualne wydruki wywoływane z danego okna (nie mylić z zestawieniami - zestawienie zawsze generuje wydruk, nigdy nie zachodzi zdarzenie odwrotne).


Tytuł raportu wyrównany do lewej czcionka 14 punktów pogrubiona
Spójność

Na kazdym wydruku w stopce należy umieścić date i godzinę utworzenia raportu oraz numer kolejny strony. Najlepiej wykorzystać gotowe szablony dostarczane z Clarionem.
Spójność

Kolumny separować prostokatami a nie liniami, nie uzywać cieniowania w nagłówkach


Kazda strona powina mieć 1/2 calowy górny i boczny margines oraz 3/4 cala na dole strony.
Unikniemy obcinania stron na niektórych drukarkach

W opcjach konfiguracji wskazane jest umożliwienie przesunięcia wydruku względem strony przez uzytkownika końcowego


Na raportach uzywamy jednostek 1/1000 cala
Daje najwieksze pole manewru.

Standardy programowania - Struktury danych

Klucze mają przedrostek Key. (np KeyNazwaKontrahenta). Klucze unikalne mają przedrostek nie Key, ale UKey, np. UkeyPesel
Spójność

Wszystkie pliki powinny mieć nastepujace pola:
ID. DataModyfikacji, CzasModyfikacji, IDOperatora_fk
Normalizacja danych

Kazdy plik powinien miec nastepujace indeksy:
- KeyIDKey który ma ustawione opcje: Auto Incrementing, Unique, Primary Key. W kluczu tym umieszczamy pole ID
- KeyModified, bez żadnych. W kluczu tym umieszczamy pola: IDOperatora_fk, DateModified, TimeModified.
Normalizacja danych

Pliki będące w relacji powinny być powiązane za pomoca pól ID . Pola te powinny byc zadeklarowane w obu plikach, w pliku z kluczem obcym z końcówką ‘_fk’. Relacja powinna miec ustawiona kontrole integralności na cascade lub restrict.Pola ID nie mogą być modyfikowane przez uzytkownika. Klucze obce w nazwie mają końcówkę "_fk".
Integralność

Przy definiowaniu słowników należy zwrócić szczególną± uwagę na wykorzystanie przy definiowaniu pól opcji:
Derived From służącej do dziedziczenia definicji pola
Do Not Auto-Populate This Field dla pól (np. typu ID), które nie powinny się z automatu pojawiać na ekranach i raportach - musi to być świadoma decyzja.
Jednocześnie zwracam uwagę, aby nie odpuszczać sobie wypełniania pozycji Description, Prompt Text, Column Heading, Message
Przy korzystaniu z opcji Derived From należy zwrócić uwagę na to, by
dziedziczenie odnosiło się we wszystkich przypadkach w ramach jednego słownika do jednego macierzystego pola, ponieważ w przypadku zastosowania łańcucha dziedziczeń opcja Refresh Dictionary obsługuje tylko jeden poziom zagłębienia. W przypadku łańcucha należałoby j± uruchomić tyle razy ile ogniw liczy łańcuch.


We właściwościach bazy należy obowiązkowo wybrać opcję OEM oraz zalecane jest stosowanie opcji Open in Current Thread, która to opcja powoduje zarezerwowanie w każdym wątku bufora dla bazy czyli faktycznie umożliwia pracę wielowątkową na tej samej bazie.


Przy definiowaniu zmiennych i pól należy zwrócić uwagę na następujące atrybuty:
i. Initial value - można tu nawet wpisywać funkcje i dzięki właściwej definicji oszczędzić sobie pracy z inicjowaniem danych poprzez wstawki w kodzie źródłowym
ii. Values - można dzięki właściwej definicji oszczędzić sobie pracy przy późniejszej obróbce jako, że wartości są całkowicie niezależne od zawartości pola Choices


Typy danych
Typ Danych SQL Topspeed Driver
ID LONG. ULONG,
Czas
Przechowywane jako cstring(8). Maska @t3.
Przechowywany jako Long. Maska @t3 lub @t6 gdy należy pokazywać sekundy.
Daty
Przechowywany jako cstring(11)
Przechowywany jako Date. Maska d17.
Strings
Zawsze jako cstring.
Zawsze jako cstring.
Memo
Duże pole cstring
Duże pole cstring
Groups
Nie uzywane w plikach
Nie używane w plikach

Kwoty
Decimal, n@16_’2
Decimal, n@16_’2
TAK/NIE
Byte(0,1) lub
Byte(0,1)
Generalnie: Nie stosować liczbowego picture, w którym grupowanie tysięcy następuje
przecinkiem (chyba domyślny - używać spacji, np. nie n10.2 - ale n10_.2


Wydaje się słusznym opracowanie własnej puli typów i używanie ich podczas definiowania tablic w słowniku

Standardy programowania - Pisanie kodu

ZŁOŻONE PROCEDURY POWINNY BYĆ PISANE JEDNOKROTNIE. Jeśli musisz odwoływać sie wielokrotnie do skomplikowanych obliczeń etc., zrób z tego funkcję, routine, lub szablon. Za złożone wyrażenia przyjmij takie gdzie jest więcej niż 2 linijki tekstu lub ponad 100 znaków.
Utrzymanie i konserwacja

Unikaj pisania całego wyrażenia IF end w pojedynczej linii.
Łatwość śledzenia

Zmienne globalne z prefixem GLO, bez ":" na końcu !
Spójność

Zmienne lokalne bez prefiksu LOC
Spójność

Kod oprócz etykiet powinien rozpoczynać sie w 3 linii. Wcięcia dla wyrażeń kończonych komendą END, 2 spacje. (Accept, Loop, If, Case, Execute)
Spójność

Używaj END !Wyrażenie zamiast kropki na końcu. np.:
Accept
Loop While Something = True
Case ActionCode
OF AddRecord
Do AddRoutine
OF ChangeRecord
Do ChangeRoutine
Else
Do DefaultRoutine
End !Case ActionCode
If Expression = True
And SomethingElse > LowValue
Another Expression
End!If Expression = True ...
End !Loop While Something = True
End !Accept
Łatwość czytania i analizowania

Wyrażenia logiczne powyżej 5 poziomów zagnieżdżeń powinny być w osobnych routinach.
Łatwość czytania i analizowania

Zalecana maksymalna wielkośc routine to 40 linii
Łatwość czytania i analizowania

Wszystkie wyrażenia powinne być w trybie twierdzącym. Nie używać NOT.
Łatwość czytania i analizowania

Uzywaj <> jako “różne od”.
Spójność

Nie używaj średników, nie umieszczaj kilku instrukcji w jednej linii.
Łatwość czytania i analizowania

Unikaj pisania linii kodu powyżej 80 kolumny. Użyj aby kontynuować pisanie kodu w następnych liniach. Jeśli kontynuujesz wyrażenie w komendzie IF przesuń następna linię o 1 spację.
Łatwość czytania i analizowania

Umieść co najmniej po jednej spacji przed i po znaku = . Użyj więcej znaków aby wyrównać znaki = w większych fragmentach instrukcji przypisania.
Łatwość czytania i analizowania

Używaj Like kiedy definiujesz zmienne ze sobą powiązane.
Utrzymanie

Często używaj pustych linii w celu odseparowania różnych fragmentów kodu .
Łatwość czytania i analizowania

Umieszczaj skomentowane linie (!-----) o długości 80 znaków na początku i końcu każdej podprocedury (routine), procedury, oraz w celu oddzielenia powiązanych fragmentów danych.
Łatwość czytania i analizowania

Kod powinien być czytelny i samodokumentujący. Komentarz powinien być umieszczony w tej samej linii dla każdego nietrywialnego wyrażenia. Każda procedura powinna być opisana z podaniem nazwy autora, daty utworzenia i modyfikacji. Informacja te powinna być uaktualniane przy każdej modyfikacji tej procedury.
Łatwość czytania i analizowania, utrzymanie

Należy używać kodu OOP, zgodnego ze standardem ABC Templates.
Utrzymanie

Umieszczaj jedną podprocedurę (routine) we wstawce (embed). Pierwsza linia powinna zawierać nazwe podprocedury i krótki jej opis. W dalszych liniach powinien być dokładny opis tego co podprocedura wykonuje.
Łatwość czytania i analizowania

Po operacjach I/O należy sprawdzać errorcode().
Unikanie błędów.



Nazewnictwo
Standard
Komentarz

Nazwy zmiennych powinny być oczywiste (należy unikać skrótów) skróty są akceptowalne przy nazwach dłuższych niż 20 znaków.
Self-documenting code.

Wszystkie pliki powinny mieć nazwy 16 bitowe (8+3 znaków). Wewnątrz programu nie używamy nazw długich, jednak program musi umożliwiać wprowadzanie i przechowywanie długich nazw plików.

Kompatybilność wstecz.


Nazewnictwo procedur
Browse
Brw
Form
Frm
Frame
Main
Process
Pro
Report
Rep
Source
Src
Splash
Spl
Viewer
Vie
Window
Win


Spójność

Nazwy procedur w menu (tzw. MenuText) jeśli aplikacja ma polski interfejs, jest polskojęzyczna to nie można stosować nazewnictwa nazw własnych oraz form rozkazujących zamiast imiesłowowych, np. "Wpisz AkcjeReklamowezZamówieńDoFaktur", powinno być "WpisanieAkcjiReklamowychZZamówienDoFaktur".






Standard
Komentarz




Nazwy zmiennych powinny być oczywiste (należy unikać skrótów) skróty są akceptowalne przy nazwach dłuższych niż 20 znaków.
Self-documenting code.

W modułach aplikacji kompilowanych jako *.dll wszystkie procedury są podłączone do lokalnego Menu (procedura typu Frame); nazwa procedury Menu pochodzi od nazwy aplikacji (modułu app, np. MenuDokumenty, MenuRaporty,MenuAdmin).

Subversion i Tortoise SVN

Od poniedziałku 1 grudnia 2008 zaczeliśmy używać Subversion do kontroli zmian w projekcie forum. Do tego czasu proszę wysłać wszystkie dotychczasowe zmiany do Krzyska Jachorka w celu przygotowania wersji wyjściowej do naszego archiwum.
Aby pracować z systemem kontroli wersji należy zainstalowac TortoiseSVN dostępny na komputerze krzyska file://192.168.12.73/ … Applications\SUBVERSION_Instalki\
Poniżej wyciąg z artykułów dotyczących SVN oraz Tortoise z którym należy się zapoznac. Sugeruje lekturę artykułów do których linki podalem na koncu maila.
W przypadku jakichkolwiek pytań walić smiało … "stoję do was otworem" jak mawiał jeden z moich dawnych wykładowców.

Z czasem będzie tu opis mojego autorstawa jak to wszystko ze soba pokonfigurować i uzywać, chwilo z braku chęci wkleję fragmenty tego co znalazłem w sieci wraz z linkami gdzie to znalazłem.


Codzienna praca z systemem SVN
Praca w systemie SVN sprowadzi się do cyklicznego powtarzania pewnych poleceń. Najpierw, w zależności od twojej roli w projekcie, wykonasz bądź instalację nowego projektu (np. wykorzystując operację svn import), bądź pobierzesz aktualny stan projektu (operacja svn checkout). Podczas codziennej pracy będziesz wykonywał:
• operację svn update w celu pobrania najnowszych zmian w projekcie
• poddasz dowolne pliki edycji oraz wykonasz liczne operacje na plikach i katalogach (svn add, svn delete, svn move, itd.)
• wykonane zmiany prześlesz na serwer (svn commit)
Pamiętaj, że update oraz commit są operacjami niezależnymi. Wykonanie update nigdy nie pociąga za sobą automatycznego wykonania commit i na odwrót: wykonanie commit nigdy nie pociąga za sobą automatycznego wykonania update.
Kopiuj
Najpierw wykonaj kopię plików z serwera. Proces ten polega na przekopiowaniu aktualnej wersji oprogramowania na twój dysk. Otrzymana kopia jest niezależna od serwera: możesz na niej pracować, wykonując dowolne zmiany. Kopię wykonuje się poleceniem checkout (skrót: co):
1. svn checkout http://...
2. svn co http://...
klienta tekstowego lub przy użyciu opcji SVN Checkout... programu TortoiseSVN.
Modyfikuj
Modyfikacje plików projektu możesz wykonywać dowolnym edytorem. Otwierasz plik, zmieniasz zawartość i zapisujesz. Nie ma znaczenia oprogramowanie, jakie stosujesz do edycji pliku, rozszerzenie pliku czy ilość zmian. Plik możesz otworzyć wielokrotnie i zmieniać w dowolnych miejscach. Jeśli chcesz do projektu dodać nowe pliki, nie możesz tej operacji wykonać w standardowy sposób. Pliki utworzone eksploratorem Windows nie są automatycznie dodawane do projektu, nawet jeśli są umieszczone w jednym z folderów kopii roboczej. Do tego służą polecenia add:
svn add ...
oraz opcja TortoiseSVN > Add klienta graficznego. Po utworzeniu nowego pliku lub folderu musisz koniecznie wykonać operację svn add lub Tortoise- SVN > Add.

Podobne ograniczenia dotyczą wszystkich operacji na plikach i katalogach. Operacje na plikach i katalogach należy wykonywać poleceniami:
• svn add - dodawanie plików, katalogów i linków
• svn copy - kopiowanie plików i folderów
• svn delete - usuwanie plików i folderów
• svn mkdir - tworzenie nowego folderu
• svn move - przenoszenie pliku lub folderu
Scal
Scalenie lokalnych zmian z wersją przechowywaną na serwerze wykonasz poleceniem commit (skrót ci):
1. svn commit ...
2. svn ci ...
Listing zwinięty - 2 linii
lub korzystając z opcji SVN Commit programu TortoiseSVN.
Dodatkowe operacje i możliwości Subversion
Update
Jeśli pracowałeś już na danym projekcie, wówczas nie ma potrzeby wykonywania operacji checkout. W takim przypadku wystarczy operacja update:



svn update ...
dostępna w postaci opcji SVN Update programu TortoiseSVN. Operacja ta gwarantuje, że lokalna kopia robocza projektu będzie zgodna z zawartością na serwerze.
Import
Szczególnym sposobem dodawania plików do projektu jest import. Operacja ta jest przydatna w początkowej fazie pracy nad projektem w systemie SVN. Jeśli projekt, który składa się już z wielu plików i folderów, zamierzasz poddać kontroli systemem SVN, wykorzystaj operację import.
Najpierw utwórz nowy pusty projekt SVN o nazwie template, przechowywany w folderze C:svnrepositorytemplate i dostępny poprzez URL http://localhost/svntemplate. Następnie kliknij prawym klawiszem myszy na folderze zawierającym potrzebne pliki. Z menu kontekstowego wybierz operację TortoiseSVN > Import.
Zostanie wyświetlone okno dialogowe importu. Wprowadź w nim adres URL, pod jakim projekt będzie dostępny: http://localhost/svntemplate.
Na zakończenie wczytaj w przeglądarce internetowej adres http://localhost/svntemplate. Ujrzysz projekt o numerze rewizji 1, zawierający wszystkie pliki, jakie znajdowały się wewnątrz folderu. Podczas korzystania z klienta tekstowego import przeprowadza się, korzystając z komendy:



svn import ...
Operacja import powoduje dodanie wszystkich plików i folderów do projektu (czyli wykonanie operacji add) i przesłanie wprowadzonych zmian na serwer (czyli wykonanie operacji commit).

I z innego artykułu

a) Dodanie pliku Pliki dodajemy za pomocą polecenia:svn add [plik(i) lub folder(y)]Po wykonaniu tej komendy pliki zostaną oznaczone jako oczekujące na dodanie. Rzeczywiste dodanie nastąpi w momencie najbliższego commitu. Jeśli wskazany został folder cała jego zawartość również zostanie dodana do repozytorium.Foldery możemy także utworzyć za pomocą poleceniasvn mkdir [folder]Jeśli utworzymy pliki normalnymi poleceniami systemu i nie dodamy ich za pomocą svn add nie będą wersjonowane! b) Usunięcie pliku Pliki usuwamy za pomocą:svn delete [plik(i) lub folder(y)]Jeśli wybrany został plik natychmiast zniknie on z kopii roboczej, jeśli folder to zostanie on (i jego zawartość) oznaczone jako do usunięcia. Rzeczywiste usunięcie plików z repozytorium nastąpi, podobnie jak w przypadku svn add dopiero przy najbliższym commicie. Jeśli skasujemy plik normalnymi poleceniami systemu a nie za pomocą svn delete zostaną ponownie pobrane z repozytorium przy najbliższym update. Warto o tym pamiętać - jeśli coś solidnie popsuliśmy wystarczy skasować "popsuty" plik lub folder i wykonać update by móc cieszyć się poprzednią wersją pliku.c) Przenoszenie i kopiowanie plików Wykonujemy za pomocą poleceńsvn move [źródło] [cel] svn copy [źródło] [cel] Co najważeniejsze SVN "pamięta" całą historię kopiowanego pliku. Podobnie jak w przypadku dodawania i kasowania plików trzeba wykonać commit by zmiany zostały zapisane w repozytorium.d) Dokonywanie zmian w plikach W wypadku zwykłych zmian w plikach nie musisz używać żadnych specjalnych komend Subversion. Po prostu edytujesz pliki w swoim ulubionym edytorze.3) Sprawdzenie jakie zmiany zostały dokonane Przed wysłaniem wyniku swojej pracy do repozytorium warto sprawdzić co tak na prawdę zmieniliśmy. Co najważniejsze wszystkie przedstawione w tym punkcie komendy nie wymagają połączenia z repozytorium. Wszystkie potrzebne dane znajdują się w katalogach .svn Do tego celu możemy wykorzystać:a) Wykaz zmian Wykaz wszystkich zmienionych plików i folderów otrzymamy za pomocą polecenia:svn statusZwrócona zostanie lista plików poprzedzona sześcioma kolumnami informującymi o rodzaju zmian. Nas na razie interesuje jedynie pierwsza kolumna zawierająca oznaczenia podobne do tych poznanych w komendzie svn update I tak: A - element przygotowany do dodania, D - element przygotowany do skasowania, U - element zmodyfikowany, R - zamieniony (element został przygotowany do skasowania a następnie został utworzony nowy o tej samej nazwie), ? - element nie podlegający wersjonowaniu (na przykład plik dodany normalnymi metodami a nie za pomocą svn add), ! - brakujący element (na przykład skasowany normalnymi metodami a nie za pomocą svn delete)b) Wyszczególnienie zmian w pliku Czasem może się zdarzyć, że nie pamiętamy jakich zmian dokonaliśmy w pliku. Pomocne wtedy jest polecenie:svn diffZwraca ono listę zmian w plikach w formacie unified diff format4) Cofnięcie zmian Dopóki nie dokonaliśmy commitu możemy łatwo cofnąć wprowadzone w kopii roboczej zmiany. Używamy polecenia:svn revertsvn revert [nazwa pliku]Polecenie bardzo przydatne jeśli przez pomyłkę skasowaliśmy jakiś plik lub rozmyśliliśmy się jeśli chodzi o zmiany.5) Pobranie aktualnych wersji plików Tak, tak. Po raz kolejny wykonujemy update by sprawdzić czy nikt inny nie dokonał zmian w tych samych plikach co my. W większości wypadków Subversion bez problemu poradzi sobie z wprowadzeniem odpowiednich zmian. Problem pojawi się gdy okaże się, że ktoś edytował ten sam fragment pliku co my. Subversion nie jest w stanie samemu zaktualizować pliku i pojawia się konflikt (pamiętacie literkę 'C' w svn update?)6) Rozwiązywanie konfliktów W momencie powstania konfliktu Subversion tworzy 3 nowe pliki i modyfikuje plik będący w konflikcie. Trzy nowe pliki to:plik.mine - wersja pliku z naszymi zmianamiplik.rOLDREV - gdzie OLDREV to numer rewizji sprzed naszych zmianplik.rNEWREV - gdzie NEWREV to numer rewizji aktualnej wersji w repozytorium (ze zmianami wprowadzonymi przez kogoś innego)W pliku będącym w konflikcie dopisane zostają dodatkowe linijki z zaznaczonym konflikotwym fragmentem w formie:linia niezmieniona<<<<<<< .minelinia zmieniona przeze mnie=======linia zmieniona przez kogoś>>>>>>> .rNEWREVlinie niezmienionaPo skontaktowaniu się z osobą, która wprowadziła swoje zmiany poprawiamy plik by zawierał ostateczną wersję (edytując go odpowiednio lub używając jednego z 3 plików jako wzoru) i wykonujemy polecenie:svn resolved [nazwa pliku]Subversion przygotuje plik i konflikt zostanie rozwiązany przy najbliższym commicie. Przy okazji skasowane zostaną trzy dodatkowe pliki (.mine, rOLDREV, .rNEWREV)7) Wysłanie zmian do repozytorium Gdy mamy już aktualne wersje plików i nie ma konfliktów wreszcie możemy wysłać zmiany do repozytorium za pomocą polecenia:svn commitPrzy wysyłaniu commitu musimy dodać komentarz z opisem, który zostanie dołączony do logów. Jeśli użyjemy polecenia commit w formie jak powyżej otworzy się domyślny edytor tekstu, w którym możemy wpisać komentarz. Możemy również użyć polecenie w formie:svn commit -m "treść komentarza"Rzecz jasna by wykonać to polecenie musimy nawiązać połączenie z repozytorium. W tym momencie możemy rozpocząć nasz cykl pracy od początku.


Dla bardziej ambitnych linki skąd wyczytałem powyższe
http://svnbook.red-bean.com/nightly/en/svn-book.html
http://pl.wikipedia.org/wiki/System_kontroli_wersji
http://pl.wikipedia.org/wiki/Subversion
http://kosciak.blox.pl/2007/11/Wersje-pod-kontrola.html
http://serwis.magazynyinternetowe.pl/artykul/697,1,0,subversion_-_system_kontroli_wersji.html
http://jakilinux.org/aplikacje/subversion--dla-kazdego
http://www.programuj.com/artykuly/rozne/subversion.php
http://subversion.tigris.org/faq.html
http://www.maciejaniserowicz.com/post/2008/06/02/Kontrola-wersji-w-5-minut.aspx
http://clarionmagazine.com/cmag/v7/v7n05tortoise.html

Kilka ciekawych linków dotyczących Clariona

Producent
http://www.softvelocity.com

Płatny magazyn internetowy Clarion Magazine
http://clarionmagazine.com/

Clarion Central - skarbnica linków dotyczących clariona - jeśli coś się pojawiło o clarionie to najprędziej link do tego będzie tutaj:
http://www.outsidetrains.com/cc/

Szablony można kupić tutaj:
http://clarionshop.com/

Serwer newsów:
http://news.softvelocity.com/
Sugeruję używanie przez Outlook ekspress lub inny programik do newsów, wchodzenie przez www wymaga hasła (numerek seryjny clariona - bez literek i myslnika - do odczytania z pliku c6ee.ini w katalogu bin)

Kilka ciekawych linków dotyczących SQL

Trochę informacji o tym jak optymalizować serwer i kod w skryptach SQL
http://www.sql-server-performance.com/index.aspx
jeśli na powyższej stronie coś wyczytacie to wklejajcie tutaj

Ciekawe narzędzia do SQL np do porównywania baz danych
http://www.red-gate.com/index3.htm

Startujemy

Rozszerzenie naszego zespołu programistycznego spowodowało ze pewne rzeczy zaczynają nam umykać. Dodatkow wiele rzeczy zapominam powiedzieć wiele musze powtarzać każdemu z osobna, a wiele odkrywacie Wy i macie podobny dylemat co począć z własnie zdobytą wartościową wiedzą.
Wykombinowałem, że dobrym pomysłem bedzie zrobienie strony gdzie bedziemy zapisywać takie rzeczy. Niestety narazie nie mamy czasu i serwerz zeby coś takiego postawić u siebie w firmie. W dodatku do firmy nie zawsze jest dostep i dostepnośc takiego serwera do tego typu informacji wskazana jest bardziej otwarta. Dlatego wybrałem Googla.
Chciałbym, żebyście też pisali tutaj, szczególnie wtedy gdy odkryjecie jakąś fajną rzecz w clarionie, zrobicie cos co jest odkrywcze, czy znajdziecie gdzieś w internecie wartościowe podpowiedz, biblioteki czy narzędzia. Innymi słowy, jeśli macie coś, co wg Wasmoże nam pomóc w pracy, piszczcie o tym tutaj.

Współtwórcy