webForumDet fria alternativet

Skydd mot dubbelpostning

9 svar · 693 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 441 inlägg
#1

Tjena
Håller på med en appl. för lönerapportering, där man loggar in och lägger till den tid man arbetat.
De saker man anger är:
---------------------------------------------
- Datum
- Löneart (Ordinarie, Sjukdom, Övertid etc.)
- Starttid
- Sluttid
---------------------------------------------

När man lägger till en viss dag, så kan man dela upp den på flera lönearter.
Säg att man jobbat ordinarie 07:00 - 16:00 och sen jobbar övertid 16:00 - 18:00.
Nu vill jag göra ett skydd så att man inte ska kunna lägga till samma post (eller en till post inom samma tidsram) mer än en gång.

Såhär har jag gjort:

sSql =	"SELECT hId, hType, hTheDay, hStart, hEnd " &_
	"FROM tbl_hours " &_
	"WHERE hTheDay = '" & hTheDay & "' " &_
	"AND hType = " & hType & " " &_
	"AND hStart BETWEEN '" & hStart & "' AND '" & hEnd & "' " &_
	"OR hEnd BETWEEN '" & hStart & "' AND '" & hEnd & "' "

Det här innehåller de variabler som används ovan:
- hTheDay (Dagen det gäller i formatet xxxx-xx-xx)
- hType (Löneart i numeriskt format)
- hStart (Tiden man börjar arbeta (i formatet xx:xx)
- hEnd (Tiden man slutat arbeta (i formatet xx:xx)

Nu funkar inte det här riktigt som jag vill, i det h'är läget går det att dubbelposta.
Tanken är att har man lagt till en post, ska man inte kunna lägga till ytterliggare en som ligger inom samma tid (om man tex. lagt till en post mellan 08:00 - 13:00 ska man endast kunna lägga till en till där tiden ligger före eller efter 08:00 resp. 13:00.

Så, hur ska jag lösa det här, har sökt som en tok, men hittar inget jag kan dra nytta av.

Tack på förhand!

@ndersMedlem sedan juni 200032 969 inlägg
#2

Du borde använda parenteser för att gruppera dina villkor, om inte annat för tydligehtens skull.

	"AND (hStart BETWEEN '" & hStart & "' AND '" & hEnd & "') " &_
	"OR (hEnd BETWEEN '" & hStart & "' AND '" & hEnd & "') "

Men vad menar du blir fel? Vad blir resultatet, och vad förväntar du dig?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#3

hej,
det jag vill är alltså att man inte ska kunna lägga till två poster som ligger på samma dag, inom samma tidsram (börjat - slutat).
Säg att jag lagt till att jag börjat 08:00 och slutat 16:00 en dag, då ska jag inte kunna lägga till ytterliggare en där datumet (hTheDay) är detsamma och där start och sluttid ligger inom 08:00 och 16:00.

Med ovanstående fråga som jag använder så går det inte att överhuduvtaget lägga till mer än en post, vilket inte heller är bra.

Om man lägger in att jag jobbat ordinarie mellan 07:00 och 16:00, ska jag fortfarande kunna lägga till att jag jobbar övertid mellan tex. 16:00 - 18:00.

Därimot ska jag inte kunna lägga till en post som ligger inom samma tidsramar som en som redan finns.

Säg till om jag är otydlig.

Tack!

@ndersMedlem sedan juni 200032 969 inlägg
#4

Jag vill veta hur den färdiga SQL-frågan ser ut.
Jag vill veta hur ditt resultat ser ut, och hur det borde se ut.

Jag förstår vad du är ute efter, men om du inte berättar hur ditt data och din färdiga SQL-fråga ser ut kan vi bara gissa.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#5

Okej, återkommer imorrnbitti när jag åter sitter med koden framför mig.
Du kan dessvärre inte få se hur mitt resultat borde se ut, för visste jag det hade jag inte vänt mig hit ;)

MickeA.comMedlem sedan feb. 20034 441 inlägg
#6

Morrn'
Då gör vi ett nytt försök, det här är frågan som den ser ut nu:

sSql =	"SELECT hId, hType, hTheDay, hStart, hEnd " &_
	"FROM tbl_hours " &_
	"WHERE hTheDay = '" & hTheDay & "' " &_
	"AND hType = " & hType & " " &_
	"AND (hStart BETWEEN '" & hStart & "' AND '" & hEnd & "') " &_
	"OR (hEnd BETWEEN '" & hStart & "' AND '" & hEnd & "') "

Såhär kan en utskrift se ut:

SELECT hId, hType, hTheDay, hStart, hEnd 
FROM tbl_hours 
WHERE hTheDay = '2006-08-25' 
AND hType = 1 
AND (hStart BETWEEN '07:00' AND '16:00') 
OR (hEnd BETWEEN '07:00' AND '16:00')

Frågan är i nuläget inte rätt över huvudtaget.
Syftet är som sagt att man inte ska kunna lägga till två poster samma dag som ligger inom samma tidsram.

Vill ni se mer kod?

mozillaMedlem sedan juli 20011 084 inlägg
#7

En tanke som slog mig var att om man gjorde om tabell strukturen lite:

Löneart
Start_datum (datetime)
Slut_datum (datetime)

Och om du använder mysql 5 (eller ms-sql) skulle man kunna göra något likt detta. (jag valde att använda parametrar också för bättre överblick)

INSERT INTO tbl_hours (hType,hStart,hEnd) 
SELECT ?type,?start,?end
FROM DUAL 
WHERE NOT EXISTS 
  (SELECT * FROM tbl_hours 
  WHERE hType = ?type AND 
  ((?start BETWEEN hStart AND hEnd) OR 
  (?end BETWEEN hStart AND hEnd)))

Sedan gäller det att du fångar upp ifall någon Insert genomfördes eller inte, vilket variera beroende på vilket språk du använder.

PS. Om du inte använder mysql 5 eller my-sql och inte har stöd för parametrar så borde det gå bättre om du byter plats på BETWEEN villkoren. ('" & hStart & "' BETWEEN hStart AND hEnd)

MickeA.comMedlem sedan feb. 20034 441 inlägg
#8

Tjena,
jag har tillgång till MySQL 5 just nu, men inte på webbhotellet där sidan ska ligga senare.
Ska testa att byta plats på villkoren i frågan, men kom på en lite sak.

Mina fält hStart resp. hEnd är av type Time, men när jag ska skriva ut ett värde så läggs dagens datum på automatiskt till fältvärdet, vilket ställer till det en hel del för mig, var det därför du vill att jag skulle ändra till start_datum resp. slut_datum...?

Kollar jag i databasen är alla fält i formatet xx:xx:xx men när jag skriver ut tex. hStart med ASP'n så står det xxxx-xx-xx xx:xx:xx där datum alltid är dagens.

Det har ställer till det rätt mycket när jag tex. ska räkna ut skillnaden mellan två klockslag, för det blir såklart helt fel.
Nyss tex. fick jag ut att det är 15minuter mellan 15:15:00 och 16:00:00, när det i själva verket beror på att den skriver ut ett felaktigt värde till funktionen.

Ska tillägga att jag använder ASP.

Tack på förhand!

mozillaMedlem sedan juli 20011 084 inlägg
#9

Jag vet inte om ditt problem är relaterat till just att du använder dig av tid-fält. Men jag tycket själv det känns bättre med date-time. Det blir mer flexibelt då, om du vill kan du jobba från 22.00 till 06.00 dagen efter. Med nuvarande system skulle det inte gå. (start och slutdatum skulle då innehålla både datum och tid)

Ett litet problem så du får fundera över är dock att om någon jobbar 06-16 och du sedan vill lägga till 16-20 så kommer mysql klaga eftersom tiden överlappar varandra. Du skulle dock kanske kunna dra av respektive lägga på en sekund/minut när du jämför de olika tiderna för att tillåta det.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#10

Ja just det, kanske kan vara något.
Just nu är dagen uppdelat i kvartar (15:00) mellan 06:00 och 22:00, men det kanske kan vara något, att visa 16:00 men att värdet egentligen är 16:01, det spelar ju ingen roll för själv funktionen.

Jag ska fundera lite mer på det här och se om jag får till något bra.

Återkommer!

133 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)