Rozdělení mysql příkazu – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rozdělení mysql příkazu – Delphi – Fórum – Programujte.comRozdělení mysql příkazu – Delphi – Fórum – Programujte.com

 

krpik0
Newbie
11. 1. 2019   #1
-
0
-

Zdravím

Mam vytvořen script Select , který je ale dlouhý protože si potřebuji vypsat hodně tabulek a porovnat

Delphi mi nevezme tak velký příkaz do jednoho řádku

procedure TForm1.Button7Click(Sender: TObject);
begin
 with adoQuery1 do
  begin
  Active:=False;
      sql.clear;
     adoQuery1.SQL.Add  -- a zde bude dlouhý příkaz

Jak mohu příkaz rozdělit na více řádku aby se mi načetl jako jeden celý

děkuji

Nahlásit jako SPAM
IP: 46.174.58.–
jerry
~ Anonymní uživatel
508 příspěvků
11. 1. 2019   #2
-
0
-

#1 krpik
a nebylo by lepší volat proceduru SQL s kodem místo tohohle strašnýho vkládání textu ?

nainstaluj si MS SQL management studio ... a volej procedury přímo z delphi ne ? předávání parametrů a vyzvedávání neni tak hrozná práce

Nahlásit jako SPAM
IP: 109.81.214.–
krpik0
Newbie
11. 1. 2019   #3
-
0
-

#2 jerry
Děkuji

Touhle cestou už bych asi nechtěl jít

program mam už hotový tohle je poslední příkaz co mi tam chybí. Mam to jen pro moje malé podnikání

Dlouhý příkaz co mam je potom rozdělení DPH pro  účetní

zaklad a daň z 15 a 21 % DPH, to mi krásně rozepíše a pak bych k tomu přidal uložení do CSV nebo txt 

Nahlásit jako SPAM
IP: 46.174.58.–
jerry
~ Anonymní uživatel
508 příspěvků
12. 1. 2019   #4
-
0
-

#3 krpik
přiznám se že nevim, nidky sem SQL příkaz nemusel dělit, pokud sem používal SQL tak sem to používal metodou popsanou v první odpovědi protože volat proceduru SQL a získat zpět výsledky a příp. chybové kody mi připadalo nejjednodušší. zkus nějaké specializované SQL forum

Nahlásit jako SPAM
IP: 109.81.214.–
MilanL+1
Grafoman
13. 1. 2019   #5
-
+1
-
Zajímavé
Kit +

#3 krpik
v Delphi se dlouhé řádky dají normálně rozdělit na více bez problémů, jen je třeba brát v úvahu strukturu té řádky, u tebe jde v púodstatě o dlouhý string, tam je podstatné mít řetězec na každíém řádku uzavřený, máš 2 možnosti

sql := 'text1.....................kkk'+
       ' text2......................ed';

nebo 

sql := 'text1.....................kkk';
sql := sql + ' text2......................ed';


jen dej pozor na mezery podle toho jak budeš řádek dělit aby se ti v tom výsledku nespojily slova z konce jednoho a začátku dalšího řádku,

Další variantou je nadefinovat si kusy sql do constant a pak je jen pospojovat.

Já to řeším přes ty constanty, v řetězcích mám pak kombinaci speciálních znaků kam následně pomocí funkce doplňuji argumenty.

Nahlásit jako SPAM
IP: 185.112.167.–
krpik0
Newbie
13. 1. 2019   #6
-
0
-

#5 MilanL
Děkuji tohle mi pomohl.

A náhodou nevíš jak tam napsat CREATE or Replace view `view_trzba_karty` ?

Pořád se mi to nedaří 

Mam zde dva selecty

CREATE or Replace view `view_trzba_karty` 

as select --- a teď mam select , který mi vyčte do tabulky view_trzba_karty vypočet DPH

za tím mám druhý select ,který vyčte z tabulky view_trzba_karty datum a  DPHačka na dvě desetina místa

Nechávám si to vyčíst celé do mema abych věděl jak to čte program to si zkopíruji do heidisql a tam mi script funguje

Nahlásit jako SPAM
IP: 46.174.58.–
Kit+15
Guru
13. 1. 2019   #7
-
0
-

#6 krpik
To je jeden dotaz nebo dva za sebou? V Delphi je to docela rozdíl, protože každý SQL dotaz musíš poslat samostatně.

... view `view_trzba_karty` ... Vidíš tam ten pleonasmus? To by se při programování stávat nemělo.

Spojování konstant je dobré, protože kompilátor to spojí do jednoho stringu už při překladu.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
krpik0
Newbie
13. 1. 2019   #8
-
0
-

#7 Kit
jsou to dva jeden vytvoří tabulku ze selectem a druhy mi z ní vypíše hodnoty

CREATE or Replace view `view_platby_karty`
 as select
 DATE_FORMAT(s.closed,"%d.%m.%Y") datum, sum(case when s.storno=1 then 0 else CelkovaCena end) as trzba_celkem, 
SUM(case when s.storno=1 then 0 ELSE s.CelkovaCena/(100+s.SAZBA)*100 END) as zaklad_DPH, 
SUM(CASE WHEN COALESCE(s.SAZBA,0)=0 THEN s.CelkovaCena/((100+s.SAZBA)/100) ELSE 0 END )as bez_DPH, 
SUM(CASE WHEN s.SAZBA=21 THEN (s.CelkovaCena/1.21)*(s.SAZBA/100) ELSE 0 END )as dph21, SUM(CASE WHEN s.SAZBA=15 
THEN (s.CelkovaCena/1.15)*(s.SAZBA/100) ELSE 0 END )as dph15, SUM(CASE WHEN s.SAZBA=10 THEN (s.CelkovaCena/1.10)*(s.SAZBA/100) 
ELSE 0 END )as dph10, SUM(CASE WHEN s.SAZBA=21 THEN s.CelkovaCena-(s.CelkovaCena/1.21)*(s.SAZBA/100) ELSE 0 END )as zaklad_dph21,
SUM(CASE WHEN s.SAZBA=15 THEN s.CelkovaCena-(s.CelkovaCena/1.15)*(s.SAZBA/100) ELSE 0 END )as zaklad_dph15, 
SUM(CASE WHEN s.SAZBA=10 THEN s.CelkovaCena-(s.CelkovaCena/1.10)*(s.SAZBA/100) ELSE 0 END )as zaklad_dph10 
from platby P inner join p_polozky s where p.id_ucty= s.id_ucty

and p.druh_platby_id =  '6'
and s.closed<>"0000-00-00%" AND s.storno<>1 AND DATE_FORMAT(s.closed,"%Y-%m-%d %H:%i") BETWEEN '2018-01-01'  AND  '2018-12-12'
 GROUP BY YEAR(s.closed), MONTH(s.closed),DAY(s.closed),s.id_ucty ;

píšu to jako

adoQuery2.SQL.text :='CREATE or Replace view `view_trzba_karty`';
               adoQuery2.SQL.text := adoQuery2.SQL.text + ' as select';

atd.

----------------

Teď dalším selectem dělám už sumy u DPH a vypíšu

 napsal bych to pod další button 

zde bych potom doplnil

Var
  i: integer;
  strT: string;
  slst: TStringList;

adoQuery1.SQL.Clear;
  adoQuery1.SQL.Add('select....

.slst:= TStringList.Create;
Try
  With DBGrid1.DataSource.DataSet Do
  begin
          First;
    while not Eof do
    begin
      strT:= ';'+Fields[0].AsString+';';
      for i:= 1 to FieldCount-1 do
        strT:= strT+';'+Fields[i].AsString+';';
      slst.Add(strT);
      Next;
    end;
          First;
  end;
  slst.SaveToFile('C:\data\test.xls');
Finally
  slst.Free;
End;

ale i když nechám ten první script pod jedním buttonem tak mě to nevytvoří tabulku a i když ten script by měl být správný

Nahlásit jako SPAM
IP: 46.174.58.–
jerry
~ Anonymní uživatel
508 příspěvků
13. 1. 2019   #9
-
0
-

#8 krpik
stáhni si MS SQL Management Studio asi 2014 nebo 2016 a vyzkoušej si ten příkaz v něm ...

tu databázi si v něm otevři, heslo máš ne ?

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:14b6:36d7:761d:fda7...–
krpik0
Newbie
13. 1. 2019   #10
-
0
-

#9 jerry
Ja jedu na počítači na mysql 5 , to bude vadit ne?

Nahlásit jako SPAM
IP: 46.174.58.–
Kit+15
Guru
13. 1. 2019   #11
-
0
-

#8 krpik
Něco mi říká, že jsi zapomněl escapovat apostrofy.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
jerry
~ Anonymní uživatel
508 příspěvků
14. 1. 2019   #12
-
0
-

#10 krpik
aha mysql 5, hm tak v tom sem nikdy nedělal .. budeš asi muset na nějaký forum pro mysql ...

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:e955:b9b1:9128:e6f4...–
jerry
~ Anonymní uživatel
508 příspěvků
14. 1. 2019   #13
-
0
-

#10 krpik
teď sem se kouknul a pro mySQL je tohle

https://www.mysql.com/products/workbench/

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:e955:b9b1:9128:e6f4...–
MilanL+1
Grafoman
14. 1. 2019   #14
-
0
-

ahoj, koukal jsem na ty dotazy, máš to podle mě zbytečně složitě s těmi všemi podmínkami IF a CASE When

vytvářecí bych zjednodušil, ne doklad na řádku se všemi sazbami, ale doklad a sazba na řádek, do jednoho bych to pak dal bud selectem nebo až následně při převádění dat do stringlistu.

každopádně si můžeš zjednodušit alespoň storno (je třeba vyzkoušet, jde o to jaký typ je storno a jak je v dotazech bráno)

sum(case when s.storno=1 then 0 else CelkovaCena end) as trzba_celkem,      
 . - nemělo by zde být s.CelkováCena může vyhazovat chybu?
sum(CelkovaCena*s.storno) as trzba_celkem

podobně

SUM(case when s.storno=1 then 0 ELSE s.CelkovaCena/(100+s.SAZBA)*100 END) as zaklad_DPH,
SUM((s.CelkovaCena/(100+s.SAZBA)*100)*s.storno) as zaklad_DPH,

každopádně, když si děláš pomocnou tabulku v DB, tak bych ten celej dotaz rozsekal, do té tabulky bych udělal jednoduché nasoučtování (datum, účet, sazba, sum_celkem[,sum_základ,sum_dph]) tučně je group by, z toho pak selectem sazby do 1 řádky. případně bych ani nedělal tu pomocnou tabulku, ale rovnou select a zpracování řádky Datum-účet bych řešil v Delphi. Jen nevím jak by to bylo rychlostně, ale myslím, že vzhledem ke složitosti toho tvého dotazu bych o moc pomalejší nebyl.

Nahlásit jako SPAM
IP: 91.139.9.–
krpik0
Newbie
14. 1. 2019   #15
-
0
-

#14 MilanL
Děkuji již jsem dneska dopoledne na to ještě mrknul a našel odpověd

  adoQuery2.SQL.Text :='CREATE or Replace view view_platby_karty ' + - dal jsem za každý řádek pro spojení scriptu

                    ' as select DATE_FORMAT

dále jsem si tam přidal ADOQuery2.ExecSQL(); a jede to 

asi to není nejlepší řešení přestal mi fungovat IF ELSE kdyby mi to nic nenačetlo tak abych věděl

     if AdoQuery2.IsEmpty then
     ShowMessage('Nic nenalezeno')

              else
     ShowMessage('Načteno');

to už je ale jiný příběh 

Děkuji všem za pomoc

Nahlásit jako SPAM
IP: 46.174.58.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý