Autor Téma: Výpis duplicitních položek  (Přečteno 489 krát)

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 337
  • Karma: 9
    • Verze Delphi: XE2
Výpis duplicitních položek
« kdy: 20-09-2020, 12:33:28 »
V seznamu dokladů mám duplicitní položky a potřeboval bych kompletní výpis použitím vnořeného selectu


Kód: [Vybrat]
SELECT * FROM DOKLADY WHERE "vnoreny select duplicit "
Vnoreny select
Kód: [Vybrat]
select  ID_SKLAD,ID_POLOZKA
from DOKLADY
group by ID_SKLAD,ID_POLOZKA
having count(*) > 1

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1112
  • Karma: 47
    • Verze Delphi: 10.3
Re:Výpis duplicitních položek
« Odpověď #1 kdy: 20-09-2020, 12:37:47 »
Něco takového?

Kód: [Vybrat]
SELECT
 y.*
FROM
(
select  ID_Dokladu, ID_SKLAD,ID_POLOZKA
from DOKLADY
group by ID_SKLAD,ID_POLOZKA
having count(*) > 1
) x
LEFT OUTER JOIN Doklady y on (y.ID_Dokladu=x.ID_Dokladu)

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 337
  • Karma: 9
    • Verze Delphi: XE2
Re:Výpis duplicitních položek
« Odpověď #2 kdy: 20-09-2020, 12:45:01 »
Něco takového?

Kód: [Vybrat]
select  ID_Dokladu, ID_SKLAD,ID_POLOZKA
from DOKLADY
group by ID_SKLAD,ID_POLOZKA
having count(*) > 1
)

Tak to asi nepujde.  ID_DOKLADU by muselo být i v sekci GROUP BY a tím by celý dotaz neměl smysl


Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 337
  • Karma: 9
    • Verze Delphi: XE2
Re:Výpis duplicitních položek
« Odpověď #3 kdy: 20-09-2020, 13:03:56 »
Potřeboval bych něco takového  ;)

Kód: [Vybrat]
SELECT * FROM DOKLADY A WHERE  (A.ID_SKLAD=B.ID_SKLAD) AND (A.ID_POLOZKA=B.ID_POLOZKA)
 (
[code]select  ID_SKLAD,ID_POLOZKA
from DOKLADY B
group by ID_SKLAD,ID_POLOZKA
having count(*) > 1

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1112
  • Karma: 47
    • Verze Delphi: 10.3
Re:Výpis duplicitních položek
« Odpověď #4 kdy: 20-09-2020, 13:17:23 »
Máš pravdu, tamto nešlo... Tak takhle?

Kód: [Vybrat]
SELECT
 y.*
FROM
(
select  ID_SKLAD,ID_POLOZKA
from DOKLADY
group by ID_SKLAD,ID_POLOZKA
having count(*) > 1
) x
LEFT OUTER JOIN Doklady y on (y.ID_Sklad=x.ID_Sklad)and(y.ID_Polozka=x.ID_Polozka)
« Poslední změna: 20-09-2020, 13:24:43 od vandrovnik »

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 337
  • Karma: 9
    • Verze Delphi: XE2
Re:Výpis duplicitních položek
« Odpověď #5 kdy: 20-09-2020, 14:08:50 »
Výborně , moc děkuji
Tato konstrukce by mě asi nenapadla ..

Mohl by si mě prosím doplnit legendu jak Query  probíhá , rád bych to porovnal s mým výkladem (je možné že podobné uspořádaní použiji znovu)

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 110
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Výpis duplicitních položek
« Odpověď #6 kdy: 27-09-2020, 12:19:02 »
Trochu mi uniká pointa.
Ty nemůžeš mít ve skladu 2 doklady, na kterých by byla ta stejná položka? Takže nikdy nepřijmeš v průběhu času na 2 příjemkách tu stejnou položku? Nikdy nepřijmeš 100ks a pak to nevydáš na několika výdejkách?

Co konkrétně hledáš?
Hledáš doklady, které jsou tam omylem zadané 2x?
Hledáš doklady, na kterých je jedna položka zadaná vícekrát?

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 337
  • Karma: 9
    • Verze Delphi: XE2
Re:Výpis duplicitních položek
« Odpověď #7 kdy: 30-09-2020, 09:22:24 »
Trochu mi uniká pointa.

Nee,  ;)
Ten SQL příklad   byl pouze ilustrační kvůli přehlednosti , v praxi se jedná o to že v jeden okamžik bych neměl mít více různých produktů v jedné nádobě 

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 110
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Výpis duplicitních položek
« Odpověď #8 kdy: 02-10-2020, 06:29:41 »
Aha, takže jde o výrobu a zřejmě co nádoba to sklad. Do toho budeš muset zapojit i čas, protože nádobu výrobou naplníš a pak ji postupně vyprazdňuješ. Okamžitý stav se řeší jednoduše, ale musíš počítat i s opravami a tam už se času nevyhneš.

Jednodušeji by se to řešilo, kdybys ošetřoval vkládání a nedovolil duplicitu vložit než pak zjišťovat, kde duplicity byly.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 337
  • Karma: 9
    • Verze Delphi: XE2
Re:Výpis duplicitních položek
« Odpověď #9 kdy: 02-10-2020, 08:44:19 »
Aha, takže jde o výrobu a zřejmě co nádoba to sklad. Do toho budeš muset zapojit i čas, protože nádobu výrobou naplníš a pak ji postupně vyprazdňuješ. Okamžitý stav se řeší jednoduše, ale musíš počítat i s opravami a tam už se času nevyhneš.
Jednodušeji by se to řešilo, kdybys ošetřoval vkládání a nedovolil duplicitu vložit než pak zjišťovat, kde duplicity byly.

Samozřejmě , že kontrolu si můžeš nastavit i v v čase a  i okamžitý stav.  Ale problém ti nastane pokud uživatel dělá zpětné opravy a v praxi řeší datum nikoliv přesný čas.
Musím počítat i se situací kdy se výroba zapisuje  zpětně atd. Ale myslím že zrovna ty tuhle problematiku důvěrně znáš ..   Pokud tedy znáš Vyškov a kluky z AutoContu ;)



Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 110
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Výpis duplicitních položek
« Odpověď #10 kdy: 02-10-2020, 14:04:49 »
Samozřejmě , že kontrolu si můžeš nastavit i v v čase a  i okamžitý stav.  Ale problém ti nastane pokud uživatel dělá zpětné opravy a v praxi řeší datum nikoliv přesný čas.
Musím počítat i se situací kdy se výroba zapisuje  zpětně atd. Ale myslím že zrovna ty tuhle problematiku důvěrně znáš ..   Pokud tedy znáš Vyškov a kluky z AutoContu ;)

Právě v tom případě bych před zápisem provedl kontrolu, zda položka pro daný čas a nádobu již existuje. Bude to univerzální pro nový zápis i pro opravy. Určitě má každý záznam nějaké jednoznačné ID, takže budeš schopný ten konkrétní záznam při kontrole ignorovat.
Pro daný čas, položku a nádobu se podívám, jestli už tam položka existuje. Pokud ano a bude souhlasit ID záznamu (opravuju ten samý záznam), pak můžu zápis provést. Pokud ID nesouhlasí, došlo by po zápisu k duplicitě.
Tohle se nejlíp řeší v uložených procedurách.

P.S. ATC Vyškov znám, ale už jsem tam dlouho nebyl.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 337
  • Karma: 9
    • Verze Delphi: XE2
Re:Výpis duplicitních položek
« Odpověď #11 kdy: 02-10-2020, 14:46:41 »
Právě v tom případě bych před zápisem provedl kontrolu, zda položka pro daný čas a nádobu již existuje.
Základní je pojem "ČAS" .
Pokud tím myslíš přesný čas pohybu např. ve formatu "DD.MM. YYYY hh:mm:ss"  tak by ho tam musel uživatel i zapisovat protože datum zápisu se určitě neshoduje s okamžikem vlastního
pohybu. A to si tedy nedokáži představit jak by taková aplikace byla akceptována.
Nehledě i kdyby našel takového uživatele , tak při pohybech (pracovních operacích) které které "v jednom čase" vyprazdňují nádoby a naplnuji nádoby (někdy i ty stejné) bych musel dělat sleepy
nebo mít rozlišení milisekundách aby mi tento princip fungoval.

Citace
Tohle se nejlíp řeší v uložených procedurách.
Osobně mám více volaných SP v rámci transakce

Citace
P.S. ATC Vyškov znám, ale už jsem tam dlouho nebyl.

Taky už jsem tam spoustu let nebyl ..

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 110
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Výpis duplicitních položek
« Odpověď #12 kdy: 05-10-2020, 07:14:30 »
Mám nádobu, kterou v nějakém okamžiku naplním. V té chvíli se tam dostane položka/položky a do okamžiku vyprázdnění tam ta samá položka (jak jsem pochopil) přijít nemůže.
Netuším (protože neznám tvé procesy), jak dlouho vyprázdnění od naplnění, jestli jsou to dny, hodiny, minuty, sekundy, jestli v jeden den může dojít několikrát k naplnění a vyprázdnění... Pokud je nejmenší jednotka den, pak se vůbec časem trápit nemusíš.

Já jsem použil pojem ČAS, protože ten zahrnuje datum i čas. Pokud čas nepotřebuješ, nepracuješ s ním, pak se bavme o dnech bez času. Ale pořád mi přijde jednodušší zkontrolovat před zápisem, jestli zápis můžu provést než řešit následné duplicity dodatečně.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 337
  • Karma: 9
    • Verze Delphi: XE2
Re:Výpis duplicitních položek
« Odpověď #13 kdy: 05-10-2020, 08:27:10 »
. Ale pořád mi přijde jednodušší zkontrolovat před zápisem, jestli zápis můžu provést než řešit následné duplicity dodatečně.

To v praxi nejde, proto že já do té nádoby občas potřebuji dát i něco zpětně v čase například mezi dvěmi obsazenostmi atd.
Takže tvoje idea je možná v některém, směru logická, ale myslím že bez
důkladnějšího popisu postupů si to asi stejně něvysvětlíme ..

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 110
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Výpis duplicitních položek
« Odpověď #14 kdy: 05-10-2020, 11:40:23 »
To v praxi nejde, proto že já do té nádoby občas potřebuji dát i něco zpětně v čase například mezi dvěmi obsazenostmi atd.

V té době ale máš nádobu prázdnou a ty to víš - naplnil jsi ji a vyprázdnil ale ještě nebyla znovu naplněna, i když je to v minulosti (naplněna bude až třeba další den).
A pokud budu kontrolovat, zda je nádoba naplněná a zda tam ta v té chvíli položka je, bude to v pořádku.¨
Jinak jaký bordel dovedou výrobáci dělat při pořizování moc dobře vím.