Bij het verwijderen, item moet in de DB bewaard blijven

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mohamed nvt

Mohamed nvt

11/04/2017 14:48:57
Quote Anchor link
Hallo allemaal,

Voor mijn website wil ik graag het volgende:

Een overzicht van alle medicijnen die over 6 maanden of 3 maanden of over 1 maanden zullen verlopen. De standaard waarde zal zijn op 6 maanden, maar er zal een dropdown menu zijn waarvan de ingelogde user de drie bovenstaande waardes kan kiezen. En, nu het belangrijkste onderdeel van dit overzicht is dat de verlopen medicijn verwijderd kan worden van dit overzicht, maar dit medicijn moet wel blijven staan in de database.

Iemand een idee hoe ik kan dit aanpakken, dus verwijderen uit het overzicht, maar blijven staan in de DB.
 
PHP hulp

PHP hulp

19/01/2021 09:40:17
 
- Ariën -
Beheerder

- Ariën -

11/04/2017 14:52:48
Quote Anchor link
Als je medicijnen wilt kunnen verwijderen, maar wel beschikbaar wilt houden voor in bijv. logs. Dan raad ik aan om de medicijnen bij verwijdering te markeren als 'verwijderd' (bijv. met een 1 of 0). Dit kan gewoon met een extra veld. Je moet er dan zelf wel voor zorgen dat je normaal alleen de medicijnen toont die niet als verwijderd gemarkeerd zijn.
 
Thomas van den Heuvel

Thomas van den Heuvel

11/04/2017 14:54:27
Quote Anchor link
Maak een "expired" veld?
Voorzie als je queries van WHERE ... expired = 0.
Maak een trigger of cron die de expired-flag van items die over de verloopdatum zijn op 1 zet.

Klinkt alsof er niet goed is nagedacht over het database-ontwerp?

EDIT: "verwijderd" weerspiegelt mogelijk niet goed wat er aan de hand is. Ik zou bij "verwijderd" verwachten dat een medicijn niet langer in een assortiment voorkomt (doordat deze bijvoorbeeld niet meer leverbaar is), dat is niet hetzelfde als verlopen zijn. En mogelijk moet je hier ook rekening mee houden: WHERE ... expired = 0 AND deleted = 0 of wat dan ook. Of je maakt één flag die aangeeft of een medicijn beschikbaar is: WHERE ... available = 1. En zet je deze op 0 als één of meer condities voor het niet-beschikbaar zijn gelden.

Hier zul je in ieder geval in ALLE queries dan rekening mee moeten houden. Of jezelf elke keer de vraag moeten stellen of er 1 of meer extra condities opgenomen dienen te worden.
Gewijzigd op 11/04/2017 15:01:10 door Thomas van den Heuvel
 
John D

John D

11/04/2017 15:59:50
Quote Anchor link
Is wellicht handiger om gewoon de de datum van verlopen te gebruiken? Waarom expired of deleted vlaggetjes toevoegen als er een datum "verlopen" is? Gewoon dus die meenemen in de query?? WHERE datum_verlopen > TODAY
Gewijzigd op 11/04/2017 16:00:28 door John D
 
- Ariën -
Beheerder

- Ariën -

11/04/2017 16:03:06
Quote Anchor link
Thomas van den Heuvel op 11/04/2017 14:54:27:
Hier zul je in ieder geval in ALLE queries dan rekening mee moeten houden. Of jezelf elke keer de vraag moeten stellen of er 1 of meer extra condities opgenomen dienen te worden.

Dit intrigeert mij behoorlijk. Is er in MySQL geen filter-optie om op een manier bij een normale SELECT .. FROM... WHERE id =... ook automatisch te kunnen filteren op alles wat bijvoorbeeld geflagd is als niet-verwijderd/available in een apart veld.
Gewijzigd op 11/04/2017 16:04:05 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

11/04/2017 16:40:29
Quote Anchor link
@JohnD dat kan natuurlijk altijd maar er valt misschien iets voor te zeggen om zo'n status redundant op te slaan om queries wat simpeler te houden. Maar goed in feite verplaats je dan het werk.
@Ariën de simpelste manier om te filteren is door condities op te nemen in de WHERE clause? :p Ik ken geen native voorzieningen hiervoor en dit gaat misschien ook wat ver qua automatisering omdat MySQL niet op voorhand weet welke informatie jij wilt hebben? Misschien zit je te denken aan een VIEW waarin je bijvoorbeeld de id's van "beschikbare" medicijnen opvraagt? Desalniettemin zul je je bij elke query goed moeten afvragen welke informatie je wilt, welke constructie je ook gebruikt.
 
John D

John D

11/04/2017 16:48:41
Quote Anchor link
- Ariën - op 11/04/2017 16:03:06:
Dit intrigeert mij behoorlijk. Is er in MySQL geen filter-optie om op een manier bij een normale SELECT .. FROM... WHERE id =... ook automatisch te kunnen filteren op alles wat bijvoorbeeld geflagd is als niet-verwijderd/available in een apart veld.
Uiteraard is het antwoord hierop een VIEW zoals Thomas al aangeeft. Je hoeft dan niet alle queries te uit te breiden. Het is een keuze of queries aanpassen of een view. Overigens moet je in alle gevallen je queries uitbreiden, ook waneer je een vlaggetje expired, verlopen of deleted toevoegt.
@Thomas: Over redundant opnemen van wat dan ook is mijn mening: Niet doen, in ieder geval geen redundantie in dezelfde tabel.
Gewijzigd op 11/04/2017 16:49:59 door John D
 
Ivo P

Ivo P

11/04/2017 17:21:54
Quote Anchor link
ik mis een beetje in het verhaal de mogelijkheid dat van een medicijn meerdere batches aanwezig zijn.
Bijvoorbeeld 1000 tabletten paracetamol die nog tot juni 2017 "goed" zijn, en 2000 die een datum van december 2017 hebben.

Het soort medicijn dient dus apart te staan.

---
De verlooopdatum ligt redelijk vast (al schijnt het ook mogelijk te zijn om die datum wat op te rekken, al naar gelang soort medicijn en de prijs)
Wanneer een script dat toont als "bijna verlopen", is aan het script. Dat moet niet in de database staan.
 
Mohamed nvt

Mohamed nvt

11/04/2017 20:24:19
Quote Anchor link
Hallo allemaal,

Wellicht is mijn initieel verhaal niet helemaal duidelijk en zal hieronder meer achtergrond info geven.

Ten eerste; alle ingevoerde medicijnen moeten ten aller tijden bewaard worden in de DB, want deze info wordt gebruikt voor andere redenen:
1. Hoeveel medicijnen in totaal zijn opgeslagen
1. Hoeveel medicijnen zijn per maand opgeslagen

Naast bovenstaande punten wil ik de ingelogde gebruiker meer controle geven over welk medicijn(en) binnenkort zal verlopen. Ik wil dus een overzicht aanbieden, waarin de verloopdatum overeenkomt met komende 6 maanden of komende 3 maanden of komende 1 maand.

Vervolgens, zal de ingelogde gebruiker het betreffende medicijn kunnen weggooien of in de aanbieding doen, omdat het binnenkort zal verlopen. En, het betreffende medicijn uit dit overzicht verwijderen, want betreffende medicijn is nu onder controle!

Het is een lang verhaal geworden, maar hopelijk nu duidelijk.

Toevoeging op 12/04/2017 09:53:28:

- Ariën - op 11/04/2017 14:52:48:
Als je medicijnen wilt kunnen verwijderen, maar wel beschikbaar wilt houden voor in bijv. logs. Dan raad ik aan om de medicijnen bij verwijdering te markeren als 'verwijderd' (bijv. met een 1 of 0). Dit kan gewoon met een extra veld. Je moet er dan zelf wel voor zorgen dat je normaal alleen de medicijnen toont die niet als verwijderd gemarkeerd zijn.

Hallo Ariën,

Je hebt een punt, maar ik wil betreffende medicijn enkel verwijderen uit het overzicht, waarin staat welke medicijn over 6 maanden zal verlopen.
Dus de betreffende medicijn moet altijd beschikbaar blijven als ik wil weten hoeveel medicijnen in totaal zijn toegevoegd en hoeveel medicijnen zijn per maand toegevoegd.
 
Ward van der Put
Moderator

Ward van der Put

12/04/2017 11:34:58
Quote Anchor link
Het lijkt me dat je dan toch wat beheerkolommen moet toevoegen:

- datum waarop een medicijn is toegevoegd;
- datum waarop een medicijn over de datum is;
- datum waarop een medicijn is verwijderd door de gebruiker.

En misschien nog wel meer, want er zijn verschillende soorten houdbaarheidsdatums.

Ik kan je The Data Model Resource Book van Len Silverston aanbevelen: geen goedkoop boek, maar het behandelt vrijwel alle situaties waar je tegenaan bent gelopen in je voorbije topics. Ook dit boek zal je, net zoals Ivo, aanbevelen de inkoop en goederenontvangst FIFO op te splitsen in batches/partijen.
 
Mohamed nvt

Mohamed nvt

13/04/2017 09:44:19
Quote Anchor link
Ward van der Put op 12/04/2017 11:34:58:
Het lijkt me dat je dan toch wat beheerkolommen moet toevoegen:

- datum waarop een medicijn is toegevoegd;
- datum waarop een medicijn over de datum is;
- datum waarop een medicijn is verwijderd door de gebruiker.

En misschien nog wel meer, want er zijn verschillende soorten houdbaarheidsdatums.

Ik kan je The Data Model Resource Book van Len Silverston aanbevelen: geen goedkoop boek, maar het behandelt vrijwel alle situaties waar je tegenaan bent gelopen in je voorbije topics. Ook dit boek zal je, net zoals Ivo, aanbevelen de inkoop en goederenontvangst FIFO op te splitsen in batches/partijen.


Hallo Ward van der Put,

Als ik jouw feedback goed begrijp, dan moet ik het volgende doen:
1. In de medicijn tabel een extra kolom toevoegen met de naam verwijderd en default waarde moet 0 zijn.
2. In het normale overzicht wordt er niets veranderd wat betreft query's, want alle medicijnen worden gewoon weergegeven.
3. In het overzicht "expired medicine" worden alleen medicijnen weergeven die over een 6 maanden of 3 maanden of over 1 maand zullen verlopen, EN waarvan de waarde van verwijderd kolom niet gelijk is aan het getal 1.
4. Want wanneer ik een medicijn verwijder uit het overzicht "expired medicine", dan wordt de waarde van het verwijderd kolom gezet op het getal 1.

Klopt een beetje over met wat je hierboven aangeeft?

BTW; bij het invoeren van elk medicijn wordt er reeds, productie_datum, verloop_datum toegevoegd aan de DB plus de datum waarop betreffende medicijn is toegevoegd aan de DB.
 
Mohamed nvt

Mohamed nvt

19/04/2017 11:51:08
Quote Anchor link
Hallo allemaal,

Zou iemand willen meedenken over onderstaande query, want het werkt helaas niet.

Een korte toelichting over de query;
met onderstaande query wil ik een overzicht hebben over de medicijnen die over een half jaar zullen verlopen oftewel de expiredate is gelijk aan over 6 maanden. En waarvan de waarde van het kolom verwijderd groter is dan een 0.

select id, medicinename, expiredate from medicines where expiredate = date_add(now(), interval 6 month) and verwijderd > 0
 
Ivo P

Ivo P

19/04/2017 12:10:15
Quote Anchor link
je zoekt dus die waarvoor de expiredate precies over 6 maanden ligt (19-10-2017),
en waarvoor verwijderd <> 1

ik zou dan die "> 0 " vervangen door "<> 1 "

En even nadenken over "precies over 6 maanden", of iets als "binnen zes maanden", aangezien je anders elke dag moet kijken, ook op zaterdag en zondag, om niets te missen.
 
Mohamed nvt

Mohamed nvt

19/04/2017 12:21:57
Quote Anchor link
Hallo Ivo P,

Bedankt voor je reactie, maar het werkt niet.
Ik heb nu als test een medicijn toegevoegd die over een half jaar 2017-10-19 zal verlopen en bij het uitvoeren van dit query, krijg ik dit medicijn niet terug. Eigenlijk verschijnt helemaal niets.

En, wat betreft precies 6 maanden vind ik niet praktisch, maar het liefste 10 dagen ervoor of 10 dagen ernaar.

select id, medicinename, expiredate from medicines where expiredate = date_add(now(), interval 6 month) and verwijderd <> 1;
 
Ward van der Put
Moderator

Ward van der Put

19/04/2017 12:55:59
Quote Anchor link
SELECT DATE_ADD(NOW(), INTERVAL 6 MONTH) geeft je een datum met tijd, zojuist bijvoorbeeld '2017-10-19 12:41:53'. Dat ligt ná '2017-10-19'.

Maar er bijvoorbeeld SELECT DATE_ADD(CURDATE(), INTERVAL 6 MONTH) van voor een datum.

Let verder op de vergelijkingsoperator: <= is binnen 6 maanden en = is over precies 6 maanden.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT id, medicinename, expiredate
  FROM medicines
 WHERE verwijderd <> 1
   AND expiredate <= DATE_ADD(CURDATE(), INTERVAL 6 MONTH))


Voor 10 dagen eerder of later wordt het zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT id, medicinename, expiredate
  FROM medicines
 WHERE verwijderd <> 1
   AND expiredate <= DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 6 MONTH), INTERVAL 10 DAY)
   AND expiredate >= DATE_SUB(DATE_ADD(CURDATE(), INTERVAL 6 MONTH), INTERVAL 10 DAY)
 
Mohamed nvt

Mohamed nvt

19/04/2017 14:41:53
Quote Anchor link
Hallo Ward van der Put,

Bedankt voor je feedback & uitleg.
Nu is er een deel van het probleem opgelost :)
De periode van 6 maanden staat nu vast, maar het liefste wil ik het in een variabel hebben. Een dropdown-list eigenlijk waaruit een gebruiker kan kiezen voor 1 maand, 3 maanden of 6 maanden en op basis van gekozen maand het overzicht veranderd.

Moet dit middels een form gebeuren of is het eenvoudiger via jquery te laten doen?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.