Avatar billede hundevennen Nybegynder
23. februar 2008 - 18:10 Der er 23 kommentarer og
2 løsninger

Hjælp til sql sætning

jeg har en side med en tilhørende mssql database - en slags vagtdatabase.
Jeg skal lave en udskriftsside hvor der hentes data fra databasen og det volder problemer.
Der er felterne datofra og datotil - tid - besætning og tekst.
Mit problem er at vagten går fra kl. 0500 og køre 24 timer - altså fra f.eks d. 22 til den 23 - døgnskift.
jeg bruger 2 formularer til at opdatere data i databasen - en til vagtoprettelse - der indeholder datofra og til tid og besætning.
En anden formular der indeholder datofra og til og tekst.
Både vagtoprettelse og tekstoprettelse bliver opdateret i samme tabel T_Dok.
Jeg skal danne et udskrift hvor data fra vagtoprettelsen kun optræder en gang indenfor de 24 timer og så skal jeg ha alle teksterne indenfor de 24 timer med også??
Avatar billede terry Ekspert
24. februar 2008 - 11:11 #1
what programming language are yyou usning to make your forms/reports?

Can you give more information on the actual data, maybe with an example, amnd also what you expect to see in the report?
Avatar billede hundevennen Nybegynder
24. februar 2008 - 13:27 #2
Terry - jeg bruger ASP - de 2 datofelter er datofelter - resten er tekst.
jeg forventer øverst på udskriften at se vagtoprettelsen for den aktuelle dag og derefter alle de tekster der  der er gældende indenfor de 24 timer vagten varer - altså fra f.eks den 220208 kl. 0500 til den 230208 kl. 0500.
Egentlig kan det måske gøres ved at lave 2 sqlsætninger - den ene der henter vagten og en der henter teksterne??
Avatar billede terry Ekspert
24. februar 2008 - 13:55 #3
Well if all of the data is in one table then you migh t as well just use one SQL select to get all of the records. Then take the information which is for the "vagt" from the first record and then all of the "tekster" starting from the first record and up to the last.

How do you distinguish (how can you see) the difference between the last record from a "vagt" (230208 kl. 0500) and the first record of the next "vagt" which will (might) have the smae dat/time (230208 kl. 0500). One "vagt" ends when the next "vagt" starts!
Avatar billede terry Ekspert
24. februar 2008 - 14:07 #4
Maybe you should consider normalizing your table(s) also. The way I see it you should have at least three tables.
One for the "Vagt info", another for the "tekster" and maybe also one for "besætning" which would actually have its own tabel with a link table between that and the "vagt" table (many-to-many), So there's four tables.
Avatar billede hundevennen Nybegynder
24. februar 2008 - 16:32 #5
Der er ikke noget felt der hedder vagt - kun besætning.
Den eneste måde at se forskel er TID - alle vagter slutter 0459.
En vagtoprettelse vil består af f.eks:
datofra og datotil og besætning.
En tekst vil består af:
datofra og datotil og tid og tekst.

så for at fange det jeg vil ha førsst på siden skal altså være noget med

SELECT * FROM T_Dok WHERE datofra = date(date kommer fra formularen) and datotil = date1(anden formularfelt)AND besætning is not null.

Det skulle gi mig vagtoprettelsen den pågældende dag.
Nu skal jeg så ha alle teksterne for den dag også altså

SELECT * FROM T_Dok WHERE (datofra = date(date kommer fra formularen)AND tid > 0500) (AND datotil = date1(anden formularfelt)AND tid < 0500) and besætning is null.

Men hvordan for jeg dem lagt sammen til en sætning eller en anden løsning som du siger med flere tabeller måske
Avatar billede terry Ekspert
24. februar 2008 - 16:52 #6
"de 2 datofelter er datofelter - resten er tekst."
Are the times also text? If so then your not making things easy for yourself, why dont you havethe date and time in the same dateTime field?
Avatar billede hundevennen Nybegynder
24. februar 2008 - 16:53 #7
Hvis jeg laver 2 tabeller f.eks T_Dok og T_besætning - skal jeg jo alligevel ha 2 sqlsætninger på samme side for at få lavet en vagtrapport som det hele handler om.
Altså med selve vagtoprettelsen(besætningen)som første record på siden og derefter alle teksterne i tidsrækkefølge
Avatar billede terry Ekspert
24. februar 2008 - 16:54 #8
And do you only have one Time (Tid) field?

Can you show which fields you have and the datatype please?
Avatar billede terry Ekspert
24. februar 2008 - 16:56 #9
24/02-2008 16:53:05 I dont know enough about your database so I cant say for sure which tables/fields you need.
Avatar billede terry Ekspert
24. februar 2008 - 16:58 #10
If you have two tables then as long as there is a relationship between the two tables you can use one SQL to select data from both tables at the same time.
Avatar billede hundevennen Nybegynder
24. februar 2008 - 17:43 #11
T_Dok indeholder datofra(ddmmyy), datotil(ddmmyy), tid(varchar(4)), tekst(varchar), besætning(varchar).
Kunne relationen i 2 tabeller være på datofra så jeg har tabel T_Dok der indeholder felterne datofra, datotil, tid, tekst og tabellen T_besætning der indeholder datofra og besætning.
Der kan man måske lave et INNERJOIN på datofra?
Avatar billede terry Ekspert
24. februar 2008 - 18:14 #12
This is the way I see it. Having a table for teames (T_Team) ensures that you always use the same name (spelling) for a team.
A Vagt (T_Vagt) is for a period (FraDatoTid TilDatoTid) and a team covers the Vagt period.
For each Vagt period a number of text records (T_Dok) get written.

Does this make sence?


T_Team
TeamID Integer (Primary Key)
TeamName VarChar...

T_Vagt
VagtID Integer (Primary Key)
FraDatoTid dateTime
TilDatoTid dateTime
TeamID Integer > (Foreign key) relation to T_Team.TeamID


T_Dok
DokID Integer (Primary Key)
VagtID Integer (Foreign key) relation to T_Vagt.Vagt.ID
DatoTid  DateTime
Tekst    VarChar...
Avatar billede terry Ekspert
24. februar 2008 - 18:18 #13
With these tables/fields relationships I can find all T_Dok records for a specific Vagt (T_Vagt) and we can see which Team (besætning) was responsible for the Vagt.
Avatar billede hundevennen Nybegynder
24. februar 2008 - 18:39 #14
there is no specific team - øh - det er derfor at besætning er et tekstfelt - det består af forskellige personer i hver vagt
Avatar billede terry Ekspert
24. februar 2008 - 18:52 #15
:o)
Do you need to be able to see who (people) is on that "vagt"? If so then you should have a table which contains all people too.

t_person
PersonID Integer (primary key)
PersonNavn
.
.

Then you would need a table which show the people who are on the "Vagt"
Avatar billede hundevennen Nybegynder
24. februar 2008 - 18:55 #16
Personerne er ikke kendte navne
Avatar billede terry Ekspert
24. februar 2008 - 18:56 #17
What I am trying to explain is that it is very easy to put all of your data in one table (un-normalized) which can give you problems later.
Avatar billede terry Ekspert
24. februar 2008 - 19:04 #18
OK, how about this?

T_Vagt
VagtID Integer (Primary Key)
Beseatning Varchar...
FraDatoTid dateTime
TilDatoTid dateTime

T_Dok
DokID Integer (Primary Key)
VagtID Integer (Foreign key) relation to T_Vagt.Vagt.ID
DatoTid  DateTime
Tekst    VarChar...
Avatar billede terry Ekspert
24. februar 2008 - 19:05 #19
T_Dok doesnt need VagtID
Avatar billede hundevennen Nybegynder
24. februar 2008 - 19:34 #20
det giver mig mening med de 2 tabeller
Hvordan vil du så lave selve sqlsætningen
Avatar billede terry Ekspert
24. februar 2008 - 21:48 #21
SELECT dbo.t_vagt.Beseatning, CAST(FLOOR(CAST(dbo.t_vagt.DatoTidFra AS FLOAT)) AS DATETIME) AS VagtDato, dbo.t_vagt.DatoTidTil,
              dbo.t_dok.DatoTid, dbo.t_dok.Tekst
FROM  dbo.t_vagt INNER JOIN
              dbo.t_dok ON dbo.t_vagt.VagtID = dbo.t_dok.VagtID
WHERE CAST(FLOOR(CAST(dbo.t_vagt.DatoTidFra AS FLOAT)) AS DATETIME) = '2008-02-14'
Avatar billede terry Ekspert
24. februar 2008 - 21:51 #22
In your ASP you would use something like this

DIM sSQL

sSQL = "SELECT dbo.t_vagt.Beseatning, CAST(FLOOR(CAST(dbo.t_vagt.DatoTidFra AS FLOAT)) AS DATETIME) AS VagtDato, dbo.t_vagt.DatoTidTil,
              dbo.t_dok.DatoTid, dbo.t_dok.Tekst
FROM  dbo.t_vagt INNER JOIN
              dbo.t_dok ON dbo.t_vagt.VagtID = dbo.t_dok.VagtID
WHERE CAST(FLOOR(CAST(dbo.t_vagt.DatoTidFra AS FLOAT)) AS DATETIME) = " & SomeDateFromYourASPGoesHere
Avatar billede terry Ekspert
24. februar 2008 - 21:52 #23
NOTE: I dont know much about ASP but you need to replace
SomeDateFromYourASPGoesHere with a variable from your ASP which contains the date of the "Vagt" you want in your report.
Avatar billede hundevennen Nybegynder
24. februar 2008 - 22:30 #24
thanx a lot
Avatar billede terry Ekspert
25. februar 2008 - 18:42 #25
selv tak, hope you could use the answer
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester