Variabele wordt blanco in SELECT query ?

Status
Niet open voor verdere reacties.

leifoet

Gebruiker
Lid geworden
7 okt 2007
Berichten
326
Situatie
prog "updA.asp" waarvan (vereenvoudigde) code hieronder ontvangt een Request.Form("ActId") vanuit het initiële selectierpog

Probleem
Onderstaande code werkt zolang als de tijdsvoorwaarde niet van toepassing is.
Als de tijdsvoorwaarde van toepassing wordt, krijg ik volgende error message :
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'ActId= and membernr=13'.

Dit zou betekenen dat de variabele ActId zonder waarde valt bij de uitvoering van de tijdsvoorwaarde ?
De Select query voor de onvoorwaardelijke uitvoering (nà <%else%>) én voor de voorwaardelijke uitvoering is dezelfde (zie code hieronder)

Heb de (inkomende) Request.Form("ActId") en ook lngRecordNo getest op de waarde => niet blank - bevat steeds een waarde

Als ik evenwel in de Select query manueel bij de variabele ActId een waarde invul :
StrSQL = "SELECT * FROM table_H INNER JOIN activity21 ON activity21.actID = table_H.actAnId WHERE ActId =5 and membernr =" & Session ("uid")
dan wordt ook de voorwaardelijke code uitgevoerd.

Vraag
Is mijn syntax van de tijdsvoorwaarde wel correct ?
Hoe kan de variabele ActId zijn waarde verliezen als de tijdsvoorwaarde van toepassing wordt ? (beide onderdelen 'onvoorwaardelijk' en 'voorwaardelijk' werken met dezelfde bronnen)
Dank voor tips


Code:
lngRecordNo = Request.Form("ActId")

(Server connection code)

StrSQL = "SELECT * FROM table_H INNER JOIN activity21 ON activity21.actID = table_H.actAnId WHERE ActId =" & lngRecordNo & "and membernr =" & Session ("uid") 
rs.Open strSQL, adoCon

(tijdsvoorwaarde)
<%
Endtime = rs("ActEndDT")
LTtime = DateAdd("n",15,Endtime)
%>

<%if LTtijd<=now() then%>

	<%if Request.Form("vervolg") = "Stop" then%>
    	<FORM METHOD="post" ACTION="Strt.asp">

	<%elseif Request.Form("vervolg") = "Message" then%>
   		<FORM METHOD="post" ACTION="updB1.asp"> 

  	<%end if%>

	<FORM METHOD="post" ACTION="updA.asp">

<table border="0" width="49%">
	<tr>
...
<INPUT TYPE="submit" Name="vervolg" VALUE="Stop"></td></tr>
	
	<tr> ...
      <input type="hidden" name="Rec" value="<% = rs("AnwId") %>">
      <input type="hidden" name="NrAct" value="<% = rs("ActId") %>">
      (the same hidden input copied from the working one)
<INPUT TYPE="submit" Name="vervolg" VALUE="Message"></td></tr>

</table>
</FORM>

<%else%>
... 
<form method="post" action="updB.asp">
...
 
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'ActId= and membernr=13'.
Ik zie geen tijdvoorwaarde, maar wél een lege variabele (lngRecordNo).
 
@octafish, het lijkt erop dat het niet gaat om een ODBC Access Driver, het gaat om ASP pagina's.
lngRecordNo is een (door de bezoeker van de pagina) ingevuld formulierveld.

@leifoet: kloppt het dat je LTtime en LTtijd gebruikt?
Waar komt LTtijd vandaan? Waarvoor is LTtime bedoeld?

Nog een vraagje.
Hoe kan je een onderscheid maken tussen
Code:
<input type="submit" name="vervolg" value="Stop">
<input type="submit" name="vervolg" value="Message">
Je hebt ze beide "vervolg" genoemd.
 
Laatst bewerkt:
Waar komt LTtijd vandaan? Waarvoor is LTtime bedoeld?
typefout - moet zijn LTtime - is bedoeld als element van de voorwaarde (cfr. if LTtime ...)
en precies als deze voorwaarde wordt uitgevoerd valt de 'ontvangen' waarde Request.Form("ActId") die toegekend wordt aan de variable ActId weg - wat uiteraard niet de bedoeling is (maar wat mijn code ergens wel genereert ;-(
Als deze time-voorwaarde wordt overgeslagen/niet van toepassing is, 'behoudt' de variabele ActId wél de door de gebruiker toegekende waarde Request.Form("ActId") en krijg ik geen error.
Het waarom van dit onbedoeld 'waardeverlies' is de/mijn vraag.

Je hebt ze beide "vervolg" genoemd.
redenering: de 2 submit-inputs worden door de <%if Request.Form("vervolg") = ... / eleseif ... > toegewezen aan hun respectieve FORM METHOD ...
en zoals ik sub #1 schreef wordt deze code ook zo uitgevoerd tenminste als ik evenwel (nu nog zelf !) in de Select query manueel bij de variabele ActId een waarde invul (cfr. sub #1).

Dank voor tips.
 
Laatst bewerkt:
1. De spaties kloppen niet in de query. Stel dat lngRecordNo de waarde 34 heeft dan staat er 34and (zonder spatie ertussen). Verander de "where" eens in
Code:
WHERE ActId=" & lngRecordNo & " AND membernr=" & Session("uid")

2. De schrijfwijze van if...elseif...else kan per taal verschillen maar de werking is hetzelfde. Met de info die je geeft zou ik het zo doen
(de html voor de table heb ik er even tussenuit gehaald)
Code:
<% if LTtime <= now() then %>

    <% if request.form("vervolg1") = "Stop" then %>
        <form method="post" action="Strt.asp">

    <% elseif request.form("vervolg2") = "Message" then %>
           <form method="post" action="updB1.asp"> 

    <% else %>
        <form method="post" action="updA.asp">

      <% end if %>

    <input type="hidden" name="Rec"   value="<%= rs("AnwId") %>">
    <input type="hidden" name="NrAct" value="<%= rs("ActId") %>">

    <input type="submit" name="vervolg1" value="Stop">
    <INPUT TYPE="submit" name="vervolg2" value="Message">

<% else %>

    <form method="post" action="updB.asp">

<% end if %>


3. In een formulier is het slim om verschillende name="..." te gebruiken. Daarmee voorkom je een hoop gedoe om te bepalen welke input het resultaat geeft.
 
Spatie gecorrigeerd - input-namen toegevoegd - voor 'If-Elseif-Else-End if' de bron-lay-out toegepast en de tijdsvoorwaarde aangezet.
Helaas wordt ik weer begroet met deze niet meer gegeerde wenk :
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'ActId= and membernr=13'.

Heb voor de volledigheid ook getest met de tijdsvoorwaarde uit => probleemloos.

Waar kan de bug zich schuil houden - of hoe zou ik de code nog kunnen testen (of verbeteren) - of zit er toch een hapering bij de tijdsvoorwaarde
Dank voor tips.
 
Laatst bewerkt:
(missing operator) in query expression 'ActId= and membernr=13'.
Het lijkt erop dat de variabele ActId in de asp geen waarde heeft.


Vraag: Staat in de html één <input name="ActId" type="..."> en welk type heeft deze input
Code:
lngRecordNo = Request.Form("ActId")


Vraag: Staat in de DB een veld ActId en welk type is dit DB veld (tekst, integer, double, ...)
Code:
... WHERE ActId=" & lngRecordNo & " AND ...
 
Het lijkt erop dat de variabele ActId in de asp geen waarde heeft.
m.i. enkel als de tijdsvoorwaarde doorlopen wordt - zonder tijdsvoorwaarde wordt de variabele m.i. niet blanco (cfr. sub #1 mijn 'vraag' en o.a. sub #6)

Staat in de html één <input name="ActId" type="..."> en welk type heeft deze input
<form name="lijst" onSubmit="return validatie(this);" METHOD="POST" ACTION="updA.asp">
<select NAME="ActId">
<INPUT TYPE="submit" VALUE="Druk ...">

Staat in de DB een veld ActId en welk type is dit DB veld (tekst, integer, double, ...)
Lange integer

Dank
 
Laatst bewerkt:
Ergens bovenaan staat (the same hidden input copied from the working one). Controleer even of elke name="...." bij alle form elementen een unieke naam heeft. Bij dubbel gebruikte namen weet je nooit vanwaar een ingelezen waarde komt.

Als ik de code van #1 terugbreng tot de essentie dan valt mij iets raars op
Code:
<%if LTtime <= now() then%>

    <%if Request.Form("vervolg") = "Stop" then%>
        <form method="post" action="Strt.asp">
    <%elseif Request.Form("vervolg") = "Message" then%>
        <form method="post" action="updB1.asp"> 
    <%end if%>

    <form method="post" action="updA.asp">
        <input type="submit" name="vervolg" value="Stop"></td>
        <input type="hidden" name="Rec" value="<% = rs("AnwId") %>">
        <input type="hidden" name="NrAct" value="<% = rs("ActId") %>">
        <input type="submit" name="vervolg" value="Message">
    </form>

<%else%>
    <form method="post" action="updB.asp">

Als aan LTtime <= now() wordt voldaan dan doet de if...elseif...endif er niet toe want na de endif is het altijd
<form method="post" action="updA.asp">
 
Laatst bewerkt:
Ergens bovenaan staat (the same hidden input copied from the working one)
... message niet gezien - waar te lezen ?

Controleer even of elke name="...." bij alle form elementen een unieke naam heeft
Is gebeurd maar zonder goed gevolg

want na de endif is het altijd <form method="post" action="updA.asp">
bron dit lijkt wel een valabel spoor naar de bug

Bedoeling was/is om in de tijdsvoorwaarde een form te maken dat de inputkeuze (tussen stop en message) verzendt naar/binnen dezelfde file updA.asp (en waarbij vervolgens if ... elseif zorgt voor een verdere verzending naar de afzonderlijke 2 files zoals aangegeven).
Vermoedelijk ben ik zo in een lus beland ? - overigens misschien ook een/de reden waarom een dubbele klik op stop en/of message nodig is (tenminste als ik als test zelf de waarde van ActId ingeef in de Select query en het progje uitgevoerd wordt)
Als dat zo is, kan die lus in deze optiek nog vermeden worden ? Of moet ik teruggrijpen naar bijvoorbeeld <a href="... ?

Dank voor tips.
 
Laatst bewerkt:
message niet gezien - waar te lezen ?
Regel 34 van je code bij #1

Name="..." Is gebeurd maar zonder goed gevolg
Welke html is er gegenereerd op het moment dat je de foutmelding krijgt?

waarbij vervolgens if ... elseif zorgt voor een verdere verzending naar de afzonderlijke 2 files
Controleer 'elke situatie' in elke IF statement en gebruik ook else als dit nodig is. Bijvoorbeeld
Code:
<%if LTtime <= now() then%>

    <%if Request.Form("[B]vervolg_1[/B]") = "Stop" then%>
        <form method="post" action="Strt.asp">
    <%elseif Request.Form("[B]vervolg_2[/B]") = "Message" then%>
        <form method="post" action="updB1.asp"> 
    <%else%>
        <form method="post" action="updA.asp">
    <%end if%>

<%else%>
    <form method="post" action="updB.asp">
<%end if%>

<input type="submit" name="[B]vervolg_1[/B]" value="Stop"></td>
<input type="submit" name="[B]vervolg_2[/B]" value="Message">
<input type="hidden" name="Rec" value="<% = rs("AnwId") %>">
<input type="hidden" name="NrAct" value="<% = rs("ActId") %>">
</form>

Tip: zet hidden inputs vlak boven de </form>

Update. ik ken asp niet echt maar mag er we./geen spatie voor het = teken bij value="<% = rs("AnwId") %>"
 
Laatst bewerkt:
Welke html is er gegenereerd op het moment dat je de foutmelding krijgt?
"updA.asp" regel: rs.Open strSQL, adoCon (= de Select query)

spatie voor het = teken bij value="<% = rs("AnwId") %>"
m.i. niet van belang

Na een summiere check nog geen vlekkeloos parcours.
Ik check alle codes nog eens grondig zoals aangegeven.
Dank.
 
<input type="submit" name="vervolg" value="Stop">
Deze input leidt naar een bepaalde startpagina, zonder meer.

Ook bij deze input-keuze krijg ik toch ook altijd de(zelfde) error message : ActId= blanco
In tegenstelling tot de 2de input ("Message") heeft deze input naar die startpagina helemaal geen 'relatie' nodig met de variabele ActId (noch met het membernr).
Kan ik daar soms iets essentieels aan wijzigen
 
Controleer nog even of de name="..." bij beide drukknoppen verschillend is, zie #11 als voorbeeld.

Als een <input type="hidden" name="NrAct" value="<% = rs("ActId") %>"> wordt verstuurd, dan moet rs("ActId") een waarde hebben.
Is dit het geval als je de html broncode van de pagina bekijkt?

Na het versturen van het formulier kan je de waarde van deze input uitlezen met Request.Form("NrAct") omdat de input een name="NrAct" heeft.

Je kan bij elke if / elseif / else een <%="action ......"%> zetten om te controleren wat er allemaal gebeurt (zet op de stippels de naam van het bestand).
Probeer dan situaties uit om te achterhalen bij welke if of elseif voorwaarde het niet goed loopt.

Misschien vraag ik nu dingen dubbel maar het is allemaal een beetje vaag geworden.
Het zou helpen als er een complete code snippet van het formulier is ipv allemaal losse stukjes.

Als het in de sql query zou gaan om de hidden input name="NrAct" dan zou het zo moeten zijn lijkt mij
Code:
lngRecordNo = Request.Form("[B]NrAct[/B]")

StrSQL = "... WHERE ActId=" & lngRecordNo & " AND membernr=" & Session("uid")
 
Laatst bewerkt:
Code:
Na het versturen van het formulier kan je de waarde van deze input uitlezen met Request.Form("NrAct") omdat de input een name="NrAct" heeft.
- input-codes in sub #9 zijn geplaatst vóór <%else%> (waar de uitvoering zonder tijdsvoorwaarde start) : is toch de correcte plaats ? - plaatsing sub #11 ?

Code:
Je kan bij elke if / elseif / else een <%="action ......"%> zetten om te controleren wat er allemaal gebeurt (zet op de stippels de naam van het bestand).
Probeer dan situaties uit om te achterhalen bij welke if of elseif voorwaarde het niet goed loopt.
- test was niet gekend - maar is eigenlijk al uitgevoerd als ik in de Select query
... WHERE ActId =" & lngRecordNo & " and membernr =" & Session ("uid" ...
als test vervang door
... WHERE ActId =5 and membernr =" & Session ("uid" ...
dus door een vaste waarde voor de ActId - bijvoorbeeld 5
dan lopen alle geledingen van het programma als een tierelier, niet enkel het onvoorwaardelijk deel maar ook de tijdsvoorwaarde.

Dank bron voor tips - ik zoek verder.
 
Uit jouw test begrijp ik dat de volgende test moet werken.
Code:
'  lngRecordNo = Request.Form("[B]ActId[/B]")
lngRecordNo = "5"
StrSQL = "SELECT * FROM table_H INNER JOIN activity21 ON activity21.actID = table_H.actAnId WHERE ActId =" & lngRecordNo & " and membernr =" & Session ("uid")

Ik kan in alle berichtjes hierboven nergens een <input name="ActId"> of een <select name="ActId"> of een <textarea name="ActId"> vinden. Als er geen formulier element met deze 'name' is dan kan je 'm niet uitlezen met Request.Form("ActId"). Je krijgt dan een foutmelding omdat Form("ActId") niet bestaat.
 
Laatst bewerkt:
Staat in de html één <input name="ActId" type="..."> en welk type heeft deze input
<form name="lijst" onSubmit="return validatie(this);" METHOD="POST" ACTION="updA.asp">
<select NAME="ActId">
<INPUT TYPE="submit" VALUE="Druk ...">
Sub #8 : vraag van bron en mijn antwoord.
Verduidelijking : de 'select name=ActId' wordt initieel gemaakt door de bezoeker (en wordt doorgestuurd als 'Request.Form("ActId")' - cfr. code sub #16
(zie overigens ook 'Situatie' en 'Probleem' in bericht sub #1)

Met de/een opgegeven vaste waarde voor ActId als (sub #16) lngRecordNo = "5" werkt de toepassing zonder error.
Ben wel enigszins verwonderd dat het ook werkt met = "5" - ik dacht alleén met een numerieke waarden = 5 of = 6 ... zoals ik al testte.

Nog deze verduidelijking.
Het/dit bestaand programma ter update van een databasetabel liep en loopt normaal met één tijdsvoorwaarde (met één inputknop hieraan gekoppeld om dit onderdeel te verlaten - naar de startpagina)
Ik ging er dus van uit dat de inbouw in de bestaande tijdsvoorwaarde van een 2de inputknop (naast die éne die leidt naar de startpagina) een relatief makkelijke klus zou zijn, temeer dat de output van de 2de input-knop eenzelfde stramien (update database - cfr. updB1.asp) doorloopt als het 'onvoorwaardelijk' gedeelte na <%else%> met updB.asp.
(Ben dus verrast dat diezelfde gebruikte variabele ActId nu wél problemen geeft en blijkbaar enkel als de tijdsvoorwaarden gelden - codes tijdsvoorwaarden sub #5 en #9)

Dank voor tips op weg naar een oplossing.
 
Laatst bewerkt:
Ben wel enigszins verwonderd dat het ook werkt met = "5" - ik dacht alleén met een numerieke waarden = 5 of = 6 ... zoals ik al testte.
In een formulier geeft een input, select of textarea altijd een stringwaarde, zelfs bij <input type="number"> geeft de input een string als waarde.
lngRecordNo is om deze reden altijd een string omdat Request.Form("NrAct") een stringwaarde krijgt, bijvoorbeeld "5" of "6"

In de query wordt het automatisch een getal want in de query worden alle strings (zonder " ) aan elkaar geplakt.
Code:
StrSQL = ".... WHERE ActId=" & lngRecordNo & " AND ...."
  |
StrSQL = ".... WHERE ActId=" & "5" & " AND ...."
  |
StrSQL = ".... WHERE ActId=5 AND ...."

Als je het onderstaande zou doen dan wordt lngRecordNo in de query wel gezien als een string (door de ` ) en zal de query niet goed werken.
Code:
StrSQL = ".... WHERE ActId=`" & lngRecordNo & "` AND ...."
  |
StrSQL = ".... WHERE ActId=`5` AND ...."
 
Laatst bewerkt:
Dank bron - mijn kennis string/numeriek is weer bijgespijkerd.
Nu probeer ik de onvoorspelbare gedragingen van een variabele verder te doorgronden ...
 
Je kan de action van het formulier direct met Javascript bepalen.

In de code snippet hieronder gaat het formulier naar "updA.asp" als je de Enter toets gebruikt om het formulier te versturen. Als je een <input type="button"> klikt dan wordt de <form action="..."> gewijzigd (afhankelijk van de button) en daarna het formulier verstuurd.

Geen idee of je hier iets mee kan omdat je ook met timers werkt.
Code:
<form id="[B]UpdateForm[/B]" method="post" action="updA.asp">
  <!-- hier staan al je invoervelden (input, select, textarea) -->
  <input type="hidden" name="Rec"   value="<%= rs("AnwId") %>">
  <input type="hidden" name="NrAct" value="<%= rs("ActId") %>">
  <input type="[B]button[/B]" [B]onclick[/B]="FormAction('Strt.asp')"  name="vervolg" value="Stop">
  <input type="[B]button[/B]" [B]onclick[/B]="FormAction('updB1.asp')" name="vervolg" value="Message">
</form>

<script>
// In de <form> is id="UpdateForm" nodig
function FormAction (ActionFilename) {
  var UpdateForm = document.querySelector('#UpdateForm');
  UpdateForm.action = ActionFilename;
  UpdateForm.submit();
}
</script>
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan