Autor Téma: Insert, Edit - prístupnosť údajov v tabuľke  (Přečteno 3809 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7028
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Insert, Edit - prístupnosť údajov v tabuľke
« kdy: 18-10-2019, 18:32:20 »

Databáza FB.Potrebujem pre vykonaním Post overiť, či cudzí kľúč už je použitý v tabuľke. Unique to v mojom prípade nerieši.
Viem, že po použití Post, bez commit už mám novo zadané údaje v tabuľke.
Ale neviem, či tam sú k dispozícii ešte pre Post.
Myslím tým to, že ak spustím Query, či načíta aj nové/zadávané údaje, alebo len pôvodné. Existujúce pred Insert či Edit.
Prešiel som na DB komponenty a tak musím riešiť to, čo som predtým nepoznal  :(
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 478
  • Karma: 9
    • Verze Delphi: XE2
Re:Insert, Edit - prístupnosť údajov v tabuľke
« Odpověď #1 kdy: 18-10-2019, 20:33:32 »
Databáza FB.Potrebujem pre vykonaním Post overiť, či cudzí kľúč už je použitý v tabuľke. Unique to v mojom prípade nerieši.
Komponenta datasetu by měla mít událost OnBeforePost

Citace
Prešiel som na DB komponenty a tak musím riešiť to, čo som predtým nepoznal  :(
A proč jsi tedy přecházel?  ;)

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1489
  • Karma: 52
    • Verze Delphi: 11.3
Re:Insert, Edit - prístupnosť údajov v tabuľke
« Odpověď #2 kdy: 18-10-2019, 20:45:50 »
IBX komponenty to mají tak, že samotné Edit a Insert v databázi ještě nic neudělají - změny zapíše teprve Post. Firedac to asi bude mít stejně.

Není lepší testovat, zda Post prošel bez problémů, než to ověřovat předem? Pokud k databázi přistupuje více uživatelů, tak mezi ověřením a Post stejně může někdo jiný údaje změnit.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7028
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Insert, Edit - prístupnosť údajov v tabuľke
« Odpověď #3 kdy: 18-10-2019, 21:20:44 »
Citace
A proč jsi tedy přecházel? 
Lebo to sú TMS a riešia za mňa veľa vecí. Napríklad obmedzenia. Dosť som nad tým rozmýšľal a rozhodol som sa, že to stojí zato. Ešte sa mi nestalo, aby som mal nejaké problémy. To sa žiaľ o štandardných DB komponentoch povedať nedá. Preto som ich pôvodne opustil. Ako ďalší bonus mám aj zjednodušenia v kóde. Mínusom je ošetrovanie vecí, ktoré som mal urobené centrálne a teraz to padlo + iný prídavný kód, ktorý predtým nemusel byť. Ale to sú len také jednoduché veci. Napr. ak mením údaj, tak to musím zapísať priamo do tabuľky. Nestačí to zapísať len do komponentu (tak ako predtým).
Citace
Není lepší testovat, zda Post prošel bez problémů, než to ověřovat předem?
To sa práve nedá. V skutočnosti sa tie údaje môžu opakovať. Ale pre jedno SVB v jednom roku to môže byť len raz. Preto ručná kontrola.
Citace
Pokud k databázi přistupuje více uživatelů, tak mezi ověřením a Post stejně může někdo jiný údaje změnit.
Na ten test som myslel. Len som dúfal, že mi tu niekto dá odpoveď. Ale ten "asi jeden" už odtiaľ odišiel :'(  To budem riešiť tým, že s jedným SVB bude môcť pracovať len jediný pracovník. Ak sa k sieťovej verzii vôbec dostanem.
« Poslední změna: 18-10-2019, 21:23:57 od Stanislav Hruška »
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1489
  • Karma: 52
    • Verze Delphi: 11.3
Re:Insert, Edit - prístupnosť údajov v tabuľke
« Odpověď #4 kdy: 18-10-2019, 21:25:51 »
To sa práve nedá. V skutočnosti sa tie údaje môžu opakovať. Ale pre jedno SVB v jednom roku to môže byť len raz. Preto ručná kontrola.

Tak pokud nechceš použít unique index složený z více polí (svj, rok, pole), tak doporučuji vytvořit v databázi trigger before insert or update a kontrolu udělat v něm; narazí-li kontrola na problém, pomocí Exception vyvolá výjimku, takže zápis záznamu neproběhne. Výjimka se musí nejdří definovat pomocí Create Exception.

Osobně jsem unique indexy přestal používat, protože se mi s nimi hůř pracovalo při synchronizaci dat mezi pobočkami.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7028
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Insert, Edit - prístupnosť údajov v tabuľke
« Odpověď #5 kdy: 18-10-2019, 21:51:40 »
Citace
Tak pokud nechceš použít unique index složený z více polí (svj, rok, pole),
To mi ani neprišlo na um. Ja si radšej všetko ošetrím, než by som mal pracovať s výnimkou. Aj tak ich neovládam :)  Výnimky mám zo svojho pohľadu len ako poslednú ochranu pred zápisom nesprávnych údajov. Zistím zlý údaj, vypíšem oznam a vrátim užívateľa na konkrétny komponent. Je to jednoduché, len občas niečo vyskočí ako tento problém, a DB a užívateľa ničím zbytočným nezaťažujem.
Mám v DB použité aj unique ako poistku. Ale ja si vždy najprv údaje overím.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7028
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Insert, Edit - prístupnosť údajov v tabuľke
« Odpověď #6 kdy: 24-10-2019, 13:07:03 »
Citace
Osobně jsem unique indexy přestal používat
Ako to riešiš teraz?
Rozmýšľam nad tou výnimkou, lebo riešenie sa javí podstatne zložitejšie než som si myslel. Hlavne to komplikuje Edit kontra Insert.
Ja nemusím riešiť konkurenčný prístup k DB.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1489
  • Karma: 52
    • Verze Delphi: 11.3
Re:Insert, Edit - prístupnosť údajov v tabuľke
« Odpověď #7 kdy: 24-10-2019, 13:09:52 »
Citace
Osobně jsem unique indexy přestal používat
Ako to riešiš teraz?
Rozmýšľam nad tou výnimkou, lebo riešenie sa javí podstatne zložitejšie než som si myslel.
Ja nemusím riešiť konkurenčný prístup k DB.

Používám triggery BEFORE INSERT OR UPDATE.
Kontrolu v nich provádím, jen pokud se role uživatele liší od role vyhrazené pro import dat z ostatních poboček.