Autor Téma: Insert  (Přečteno 5866 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7426
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Insert
« kdy: 22-10-2012, 14:29:41 »
Dal som uložiť nový záznam a dostal som oznam, že ibsvbs musí mať hodnotu. Je to primary key s not null. Mám vytvorený trigger Befor Insert

Kód: [Vybrat]
as
begin
  if (new.idsvbs is null) then
    new.idsvbs = gen_id("GEN_ID",1);
end

Ja som si myslel, že ten triggers sa o to postará. Ale nie.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Petr P.

  • Nováček
  • *
  • Příspěvků: 29
  • Karma: 1
    • Verze Delphi: Turbo Delphi 2006
Re:Insert
« Odpověď #1 kdy: 22-10-2012, 16:18:58 »
Trigger dosadí hodnotu, ale až po nesmyslné kontrole komponent.
Řešení je odstranit údaj  Idsvbs v aktualizačních dotazech Datasetu.
« Poslední změna: 22-10-2012, 16:22:43 od Petr P. »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7426
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Insert
« Odpověď #2 kdy: 23-10-2012, 08:32:52 »
Hm, ja používam myTable.Insert + myTable.Post. A v myTable ten primárny kľúč potrebujem, nakoľko s ním inde pracujem.
Podľa toho to znamená v takom prípade vytvoriť novú myTableBezPrimaryKluc, alebo SQL Insert + asi refresh myTable. Nóó ďakujem.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Petr P.

  • Nováček
  • *
  • Příspěvků: 29
  • Karma: 1
    • Verze Delphi: Turbo Delphi 2006
Re:Insert
« Odpověď #3 kdy: 23-10-2012, 09:06:22 »
Já používám IBDataset, kde do aktualizačních dotazů InsertSQL a ModifySQL nedám aktualizaci klíčového údaje, který naplňuju triggerem.  Použíam pak podobně IBDataset.Insert a IBDataset.Post.  IBTable nepoužívám.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7426
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Insert
« Odpověď #4 kdy: 23-10-2012, 09:24:25 »
IBTable používam kvôli jednoduchosti pri práci s jedinou tabuľkou.
Ako potom riešiš napríklad vzťah Master - Detail? Ja si zistím IDMaster a potom Detail.Locate('FKMaster', IDMaster, ....)

Poznámka - na zobrazenie údajov používam zásadne len VirtualTreeView.

Do čerta, už ani nie je potrebné odpovedať. Veď hodnotu IDMaster mám priamo vo VT. A tie napĺňam pomocou "SQL Select" Žeby som zrušil tento príspevok?

Jáj, ale som to posral. Ten IDMaster potrebujem pri vyhľadaní záznamu v MasterTable pri zmene záznamu v VT. Na formulári vo VT zobrazujem všetky zánamy a v časti okna komplet vybratý záznam.
« Poslední změna: 23-10-2012, 09:29:51 od Stanislav Hruška »
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7426
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Insert
« Odpověď #5 kdy: 23-10-2012, 10:45:52 »
Tak som sa trocha pozrel na ten TIBDataset. Ten to rieši. Ale je tam práca ako na kostole. Doteraz som vystačil napr. myTable.Insert + myTable.Post. Hotovo.

Tu budem musieť definovať naviac minimálne dve SQL a to SELECT a INSERT. Ale ak INSERT urobím šikovne, tak už nebudem musieť robiť ďalší pre hromadné pridávanie záznamov.

Asi nemám inú možnosť.
Je tam vlastnosť ObjectView. Čo to znamená? V helpe sa mi to nepodarilo nájsť.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Petr P.

  • Nováček
  • *
  • Příspěvků: 29
  • Karma: 1
    • Verze Delphi: Turbo Delphi 2006
Re:Insert
« Odpověď #6 kdy: 23-10-2012, 11:11:59 »
Ručně si napíšeš Select SQL a potom
přes pravý tlačítko myši nad IBDataset si klini na Dataset Editor.
V editoru si pomocí průvodce vygeneruješ SQL dotazy, který pak jen doladíš.
Pro Select můžeš použit i volbu Edit SQL.

Pak už s IBDataset můžeš pracovat podobně jako s IBTable. (Insert,Post, Delete atd.)
Jinak IBTable není na práci v síti, je pomalá při více datech i na lokále.
ObjectView netuším na co je.
« Poslední změna: 23-10-2012, 11:21:04 od Petr P. »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7426
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Insert
« Odpověď #7 kdy: 23-10-2012, 11:27:54 »
// Pak už s IBDataset můžeš pracovat podobně jako s IBTable. (Insert,Post, Delete atd.)
To je dobrá správa. Ďakujem.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3530
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Insert
« Odpověď #8 kdy: 23-10-2012, 11:41:27 »
ObjectView netuším na co je.
To nejak souvisi  s vnorenejma datasetama, kdy pole je typu dataset. Sam jsem to nikdy k nicemu nepouzil, ale zda se, ze je to v helpu popsany viz. http://docwiki.embarcadero.com/Libraries/XE3/en/Data.DB.TDataSet.ObjectView a souvisejici odkazy na TADTField apod.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7426
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Insert
« Odpověď #9 kdy: 24-10-2012, 09:03:05 »
Tak som si spojazdnil TIBDataset a:

// Trigger dosadí hodnotu, ale až po nesmyslné kontrole komponent.
Podľa mňa to nie je pravda. Primárny kľúč je automaticky NOT null. Kontrolu nevykonáva Trigger, ale samotný komponent. Riešením je nastaviť pre primárny kľúč a jemu podobných Required := False; Samotné odstránenie „Idsvbs v aktualizačních dotazech“ nepomôže.

// Řešení je odstranit údaj Idsvbs v aktualizačních dotazech Datasetu.
Tento riadok platí okrem hore napísaného.

Rád by som vedel, kedy mám uprednostniť TDataset pred TDBTable. Môj pohľad:

TDBTable
- Dám si vygenerovať zoznam polí a upravím ho
- Delete riešim na jedinom mieste priradením SQL v tvare (neberiem ohľad na syntax) Delete * from myTable.TableName where id = nieco
- Insert a Edit na jedinom mieste priamym volaním myTable.xxx

TDataset
- Musím pre každú udalosť (minimálne Delete, Insert, Modify a Select) nadefinovať SQL. Tým mi rastie veľkosť exe a berie mi aj určitý čas
- A až teraz som tam, kde som okamžite pri použití TDBTable

Takže pri TDataset mám viac „úvodnej“ práce. Stojí to zato?

Ak chcem vykonať napr. hromadný Udate alebo Insert tak je postup pri oboch komponentoch rovnaký. Akurát pri TDBTable použijem komponent TIBQuery
 
Dodatok: bavíme sa o prístupe a práci s jedinou tabuľkou!
« Poslední změna: 24-10-2012, 09:28:10 od Stanislav Hruška »
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Petr P.

  • Nováček
  • *
  • Příspěvků: 29
  • Karma: 1
    • Verze Delphi: Turbo Delphi 2006
Re:Insert
« Odpověď #10 kdy: 24-10-2012, 09:50:35 »
//Podľa mňa to nie je pravda. Primárny kľúč je automaticky NOT null. Kontrolu nevykonáva Trigger, ale samotný komponent. Riešením je nastaviť pre primárny kľúč a jemu podobných Required := False; Samotné odstránenie „Idsvbs v aktualizačních dotazech“ nepomôže.

Kontrolu dělá komponenta, ale required:=false mi u IBDataset nefungovalo.
Musí se dát nějaká hodnota do  klíčového údaje  ID v AfterInsert.  ID jako klíč mám  číselnou hodnotu tak tam dávam 0.
Máš pravdu to odstarnění v aktualizačních dotazech kontrolu na null neřeší, to jsem napsal blbě.
To odstranění se musí udělat kvůli tom, aby hodnota ID byla null a trigger tam dosadil pořadové číslo.
Nevím jak v IBTable budeš řešit ten problém s automatickým číslováním ID v triggeru.

IBTable je mnohem pomalejší než IBDataset, taky proto ji nepoužívám.
« Poslední změna: 24-10-2012, 10:33:09 od Petr P. »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7426
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Insert
« Odpověď #11 kdy: 24-10-2012, 10:34:48 »
// ale required:=false mi u IBDataset nefungovalo.
Mne včera večer áno.

Ten dôvod je dostatočný. Teraz si o tom čítam. Možno pribudnú ďaľšie.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.