SQL Query - Kilka praktycznych zapytań

SQL Query - Kilka praktycznych zapytań
pstmax
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Reda
  • Postów:68
0

Witam, teraz ja założyłem wątek i liczę na odrobinę dobrej woli i współpracy. Użytkuję "darmową" wersję Embarcadero® Delphi Community Edition 10.3.3, i mam parę pytań odnośnie zapytań SQL, a w szczególności ADOQuery.

  1. Czy mogę przechowywać w ADOQuery.SQL listę wszystkich zapytań i odwoływać się do nich po indeksie? W znalezionych przeze mnie prostych przykładach wszędzie mają po jednym wpisie.
  2. Chciałbym wykorzystać komponent ValueListEditor (Opis dla użytkownika | Polecenie SQL) - to oczywiście w opcjach programu, a użytkownik w programie będzie miał pole ComboBoxList w którym wybierze za pomocą przyjaznego opisu odpowiednie polecenie. I pytanie czy do ADOQuery muszę za każdym tylko jedno polecenie, czy mogę załadować wszystkie i odwoływać się po indeksie?

Oczywiście mam do wszystkich prośbę aby podzielili się informacjami o praktycznym wykorzystaniu QUERY nie koniecznie dla ADO - z góry dziękuję.


Piotr Strzemkowski
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 21 godzin
  • Postów:1595
3

Zasadniczo ADOQuery.SQL to nic innego jak TStrings możesz zatem dodawać wiele stringów ale dalej będzie to jedno zapytanie. Jak zrobisz takie coś:

Kopiuj
    ADOQuery1.SQL.Add('select * from dual');
    ADOQuery1.SQL.Add('union');
    ADOQuery1.SQL.Add('select * from dual');
    Caption := ADOQuery1.SQL[1];

to w caption pojawi ci się napis 'union' natomiast ADOQuery1.Open uruchomi całe zapytanie.

Jeśli chcesz w jednym komponencie uruchamiać różne query to zapronowałbym zwykły TList<string> ale skoro potrzebujesz to potem jeszcze jakoś captionować w combo to lepiej TDictionary<string,TStrings> :)

pstmax
Dziękuję z dobrą wolę i podzielenie się wiedzą.
pstmax
Ja na przykład bez problemu kompiluję swoje aplikacje i są one 64-bitowe i mówię tutaj o skompilowanej wersji, którą system zidentyfikuje jako 64-bitowy proces.
WL
Ale co ma piernik do wiatraka z tym 64bit bo nie ogarniam?
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:8 dni
  • Lokalizacja:Zielona Góra
1

Według mnie, po pierwsze użyj FireDac-a a nie dbGo. Embarcadero rozwija tą technologię.
Po drugie, nie jestem zwolennikiem umieszczania kodu w komponentach (ogólnie w plikach dfm, czy też fmx w zależności od technologii) chociażby z tego powodu że trudniej się analizuje kod programu po jakimś czasie.
W tym momencie już sprawa wg. mnie jest rozwiązana. Możesz stworzyć sobie ile chcesz i jakich chcesz zapytań w czymkolwiek, TStringList, Memo, tablica, ComboBox, plik txt, cokolwiek przyjdzie ci do głowy i z tego źródła pobierać odpowiednie zapytania.

Zobacz pozostałe 5 komentarzy
SK
Jest jeszcze UniDAC Express
woolfik
UniDAC są płatne ale są też darmowe ZeosLib (które swojego czasu udało mi się również współtworzyć) jednak nie wiem co to ma do rzeczy
SK
The Express edition is free. It includes the UniDAC common engine, but does not include any data providers and additional components. UniDAC Express Edition supports only the following data providers: Oracle, SQL Server, MySQL, InterBase (Firebird), PostgreSQL, and SQLite, which are installed with ODAC, SDAC, MyDAC, IBDAC, PgDAC, and LiteDAC, respectively.
woolfik
cytujesz mi informacje ze strony, a sprawdzałeś? Bo na moje oko to dają tylko 30 dniowego triala nawet w wersji express;)
WL
Cytuje ze strony i ma racje - są za darmo. Ale tam jest HAK! Co prawda UniDAC są za free w wersji Express, ale nie posiadają żadnego dostawcy danych. Zatem aby to zadziałało, to musisz mieć np. UniDAC + SDAC (albo inny *DAC provider), który już za free nie jest. To takie se rozwiązanie przydatne w bardzo specyficznych przypadkach.
pstmax
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Reda
  • Postów:68
0

@robertz68: SQLNCLI11.1 (Provider) w komponencie ADOConnection aby połączyć się z MS SQL Server 2019 Express Edition. Zawsze wykluczam (wyłączam) i nie używam BCD i jakoś wszystko mi działa. Firedac obsługiwane jest bezproblemowo. Myślę szanowni Państwo, że co niektórych wiedza odnośnie platformy RAD Studio (w tym Delphi) to takie bardzo stare wiadomości i zaszufladkowanie, ale cóż każdy człowiek jedzie na stereotypach - lubimy pochopnie oceniać. :P


Piotr Strzemkowski
robertz68
ale dlaczego ADO miałoby nie działać, działa i to całkiem sprawnie. Problemem jest tylko Embarcadero które "promuje" swoje rozwiązanie i dlatego, jeśli jednak chcesz dłużej pozostać przy Delphi to chcąc nie chcąc trzeba się z tym pogodzić. Najpewniej przyjdzie kiedyś taki dzień że w którejś tam nowej wersji ADO po prostu zniknie. Przy okazji - co masz na myśli pisząc o BCD?
WL
BCD - Binary Coded Decimal i np. takie specjalny typ pola jak TBCDField/TFMTBCDField
pstmax
BDE - Borland Database Engine (błąd literówka z mojej strony)
robertz68
a jednak czułem że to nie chodzi o BCD :).
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około miesiąc
  • Postów:1082
0
pstmax napisał(a):

@robertz68: SQLNCLI11.1 (Provider) w komponencie ADOConnection aby połączyć się z MS SQL Server 2019 Express Edition.

To nie jest zalecane połączenie dla MSSSQL 2019.
W ogóle NativeClient jest już passe wg Microsoft, ale działa bez problemu.
Teraz na topie jest nowy provider OLE DB lub ODBC.
FireDAC tego co prawda nie wspiera natywnie, ale... to w sumie nie jest problem.
Natomiast, żeby było jeszcze śmieszniej, wspiera to stare i nierozwijane dbGO, bo do ADO wystarczy doinstalować odpowiedni provider OLE DB (MSOLEDBSQL) i go użyć.

Zawsze wykluczam (wyłączam) i nie używam BCD i jakoś wszystko mi działa.

Tego się nie powinno wykluczać czy wyłączać, a mapować np. na Currency czy inny właściwy typ danych.
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Data_Type_Mapping_(FireDAC)

Firedac obsługiwane jest bezproblemowo.

Eee... nie rozumiem.

Myślę szanowni Państwo, że co niektórych wiedza odnośnie platformy RAD Studio (w tym Delphi) to takie bardzo stare wiadomości i zaszufladkowanie, ale cóż każdy człowiek jedzie na stereotypach - lubimy pochopnie oceniać. :P

Oj tam, przecież to truizm i dotyczy w sumie wszystkiego.

pstmax
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Reda
  • Postów:68
0

Dodatkowe pytanie:
Mam tabelę DANEWE z polami LTT, DataLos, P1,P2,P3,P4,P5,P6,DzTyg i chciałbym za pomocą zapytania SQL (najlepiej jednego) wykonać:
Utworzyć nową tabelę DWSORT która będzie będzie miała pola DataLos, P1,P2,P3,P4,P5,P6 posortowane rosnąco według pola DataLos.
Czy jest to możliwe?


Piotr Strzemkowski
WL
Doczytaj sobie o SELECT INTO w MSSQL... W skrócie; polecenie utworzy nową tabelę, która będzie zgodna z wynikiem SELECT i od razu ją wypełni ją danymi z polecania SELECT. I to jest dokładnie to, o co pytasz.
PD
  • Rejestracja:ponad 22 lata
  • Ostatnio:około godziny
1

Jest to możliwe, tylko taka operacja nie ma sensu, ponieważ tabela tylko przechowuje dane, a o tym w jaki sposób zostaną przedstawione decyduje SELECT. W tym przypadku wystarczy posortować dane wg kolumny DataLos. Wcześniej tylko należy na bazie utworzyć indeks na tą kolumnę, żeby zapytanie nie obciążało serwera sql.


pozdrawiam
paweld
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:8 dni
  • Lokalizacja:Zielona Góra
0

jeśli masz problemy z "ręcznym" tworzeniem tabel (czy tam całych baz) to użyj Microsoft SQL Management Studio, utwórz w nim konkretną, interesującą cię tabelę, następnie wg obrazka:
screenshot-20210427064331.png

taki gotowy skrypt możesz użyć w swojej aplikacji. Taki sposób zapewni ci że niczego nie pominiesz.

pstmax
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Reda
  • Postów:68
0

Rozumiem, wiem o tym. Po prostu irytuje mnie to, że muszę wywoływać przy każdym wyświetleniu, a użytkownik w zasadzie non-stop modeluje sobie zakresy wchodzące w skład podzbioru wycinanego za pomocą ustawiania wartości początkowej DataLos i wartości końcowej DataLos - to po pierwsze. Wrzucam zrzut ekranu z aplikacji dla lepszego zobrazowania.

Użytkownik ma mieć możliwość przeprowadzenia serii symulacji na ograniczonym roboczym wycinku danych, może sobie określić jego zawartość poprzez wskazanie daty początkowej i daty końcowej lub poprzez podanie ilości losowań jaka ma należeć do roboczego zbioru.

fo]

W drugim kroku ma ten roboczy zbiór - podzielić na serie (mniejsze zbiory (serie mogą mieć rozmiar od 3 losowań do 468 losowań + reszta, która pozostaje po operacji DIV - na zrzucie masz akurat ustawioną ilość w serii na 18). Następnie Ilość powtórzeń L1, L2, L3,L4,L5,L6 ma być w danej serii ma być zgrupowana, potem dalsze czynności o których nie ma co na razie pisać) Tak więc, doszedłem do wniosku, że mądrze będzie poszczególne operacje, a dokładnie ich wyniki zapisywać.

Tok mojego rozumowania:

  1. Wycinam z całego zbioru wycinek np 200 losowań po czym zapisuje go w osobnej tabeli poprzez parametry (DataLos_początek,DataLos_koniec,ilość_serii_tutaj-18)
  2. Następnie w pełnych podzbiorach składających się tutaj z 18 losowań, czyli 200 DIV 18 = 11 grupuję powtarzające się wystąpienia liczb w kolumnach L1...L6 + reszta)
  3. Potem następne operacje...

Oczywiście użytkownik będzie mógł w ten sposób stworzyć sobie różne warianty i chciałby móc je sobie wyświetlić w osobnych okienkach w jemu tylko znanym celu celu :P)
Dalej mają być, jeszcze operacje...

Dlatego zależy mi na tym aby, nie tyle zapisywać wyniki, co parametry tych wyników. Można to porównać - zapis bitmapy (bit po bicie) i zapis grafiki wektorowej (zapisuję współrzędne i parametry oraz info o bryły geometrycznej) Nie wiem czy opisałem to w zrozumiały sposób - mam nadzieję, że tak.

Wracając do głównego wątku, wiem, że wszystko będzie wykonywane po stronie klienta i dlatego zależy mi aby nie wykonywać ich za każdym razem, tylko pobierać.


Piotr Strzemkowski
edytowany 3x, ostatnio: flowCRANE
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:8 dni
  • Lokalizacja:Zielona Góra
0

ja w programach w których muszę filtrować dane po datach (dokumenty sprzedaży itp.) nad gridem umieszczam pasek filtrów:
screenshot-20210427120603.png
To co tam ustawię jest aktualne do czasu aż ręcznie zmienię zakres. Można by nawet umieścić checkbox-a i zapamiętać filtr na stałe dla danego użytkownika.

WL
Widzę że używasz DevEx... zatem po co Ci ten pasek filtrów, skoro masz to wbudowane po prostu w widok grida? I to na dodatek w 4 różnych opcjach (FilterRow, ColumnAutoFilter, FindPanel oraz FilterPanel)?
robertz68
wiesz co, okazuje się że prosty filtr wbudowany w grida okazał się zbyt skomplikowany dla niektórych obsługujących program. Przetestowałem to i miałem dość edukowania osób które ledwie przesuwają kursor myszki. Zostawiam tylko FindPanel bo fajnie działa. Poza tym, aktualnym sposobem pobieram ilość danych jaką wybieram w filtrze a w moich aplikacjach jest to dość ważne aby nie pociągnąć paru milionów rekordów. Wiem że można "dociągać" w trakcie przewijania ale wtedy jest pewien problem ze stopką podsumowującą.
PD
  • Rejestracja:ponad 22 lata
  • Ostatnio:około godziny
0

ale wiesz o tym, że aby pobrać te dane po odfiltrowaniu musisz wykonać SELECT?
każda zmiana filtru spowoduje, że będziesz musiał tworzyć nową tabelę z danymi lub czyścić istniejącą i wrzucać do niej nowe rekordy, do czego będzie potrzebny dodatkowy czas.
W skrócie to będzie wyglądało tak:

  1. operator wybiera zakres
  2. tworzysz tabelę wraz z indeksami na dane (lub czyścisz tabelę istniejącą)
  3. pobierasz dane:
Kopiuj
insert into nowa_tabla
select * from tabela where datalos between '2020-01-01' and '2020-12-31'
  1. pobierasz dane z tabeli:
Kopiuj
select * from nowa_tabela

A jeżeli pominiesz przenoszenie danych do nowej tabeli to 2 kroki (drugi i czwarty, a z 3 wykreślasz linię insert into nowa_tabela) z tego odpadają, czyli masz mniej operacji, które zajmują mniej czasu oraz zużywają mniej zasobów.

Chyba, że faktycznie na tej ograniczonej ilości danych będziesz wykonywał później miliony operacji to może ich wydzielenie ma sens, ale to musiałbyś sam sprawdzić


pozdrawiam
paweld
pstmax
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Reda
  • Postów:68
0

@Paweł Dmitruk: Wkradło się małe nieporozumienie do naszej wymiany zdań - tabela ma być utworzona jedna, a kombinacje filtrów i zakresów mają tworzyć rekordy w tej tabeli. W ten sposób, użytkownik będzie mógł wykonać sobie różne scenariusze i potem tylko je podmieniać lub porównywać.Zrzut ekranu 2021-04-27 Krok 2.png
Dołączam pozostałe zrzuty ekranu abyście mieli pełen obraz. Zrzut ekranu 2021-04-27 Opcje.png
Na ostatnim zrzucie powtórzyłem pierwszy ekran - ten ma włączony ekran i ustawiony zakres roboczy na 360 losowań od 03-12-2013 do 09-06-2016 co daje zbiór 360 losowań. Teraz mam te losowania podzielić na podzbiory 360 DIV 18 = 20 i wykonać na nich grupowanie:

Kopiuj
SELECT P1, COUNT(P1) AS Licz_Jeżeli FROM [dbo].[DANEWE] WHERE Data Between '2013-12-01' AND '2013-12-31' GROUP BY P1

I wynik tego zapytania chciałbym zapisać w nowej tabeli powiedzmy o nazwie DWSORT - z tym mam problem. Czy ktoś mógłby mi pomóc?
Czy polecenie jest poprawne?
Jak dopełnić dane o liczny które nie występują (jest 1,2,3,4, 5 - 26 potem 31,32, 40) a chcę to zapisywać sobie w pliku lokalnym (Krok 2)

Zrzut ekranu 2021-04-27 150449.pngZrzut ekranu 2021-04-27 150449.png

Mam też takie warianty zapytań:

Kopiuj
SELECT P1, COUNT(P1) FROM DANEWE WHERE DataLos Between '2013-12-03' AND '2016-12-31' GROUP BY P1 ORDER BY P1;
Select * From DANEWE WHERE DataLos Between '2013-12-03' AND '2016-06-09' Order By DataLos;

Jak mam chwila (przy każdej zmianie AdoQuery.Clear, AdoQuery.SQL.Add('') czyścić i dodawać, to robota głupiego. Może ktoś mi podpowie jak wykorzystać coś na wzór ValueListEditor aby mieć takie różne kombinacje pozapisywane i to jeszcze w zewnętrznym pliku tekstowym - łatwo poprawić zapytanie nawet poza programem

Należy pamiętać, że wraz z dodawaniem następnych kroków w programie zapytania mogą stać się tak złożone, że aż bezsensowne albo nawet niewykonalne - stąd pomysł na tabele z pośrednimi nazwijmy to wyliczeniami.

Ostatnia sprawa to temat Kalendarza, który miałby po rozwinięciu Zrzut ekranu 2021-04-27 Czy jest taki kalendarz pod jednym TDataTimePicker lub TCalendar.png daty miałby od razu 3 miesiące - ma ktoś pomysł jak to ugryźć?


Piotr Strzemkowski
Zobacz pozostałe 6 komentarzy
flowCRANE
Do systemu grania w lotka? Tyle że taki klucz nie istnieje.
robertz68
@furious programming: a co jeśli ta gra nie jest losowa? Twoje założenia opierają się na rachunku prawdopodobieństwa a nie ma pewności że w tej grze jego założenia są spełnione. Eh, po co ja wkładam ten kij w mrowisko :)
flowCRANE
No właśnie — lepiej schowaj kij, bo to nie ma sensu. No nie ma siły, aby matematycznie czy statystycznie zwiększyć szansę na wygraną, niejeden już to rozkminiał i nic mu z tego nie wyszło. Zakładając, że nikt nie manipuluje maszyną losującą podczas losowania, czyli że wyniki losowania nie są ”ustawione”, nie da się nic z tym zrobić. Nic prócz grania ich systemem, czyli wykupywania większego zbioru liczb. A to oczywiście przekłada się na wykładniczo rosnące koszty.
pstmax
Święta racja - ale ludzie pragną mieć nadzieję...
flowCRANE
No cóż… niech ją mają. :D
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:8 dni
  • Lokalizacja:Zielona Góra
0

Jeśli dobrze zrozumiałem ten fragment:

Jak mam chwila (przy każdej zmianie AdoQuery.Clear, AdoQuery.SQL.Add('') czyścić i dodawać, to robota głupiego. Może ktoś mi podpowie jak wykorzystać coś na wzór ValueListEditor aby mieć takie różne kombinacje pozapisywane i to jeszcze w zewnętrznym pliku tekstowym - łatwo poprawić zapytanie nawet poza programem

to wywołanie zapytania z zewnętrznego źródła nie jest żadnym problemem.
Ja bym do tego użył np. listbox lub combobox i pobierał dane z pliku txt. W każdej linii jedna komenda.

pstmax
Yes, of couurse. Ja to wiem, Ty to wiesz... Ja dodatkowo nazywam to 'podatkiem od marzeń" - marzę sobie, że wygram w lotto...
robertz68
każdy ma jakieś marzenia, ja mam w sobie pokłady tolerancji i szanuję to. Powodzenia.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)