Avatar billede lanthernen Nybegynder
01. juli 2008 - 20:02 Der er 14 kommentarer og
1 løsning

SQL Forespørgsel

Heysa

Jeg har et udtræk som kører hos en kunde - udtrækket samler salgsdata op fra et kassesystem.

Som mit udtræk er nu kan jeg køre dette f.eks. kl. 22 om aftenen og statistikken bliver overført til et økonomi program.

Dette er sådan set fint nok men nu har jeg behov for at udtrækket skal køre hver time og jeg skal kun hente de nye solgte varer for den sidste time - lidt svært at forklare... men udtrækket skal første gang hente statistik fra kl. 9:00-9:59, anden gang det kører skal det være fra kl. 10:00-10:59 osv.

Jeg ved ikke om udtrækket skal bestå af 12 forskellige udtræk eller om det på nogen måde kan laves dynamisk. Det er dog ikke afgørende.

Mit udtræk som tager for hele dagen som det er nu ser sådan her ud:
select PLU,NodeNo as Kasse,DateSold as Salgsdato, QTY as Antal, Price+Tax as TotalPris, Tax as Moms from JNLtickets where day(DateSold)=day(getDate()) and month(DateSold)=month(getDate()) and year(DateSold)=year(getDate()) and NodeNo != 51 and NodeNo != 52 and NodeNo != 53 and NodeNo != 54 and NodeNo != 60 order by NodeNO, PLU
Avatar billede arne_v Ekspert
02. juli 2008 - 01:57 #1
måske noget med:

GROUP BY DATEPART(HH,feltnavn)
Avatar billede HenrikSjang Nybegynder
08. juli 2008 - 20:32 #2
En løsning jeg før har set er, at man laver en lille hjælpetabel i sin database. Denne tabel indeholder blot information om hvornår sidste data-kopiering blev foretaget.

Fx
CREATE TABLE DataKopieringsLog (
  Id INT IDENTITY (1,1) PRIMARY KEY,
  timestamp DATETIME
)

Hver gang du så kører dit kopieringsjob, laver du først lige en:

DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME

SELECT @FromDate = MAX(timestamp) FROM DataKopieringsLog
SET @ToDate = GETDATE()

Og så laver du din datakopiering med:

SELECT * FROM DinDataTabel
WHERE StatistikDato >= @FromDate
AND StatistikDato < @ToDate
GO

INSERT INTO DataKopieringsLog (timestamp) VALUES (@ToDate)
Avatar billede lanthernen Nybegynder
09. juli 2008 - 10:45 #3
hej sjang

jeg tester og du hører fra mig
Avatar billede lanthernen Nybegynder
09. juli 2008 - 12:11 #4
Hejsa

Jeg har oprettet tabellen og mit udtræk ser således ud nu:
DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME

SELECT @FromDate = MAX(timestamp) FROM DataKopieringsLog
SET @ToDate = GETDATE()

select PLU,NodeNo as Kasse,DateSold as Salgsdato, QTY as Antal, Price+Tax as TotalPris, Tax as Moms
from JNLtickets
where DateSold >= @FromDate
AND DateSold < @ToDate
and NodeNo != 51 and NodeNo != 52 and NodeNo != 53 and NodeNo != 54 order by NodeNO, PLU

INSERT INTO DataKopieringsLog (timestamp) VALUES (@ToDate)
GO

Når jeg tester fra query analyzer virker det perfekt men når jeg vil sætte det til at køre i en scheduler via import & export data får jeg en fejl når jeg vælger use a query to specify the data to transfer og kopierer ovenstående ind får jeg en fejl når jeg klikker på parse: unspecified error...
Avatar billede HenrikSjang Nybegynder
09. juli 2008 - 21:34 #5
Jeg kan ikke lige huske om der er nogle begrænsninger i hvad man kan fra en import/export ting - men du kan evt lave det hele som en stored procedure, og så kalde sp'en fra din schedule.
Avatar billede lanthernen Nybegynder
09. juli 2008 - 21:47 #6
ok... du får selvfølgelig point men kan du hjælpe med resten?
Avatar billede HenrikSjang Nybegynder
09. juli 2008 - 21:57 #7
Prøv at lave en stored procedure sådan her:

------------
CREATE PROCEDURE HentData
AS

DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME

SELECT @FromDate = MAX(timestamp) FROM DataKopieringsLog
SET @ToDate = GETDATE()

select PLU,NodeNo as Kasse,DateSold as Salgsdato, QTY as Antal, Price+Tax as TotalPris, Tax as Moms
from JNLtickets
where DateSold >= @FromDate
AND DateSold < @ToDate
and NodeNo != 51 and NodeNo != 52 and NodeNo != 53 and NodeNo != 54 order by NodeNO, PLU

INSERT INTO DataKopieringsLog (timestamp) VALUES (@ToDate)
----------

og inde i dit job laver du dette:
EXEC HentData

Prøv om det dutter.
Avatar billede lanthernen Nybegynder
09. juli 2008 - 21:58 #8
tror jeg er med på at lave en stored procedure men hvor vil du kalde den fra? og hvordan?
Avatar billede lanthernen Nybegynder
09. juli 2008 - 21:58 #9
ok prøver
Avatar billede HenrikSjang Nybegynder
09. juli 2008 - 22:02 #10
Jeg kom til at tænke på noget.. Måske skal du tilføje en SET NOCOUNT ON i sp'en:

------------
ALTER PROCEDURE HentData
AS
SET NOCOUNT ON

DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME

SELECT @FromDate = MAX(timestamp) FROM DataKopieringsLog
SET @ToDate = GETDATE()

select PLU,NodeNo as Kasse,DateSold as Salgsdato, QTY as Antal, Price+Tax as TotalPris, Tax as Moms
from JNLtickets
where DateSold >= @FromDate
AND DateSold < @ToDate
and NodeNo != 51 and NodeNo != 52 and NodeNo != 53 and NodeNo != 54 order by NodeNO, PLU

INSERT INTO DataKopieringsLog (timestamp) VALUES (@ToDate)
----------
Avatar billede lanthernen Nybegynder
09. juli 2008 - 22:16 #11
har lavet sp'en
Avatar billede lanthernen Nybegynder
09. juli 2008 - 22:20 #12
men vil du stadigvæk bruge import/export?

Og hvor vil du indtaste: EXEC HentData ???
Avatar billede lanthernen Nybegynder
09. juli 2008 - 22:23 #13
ok tror jeg har styr på dette - jeg kan dog først teste "live" i morgen - smid et svar - tak for hjælpen, det var super!
Avatar billede HenrikSjang Nybegynder
09. juli 2008 - 22:29 #14
"EXEC HentData" vil jeg indtaste der hvor du tidligere skrev "...når jeg vælger use a query to specify the data to transfer"

Håber du får det til at spille - ellers skriv igen.

Her kommer et svar.
Avatar billede lanthernen Nybegynder
09. juli 2008 - 22:32 #15
ja det fandt jeg ud af, takker
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