|
| Skal man opdatere en 'forespørgsel' samtid~ Fra : Jens R. Rasmussen |
Dato : 03-01-10 18:08 |
|
Hej/
Dette er måske ikke det rette forum, men da jeg har gode
erfaringer med at spørge jer, forsøger jeg alligevel.
Jeg bruger en Access database med Tabeller, Forespørgsler og
Rapporter. For ikke at skulle downloade Access hver gang jeg skal
ændre noget, har jeg nu lavet mig 20 administratorsider, så jeg
via mine asp-sider kan oprette, ændre og slette records i
tabellerne. Og det virker fint.
Der er (tilsyneladende) kun én fejl. Og det er min Rapport i
Access, som ikke vil vise den record jeg ændrer i den tilhørende
tabel.
Rent konkret gør jeg følgende på mine asp-sider:
1) Finder den record i min tabel 'Tilmelding' der skal opdateres,
idet feltet 'betaling' skal ændres fra 0 til 250
2) kører en UPDATE TILMELDING SET BETALT = 250.....WHERE ...
Og som sagt bliver tabellen 'Tilmelding' opdateret med beløbet
250 i feltet BETALING.
Men
3) Jeg har en forespørgsel ved navn 'Deltagere', som udfra
tabellen 'Tilmelding' vælger, hvem der skal med og hvem der ikke
skal med. Og jeg har en Rapport også ved navn 'Deltagere', som
viser resulattet af forespørgslen.
Raporten viser data fra forespørgsel. Og i såvel Forespørgslen
som i Rapporten vises recorden med den ændrede tilmedling ikke
mere, altså den record, hvor jeg ændrede indholdet fra 0 til 250
kr.
4)Hvis jeg derimod fra starten opdaterer tabellen 'Tilmelding'
manuelt, altså direkte skriver i den uden at bruges asp, så viser
såvel Forespørgsel som Rapporten forsat recorden og nu med
beløbet 250.
Ved opdateringen via mine asp-sider, hvor recorden forsvinder
(ikke i tabellen) men i Forespørgsel og Rapport - er det bagefter
umuligt at få Forespørgsel og Rapport til at vise recorden,
ligegyldigt hvorledes jeg manuelt direkte i access prøver at
ændre. Recorden er og forbliver forsvundet for altid (selvom den
fortsat korrekt står i Tabellen).
Via mine asp-sider opdaterede jeg jo Tabellen. Skal jeg mon også
opdaterer min Forespørgsel og min Rapport? Og i givet fald,
hvordan?
mvh
/jens
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Stig Johansen (03-01-2010)
| Kommentar Fra : Stig Johansen |
Dato : 03-01-10 19:20 |
|
Jens R. Rasmussen wrote:
Det er vist et Access spørgsmål men
> 3) Jeg har en forespørgsel ved navn 'Deltagere', som udfra
> tabellen 'Tilmelding' vælger, hvem der skal med og hvem der ikke
> skal med.
Hvad giver en "select * from deltagere" ?
En 'forespørgsel' er bare et view, og i min Access(97), kan man skifte til
SQL visning af definitionen.
Hvordan ser dit SQL ud i forespørgslen?
Der må ikke være nogen forskel på hvorvidt du opdaterer vha SQL(ASP) eller
direkte, så der må være noget andet galt, muligvis opdatering af noget
andet, men det må kunne udledes af SQL'et/data i tabellen.
--
Med venlig hilsen
Stig Johansen
| |
Jens R. Rasmussen (03-01-2010)
| Kommentar Fra : Jens R. Rasmussen |
Dato : 03-01-10 20:07 |
|
Stig Johansen wrote in dk.edb.internet.webdesign.serverside.asp:
> Jens R. Rasmussen wrote:
>
> Det er vist et Access spørgsmål men
>
> > 3) Jeg har en forespørgsel ved navn 'Deltagere', som udfra
> > tabellen 'Tilmelding' vælger, hvem der skal med og hvem der ikke
> > skal med.
>
> Hvad giver en "select * from deltagere" ?
> En 'forespørgsel' er bare et view, og i min Access(97), kan man skifte til
> SQL visning af definitionen.
> Hvordan ser dit SQL ud i forespørgslen?
..
> Med venlig hilsen
> Stig Johansen
SQL-versionen af forespørgslen ser sådan ud:
SELECT Arrangementer.Navn, Kunder.Fornavn, Kunder.Efternavn,
Tilmelding.Hvilket, Kunder.Medlemdenne, Arrangementer.Prisgaester,
Arrangementer.Prismedlemmer, Tilmelding.Betalt,
IIf([Medlemdenne],[Prismedlemmer]-[Betalt],[Prisgaester]-[Betalt]) AS
Skylder, Arrangementer.Hvor, Arrangementer.Adresse, Arrangementer.Postnummer,
Arrangementer.Bynavn, Arrangementer.Hvornaar, Arrangementer.Klokken,
Tilmelding.Status
FROM Kunder INNER JOIN (Arrangementer INNER JOIN Tilmelding ON
Arrangementer.[Arrangementsid] = Tilmelding.Hvad) ON Kunder.kundeid =
Tilmelding.Hvem
WHERE (((Tilmelding.Status) Is Null) AND
((Arrangementer.Arrangementsid)=[Hvilket arrangement?]))
ORDER BY Tilmelding.Hvilket;
Som du kan se, er der lidt flere tabeller i sving udover tabellen
'Tilmelding'.
Forespørgslen viser
- navn på arrangement
- Fornavn på deltager
- Efternavn på deltager
- Hvilket = om vedkommer har meldt, at han 'kommer' eller 'ikke kommer'
- Om han er medlem i denne sæson
- pris for gæster
- pris for medlemmer
- hvad han evt. har betalt
- og så det kalkulerede felt, hvad han skylder (=Pris - betalt)
- hvor det foregår
- adressen på hvor
- postnr på hvor
- bynavn på hvor
- dato for arrangement
- tidpunkt for arrangement
- status: Et felt der enten er tomt eller indeholder ordet 'Annulleret'.
Altså om tilmelderen sidenhen har annulleret sin tilmelding.
Og som du kan se, starter forespørgslen med at spørge hvilket arrangement,
det drejer som om. Hvor jeg så indtaster nøglen på arrangementet fx 091006 -
og så vises forespørgslen for alle ikke annullerede tilmeldinger. (Status =
"").
Nu er jeg langtfra sql-haj - men skulle ovenstående ikke korrekt hente data
fra tabellen tilmelding (som jo indeholder alle data) og vises den record,
hvor jeg via asp har ændret betalt fra 0 til 250 ?
men som sagt tidligere vises ikke de data hvor jeg via asp har ændret feltet
betaling. men det viser de data hvor jeg manuelt har ændret betaling i
tilmeldingsdatabasen direkte ved håndkraft.
mvh
/Jens
PS: Oprindeligt udviklet i Access2003 - men kører nu under Access2007 - men
stadig som en 2003-fil (mdb).
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Stig Johansen (05-01-2010)
| Kommentar Fra : Stig Johansen |
Dato : 05-01-10 10:09 |
|
Jens R. Rasmussen wrote:
> SQL-versionen af forespørgslen ser sådan ud:
Fejlsøgning kan tage (meget) tid.
> INNER JOIN Tilmelding ON
> Arrangementer.[Arrangementsid] = Tilmelding.Hvad) ON Kunder.kundeid =
> Tilmelding.Hvem
> WHERE (((Tilmelding.Status) Is Null) AND
> ((Arrangementer.Arrangementsid)=[Hvilket arrangement?]))
Der er to ting, der kan forårsage 'anderledes' resultater.
Den ene er ændring af Tilmelding.Hvad, som måske kan forekomme i din Access
'form'.
Den anden er Tilmelding.Status, hvor din 'form' muligvis påvirker feltet.
Prøv at lave en "SELECT Hvad,Status FROM Tilmelding" før og efter en ændring
af betaling i hhv. din form og ASP, og se om der er en forskel.
--
Med venlig hilsen
Stig Johansen
| |
Stig Johansen (05-01-2010)
| Kommentar Fra : Stig Johansen |
Dato : 05-01-10 18:53 |
|
Stig Johansen wrote:
> Den anden er Tilmelding.Status, hvor din 'form' muligvis påvirker feltet.
>
> Prøv at lave en "SELECT Hvad,Status FROM Tilmelding" før og efter en
> ændring af betaling i hhv. din form og ASP, og se om der er en forskel.
Jeg skulle måske præcisere.
Fra din post:
> - status: Et felt der enten er tomt eller indeholder ordet 'Annulleret'.
samt:
> så vises forespørgslen for alle ikke annullerede tilmeldinger. (Status =
> "").
Der er forskel på et tomt felt og "".
Så din where klausul:
...Tilmelding.Status Is Null..
Vil ikke returnere rækker med status="".
Er der måske nogen steder du sætter status = ""?
--
Med venlig hilsen
Stig Johansen
| |
Rune Jensen (05-01-2010)
| Kommentar Fra : Rune Jensen |
Dato : 05-01-10 19:23 |
|
Stig Johansen skrev:
> Der er forskel på et tomt felt og "".
> Så din where klausul:
> ...Tilmelding.Status Is Null..
> Vil ikke returnere rækker med status="".
>
> Er der måske nogen steder du sætter status = ""?
Jeg ved ikke, om det er samme problem, men for at teste, om en variabel
er tom, kan man gøre sådan her:
if trim( var & " ") = "" then
Man kan nok det samme i SQL.
MVH
Rune Jensen
| |
Jens R. Rasmussen (05-01-2010)
| Kommentar Fra : Jens R. Rasmussen |
Dato : 05-01-10 21:07 |
|
Stig Johansen wrote in dk.edb.internet.webdesign.serverside.asp:
> Stig Johansen wrote:
>
> > Den anden er Tilmelding.Status, hvor din 'form' muligvis påvirker feltet.
> >
> > Prøv at lave en "SELECT Hvad,Status FROM Tilmelding" før og efter en
> > ændring af betaling i hhv. din form og ASP, og se om der er en forskel.
>
> Jeg skulle måske præcisere.
> Fra din post:
> > - status: Et felt der enten er tomt eller indeholder ordet 'Annulleret'.
> samt:
> > så vises forespørgslen for alle ikke annullerede tilmeldinger. (Status =
> > "").
>
> Der er forskel på et tomt felt og "".
> Så din where klausul:
> ...Tilmelding.Status Is Null..
> Vil ikke returnere rækker med status="".
>
> Er der måske nogen steder du sætter status = ""?
>
> --
> Med venlig hilsen
> Stig Johansen
Yes - du har igen fundet en af mine fejl. Det jeg (fejlagtigt) gør, er at jeg
henter alle felter, ændre nogle, her feltet 'betalt' fra ingenting til 250, og
gemmer så ALLE felterne med mit asp-program. Dvs. jeg gemmer status som er et
tomt felt.
Altså først henter jeg status og gemmer det i et inputfelt (som ikke ændres)
og derefter gemmer jeg det hele med min update. Så nu gemmer jeg et tomt felt
i stedet for at gemme et NULL felt.
Når jeg derfor nu ændrer min UPDATE kommando fra
strSQL = strSQL & "Status='" & lstatus & "',"
til
if lstatus <> "" then
strSQL = strSQL & "Status='" & lstatus & "',"
end if
så går det godt.
Når jeg kigger på min tabel kan jeg ikke se forskel på et tomt felt og et
NULL-felt (hvis du forstår hvad jeg mener).
Og denne fejl har jeg sikkert 117 andre steder.
Er min ovenstående løsning den bedste - eller er den en anden måde at sikre
sig på at jeg ikke ændrer tomt til "" i databasen?
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Jens R. Rasmussen (05-01-2010)
| Kommentar Fra : Jens R. Rasmussen |
Dato : 05-01-10 21:24 |
|
> > Der er forskel på et tomt felt og "".
> > Så din where klausul:
> > ...Tilmelding.Status Is Null..
> > Vil ikke returnere rækker med status="".
Så den mest 'rigtige' løsning er måske at ændre min 'form' til
...Tilmelding.Status Is Null OR "" ..
Eller er der en mere elegant måde at omgås NUll-felter og ""-felter?
mvh
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Rune Jensen (05-01-2010)
| Kommentar Fra : Rune Jensen |
Dato : 05-01-10 21:29 |
|
Jens R. Rasmussen skrev:
>>> Der er forskel på et tomt felt og "".
>>> Så din where klausul:
>>> ...Tilmelding.Status Is Null..
>>> Vil ikke returnere rækker med status="".
>
> Så den mest 'rigtige' løsning er måske at ændre min 'form' til
>
> ...Tilmelding.Status Is Null OR "" ..
>
> Eller er der en mere elegant måde at omgås NUll-felter og ""-felter?
Jamen virker det forslag jeg gav da ikke?
Ikke fordi jeg forventer det virker, men jeg er da nysgerrig. Det er et
kendt "hack", som bruges en del.
MVH
Rune Jensen
| |
Jens R. Rasmussen (05-01-2010)
| Kommentar Fra : Jens R. Rasmussen |
Dato : 05-01-10 21:43 |
|
> Jamen virker det forslag jeg gav da ikke?
>
> Ikke fordi jeg forventer det virker, men jeg er da nysgerrig. Det er et
> kendt "hack", som bruges en del.
>
>
> MVH
> Rune Jensen
Du skrev:
if trim( var & " ") = "" then
hvilket jeg ikke lige kan gennemskue. Du tager min variable status og
lægger et mellemrum til og spørger så om den nu er ingenting?
Nej jeg er nok ikke helt hjemme i forskellen på NULL og "".
Men det der åbenbart går galt for mig er at jeg
- henter et NULL felt (status) fra databasen
- lægger det ind i en input sætning ved navn lstatus med value=status
- skriver ikke noget i input-feltet lstatus
- overfører form med alle input inklusiv lstatus
- gemmer lstatus i databasen
Her troede jeg at jeg ikke havde ændret noget i databasen - men åbenbart
ændrer ovenstående NULL til "" eller hyr?
mvh
/jens
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Rune Jensen (05-01-2010)
| Kommentar Fra : Rune Jensen |
Dato : 05-01-10 22:17 |
|
Jens R. Rasmussen skrev:
>> Jamen virker det forslag jeg gav da ikke?
>>
>> Ikke fordi jeg forventer det virker, men jeg er da nysgerrig. Det er et
>> kendt "hack", som bruges en del.
>>
>>
>> MVH
>> Rune Jensen
>
> Du skrev:
> if trim( var & " ") = "" then
>
> hvilket jeg ikke lige kan gennemskue. Du tager min variable status og
> lægger et mellemrum til og spørger så om den nu er ingenting?
Den korrekte forklaring er nok:
Tag variablen
Læg mellemrum til slutningen af variablen
Trim dette mellemrum
Nu er variablen under ingen omstændigheder NULL, men hvis den ikke
indeholder noget, så er den =""
Og det er nøjagtigt det, som testes for.
Udtrykket giver sand, hvis variablen er enten tom eller NULL, og jeg
regnede med, det var det, du efterspurgte. Men da jeg ikke er inde i
SQL, kan jeg selvfølgelig have taget fejl ;)
MVH
Rune Jensen
| |
Rune Jensen (05-01-2010)
| Kommentar Fra : Rune Jensen |
Dato : 05-01-10 22:27 |
|
Rune Jensen skrev:
> Udtrykket giver sand, hvis variablen er enten tom eller NULL, og jeg
> regnede med, det var det, du efterspurgte. Men da jeg ikke er inde i
> SQL, kan jeg selvfølgelig have taget fejl ;)
Det burde svare til:
if var="" or isNull( var) then
Her er en med lignende problem (tror jeg), hvor der bruges len i stedet for:
http://bytes.com/topic/asp-classic/answers/53790-isnull-bug-asp
MVH
Rune Jensen
| |
Jens R. Rasmussen (05-01-2010)
| Kommentar Fra : Jens R. Rasmussen |
Dato : 05-01-10 22:59 |
|
> Den korrekte forklaring er nok:
>
> Tag variablen
> Læg mellemrum til slutningen af variablen
> Trim dette mellemrum
>
> Nu er variablen under ingen omstændigheder NULL, men hvis den ikke
> indeholder noget, så er den =""
>
> Og det er nøjagtigt det, som testes for.
>
> Udtrykket giver sand, hvis variablen er enten tom eller NULL, og jeg
> regnede med, det var det, du efterspurgte. Men da jeg ikke er inde i
> SQL, kan jeg selvfølgelig have taget fejl ;)
>
>
> MVH
> Rune Jensen
Tak for denne meget forståelige forklaring. Måske du eller andre vil være så
venlig også at forklare mig tumpe forskellen på NULL og "" - for det er uden
tvivl denne manglende forståelse, der har påført det omtalte problem.
Jeg gætter på (efterat have læst jeres svar), at NULL betyder et felt/en
variable, som endnu ikke er tildelt en værdi. Og at "" betyder et felt/en
variabel, der er tom.
Hvis det er korrekt forstået, så er det vel filosofferne man skal rådføre sig
med for at forstå forskel på ingenting og tom
Jeg kan svagt forstå, at når jeg hårdhændet gemmer "ingenting" i min
database, så ændre feltet værdi fra NULL til "" al den stund, at jeg nu
bevidst har fortalt, at intet skal gemmes.
Er jeg på rette forståelsesspor?
mvh
/jens
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Rune Jensen (05-01-2010)
| Kommentar Fra : Rune Jensen |
Dato : 05-01-10 23:41 |
|
Jens R. Rasmussen skrev:
> Tak for denne meget forståelige forklaring. Måske du eller andre vil være så
> venlig også at forklare mig tumpe forskellen på NULL og "" - for det er uden
> tvivl denne manglende forståelse, der har påført det omtalte problem.
OK, det satte gang i de små grå ;)
Jeg har altid opfattet IsNull som en test af, om en variabel ikke er sat
(jeg tænker på det som at den er DIMmed, men ikke tildelt værdi, hvilket
jeg synes ville være logisk). Dette lader så til IKKE at være tilfældet.
IsNull giver sand, hvis et udtryk ikke indeholder valid data, helt
nøjagtigt fra MS:
http://msdn.microsoft.com/en-us/library/zbchw6hz%28VS.85%29.aspx
"Returns a Boolean value that indicates whether an expression contains
no valid data (Null).".
Og leder jeg så videre på nettet, så har jeg svært ved at finde ud af,
hvad "valid data" så er. De gentager alle, hvad MS selv skriver sådan
mere eller mindre.
Så nu ville jeg også gerne have en forklaring på dette ;)
Jeg stødte også på en anden function, nemlig isEmpty, som ifølge MS
"indicates that a variable has not yet been initialized". Hvad menes mon
så med det...? At den ikke har fået tildelt værdi?
Svarene på dette, ja dem ville jeg som sagt (også) gerne vide, hvis der
er nogen derude, som kan give dem ;)
MVH
Rune Jensen
| |
Stig Johansen (06-01-2010)
| Kommentar Fra : Stig Johansen |
Dato : 06-01-10 06:05 |
|
Jens R. Rasmussen wrote:
> Tak for denne meget forståelige forklaring. Måske du eller andre vil være
> så venlig også at forklare mig tumpe forskellen på NULL og "" - for det er
> uden tvivl denne manglende forståelse, der har påført det omtalte problem.
Du er ikke nogen tumpe, for jeg har mødt mange, der ikke lige kan greje
forskellen mellem null, og eks. "".
> Jeg gætter på (efterat have læst jeres svar), at NULL betyder et felt/en
> variable, som endnu ikke er tildelt en værdi. Og at "" betyder et felt/en
> variabel, der er tom.
Det er korrekt.
> Hvis det er korrekt forstået, så er det vel filosofferne man skal rådføre
> sig med for at forstå forskel på ingenting og tom
Du behøver nu ikke at rådføre dig med filosofferne, for der er en naturlig
(og praktisk) forklaring.
I EDB systemer har man brug for at vide om et felt er 'urørt' eller ej.
Før man havde null brugte man forskellige tricks for at tjekke om et felt
var 'rørt' eller ej, og her er det måske nemmere at tænke på tal eller
datoer.
Hvis et tal er 0, hvordan ved vi så om det er 'urørt', eller rent faktisk er
0 som værdi.
Det ved vi ikke, så 'før i tiden' initierede man det med et eller andet tal,
der ikke burde forekomme, eks. 99999999.
Samme med datoer (før Y2K), brugte vi 991231 (som er en valid dato).
Vi har altså behov sor at skelne om et felt indeholder en værdi eller ej, og
det er her null kommer ind i billedet.
På samme måde som hvis det er tal, hvor 0 er forskellig fra null, er ""
forskellig fra null.
Det er naturligt nok, at "" opfattes som 'tom', men det er en legal værdi i
databasen.
> Jeg kan svagt forstå, at når jeg hårdhændet gemmer "ingenting" i min
> database, så ændre feltet værdi fra NULL til "" al den stund, at jeg nu
> bevidst har fortalt, at intet skal gemmes.
>
> Er jeg på rette forståelsesspor?
Ja, bortset fra at "ingenting" er en legal værdi i databasen, og dermed ikke
"ingenting"
Med hensyn til in SQL, kan du ændre den til den OR du skrev tidligere.
Dog skal du nok skrive
...Tilmelding.Status Is Null OR Tilmelding.Status="" ..
> Eller er der en mere elegant måde at omgås NUll-felter og ""-felter?
Det er en del af databasestrukturer, så du kan ikke 'omgå dem', da alle
felter kan antage null (med mindre man definerer NOT NULL ved oprettelse,
men så får man fejl).
Så du bliver nødt til at leve med dem.
Hvis du ikke vil have null i status, skal du eksplicit anføre "" ved
oprettelsen.
Det er muligt det er lidt svært at se ideen med null, men jeg kan godt love
dig at de har sin berettigelse.
--
Med venlig hilsen
Stig Johansen
| |
Jens R. Rasmussen (06-01-2010)
| Kommentar Fra : Jens R. Rasmussen |
Dato : 06-01-10 17:05 |
|
Tak til både Stig og Rune. Jeg tror jeg har fortået det. Hvor er det bare
herligt, at have dygtige og imødekommende 'venner' som jer.
mvh
/jens
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
|
|