Avatar billede lubker Nybegynder
15. januar 2006 - 19:55 Der er 42 kommentarer og
1 løsning

sql problem

Hjælp...
Jeg har en tabel med en kolonne kaldet plac, der bestemmer placeringen af posterne.
Når jeg sletter en eller flere af posterne, skal de efterfølgende værdier tælles ned, så rækken passer.

Den fjernede værdi har jeg gemt i variablen "oldi" og har forsøgt at gøre det med følgende kode, uden held:

j, antallet af poster der skal "rykkes"

  for k:= 0 to j do
    begin
      Q1 := TADOCommand.Create(self);
      Q1.Connection := ADOConnection1;
      Q1.CommandText := 'UPDATE '+form1.aktivtarrangement.Caption+' SET plac = :oldi ' +
                        'WHERE plac > :oldi ORDER BY plac Limit 0,1';
      Q1.Parameters.ParamByName('oldi').Value := oldi;
      Q1.Execute;
      Q1.Free;
      oldi := oldi+1;
    end;

Den kommer med følgende fejl:
Parameterobjektet er forkert defineret. De angivne oplysninger er mangelfulde eller ikke ensartede.

Hvad skyldes fejlen?!?
Avatar billede nielle Nybegynder
16. januar 2006 - 08:49 #1
Prøv med dette:

for k := 0 to j do
begin
    Q1 := TADOCommand.Create(self);
    Q1.Connection := ADOConnection1;
    Q1.CommandText := 'UPDATE ' + form1.aktivtarrangement.Caption + ' SET plac = :oldi WHERE plac > :oldi ORDER BY plac LIMIT 1';
    Q1.Parameters.ParamByName('oldi').Value := IntToStr(oldi);
    Q1.Execute;
    Q1.Free;
    oldi := oldi+1;
end;
Avatar billede lubker Nybegynder
16. januar 2006 - 11:35 #2
Det hjælper desværre ikke
Avatar billede nielle Nybegynder
16. januar 2006 - 12:36 #3
Samme fejlbesked, eller hvad?
Avatar billede lubker Nybegynder
16. januar 2006 - 12:41 #4
Fuldstændig.
Avatar billede nielle Nybegynder
16. januar 2006 - 19:07 #5
Hmmm. Så er jeg gpodt nok lidt blank på hvad der kan være galt.

Fungere denne alternative version:

for k := 0 to j do
begin
    Q1 := TADOCommand.Create(self);
    Q1.Connection := ADOConnection1;
    Q1.CommandText := 'UPDATE ' + form1.aktivtarrangement.Caption + ' SET plac = ' + IntToStr(oldi) + ' WHERE plac > ' + IntToStr(oldi) + ' ORDER BY plac LIMIT 1';
    Q1.Execute;
    Q1.Free;
    oldi := oldi+1;
end;

?
Avatar billede lubker Nybegynder
16. januar 2006 - 19:18 #6
Så melder den:
Der mangler et ; i slutningen af sql-kaldet.

Men det skal der da ikke være...
Avatar billede nielle Nybegynder
16. januar 2006 - 19:20 #7
Det er faktisk en del af standard SQL-syntaksen, men tit ser man implemteringer hvor man kan udelade det (eller hvor det direkte giver fejl). Det er åbenbart ikke tilfældet her...
Avatar billede lubker Nybegynder
16. januar 2006 - 19:21 #8
Okay, prøvede at sætte et ; til sidst i sætningen, men intet resultat
Avatar billede nielle Nybegynder
16. januar 2006 - 19:28 #9
Prøv lige at udskrive dine SQL-sætninger undervejs. Måske giver de noget helt andet end det du forventer.
Avatar billede lubker Nybegynder
16. januar 2006 - 19:29 #10
Udskrive?!? - er ikke helt med.
Avatar billede nielle Nybegynder
16. januar 2006 - 19:31 #11
Udskrive dem til skærmen sådan at du kan se hvordan de ser ud.
Avatar billede lubker Nybegynder
16. januar 2006 - 19:32 #12
Ja okay... :-)
Avatar billede lubker Nybegynder
16. januar 2006 - 19:41 #13
Hm.
"update Nytprojekt SET plac = 1 WHERE plac > 1 ORDER BY plac LIMIT 0,1;"

Men melder stadig samme fejl.
Avatar billede nielle Nybegynder
16. januar 2006 - 19:54 #14
Hvad siger fejlen?
Avatar billede lubker Nybegynder
16. januar 2006 - 19:56 #15
manglende ;
Avatar billede nielle Nybegynder
16. januar 2006 - 19:56 #16
Kunne du give hele fejlbeskeden?
Avatar billede lubker Nybegynder
16. januar 2006 - 19:58 #17
"Der mangler et ; i slutningen af sql-kaldet."
Avatar billede nielle Nybegynder
16. januar 2006 - 20:06 #18
Får du dine fejlbeskeder på dansk?
Avatar billede lubker Nybegynder
16. januar 2006 - 20:09 #19
Ja.
Avatar billede lubker Nybegynder
16. januar 2006 - 20:09 #20
Aner egentlig ikke helt hvorfor.
Avatar billede nielle Nybegynder
16. januar 2006 - 20:11 #21
Prøv at rette:

"update Nytprojekt SET plac = 1 WHERE plac > 1 ORDER BY plac LIMIT 0,1;"

- til:

"update Nytprojekt SET plac = 1 WHERE plac > 1 ORDER BY plac LIMIT 1;"

(med eller uden det der ;-tegn). Det er den syntaks MySQL selv viser på deres side.
Avatar billede lubker Nybegynder
16. januar 2006 - 20:18 #22
Intet resultat. Samme fejlmeddelelse
Avatar billede softtail Nybegynder
16. januar 2006 - 20:26 #23
Hvad er det for en database (DBMS) du benytter?
Avatar billede lubker Nybegynder
16. januar 2006 - 20:26 #24
Access 2000
Avatar billede nielle Nybegynder
16. januar 2006 - 20:28 #25
Ok så ... LIMIT er MySQL syntaks! Det kan du ikke lave i Access. ;^)
Avatar billede lubker Nybegynder
16. januar 2006 - 20:31 #26
Arrgh...

Det troede jeg da ikke var noget problem.
Hvordan gør man så?

Har ikke tidligere arbejdet med acces, bruger normalt mySQL...
Avatar billede nielle Nybegynder
16. januar 2006 - 20:32 #27
Jeg ved ikke om Access overhovedet tillader det, men ellers burde syntaksen være:

"UPDATE TOP 1 Nytprojekt SET plac = 1 WHERE plac > 1 ORDER BY plac"
Avatar billede lubker Nybegynder
16. januar 2006 - 20:36 #28
Så melder den:
"Der er en syntaks fejl i update sætningen"

SQL: "Update TOP 1 Nytprojekt SET plac = 1 WHERE plac > 1 ORDER by plac"
Avatar billede nielle Nybegynder
16. januar 2006 - 20:37 #29
Tjs, men så kan det altså ikke lade sig gøre i Access.
Avatar billede lubker Nybegynder
16. januar 2006 - 20:39 #30
Hm. Du har vel ikke en idé til hvordan jeg så kan gøre det?
Avatar billede nielle Nybegynder
16. januar 2006 - 20:39 #31
Men medf denne kode vil du kunne fjerne et hul ved værdien 13:

"UPDATE Nytprojekt SET plac = plac-1 WHERE plac > 13"

Den skal bare køres i umiddelbar forlængelse af at elementet på plac=13 slettes (og den skal kun køres en gang i alt).
Avatar billede lubker Nybegynder
16. januar 2006 - 20:41 #32
Tja, problemet er at der kan slettes mer en en post ad gangen.
Den skal derfor gerne "om beregne" alle efter den slettede post.
Avatar billede lubker Nybegynder
16. januar 2006 - 20:43 #33
Det jeg prøver er at have en listbox, hvor der laves forskellige ændringer, som gerne skal gemmes i databasen, så denne svarer nøjagtig til listboxen.
Avatar billede nielle Nybegynder
16. januar 2006 - 20:43 #34
Problemet med at der kan slettes flere af gangen kan vel klares ved at slette en række, fjerne hullet, slætte den næste række, fjerne hullet osv...
Avatar billede lubker Nybegynder
16. januar 2006 - 20:45 #35
Hm.
Jeg sletter flere poster på samme gang fra en listbox, og først derefter retter i databasen, og derfor er dette ikke helt så nemt.
Avatar billede lubker Nybegynder
16. januar 2006 - 20:45 #36
Men ellers kan jeg da tømme databasen, og så gemme alle poster på ny ud fra listboxen...
Men det virker bare som molbo-arbejde.
Avatar billede nielle Nybegynder
16. januar 2006 - 20:53 #37
Hvorfor vil du egentlig slette hullerne? Kan du ikke bare arbejde med tabellen som den er?
Avatar billede lubker Nybegynder
16. januar 2006 - 20:55 #38
Det vil give lidt problemer hvis man bytter om på rækkerne i listboxen,
Så vil det slet ikke passe sammen med databasen.
Avatar billede nielle Nybegynder
16. januar 2006 - 20:59 #39
Hvorfor vil det give problemer? Det svare jo bare til at ombytte plac-værdierene for de to rækker som bliver ombyttet.
Avatar billede lubker Nybegynder
16. januar 2006 - 21:02 #40
Hm ikke helt.
Problemet er at jeg egentlig har to forskellige listbokse.
En med en hel række data, hvor man kan dragge fra over til denne listboks, og samtidig bestemme placeringen i listboxen. og hvis der er huller og man begynder at sætte flere ind midt i listboxen, vil der kunne opstå dubletter.
Tror jeg vælger at tømme tabellen hver gang og så tilføje det hele igen.
Avatar billede nielle Nybegynder
23. januar 2006 - 19:23 #41
Var det så den løsning du endte med?
Avatar billede Henrik_B Praktikant
31. januar 2006 - 16:54 #42
En ting, der undrer mig er at du vil have en 'order by' i et update-statement. Det er sikkert derfor, databasesystemet siger, der er en fejl. Prøv uden order-by.
Avatar billede lubker Nybegynder
24. august 2006 - 10:12 #43
Jeg lukker her.
er ikke kommet videre, og fandt en helt anden løsning.
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