21. oktober 2002 - 13:28Der er
15 kommentarer og 2 løsninger
Lave en query med "tilfældige data"
Hej alle,
Jeg har et spørgsmål som jeg ikke helt ved hvordan jeg skal formulere, but here goes:
Jeg har lavet en query der f.eks. udregner følgende:
[theNumber] * 2
Den udskriver altså alle [theNumber], bare fordoblet.
Nu har jeg så en query som skal udregne disse ting for talene 1 - 5000. Altså opretter jeg en tabel med feltet [theNumber] og indsætter 5000 værdier...
En query kunne se sådan ud: SELECT [theNumber]*2 AS result FROM [tbl-numbers];
Det jeg nu gerne vil undgå er at lave en tabel med 5000 værdier i, men istedet forestillede jeg mig at man lavede en "For i = 1 to 5000" eller noget. Kan dette lade sig gøre?
(SQL koden jeg har er langt mere advanceret end ovenstående, men jeg har bare lavet dette eksempel for at vise hvad jeg vil) Jeg har også en årsag til at jeg ikke kan oprette en tabel med 5000 værdier.
I et stadigt mere komplekst trussel landskab, hvor sofistikerede cyberangreb, ransomware og datalækager udgør en konstant risiko, er IT-sikkerhed for længst rykket direkte ind i bestyrelseslokalet.
Fordi jeg skal lave en relation imellem to tabeller. Og da relationen imellem de to tabeller skal kædes til nogle felter, skal jeg til at oprette et til felt i de to tabeller så de kan kædes sammen.
F.eks.:
[tbl-numbers] id no
[tbl-prices] id price
Nu kan jeg så kæde de to tabeller sammen via feltet ID, men så skal jeg jo i [tbl-numbers] oprette 5000 poster for hver eneste [id]
Public Function GenerateTabel() Dim rs As New ADODB.Recordset Dim n As Long rs.Open "DinTabel", CurrentProject.Connection, adOpenKeyset, adLockOptimistic For n = 1 To 5000 rs.AddNew rs!TheNumber = n rs.Update Next n rs.Close Set rs = Nothing End Function
Du kan faktisk bare have en tabel udelukkende med de 5000 numre, og så stadig bruge tabellen i en forespørgsel. Du skal blot undlade at joine tabellen med [tbl-prices].
bodekaer-> min kode kræver en reference til ADO. Dvs, hvis du bruger Access 97 skal du gå i VBA->tools->References og finde "Microsoft ActiveX 2.x Object Library", hvis den er der. Hvis ikke, må du lige sige til.
Det har jeg faktisk også prøvet, men jeg bruger GROUP BY, og har det ikke indflydelse?
Nu kommer hele smøren lige :) :
SELECT [tbl-price_list].[price-autoid], #12/30/1899 10:0:0# AS sd, IIf(([ed]-[price-roundafter]) Mod [price-rounding]=0,1,0)*Max(Replace(IIf((DateAdd('n',[ed],[sd]) Between [period-starttime] And [period-endtime]) And (8 And 2^3),[period-hourly],-1),-1,[price-hourly]))/60 AS MinutePrice, IIf(DateAdd('n',[ed],[sd]) Between First([period-starttime]) And First([period-endtime]),First([period-startup]),[price-startup]) AS Startup, IIf(DateAdd('n',[ed],[sd]) Between First([period-starttime]) And First([period-endtime]),First([period-minimum]),[price-minimum]) AS Minimum, Max(IIf([ed]>[rate-afterminutes] And ([ed]<=[rate-tominutes] Or [rate-tominutes]=-1),[rate-discount],0))/100 AS Discount FROM [tbl-numbers], [tbl-price_discounts] RIGHT JOIN ([tbl-price_periods] RIGHT JOIN [tbl-price_list] ON [tbl-price_periods].[period-priceid] = [tbl-price_list].[price-autoid]) ON [tbl-price_discounts].[rate-priceid] = [tbl-price_list].[price-autoid] GROUP BY [tbl-price_list].[price-autoid], [tbl-price_list].[price-hourly], [tbl-price_list].[price-minimum], [tbl-price_list].[price-startup], [tbl-price_list].[price-rounding], [tbl-price_list].[price-roundafter] HAVING ((([tbl-price_list].[price-autoid])=2));
SELECT [tbl-price_list].[price-autoid], #12/30/1899 10:0:0# AS sd, IIf(([ed]-[price-roundafter]) Mod [price-rounding]=0,1,0)*Max(Replace(IIf((DateAdd('n',[ed],[sd]) Between [period-starttime] And [period-endtime]) And (8 And 2^3),[period-hourly],-1),-1,[price-hourly]))/60 AS MinutePrice, IIf(DateAdd('n',[ed],[sd]) Between First([period-starttime]) And First([period-endtime]),First([period-startup]),[price-startup]) AS Startup, IIf(DateAdd('n',[ed],[sd]) Between First([period-starttime]) And First([period-endtime]),First([period-minimum]),[price-minimum]) AS Minimum, Max(IIf([ed]>[rate-afterminutes] And ([ed]<=[rate-tominutes] Or [rate-tominutes]=-1),[rate-discount],0))/100 AS Discount FROM [tbl-numbers], [tbl-price_discounts] RIGHT JOIN ([tbl-price_periods] RIGHT JOIN [tbl-price_list] ON [tbl-price_periods].[period-priceid] = [tbl-price_list].[price-autoid]) ON [tbl-price_discounts].[rate-priceid] = [tbl-price_list].[price-autoid] GROUP BY [tbl-price_list].[price-autoid], [tbl-price_list].[price-hourly], [tbl-price_list].[price-minimum], [tbl-price_list].[price-startup], [tbl-price_list].[price-rounding], [tbl-price_list].[price-roundafter], [tbl-numbers].TheNumber HAVING ((([tbl-price_list].[price-autoid])=2));
hmm, jeg har lavet en simpelt eks. her, som virker:
SELECT Persontabel.PersonID, Sum(Persontabel.LønID) AS Løn, TheNumber FROM [tbl-numbers], Persontabel GROUP BY Persontabel.PersonID, [tbl-numbers].TheNumber;
Persontabel indeholder 8 PersonID'er og [tbl-Numbers] indeholder 5000.
Hvad fa'en, Proaccess! Det er første gang, jeg har set dig foreslå at man splittede en query op i 2. Du plejer da ellers at være mand for at kunne strikke 38 queries sammen til én :o)
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.