[Zope-DB] Drop down menu from SQL query in dtml method
   
    Charlie Clark
     
    charlie@begeistert.org
       
    Thu, 24 Jul 2003 12:00:46 +0200
    
    
  
On 2003-07-24 at 00:07:08 [+0200], Robert Crotty wrote:
> Charlie,
>  
> I am using the basic add entry form structure and result methods as 
> follows:
removed and text reorderd.
> What I want to do is add a drop down choice for the partname (part 
> number) because it is updated in the MS Access database frequently.. I 
> will then change this so the description and unit price is pull from 
> access versus all manual entry.
Sure. This is very easy with ZPT (tal:repeat), we just need an appropriate 
ZSQL-method. Let's call it qPartname:
SELECT PARTNAME from tWorkorderParts
This will give us a list-like object back where we can list the various 
parts following the following scheme.
<p tal:repeat="result here/qPartname" 
tal:content="result/PARTNAME">Partname goes here</p>
Try this to get a feel for it. Using this in a pull-down is a little bit 
more tricky as it involves setting attributes and not the content.
<form action="process" method=post">
<select name="partname">
<option tal:repeat="result here/qPartname" tal:attributes="value 
result/PARTNAME">
</select>
...rest of your form...
</form>
For your migration you can put the ZPT you create inside a DTML-doc/method 
which might make things easier.
> The result form looks like this:
This is where ZPT and DTML vary. As Jim Penny has stated, ZPT is 
presentation only so this insert should not be in a ZPT. You can keep it in 
a DTML-method but I would encourage you to use a PythonScript to check the 
contents, maybe raise an error or do the insert, set the flags 
appropriately and use 
<p tal:condition="exists: request/errors">There was an error</p>
<p tal:condition="not: request/errors">Everything went fine</p>
Or some more refined error handling... This form is currently redundant as 
it is - you should simply return to the entry form with the appropriate 
message.
The script would be a bit like
### request = context.REQUEST
tInsert = {}
for name, value in request.form.items():
	tInsert[name] = value
try:
	addRecord1(tInsert)
except:
	errors = 1
return context.index_html(context, request)
Hope that gets you started
Charlie