Avatar billede tommy_carstensen Nybegynder
24. august 2004 - 10:43 Der er 9 kommentarer og
1 løsning

loop, dynamisk variabel, sql, recordset, array, execute

Jeg vil gerne optimere min kode. Jeg vil gerne lave en løkke og gennem løkken kalde forskellige recordsets. Hvordan får jeg uden at gentage samme linie 5 gange (som det er tilfældet nu) defineret og udskrevet min variabel n_count_i og mit recordset rs_count_i? Jeg kan ikke finde svaret herinde
Kan jeg lave et array??? Skal jeg bruge eval eller execute??? Hvor og hvordan angiver jeg min dynamiske variabel???

SQL_count_1 = "SELECT Count(main_dep.dep_superid) AS count_1 FROM dbo.main_dep WHERE (((main_dep.dep_id_past)='" & dep_id_past & "') AND ((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_count_2 = "SELECT Count(main_dep.dep_superid) AS count_2 FROM dbo.main_dep WHERE (((main_dep.dep_id_past)='" & dep_id_past & "') AND ((NOT (main_dep.dep_id_future)='" & dep_id_future & "')));"
SQL_count_3 = "SELECT Count(main_dep.dep_superid) AS count_3 FROM dbo.main_dep WHERE (((NOT (main_dep.dep_id_past)='" & dep_id_past & "'))) AND (((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_count_4 = "SELECT Count(main_dep.dep_superid) AS count_4 FROM dbo.main_dep WHERE (((main_dep.dep_id_future)='" & dep_id_past & "'));"
SQL_count_5 = "SELECT Count(main_dep.dep_superid) AS count_5 FROM dbo.main_dep WHERE (((main_dep.dep_id_past)='" & dep_id_future & "'));"

SET rs_count_1 = Conn.Execute(SQL_count_1)
SET rs_count_2 = Conn.Execute(SQL_count_2)
SET rs_count_3 = Conn.Execute(SQL_count_3)
SET rs_count_4 = Conn.Execute(SQL_count_4)
SET rs_count_5 = Conn.Execute(SQL_count_5)

n_count_1 = rs_count_1("count_1")
n_count_2 = rs_count_2("count_2")
n_count_3 = rs_count_3("count_3")
n_count_4 = rs_count_4("count_4")
n_count_5 = rs_count_5("count_5")
Avatar billede glen5000 Nybegynder
24. august 2004 - 12:05 #1
Jeg skulle mene, at du kan lave det med arrays

dim SQL_where(5)
dim SQL_count(5)
dim rs_count(5)
dim n_count(5)

SQL_where = "(((main_dep.dep_id_past)='" & dep_id_past & "') AND ((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_where = "(((main_dep.dep_id_past)='" & dep_id_past & "') AND ((NOT (main_dep.dep_id_future)='" & dep_id_future & "')));"
SQL_where = "(((NOT (main_dep.dep_id_past)='" & dep_id_past & "'))) AND (((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_where = "(((main_dep.dep_id_future)='" & dep_id_past & "'));"
SQL_where = "(((main_dep.dep_id_past)='" & dep_id_future & "'));"

for i = 1 to 5
  SQL_count(i) = "SELECT Count(main_dep.dep_superid) AS count_1 FROM dbo.main_dep WHERE "& SQL_where(i)
  SET rs_count(i) = Conn.Execute(SQL_count(i))
  n_count(i) = rs_count(i)("count_"& i)
next


Håber det er noget der kan bruges :)

Hilsen Glen
Avatar billede tommy_carstensen Nybegynder
24. august 2004 - 14:44 #2
Hej Glen. Det virker ikke umiddelbart, men jeg tror, at du er inde på det rigtige med arrays. Lige nu er jeg på arbejde og kan ikke lave fejlfinding. Men i aften vender jeg frygteligt tilbage og kigger på dit forslag. Tak for hjælpen indtil nu.
Der er FYI problemer med følgende linier:
SQL_where = "(((main_dep.dep_id_past)='" & dep_id_past & "') AND ((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_where = "(((main_dep.dep_id_past)='" & dep_id_past & "') AND ((NOT (main_dep.dep_id_future)='" & dep_id_future & "')));"
SQL_where = "(((NOT (main_dep.dep_id_past)='" & dep_id_past & "'))) AND (((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_where = "(((main_dep.dep_id_future)='" & dep_id_past & "'));"
SQL_where = "(((main_dep.dep_id_past)='" & dep_id_future & "'));"
Avatar billede glen5000 Nybegynder
24. august 2004 - 20:42 #3
Problemet dem de 5 linier er temmelig sikkert at jeg har glemt at give SQL_where en index værdi når jeg tildeler dem en stringen :)

Det skal så således du
SQL_where(1) = "(((main_dep.dep_id_past)='" & dep_id_past & "') AND ((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_where(2) = "(((main_dep.dep_id_past)='" & dep_id_past & "') AND ((NOT (main_dep.dep_id_future)='" & dep_id_future & "')));"
SQL_where(3) = "(((NOT (main_dep.dep_id_past)='" & dep_id_past & "'))) AND (((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_where(4) = "(((main_dep.dep_id_future)='" & dep_id_past & "'));"
SQL_where(5) = "(((main_dep.dep_id_past)='" & dep_id_future & "'));"

Så burde det virke

Hilsen Glen
Avatar billede tommy_carstensen Nybegynder
24. august 2004 - 21:37 #4
Hej Glen,
Nu melder den fejl på linien
n_count(i) = rs_count(i)("count_"& i)
Error Type:
ADODB.Recordset (0x800A0CC1)
Item cannot be found in the collection corresponding to the requested name or ordinal.
/tmmc/mmantmmc_image3.asp, line 104

Jeg er ret træt nu og vil gerne hjem fra arbejde (jeg får ikke løn for det her). Du er velkommen til at rette min syntaks, men jeg kigger selv på det i morgen, og du får point uanset hvad for at have hjulpet mig på vej. Hvis du retter syntaksen, må jeg hellere tage dobbelt op på points, nu hvor du har hjulpet så meget og brugt meget tid.

Foreløbig kode, hvor "AS count_1" vel også skal rettes, er som følger

dim SQL_where(5)
dim SQL_count(5)
dim rs_count(5)
dim n_count(5)

SQL_where(1) = "(((main_dep.dep_id_past)='" & dep_id_past & "') AND ((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_where(2) = "(((main_dep.dep_id_past)='" & dep_id_past & "') AND ((NOT (main_dep.dep_id_future)='" & dep_id_future & "')));"
SQL_where(3) = "(((NOT (main_dep.dep_id_past)='" & dep_id_past & "'))) AND (((main_dep.dep_id_future)='" & dep_id_future & "'));"
SQL_where(4) = "(((main_dep.dep_id_future)='" & dep_id_past & "'));"
SQL_where(5) = "(((main_dep.dep_id_past)='" & dep_id_future & "'));"

for i = 1 to 5
  SQL_count(i) = "SELECT Count(main_dep.dep_superid) AS count_1 FROM dbo.main_dep WHERE "& SQL_where(i)
  SET rs_count(i) = Conn.Execute(SQL_count(i))
  n_count(i) = rs_count(i)("count_"& i)
next

Tak for hjælpen indtil nu. Det er værdsat. Jeg er online igen i morgen tidlig.
Avatar billede eagleeye Praktikant
24. august 2004 - 21:45 #5
prøv at rette denne:

SQL_count(i) = "SELECT Count(main_dep.dep_superid) AS count_1 FROM dbo.main_dep WHERE "& SQL_where(i)

til

SQL_count(i) = "SELECT Count(main_dep.dep_superid) AS count_"&i&" FROM dbo.main_dep WHERE "& SQL_where(i)


når den skal tælle count_1, count_2, count_3..
Avatar billede glen5000 Nybegynder
24. august 2004 - 21:50 #6
Okay, jeg havde slet ikke set at AS count_1 varieret :)

Men der kan laves således:
for i = 1 to 5
  SQL_count(i) = "SELECT Count(main_dep.dep_superid) AS count_"& i &" FROM dbo.main_dep WHERE "& SQL_where(i)
  SET rs_count(i) = Conn.Execute(SQL_count(i))
  n_count(i) = rs_count(i)("count_"& i)
next

Nu kan der vel snart ikke være flere fejl i det ;)

Hilsen Glen
Avatar billede eagleeye Praktikant
04. september 2004 - 23:00 #7
Man skal ikke kaste med sten når man selv bor i et glashus. Hvad med at lukke dine egne spørgsmål inden du har tralt med at andre lukke spørgsmål du ikke engang har deltaget i?
Avatar billede tommy_carstensen Nybegynder
04. september 2004 - 23:13 #8
Hej eagleeye,
Mit spørgsmål er mindre end to uger gammelt, som du kan se. De spørgsmål, som jeg ville have lukket var 2 år gamle. Jeg har ikke været på arbejde p.g.a. studiestart og har derfor ikke haft mulighed for at afprøve de gode forslag. Jeg glæder mig dog meget til det i næste uge.
Venlige hilsner
Avatar billede eagleeye Praktikant
04. september 2004 - 23:15 #9
Det helt i orden :)
Avatar billede tommy_carstensen Nybegynder
23. november 2004 - 22:54 #10
Hej Glen,

Jeg fik aldrig prøvet dit endelige forslag. Det virkede fint nok, da jeg var færdig med det og folk var imponerede nok, så jeg gad ikke at gøre mere ved det. Du får dine point. Tak for hjælpen og undskylder den lange ventetid.

MVH Tommy
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
Kurser inden for grundlæggende programmering

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