:list:int mit ZSQL

Django, Flask, Bottle, WSGI, CGI…
Antworten
danius
User
Beiträge: 7
Registriert: Montag 10. März 2008, 19:57

Montag 10. März 2008, 20:03

Grüß euch,

vielleicht kann mir hier jemand kurz helfen - Danke.

Ich habe eine Liste verschiedener Adressen, die jede eine "a_id" als ID besitzt. Nun habe ich vor jeden Listeneintrag eine Checkbox gesetzt, um es möglich zu machen, die ausgewählten Einträge zu löschen, über ein Formular zu löschen -> dieses ruft somit eine Z_SQL_Methode auf.

Wenn nur einer ausgewählt ist funktioniert alles problemlos, aber wie mache ich es wenn man mehrere Einträge auswählt?

Habe folgendens gelesen:
<input type="checkbox" name="a_id:list:int" value="<dtml-var a_id>">
Somit müsste ich eine Int-Liste erstellt haben

Aber wie schaut zu so einer Liste die ZSQL-Methode aus, damit für jede ID die SQL-Abfrage ausgewählt wird?

Meine bisherige war:
BEGIN;
delete from adressen
where a_id=<dtml-sqlvar a_id type=int>;
COMMIT;


Geht es vielleicht mit sqltest oder sqlgroup :?:
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Dienstag 11. März 2008, 09:39

Moin,

du kannst via dtml-in über die Liste iterieren:

Code: Alles auswählen

BEGIN;
delete from adressen
where a_id in (
<dtml-in a_id>
    <dtml-sqlvar sequence-item><dtml-unless sequence-end>,</dtml-unless>
</dtml-in>
);
COMMIT;
danius
User
Beiträge: 7
Registriert: Montag 10. März 2008, 19:57

Dienstag 11. März 2008, 18:12

danke... das ist genau das was ich gesucht habe :D
probiere es demnächst gleich mal aus und gebe dir/euch eine rückmeldung.

Habe mich schon mit dem gedanken gespielt, mit einer python methode die Liste so zu formatieren, dass ich eine SQL-IN daraus machen kann.
Aber diese Lösung ist doch einfacher :wink:
danius
User
Beiträge: 7
Registriert: Montag 10. März 2008, 19:57

Mittwoch 12. März 2008, 08:43

anscheinend muss ich noch den typ konvertieren

Code: Alles auswählen

Error Type: ValueError
Error Value: Strings are not allowed as input to the in tag.
:?:
danius
User
Beiträge: 7
Registriert: Montag 10. März 2008, 19:57

Mittwoch 12. März 2008, 09:38

Folgender Lösungsansatz von mir...

Code: Alles auswählen

BEGIN;
delete from adressen
where a_id in <dtml-var py_get_sel_adr>;
COMMIT; 
Python-Objekt: py_get_sel_adr

Code: Alles auswählen

# 
form = container.REQUEST.form

a_id_str='('

for a_id in form.get('a_id_list',[]):
  a_id_str=a_id_str + a_id + ','

if len(a_id_str)>1:
 return a_id_str.rstrip(',')+')'
else:
 0
... ergibt folgende Fehlermeldung

Code: Alles auswählen

Error Type: ProgrammingError
Error Value: syntax error at or near "[" LINE 3: where a_id in ([2000); ^ 
Leider noch immer :?:

EDIT:
Das Problem liegt höchstwahrscheinlich an einer Datei, die sich zwischen dem Formular und der SQL befindet, wo die Liste als input hidden weitergegeben wird...
danius
User
Beiträge: 7
Registriert: Montag 10. März 2008, 19:57

Mittwoch 12. März 2008, 10:43

LÖSUNG

Das Problem lag, dass in einer Zwischendatei ("Wollen sie wirklich löschen") die Variable nicht richtig weitergegeben wurde...

Code: Alles auswählen

<dtml-if a_id_list>
<input type=hidden name=a_id value=<dtml-var py_get_sel_adr>>
</dtml-if a_id_list>
Also wird nun die Variable per :list an die Zwischendatei übergeben und dort durch das Python-Script weitergegeben und dann in die SQL Abfrage eingesetzt

Code: Alles auswählen

BEGIN;
delete from adressen
where a_id in <dtml-var a_id>;
COMMIT; 
:D Vielleicht hilft dies jemanden und ich sage mal danke an helduel :D
Antworten